From b062e9b1902b701fc28f4675432d2fb966857d8c Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 16 Apr 2015 21:55:13 +0400 Subject: [PATCH 001/106] Composer fixes --- dev/Common/Enums.js | 1 + dev/Common/HtmlEditor.js | 55 +++++++------------ dev/External/ko.js | 29 ++++++---- dev/Model/Attachment.js | 12 +++- dev/View/Admin/Login.js | 1 - dev/View/Popup/Compose.js | 2 + dev/View/User/Login.js | 4 -- .../app/libraries/MailSo/Mail/MailClient.php | 20 ++++++- .../0.0.0/app/libraries/RainLoop/Actions.php | 23 ++++++-- 9 files changed, 86 insertions(+), 61 deletions(-) diff --git a/dev/Common/Enums.js b/dev/Common/Enums.js index 36c56ad5e..e08450a44 100644 --- a/dev/Common/Enums.js +++ b/dev/Common/Enums.js @@ -22,6 +22,7 @@ 'Sheet': 'sheet', 'Presentation': 'presentation', 'Certificate': 'certificate', + 'CertificateBin': 'certificate-bin', 'Archive': 'archive' }; diff --git a/dev/Common/HtmlEditor.js b/dev/Common/HtmlEditor.js index 8e9f25c69..842702c51 100644 --- a/dev/Common/HtmlEditor.js +++ b/dev/Common/HtmlEditor.js @@ -32,7 +32,6 @@ this.resize = _.throttle(_.bind(this.resize, this), 100); this.__inited = false; - this.__initedData = null; this.init(); } @@ -206,10 +205,6 @@ this.focus(); } } - else - { - this.__initedData = [true, sHtml, bFocus]; - } }; HtmlEditor.prototype.setPlain = function (sPlain, bFocus) @@ -233,10 +228,6 @@ this.focus(); } } - else - { - this.__initedData = [false, sPlain, bFocus]; - } }; HtmlEditor.prototype.init = function () @@ -318,37 +309,29 @@ self.focusTrigger(); }); - if (self.fOnReady) - { - self.editor.on('instanceReady', function () { + self.editor.on('instanceReady', function () { - if (self.editor.removeMenuItem) - { - self.editor.removeMenuItem('cut'); - self.editor.removeMenuItem('copy'); - self.editor.removeMenuItem('paste'); - } + if (self.editor.removeMenuItem) + { + self.editor.removeMenuItem('cut'); + self.editor.removeMenuItem('copy'); + self.editor.removeMenuItem('paste'); + } - self.editor.setKeystroke(window.CKEDITOR.CTRL + 65 /* A */, 'selectAll'); + self.editor.setKeystroke(window.CKEDITOR.CTRL + 65 /* A */, 'selectAll'); + + self.__resizable = true; + self.__inited = true; + + self.resize(); + + if (self.fOnReady) + { self.fOnReady(); - self.__resizable = true; - self.__inited = true; - self.resize(); - - if (self.__initedData) - { - if (self.__initedData[0]) - { - self.setHtml(self.__initedData[1], self.__initedData[2]); - } - else - { - self.setPlain(self.__initedData[1], self.__initedData[2]); - } - } - }); - } + } + + }); } ; diff --git a/dev/External/ko.js b/dev/External/ko.js index b2e1e4712..04315255f 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -24,32 +24,41 @@ 'init': function (oElement, fValueAccessor) { var - fValue = fValueAccessor(), oEditor = null, + fValue = fValueAccessor(), + fUpdateEditorValue = function () { - if (oEditor) + if (fValue && fValue.__editor) { - oEditor.setHtmlOrPlain(fValue()); + fValue.__editor.setHtmlOrPlain(fValue()); } }, + fUpdateKoValue = function () { - if (oEditor && oEditor.__inited) + if (fValue && fValue.__editor) { - fValue(oEditor.getDataWithHtmlMark()); + fValue(fValue.__editor.getDataWithHtmlMark()); } }, + + fOnReady = function () { + fValue.__editor = oEditor; + fUpdateEditorValue(); + }, + HtmlEditor = require('Common/HtmlEditor') ; - if (fValue) + if (ko.isObservable(fValue) && HtmlEditor) { - oEditor = new HtmlEditor(oElement, fUpdateKoValue, fUpdateEditorValue, fUpdateKoValue); - fValue.__editor = oEditor; + oEditor = new HtmlEditor(oElement, fUpdateKoValue, fOnReady, fUpdateKoValue); + fValue.__fetchEditorValue = fUpdateKoValue; - fValue.__updateEditorValue = fUpdateEditorValue; fValue.subscribe(fUpdateEditorValue); - fUpdateEditorValue(); + +// ko.utils.domNodeDisposal.addDisposeCallback(oElement, function () { +// }); } } }; diff --git a/dev/Model/Attachment.js b/dev/Model/Attachment.js index d4dc6911e..0534494c1 100644 --- a/dev/Model/Attachment.js +++ b/dev/Model/Attachment.js @@ -189,7 +189,8 @@ */ AttachmentModel.prototype.hasPreview = function () { - return this.isImage() || (this.isPdf() && Globals.bAllowPdfPreview) || this.isText() || this.isFramed(); + return this.isImage() || (this.isPdf() && Globals.bAllowPdfPreview) || + this.isText() || this.isFramed(); }; /** @@ -370,12 +371,17 @@ sResult = Enums.FileType.Pdf; break; case -1 < Utils.inArray(sMimeType, [ - 'application/pgp-signature', 'application/pkcs7-signature', 'application/pgp-keys' + 'application/pgp-signature', 'application/pgp-keys' ]) || -1 < Utils.inArray(sExt, [ 'asc', 'pem', 'ppk' ]): sResult = Enums.FileType.Certificate; break; + case -1 < Utils.inArray(sMimeType, ['application/pkcs7-signature']) || + -1 < Utils.inArray(sExt, ['p7s']): + + sResult = Enums.FileType.CertificateBin; + break; case -1 < Utils.inArray(aMimeTypeParts[1], [ 'rtf', 'msword', 'vnd.msword', 'vnd.openxmlformats-officedocument.wordprocessingml.document', 'vnd.openxmlformats-officedocument.wordprocessingml.template', @@ -447,6 +453,7 @@ sClass = 'icon-file-zip'; break; case Enums.FileType.Certificate: + case Enums.FileType.CertificateBin: sClass = 'icon-file-certificate'; break; case Enums.FileType.Sheet: @@ -509,6 +516,7 @@ sClass = 'icon-file-zip'; break; case Enums.FileType.Certificate: + case Enums.FileType.CertificateBin: sClass = 'icon-file-certificate'; break; case Enums.FileType.Sheet: diff --git a/dev/View/Admin/Login.js b/dev/View/Admin/Login.js index e6a64c8ec..84d506e86 100644 --- a/dev/View/Admin/Login.js +++ b/dev/View/Admin/Login.js @@ -87,7 +87,6 @@ { if (oData.Result) { - this.formHidden(true); require('App/Admin').loginAndLogoutReload(true); } else if (oData.ErrorCode) diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 42b8bf4ab..68acf1632 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1,4 +1,6 @@ +/* global require, module */ + (function () { 'use strict'; diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index f2ea8c45b..e5e7111b1 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -213,12 +213,10 @@ } else if (oData.Admin) { - this.formHidden(true); require('App/User').redirectToAdminPanel(); } else { - this.formHidden(true); require('App/User').loginAndLogoutReload(false); } } @@ -382,8 +380,6 @@ if (0 === iErrorCode) { self.submitRequest(true); - self.formHidden(true); - require('App/User').loginAndLogoutReload(false); } else diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index ce428e586..f3f0041a1 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -1921,6 +1921,7 @@ class MailClient * @param bool $bUseSortIfSupported = false * @param bool $bUseThreadSortIfSupported = false * @param bool $bUseESearchOrESortRequest = false + * @param string $sThreadUid = '' * * @return \MailSo\Mail\MessageCollection * @@ -1929,7 +1930,8 @@ class MailClient * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageList($sFolderName, $iOffset = 0, $iLimit = 10, $sSearch = '', $sPrevUidNext = '', $oCacher = null, - $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $bUseESearchOrESortRequest = false) + $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $bUseESearchOrESortRequest = false, + $sThreadUid = '') { $sSearch = \trim($sSearch); if (!\MailSo\Base\Validator::RangeInt($iOffset, 0) || @@ -1958,6 +1960,11 @@ class MailClient $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? ($this->oImapClient->IsSupported('THREAD=REFS') || $this->oImapClient->IsSupported('THREAD=REFERENCES') || $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT')) : false; + if (!empty($sThreadUid) && !$bUseThreadSortIfSupported) + { + throw new \MailSo\Base\Exceptions\InvalidArgumentException(); + } + if (!$oCacher || !($oCacher instanceof \MailSo\Cache\CacheClient)) { $oCacher = null; @@ -1986,6 +1993,12 @@ class MailClient $bIndexAsUid = false; $aIndexOrUids = array(); +// $mThreads = $this->MessageListThreadsMap($sFolderName, $sFolderHash, array(), $oCacher, true); +// if (\is_array($mThreads)) +// { +// +// } + if (0 < \strlen($sSearch)) { $aIndexOrUids = $this->getSearchUidsResult($sSearch, @@ -2263,7 +2276,10 @@ class MailClient { $aSubscribedFolders = $this->oImapClient->FolderSubscribeList($sParent, $sListPattern); } - catch (\Exception $oException) {} + catch (\Exception $oException) + { + unset($oException); + } } $aImapSubscribedFoldersHelper = null; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 713062acf..46e8f5524 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -2640,7 +2640,7 @@ class Actions \sleep(1); return $this->TrueResponse(__FUNCTION__); } - + /** * @return array * @@ -5509,11 +5509,12 @@ class Actions $sSearch = ''; $sUidNext = ''; $bUseThreads = false; + $sThreadUid = ''; $sRawKey = $this->GetActionParam('RawKey', ''); $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 9); - if (\is_array($aValues) && 9 === \count($aValues)) + if (\is_array($aValues) && 7 < \count($aValues)) { $sFolder =(string) $aValues[0]; $iOffset = (int) $aValues[1]; @@ -5522,6 +5523,11 @@ class Actions $sUidNext = (string) $aValues[6]; $bUseThreads = (bool) $aValues[7]; + if ($bUseThreads) + { + $sThreadUid = ''; // TODO + } + $this->verifyCacheByKey($sRawKey); } else @@ -5532,6 +5538,11 @@ class Actions $sSearch = $this->GetActionParam('Search', ''); $sUidNext = $this->GetActionParam('UidNext', ''); $bUseThreads = '1' === (string) $this->GetActionParam('UseThreads', '0'); + + if ($bUseThreads) + { + $sThreadUid = (string) $this->GetActionParam('ThreadUid', ''); + } } if (0 === strlen($sFolder)) @@ -5552,8 +5563,8 @@ class Actions $sFolder, $iOffset, $iLimit, $sSearch, $sUidNext, $this->cacherForUids(), !!$this->Config()->Get('labs', 'use_imap_sort', false), - $bUseThreads, - !!$this->Config()->Get('labs', 'use_imap_esearch_esort', false) + $bUseThreads, !!$this->Config()->Get('labs', 'use_imap_esearch_esort', false), + $sThreadUid ); } catch (\Exception $oException) @@ -7724,10 +7735,10 @@ class Actions $iUid = (int) (isset($aValues['Uid']) ? $aValues['Uid'] : 0); $sMimeIndex = (string) (isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''); - header('Content-Type: text/plain', true); + \header('Content-Type: text/plain', true); return $this->MailClient()->MessageMimeStream(function ($rResource) { - if (is_resource($rResource)) + if (\is_resource($rResource)) { \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); } From b00959b2d0b0c96031d9f353b3c47fe50dcebd41 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 16 Apr 2015 22:02:10 +0400 Subject: [PATCH 002/106] Fix pt-br translation file. --- rainloop/v/0.0.0/langs/admin/pt-br.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rainloop/v/0.0.0/langs/admin/pt-br.ini b/rainloop/v/0.0.0/langs/admin/pt-br.ini index f85961252..dfca120f9 100644 --- a/rainloop/v/0.0.0/langs/admin/pt-br.ini +++ b/rainloop/v/0.0.0/langs/admin/pt-br.ini @@ -38,8 +38,8 @@ LABEL_ALLOW_TEMPLATES = "Permitir templates" ALERT_WARNING = "Aviso!" HTML_ALERT_WEAK_PASSWORD = "Você está usando a senha administrativa padrão.
-Por motivo de segurança por favor -troque a senha +Por motivo de segurança por favor +troque a senha agora." [TAB_LOGIN] @@ -156,7 +156,7 @@ TYPE_BASIC_HINT = "Esse domínio não está licenciado para uso comercial (com r TYPE_BASIC_HINT_2 = "Esse domínio não pode ser licenciado." HTML_ALERT_TOP_1 = "RainLoop Webmail é licenciado sob" HTML_ALERT_TOP_2 = "Você é livre para usá-lo em seus projetos pessoais." -HTML_ALERT_TOP_3 = "Uso comercial (com recursos adicionais) do RainLoop Webmail +HTML_ALERT_TOP_3 = "Uso comercial (com recursos adicionais) do RainLoop Webmail requer uma assinatura." TYPE_PREMIUM = "Premium" TYPE_PREMIUM_LIFETIME = "Lifetime" @@ -237,7 +237,7 @@ TOOLTIP_ABOUT_TITLE = "Sobre" BUTTON_YES = "Sim" BUTTON_NO = "Não" DESC_WANT_CLOSE_THIS_WINDOW = "Você tem certeza que deseja fechar esta janela?" -DESC_WANT_DELETE_MESSAGES = Você tem certeza que deseja apagar a(s) mensagem(s)?" +DESC_WANT_DELETE_MESSAGES = "Você tem certeza que deseja apagar a(s) mensagem(s)?" [POPUPS_LANGUAGES] TITLE_LANGUAGES = "Selecionar idioma" From c73eb768160277f82bb2cb594fc53cd238ba450c Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 17 Apr 2015 17:56:29 +0400 Subject: [PATCH 003/106] Release fixes --- dev/Common/HtmlEditor.js | 15 ++------- dev/Remote/User/Ajax.js | 22 ++++++++----- dev/Settings/Admin/Branding.js | 32 +++++++++---------- dev/Stores/Language.js | 7 ++-- dev/View/Popup/Compose.js | 20 ++++++++++++ dev/View/Popup/Languages.js | 9 +++--- package.json | 2 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 12 ++++--- .../Views/Admin/AdminSettingsBranding.html | 2 +- 9 files changed, 67 insertions(+), 54 deletions(-) diff --git a/dev/Common/HtmlEditor.js b/dev/Common/HtmlEditor.js index 842702c51..5653c675d 100644 --- a/dev/Common/HtmlEditor.js +++ b/dev/Common/HtmlEditor.js @@ -261,7 +261,7 @@ } oConfig.enterMode = window.CKEDITOR.ENTER_BR; - oConfig.shiftEnterMode = window.CKEDITOR.ENTER_BR; + oConfig.shiftEnterMode = window.CKEDITOR.ENTER_P; oConfig.language = Globals.oHtmlEditorLangsMap[sLanguage] || 'en'; if (window.CKEDITOR.env) @@ -269,17 +269,6 @@ window.CKEDITOR.env.isCompatible = true; } -// oConfig.allowedContent = { -// $1: { -// elements: window.CKEDITOR.dtd, -// attributes: true, -// styles: true, -// classes: true -// } -// }; -// -// oConfig.disallowedContent = 'script; style; iframe; frame; *[on*]'; - window.CKEDITOR.dtd.$removeEmpty['p'] = 1; self.editor = window.CKEDITOR.appendTo(self.$element[0], oConfig); @@ -330,7 +319,7 @@ { self.fOnReady(); } - + }); } ; diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index 20ee13045..6e77f856e 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -333,19 +333,23 @@ * @param {number=} iLimit = 20 * @param {string=} sSearch = '' * @param {boolean=} bSilent = false + * @param {string=} sThreadUid = '' */ - RemoteUserAjax.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, bSilent) + RemoteUserAjax.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, bSilent, sThreadUid) { sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); var - sFolderHash = Cache.getFolderHash(sFolderFullNameRaw) + sFolderHash = Cache.getFolderHash(sFolderFullNameRaw), + bUseThreads = AppStore.threadsAllowed() && SettingsStore.useThreads(), + sInboxUidNext = Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '' ; bSilent = Utils.isUnd(bSilent) ? false : !!bSilent; iOffset = Utils.isUnd(iOffset) ? 0 : Utils.pInt(iOffset); iLimit = Utils.isUnd(iOffset) ? 20 : Utils.pInt(iLimit); sSearch = Utils.pString(sSearch); + sThreadUid = Utils.pString(sThreadUid); if ('' !== sFolderHash && ('' === sSearch || -1 === sSearch.indexOf('is:'))) { @@ -358,9 +362,9 @@ sSearch, AppStore.projectHash(), sFolderHash, - Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '', - AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0', - '' + sInboxUidNext, + bUseThreads ? '1' : '0', + bUseThreads ? sThreadUid : '' ].join(String.fromCharCode(0))), bSilent ? [] : ['MessageList']); } else @@ -370,9 +374,11 @@ 'Offset': iOffset, 'Limit': iLimit, 'Search': sSearch, - 'UidNext': Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '', - 'UseThreads': AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0' - }, '' === sSearch ? Consts.Defaults.DefaultAjaxTimeout : Consts.Defaults.SearchAjaxTimeout, '', bSilent ? [] : ['MessageList']); + 'UidNext': sInboxUidNext, + 'UseThreads': bUseThreads ? '1' : '0', + 'ThreadUid': bUseThreads ? sThreadUid : '' + }, '' === sSearch ? Consts.Defaults.DefaultAjaxTimeout : Consts.Defaults.SearchAjaxTimeout, + '', bSilent ? [] : ['MessageList']); } }; diff --git a/dev/Settings/Admin/Branding.js b/dev/Settings/Admin/Branding.js index 748a68d79..b76661ebe 100644 --- a/dev/Settings/Admin/Branding.js +++ b/dev/Settings/Admin/Branding.js @@ -144,29 +144,27 @@ }, 50); } - else - { - _.delay(function () { - var - f1 = Utils.settingsSaveHelperSimpleFunction(self.title.trigger, self), - f2 = Utils.settingsSaveHelperSimpleFunction(self.loadingDesc.trigger, self) - ; + _.delay(function () { - self.title.subscribe(function (sValue) { - Remote.saveAdminConfig(f1, { - 'Title': Utils.trim(sValue) - }); + var + f1 = Utils.settingsSaveHelperSimpleFunction(self.title.trigger, self), + f2 = Utils.settingsSaveHelperSimpleFunction(self.loadingDesc.trigger, self) + ; + + self.title.subscribe(function (sValue) { + Remote.saveAdminConfig(f1, { + 'Title': Utils.trim(sValue) }); + }); - self.loadingDesc.subscribe(function (sValue) { - Remote.saveAdminConfig(f2, { - 'LoadingDescription': Utils.trim(sValue) - }); + self.loadingDesc.subscribe(function (sValue) { + Remote.saveAdminConfig(f2, { + 'LoadingDescription': Utils.trim(sValue) }); + }); - }, 50); - } + }, 50); }; module.exports = BrandingAdminSettings; diff --git a/dev/Stores/Language.js b/dev/Stores/Language.js index 2659f42a0..4b3b1aa9b 100644 --- a/dev/Stores/Language.js +++ b/dev/Stores/Language.js @@ -22,14 +22,11 @@ this.language = ko.observable('') .extend({'limitedList': this.languages}); - this.userLanguage = ko.observable('') - .extend({'limitedList': this.languages}); - this.languageAdmin = ko.observable('') .extend({'limitedList': this.languagesAdmin}); - this.userLanguageAdmin = ko.observable('') - .extend({'limitedList': this.languagesAdmin}); + this.userLanguage = ko.observable(''); + this.userLanguageAdmin = ko.observable(''); } LanguageStore.prototype.populate = function () diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 68acf1632..b9de52b02 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1099,6 +1099,26 @@ oText.find('.rlBlockquoteSwitcher').off('.rlBlockquoteSwitcher').remove(); oText.find('[data-html-editor-font-wrapper]').removeAttr('data-html-editor-font-wrapper'); + (function () { + + var oTmp = null, iLimit = 0; + + while (true) + { + iLimit++; + + oTmp = oText.children(); + if (10 > iLimit && oTmp.is('div') && 1 === oTmp.length) + { + oTmp.children().unwrap(); + continue; + } + + break; + } + + }()); + sText = oText.html(); } diff --git a/dev/View/Popup/Languages.js b/dev/View/Popup/Languages.js index cf32623c9..e82bc9cf8 100644 --- a/dev/View/Popup/Languages.js +++ b/dev/View/Popup/Languages.js @@ -24,15 +24,16 @@ var self = this; this.fLang = null; - this.sUserLanguage = ''; + this.userLanguage = ko.observable(''); this.langs = ko.observableArray([]); this.languages = ko.computed(function () { + var sUserLanguage = self.userLanguage(); return _.map(self.langs(), function (sLanguage) { return { 'key': sLanguage, - 'user': sLanguage === self.sUserLanguage, + 'user': sLanguage === sUserLanguage, 'selected': ko.observable(false), 'fullName': Utils.convertLangName(sLanguage) }; @@ -66,7 +67,7 @@ LanguagesPopupView.prototype.onShow = function (fLanguage, aLangs, sUserLanguage) { this.fLang = fLanguage; - this.sUserLanguage = sUserLanguage || ''; + this.userLanguage(sUserLanguage || ''); this.langs(aLangs); }; @@ -74,7 +75,7 @@ LanguagesPopupView.prototype.onHide = function () { this.fLang = null; - this.sUserLanguage = ''; + this.userLanguage(''); this.langs([]); }; diff --git a/package.json b/package.json index 66ced8835..4dba13d46 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "302", + "release": "304", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 46e8f5524..0946c1682 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1709,8 +1709,9 @@ class Actions $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, '', true); $aResult['UserLanguageRaw'] = $this->detectUserLanguage(); - $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], $aResult['Language'], false); - $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], $aResult['LanguageAdmin'], true); + + $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', false, true, true); + $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', true, true, true); $aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'. ($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/'; @@ -5525,7 +5526,7 @@ class Actions if ($bUseThreads) { - $sThreadUid = ''; // TODO + $sThreadUid = isset($aValues[8]) ? (string) $aValues[8] : ''; } $this->verifyCacheByKey($sRawKey); @@ -8380,10 +8381,11 @@ class Actions * @param string $sDefault = '' * @param bool $bAdmin = false * @param bool $bSearchShortName = false + * @param bool $bAllowEmptyResult = false * * @return string */ - public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bSearchShortName = false) + public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bSearchShortName = false, $bAllowEmptyResult = false) { $sResult = ''; $aLang = $this->GetLanguages($bAdmin); @@ -8409,7 +8411,7 @@ class Actions $sResult = $sDefault; } - if (empty($sResult)) + if (empty($sResult) && !$bAllowEmptyResult) { $sResult = $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en'); $sResult = \in_array($sResult, $aLang) ? $sResult : 'en'; diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html index 378b1cda3..2b1f3f84f 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html @@ -144,7 +144,7 @@ -
+
From b656b6365bcf3f09537fb71e747563c2f3412d72 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 20 Apr 2015 23:49:51 +0400 Subject: [PATCH 004/106] New thread list logic (step 1) --- dev/App/User.js | 5 +- dev/Common/Links.js | 13 +- dev/Remote/User/Ajax.js | 4 +- dev/Screen/User/MailBox.js | 12 +- dev/Stores/User/Message.js | 2 + dev/View/User/MailBox/MessageList.js | 4 +- .../app/libraries/MailSo/Mail/MailClient.php | 211 ++++++++++++------ .../MailSo/Mail/MessageCollection.php | 8 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 4 +- .../libraries/RainLoop/Config/Application.php | 1 - 10 files changed, 186 insertions(+), 78 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index 616451270..bb622b736 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -214,12 +214,13 @@ ); } - }, FolderStore.currentFolderFullNameRaw(), iOffset, SettingsStore.messagesPerPage(), MessageStore.messageListSearch()); + }, FolderStore.currentFolderFullNameRaw(), iOffset, SettingsStore.messagesPerPage(), + MessageStore.messageListSearch(), MessageStore.messageListThreadUid()); }; AppUser.prototype.recacheInboxMessageList = function () { - Remote.messageList(Utils.emptyFunction, Cache.getFolderInboxName(), 0, SettingsStore.messagesPerPage(), '', true); + Remote.messageList(Utils.emptyFunction, Cache.getFolderInboxName(), 0, SettingsStore.messagesPerPage(), '', '', true); }; /** diff --git a/dev/Common/Links.js b/dev/Common/Links.js index da26296b0..ac0e57c7c 100644 --- a/dev/Common/Links.js +++ b/dev/Common/Links.js @@ -257,23 +257,30 @@ * @param {string} sFolder * @param {number=} iPage = 1 * @param {string=} sSearch = '' + * @param {string=} sThreadUid = '' * @return {string} */ - Links.prototype.mailBox = function (sFolder, iPage, sSearch) + Links.prototype.mailBox = function (sFolder, iPage, sSearch, sThreadUid) { iPage = Utils.isNormal(iPage) ? Utils.pInt(iPage) : 1; sSearch = Utils.pString(sSearch); - var sResult = this.sBase + 'mailbox/'; + var + sResult = this.sBase + 'mailbox/', + iThreadUid = Utils.pInt(sThreadUid) + ; + if ('' !== sFolder) { - sResult += encodeURI(sFolder); + sResult += encodeURI(sFolder) + (0 < iThreadUid ? '|' + iThreadUid : ''); } + if (1 < iPage) { sResult = sResult.replace(/[\/]+$/, ''); sResult += '/p' + iPage; } + if ('' !== sSearch) { sResult = sResult.replace(/[\/]+$/, ''); diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index 6e77f856e..e7c8ee969 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -332,10 +332,10 @@ * @param {number=} iOffset = 0 * @param {number=} iLimit = 20 * @param {string=} sSearch = '' - * @param {boolean=} bSilent = false * @param {string=} sThreadUid = '' + * @param {boolean=} bSilent = false */ - RemoteUserAjax.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, bSilent, sThreadUid) + RemoteUserAjax.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, sThreadUid, bSilent) { sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); diff --git a/dev/Screen/User/MailBox.js b/dev/Screen/User/MailBox.js index 64bb526cf..c69dce10a 100644 --- a/dev/Screen/User/MailBox.js +++ b/dev/Screen/User/MailBox.js @@ -75,15 +75,23 @@ MailBoxUserScreen.prototype.onRoute = function (sFolderHash, iPage, sSearch) { var - sFolderFullNameRaw = Cache.getFolderFullNameRaw(sFolderHash), - oFolder = Cache.getFolderFromCacheList(sFolderFullNameRaw) + sThreadUid = sFolderHash.replace(/^(.+)\|([\d]+)$/, '$2'), + oFolder = Cache.getFolderFromCacheList(Cache.getFolderFullNameRaw( + sFolderHash.replace(/\|([\d]+)$/, ''))) ; if (oFolder) { + if (sFolderHash === sThreadUid) + { + sThreadUid = ''; + } + FolderStore.currentFolder(oFolder); + MessageStore.messageListPage(iPage); MessageStore.messageListSearch(sSearch); + MessageStore.messageListThreadUid(sThreadUid); require('App/User').reloadMessageList(); } diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 55c503324..becf5fea4 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -41,6 +41,7 @@ this.messageListCount = ko.observable(0); this.messageListSearch = ko.observable(''); + this.messageListThreadUid = ko.observable(''); this.messageListPage = ko.observable(1); this.messageListError = ko.observable(''); @@ -813,6 +814,7 @@ this.messageListCount(iCount); this.messageListSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : ''); this.messageListPage(window.Math.ceil((iOffset / SettingsStore.messagesPerPage()) + 1)); + this.messageListThreadUid(Utils.isNormal(oData.Result.ThreadUid) ? Utils.pString(oData.Result.ThreadUid) : ''); this.messageListEndFolder(Utils.isNormal(oData.Result.Folder) ? oData.Result.Folder : ''); this.messageListEndSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : ''); diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index cd254167f..7eab8a1fc 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -62,6 +62,7 @@ this.selectorMessageFocused = MessageStore.selectorMessageFocused; this.isMessageSelected = MessageStore.isMessageSelected; this.messageListSearch = MessageStore.messageListSearch; + this.messageListThreadUid = MessageStore.messageListThreadUid; this.messageListError = MessageStore.messageListError; this.folderMenuForMove = FolderStore.folderMenuForMove; @@ -611,7 +612,8 @@ kn.setHash(Links.mailBox( FolderStore.currentFolderFullNameHash(), oPage.value, - MessageStore.messageListSearch() + MessageStore.messageListSearch(), + MessageStore.messageListThreadUid() )); } }; diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index f3f0041a1..e2450810d 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -1911,6 +1911,88 @@ class MailClient return $oMessageCollection->GetAsArray(); } + /** + * @param \MailSo\Cache\CacheClient|null $oCacher + * @param string $sSearch + * @param string $sFolderName + * @param string $sFolderHash + * + * @return array + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + * @throws \MailSo\Net\Exceptions\Exception + * @throws \MailSo\Imap\Exceptions\Exception + */ + public function GetUids($oCacher, $sSearch, $sFolderName, $sFolderHash) + { + $aResultUids = false; + $bUidsFromCacher = false; + $bUseCacheAfterSearch = true; + + $sSerializedHash = ''; + $sSerializedLog = ''; + + $bUseSortIfSupported = !!$this->oImapClient->IsSupported('SORT'); + + if (0 < \strlen($sSearch)) + { + $bUseSortIfSupported = false; + } + + $sSearchCriterias = $this->getImapSearchCriterias($sSearch, 0, $bUseCacheAfterSearch); + if ($bUseCacheAfterSearch && $oCacher && $oCacher->IsInited()) + { + $sSerializedHash = 'GetUids/'. + ($bUseSortIfSupported ? 'S': 'N').'/'. + $this->GenerateImapClientHash().'/'. + $sFolderName.'/'.$sSearchCriterias; + + $sSerializedLog = '"'.$sFolderName.'" / '.$sSearchCriterias.''; + + $sSerialized = $oCacher->Get($sSerializedHash); + if (!empty($sSerialized)) + { + $aSerialized = @\json_decode($sSerialized, true); + if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && + $sFolderHash === $aSerialized['FolderHash'] && + \is_array($aSerialized['Uids']) + ) + { + if ($this->oLogger) + { + $this->oLogger->Write('Get Serialized UIDS from cache ('.$sSerializedLog.') [count:'.\count($aSerialized['Uids']).']'); + } + + $aResultUids = $aSerialized['Uids']; + $bUidsFromCacher = true; + } + } + } + + if (!\is_array($aResultUids)) + { + $aResultUids = $bUseSortIfSupported ? + $this->oImapClient->MessageSimpleSort(array('REVERSE ARRIVAL'), $sSearchCriterias, true) : + $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true) + ; + + if (!$bUidsFromCacher && $bUseCacheAfterSearch && \is_array($aResultUids) && $oCacher && $oCacher->IsInited() && 0 < \strlen($sSerializedHash)) + { + $oCacher->Set($sSerializedHash, @\json_encode(array( + 'FolderHash' => $sFolderHash, + 'Uids' => $aResultUids + ))); + + if ($this->oLogger) + { + $this->oLogger->Write('Save Serialized UIDS to cache ('.$sSerializedLog.') [count:'.\count($aResultUids).']'); + } + } + } + + return $aResultUids; + } + /** * @param string $sFolderName * @param int $iOffset = 0 @@ -1930,8 +2012,7 @@ class MailClient * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageList($sFolderName, $iOffset = 0, $iLimit = 10, $sSearch = '', $sPrevUidNext = '', $oCacher = null, - $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $bUseESearchOrESortRequest = false, - $sThreadUid = '') + $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $sThreadUid = '') { $sSearch = \trim($sSearch); if (!\MailSo\Base\Validator::RangeInt($iOffset, 0) || @@ -1947,10 +2028,14 @@ class MailClient $oMessageCollection->Offset = $iOffset; $oMessageCollection->Limit = $iLimit; $oMessageCollection->Search = $sSearch; + $oMessageCollection->ThreadUid = $sThreadUid; - $aThreads = array(); + $aUids = array(); + $mAllSortedUids = null; + $mAllThreads = null; + + $iThreadUid = empty($sThreadUid) ? 0 : (int) $sThreadUid; - $iMessageCount = 0; $iMessageRealCount = 0; $iMessageUnseenCount = 0; $sUidNext = '0'; @@ -1971,11 +2056,15 @@ class MailClient } $this->initFolderValues($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext); - $iMessageCount = $iMessageRealCount; $oMessageCollection->FolderHash = $this->GenerateFolderHash($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext); $oMessageCollection->UidNext = $sUidNext; - $oMessageCollection->NewMessages = $this->getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sUidNext); + + if (empty($sThreadUid) && 0 < \strlen($sPrevUidNext) && 'INBOX' === $sFolderName) + { + $oMessageCollection->NewMessages = $this->getFolderNextMessageInformation( + $sFolderName, $sPrevUidNext, $sUidNext); + } $bSearch = false; $bMessageListOptimization = 0 < \MailSo\Config::$MessageListCountLimitTrigger && @@ -1985,104 +2074,98 @@ class MailClient { $bUseSortIfSupported = false; $bUseThreadSortIfSupported = false; - $bUseESearchOrESortRequest = false; } if (0 < $iMessageRealCount) { - $bIndexAsUid = false; - $aIndexOrUids = array(); + $mAllSortedUids = $this->GetUids($oCacher, '', $oMessageCollection->FolderName, $oMessageCollection->FolderHash); -// $mThreads = $this->MessageListThreadsMap($sFolderName, $sFolderHash, array(), $oCacher, true); -// if (\is_array($mThreads)) -// { -// -// } + $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( + $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; - if (0 < \strlen($sSearch)) + if ($bUseThreadSortIfSupported && 0 < $iThreadUid && \is_array($mAllThreads)) { - $aIndexOrUids = $this->getSearchUidsResult($sSearch, - $oMessageCollection->FolderName, $oMessageCollection->FolderHash, - $bUseSortIfSupported, $bUseESearchOrESortRequest, $oCacher); + $aUids = array(); + $aUids = \is_array($mAllThreads[$iThreadUid]) ? + $mAllThreads[$iThreadUid] : array(); - $bIndexAsUid = true; + if (\in_array($iThreadUid, $mAllSortedUids)) + { + \array_unshift($aUids, $iThreadUid); + } + } + else if ($bUseThreadSortIfSupported && \is_array($mAllThreads)) + { + $aUids = \array_keys($mAllThreads); } else { - if ($bUseThreadSortIfSupported && 1 < $iMessageCount) + $bUseThreadSortIfSupported = false; + $aUids = $mAllSortedUids; + } + + if (0 < \strlen($sSearch) && \is_array($aUids)) + { + $aSearchedUids = $this->GetUids($oCacher, $sSearch, $oMessageCollection->FolderName, $oMessageCollection->FolderHash); + if (\is_array($aSearchedUids) && 0 < \count($aSearchedUids)) { - $aIndexOrUids = $this->getSearchUidsResult('', - $oMessageCollection->FolderName, $oMessageCollection->FolderHash, - $bUseSortIfSupported, $bUseESearchOrESortRequest, $oCacher); + $aFlippedSearchedUids = \array_flip($aSearchedUids); - $aThreads = $this->MessageListThreadsMap( - $oMessageCollection->FolderName, $oMessageCollection->FolderHash, - $aIndexOrUids, $oCacher); + $bSearch = true; + $aNewUids = array(); - $aNewIndexOrUids = array(); - foreach ($aIndexOrUids as $iUid) + foreach ($aUids as $iUid) { - if (isset($aThreads[$iUid])) + if (isset($aFlippedSearchedUids[$iUid])) { - $aNewIndexOrUids[] = $iUid; + $aNewUids[] = $iUid; + } + else if ($bUseThreadSortIfSupported && 0 === $iThreadUid && isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid])) + { + foreach ($mAllThreads[$iUid] as $iSubUid) + { + if (isset($aFlippedSearchedUids[$iSubUid])) + { + $aNewUids[] = $iUid; + continue; + } + } } } - $aIndexOrUids = $aNewIndexOrUids; - unset($aNewIndexOrUids); - - $iMessageCount = \count($aIndexOrUids); - $bIndexAsUid = true; + $aUids = \array_unique($aNewUids); + unset($aNewUids); } else { - $aIndexOrUids = array(1); - $bIndexAsUid = false; - - if (1 < $iMessageCount) - { - if (0 === \MailSo\Config::$MessageListDateFilter && - ($bMessageListOptimization || !$bUseSortIfSupported)) - { - $aIndexOrUids = \array_reverse(\range(1, $iMessageCount)); - } - else - { - $aIndexOrUids = $this->getSearchUidsResult('', - $oMessageCollection->FolderName, $oMessageCollection->FolderHash, - $bUseSortIfSupported, $bUseESearchOrESortRequest, $oCacher); - - $bIndexAsUid = true; - } - } + $aUids = array(); } } - if (\is_array($aIndexOrUids)) + if (\is_array($aUids)) { $oMessageCollection->MessageCount = $iMessageRealCount; $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; - $oMessageCollection->MessageResultCount = 0 === \strlen($sSearch) - ? $iMessageCount : \count($aIndexOrUids); + $oMessageCollection->MessageResultCount = \count($aUids); - if (0 < \count($aIndexOrUids)) + if (0 < \count($aUids)) { $iOffset = (0 > $iOffset) ? 0 : $iOffset; - $aRequestIndexOrUids = \array_slice($aIndexOrUids, $iOffset, $iLimit); + $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); - $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestIndexOrUids, $bIndexAsUid); + $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); } } } - if (!$bSearch && $bUseThreadSortIfSupported && 0 < \count($aThreads)) + if ($bUseThreadSortIfSupported && 0 === $iThreadUid && \is_array($mAllThreads) && 0 < \count($mAllThreads)) { - $oMessageCollection->ForeachList(function (/* @var $oMessage \MailSo\Mail\Message */ $oMessage) use ($aThreads) { + $oMessageCollection->ForeachList(function (/* @var $oMessage \MailSo\Mail\Message */ $oMessage) use ($mAllThreads) { $iUid = $oMessage->Uid(); - if (isset($aThreads[$iUid]) && \is_array($aThreads[$iUid]) && 0 < \count($aThreads[$iUid])) + if (isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid]) && 0 < \count($mAllThreads[$iUid])) { - $aSubThreads = $aThreads[$iUid]; + $aSubThreads = $mAllThreads[$iUid]; \array_unshift($aSubThreads, $iUid); $oMessage->SetThreads(\array_map('trim', $aSubThreads)); diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php index 34c8cf884..ec176924a 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php @@ -62,6 +62,11 @@ class MessageCollection extends \MailSo\Base\Collection */ public $UidNext; + /** + * @var string + */ + public $ThreadUid; + /** * @var array */ @@ -108,8 +113,9 @@ class MessageCollection extends \MailSo\Base\Collection $this->Limit = 0; $this->Search = ''; $this->UidNext = ''; + $this->ThreadUid = ''; $this->NewMessages = array(); - + $this->LastCollapsedThreadUids = array(); return $this; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 0946c1682..37aa0afc0 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -5564,7 +5564,7 @@ class Actions $sFolder, $iOffset, $iLimit, $sSearch, $sUidNext, $this->cacherForUids(), !!$this->Config()->Get('labs', 'use_imap_sort', false), - $bUseThreads, !!$this->Config()->Get('labs', 'use_imap_esearch_esort', false), + $bUseThreads, $sThreadUid ); } @@ -9372,8 +9372,8 @@ class Actions 'Folder' => $mResponse->FolderName, 'FolderHash' => $mResponse->FolderHash, 'UidNext' => $mResponse->UidNext, + 'ThreadUid' => $mResponse->ThreadUid, 'NewMessages' => $this->responseObject($mResponse->NewMessages), -// 'LastCollapsedThreadUids' => $mResponse->LastCollapsedThreadUids, 'Offset' => $mResponse->Offset, 'Limit' => $mResponse->Limit, 'Search' => $mResponse->Search diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 64eca8f7b..8dcb131ce 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -282,7 +282,6 @@ Enables caching in the system'), 'use_app_debug_js' => array(false), 'use_app_debug_css' => array(false), 'use_imap_sort' => array(true), - 'use_imap_esearch_esort' => array(true), 'use_imap_force_selection' => array(false), 'use_imap_list_subscribe' => array(true), 'use_imap_thread' => array(true), From 03d26bc4c638fea94c0e22f271f0d9c6efcc8169 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 21 Apr 2015 02:39:14 +0400 Subject: [PATCH 005/106] New thread list logic (step 2) --- dev/App/User.js | 13 -- dev/Common/Links.js | 2 +- dev/Common/Selector.js | 9 +- dev/Promises/User/Ajax.js | 34 --- dev/Remote/User/Ajax.js | 42 ---- dev/Screen/User/MailBox.js | 12 +- dev/Stores/User/Message.js | 50 +--- dev/Styles/MessageList.less | 24 +- dev/Styles/_FontasticToBoot.less | 2 +- dev/View/User/MailBox/MessageList.js | 49 ++++ dev/View/User/MailBox/MessageView.js | 221 +----------------- .../app/libraries/MailSo/Mail/MailClient.php | 11 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 75 +----- .../Common/PopupsKeyboardShortcutsHelp.html | 16 +- .../templates/Views/User/MailMessageList.html | 10 +- .../Views/User/MailMessageListItem.html | 11 +- .../MailMessageListItemNoPreviewPane.html | 11 +- .../templates/Views/User/MailMessageView.html | 64 ----- 18 files changed, 139 insertions(+), 517 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index bb622b736..55efe8b3f 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -153,20 +153,7 @@ Cache.initMessageFlagsFromCache(oMessage); }); - _.each(MessageStore.messageThreadList(), function (oMessage) { - Cache.initMessageFlagsFromCache(oMessage); - }); - Cache.initMessageFlagsFromCache(MessageStore.message()); - - this.reloadFlagsCurrentMessageThreadListFromCache(); - }; - - AppUser.prototype.reloadFlagsCurrentMessageThreadListFromCache = function () - { - _.each(MessageStore.messageThreadList(), function (oMessage) { - Cache.initMessageFlagsFromCache(oMessage); - }); }; /** diff --git a/dev/Common/Links.js b/dev/Common/Links.js index ac0e57c7c..1383694e8 100644 --- a/dev/Common/Links.js +++ b/dev/Common/Links.js @@ -272,7 +272,7 @@ if ('' !== sFolder) { - sResult += encodeURI(sFolder) + (0 < iThreadUid ? '|' + iThreadUid : ''); + sResult += encodeURI(sFolder) + (0 < iThreadUid ? '~' + iThreadUid : ''); } if (1 < iPage) diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index 0918e42b1..be7ed462c 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -633,13 +633,20 @@ var iOffset = 20, + aList = this.list(), oFocused = $(this.sItemFocusedSelector, this.oContentScrollable), oPos = oFocused.position(), iVisibleHeight = this.oContentVisible.height(), iFocusedHeight = oFocused.outerHeight() ; - if (oPos && (oPos.top < 0 || oPos.top + iFocusedHeight > iVisibleHeight)) + if (aList && aList[0] && aList[0].focused()) + { + this.oContentScrollable.scrollTop(0); + + return true; + } + else if (oPos && (oPos.top < 0 || oPos.top + iFocusedHeight > iVisibleHeight)) { if (oPos.top < 0) { diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js index 6dec2b76f..e37362cfa 100644 --- a/dev/Promises/User/Ajax.js +++ b/dev/Promises/User/Ajax.js @@ -29,44 +29,10 @@ function UserAjaxUserPromises() { AbstractAjaxPromises.call(this); - - this.messageListSimpleHash = ''; - this.messageListSimpleCache = null; } _.extend(UserAjaxUserPromises.prototype, AbstractAjaxPromises.prototype); - UserAjaxUserPromises.prototype.messageListSimple = function (sFolder, aUids, fTrigger) - { - var self = this, sHash = sFolder + '~' + aUids.join('/'); - if (sHash === this.messageListSimpleHash && this.messageListSimpleCache) - { - return this.fastResolve(this.messageListSimpleCache); - } - - return this.abort('MessageListSimple') - .postRequest('MessageListSimple', fTrigger, { - 'Folder': sFolder, - 'Uids': aUids - }).then(function (oData) { - - self.messageListSimpleHash = sHash; - self.messageListSimpleCache = _.compact(_.map(oData.Result, function (aItem) { - return MessageSimpleModel.newInstanceFromJson(aItem); - })); - - return self.messageListSimpleCache; - - }, function (iError) { - - self.messageListSimpleHash = ''; - self.messageListSimpleCache = null; - - return self.fastReject(iError); - }) - ; - }; - UserAjaxUserPromises.prototype.foldersReload = function (fTrigger) { return this.abort('Folders') diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index e7c8ee969..9aa3408f0 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -313,19 +313,6 @@ }); }; - /** - * @param {?Function} fCallback - * @param {string} sFolderFullNameRaw - * @param {Array} aUids - */ - RemoteUserAjax.prototype.messageListSimple = function (fCallback, sFolderFullNameRaw, aUids) - { - return this.defaultRequest(fCallback, 'MessageListSimple', { - 'Folder': Utils.pString(sFolderFullNameRaw), - 'Uids': aUids - }, Consts.Defaults.DefaultAjaxTimeout, '', ['MessageListSimple']); - }; - /** * @param {?Function} fCallback * @param {string} sFolderFullNameRaw @@ -420,35 +407,6 @@ return false; }; - /** - * @param {?Function} fCallback - * @param {string} sFolderFullNameRaw - * @param {number} iUid - * @return {boolean} - */ - RemoteUserAjax.prototype.messageThreadsFromCache = function (fCallback, sFolderFullNameRaw, iUid) - { - sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); - iUid = Utils.pInt(iUid); - - if (Cache.getFolderFromCacheList(sFolderFullNameRaw) && 0 < iUid) - { - var sFolderHash = Cache.getFolderHash(sFolderFullNameRaw); - if (sFolderHash) - { - this.defaultRequest(fCallback, 'MessageThreadsFromCache', { - 'Folder': sFolderFullNameRaw, - 'FolderHash': sFolderHash, - 'Uid': iUid - }); - - return true; - } - } - - return false; - }; - /** * @param {?Function} fCallback * @param {Array} aExternals diff --git a/dev/Screen/User/MailBox.js b/dev/Screen/User/MailBox.js index c69dce10a..a08625507 100644 --- a/dev/Screen/User/MailBox.js +++ b/dev/Screen/User/MailBox.js @@ -75,9 +75,9 @@ MailBoxUserScreen.prototype.onRoute = function (sFolderHash, iPage, sSearch) { var - sThreadUid = sFolderHash.replace(/^(.+)\|([\d]+)$/, '$2'), + sThreadUid = sFolderHash.replace(/^(.+)~([\d]+)$/, '$2'), oFolder = Cache.getFolderFromCacheList(Cache.getFolderFullNameRaw( - sFolderHash.replace(/\|([\d]+)$/, ''))) + sFolderHash.replace(/~([\d]+)$/, ''))) ; if (oFolder) @@ -88,7 +88,7 @@ } FolderStore.currentFolder(oFolder); - + MessageStore.messageListPage(iPage); MessageStore.messageListSearch(sSearch); MessageStore.messageListThreadUid(sThreadUid); @@ -171,9 +171,9 @@ ; return [ - [/^([a-zA-Z0-9]+)\/p([1-9][0-9]*)\/(.+)\/?$/, {'normalize_': fNormS}], - [/^([a-zA-Z0-9]+)\/p([1-9][0-9]*)$/, {'normalize_': fNormS}], - [/^([a-zA-Z0-9]+)\/(.+)\/?$/, {'normalize_': fNormD}], + [/^([a-zA-Z0-9~]+)\/p([1-9][0-9]*)\/(.+)\/?$/, {'normalize_': fNormS}], + [/^([a-zA-Z0-9~]+)\/p([1-9][0-9]*)$/, {'normalize_': fNormS}], + [/^([a-zA-Z0-9~]+)\/(.+)\/?$/, {'normalize_': fNormD}], [/^([^\/]*)$/, {'normalize_': fNormS}] ]; }; diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index becf5fea4..2632a5f9a 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -43,10 +43,12 @@ this.messageListSearch = ko.observable(''); this.messageListThreadUid = ko.observable(''); this.messageListPage = ko.observable(1); + this.messageListPageBeforeThread = ko.observable(1); this.messageListError = ko.observable(''); this.messageListEndFolder = ko.observable(''); this.messageListEndSearch = ko.observable(''); + this.messageListEndThreadUid = ko.observable(''); this.messageListEndPage = ko.observable(1); this.messageListLoading = ko.observable(false); @@ -64,17 +66,12 @@ this.message.viewTrigger = ko.observable(false); - this.messageThreadList = ko.observableArray([]); - - this.messageLastThreadUidsData = ko.observable(null); - this.messageError = ko.observable(''); this.messageCurrentLoading = ko.observable(false); - this.messageThreadLoading = ko.observable(false); this.messageLoading = ko.computed(function () { - return !!(this.messageCurrentLoading() || this.messageThreadLoading()); + return this.messageCurrentLoading(); }, this); this.messageLoadingThrottle = ko.observable(false).extend({'throttle': 50}); @@ -94,8 +91,12 @@ MessageUserStore.prototype.computers = function () { + var self = this; + this.messageListEndHash = ko.computed(function () { - return this.messageListEndFolder() + '|' + this.messageListEndSearch() + '|' + this.messageListEndPage(); + return this.messageListEndFolder() + '|' + this.messageListEndSearch() + + '|' + this.messageListEndThreadUid() + + '|' + this.messageListEndPage(); }, this); this.messageListPageCount = ko.computed(function () { @@ -108,7 +109,8 @@ 'read': this.messageListSearch, 'write': function (sValue) { kn.setHash(Links.mailBox( - FolderStore.currentFolderFullNameHash(), 1, Utils.trim(sValue.toString()) + FolderStore.currentFolderFullNameHash(), 1, + Utils.trim(sValue.toString()), self.messageListThreadUid() )); }, 'owner': this @@ -666,14 +668,6 @@ } }; - MessageUserStore.prototype.selectThreadMessage = function (sFolder, sUid) - { - if (Remote.message(this.onMessageResponse, sFolder, sUid)) - { - this.messageThreadLoading(true); - } - }; - MessageUserStore.prototype.populateMessageBody = function (oMessage) { if (oMessage) @@ -695,7 +689,6 @@ this.hideMessageBodies(); this.messageCurrentLoading(false); - this.messageThreadLoading(false); if (Enums.StorageResultType.Success === sResult && oData && oData.Result) { @@ -817,7 +810,8 @@ this.messageListThreadUid(Utils.isNormal(oData.Result.ThreadUid) ? Utils.pString(oData.Result.ThreadUid) : ''); this.messageListEndFolder(Utils.isNormal(oData.Result.Folder) ? oData.Result.Folder : ''); - this.messageListEndSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : ''); + this.messageListEndSearch(this.messageListSearch()); + this.messageListEndThreadUid(this.messageListThreadUid()); this.messageListEndPage(this.messageListPage()); this.messageListDisableAutoSelect(true); @@ -827,26 +821,6 @@ Cache.clearNewMessageCache(); - if (AppStore.threadsAllowed() && SettingsStore.useThreads()) - { - oMessage = this.message(); - if (oMessage) - { - Remote.messageThreadsFromCache(function (sResult, oData) { - - if (Enums.StorageResultType.Success === sResult && oData && oData.Result && oData.Result.ThreadUids) - { - self.messageLastThreadUidsData({ - 'Folder': oData.Result.Folder, - 'Uid': oData.Result.Uid, - 'Uids': oData.Result.ThreadUids - }); - } - - }, oMessage.folderFullNameRaw, oMessage.uid); - } - } - if (oFolder && (bCached || bUnreadCountChange || SettingsStore.useThreads())) { require('App/User').folderInformation(oFolder.fullNameRaw, aList); diff --git a/dev/Styles/MessageList.less b/dev/Styles/MessageList.less index 4c7dba60a..eba936ca0 100644 --- a/dev/Styles/MessageList.less +++ b/dev/Styles/MessageList.less @@ -178,6 +178,15 @@ html.rl-no-preview-pane { border-bottom: 1px solid #eee; } + .listThreadUidDesc { + font-size: 16px; + padding: 7px 20px 5px 20px; + border-bottom: 1px solid #eee; + background-color: #FCF8E3; + cursor: pointer; + text-align: center; + } + .delimiter { display: block; height: 1px; @@ -313,6 +322,12 @@ html.rl-no-preview-pane { &.e-single-line .dateParent { } + .threadsParent { + display: inline-block; + float: right; + position: relative; + } + .attachmentParent { display: inline-block; float: right; @@ -398,8 +413,13 @@ html.rl-no-preview-pane { background-color: #999; color: #fff; border-radius: 6px; - padding: 1px 6px 1px 5px; - margin-right: 5px; + padding: 1px 2px 1px 5px; + margin-right: 2px; + + [class^="icon-"], + [class*=" icon-"] { + font-size: 14px; + } } } diff --git a/dev/Styles/_FontasticToBoot.less b/dev/Styles/_FontasticToBoot.less index 9e61f787a..70b25dae9 100644 --- a/dev/Styles/_FontasticToBoot.less +++ b/dev/Styles/_FontasticToBoot.less @@ -142,7 +142,7 @@ border-color: transparent; border-top-color: #999; - animation: rotation .8s infinite linear; + animation: rotation .8s infinite ease-in-out; } &.big { diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 7eab8a1fc..373e5dc27 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -70,6 +70,7 @@ this.mainMessageListSearch = MessageStore.mainMessageListSearch; this.messageListEndFolder = MessageStore.messageListEndFolder; + this.messageListEndThreadUid = MessageStore.messageListEndThreadUid; this.messageListChecked = MessageStore.messageListChecked; this.messageListCheckedOrSelected = MessageStore.messageListCheckedOrSelected; @@ -389,6 +390,15 @@ this.inputMessageListSearchFocus(false); }; + MessageListMailBoxUserView.prototype.cancelThreadUid = function () + { + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + MessageStore.messageListPageBeforeThread(), + MessageStore.messageListSearch() + )); + }; + /** * @param {string} sToFolderFullNameRaw * @param {boolean} bCopy @@ -618,6 +628,21 @@ } }; + MessageListMailBoxUserView.prototype.gotoThread = function (oMessage) + { + if (oMessage) + { + MessageStore.messageListPageBeforeThread(MessageStore.messageListPage()); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + 1, + MessageStore.messageListSearch(), + oMessage.uid + )); + } + }; + MessageListMailBoxUserView.prototype.onBuild = function (oDom) { var self = this; @@ -643,6 +668,9 @@ .on('click', '.messageList .messageListItem .flagParent', function () { self.flagMessages(ko.dataFor(this)); }) + .on('click', '.messageList .messageListItem .threads-len', function () { + self.gotoThread(ko.dataFor(this)); + }) ; this.initUploaderForAppend(); @@ -725,6 +753,22 @@ return false; }); + key('t', [Enums.KeyState.MessageList], function () { + + var oMessage = self.selectorMessageSelected(); + if (!oMessage) + { + oMessage = self.selectorMessageFocused(); + } + + if (oMessage && 0 < oMessage.threadsLen()) + { + self.gotoThread(oMessage); + } + + return false; + }); + // move key('m', Enums.KeyState.MessageList, function () { self.moveDropdownTrigger(true); @@ -761,6 +805,11 @@ self.cancelSearch(); return false; } + else if ('' !== self.messageListEndThreadUid()) + { + self.cancelThreadUid(); + return false; + } }); // change focused state diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index fdba28c18..c6399e990 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -229,164 +229,6 @@ this.viewIsImportant = ko.observable(false); this.viewIsFlagged = ko.observable(false); -// THREADS - this.viewThreads = ko.observableArray([]); - this.viewThreads.trigger = ko.observable(false); - - this.viewThreadMessages = MessageStore.messageThreadList; - - this.viewThreadMessages.error = ko.observable(''); - this.viewThreadMessages.showMore = ko.observable(false); - this.viewThreadMessages.limit = 6; - - this.viewThreadMessages.subscribe(function (aList) { - - var iSelectedIndex = -1; - - this.viewThreadMessages.error(''); - if (aList && 0 < aList.length) - { - _.each(aList, function (oM, iIndex) { - if (oM && oM.selected()) - { - iSelectedIndex = iIndex; - } - }); - - this.viewThreadMessages.showMore(this.viewThreadMessages.limit >= aList.length); - - if (-1 < iSelectedIndex && !this.viewThreadMessages.showMore() && - this.viewThreadMessages.limit < iSelectedIndex) - { - this.viewThreadMessages.showMore(true); - } - - this.selectSelectedThreadMessage(); - require('App/User').reloadFlagsCurrentMessageListAndMessageFromCache(); - } - - }, this); - - MessageStore.messageLastThreadUidsData.subscribe(function (oData) { - if (oData && oData['Uids']) - { - oData['Uid'] = Utils.pString(oData['Uid']); - if (this.viewFolder === oData['Folder'] && this.viewUid === oData['Uid']) - { - this.viewThreads(oData['Uids']); - this.viewThreads.trigger(!this.viewThreads.trigger()); - } - - var oMessage = MessageStore.message(); - if (oMessage && oMessage.folderFullNameRaw === oData['Folder'] && oMessage.uid === oData['Uid']) - { - oMessage.threads(oData['Uids']); - } - - oMessage = _.find(MessageStore.messageList(), function (oMessage) { - return oMessage && oMessage.folderFullNameRaw === oData['Folder'] && oMessage.uid === oData['Uid']; - }); - - if (oMessage && oMessage.folderFullNameRaw === oData['Folder'] && oMessage.uid === oData['Uid']) - { - oMessage.threads(oData['Uids']); - } - } - }, this); - - this.viewThreads.status = ko.computed(function () { - - this.viewThreads.trigger(); - - var - iIndex = 0, - aResult = [false, '', '', '', ''], - aThreads = this.viewThreads.peek(), - iLen = aThreads.length - ; - - if (1 < iLen) - { - iIndex = Utils.inArray(this.viewUid, aThreads); - if (-1 < iIndex) - { - aResult[0] = true; - aResult[1] = (iIndex + 1) + '/' + iLen; - aResult[2] = aThreads[iIndex]; - aResult[3] = 0 < iIndex && aThreads[iIndex - 1] ? aThreads[iIndex - 1] : ''; - aResult[4] = aThreads[iIndex + 1] ? aThreads[iIndex + 1] : ''; - } - } - - return aResult; - - }, this).extend({'notify': 'always'}); - - this.viewThreadsControlVisibility = ko.computed(function () { - return !!this.viewThreads.status()[0]; - }, this); - - this.viewThreadsControlDesc = ko.computed(function () { - return this.viewThreads.status()[1]; - }, this); - - this.viewThreadsControlBackAllow = ko.computed(function () { - return '' !== this.viewThreads.status()[4] && !this.messageLoadingThrottle(); - }, this); - - this.viewThreadsControlForwardAllow = ko.computed(function () { - return '' !== this.viewThreads.status()[3] && !this.messageLoadingThrottle(); - }, this); - - this.threadBackCommand = Utils.createCommand(this, function () { - var aStatus = this.viewThreads.status(); - this.openThreadMessage(aStatus[4]); - }, this.viewThreadsControlBackAllow); - - this.threadForwardCommand = Utils.createCommand(this, function () { - var aStatus = this.viewThreads.status(); - this.openThreadMessage(aStatus[3]); - }, this.viewThreadsControlForwardAllow); - - this.threadsDropdownTrigger = ko.observable(false); - - this.threadListCommand = Utils.createCommand(this, function () { - - var - self = this, - sFolder = this.viewFolder, - sUid = this.viewUid, - aUids = this.viewThreads(), - aStatus = this.viewThreads.status() - ; - - if (aStatus && aStatus[0]) - { - self.viewThreadMessages([]); - - Promises.messageListSimple(sFolder, aUids, this.messageListOfThreadsLoading).then(function (aList) { - - _.each(aList, function (oItem) { - if (oItem && oItem.uid) - { - oItem.selected(sUid === oItem.uid); - } - }); - - self.viewThreadMessages(aList); - - }).fail(function (iErrorCode) { - self.viewThreadMessages([]); - self.viewThreadMessages.error(Translator.getNotification( - iErrorCode, '', Enums.Notification.CantGetMessageList)); - }).done(); - } - - }, function () { - return !this.messageLoadingThrottle() && - !this.messageListOfThreadsLoading(); - }); - // PGP this.viewPgpPassword = ko.observable(''); this.viewPgpSignedVerifyStatus = ko.computed(function () { @@ -472,9 +314,6 @@ this.viewIsImportant(oMessage.isImportant()); this.viewIsFlagged(oMessage.flagged()); - this.viewThreads(oMessage.threads()); - this.viewThreads.trigger(!this.viewThreads.trigger()); - sLastEmail = oMessage.fromAsSingleEmail(); Cache.getUserPic(sLastEmail, function (sPic, sEmail) { if (sPic !== self.viewUserPic() && sLastEmail === sEmail) @@ -495,8 +334,6 @@ this.viewUid = ''; this.viewHash = ''; - this.viewThreads([]); - this.scrollMessageToTop(); } @@ -555,15 +392,6 @@ kn.extendAsViewModel(['View/User/MailBox/MessageView', 'View/App/MailBox/MessageView', 'MailBoxMessageViewViewModel'], MessageViewMailBoxUserView); _.extend(MessageViewMailBoxUserView.prototype, AbstractView.prototype); - MessageViewMailBoxUserView.prototype.openThreadMessage = function (sUid) - { - var oMessage = this.message(); - if (oMessage && sUid) - { - MessageStore.selectThreadMessage(oMessage.folderFullNameRaw, sUid); - } - }; - MessageViewMailBoxUserView.prototype.isPgpActionVisible = function () { return Enums.SignedVerifyStatus.Success !== this.viewPgpSignedVerifyStatus(); @@ -791,32 +619,6 @@ } } }) - .on('click', '.thread-list .more-threads', function (e) { - - var oLast = null; - if (!e || 0 === e.clientX) // probably enter - { - // It's a bad bad hack :( - oLast = $('.thread-list .e-item.thread-list-message.real-msg.more-that:first a.e-link', oDom); - } - - self.viewThreadMessages.showMore(true); - self.threadsDropdownTrigger(true); - - if (oLast && oLast[0]) - { - oLast.focus(); - } - - return false; - }) - .on('click', '.thread-list .thread-list-message', function () { - var oMessage = ko.dataFor(this); - if (oMessage && oMessage.folder && oMessage.uid) - { - self.openThreadMessage(oMessage.uid); - } - }) .on('click', '.attachmentsPlace .attachmentItem .attachmentNameParent', function () { var @@ -970,35 +772,16 @@ } }); - key('t', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { - if (MessageStore.message() && self.viewThreadsControlVisibility()) - { - self.threadsDropdownTrigger(true); - self.threadListCommand(); - return false; - } - }); - - key('ctrl+up, command+up', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { + key('ctrl+up, command+up, ctrl+left, command+left', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { self.goUpCommand(); return false; }); - key('ctrl+down, command+down', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { + key('ctrl+down, command+down, ctrl+right, command+right', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { self.goDownCommand(); return false; }); - key('ctrl+left, command+left', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { - self.threadForwardCommand(); - return false; - }); - - key('ctrl+right, command+right', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { - self.threadBackCommand(); - return false; - }); - // print key('ctrl+p, command+p', Enums.KeyState.MessageView, function () { if (self.message()) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index e2450810d..14faa9903 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -1916,6 +1916,7 @@ class MailClient * @param string $sSearch * @param string $sFolderName * @param string $sFolderHash + * @param bool $bUseSortIfSupported = false * * @return array * @@ -1923,7 +1924,7 @@ class MailClient * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ - public function GetUids($oCacher, $sSearch, $sFolderName, $sFolderHash) + public function GetUids($oCacher, $sSearch, $sFolderName, $sFolderHash, $bUseSortIfSupported = false) { $aResultUids = false; $bUidsFromCacher = false; @@ -1932,7 +1933,7 @@ class MailClient $sSerializedHash = ''; $sSerializedLog = ''; - $bUseSortIfSupported = !!$this->oImapClient->IsSupported('SORT'); + $bUseSortIfSupported = $bUseSortIfSupported ? !!$this->oImapClient->IsSupported('SORT') : false; if (0 < \strlen($sSearch)) { @@ -2078,7 +2079,11 @@ class MailClient if (0 < $iMessageRealCount) { - $mAllSortedUids = $this->GetUids($oCacher, '', $oMessageCollection->FolderName, $oMessageCollection->FolderHash); + $mAllSortedUids = $this->GetUids($oCacher, '', $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); + + $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false; + +// $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 37aa0afc0..8183a243b 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -5455,45 +5455,6 @@ class Actions return $this->DefaultResponse(__FUNCTION__, $aResult); } - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessageThreadsFromCache() - { - $sFolder = $this->GetActionParam('Folder', ''); - $sFolderHash = $this->GetActionParam('FolderHash', ''); - $sUid = (string) $this->GetActionParam('Uid', ''); - - if (0 === \strlen($sFolder) || 0 === \strlen($sUid)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); - } - - $aResult = array( - 'Folder' => $sFolder, - 'Uid' => $sUid, - 'FolderHash' => $sFolderHash, - 'ThreadUids' => null - ); - - $oCache = $this->cacherForUids(); - if ($oCache && $this->Config()->Get('labs', 'use_imap_thread', false)) - { - $aThreadUids = $this->MailClient()->MessageThreadUidsFromCache( - $sFolder, $sFolderHash, $sUid, $oCache - ); - - if (\is_array($aThreadUids) && 1 < \count($aThreadUids)) - { - $aResult['ThreadUids'] = $aThreadUids; - } - } - - return $this->DefaultResponse(__FUNCTION__, $aResult); - } - /** * @return array * @@ -5501,7 +5462,7 @@ class Actions */ public function DoMessageList() { -// \sleep(1); + \sleep(1); // throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); $sFolder = ''; @@ -5581,40 +5542,6 @@ class Actions return $this->DefaultResponse(__FUNCTION__, $oMessageList); } - /** - * @return array - * - * @throws \MailSo\Base\Exceptions\Exception - */ - public function DoMessageListSimple() - { -// \sleep(2); -// throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); - - $sFolder = $this->GetActionParam('Folder', ''); - $aUids = $this->GetActionParam('Uids', null); - - if (0 === \strlen($sFolder) || !\is_array($aUids)) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); - } - - $this->initMailClientConnection(); - - $aMessageList = array(); - - try - { - $aMessageList = $this->MailClient()->MessageListSimple($sFolder, $aUids); - } - catch (\Exception $oException) - { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList, $oException); - } - - return $this->DefaultResponse(__FUNCTION__, $aMessageList); - } - /** * @param \RainLoop\Model\Account $oAccount * @param bool $bWithDraftInfo = true diff --git a/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html b/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html index 93b5391da..0ded19103 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html +++ b/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html @@ -42,12 +42,12 @@ Ctrl + A, Cmd + A Z Delete, Shift + Delete, # + T M Q U I / - Esc Enter Enter →, Tab @@ -60,14 +60,12 @@ - - - - - - - - + + + + + +
Toggle fullscreen modeEnter
Toggle message blockquotesB
Next message in threadCtrl + ←, Cmd + ←
Previous message in threadCtrl + →, Cmd + →
PrintCtrl + P, Cmd + P
Exit fullscreen modeEsc
Close message (No preview pane layout)Esc
Switch focus back to message listTab, Shift + Tab, Esc
Enter
B
Ctrl + P, Cmd + P
Esc
Esc
Tab, Shift + Tab, Esc
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html index dbc806cfe..6c96d5104 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html @@ -137,12 +137,14 @@
+
+ +    + +
× - - : +
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItem.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItem.html index c269f835c..a83231b3a 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItem.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItem.html @@ -18,15 +18,20 @@
+
+ + + + + + +
    - - -  
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItemNoPreviewPane.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItemNoPreviewPane.html index e8a81aa9c..e16ec903b 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItemNoPreviewPane.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageListItemNoPreviewPane.html @@ -7,6 +7,14 @@
+
+ + + + + + +
@@ -24,9 +32,6 @@
    - - -  
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index ee19b8d48..a4310c4ac 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -188,67 +188,6 @@
-
- - - - -
- - - - -
- - - - -
@@ -261,9 +200,6 @@ - () ! From 8a4bce35915867995b76a93375cf8cac8b98c96a Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 22 Apr 2015 01:01:29 +0400 Subject: [PATCH 006/106] New thread list logic (step 3) --- dev/App/User.js | 43 +++++--------- dev/Model/Message.js | 10 ++-- dev/Promises/User/Ajax.js | 2 - dev/Stores/User/Message.js | 56 ++++++++++++++++++- dev/Styles/MessageList.less | 4 +- package.json | 2 +- .../app/libraries/MailSo/Mail/MailClient.php | 37 ++++++++---- 7 files changed, 103 insertions(+), 51 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index 55efe8b3f..59fc7b98f 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -174,7 +174,15 @@ if (Utils.isUnd(bDropPagePosition) ? false : !!bDropPagePosition) { MessageStore.messageListPage(1); + MessageStore.messageListPageBeforeThread(1); iOffset = 0; + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + MessageStore.messageListPage(), + MessageStore.messageListSearch(), + MessageStore.messageListThreadUid() + ), true, true); } MessageStore.messageListLoading(true); @@ -844,10 +852,8 @@ AppUser.prototype.messageListAction = function (sFolderFullNameRaw, mUid, iSetAction, aMessages) { var - bRoot = false, - aAllUids = [], - aRootUids = [], oFolder = null, + aRootUids = [], iAlreadyUnread = 0 ; @@ -856,33 +862,16 @@ aMessages = MessageStore.messageListChecked(); } - if (true === mUid) - { - bRoot = true; - } - else if (aMessages && aMessages[0] && mUid && - sFolderFullNameRaw === aMessages[0].folderFullNameRaw && mUid === aMessages[0].uid) - { - bRoot = true; - } + aRootUids = _.uniq(_.compact(_.map(aMessages, function (oMessage) { + return (oMessage && oMessage.uid) ? oMessage.uid : null; + }))); - _.each(aMessages, function (oMessage) { - if (oMessage && oMessage.uid && oMessage.threads) - { - aRootUids.push(oMessage.uid); - aAllUids = _.union(aAllUids, oMessage.threads(), [oMessage.uid]); - } - }); - - aAllUids = _.uniq(aAllUids); - aRootUids = _.uniq(aRootUids); - - if ('' !== sFolderFullNameRaw && 0 < aAllUids.length) + if ('' !== sFolderFullNameRaw && 0 < aRootUids.length) { switch (iSetAction) { case Enums.MessageSetAction.SetSeen: - _.each(bRoot ? aAllUids : aRootUids, function (sSubUid) { + _.each(aRootUids, function (sSubUid) { iAlreadyUnread += Cache.storeMessageFlagsToCacheBySetAction( sFolderFullNameRaw, sSubUid, iSetAction); }); @@ -893,7 +882,7 @@ oFolder.messageCountUnread(oFolder.messageCountUnread() - iAlreadyUnread); } - Remote.messageSetSeen(Utils.emptyFunction, sFolderFullNameRaw, bRoot ? aAllUids : aRootUids, true); + Remote.messageSetSeen(Utils.emptyFunction, sFolderFullNameRaw, aRootUids, true); break; case Enums.MessageSetAction.UnsetSeen: @@ -925,13 +914,11 @@ case Enums.MessageSetAction.UnsetFlag: _.each(aRootUids, function (sSubUid) { -// _.each(bRoot ? aAllUids : aRootUids, function (sSubUid) { Cache.storeMessageFlagsToCacheBySetAction( sFolderFullNameRaw, sSubUid, iSetAction); }); Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, aRootUids, false); -// Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, bRoot ? aAllUids : aRootUids, false); break; } diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 399e51912..f05d1c3e5 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -978,7 +978,7 @@ } }; - MessageModel.prototype.storeDataToDom = function () + MessageModel.prototype.storeDataInDom = function () { if (this.body) { @@ -997,7 +997,7 @@ } }; - MessageModel.prototype.storePgpVerifyDataToDom = function () + MessageModel.prototype.storePgpVerifyDataInDom = function () { if (this.body && require('Stores/User/Pgp').capaOpenPGP()) { @@ -1006,7 +1006,7 @@ } }; - MessageModel.prototype.fetchDataToDom = function () + MessageModel.prototype.fetchDataFromDom = function () { if (this.body) { @@ -1090,7 +1090,7 @@ } catch (oExc) {} - this.storePgpVerifyDataToDom(); + this.storePgpVerifyDataInDom(); } }; @@ -1162,7 +1162,7 @@ } catch (oExc) {} - this.storePgpVerifyDataToDom(); + this.storePgpVerifyDataInDom(); } }; diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js index e37362cfa..96e72dbd4 100644 --- a/dev/Promises/User/Ajax.js +++ b/dev/Promises/User/Ajax.js @@ -16,8 +16,6 @@ // AppStore = require('Stores/User/App'), // SettingsStore = require('Stores/User/Settings'), - MessageSimpleModel = require('Model/MessageSimple'), - PromisesPopulator = require('Promises/User/Populator'), AbstractAjaxPromises = require('Promises/AbstractAjax') ; diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 2632a5f9a..b9e2331bb 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -327,6 +327,7 @@ var self = this, iUnseenCount = 0, + oMessage = null, aMessageList = this.messageList(), oFromFolder = Cache.getFolderFromCacheList(sFromFolderFullNameRaw), oToFolder = '' === sToFolderFullNameRaw ? null : Cache.getFolderFromCacheList(sToFolderFullNameRaw || ''), @@ -406,6 +407,56 @@ { Cache.setFolderHash(sToFolderFullNameRaw, ''); } + + if ('' !== this.messageListThreadUid()) + { + aMessageList = this.messageList(); + + if (aMessageList && 0 < aMessageList.length && !!_.find(aMessageList, function (oMessage) { + return !!(oMessage && oMessage.deleted() && oMessage.uid === self.messageListThreadUid()); + })) + { + oMessage = _.find(aMessageList, function (oMessage) { + return oMessage && !oMessage.deleted(); + }); + + if (oMessage && this.messageListThreadUid() !== Utils.pString(oMessage.uid)) + { + this.messageListThreadUid(Utils.pString(oMessage.uid)); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + this.messageListPage(), + this.messageListSearch(), + this.messageListThreadUid() + ), true, true); + } + else if (!oMessage) + { + if (1 < this.messageListPage()) + { + this.messageListPage(this.messageListPage() - 1); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + this.messageListPage(), + this.messageListSearch(), + this.messageListThreadUid() + ), true, true); + } + else + { + this.messageListThreadUid(''); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + this.messageListPageBeforeThread(), + this.messageListSearch() + ), true, true); + } + } + } + } }; MessageUserStore.prototype.addBlockquoteSwitcherCallback = function () @@ -574,7 +625,7 @@ oMessagesBodiesDom.append(oMessage.body); } - oMessage.storeDataToDom(); + oMessage.storeDataInDom(); if (bHasInternals) { @@ -594,7 +645,7 @@ if (oMessage.body) { oMessage.body.data('rl-cache-count', ++Globals.iMessageBodyCacheCount); - oMessage.fetchDataToDom(); + oMessage.fetchDataFromDom(); } } @@ -725,7 +776,6 @@ oData.Result['@Collection'] && Utils.isArray(oData.Result['@Collection'])) { var - self = this, iIndex = 0, iLen = 0, iCount = 0, diff --git a/dev/Styles/MessageList.less b/dev/Styles/MessageList.less index eba936ca0..78eba39e2 100644 --- a/dev/Styles/MessageList.less +++ b/dev/Styles/MessageList.less @@ -181,8 +181,8 @@ html.rl-no-preview-pane { .listThreadUidDesc { font-size: 16px; padding: 7px 20px 5px 20px; - border-bottom: 1px solid #eee; - background-color: #FCF8E3; + background-color: #999; + color: #fff; cursor: pointer; text-align: center; } diff --git a/package.json b/package.json index 4dba13d46..eca6fd444 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "304", + "release": "305", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 14faa9903..fa7c2261c 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -2079,11 +2079,8 @@ class MailClient if (0 < $iMessageRealCount) { - $mAllSortedUids = $this->GetUids($oCacher, '', $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); - - $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false; - -// $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? + $mAllSortedUids = $this->GetUids($oCacher, '', + $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; @@ -2091,12 +2088,32 @@ class MailClient if ($bUseThreadSortIfSupported && 0 < $iThreadUid && \is_array($mAllThreads)) { $aUids = array(); - $aUids = \is_array($mAllThreads[$iThreadUid]) ? - $mAllThreads[$iThreadUid] : array(); - - if (\in_array($iThreadUid, $mAllSortedUids)) + $iResultRootUid = 0; + + if (isset($mAllThreads[$iThreadUid])) { - \array_unshift($aUids, $iThreadUid); + $iResultRootUid = $iThreadUid; + if (\is_array($mAllThreads[$iThreadUid])) + { + $aUids = $mAllThreads[$iThreadUid]; + } + } + else + { + foreach ($mAllThreads as $iRootUid => $mSubUids) + { + if (\is_array($mSubUids) && \in_array($iThreadUid, $mSubUids)) + { + $iResultRootUid = $iRootUid; + $aUids = $mSubUids; + continue; + } + } + } + + if (0 < $iResultRootUid && \in_array($iResultRootUid, $mAllSortedUids)) + { + \array_unshift($aUids, $iResultRootUid); } } else if ($bUseThreadSortIfSupported && \is_array($mAllThreads)) From 83010371d797537daf35eb98dde3b81c0b35c868 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 22 Apr 2015 01:04:56 +0400 Subject: [PATCH 007/106] Added new language strings --- rainloop/v/0.0.0/langs/bg.ini | 2 ++ rainloop/v/0.0.0/langs/cs.ini | 2 ++ rainloop/v/0.0.0/langs/de.ini | 2 ++ rainloop/v/0.0.0/langs/en-gb.ini | 2 ++ rainloop/v/0.0.0/langs/en.ini | 2 ++ rainloop/v/0.0.0/langs/es.ini | 2 ++ rainloop/v/0.0.0/langs/fr.ini | 2 ++ rainloop/v/0.0.0/langs/hu.ini | 2 ++ rainloop/v/0.0.0/langs/is.ini | 2 ++ rainloop/v/0.0.0/langs/it.ini | 2 ++ rainloop/v/0.0.0/langs/ja-jp.ini | 2 ++ rainloop/v/0.0.0/langs/ko-kr.ini | 2 ++ rainloop/v/0.0.0/langs/lt.ini | 2 ++ rainloop/v/0.0.0/langs/lv.ini | 2 ++ rainloop/v/0.0.0/langs/nl.ini | 2 ++ rainloop/v/0.0.0/langs/no.ini | 2 ++ rainloop/v/0.0.0/langs/pl.ini | 2 ++ rainloop/v/0.0.0/langs/pt-br.ini | 2 ++ rainloop/v/0.0.0/langs/pt-pt.ini | 2 ++ rainloop/v/0.0.0/langs/ro.ini | 2 ++ rainloop/v/0.0.0/langs/ru.ini | 2 ++ rainloop/v/0.0.0/langs/sk.ini | 2 ++ rainloop/v/0.0.0/langs/sv.ini | 2 ++ rainloop/v/0.0.0/langs/tr.ini | 2 ++ rainloop/v/0.0.0/langs/ua.ini | 2 ++ rainloop/v/0.0.0/langs/zh-cn.ini | 2 ++ rainloop/v/0.0.0/langs/zh-tw.ini | 2 ++ 27 files changed, 54 insertions(+) diff --git a/rainloop/v/0.0.0/langs/bg.ini b/rainloop/v/0.0.0/langs/bg.ini index c959c0e0a..36f55bc0e 100644 --- a/rainloop/v/0.0.0/langs/bg.ini +++ b/rainloop/v/0.0.0/langs/bg.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "С премахнат флаг" EMPTY_LIST = "Празен списък." EMPTY_SEARCH_LIST = "Няма съобщения, които да отговарят на търсенето." SEARCH_RESULT_FOR = "Резултати от търсенето за \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Зареждане" EMPTY_SUBJECT_TEXT = "(Няма заглавие)" PUT_MESSAGE_HERE = "Пуснете съобщението тук, за да го видите в списъка" @@ -607,6 +608,7 @@ LABEL_HELP = "Помощ" LABEL_CHECK_ALL = "Провери всички съобщения" LABEL_ARCHIVE = "Архивирай" LABEL_DELETE = "Изтрий" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Премести" LABEL_READ = "Прочети избраните съобщения" LABEL_UNREAD = "Маркирай като непрочетени избраните съобщения" diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index 9b722039c..aeadb23c7 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Neoznačené" EMPTY_LIST = "Seznam je prázdny." EMPTY_SEARCH_LIST = "Vašemu vyhledávání neodpovídají žádné zprávy." SEARCH_RESULT_FOR = "Výsledky vyhledávání pro \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Načítám" EMPTY_SUBJECT_TEXT = "(Bez předmětu)" PUT_MESSAGE_HERE = "Přesuňte zprávu sem pro její zobrazení v seznamu" @@ -606,6 +607,7 @@ LABEL_HELP = "Nápověda" LABEL_CHECK_ALL = "Zjistit nové zprávy" LABEL_ARCHIVE = "Archivovat" LABEL_DELETE = "Smazat" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Přesunout" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index 401d239ab..da5b3e942 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Nicht markiert" EMPTY_LIST = "Liste ist leer." EMPTY_SEARCH_LIST = "Keine Treffer für Ihre Suche." SEARCH_RESULT_FOR = "Suchergebnisse für \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Die Liste wird geladen" EMPTY_SUBJECT_TEXT = "(Kein Betreff)" PUT_MESSAGE_HERE = "Ziehen Sie die Nachricht hierhin, um sie in der Liste anzuzeigen" @@ -607,6 +608,7 @@ LABEL_HELP = "Hilfe" LABEL_CHECK_ALL = "Alle Nachrichten auswählen" LABEL_ARCHIVE = "Archivieren" LABEL_DELETE = "Löschen" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Verschieben" LABEL_READ = "Ausgewählte Nachrichten als gelesen markieren" LABEL_UNREAD = "Ausgewählte Nachrichten als ungelesen markieren" diff --git a/rainloop/v/0.0.0/langs/en-gb.ini b/rainloop/v/0.0.0/langs/en-gb.ini index b701e6963..0d4fb47b0 100644 --- a/rainloop/v/0.0.0/langs/en-gb.ini +++ b/rainloop/v/0.0.0/langs/en-gb.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Unflagged" EMPTY_LIST = "Empty list." EMPTY_SEARCH_LIST = "No messages matched your search." SEARCH_RESULT_FOR = "Search results for \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Loading" EMPTY_SUBJECT_TEXT = "(No subject)" PUT_MESSAGE_HERE = "Drop message here to view it in the list" @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/en.ini b/rainloop/v/0.0.0/langs/en.ini index b701e6963..0d4fb47b0 100644 --- a/rainloop/v/0.0.0/langs/en.ini +++ b/rainloop/v/0.0.0/langs/en.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Unflagged" EMPTY_LIST = "Empty list." EMPTY_SEARCH_LIST = "No messages matched your search." SEARCH_RESULT_FOR = "Search results for \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Loading" EMPTY_SUBJECT_TEXT = "(No subject)" PUT_MESSAGE_HERE = "Drop message here to view it in the list" @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini index 76db7ee5c..ab7b06ed4 100644 --- a/rainloop/v/0.0.0/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "No Destacado" EMPTY_LIST = "No hay mensajes." EMPTY_SEARCH_LIST = "La búsqueda no ha producido resultados." SEARCH_RESULT_FOR = "Resultados de búsqueda para \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Cargando" EMPTY_SUBJECT_TEXT = "(Sin asunto)" PUT_MESSAGE_HERE = "Arrastre su mensaje aquí para verlo en la lista" @@ -607,6 +608,7 @@ LABEL_HELP = "Ayuda" LABEL_CHECK_ALL = "Comprobar todos los mensajes" LABEL_ARCHIVE = "Archivo" LABEL_DELETE = "Eliminar" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Mover" LABEL_READ = "Marcar los mensajes seleccionados como leídos" LABEL_UNREAD = "Marcar los mensajes seleccionados como no leídos" diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index dc990eb9a..4a97dc03d 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Non marqué" EMPTY_LIST = "Liste vide." EMPTY_SEARCH_LIST = "Aucun message ne correspond à votre recherche." SEARCH_RESULT_FOR = "Résultats de recherche pour \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Chargement" EMPTY_SUBJECT_TEXT = "(Pas de sujet)" PUT_MESSAGE_HERE = "Glisser un message ici pour l'afficher dans la liste" @@ -607,6 +608,7 @@ LABEL_HELP = "Aide" LABEL_CHECK_ALL = "Marquer tous les messages comme lus" LABEL_ARCHIVE = "Archiver" LABEL_DELETE = "Supprimer" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Déplacer" LABEL_READ = "Marquer les messages sélectionnés comme lus" LABEL_UNREAD = "Marquer les messages sélectionnés comme non-lus" diff --git a/rainloop/v/0.0.0/langs/hu.ini b/rainloop/v/0.0.0/langs/hu.ini index 2cade922e..f9c5df372 100644 --- a/rainloop/v/0.0.0/langs/hu.ini +++ b/rainloop/v/0.0.0/langs/hu.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Jelöletlen" EMPTY_LIST = "Lista üres." EMPTY_SEARCH_LIST = "Nincs a keresésnek megfelelő levél." SEARCH_RESULT_FOR = "Eredmény: \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Betöltés" EMPTY_SUBJECT_TEXT = "(Nincs tárgy)" PUT_MESSAGE_HERE = "Drop message here to view it in the list" @@ -607,6 +608,7 @@ LABEL_HELP = "Súgó" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archiválás" LABEL_DELETE = "Tőrlés" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini index a716bfb76..e3563ed4d 100644 --- a/rainloop/v/0.0.0/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Afflaggað" EMPTY_LIST = "Tómur listi." EMPTY_SEARCH_LIST = "Engin skilaboð stemmdu við leitina þína." SEARCH_RESULT_FOR = "Leitarniðurstöður fyrir \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Hleð" EMPTY_SUBJECT_TEXT = "(Ekkert viðfangsefni)" PUT_MESSAGE_HERE = "Settu skilaboðið hér til að skoða það í listanum" @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index ea795c3fb..0c84b5aa5 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Non preferiti" EMPTY_LIST = "Lista vuota" EMPTY_SEARCH_LIST = "Nessun messaggio corrisponde alla tua ricerca" SEARCH_RESULT_FOR = "Risultati di ricerca per \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Caricamento..." EMPTY_SUBJECT_TEXT = "(Nessun oggetto)" PUT_MESSAGE_HERE = "Trascina il messaggio qui per vederlo nella lista" @@ -607,6 +608,7 @@ LABEL_HELP = "Aiuto" LABEL_CHECK_ALL = "Seleziona tutti i messaggi" LABEL_ARCHIVE = "Archivia messaggio" LABEL_DELETE = "Elimina messaggio" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Sposta messaggio" LABEL_READ = "Marca come letti i messaggi selezionati" LABEL_UNREAD = "Marca come non letti i messaggi selezionati" diff --git a/rainloop/v/0.0.0/langs/ja-jp.ini b/rainloop/v/0.0.0/langs/ja-jp.ini index ebb6a2279..6a0969fd1 100644 --- a/rainloop/v/0.0.0/langs/ja-jp.ini +++ b/rainloop/v/0.0.0/langs/ja-jp.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Unflagged" EMPTY_LIST = "メールは空です。おめでとう!" EMPTY_SEARCH_LIST = "検索条件に一致するメールは見つかりませんでした。高度な検索を試してみてください。" SEARCH_RESULT_FOR = "Search results for \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "読み込み中" EMPTY_SUBJECT_TEXT = "(件名なし)" PUT_MESSAGE_HERE = "Drop message here to view it in the list" @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/ko-kr.ini b/rainloop/v/0.0.0/langs/ko-kr.ini index 1d922c4e9..3ca2a59ec 100644 --- a/rainloop/v/0.0.0/langs/ko-kr.ini +++ b/rainloop/v/0.0.0/langs/ko-kr.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "일반" EMPTY_LIST = "Empty list." EMPTY_SEARCH_LIST = "검색 조건에 맞는 결과가 없습니다.." SEARCH_RESULT_FOR = "\"%SEARCH%\"에 대한 검색결과" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "로딩 중" EMPTY_SUBJECT_TEXT = "(제목 없음)" PUT_MESSAGE_HERE = "목록에서 표시할 메시지를 여기로 끌어 넣으세요." @@ -604,6 +605,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index c55b5203b..c5c227de0 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Nepažymėta" EMPTY_LIST = "Tuščias sąrašas." EMPTY_SEARCH_LIST = "Nėra pranešimų, atitinkančių jūsų paiešką." SEARCH_RESULT_FOR = "Ieškoti \"%SEARCH%\" rezultatuose" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Kraunasi" EMPTY_SUBJECT_TEXT = "(Be temos)" PUT_MESSAGE_HERE = "Įkelkite žinutę čia, kad matytumėte ją sąraše" @@ -607,6 +608,7 @@ LABEL_HELP = "Pagalba" LABEL_CHECK_ALL = "Žymėti visus laiškus" LABEL_ARCHIVE = "Archyvuoti" LABEL_DELETE = "Šalinti" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Perkelti" LABEL_READ = "Pasirinktus žymėti kaip skaitytus" LABEL_UNREAD = "Pasirinktus žymėti kaip neskaitytus" diff --git a/rainloop/v/0.0.0/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini index 025b7fa95..dec960ac4 100644 --- a/rainloop/v/0.0.0/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Noņemtās atzīmes" EMPTY_LIST = "Tukšs saraksts." EMPTY_SEARCH_LIST = "Neviens ziņojums neatbilda jūsu meklētajiem kritērijiem." SEARCH_RESULT_FOR = "Meklēšanas rezultāti: \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Lādējas" EMPTY_SUBJECT_TEXT = "(Nav virsraksta)" PUT_MESSAGE_HERE = "Ievelciet ziņojumus šeit lai tos apskatītu." @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index 04242608c..e572c84d4 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Zonder Vlag" EMPTY_LIST = "Geen berichten" EMPTY_SEARCH_LIST = "Geen items gevonden" SEARCH_RESULT_FOR = "Zoekresultaten voor\"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Ophalen..." EMPTY_SUBJECT_TEXT = "(Geen onderwerp)" PUT_MESSAGE_HERE = "Sleep bericht hier om ze te bekijken in de lijst" @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Selecteer alle berichten" LABEL_ARCHIVE = "Archiveren" LABEL_DELETE = "Verwijderen" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Verplaatsen" LABEL_READ = "Markeer geselecteerde berichten als gelezen" LABEL_UNREAD = "Markeer geselecteerde berichten als ongelezen" diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index a91b414d8..3d94921f8 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Ikke markert" EMPTY_LIST = "Tom liste" EMPTY_SEARCH_LIST = "Ingen meldinger matchet søket ditt." SEARCH_RESULT_FOR = "Søkeresultater for \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Laster" EMPTY_SUBJECT_TEXT = "(tomt emne)" PUT_MESSAGE_HERE = "Dra melding her for å vise det i listen" @@ -606,6 +607,7 @@ LABEL_HELP = "Hjelp" LABEL_CHECK_ALL = "Merk alle meldinger" LABEL_ARCHIVE = "Arkiver" LABEL_DELETE = "Slett" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Flytt" LABEL_READ = "Merk som lest" LABEL_UNREAD = "Merk som ulest" diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index 6b3af5a81..d5939dc47 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Oznaczone jako nieważne" EMPTY_LIST = "Pusta lista" EMPTY_SEARCH_LIST = "Brak wiadomości spełniających kryteria wyszukiwania" SEARCH_RESULT_FOR = "Wyniki wyszukiwania dla: \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Ładowanie" EMPTY_SUBJECT_TEXT = "(Brak tematu)" PUT_MESSAGE_HERE = "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście" @@ -607,6 +608,7 @@ LABEL_HELP = "Pomoc" LABEL_CHECK_ALL = "Sprawdź wszystkie wiadomości" LABEL_ARCHIVE = "Archiwum" LABEL_DELETE = "Usuń" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Przenieś" LABEL_READ = "Oznacz zaznaczone wiadomości, jako przeczytane" LABEL_UNREAD = "Oznacz zaznaczone wiadomości, jako nieprzeczytane" diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index 68e4045c5..45c99780a 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Não Sinalizadas" EMPTY_LIST = "Lista Vazia." EMPTY_SEARCH_LIST = "Nenhuma mensagem corresponde a sua pesquisa." SEARCH_RESULT_FOR = "Resultados de pesquisa para \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Carregando" EMPTY_SUBJECT_TEXT = "(Sem assunto)" PUT_MESSAGE_HERE = "Coloque a mensagem aqui para vê-la na lista" @@ -607,6 +608,7 @@ LABEL_HELP = "Ajuda" LABEL_CHECK_ALL = "Selecionar todas as mensagens" LABEL_ARCHIVE = "Arquivar" LABEL_DELETE = "Excluir" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Mover" LABEL_READ = "Marcar mensagens selecionadas como lidas" LABEL_UNREAD = "Marcar mensagens selecionadas como não lidas" diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index 231337e6e..b813ece48 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Não sinalizada" EMPTY_LIST = "Lista vazia." EMPTY_SEARCH_LIST = "Nenhuma mensagem corresponde à sua pesquisa." SEARCH_RESULT_FOR = "Resultados de pesquisa para \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "A carregar" EMPTY_SUBJECT_TEXT = "(Sem assunto)" PUT_MESSAGE_HERE = "Coloque a mensagem aqui para vê-la na lista" @@ -607,6 +608,7 @@ LABEL_HELP = "Ajuda" LABEL_CHECK_ALL = "Selecionar todas as mensagens" LABEL_ARCHIVE = "Arquivar" LABEL_DELETE = "Eliminar" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Mover" LABEL_READ = "Ler as mensagens selecionadas" LABEL_UNREAD = "Marcar as mensagens selecionadas como não lidas" diff --git a/rainloop/v/0.0.0/langs/ro.ini b/rainloop/v/0.0.0/langs/ro.ini index 157555e6f..81e5e205f 100644 --- a/rainloop/v/0.0.0/langs/ro.ini +++ b/rainloop/v/0.0.0/langs/ro.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Neimportant" EMPTY_LIST = "Nimic aici, deocamdată" EMPTY_SEARCH_LIST = "Nu am găsit nimic." SEARCH_RESULT_FOR = "Rezultat căutare \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Caut..." EMPTY_SUBJECT_TEXT = "(nici un subiect)" PUT_MESSAGE_HERE = "EROARE CONTACTATI ADIMISTRATORUL!(trimite-ti un prt.scr)" @@ -606,6 +607,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini index fe867ba1b..bf7a2f281 100644 --- a/rainloop/v/0.0.0/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Без пометок" EMPTY_LIST = "В папке нет писем." EMPTY_SEARCH_LIST = "Письма не найдены." SEARCH_RESULT_FOR = "Результат поиска \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Загрузка" EMPTY_SUBJECT_TEXT = "(Без темы)" PUT_MESSAGE_HERE = "Киньте сообщение сюда, чтобы посмотреть его в списке" @@ -607,6 +608,7 @@ LABEL_HELP = "Помощь" LABEL_CHECK_ALL = "Выбрать все сообщения" LABEL_ARCHIVE = "Архивировать" LABEL_DELETE = "Удалить" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Переместить" LABEL_READ = "Пометить выбранные письма прочитанными" LABEL_UNREAD = "Пометить выбранные письма непрочитанными" diff --git a/rainloop/v/0.0.0/langs/sk.ini b/rainloop/v/0.0.0/langs/sk.ini index ec6f1512b..34cdd15a0 100644 --- a/rainloop/v/0.0.0/langs/sk.ini +++ b/rainloop/v/0.0.0/langs/sk.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Neoznačené" EMPTY_LIST = "Zoznam je prázdny." EMPTY_SEARCH_LIST = "Vášmu vyhľadávaniu nezodpovedajú žiadne správy." SEARCH_RESULT_FOR = "Výsledky vyhľadávania pre \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Načítavam" EMPTY_SUBJECT_TEXT = "(Bez predmetu)" PUT_MESSAGE_HERE = "Pusťte správu tu pre jej zobrazenie v zozname" @@ -607,6 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Select all messages" LABEL_ARCHIVE = "Archive" LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Move" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/sv.ini b/rainloop/v/0.0.0/langs/sv.ini index bee76c80f..d04928ae7 100644 --- a/rainloop/v/0.0.0/langs/sv.ini +++ b/rainloop/v/0.0.0/langs/sv.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Avflaggad" EMPTY_LIST = "Tom lista" EMPTY_SEARCH_LIST = "Inga meddelanden matchar din sökning." SEARCH_RESULT_FOR = "Sök resultat för \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Laddar" EMPTY_SUBJECT_TEXT = "(Inget ämne)" PUT_MESSAGE_HERE = "Släpp meddelandet för att se det i listan" @@ -607,6 +608,7 @@ LABEL_HELP = "Hjälp" LABEL_CHECK_ALL = "Kontrollera alla meddelanden" LABEL_ARCHIVE = "Arkiv" LABEL_DELETE = "Ta bort" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Flytta" LABEL_READ = "Markera valda meddelanden som lästa" LABEL_UNREAD = "Markera valda meddelanden som olästa" diff --git a/rainloop/v/0.0.0/langs/tr.ini b/rainloop/v/0.0.0/langs/tr.ini index 710626341..457bf2dd5 100644 --- a/rainloop/v/0.0.0/langs/tr.ini +++ b/rainloop/v/0.0.0/langs/tr.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "İşaretlenmemiş" EMPTY_LIST = "Herhangi Bir Sonuç Bulunamadı." EMPTY_SEARCH_LIST = "Arama sonuçlarına uyan herhangi bir mesaj bulunamadı." SEARCH_RESULT_FOR = "\"%SEARCH%\" için arama sonuçları" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Yükleniyor" EMPTY_SUBJECT_TEXT = "(Konu Yok)" PUT_MESSAGE_HERE = "Listede görüntülemek istediğiniz mesajı buraya sürükleyin." @@ -605,6 +606,7 @@ LABEL_HELP = "Yardım" LABEL_CHECK_ALL = "Tüm mesajları seç" LABEL_ARCHIVE = "Arşiv" LABEL_DELETE = "Sil" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Taşı" LABEL_READ = "Seçili mesajları oku" LABEL_UNREAD = "Seçili mesajları okuma" diff --git a/rainloop/v/0.0.0/langs/ua.ini b/rainloop/v/0.0.0/langs/ua.ini index 7968a966d..4ac09335d 100644 --- a/rainloop/v/0.0.0/langs/ua.ini +++ b/rainloop/v/0.0.0/langs/ua.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "Без поміток" EMPTY_LIST = "В папці немає листів." EMPTY_SEARCH_LIST = "Листи не знайдено." SEARCH_RESULT_FOR = "Результат пошуку \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "Завантаження" EMPTY_SUBJECT_TEXT = "(Без теми)" PUT_MESSAGE_HERE = "Киньте повідомлення сюди, щоб подивитися його в списку" @@ -607,6 +608,7 @@ LABEL_HELP = "Допомога" LABEL_CHECK_ALL = "Вибрати всі повідомлення" LABEL_ARCHIVE = "Архівувати" LABEL_DELETE = "Видалити" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "Перемістити" LABEL_READ = "Відмітити вибрані листи прочитаними" LABEL_UNREAD = "Відмітити вибрані листи непрочитаними" diff --git a/rainloop/v/0.0.0/langs/zh-cn.ini b/rainloop/v/0.0.0/langs/zh-cn.ini index 21ee3af13..f4826d416 100644 --- a/rainloop/v/0.0.0/langs/zh-cn.ini +++ b/rainloop/v/0.0.0/langs/zh-cn.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "未加星标" EMPTY_LIST = "空列表。" EMPTY_SEARCH_LIST = "未找到您想要的。" SEARCH_RESULT_FOR = "搜索 \"%SEARCH%\" 的结果" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "加载中" EMPTY_SUBJECT_TEXT = "(无主题)" PUT_MESSAGE_HERE = "在这里查看邮件" @@ -607,6 +608,7 @@ LABEL_HELP = "帮助" LABEL_CHECK_ALL = "检查所有消息" LABEL_ARCHIVE = "存档" LABEL_DELETE = "删除" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "移动" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" diff --git a/rainloop/v/0.0.0/langs/zh-tw.ini b/rainloop/v/0.0.0/langs/zh-tw.ini index f6b6ff4bd..7d9bf5b42 100644 --- a/rainloop/v/0.0.0/langs/zh-tw.ini +++ b/rainloop/v/0.0.0/langs/zh-tw.ini @@ -90,6 +90,7 @@ MENU_SELECT_UNFLAGGED = "未加星標" EMPTY_LIST = "空列表。" EMPTY_SEARCH_LIST = "未找到您想要的。" SEARCH_RESULT_FOR = "搜索 \"%SEARCH%\" 的結果" +BACK_TO_MESSAGE_LIST = "back to message list" LIST_LOADING = "載入中" EMPTY_SUBJECT_TEXT = "(無主題)" PUT_MESSAGE_HERE = "在這裡查看郵件" @@ -607,6 +608,7 @@ LABEL_HELP = "幫助" LABEL_CHECK_ALL = "檢查所有消息" LABEL_ARCHIVE = "存檔" LABEL_DELETE = "刪除" +LABEL_OPEN_THREAD = "Open selected thread" LABEL_MOVE = "移動" LABEL_READ = "Read selected messages" LABEL_UNREAD = "Unread selected messages" From 0063d10e2c02ba03c859e240a372d4d787dadbf6 Mon Sep 17 00:00:00 2001 From: Skibbi Date: Wed, 22 Apr 2015 00:39:18 +0200 Subject: [PATCH 008/106] Update pl.ini --- rainloop/v/0.0.0/langs/pl.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index d5939dc47..7e22c9237 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -90,7 +90,7 @@ MENU_SELECT_UNFLAGGED = "Oznaczone jako nieważne" EMPTY_LIST = "Pusta lista" EMPTY_SEARCH_LIST = "Brak wiadomości spełniających kryteria wyszukiwania" SEARCH_RESULT_FOR = "Wyniki wyszukiwania dla: \"%SEARCH%\"" -BACK_TO_MESSAGE_LIST = "back to message list" +BACK_TO_MESSAGE_LIST = "powrót do listy wiadomości" LIST_LOADING = "Ładowanie" EMPTY_SUBJECT_TEXT = "(Brak tematu)" PUT_MESSAGE_HERE = "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście" @@ -608,7 +608,7 @@ LABEL_HELP = "Pomoc" LABEL_CHECK_ALL = "Sprawdź wszystkie wiadomości" LABEL_ARCHIVE = "Archiwum" LABEL_DELETE = "Usuń" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Otwórz wybrany wątek" LABEL_MOVE = "Przenieś" LABEL_READ = "Oznacz zaznaczone wiadomości, jako przeczytane" LABEL_UNREAD = "Oznacz zaznaczone wiadomości, jako nieprzeczytane" @@ -710,4 +710,4 @@ NO_COOKIE_DESC = "Obsługa Cookies jest wyłączona w twojej przeglądarce Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony." BAD_BROWSER_TITLE = "Twoja przeglądarka jest przestarzała!" BAD_BROWSER_DESC = "W celu wykorzystania wszystkich funkcji tej aplikacji, -zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek:" \ No newline at end of file +zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek:" From ce107e90c1da6687ac3f174d4729dd32bfa36bf7 Mon Sep 17 00:00:00 2001 From: daliusm Date: Wed, 22 Apr 2015 08:11:38 +0300 Subject: [PATCH 009/106] Update lt.ini [MESSAGE] BUTTON_THREAD_MORE = "More messages" [MESSAGE_LIST] BACK_TO_MESSAGE_LIST = "back to message list" [SHORTCUTS_HELP] LABEL_OPEN_THREAD = "Open selected thread" --- rainloop/v/0.0.0/langs/lt.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index c5c227de0..d24a39820 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -90,7 +90,7 @@ MENU_SELECT_UNFLAGGED = "Nepažymėta" EMPTY_LIST = "Tuščias sąrašas." EMPTY_SEARCH_LIST = "Nėra pranešimų, atitinkančių jūsų paiešką." SEARCH_RESULT_FOR = "Ieškoti \"%SEARCH%\" rezultatuose" -BACK_TO_MESSAGE_LIST = "back to message list" +BACK_TO_MESSAGE_LIST = "grįžti į sąrašą" LIST_LOADING = "Kraunasi" EMPTY_SUBJECT_TEXT = "(Be temos)" PUT_MESSAGE_HERE = "Įkelkite žinutę čia, kad matytumėte ją sąraše" @@ -121,7 +121,7 @@ BUTTON_IN_NEW_WINDOW = "Peržiūrėti atskirame lange" BUTTON_THREAD_LIST = "Temų sąrašas" BUTTON_THREAD_PREV = "Ankstesnis" BUTTON_THREAD_NEXT = "Kitas" -BUTTON_THREAD_MORE = "More messages" +BUTTON_THREAD_MORE = "Daugiau žinučių" MENU_HEADERS = "Rodyti pranešimų antraštės" MENU_VIEW_ORIGINAL = "Rodyti šaltinį" MENU_DOWNLOAD_ORIGINAL = "Atsisiųsti .eml failą" @@ -608,7 +608,7 @@ LABEL_HELP = "Pagalba" LABEL_CHECK_ALL = "Žymėti visus laiškus" LABEL_ARCHIVE = "Archyvuoti" LABEL_DELETE = "Šalinti" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Atidaryti pasirinktą giją" LABEL_MOVE = "Perkelti" LABEL_READ = "Pasirinktus žymėti kaip skaitytus" LABEL_UNREAD = "Pasirinktus žymėti kaip neskaitytus" @@ -710,4 +710,4 @@ NO_COOKIE_DESC = "Slapukų paialikymas negalimas jūsų naršyklėje. Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl." BAD_BROWSER_TITLE = "Jūsų naršyklė pasenusi." BAD_BROWSER_DESC = "Norint naudotis visais šios aplikacijos privalumais, -parsisiųskite ir įsidiekite vieną iš šių naršyklių:" \ No newline at end of file +parsisiųskite ir įsidiekite vieną iš šių naršyklių:" From 3bc0208e19f16130f609e80b651e0dd833d115d9 Mon Sep 17 00:00:00 2001 From: Niklas Siepmann Date: Wed, 22 Apr 2015 22:25:14 +0200 Subject: [PATCH 010/106] Updated german language file (#467) --- rainloop/v/0.0.0/langs/de.ini | 44 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index da5b3e942..7aecc67c0 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -90,7 +90,7 @@ MENU_SELECT_UNFLAGGED = "Nicht markiert" EMPTY_LIST = "Liste ist leer." EMPTY_SEARCH_LIST = "Keine Treffer für Ihre Suche." SEARCH_RESULT_FOR = "Suchergebnisse für \"%SEARCH%\"" -BACK_TO_MESSAGE_LIST = "back to message list" +BACK_TO_MESSAGE_LIST = "Zurück zur Nachrichtenliste" LIST_LOADING = "Die Liste wird geladen" EMPTY_SUBJECT_TEXT = "(Kein Betreff)" PUT_MESSAGE_HERE = "Ziehen Sie die Nachricht hierhin, um sie in der Liste anzuzeigen" @@ -382,27 +382,27 @@ Falls Sie gelöschte Nachrichten endgültig löschen möchten, wählen Sie die O NOTIFICATION_ARCHIVE = "Sie haben keinen \"Archiv\"-Systemordner gewählt, in dem die archivierten Nachrichten abgelegt werden." [POPUPS_TWO_FACTOR_CFG] -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" +LEGEND_TWO_FACTOR_AUTH = "Zwei-Faktor-Authentifizierung" +LABEL_ENABLE_TWO_FACTOR = "Zwei-Faktor-Authentifizierung aktivieren" +LABEL_TWO_FACTOR_USER = "Benutzer" LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" -BUTTON_CREATE = "Create New Secret" -BUTTON_ACTIVATE = "Activate" -BUTTON_CLEAR = "Clear" -BUTTON_LOGOUT = "Logout" -BUTTON_DONE = "Done" +LABEL_TWO_FACTOR_SECRET = "Geheimnis" +LABEL_TWO_FACTOR_BACKUP_CODES = "Sicherungscodes" +BUTTON_CREATE = "Neues Geheimnis erstellen" +BUTTON_ACTIVATE = "Aktivieren" +BUTTON_CLEAR = "Löschen" +BUTTON_LOGOUT = "Abmelden" +BUTTON_DONE = "Erledigt" BUTTON_TEST = "Test" LINK_TEST = "test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." +BUTTON_SHOW_SECRET = "Geheimnis einblenden" +BUTTON_HIDE_SECRET = "Geheminis ausblenden" +TWO_FACTOR_REQUIRE_DESC = "Ihr Benutzerkonto erfordert die Einrichtung der Zwei-Faktor-Authentifizierung." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfiguriert" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nicht konfiguriert" +TWO_FACTOR_SECRET_DESC = "Importieren Sie diese Information in Ihre Google Authenticator Anwendung (oder andere TOTP-Anwendung), in dem Sie den unten bereitgestellten QR-Code verwenden oder den Code manuell eingeben." +TWO_FACTOR_BACKUP_CODES_DESC = "Sollten Sie keine Codes über den Google Authenticator erhalten, können Sie einen Sicherungscode zur Anmeldung verwenden. Der Sicherungscode wird inaktiv, sobald Sie ihn zur Anmeldung verwendet haben." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Sie können diese Einstellung nicht ohne vorherigen Test verändern." [TITLES] LOADING = "Wird geladen" @@ -468,7 +468,7 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Signatur zu allen ausgehenden Nachrichten hinzufü [SETTINGS_SECURITY] LEGEND_SECURITY = "Sicherheit" -LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" +LABEL_CONFIGURATE_TWO_FACTOR = "Zwei-Faktor-Authentifizierung konfigurieren" LABEL_AUTOLOGOUT = "Automatische Abmeldung" AUTOLOGIN_NEVER_OPTION_NAME = "Nie" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% Minute(n)" @@ -608,7 +608,7 @@ LABEL_HELP = "Hilfe" LABEL_CHECK_ALL = "Alle Nachrichten auswählen" LABEL_ARCHIVE = "Archivieren" LABEL_DELETE = "Löschen" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Ausgewählte Unterhaltung öffnen" LABEL_MOVE = "Verschieben" LABEL_READ = "Ausgewählte Nachrichten als gelesen markieren" LABEL_UNREAD = "Ausgewählte Nachrichten als ungelesen markieren" @@ -710,4 +710,4 @@ NO_COOKIE_DESC = "Ihr Browser unterstützt Cookies nicht. Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut." BAD_BROWSER_TITLE = "Ihr Browser ist veraltet." BAD_BROWSER_DESC = "Um alle Funktionen dieser Anwendung nutzen zu können, -sollten Sie einen der folgenden Browser herunterladen und installieren:" \ No newline at end of file +sollten Sie einen der folgenden Browser herunterladen und installieren:" From ebe2cd6068125349ed19c18cf170c2708899bae9 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 22 Apr 2015 18:09:38 -0300 Subject: [PATCH 011/106] Update pt-br.ini (#467) --- rainloop/v/0.0.0/langs/pt-br.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index 45c99780a..2ef48d5bd 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -90,7 +90,7 @@ MENU_SELECT_UNFLAGGED = "Não Sinalizadas" EMPTY_LIST = "Lista Vazia." EMPTY_SEARCH_LIST = "Nenhuma mensagem corresponde a sua pesquisa." SEARCH_RESULT_FOR = "Resultados de pesquisa para \"%SEARCH%\"" -BACK_TO_MESSAGE_LIST = "back to message list" +BACK_TO_MESSAGE_LIST = "Voltar para a lista de mensagens" LIST_LOADING = "Carregando" EMPTY_SUBJECT_TEXT = "(Sem assunto)" PUT_MESSAGE_HERE = "Coloque a mensagem aqui para vê-la na lista" @@ -608,7 +608,7 @@ LABEL_HELP = "Ajuda" LABEL_CHECK_ALL = "Selecionar todas as mensagens" LABEL_ARCHIVE = "Arquivar" LABEL_DELETE = "Excluir" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Abrir conversa selecionada" LABEL_MOVE = "Mover" LABEL_READ = "Marcar mensagens selecionadas como lidas" LABEL_UNREAD = "Marcar mensagens selecionadas como não lidas" @@ -710,4 +710,4 @@ NO_COOKIE_DESC = "Os Cookies não estão disponíveis em seu navegador. Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente." BAD_BROWSER_TITLE = "Seu navegador está desatualizado." BAD_BROWSER_DESC = "Para usar todos os recursos do aplicativo, -baixe e instale um desses navegadores:" \ No newline at end of file +baixe e instale um desses navegadores:" From ce3144da0e881068db0b5cad06ad49ae931dc7cd Mon Sep 17 00:00:00 2001 From: ervee Date: Thu, 23 Apr 2015 09:13:44 +0200 Subject: [PATCH 012/106] Updated Dutch translation (#467) Two translations and some consistency corrections --- rainloop/v/0.0.0/langs/nl.ini | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index e572c84d4..c667b12e1 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -90,7 +90,7 @@ MENU_SELECT_UNFLAGGED = "Zonder Vlag" EMPTY_LIST = "Geen berichten" EMPTY_SEARCH_LIST = "Geen items gevonden" SEARCH_RESULT_FOR = "Zoekresultaten voor\"%SEARCH%\"" -BACK_TO_MESSAGE_LIST = "back to message list" +BACK_TO_MESSAGE_LIST = "terug naar berichtenlijst" LIST_LOADING = "Ophalen..." EMPTY_SUBJECT_TEXT = "(Geen onderwerp)" PUT_MESSAGE_HERE = "Sleep bericht hier om ze te bekijken in de lijst" @@ -596,7 +596,7 @@ DELETING_ASK = "Weet u het zeker?" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Hulp bij toetsenbord sneltoetsen" TAB_MAILBOX = "Mailbox" -TAB_MESSAGE_LIST = "Berichten lijst" +TAB_MESSAGE_LIST = "Berichtenlijst" TAB_MESSAGE_VIEW = "Bericht leesvenster" TAB_COMPOSE = "Opstellen" LABEL_OPEN_USER_DROPDOWN = "Open gebruikers menu" @@ -608,7 +608,7 @@ LABEL_HELP = "Help" LABEL_CHECK_ALL = "Selecteer alle berichten" LABEL_ARCHIVE = "Archiveren" LABEL_DELETE = "Verwijderen" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Open geselecteerde berichtenlijst"" LABEL_MOVE = "Verplaatsen" LABEL_READ = "Markeer geselecteerde berichten als gelezen" LABEL_UNREAD = "Markeer geselecteerde berichten als ongelezen" @@ -618,7 +618,7 @@ LABEL_CANCEL_SEARCH = "Zoekopdracht afbreken" LABEL_FULLSCREEN_ENTER = "Bericht in volledig scherm lezen (leesvenster ingeschakeld)" LABEL_VIEW_MESSAGE_ENTER = "Bericht lezen (leesvenster uitgeschakeld)" LABEL_SWITCH_TO_MESSAGE = "Schakel focus naar bericht" -LABEL_SWITCH_TO_FOLDER_LIST = "Schakel focus naar berichten lijst" +LABEL_SWITCH_TO_FOLDER_LIST = "Schakel focus naar berichtenlijst" LABEL_FULLSCREEN_TOGGLE = "Schakel tussen normaal en lezen in volledig scherm" LABEL_BLOCKQUOTES_TOGGLE = "Schakel blok citaten aan of uit" LABEL_THREAD_NEXT = "Volgende bericht in groep" @@ -626,7 +626,7 @@ LABEL_THREAD_PREV = "Vorige bericht in groep" LABEL_PRINT = "Afdrukken" LABEL_EXIT_FULLSCREEN = "Volledig scherm sluiten" LABEL_CLOSE_MESSAGE = "Bericht sluiten (leesvenster uitgeschakeld)" -LABEL_SWITCH_TO_LIST = "Schakel focus terug naar berichten lijst" +LABEL_SWITCH_TO_LIST = "Schakel focus terug naar berichtenlijst" LABEL_OPEN_COMPOSE_POPUP = "Open nieuw bericht venster" LABEL_OPEN_IDENTITIES_DROPDOWN = "Open identiteiten menu" LABEL_SAVE_MESSAGE = "Concept opslaan" @@ -664,7 +664,7 @@ NEW_PASSWORD_SHORT = "Wachtwoord is te kort" NEW_PASSWORD_WEAK = "Wachtwoord is te makkelijk" NEW_PASSWORD_FORBIDDENT = "Wachtwoord bevat verboden tekens" CONTACTS_SYNC_ERROR = "Contactpersonen synchronisatie fout" -CANT_GET_MESSAGE_LIST = "Berichten lijst kan niet worden opgehaald" +CANT_GET_MESSAGE_LIST = "Berichtenlijst kan niet worden opgehaald" CANT_GET_MESSAGE = "Bericht kan niet worden opgehaald" CANT_DELETE_MESSAGE = "Kan bericht niet verwijderen" CANT_MOVE_MESSAGE = "Kan bericht niet verplaatsen" @@ -710,4 +710,4 @@ NO_COOKIE_DESC = "Cookies ondersteuning is niet beschikbaar in uw browser. Gelieve Cookies in te schakelen en opnieuw te proberen." BAD_BROWSER_TITLE = "Uw browser is verouderd" BAD_BROWSER_DESC = "Om alle functies van deze applicatie te gebruiken, -download en installeer een van de volgende browsers:" \ No newline at end of file +download en installeer een van de volgende browsers:" From 6a7e13e6e48045a6ba171e395c3310f5314ee6e0 Mon Sep 17 00:00:00 2001 From: insertc0in Date: Fri, 24 Apr 2015 17:42:35 +0100 Subject: [PATCH 013/106] Update pt-pt.ini --- rainloop/v/0.0.0/langs/pt-pt.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index b813ece48..ac2bcc778 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -90,7 +90,7 @@ MENU_SELECT_UNFLAGGED = "Não sinalizada" EMPTY_LIST = "Lista vazia." EMPTY_SEARCH_LIST = "Nenhuma mensagem corresponde à sua pesquisa." SEARCH_RESULT_FOR = "Resultados de pesquisa para \"%SEARCH%\"" -BACK_TO_MESSAGE_LIST = "back to message list" +BACK_TO_MESSAGE_LIST = "voltar à lista de mensagens" LIST_LOADING = "A carregar" EMPTY_SUBJECT_TEXT = "(Sem assunto)" PUT_MESSAGE_HERE = "Coloque a mensagem aqui para vê-la na lista" @@ -608,7 +608,7 @@ LABEL_HELP = "Ajuda" LABEL_CHECK_ALL = "Selecionar todas as mensagens" LABEL_ARCHIVE = "Arquivar" LABEL_DELETE = "Eliminar" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Abrir tópico selecionado" LABEL_MOVE = "Mover" LABEL_READ = "Ler as mensagens selecionadas" LABEL_UNREAD = "Marcar as mensagens selecionadas como não lidas" @@ -710,4 +710,4 @@ NO_COOKIE_DESC = "O suport de Cookies não está disponível no seu navegador. Por 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, -transfira e instale um destes navegadores:" \ No newline at end of file +transfira e instale um destes navegadores:" From f5f067f1f3a76639c7436b2ca3312fc59cd2c155 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 23 Apr 2015 01:33:02 +0400 Subject: [PATCH 014/106] Small fixes --- dev/Knoin/Knoin.js | 6 ++++-- dev/Screen/AbstractSettings.js | 1 + dev/Styles/MessageList.less | 21 ++++++++++++++----- dev/View/Popup/Languages.js | 15 ++++++------- dev/View/User/MailBox/MessageList.js | 12 ++++++++++- .../0.0.0/app/libraries/MailSo/Base/Http.php | 8 +++---- .../0.0.0/app/libraries/MailSo/Log/Driver.php | 17 +++++++++++++-- .../0.0.0/app/libraries/MailSo/Log/Logger.php | 15 +++++++++++++ .../0.0.0/app/libraries/RainLoop/Actions.php | 15 +++++++++---- .../libraries/RainLoop/Config/Application.php | 2 ++ .../templates/Views/User/MailMessageList.html | 2 +- 11 files changed, 88 insertions(+), 26 deletions(-) diff --git a/dev/Knoin/Knoin.js b/dev/Knoin/Knoin.js index c8052eda5..42744c49f 100644 --- a/dev/Knoin/Knoin.js +++ b/dev/Knoin/Knoin.js @@ -170,8 +170,6 @@ Globals.popupVisibilityNames.push(this.viewModelName); oViewModel.viewModelDom.css('z-index', 3000 + Globals.popupVisibilityNames().length + 10); -// Utils.delegateRun(this, 'onShow'); // moved to showScreenPopup function (for parameters) - if (this.onShowTrigger) { this.onShowTrigger(!this.onShowTrigger()); @@ -257,6 +255,8 @@ if (ViewModelClassToShow.__vm && ViewModelClassToShow.__dom) { + Utils.delegateRun(ViewModelClassToShow.__vm, 'onBeforeShow', aParameters || []); + ViewModelClassToShow.__vm.modalVisibility(true); Utils.delegateRun(ViewModelClassToShow.__vm, 'onShow', aParameters || []); @@ -383,6 +383,8 @@ if (ViewModelClass.__vm && ViewModelClass.__dom && 'Popups' !== ViewModelClass.__vm.viewModelPosition()) { + Utils.delegateRun(ViewModelClass.__vm, 'onBeforeShow'); + ViewModelClass.__dom.show(); ViewModelClass.__vm.viewModelVisibility(true); diff --git a/dev/Screen/AbstractSettings.js b/dev/Screen/AbstractSettings.js index 0727236f4..27d179cd2 100644 --- a/dev/Screen/AbstractSettings.js +++ b/dev/Screen/AbstractSettings.js @@ -131,6 +131,7 @@ // show if (self.oCurrentSubScreen) { + Utils.delegateRun(self.oCurrentSubScreen, 'onBeforeShow'); self.oCurrentSubScreen.viewModelDom.show(); Utils.delegateRun(self.oCurrentSubScreen, 'onShow'); Utils.delegateRun(self.oCurrentSubScreen, 'onShowWithDelay', [], 200); diff --git a/dev/Styles/MessageList.less b/dev/Styles/MessageList.less index 78eba39e2..29ad90ad7 100644 --- a/dev/Styles/MessageList.less +++ b/dev/Styles/MessageList.less @@ -180,10 +180,12 @@ html.rl-no-preview-pane { .listThreadUidDesc { font-size: 16px; - padding: 7px 20px 5px 20px; - background-color: #999; + padding: 7px 20px 6px 20px; + background-color: #aaa; + border-bottom: 1px solid #888; color: #fff; cursor: pointer; + text-shadow: 0 1px 0 #000; text-align: center; } @@ -410,16 +412,25 @@ html.rl-no-preview-pane { .threads-len { .threads-len-data { - background-color: #999; - color: #fff; + + background-color: #eee; + color: #666; border-radius: 6px; - padding: 1px 2px 1px 5px; + padding: 2px 0px 1px 6px; margin-right: 2px; + border: 1px solid #ccc; [class^="icon-"], [class*=" icon-"] { font-size: 14px; } + + &:hover { + background-color: #aaa; + border-color: #666; + text-shadow: 0 1px 0 #999; + color: #fff; + } } } diff --git a/dev/View/Popup/Languages.js b/dev/View/Popup/Languages.js index e82bc9cf8..870d8850e 100644 --- a/dev/View/Popup/Languages.js +++ b/dev/View/Popup/Languages.js @@ -64,6 +64,14 @@ }); }; + LanguagesPopupView.prototype.onBeforeShow = function () + { + this.fLang = null; + this.userLanguage(''); + + this.langs([]); + }; + LanguagesPopupView.prototype.onShow = function (fLanguage, aLangs, sUserLanguage) { this.fLang = fLanguage; @@ -72,13 +80,6 @@ this.langs(aLangs); }; - LanguagesPopupView.prototype.onHide = function () - { - this.fLang = null; - this.userLanguage(''); - this.langs([]); - }; - LanguagesPopupView.prototype.changeLanguage = function (sLang) { if (this.fLang) diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 373e5dc27..c61332277 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -630,7 +630,7 @@ MessageListMailBoxUserView.prototype.gotoThread = function (oMessage) { - if (oMessage) + if (oMessage && 0 < oMessage.threadsLen()) { MessageStore.messageListPageBeforeThread(MessageStore.messageListPage()); @@ -643,6 +643,13 @@ } }; + MessageListMailBoxUserView.prototype.clearListIsVisible = function () + { + return '' === this.messageListSearchDesc() && '' === this.messageListError() && + '' === MessageStore.messageListEndThreadUid() && + 0 < this.messageList().length && (this.isSpamFolder() || this.isTrashFolder()); + }; + MessageListMailBoxUserView.prototype.onBuild = function (oDom) { var self = this; @@ -671,6 +678,9 @@ .on('click', '.messageList .messageListItem .threads-len', function () { self.gotoThread(ko.dataFor(this)); }) + .on('dblclick', '.messageList .messageListItem .actionHandle', function () { + self.gotoThread(ko.dataFor(this)); + }) ; this.initUploaderForAppend(); diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php index 4294908da..09552ef02 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php @@ -679,10 +679,10 @@ class Http { if ($bSetCacheHeader) { - \header('Cache-Control: public', true); - \header('Pragma: public', true); - \header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iUtcTimeStamp - $iExpireTime).' UTC', true); - \header('Expires: '.\gmdate('D, j M Y H:i:s', $iUtcTimeStamp + $iExpireTime).' UTC', true); + @\header('Cache-Control: public', true); + @\header('Pragma: public', true); + @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iUtcTimeStamp - $iExpireTime).' UTC', true); + @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iUtcTimeStamp + $iExpireTime).' UTC', true); if (0 < strlen($sEtag)) { diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php index 60a8d0021..0ac538b24 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php @@ -83,6 +83,8 @@ abstract class Driver $this->bTypedPrefix = true; $this->bGuidPrefix = true; + $this->iTimeOffset = 0; + $this->iWriteOnTimeoutOnly = 0; $this->bWriteOnErrorOnly = false; $this->bWriteOnPhpErrorOnly = false; @@ -106,6 +108,17 @@ abstract class Driver ); } + /** + * @param int $iTimeOffset + * + * @return \MailSo\Log\Driver + */ + public function SetTimeOffset($iTimeOffset) + { + $this->iTimeOffset = $iTimeOffset; + return $this; + } + /** * @return \MailSo\Log\Driver */ @@ -217,7 +230,7 @@ abstract class Driver protected function getTimeWithMicroSec() { $aMicroTimeItems = \explode(' ', \microtime()); - return \gmdate($this->sDatePattern, $aMicroTimeItems[1]).'.'. + return \MailSo\Log\Logger::DateHelper($this->sDatePattern, $this->iTimeOffset, $aMicroTimeItems[1]).'.'. \str_pad((int) ($aMicroTimeItems[0] * 1000), 3, '0', STR_PAD_LEFT); } @@ -247,7 +260,7 @@ abstract class Driver if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) { $bErrorPhp = false; - + $bError = $this->bWriteOnErrorOnly && \in_array($iType, array( \MailSo\Log\Enumerations\Type::NOTICE, \MailSo\Log\Enumerations\Type::NOTICE_PHP, diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php index 3d513f170..e5a0a37f4 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php @@ -91,6 +91,21 @@ class Logger extends \MailSo\Base\Collection return $oInstance; } + /** + * @param string $sFormat + * @param int $iTimeOffset = 0 + * @param int $iTimestamp = 0 + * + * @return string + */ + public static function DateHelper($sFormat, $iTimeOffset = 0, $iTimestamp = null) + { + $iTimestamp = null === $iTimestamp ? \time() : (int) $iTimestamp; + $iTimeOffset = (int) $iTimeOffset; + + return \gmdate($sFormat, $iTimestamp + $iTimeOffset * 3600); + } + /** * @return bool */ diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 8183a243b..d81d553ff 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -407,8 +407,9 @@ class Actions { if (false !== \strpos($sLine, '{date:')) { - $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) { - return \gmdate($aMatch[1]); + $iTimeOffset = (int) $this->Config()->Get('logs', 'time_offset', 0); + $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) use ($iTimeOffset) { + return \MailSo\Log\Logger::DateHelper($aMatch[1], $iTimeOffset); }, $sLine); $sLine = \preg_replace('/\{date:([^}]*)\}/', 'date', $sLine); @@ -939,6 +940,8 @@ class Actions if (!!$this->Config()->Get('logs', 'enable', false)) { + $iTimeOffset = (int) $this->Config()->Get('logs', 'time_offset', 0); + $this->oLogger->SetShowSecter(!$this->Config()->Get('logs', 'hide_passwords', true)); $sLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName( @@ -956,6 +959,7 @@ class Actions ->WriteOnErrorOnly($this->Config()->Get('logs', 'write_on_error_only', false)) ->WriteOnPhpErrorOnly($this->Config()->Get('logs', 'write_on_php_error_only', false)) ->WriteOnTimeoutOnly($this->Config()->Get('logs', 'write_on_timeout_only', 0)) + ->SetTimeOffset($iTimeOffset) ); if (!$this->Config()->Get('debug', 'enable', false)) @@ -967,7 +971,10 @@ class Actions $oHttp = $this->Http(); - $this->oLogger->Write('[DATE:'.\gmdate('d.m.y').'][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. + $this->oLogger->Write('[DATE:'.\MailSo\Log\Logger::DateHelper('d.m.y', $iTimeOffset). + (0 !== $iTimeOffset ? '][OFFSET:'.(0 < $iTimeOffset ? '+' : '-'). + \str_pad((string) \abs($iTimeOffset), 2, '0', STR_PAD_LEFT) : ''). + '][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. $oHttp->GetClientIp($this->Config()->Get('labs', 'http_client_ip_check_proxy', false)).'][PID:'. (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? \getmypid() : 'unknown').']['. $oHttp->GetServer('SERVER_SOFTWARE', '~').']['. @@ -5462,7 +5469,7 @@ class Actions */ public function DoMessageList() { - \sleep(1); +// \sleep(1); // throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); $sFolder = ''; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 8dcb131ce..929350892 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -186,6 +186,8 @@ Values: 'hide_passwords' => array(true, 'Required for development purposes only. Disabling this option is not recommended.'), + 'time_offset' => array(0), + 'filename' => array('log-{date:Y-m-d}.txt', 'Log filename. For security reasons, some characters are removed from filename. diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html index 6c96d5104..ebe1fbaa1 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageList.html @@ -151,7 +151,7 @@   
-
+
From 48b91fb957c590597ecab3be030f80a0f8cccde3 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Sat, 25 Apr 2015 02:15:11 +0400 Subject: [PATCH 015/106] Save attachments as ... --- build/test.php | 19 + dev/Common/Links.js | 35 +- dev/Promises/User/Ajax.js | 2 +- dev/Stores/User/App.js | 6 + dev/Styles/MessageView.less | 8 + dev/View/Popup/Compose.js | 2 +- dev/View/User/MailBox/MessageView.js | 166 +++++++- package.json | 4 +- .../MailSo/Base/Enumerations/Charset.php | 1 + .../0.0.0/app/libraries/MailSo/Base/Http.php | 6 + .../0.0.0/app/libraries/MailSo/Base/Utils.php | 50 +++ .../0.0.0/app/libraries/RainLoop/Actions.php | 353 ++++++++++++++++-- .../libraries/RainLoop/Config/Application.php | 4 +- .../app/libraries/RainLoop/Model/Account.php | 2 +- .../libraries/RainLoop/Providers/Files.php | 11 + .../RainLoop/Providers/Files/FileStorage.php | 27 +- .../RainLoop/Providers/Files/IFiles.php | 8 + .../Suggestions/OwnCloudSuggestions.php | 5 +- .../v/0.0.0/app/libraries/RainLoop/Utils.php | 7 + .../templates/Views/User/MailMessageView.html | 47 ++- 20 files changed, 687 insertions(+), 76 deletions(-) create mode 100644 build/test.php diff --git a/build/test.php b/build/test.php new file mode 100644 index 000000000..e5e1422dd --- /dev/null +++ b/build/test.php @@ -0,0 +1,19 @@ + $sUrl, CURLOPT_HEADER => false, diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 669f24dae..46e118c27 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -235,6 +235,56 @@ END; return $sCharset; } + /** + * @param string $sFilePath + * @param function $fFileExistsCallback = null + * + * @return string + */ + public static function SmartFileExists($sFilePath, $fFileExistsCallback = null) + { + $sFilePath = \str_replace('\\', '/', \trim($sFilePath)); + if (!$fFileExistsCallback) + { + $fFileExistsCallback = function ($sPath) { + return \file_exists($sPath); + }; + } + + if (!\call_user_func($fFileExistsCallback, $sFilePath)) + { + return $sFilePath; + } + + $aFileInfo = \pathinfo($sFilePath); + + $iIndex = 0; + + do + { + $iIndex++; + + $sFilePathNew = $aFileInfo['dirname'].'/'. + \preg_replace('/\(\d{1,2}\)$/', '', $aFileInfo['filename']). + ' ('.$iIndex.')'. + (empty($aFileInfo['extension']) ? '' : '.'.$aFileInfo['extension']) + ; + + if (!\call_user_func($fFileExistsCallback, $sFilePathNew)) + { + $sFilePath = $sFilePathNew; + break; + } + else if (10 < $iIndex) + { + break; + } + } + while (true); + + return $sFilePath; + } + /** * @return bool */ diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index d81d553ff..bd3962b36 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1322,12 +1322,34 @@ class Actions 'AllowAppendMessage' => (bool) $oConfig->Get('labs', 'allow_message_append', false), 'MaterialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), 'PremType' => $this->PremType(), - 'ZipSupported' => !!\class_exists('ZipArchive'), 'Admin' => array(), 'Capa' => array(), + 'AttahcmentsActions' => array(), 'Plugins' => array() ); + if ($oConfig->Get('capa', 'attachments_actions', false)) + { + if (!!\class_exists('ZipArchive')) + { + $aResult['AttahcmentsActions'][] = 'zip'; + } + + if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('\\OCP\\Files')) + { + $aResult['AttahcmentsActions'][] = 'owncloud'; + } + + if ($oConfig->Get('social', 'dropbox_enable', false) && 0 < \strlen(\trim($oConfig->Get('social', 'dropbox_api_key', '')))) + { + $aResult['AttahcmentsActions'][] = 'dropbox'; + } + } + + $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); + $aResult['DropboxApiKey'] = \trim($oConfig->Get('social', 'dropbox_api_key', '')); + + if ($aResult['UseRsaEncryption'] && \file_exists(APP_PRIVATE_DATA.'rsa/public') && \file_exists(APP_PRIVATE_DATA.'rsa/private')) { @@ -1763,14 +1785,30 @@ class Actions return \preg_replace('/[^a-zA-Z0-9]+/', '-', $this->getUserLanguageFromHeader()); } + /** + * @param int $iWait = 1 + * @param int $iDelay = 1 + */ + private function requestSleep($iWait = 1, $iDelay = 1) + { + if (0 < $iDelay && 0 < $iWait) + { + if ($iWait > \time() - APP_START_TIME) + { + \sleep($iDelay); + } + } + } + private function loginErrorDelay() { $iDelay = (int) $this->Config()->Get('labs', 'login_fault_delay', 0); if (0 < $iDelay) { - \sleep($iDelay); + $this->requestSleep(1, $iDelay); } } + /** * @param \RainLoop\Model\Account $oAccount */ @@ -2645,8 +2683,200 @@ class Actions */ public function DoAttachmentsActions() { - \sleep(1); - return $this->TrueResponse(__FUNCTION__); + if (!$this->Config()->Get('capa', 'attachments_actions', false)) + { + return $this->FalseResponse(__FUNCTION__); + } + + $oAccount = $this->initMailClientConnection(); + + $sAction = $this->GetActionParam('Do', ''); + $aHashes = $this->GetActionParam('Hashes', null); + + $mResult = false; + $bError = false; + $aData = false; + + if (\is_array($aHashes) && 0 < \count($aHashes)) + { + $aData = array(); + foreach ($aHashes as $sZipHash) + { + $aResult = $this->getMimeFileByHash($oAccount, $sZipHash); + if (\is_array($aResult) && !empty($aResult['FileHash'])) + { + $aData[] = $aResult; + } + else + { + $bError = true; + break; + } + } + } + + $oFilesProvider = $this->FilesProvider(); + if (!empty($sAction) && !$bError && \is_array($aData) && 0 < \count($aData) && + $oFilesProvider && $oFilesProvider->IsActive()) + { + + $bError = false; + switch (\strtolower($sAction)) + { + case 'zip': + + if (\class_exists('ZipArchive')) + { + $sZipHash = \MailSo\Base\Utils::Md5Rand(); + $sZipFileName = $oFilesProvider->GenerateLocalFullFileName($oAccount, $sZipHash); + + if (!empty($sZipFileName)) + { + $oZip = new \ZipArchive(); + $oZip->open($sZipFileName, \ZIPARCHIVE::OVERWRITE); + $oZip->setArchiveComment('RainLoop/'.APP_VERSION); + + foreach ($aData as $aItem) + { + $sFileName = (string) (isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'); + $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); + + if (!empty($sFileHash)) + { + $sFullFileNameHash = $oFilesProvider->GetFileName($oAccount, $sFileHash); + if (!$oZip->addFile($sFullFileNameHash, $sFileName)) + { + $bError = true; + } + } + } + + if (!$bError) + { + $bError = !$oZip->close(); + } + else + { + $oZip->close(); + } + } + + foreach ($aData as $aItem) + { + $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); + if (!empty($sFileHash)) + { + $oFilesProvider->Clear($oAccount, $sFileHash); + } + } + + if (!$bError) + { + $mResult = array( + 'Files' => array(array( + 'FileName' => 'attachments.zip', + 'Hash' => \RainLoop\Utils::EncodeKeyValues(array( + 'V' => APP_VERSION, + 'Account' => $oAccount ? \md5($oAccount->Hash()) : '', + 'FileName' => 'attachments.zip', + 'MimeType' => 'application/zip', + 'FileHash' => $sZipHash + )) + )) + ); + } + } + break; + + case 'owncloud': + + $mResult = false; + + if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('\\OCP\\Files')) + { + $sSaveFolder = $this->Config()->Get('labs', 'owncloud_save_folder', ''); + if (!empty($sSaveFolder)) + { + $sSaveFolder = 'Attachments'; + } + + $oFiles = \OCP\Files::getStorage('files'); + + if ($oFilesProvider && $oFiles && $oFilesProvider->IsActive() && + \method_exists($oFiles, 'file_put_contents')) + { + if (!$oFiles->is_dir($sSaveFolder)) + { + $oFiles->mkdir($sSaveFolder); + } + + $mResult = true; + foreach ($aData as $aItem) + { + $sSavedFileName = isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'; + $sSavedFileHash = !empty($aItem['FileHash']) ? $aItem['FileHash'] : ''; + + if (!empty($sSavedFileHash)) + { + $fFile = $oFilesProvider->GetFile($oAccount, $sSavedFileHash, 'rb'); + if (\is_resource($fFile)) + { + $sSavedFileNameFull = \MailSo\Base\Utils::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, function ($sPath) use ($oFiles) { + return $oFiles->file_exists($sPath); + }); + + if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) + { + $mResult = false; + } + + if (\is_resource($fFile)) + { + @\fclose($fFile); + } + } + } + } + } + } + + foreach ($aData as $aItem) + { + $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); + if (!empty($sFileHash)) + { + $oFilesProvider->Clear($oAccount, $sFileHash); + } + } + + break; + + case 'dropbox': + + $mResult = array( + 'ShortLife' => '_'.$this->GetShortLifeSpecAuthToken(), + 'Url' => \preg_replace('/\?(.*)$/', '', $this->Http()->GetFullUrl()), + 'Files' => array() + ); + + foreach ($aData as $aItem) + { + $mResult['Files'][] = array( + 'FileName' => isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat', + 'Hash' => \RainLoop\Utils::EncodeKeyValues($aItem) + ); + } + + break; + } + } + else + { + $bError = true; + } + + $this->requestSleep(); + return $this->DefaultResponse(__FUNCTION__, $bError ? false : $mResult); } /** @@ -3550,7 +3780,6 @@ class Actions */ public function DoAdminLicensing() { - $iStart = \time(); $this->IsAdminLoggined(); $bForce = '1' === (string) $this->GetActionParam('Force', '0'); @@ -3562,10 +3791,7 @@ class Actions { $sValue = $this->licenseHelper($bForce); - if ($iStart === \time()) - { - \sleep(1); - } + $this->requestSleep(); $iExpired = 0; if ($this->licenseParser($sValue, $iExpired)) @@ -3602,7 +3828,6 @@ class Actions */ public function DoAdminLicensingActivate() { - $iStart = \time(); $this->IsAdminLoggined(); $sDomain = (string) $this->GetActionParam('Domain', ''); @@ -3618,7 +3843,6 @@ class Actions $oHttp = \MailSo\Base\Http::SingletonInstance(); - \sleep(1); $sValue = $oHttp->GetUrlAsString(APP_API_PATH.'activate/'.\urlencode($sDomain).'/'.\urlencode($sKey), 'RainLoop/'.APP_VERSION, $sContentType, $iCode, $this->Logger(), 10, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''), @@ -3630,10 +3854,7 @@ class Actions $sValue = ''; } - if ($iStart + 2 > \time()) - { - \sleep(1); - } + $this->requestSleep(); $aMatch = array(); if ('OK' === $sValue) @@ -6522,7 +6743,8 @@ class Actions )) ); - \sleep(1); + $this->requestSleep(); + return $this->DefaultResponse(__FUNCTION__, $this->getTwoFactorInfo($oAccount)); } @@ -6606,7 +6828,8 @@ class Actions // $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode) // )); - \sleep(1); + $this->requestSleep(); + return $this->DefaultResponse(__FUNCTION__, $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode)); } @@ -7901,6 +8124,57 @@ class Actions } } + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sHash + * + * @return array + */ + private function getMimeFileByHash($oAccount, $sHash) + { + $aValues = $this->getDecodedRawKeyValue($sHash); + + $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; + $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; + $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; + + $sContentTypeIn = (string) isset($aValues['MimeType']) ? $aValues['MimeType'] : ''; + $sFileNameIn = (string) isset($aValues['FileName']) ? $aValues['FileName'] : ''; + + $oFileProvider = $this->FilesProvider(); + + $sResultHash = ''; + + $mResult = $this->MailClient()->MessageMimeStream(function($rResource, $sContentType, $sFileName, $sMimeIndex = '') + use ($oAccount, $oFileProvider, $sFileNameIn, $sContentTypeIn, &$sResultHash) { + + if ($oAccount && \is_resource($rResource)) + { + $sHash = \MailSo\Base\Utils::Md5Rand($sFileNameIn.'~'.$sContentTypeIn); + $rTempResource = $oFileProvider->GetFile($oAccount, $sHash, 'wb+'); + + if (@\is_resource($rTempResource)) + { + if (false !== \MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource))) + { + $sResultHash = $sHash; + } + + @\fclose($rTempResource); + } + } + + }, $sFolder, $iUid, true, $sMimeIndex); + + $aValues['FileHash'] = ''; + if ($mResult) + { + $aValues['FileHash'] = $sResultHash; + } + + return $aValues; + } + /** * @param bool $bDownload * @param bool $bThumbnail = false @@ -7913,15 +8187,50 @@ class Actions $aValues = $this->getDecodedRawKeyValue($sRawKey); $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; - $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; - $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; + $iUid = isset($aValues['Uid']) ? (int) $aValues['Uid'] : 0; + $sMimeIndex = isset($aValues['MimeIndex']) ? (string) $aValues['MimeIndex'] : ''; - $sContentTypeIn = (string) isset($aValues['MimeType']) ? $aValues['MimeType'] : ''; - $sFileNameIn = (string) isset($aValues['FileName']) ? $aValues['FileName'] : ''; + $sContentTypeIn = isset($aValues['MimeType']) ? (string) $aValues['MimeType'] : ''; + $sFileNameIn = isset($aValues['FileName']) ? (string) $aValues['FileName'] : ''; + $sFileHashIn = isset($aValues['FileHash']) ? (string) $aValues['FileHash'] : ''; - if (!empty($sFolder) && 0 < $iUid) + if (!empty($sFileHashIn)) { $this->verifyCacheByKey($sRawKey); + + $oAccount = $this->getAccountFromToken(); + + $sContentTypeOut = empty($sContentTypeIn) ? + \MailSo\Base\Utils::MimeContentType($sFileNameIn) : $sContentTypeIn; + + $sFileNameOut = $this->MainClearFileName($sFileNameIn, $sContentTypeIn, $sMimeIndex); + + $rResource = $this->FilesProvider()->GetFile($oAccount, $sFileHashIn); + if (\is_resource($rResource)) + { + $sFileNameOut = \MailSo\Base\Utils::ConvertEncoding( + $sFileNameOut, \MailSo\Base\Enumerations\Charset::UTF_8, + \MailSo\Base\Enumerations\Charset::CP858); + + \header('Content-Type: '.$sContentTypeOut); + \header('Content-Disposition: attachment; '. + \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); + + \header('Accept-Ranges: none', true); + \header('Content-Transfer-Encoding: binary'); + + \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); + return true; + } + + return false; + } + else + { + if (!empty($sFolder) && 0 < $iUid) + { + $this->verifyCacheByKey($sRawKey); + } } $oAccount = $this->initMailClientConnection(); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 929350892..644d251e9 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -133,7 +133,8 @@ class Application extends \RainLoop\Config\AbstractConfig 'capa' => array( 'filters' => array(true), - 'templates' => array(true) + 'templates' => array(true), + 'attachments_actions' => array(true) ), 'login' => array( @@ -302,6 +303,7 @@ Enables caching in the system'), 'smtp_show_server_errors' => array(false), 'sieve_allow_raw_script' => array(false), 'sieve_utf8_folder_name' => array(true), + 'owncloud_save_folder' => array('Attachments'), 'curl_proxy' => array(''), 'curl_proxy_auth' => array(''), 'in_iframe' => array(false), diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Model/Account.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Model/Account.php index 82c463685..8540ac8f8 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Model/Account.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Model/Account.php @@ -362,7 +362,7 @@ class Account extends \RainLoop\Account // for backward compatibility \RainLoop\Utils::GetShortToken(), // 7 $this->sProxyAuthUser, // 8 $this->sProxyAuthPassword, // 9 - 0 // 10 + 0 // 10 // timelife )); } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files.php index c3539b9c8..31d72a8c4 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files.php @@ -116,6 +116,17 @@ class Files extends \RainLoop\Providers\AbstractProvider $this->oDriver->CloseAllOpenedFiles() : false; } + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sKey + * + * @return string + */ + public function GenerateLocalFullFileName($oAccount, $sKey) + { + return $this->oDriver ? $this->oDriver->GenerateLocalFullFileName($oAccount, $sKey) : ''; + } + /** * @return bool */ diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FileStorage.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FileStorage.php index bc2591523..3ae703a8a 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FileStorage.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FileStorage.php @@ -25,6 +25,17 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles $this->sDataPath = \rtrim(\trim($sStoragePath), '\\/'); } + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sKey + * + * @return string + */ + public function GenerateLocalFullFileName($oAccount, $sKey) + { + return $this->generateFullFileName($oAccount, $sKey, true); + } + /** * @param \RainLoop\Model\Account $oAccount * @param string $sKey @@ -37,7 +48,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles $bResult = false; if ($rSource) { - $rOpenOutput = @\fopen($this->generateFileName($oAccount, $sKey, true), 'w+b'); + $rOpenOutput = @\fopen($this->generateFullFileName($oAccount, $sKey, true), 'w+b'); if ($rOpenOutput) { $bResult = (false !== \MailSo\Base\Utils::MultipleStreamWriter($rSource, array($rOpenOutput))); @@ -57,7 +68,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles public function MoveUploadedFile($oAccount, $sKey, $sSource) { return @\move_uploaded_file($sSource, - $this->generateFileName($oAccount, $sKey, true)); + $this->generateFullFileName($oAccount, $sKey, true)); } /** @@ -72,7 +83,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles $mResult = false; $bCreate = !!\preg_match('/[wac]/', $sOpenMode); - $sFileName = $this->generateFileName($oAccount, $sKey, $bCreate); + $sFileName = $this->generateFullFileName($oAccount, $sKey, $bCreate); if ($bCreate || \file_exists($sFileName)) { $mResult = @\fopen($sFileName, $sOpenMode); @@ -95,7 +106,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles public function GetFileName($oAccount, $sKey) { $mResult = false; - $sFileName = $this->generateFileName($oAccount, $sKey); + $sFileName = $this->generateFullFileName($oAccount, $sKey); if (\file_exists($sFileName)) { $mResult = $sFileName; @@ -113,7 +124,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles public function Clear($oAccount, $sKey) { $mResult = true; - $sFileName = $this->generateFileName($oAccount, $sKey); + $sFileName = $this->generateFullFileName($oAccount, $sKey); if (\file_exists($sFileName)) { if (isset($this->aResources[$sFileName]) && \is_resource($this->aResources[$sFileName])) @@ -136,7 +147,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles public function FileSize($oAccount, $sKey) { $mResult = false; - $sFileName = $this->generateFileName($oAccount, $sKey); + $sFileName = $this->generateFullFileName($oAccount, $sKey); if (\file_exists($sFileName)) { $mResult = \filesize($sFileName); @@ -153,7 +164,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles */ public function FileExists($oAccount, $sKey) { - return @\file_exists($this->generateFileName($oAccount, $sKey)); + return @\file_exists($this->generateFullFileName($oAccount, $sKey)); } /** @@ -198,7 +209,7 @@ class FileStorage implements \RainLoop\Providers\Files\IFiles * * @return string */ - private function generateFileName($oAccount, $sKey, $bMkDir = false) + private function generateFullFileName($oAccount, $sKey, $bMkDir = false) { $sEmail = $sSubEmail = ''; if ($oAccount instanceof \RainLoop\Model\Account) diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/IFiles.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/IFiles.php index cb7aaceae..c31e231be 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/IFiles.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/IFiles.php @@ -4,6 +4,14 @@ namespace RainLoop\Providers\Files; interface IFiles { + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sKey + * + * @return string + */ + public function GenerateLocalFullFileName($oAccount, $sKey); + /** * @param \RainLoop\Model\Account $oAccount * @param string $sKey diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php index d4a7aac97..a32e9e965 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php @@ -24,9 +24,8 @@ class OwnCloudSuggestions implements \RainLoop\Providers\Suggestions\ISuggestion try { - if ('' === $sQuery || !$oAccount || !\RainLoop\Utils::IsOwnCloud() || - !\class_exists('\\OCP\\Contacts') || !\OCP\Contacts::isEnabled() || - !\class_exists('\\OCP\\User') || !\OCP\User::isLoggedIn() + if ('' === $sQuery || !$oAccount || !\RainLoop\Utils::IsOwnCloudLoggedIn() || + !\class_exists('\\OCP\\Contacts') || !\OCP\Contacts::isEnabled() ) { return $aResult; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php index b85f33c99..029415ff5 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -315,6 +315,13 @@ class Utils return isset($_ENV['RAINLOOP_OWNCLOUD']) && $_ENV['RAINLOOP_OWNCLOUD'] && \class_exists('\\OC'); } + /** + * @return bool + */ + public static function IsOwnCloudLoggedIn() + { + return self::IsOwnCloud() && \class_exists('\\OCP\\User') && \OCP\User::isLoggedIn(); + } /** * @return string diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index a4310c4ac..c7079590f 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -319,7 +319,8 @@ autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" style="margin-bottom: 0" data-i18n="[placeholder]MESSAGE/PGP_PASSWORD_INPUT_PLACEHOLDER" data-bind="value: viewPgpPassword, onEnter: function() { decryptPgpEncryptedMessage(message()); }" />
-
+
  • @@ -371,27 +372,33 @@
    - + + + +    + Download as zip + -    - Download as zip + +      + + + +    + Save to ownCloud + -      - - - -    - Save to ownCloud - -      - - - -    - Save to Dropbox + +      + + + +    + Save to Dropbox +
    diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsGeneral.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsGeneral.html index 6af2aefee..0bae61a34 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsGeneral.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsGeneral.html @@ -12,7 +12,7 @@ - +   
    -    - +   +
    From 19f06c11d276c746245abb34908349b0079d6987 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Sun, 26 Apr 2015 02:01:56 +0400 Subject: [PATCH 017/106] Added new language strings --- build/langs.php | 2 +- dev/App/User.js | 13 +- dev/Model/Folder.js | 9 +- dev/Remote/User/Ajax.js | 13 + dev/Settings/User/Folders.js | 35 + dev/Stores/User/Folder.js | 12 +- dev/Styles/SettingsFolders.less | 6 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 90 +- .../templates/Views/User/MailMessageView.html | 12 +- .../Views/User/SettingsFolderItem.html | 12 +- .../templates/Views/User/SettingsFolders.html | 76 +- rainloop/v/0.0.0/langs/bg.ini | 8 +- rainloop/v/0.0.0/langs/cs.ini | 8 +- rainloop/v/0.0.0/langs/de.ini | 6 + rainloop/v/0.0.0/langs/en-gb.ini | 8 +- rainloop/v/0.0.0/langs/en.ini | 8 +- rainloop/v/0.0.0/langs/es.ini | 8 +- rainloop/v/0.0.0/langs/fr.ini | 8 +- rainloop/v/0.0.0/langs/hu.ini | 8 +- rainloop/v/0.0.0/langs/is.ini | 8 +- rainloop/v/0.0.0/langs/it.ini | 8 +- rainloop/v/0.0.0/langs/ja-jp.ini | 8 +- rainloop/v/0.0.0/langs/ko-kr.ini | 8 +- rainloop/v/0.0.0/langs/lt.ini | 6 + rainloop/v/0.0.0/langs/lv.ini | 8 +- rainloop/v/0.0.0/langs/nl.ini | 1154 +++++++++-------- rainloop/v/0.0.0/langs/no.ini | 8 +- rainloop/v/0.0.0/langs/pl.ini | 6 + rainloop/v/0.0.0/langs/pt-br.ini | 6 + rainloop/v/0.0.0/langs/pt-pt.ini | 6 + rainloop/v/0.0.0/langs/ro.ini | 8 +- rainloop/v/0.0.0/langs/ru.ini | 8 +- rainloop/v/0.0.0/langs/sk.ini | 8 +- rainloop/v/0.0.0/langs/sv.ini | 8 +- rainloop/v/0.0.0/langs/tr.ini | 8 +- rainloop/v/0.0.0/langs/ua.ini | 8 +- rainloop/v/0.0.0/langs/zh-cn.ini | 8 +- rainloop/v/0.0.0/langs/zh-tw.ini | 8 +- .../v/0.0.0/static/css/fonts/rainloop.eot | Bin 19444 -> 19656 bytes .../v/0.0.0/static/css/fonts/rainloop.svg | 1 + .../v/0.0.0/static/css/fonts/rainloop.ttf | Bin 19276 -> 19488 bytes .../v/0.0.0/static/css/fonts/rainloop.woff | Bin 13492 -> 13704 bytes vendors/fontastic/fonts/rainloop.eot | Bin 19444 -> 19656 bytes vendors/fontastic/fonts/rainloop.svg | 1 + vendors/fontastic/fonts/rainloop.ttf | Bin 19276 -> 19488 bytes vendors/fontastic/fonts/rainloop.woff | Bin 13492 -> 13704 bytes vendors/fontastic/icons-reference.html | 8 + vendors/fontastic/styles.css | 3 + 48 files changed, 996 insertions(+), 649 deletions(-) diff --git a/build/langs.php b/build/langs.php index 9d6248989..339c8bc88 100644 --- a/build/langs.php +++ b/build/langs.php @@ -48,7 +48,7 @@ function saveLangStructure($sLangFile, $aLang) } } - \file_put_contents(LANGS_PATH.'/'.$sLangFile, implode("\n", $aResultLines)); + \file_put_contents(LANGS_PATH.'/'.$sLangFile, implode("\n", $aResultLines)."\n"); } $sNL = "\n"; diff --git a/dev/App/User.js b/dev/App/User.js index 59fc7b98f..238016086 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -97,6 +97,12 @@ Events.pub('interval.20m'); }, 60000 * 15); + window.setTimeout(function () { + window.setInterval(function () { + Events.pub('interval.2m-after5m'); + }, 60000 * 2); + }, 60000 * 5); + window.setTimeout(function () { window.setInterval(function () { Events.pub('interval.5m-after5m'); @@ -763,7 +769,7 @@ var self = this, iUtc = Momentor.momentNowUnix(), - aFolders = FolderStore.getNextFolderNames(bBoot) + aFolders = FolderStore.getNextFolderNames() ; if (Utils.isNonEmptyArray(aFolders)) @@ -833,7 +839,8 @@ }); if (bBoot) - { _.delay(function () { + { + _.delay(function () { self.folderInformationMultiply(true); }, 2000); } @@ -1361,7 +1368,7 @@ } }); - Events.sub('interval.5m-after5m', function () { + Events.sub('interval.2m-after5m', function () { self.folderInformationMultiply(); }); diff --git a/dev/Model/Folder.js b/dev/Model/Folder.js index 668fec202..68a71214e 100644 --- a/dev/Model/Folder.js +++ b/dev/Model/Folder.js @@ -43,6 +43,7 @@ this.edited = ko.observable(false); this.collapsed = ko.observable(true); this.subScribed = ko.observable(true); + this.checkable = ko.observable(false); this.subFolders = ko.observableArray([]); this.deleteAccess = ko.observable(false); this.actionBlink = ko.observable(false).extend({'falseTimeout': 1000}); @@ -105,6 +106,7 @@ }, this); this.hidden = ko.computed(function () { + var bSystem = this.isSystemFolder(), bSubFolders = this.hasSubScribedSubfolders() @@ -182,6 +184,8 @@ return !this.isSystemFolder() && this.selectable && sInboxFolderName !== this.fullNameRaw; }, this); + this.canBeChecked = this.canBeSubScribed; + // this.visible.subscribe(function () { // Utils.timeOutAction('folder-list-folder-visibility-change', function () { // Globals.$win.trigger('folder-list-folder-visibility-change'); @@ -281,7 +285,8 @@ }); this.hasUnreadMessages = ko.computed(function () { - return 0 < this.messageCountUnread(); + return 0 < this.messageCountUnread() && + (this.isSystemFolder() || this.checkable()); }, this); this.hasSubScribedUnreadMessagesSubfolders = ko.computed(function () { @@ -352,6 +357,8 @@ this.existen = !!oJsonFolder.IsExists; this.subScribed(!!oJsonFolder.IsSubscribed); + this.checkable(!!oJsonFolder.Checkable); + this.type(sInboxFolderName === this.fullNameRaw ? Enums.FolderType.Inbox : Enums.FolderType.User); bResult = true; diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index 9aa3408f0..e5ae6c606 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -708,6 +708,19 @@ }); }; + /** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {boolean} bCheckable + */ + RemoteUserAjax.prototype.folderSetCheckable = function (fCallback, sFolderFullNameRaw, bCheckable) + { + this.defaultRequest(fCallback, 'FolderCheckable', { + 'Folder': sFolderFullNameRaw, + 'Checkable': bCheckable ? '1' : '0' + }); + }; + /** * @param {?Function} fCallback * @param {string} sFolder diff --git a/dev/Settings/User/Folders.js b/dev/Settings/User/Folders.js index c5812c9ed..7886eb87a 100644 --- a/dev/Settings/User/Folders.js +++ b/dev/Settings/User/Folders.js @@ -28,6 +28,8 @@ { this.folderList = FolderStore.folderList; + this.folderListHelp = ko.observable('').extend({'throttle': 100}); + this.loading = ko.computed(function () { var @@ -95,6 +97,25 @@ FolderStore.folderList.error(''); }; + FoldersUserSettings.prototype.onBuild = function (oDom) + { + var self = this; + oDom + .on('mouseover', '.delete-folder-parent', function () { + self.folderListHelp(Translator.i18n('SETTINGS_FOLDERS/HELP_DELETE_FOLDER')); + }) + .on('mouseover', '.subscribe-folder-parent', function () { + self.folderListHelp(Translator.i18n('SETTINGS_FOLDERS/HELP_SHOW_HIDE_FOLDER')); + }) + .on('mouseover', '.check-folder-parent', function () { + self.folderListHelp(Translator.i18n('SETTINGS_FOLDERS/HELP_SHOW_HIDE_FOLDER_COUNT')); + }) + .on('mouseout', '.subscribe-folder-parent, .check-folder-parent, .delete-folder-parent', function () { + self.folderListHelp(''); + }) + ; + }; + FoldersUserSettings.prototype.createFolder = function () { require('Knoin/Knoin').showScreenPopup(require('View/Popup/FolderCreate')); @@ -160,6 +181,20 @@ oFolder.subScribed(false); }; + FoldersUserSettings.prototype.checkableTrueFolder = function (oFolder) + { + Remote.folderSetCheckable(Utils.emptyFunction, oFolder.fullNameRaw, true); + + oFolder.checkable(true); + }; + + FoldersUserSettings.prototype.checkableFalseFolder = function (oFolder) + { + Remote.folderSetCheckable(Utils.emptyFunction, oFolder.fullNameRaw, false); + + oFolder.checkable(false); + }; + module.exports = FoldersUserSettings; }()); \ No newline at end of file diff --git a/dev/Stores/User/Folder.js b/dev/Stores/User/Folder.js index 8b04773fe..68b87d794 100644 --- a/dev/Stores/User/Folder.js +++ b/dev/Stores/User/Folder.js @@ -181,13 +181,10 @@ }; /** - * @param {boolean=} bBoot = false * @return {Array} */ - FolderUserStore.prototype.getNextFolderNames = function (bBoot) + FolderUserStore.prototype.getNextFolderNames = function () { - bBoot = Utils.isUnd(bBoot) ? false : !!bBoot; - var aResult = [], iLimit = 5, @@ -200,7 +197,8 @@ if (oFolder && sInboxFolderName !== oFolder.fullNameRaw && oFolder.selectable && oFolder.existen && iTimeout > oFolder.interval && - (!bBoot || oFolder.subScribed())) + (oFolder.isSystemFolder() || (oFolder.subScribed() && oFolder.checkable())) + ) { aTimeouts.push([oFolder.interval, oFolder.fullNameRaw]); } @@ -236,7 +234,9 @@ return iLimit <= aResult.length; }); - return _.uniq(aResult); + aResult = _.uniq(aResult); + + return aResult; }; module.exports = new FolderUserStore(); diff --git a/dev/Styles/SettingsFolders.less b/dev/Styles/SettingsFolders.less index 734f0e026..8f18ef151 100644 --- a/dev/Styles/SettingsFolders.less +++ b/dev/Styles/SettingsFolders.less @@ -86,7 +86,7 @@ } } - .delete-folder, .subscribe-folder, .unsubscribe-folder { + .delete-folder, .subscribe-folder, .unsubscribe-folder, .check-folder, .uncheck-folder { cursor: pointer; opacity: 0.6; } @@ -94,6 +94,10 @@ .unsubscribe-folder { opacity: 0.2; } + + .uncheck-folder { + opacity: 0.1; + } } .folder-padding.deep-1 { diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index bd3962b36..c86096688 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -5480,12 +5480,12 @@ class Actions { $this->initMailClientConnection(); - $sFolderNameInUtf = $this->GetActionParam('Folder', ''); + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); $bSubscribe = '1' === (string) $this->GetActionParam('Subscribe', '0'); try { - $this->MailClient()->FolderSubscribe($sFolderNameInUtf, !!$bSubscribe); + $this->MailClient()->FolderSubscribe($sFolderFullNameRaw, !!$bSubscribe); } catch (\Exception $oException) { @@ -5502,6 +5502,51 @@ class Actions return $this->TrueResponse(__FUNCTION__); } + /** + * @return array + */ + public function DoFolderCheckable() + { + $oAccount = $this->getAccountFromToken(); + + $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); + $bCheckable = '1' === (string) $this->GetActionParam('Checkable', '0'); + + $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + $sCheckableFolder = $oSettingsLocal->GetConf('CheckableFolder', '[]'); + $aCheckableFolder = @\json_decode($sCheckableFolder); + + if (!\is_array($aCheckableFolder)) + { + $aCheckableFolder = array(); + } + + if ($bCheckable) + { + $aCheckableFolder[] = $sFolderFullNameRaw; + } + else + { + $aCheckableFolderNew = array(); + foreach ($aCheckableFolder as $sFolder) + { + if ($sFolder !== $sFolderFullNameRaw) + { + $aCheckableFolderNew[] = $sFolder; + } + } + $aCheckableFolder = $aCheckableFolderNew; + } + + $aCheckableFolder = \array_unique($aCheckableFolder); + + $oSettingsLocal->SetConf('CheckableFolder', @\json_encode($aCheckableFolder)); + + return $this->DefaultResponse(__FUNCTION__, + $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); + } + /** * @return array * @@ -9306,17 +9351,49 @@ class Actions if (\is_object($mResponse)) { $bHook = true; + $self = $this; $sClassName = \get_class($mResponse); $bHasSimpleJsonFunc = \method_exists($mResponse, 'ToSimpleJSON'); $bThumb = $this->GetCapa(false, \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS); + $oAccountCache = null; + $fGetAccount = function () use ($self, &$oAccountCache) { + if (null === $oAccountCache) + { + $oAccount = $self->getAccountFromToken(false); + $oAccountCache = $oAccount; + } + + return $oAccountCache; + }; + + $aCheckableFoldersCache = null; + $fGetCheckableFolder = function () use ($self, &$aCheckableFoldersCache) { + if (null === $aCheckableFoldersCache) + { + $oAccount = $self->getAccountFromToken(false); + + $oSettingsLocal = $self->SettingsProvider(true)->Load($oAccount); + $sCheckable = $oSettingsLocal->GetConf('CheckableFolder', '[]'); + $aCheckable = @\json_decode($sCheckable); + if (!\is_array($aCheckable)) + { + $aCheckable = array(); + } + + $aCheckableFoldersCache = $aCheckable; + } + + return $aCheckableFoldersCache; + }; + if ($bHasSimpleJsonFunc) { $mResult = \array_merge($this->objectData($mResponse, $sParent, $aParameters), $mResponse->ToSimpleJSON(true)); } else if ('MailSo\Mail\Message' === $sClassName) { - $oAccount = $this->getAccountFromToken(false); + $oAccount = call_user_func($fGetAccount); $mResult = \array_merge($this->objectData($mResponse, $sParent, $aParameters), array( 'Folder' => $mResponse->Folder(), @@ -9591,6 +9668,12 @@ class Actions ); } + $aCheckableFolder = \call_user_func($fGetCheckableFolder); + if (!\is_array($aCheckableFolder)) + { + $aCheckableFolder = array(); + } + $mResult = \array_merge($this->objectData($mResponse, $sParent, $aParameters), array( 'Name' => $mResponse->Name(), 'FullName' => $mResponse->FullName(), @@ -9602,6 +9685,7 @@ class Actions 'IsExists' => $mResponse->IsExists(), 'IsSelectable' => $mResponse->IsSelectable(), 'Flags' => $mResponse->FlagsLowerCase(), + 'Checkable' => \in_array($mResponse->FullNameRaw(), $aCheckableFolder), 'Extended' => $aExtended, 'SubFolders' => $this->responseObject($mResponse->SubFolders(), $sParent, $aParameters) )); diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index c7079590f..b44732da8 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -377,7 +377,9 @@    - Download as zip + + + @@ -387,7 +389,9 @@    - Save to ownCloud + + + @@ -397,7 +401,9 @@    - Save to Dropbox + + + diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html index a82905374..a32889f01 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html @@ -12,12 +12,12 @@ - + - + @@ -25,5 +25,13 @@ + + + + + + + + \ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html index 5f0ca4ef5..e83c412aa 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html @@ -1,37 +1,45 @@ -
    -
    -
    - -     - +
    +
    +
    +
    + +     + +
    +
    + + +    + + +    + + +    + + +
    + +
    + +
    +
    + + +
    + + + + + + + + +
    +
    +
    +
    +
    - - -    - - -    - - -    - - -
    - -
    - -
    -
    - - -
    - - - - - - - -
    \ No newline at end of file diff --git a/rainloop/v/0.0.0/langs/bg.ini b/rainloop/v/0.0.0/langs/bg.ini index 36f55bc0e..722515d0b 100644 --- a/rainloop/v/0.0.0/langs/bg.ini +++ b/rainloop/v/0.0.0/langs/bg.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Изберете съобщение, за да го вид PGP_PASSWORD_INPUT_PLACEHOLDER = "Парола" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Обратна разписка (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renaming a folder" DELETING_ASK = "Are you sure?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Списък с акаунти" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Поддръжката на Бисквитки не е нал Моля, разрешете поддръжката на Бисквитки в настройките на вашия браузър и опитайте отново." BAD_BROWSER_TITLE = "Вашият браузър е остарял." BAD_BROWSER_DESC = "За да използвате всички функции на приложението, -изтеглете и инсталирайте един от тези браузъри:" \ No newline at end of file +изтеглете и инсталирайте един от тези браузъри:" diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index aeadb23c7..76b3bf98c 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Vyberte zprávu ze seznamu pro její zobrazení zde." PGP_PASSWORD_INPUT_PLACEHOLDER = "Heslo" PGP_SIGNED_MESSAGE_DESC = "Zpráva podepsaná OpenPGP (klikněte pro ověření)" PGP_ENCRYPTED_MESSAGE_DESC = "Zpráva šifrovaná OpenPGP (klikněte pro dešifraci)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Potvrzení o zobrazení zprávy - %SUBJECT%" @@ -551,6 +554,9 @@ RENAMING_PROCESS = "Přejmenovávam složku" DELETING_ASK = "Opravdu to chcete?" TO_MANY_FOLDERS_DESC_1 = "Máte moc složek!" TO_MANY_FOLDERS_DESC_2 = "Můžeme zobrazit jen část z nich, abychom zabránili problémům s výkonem." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Seznam účtů" @@ -709,4 +715,4 @@ NO_COOKIE_DESC = "Váš internetový prohlížeč nepodporuje Cookies. Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu." BAD_BROWSER_TITLE = "Používáte zastaralý internetový prohlížeč." BAD_BROWSER_DESC = "Abyste mohli využívat všchny funkcie této aplikace, -použijte některý z následujících internetových prohlížečů:" \ No newline at end of file +použijte některý z následujících internetových prohlížečů:" diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index 7aecc67c0..70d513d07 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Wählen Sie eine Nachricht aus der Liste aus, um sie anzuze PGP_PASSWORD_INPUT_PLACEHOLDER = "Passwort" PGP_SIGNED_MESSAGE_DESC = "OpenPGP-signierte Nachricht (klicken, um zu überprüfen)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP-verschlüsselte Nachricht (klicken, um zu entschlüsseln)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Empfangsbestätigung (angezeigt) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Ordner wird umbenannt" DELETING_ASK = "Sind Sie sicher?" TO_MANY_FOLDERS_DESC_1 = "Sie haben zu viele Ordner!" TO_MANY_FOLDERS_DESC_2 = "Aus Leistungsgründen zeigen wir nur einen Teil davon an." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Konten" diff --git a/rainloop/v/0.0.0/langs/en-gb.ini b/rainloop/v/0.0.0/langs/en-gb.ini index 0d4fb47b0..13a7691e2 100644 --- a/rainloop/v/0.0.0/langs/en-gb.ini +++ b/rainloop/v/0.0.0/langs/en-gb.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Select message in list to view it here." PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renaming a folder" DELETING_ASK = "Are you sure?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Accounts" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry." BAD_BROWSER_TITLE = "Your browser is outdated." BAD_BROWSER_DESC = "To use all the features of the application, -download and install one of these browsers:" \ No newline at end of file +download and install one of these browsers:" diff --git a/rainloop/v/0.0.0/langs/en.ini b/rainloop/v/0.0.0/langs/en.ini index 0d4fb47b0..13a7691e2 100644 --- a/rainloop/v/0.0.0/langs/en.ini +++ b/rainloop/v/0.0.0/langs/en.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Select message in list to view it here." PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renaming a folder" DELETING_ASK = "Are you sure?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Accounts" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry." BAD_BROWSER_TITLE = "Your browser is outdated." BAD_BROWSER_DESC = "To use all the features of the application, -download and install one of these browsers:" \ No newline at end of file +download and install one of these browsers:" diff --git a/rainloop/v/0.0.0/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini index ab7b06ed4..dfaef38c1 100644 --- a/rainloop/v/0.0.0/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Seleccione un mensaje en la lista para verlo aquí." PGP_PASSWORD_INPUT_PLACEHOLDER = "Contraseña" PGP_SIGNED_MESSAGE_DESC = "Mensaje firmado mediante OpenPGP (click para verificar)" PGP_ENCRYPTED_MESSAGE_DESC = "Mensaje cifrado mediante OpenPGP (click para desencriptar)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Acuse de recibo (se visualiza) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renombrando carpeta" DELETING_ASK = "¿Está usted seguro?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Lista de cuentas" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "El soporte de Cookies no esta disponible en su navegador. Por favor habilite los Cookie en la configuración de su navegador e inténtelo de nuevo." BAD_BROWSER_TITLE = "Su navegador no está actualizado." BAD_BROWSER_DESC = "Para usar todas las características de esta aplicación, -descargue e instale uno de estos navegadores:" \ No newline at end of file +descargue e instale uno de estos navegadores:" diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index 4a97dc03d..8ff9d6123 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Sélectionner un message dans la liste pour l'afficher ici. PGP_PASSWORD_INPUT_PLACEHOLDER = "Mot de passe" PGP_SIGNED_MESSAGE_DESC = "Message signé par OpenPGP (cliquer pour vérifier)" PGP_ENCRYPTED_MESSAGE_DESC = "Message chiffré par OpenPGP (cliquer pour déchiffrer)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Accusé de réception (affiché) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renommer un dossier" DELETING_ASK = "Êtes-vous sûr ?" TO_MANY_FOLDERS_DESC_1 = "Vous avez trop de dossiers !" TO_MANY_FOLDERS_DESC_2 = "Seulement une partie d'entre eux ont été affichés afin de limiter les problèmes de performance." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Liste des comptes" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Le support des cookies n'est pas disponible dans votre navigat S'il vous plaît activer le support des cookies dans les paramètres de votre navigateur et réessayez." BAD_BROWSER_TITLE = "Votre navigateur n'est pas à jour." BAD_BROWSER_DESC = "Pour utiliser toutes les fonctionnalités de l'application, -télécharger et installer l'un de ces navigateurs :" \ No newline at end of file +télécharger et installer l'un de ces navigateurs :" diff --git a/rainloop/v/0.0.0/langs/hu.ini b/rainloop/v/0.0.0/langs/hu.ini index f9c5df372..0782a5404 100644 --- a/rainloop/v/0.0.0/langs/hu.ini +++ b/rainloop/v/0.0.0/langs/hu.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Select message in list to view it here." PGP_PASSWORD_INPUT_PLACEHOLDER = "Jelszó" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renaming a folder" DELETING_ASK = "Biztosak vagyunk benne?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Fiók lista" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry." BAD_BROWSER_TITLE = "A böngésző elavult." BAD_BROWSER_DESC = "To use all the features of the application, -download and install one of these browsers:" \ No newline at end of file +download and install one of these browsers:" diff --git a/rainloop/v/0.0.0/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini index e3563ed4d..b427e163d 100644 --- a/rainloop/v/0.0.0/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Veldu bréf úr listanum til að skoða hér." PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Endurnefna möppu" DELETING_ASK = "Ertu viss?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Aðgangslisti" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Köku stuðningur er ekki til staðar í vafranum þínum. Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur." BAD_BROWSER_TITLE = "Vafrinn þinn er úreltur." BAD_BROWSER_DESC = "Til að geta notað alla valmöguleika í þessu forriti, -niðurhalaðu og settu upp einn af þessum vöfrum:" \ No newline at end of file +niðurhalaðu og settu upp einn af þessum vöfrum:" diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index 0c84b5aa5..fed36010d 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Seleziona un messaggio dalla lista per visualizzarlo qui" PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "Messaggio firmato con OpenPGP (clicca qui per verificarlo)" PGP_ENCRYPTED_MESSAGE_DESC = "Messaggio cifrato con OpenPGP (clicca qui per decifrarlo)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Avviso di lettura - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Rinomina cartella..." DELETING_ASK = "Sei sicuro?" TO_MANY_FOLDERS_DESC_1 = "Ci sono troppe cartelle!" TO_MANY_FOLDERS_DESC_2 = "Vengono visualizzate solo una parte per evitare problemi di performance." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Lista degli account" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Il supporto ai Cookie è disabilitato. Abilitare il supporto ai Cookie e riprovare." BAD_BROWSER_TITLE = "Il tuo browser è troppo vecchio" BAD_BROWSER_DESC = "Per usare tutte le funzionalità dell'applicazione, -scarica ed installa uno dei seguenti browser:" \ No newline at end of file +scarica ed installa uno dei seguenti browser:" diff --git a/rainloop/v/0.0.0/langs/ja-jp.ini b/rainloop/v/0.0.0/langs/ja-jp.ini index 6a0969fd1..cf78e315f 100644 --- a/rainloop/v/0.0.0/langs/ja-jp.ini +++ b/rainloop/v/0.0.0/langs/ja-jp.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "選択したメールがここに表示されます。" PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "開封確認メッセージ - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renaming a folder" DELETING_ASK = "Are you sure?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Account List" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry." BAD_BROWSER_TITLE = "Your browser is outdated." BAD_BROWSER_DESC = "To use all the features of the application, -download and install one of these browsers:" \ No newline at end of file +download and install one of these browsers:" diff --git a/rainloop/v/0.0.0/langs/ko-kr.ini b/rainloop/v/0.0.0/langs/ko-kr.ini index 3ca2a59ec..451615767 100644 --- a/rainloop/v/0.0.0/langs/ko-kr.ini +++ b/rainloop/v/0.0.0/langs/ko-kr.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "목록에서 선택한 메시지가 여기에 표시됩니 PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -549,6 +552,9 @@ RENAMING_PROCESS = "폴더명을 변경하고 있습니다." DELETING_ASK = "정말로 삭제하시겠습니까?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "계정 목록" @@ -704,4 +710,4 @@ NO_SCRIPT_DESC = "사용 중인 브라우저가 자바스크립트를 지원하 NO_COOKIE_TITLE = "이 어플리케이션을 사용하려면 쿠키 사용이 지원되야 합니다." NO_COOKIE_DESC = "사용 중인 브라우저가 쿠키를 지원하지 않습니다. 브라우저 설정을 확인하여 쿠키 사용을 활성화하고 다시 시도해주세요." BAD_BROWSER_TITLE = "사용 중인 브라우저가 구버전입니다." -BAD_BROWSER_DESC = "이 어플리케이션을 정상적으로 사용하시려면 아래의 브라우저들 중 하나를 설치해주세요:" \ No newline at end of file +BAD_BROWSER_DESC = "이 어플리케이션을 정상적으로 사용하시려면 아래의 브라우저들 중 하나를 설치해주세요:" diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index d24a39820..ebdc9c617 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Pasirinkite žinutę sąraše, kad matytumėte jos turinį PGP_PASSWORD_INPUT_PLACEHOLDER = "Slaptažodis" PGP_SIGNED_MESSAGE_DESC = "OpenPGP pasirašytas pranešimas (spustelkite patikrinimui)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP šifruotas pranešimas (spustelkite iššifravimui)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Pristatymo patvirtinimas (laiškas parodytas) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Pervardinamas katalogas" DELETING_ASK = "Ar Jūs įsitikinę?" TO_MANY_FOLDERS_DESC_1 = "Pas jus per daug katalogų!" TO_MANY_FOLDERS_DESC_2 = "Mes rodome ne visus juos, kad išvengti našumo problemų." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Paskyrų sąrašas" diff --git a/rainloop/v/0.0.0/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini index dec960ac4..9576571b8 100644 --- a/rainloop/v/0.0.0/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Izvēlaties ziņojumu no saraksta lai to apskatītu." PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Pārsaukt mapi" DELETING_ASK = "Tiešām?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Kontu saraksts" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Cookies atbalsts nav pieejams šai pārlūkprogrammai. Lūdzu ieslēdziet Cookies atbalstu." BAD_BROWSER_TITLE = "Jūsu pārlūkprogramma ir novecojusi." BAD_BROWSER_DESC = "Lai izmantotu pilnas šis aplikācijas iespējas, -lejupielādējat un uzinstalējas kādu no šīm pārlukprogrammām:" \ No newline at end of file +lejupielādējat un uzinstalējas kādu no šīm pārlukprogrammām:" diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index c667b12e1..13a7691e2 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -1,713 +1,719 @@ [LOGIN] -LABEL_EMAIL = "E-mail" -LABEL_LOGIN = "Inlognaam" -LABEL_PASSWORD = "Wachtwoord" -LABEL_SIGN_ME = "Aangemeld blijven" -LABEL_VERIFICATION_CODE = "Verificatie Code" -LABEL_DONT_ASK_VERIFICATION_CODE = "Vraag 2 weken niet naar code" -BUTTON_SIGN_IN = "Aanmelden" -TITLE_SIGN_IN_GOOGLE = "Aanmelden met Google" -TITLE_SIGN_IN_FACEBOOK = "Aanmelden met Facebook" -TITLE_SIGN_IN_TWITTER = "Aanmelden met Twitter" -LABEL_FORGOT_PASSWORD = "Wachtwoord vergeten" -LABEL_REGISTRATION = "Registratie" +LABEL_EMAIL = "Email" +LABEL_LOGIN = "Login" +LABEL_PASSWORD = "Password" +LABEL_SIGN_ME = "Remember Me" +LABEL_VERIFICATION_CODE = "Verification Code" +LABEL_DONT_ASK_VERIFICATION_CODE = "Don't ask for the code for 2 weeks" +BUTTON_SIGN_IN = "Sign In" +TITLE_SIGN_IN_GOOGLE = "Sign In using Google" +TITLE_SIGN_IN_FACEBOOK = "Sign In using Facebook" +TITLE_SIGN_IN_TWITTER = "Sign In using Twitter" +LABEL_FORGOT_PASSWORD = "Forgot password" +LABEL_REGISTRATION = "Registration" [TOP_TOOLBAR] -BUTTON_ADD_ACCOUNT = "Account toevoegen" -BUTTON_SETTINGS = "Instellingen" +BUTTON_ADD_ACCOUNT = "Add Account" +BUTTON_SETTINGS = "Settings" BUTTON_HELP = "Help" -BUTTON_LOGOUT = "Afmelden" +BUTTON_LOGOUT = "Logout" [SEARCH] -MAIN_INPUT_PLACEHOLDER = "Zoeken" -TITLE_ADV = "Geavanceerd zoeken" -LABEL_ADV_FROM = "Van" -LABEL_ADV_TO = "Naar" -LABEL_ADV_SUBJECT = "Onderwerp" -LABEL_ADV_TEXT = "Tekst" -LABEL_ADV_HAS_ATTACHMENT = "Heeft bijlage" -LABEL_ADV_HAS_ATTACHMENTS = "Heeft bijlages" -LABEL_ADV_FLAGGED = "Gemarkeerd" -LABEL_ADV_UNSEEN = "Ongelezen" -LABEL_ADV_DATE = "Datum" -LABEL_ADV_DATE_ALL = "Alles" -LABEL_ADV_DATE_3_DAYS = "Tot 3 dagen oud" -LABEL_ADV_DATE_7_DAYS = "Tot 1 week oud" -LABEL_ADV_DATE_MONTH = "Tot 1 maand oud" -LABEL_ADV_DATE_3_MONTHS = "Tot 3 maanden oud" -LABEL_ADV_DATE_6_MONTHS = "Tot 6 maanden oud" -LABEL_ADV_DATE_YEAR = "Tot 1 jaar oud" -BUTTON_ADV_SEARCH = "Zoeken" +MAIN_INPUT_PLACEHOLDER = "Search" +TITLE_ADV = "Advanced Search" +LABEL_ADV_FROM = "From" +LABEL_ADV_TO = "To" +LABEL_ADV_SUBJECT = "Subject" +LABEL_ADV_TEXT = "Text" +LABEL_ADV_HAS_ATTACHMENT = "Has attachment" +LABEL_ADV_HAS_ATTACHMENTS = "Has attachments" +LABEL_ADV_FLAGGED = "Flagged" +LABEL_ADV_UNSEEN = "Unseen" +LABEL_ADV_DATE = "Date" +LABEL_ADV_DATE_ALL = "All" +LABEL_ADV_DATE_3_DAYS = "Up to 3 days old" +LABEL_ADV_DATE_7_DAYS = "Up to 1 week old" +LABEL_ADV_DATE_MONTH = "Up to 1 month old" +LABEL_ADV_DATE_3_MONTHS = "Up to 3 months old" +LABEL_ADV_DATE_6_MONTHS = "Up to 6 months old" +LABEL_ADV_DATE_YEAR = "Up to 1 year old" +BUTTON_ADV_SEARCH = "Search" [PREVIEW_POPUP] -FULLSCREEN = "Schakel volledig scherm in/uit" -ZOOM = "Zoom in/uit" -CLOSE = "Sluiten (Esc)" -LOADING = "Ophalen..." -GALLERY_PREV = "Vorige (Linker Pijl toets)" -GALLERY_NEXT = "Volgende (Rechter Pijl toets)" -GALLERY_COUNTER = "%curr% van %total%" -IMAGE_ERROR = "De afbeelding kan niet worden geladen" -AJAX_ERROR = "De inhoud kan niet worden geladen" +FULLSCREEN = "Toggle fullscreen" +ZOOM = "Zoom in/out" +CLOSE = "Close (Esc)" +LOADING = "Loading..." +GALLERY_PREV = "Previous (arrow left)" +GALLERY_NEXT = "Next (arrow right)" +GALLERY_COUNTER = "%curr% of %total%" +IMAGE_ERROR = "The image could not be loaded." +AJAX_ERROR = "The content could not be loaded." [FOLDER_LIST] -BUTTON_COMPOSE = "Nieuw bericht" -BUTTON_CONTACTS = "Contactpersonen" -INBOX_NAME = "Postvak IN" -SENT_NAME = "Verzonden items" -DRAFTS_NAME = "Concepten" -SPAM_NAME = "Ongewenste e-mail" -TRASH_NAME = "Verwijderde items" -ARCHIVE_NAME = "Archief" +BUTTON_COMPOSE = "Compose" +BUTTON_CONTACTS = "Contacts" +INBOX_NAME = "Inbox" +SENT_NAME = "Sent" +DRAFTS_NAME = "Drafts" +SPAM_NAME = "Spam" +TRASH_NAME = "Trash" +ARCHIVE_NAME = "Archive" [QUOTA] -TITLE = "Quota gebruik" +TITLE = "Quota usage" [MESSAGE_LIST] -BUTTON_RELOAD = "Berichten controleren" -BUTTON_MOVE_TO = "Verplaatsen" -BUTTON_DELETE = "Verwijderen" -BUTTON_ARCHIVE = "Archiveren" -BUTTON_SPAM = "Ongewenste e-mail" -BUTTON_NOT_SPAM = "Geen ongewenste e-mail" -BUTTON_EMPTY_FOLDER = "Map leegmaken" -BUTTON_MULTY_FORWARD = "Doorsturen als bijlage(n)" -BUTTON_DELETE_WITHOUT_MOVE = "Permanent verwijderen" -BUTTON_MORE = "Meer" -MENU_SET_SEEN = "Markeer als gelezen" -MENU_SET_ALL_SEEN = "Markeer alles als gelezen" -MENU_UNSET_SEEN = "Markeer als ongelezen" -MENU_SET_FLAG = "Vlag" -MENU_UNSET_FLAG = "Vlag verwijderen" -MENU_SELECT_ALL = "Alle" -MENU_SELECT_NONE = "Geen" -MENU_SELECT_INVERT = "Selectie omkeren" -MENU_SELECT_UNSEEN = "Ongelezen" -MENU_SELECT_SEEN = "Gelezen" -MENU_SELECT_FLAGGED = "Met Vlag" -MENU_SELECT_UNFLAGGED = "Zonder Vlag" -EMPTY_LIST = "Geen berichten" -EMPTY_SEARCH_LIST = "Geen items gevonden" -SEARCH_RESULT_FOR = "Zoekresultaten voor\"%SEARCH%\"" -BACK_TO_MESSAGE_LIST = "terug naar berichtenlijst" -LIST_LOADING = "Ophalen..." -EMPTY_SUBJECT_TEXT = "(Geen onderwerp)" -PUT_MESSAGE_HERE = "Sleep bericht hier om ze te bekijken in de lijst" -TODAY_AT = "vandaag om %TIME%" -YESTERDAY_AT = "gisteren om %TIME%" -SEARCH_PLACEHOLDER = "Zoeken" -NEW_MESSAGE_NOTIFICATION = "U heeft %COUNT% nieuwe berichten!" -QUOTA_SIZE = "U gebruikt %SIZE% (%PROC%%) van %LIMIT%" +BUTTON_RELOAD = "Reload Message List" +BUTTON_MOVE_TO = "Move To" +BUTTON_DELETE = "Delete" +BUTTON_ARCHIVE = "Archive" +BUTTON_SPAM = "Spam" +BUTTON_NOT_SPAM = "Not Spam" +BUTTON_EMPTY_FOLDER = "Clear Folder" +BUTTON_MULTY_FORWARD = "Forward as attachment(s)" +BUTTON_DELETE_WITHOUT_MOVE = "Delete permanently" +BUTTON_MORE = "More" +MENU_SET_SEEN = "Mark as read" +MENU_SET_ALL_SEEN = "Mark all as read" +MENU_UNSET_SEEN = "Mark as unread" +MENU_SET_FLAG = "Flag" +MENU_UNSET_FLAG = "Unflag" +MENU_SELECT_ALL = "All" +MENU_SELECT_NONE = "None" +MENU_SELECT_INVERT = "Invert" +MENU_SELECT_UNSEEN = "Unread" +MENU_SELECT_SEEN = "Read" +MENU_SELECT_FLAGGED = "Flagged" +MENU_SELECT_UNFLAGGED = "Unflagged" +EMPTY_LIST = "Empty list." +EMPTY_SEARCH_LIST = "No messages matched your search." +SEARCH_RESULT_FOR = "Search results for \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "back to message list" +LIST_LOADING = "Loading" +EMPTY_SUBJECT_TEXT = "(No subject)" +PUT_MESSAGE_HERE = "Drop message here to view it in the list" +TODAY_AT = "today at %TIME%" +YESTERDAY_AT = "yesterday at %TIME%" +SEARCH_PLACEHOLDER = "Search" +NEW_MESSAGE_NOTIFICATION = "You have %COUNT% new messages!" +QUOTA_SIZE = "Using %SIZE% (%PROC%%) of your %LIMIT%" [MESSAGE] -BUTTON_EDIT = "Aanpassen" -BUTTON_BACK = "Terug" -BUTTON_CLOSE = "Sluiten" -BUTTON_DELETE = "Verwijderen" -BUTTON_ARCHIVE = "Archiveren" -BUTTON_SPAM = "Ongewenste e-mail" -BUTTON_NOT_SPAM = "Geen ongewenste e-mail" -BUTTON_MOVE_TO = "Verplaatsen" -BUTTON_MORE = "Meer" -BUTTON_REPLY = "Beantwoorden" -BUTTON_REPLY_ALL = "Allen beantwoorden" -BUTTON_FORWARD = "Doorsturen" -BUTTON_FORWARD_AS_ATTACHMENT = "Doorsturen als bijlage" -BUTTON_EDIT_AS_NEW = "Bewerken om opnieuw te verzenden" -BUTTON_SHOW_IMAGES = "Toon afbeeldingen" -BUTTON_NOTIFY_READ_RECEIPT = "De afzender heeft om een leesbevestiging gevraagd" -BUTTON_IN_NEW_WINDOW = "Toon in nieuw venster" -BUTTON_THREAD_LIST = "Groep lijst" -BUTTON_THREAD_PREV = "Vorige" -BUTTON_THREAD_NEXT = "Volgende" -BUTTON_THREAD_MORE = "Meer berichten" -MENU_HEADERS = "Toon berichtkoppen" -MENU_VIEW_ORIGINAL = "Toon origineel" -MENU_DOWNLOAD_ORIGINAL = "Download als .eml bestand" -MENU_FILTER_SIMILAR = "Filter gelijksoortige berichten" -MENU_PRINT = "Afdrukken" -EMPTY_SUBJECT_TEXT = "(Geen onderwerp)" -LABEL_SUBJECT = "Onderwerp" -LABEL_DATE = "Datum" -LABEL_FROM = "Van" -LABEL_FROM_SHORT = "van" -LABEL_TO = "Naar" -LABEL_TO_SHORT = "naar" +BUTTON_EDIT = "Edit" +BUTTON_BACK = "Back" +BUTTON_CLOSE = "Close" +BUTTON_DELETE = "Delete" +BUTTON_ARCHIVE = "Archive" +BUTTON_SPAM = "Spam" +BUTTON_NOT_SPAM = "Not Spam" +BUTTON_MOVE_TO = "Move To" +BUTTON_MORE = "More" +BUTTON_REPLY = "Reply" +BUTTON_REPLY_ALL = "Reply All" +BUTTON_FORWARD = "Forward" +BUTTON_FORWARD_AS_ATTACHMENT = "Forward as attachment" +BUTTON_EDIT_AS_NEW = "Edit as New" +BUTTON_SHOW_IMAGES = "Display external images" +BUTTON_NOTIFY_READ_RECEIPT = "The sender has asked to be notified when you read this message." +BUTTON_IN_NEW_WINDOW = "View in separate window" +BUTTON_THREAD_LIST = "Thread list" +BUTTON_THREAD_PREV = "Previous" +BUTTON_THREAD_NEXT = "Next" +BUTTON_THREAD_MORE = "More messages" +MENU_HEADERS = "Show message headers" +MENU_VIEW_ORIGINAL = "Show Source" +MENU_DOWNLOAD_ORIGINAL = "Download as .eml file" +MENU_FILTER_SIMILAR = "Filter messages like this" +MENU_PRINT = "Print" +EMPTY_SUBJECT_TEXT = "(No subject)" +LABEL_SUBJECT = "Subject" +LABEL_DATE = "Date" +LABEL_FROM = "From" +LABEL_FROM_SHORT = "from" +LABEL_TO = "To" +LABEL_TO_SHORT = "to" LABEL_CC = "CC" LABEL_BCC = "BCC" LABEL_REPLY_TO = "Reply-To" -PRINT_LABEL_FROM = "Van" -PRINT_LABEL_TO = "Naar" +PRINT_LABEL_FROM = "From" +PRINT_LABEL_TO = "To" PRINT_LABEL_CC = "CC" PRINT_LABEL_BCC = "BCC" PRINT_LABEL_REPLY_TO = "Reply-To" -PRINT_LABEL_DATE = "Datum" -PRINT_LABEL_SUBJECT = "Onderwerp" -PRINT_LABEL_ATTACHMENTS = "Bijlagen" -MESSAGE_LOADING = "Bericht ophalen" -MESSAGE_VIEW_DESC = "Selecteer een bericht in de lijst om hier te bekijken" -PGP_PASSWORD_INPUT_PLACEHOLDER = "Wachtwoord" -PGP_SIGNED_MESSAGE_DESC = "OpenPGP ondertekend bericht (klik om te verifiëren)" -PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP versleuteld bericht (klik om te ontsleutelen)" +PRINT_LABEL_DATE = "Date" +PRINT_LABEL_SUBJECT = "Subject" +PRINT_LABEL_ATTACHMENTS = "Attachments" +MESSAGE_LOADING = "Loading" +MESSAGE_VIEW_DESC = "Select message in list to view it here." +PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" +PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" +PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] -SUBJECT = "Ontvangstbevestiging (weergegeven) - %SUBJECT%" -BODY = "Dit is een bevestiging dat uw bericht aan %READ-RECEIPT% is ontvangen. +SUBJECT = "Return Receipt (displayed) - %SUBJECT%" +BODY = "This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. -Let op: Deze ontvangstbevestiging bevestigd slechts dat uw bericht was weergegeven op het scherm van de ontvanger. -Er is geen enkele garantie dat uw bericht is gelezen of begrepen." +Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. +There is no guarantee that the recipient has read or understood the message contents." [SUGGESTIONS] -SEARCHING_DESC = "Zoeken..." +SEARCHING_DESC = "Searching..." [CONTACTS] -LEGEND_CONTACTS = "Contactpersonen" -SEARCH_INPUT_PLACEHOLDER = "Zoeken" -BUTTON_ADD_CONTACT = "Contactpersoon Toevoegen" -BUTTON_CREATE_CONTACT = "Toevoegen" -BUTTON_UPDATE_CONTACT = "Bijwerken" -BUTTON_IMPORT = "Importeer (csv, vcf, vCard)" -BUTTON_EXPORT_VCARD = "Exporteer (vcf, vCard)" -BUTTON_EXPORT_CSV = "Exporteer (csv)" -ERROR_IMPORT_FILE = "Fout bij importeren (ongeldige bestandsindeling)" -LIST_LOADING = "Ophalen..." -EMPTY_LIST = "Geen contactpersonen" -EMPTY_SEARCH = "Geen items gevonden" -CLEAR_SEARCH = "Wis zoekopdracht" -CONTACT_VIEW_DESC = "Selecteer een contactpersoon in de lijst om hier te bekijken" -LABEL_DISPLAY_NAME = "Weergeven als" -LABEL_EMAIL = "E-mail adres" -LABEL_PHONE = "Telefoon" +LEGEND_CONTACTS = "Contacts" +SEARCH_INPUT_PLACEHOLDER = "Search" +BUTTON_ADD_CONTACT = "Add Contact" +BUTTON_CREATE_CONTACT = "Create" +BUTTON_UPDATE_CONTACT = "Update" +BUTTON_IMPORT = "Import (csv, vcf, vCard)" +BUTTON_EXPORT_VCARD = "Export (vcf, vCard)" +BUTTON_EXPORT_CSV = "Export (csv)" +ERROR_IMPORT_FILE = "Import error (invalid file format)" +LIST_LOADING = "Loading" +EMPTY_LIST = "No contacts here" +EMPTY_SEARCH = "No contacts found" +CLEAR_SEARCH = "Clear search" +CONTACT_VIEW_DESC = "Select contact in list to view it here." +LABEL_DISPLAY_NAME = "Display name" +LABEL_EMAIL = "Email" +LABEL_PHONE = "Phone" LABEL_WEB = "Web" -LABEL_BIRTHDAY = "Geboortedatum" -LINK_ADD_EMAIL = "E-mail adres toevoegen" -LINK_ADD_PHONE = "Telefoonnummer toevoegen" -LINK_BIRTHDAY = "Geboortedatum" -PLACEHOLDER_ENTER_DISPLAY_NAME = "Weergeven als" -PLACEHOLDER_ENTER_LAST_NAME = "Achternaam" -PLACEHOLDER_ENTER_FIRST_NAME = "Voornaam" -PLACEHOLDER_ENTER_NICK_NAME = "Bijnaam" -LABEL_READ_ONLY = "Alleen lezen" -LABEL_SHARE = "Deel" -ADD_MENU_LABEL = "Toevoegen" -ADD_MENU_NICKNAME = "Bijnaam" -ADD_MENU_NOTES = "Notities" -ADD_MENU_EMAIL = "E-mail adres" -ADD_MENU_PHONE = "Telefoonnummer" -ADD_MENU_URL = "Webpagina" -ADD_MENU_ADDRESS = "Adres" -ADD_MENU_BIRTHDAY = "Geboortedatum" -ADD_MENU_TAGS = "Labels" -BUTTON_SHARE_NONE = "Niemand" -BUTTON_SHARE_ALL = "Iedereen" -BUTTON_SYNC = "Synchroniseren (CardDAV)" +LABEL_BIRTHDAY = "Birthday" +LINK_ADD_EMAIL = "Add an email address" +LINK_ADD_PHONE = "Add a phone" +LINK_BIRTHDAY = "Birthday" +PLACEHOLDER_ENTER_DISPLAY_NAME = "Enter display name" +PLACEHOLDER_ENTER_LAST_NAME = "Enter last name" +PLACEHOLDER_ENTER_FIRST_NAME = "Enter first name" +PLACEHOLDER_ENTER_NICK_NAME = "Enter nickname" +LABEL_READ_ONLY = "Read only" +LABEL_SHARE = "Share" +ADD_MENU_LABEL = "Add" +ADD_MENU_NICKNAME = "Nickname" +ADD_MENU_NOTES = "Notes" +ADD_MENU_EMAIL = "Email" +ADD_MENU_PHONE = "Phone" +ADD_MENU_URL = "URL" +ADD_MENU_ADDRESS = "Address" +ADD_MENU_BIRTHDAY = "Birthday" +ADD_MENU_TAGS = "Tags" +BUTTON_SHARE_NONE = "None" +BUTTON_SHARE_ALL = "Everyone" +BUTTON_SYNC = "Synchronization (CardDAV)" [COMPOSE] -TITLE_FROM = "Van" -TITLE_TO = "Naar" +TITLE_FROM = "From" +TITLE_TO = "To" TITLE_CC = "CC" TITLE_BCC = "BCC" -TITLE_REPLY_TO = "Antwoordadres" -TITLE_SUBJECT = "Onderwerp" -LINK_SHOW_INPUTS = "Toon alle velden" -BUTTON_SEND = "Verzenden" -BUTTON_SAVE = "Concept opslaan" -BUTTON_DELETE = "Verwijder" -BUTTON_CANCEL = "Annuleer" -BUTTON_MINIMIZE = "Minimaliseer" -SAVED_TIME = "Bewaard op %TIME%" -SAVED_ERROR_ON_SEND = "Bericht is verzonden maar niet bewaard in de VERZONDEN map" -DISCARD_UNSAVED_DATA = "Niet opgeslagen gegevens verwijderen?" -ATTACH_FILES = "Bestand(en) toevoegen" -ATTACH_DROP_FILES_DESC = "Sleep bestanden naar hier" -ATTACH_ITEM_CANCEL = "Annuleer" +TITLE_REPLY_TO = "Reply-To" +TITLE_SUBJECT = "Subject" +LINK_SHOW_INPUTS = "show all fields" +BUTTON_SEND = "Send" +BUTTON_SAVE = "Save" +BUTTON_DELETE = "Delete" +BUTTON_CANCEL = "Cancel" +BUTTON_MINIMIZE = "Minimize" +SAVED_TIME = "Saved at %TIME%" +SAVED_ERROR_ON_SEND = "Message was sent but not saved to sent items folder" +DISCARD_UNSAVED_DATA = "Discard unsaved data?" +ATTACH_FILES = "Attach files" +ATTACH_DROP_FILES_DESC = "Drop files here" +ATTACH_ITEM_CANCEL = "Cancel" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%EMAIL% schreef op %DATETIME%" -FORWARD_MESSAGE_TOP_TITLE = "-------- Doorgestuurd bericht -------" -FORWARD_MESSAGE_TOP_FROM = "Van" -FORWARD_MESSAGE_TOP_TO = "Naar" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% wrote" +FORWARD_MESSAGE_TOP_TITLE = "-------- Forwarded message -------" +FORWARD_MESSAGE_TOP_FROM = "From" +FORWARD_MESSAGE_TOP_TO = "To" FORWARD_MESSAGE_TOP_CC = "CC" -FORWARD_MESSAGE_TOP_SENT = "Verzonden" -FORWARD_MESSAGE_TOP_SUBJECT = "Onderwerp" -EMPTY_TO_ERROR_DESC = "Kies ten minste één ontvanger voordat u het bericht verstuurd" -NO_ATTACHMENTS_HERE_DESC = "Er zijn geen bijlagen" -ATTACHMENTS_ERROR_DESC = "Waarschuwing! Nog niet alle bijlagen zijn klaar met uploaden" -ATTACHMENTS_UPLOAD_ERROR_DESC = "Toevoegen van bijlage(n) is nog niet gereed" -BUTTON_REQUEST_READ_RECEIPT = "Leesbevestiging vragen" -BUTTON_MARK_AS_IMPORTANT = "Marker als belangrijk" -BUTTON_OPEN_PGP = "OpenPGP (allen bij Platte Tekst)" -BUTTON_REQUEST_DSN = "Ontvangstbevestiging vragen" +FORWARD_MESSAGE_TOP_SENT = "Sent" +FORWARD_MESSAGE_TOP_SUBJECT = "Subject" +EMPTY_TO_ERROR_DESC = "Please specify at least one recipient" +NO_ATTACHMENTS_HERE_DESC = "No attachments here." +ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded." +ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet." +BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" +BUTTON_MARK_AS_IMPORTANT = "Mark as important" +BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)" +BUTTON_REQUEST_DSN = "Request a delivery receipt" [POPUPS_WELCOME_PAGE] BUTTON_CLOSE = "Close" [POPUPS_ASK] -BUTTON_YES = "Ja" -BUTTON_NO = "Nee" -DESC_WANT_CLOSE_THIS_WINDOW = "Weet u zeker dat u dit venster wilt sluiten?" -DESC_WANT_DELETE_MESSAGES = "Weet u zeker dat u dit/deze bericht/berichten wilt verwijderen?" +BUTTON_YES = "Yes" +BUTTON_NO = "No" +DESC_WANT_CLOSE_THIS_WINDOW = "Are you sure you want to close this window?" +DESC_WANT_DELETE_MESSAGES = "Are you sure you want to delete the message(s)?" [POPUPS_LANGUAGES] -TITLE_LANGUAGES = "Kies uw taal" +TITLE_LANGUAGES = "Choose your language" [POPUPS_ADD_ACCOUNT] -TITLE_ADD_ACCOUNT = "Account toevoegen?" -BUTTON_ADD_ACCOUNT = "Toevoegen" -TITLE_UPDATE_ACCOUNT = "Account updaten?" +TITLE_ADD_ACCOUNT = "Add Account?" +BUTTON_ADD_ACCOUNT = "Add" +TITLE_UPDATE_ACCOUNT = "Update Account?" BUTTON_UPDATE_ACCOUNT = "Update" [POPUPS_IDENTITY] -TITLE_ADD_IDENTITY = "Identiteit toevoegen?" -TITLE_UPDATE_IDENTITY = "Identiteit bijwerken?" -BUTTON_ADD_IDENTITY = "Toevoegen" -BUTTON_UPDATE_IDENTITY = "Bijwerken" -LABEL_EMAIL = "E-mail adres" -LABEL_NAME = "Naam" -LABEL_REPLY_TO = "Antwoordadres" +TITLE_ADD_IDENTITY = "Add Identity?" +TITLE_UPDATE_IDENTITY = "Update Identity?" +BUTTON_ADD_IDENTITY = "Add" +BUTTON_UPDATE_IDENTITY = "Update" +LABEL_EMAIL = "Email" +LABEL_NAME = "Name" +LABEL_REPLY_TO = "Reply-To" LABEL_SIGNATURE = "Signature" LABEL_CC = "Cc" -LABEL_BCC = "BCC" +LABEL_BCC = "Bcc" LABEL_SIGNATURE_INSERT_BEFORE = "Insert this signature before quoted text in replies" [POPUPS_CREATE_FOLDER] -TITLE_CREATE_FOLDER = "Map aanmaken?" +TITLE_CREATE_FOLDER = "Create a folder?" SELECT_NO_PARENT = "" -LABEL_NAME = "Map naam" -LABEL_PARENT = "Onderliggende map" -BUTTON_CREATE = "Maken" -BUTTON_CANCEL = "Annuleer" -BUTTON_CLOSE = "Sluiten" -TITLE_CREATING_PROCESS = "Maak een nieuwe map" +LABEL_NAME = "Folder name" +LABEL_PARENT = "Parent folder" +BUTTON_CREATE = "Create" +BUTTON_CANCEL = "Cancel" +BUTTON_CLOSE = "Close" +TITLE_CREATING_PROCESS = "Creating a folder" [POPUPS_CLEAR_FOLDER] -TITLE_CLEAR_FOLDER = "Alle inhoud van deze map verwijderen?" -BUTTON_CLEAR = "Wissen" -BUTTON_CANCEL = "Annuleer" -BUTTON_CLOSE = "Sluiten" -DANGER_DESC_WARNING = "Opgelet!" -DANGER_DESC_HTML_1 = "Deze actie verwijdert alle e-mails in de map %FOLDER%!" -DANGER_DESC_HTML_2 = "Eens in gang gezet kan het proces niet geannuleerd worden!" -TITLE_CLEARING_PROCESS = "Folder aan het leegmaken..." +TITLE_CLEAR_FOLDER = "Purge all messages from the folder?" +BUTTON_CLEAR = "Clear" +BUTTON_CANCEL = "Cancel" +BUTTON_CLOSE = "Close" +DANGER_DESC_WARNING = "Warning!" +DANGER_DESC_HTML_1 = "This action will result in removing all mails from %FOLDER% folder completely." +DANGER_DESC_HTML_2 = "Once started, the process cannot be aborted or cancelled." +TITLE_CLEARING_PROCESS = "Purging the folder..." [POPUPS_IMPORT_OPEN_PGP_KEY] -TITLE_IMPORT_OPEN_PGP_KEY = "Importeer OpenPGP sleutel" -BUTTON_IMPORT_OPEN_PGP_KEY = "Importeer" +TITLE_IMPORT_OPEN_PGP_KEY = "Import OpenPGP key" +BUTTON_IMPORT_OPEN_PGP_KEY = "Import" [POPUPS_VIEW_OPEN_PGP_KEY] -TITLE_VIEW_OPEN_PGP_KEY = "Bekijk OpenPGP sleutel" -BUTTON_SELECT = "Selecteer" -BUTTON_CLOSE = "Sluiten" +TITLE_VIEW_OPEN_PGP_KEY = "View OpenPGP key" +BUTTON_SELECT = "Select" +BUTTON_CLOSE = "Close" [POPUPS_GENERATE_OPEN_PGP_KEYS] -TITLE_GENERATE_OPEN_PGP_KEYS = "Genereer OpenPGP sleutels" -LABEL_EMAIL = "E-mail" -LABEL_NAME = "Naam" -LABEL_PASSWORD = "Wachtwoord" -LABEL_KEY_BIT_LENGTH = "Sleutel lengte" -BUTTON_GENERATE_OPEN_PGP_KEYS = "Genereer" +TITLE_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP keys" +LABEL_EMAIL = "Email" +LABEL_NAME = "Name" +LABEL_PASSWORD = "Password" +LABEL_KEY_BIT_LENGTH = "Key length" +BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate" [POPUPS_COMPOSE_OPEN_PGP] -TITLE_COMPOSE_OPEN_PGP = "OpenPGP ondertekenen/versleutelen" -LABEL_SIGN = "Ondertekenen" -LABEL_ENCRYPT = "Versleutelen" -LABEL_PASSWORD = "Wachtwoord" -BUTTON_SIGN = "Ondertekenen" -BUTTON_ENCRYPT = "Versleutelen" -BUTTON_SIGN_AND_ENCRYPT = "Ondertekenen en versleutelen" +TITLE_COMPOSE_OPEN_PGP = "OpenPGP Sign/Encrypt" +LABEL_SIGN = "Sign" +LABEL_ENCRYPT = "Encrypt" +LABEL_PASSWORD = "Password" +BUTTON_SIGN = "Sign" +BUTTON_ENCRYPT = "Encrypt" +BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" [POPUPS_TWO_FACTOR_TEST] -TITLE_TEST_CODE = "2-Stap verificatie test" +TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" BUTTON_TEST = "Test" [POPUPS_FILTER] -TITLE_CREATE_FILTER = "Filter toevoegen" -TITLE_EDIT_FILTER = "Filter aanpassen" -FILTER_NAME = "Naam" -LEGEND_CONDITIONS = "Voorwaarden" -LEGEND_ACTIONS = "Akties" -BUTTON_DONE = "Klaar" -BUTTON_ADD_CONDITION = "Voorwaarde toevoegen" -SELECT_ACTION_NONE = "Geen" -SELECT_ACTION_MOVE_TO = "Verplaats naar" -SELECT_ACTION_FORWARD_TO = "Doorsturen naar" -SELECT_ACTION_REJECT = "Afwijzen" -SELECT_ACTION_VACATION_MESSAGE = "Afwezigheidbericht" -SELECT_ACTION_DISCARD = "Gooi weg" -SELECT_FIELD_FROM = "Van" -SELECT_FIELD_RECIPIENTS = "Ontvanger(s) (Aan of CC)" -SELECT_FIELD_SUBJECT = "Onderwerp" -SELECT_FIELD_HEADER = "Berichtkop" -SELECT_FIELD_SIZE = "Grootte" -SELECT_TYPE_CONTAINS = "Bevat" -SELECT_TYPE_NOT_CONTAINS = "Bevat niet" -SELECT_TYPE_MATCHES = "Komt overeen met (* and ? supported)" -SELECT_TYPE_NOT_MATCHES = "Komt niet overeen met (* and ? supported)" -SELECT_TYPE_REGEXP = "Reguliere expressie (Regexp)" -SELECT_TYPE_NOT_REGEXP = "Niet reguliere expressie (Regexp)" -SELECT_TYPE_EQUAL_TO = "Gelijk aan" -SELECT_TYPE_NOT_EQUAL_TO = "Niet gelijk aan" -SELECT_MATCH_ANY = "Komt overeen met een van de volgende voorwaarden" -SELECT_MATCH_ALL = "Komt overeen met alle voorwaarden" -MARK_AS_READ_LABEL = "Markeer als gelezen" -REPLY_INTERVAL_LABEL = "Antwoord interval (dagen)" -KEEP_LABEL = "Behoud" -STOP_LABEL = "Stop niet met uitvoeren van volgende filters" -EMAIL_LABEL = "E-mail" -VACATION_SUBJECT_LABEL = "Onderwerp (optioneel)" -VACATION_MESSAGE_LABEL = "Bericht" -REJECT_MESSAGE_LABEL = "Afwijsbericht" -ALL_INCOMING_MESSAGES_DESC = "Alle inkomende berichten" +TITLE_CREATE_FILTER = "Create a filter?" +TITLE_EDIT_FILTER = "Update filter?" +FILTER_NAME = "Name" +LEGEND_CONDITIONS = "Conditions" +LEGEND_ACTIONS = "Actions" +BUTTON_DONE = "Done" +BUTTON_ADD_CONDITION = "Add a Condition" +SELECT_ACTION_NONE = "None" +SELECT_ACTION_MOVE_TO = "Move to" +SELECT_ACTION_FORWARD_TO = "Forward to" +SELECT_ACTION_REJECT = "Reject" +SELECT_ACTION_VACATION_MESSAGE = "Vacation message" +SELECT_ACTION_DISCARD = "Discard" +SELECT_FIELD_FROM = "From" +SELECT_FIELD_RECIPIENTS = "Recipients (To or CC)" +SELECT_FIELD_SUBJECT = "Subject" +SELECT_FIELD_HEADER = "Header" +SELECT_FIELD_SIZE = "Size" +SELECT_TYPE_CONTAINS = "Contains" +SELECT_TYPE_NOT_CONTAINS = "Not Contains" +SELECT_TYPE_MATCHES = "Matches (* and ? supported)" +SELECT_TYPE_NOT_MATCHES = "Not Matches (* and ? supported)" +SELECT_TYPE_REGEXP = "Regexp" +SELECT_TYPE_NOT_REGEXP = "Not Regexp" +SELECT_TYPE_EQUAL_TO = "Equal To" +SELECT_TYPE_NOT_EQUAL_TO = "Not Equal To" +SELECT_MATCH_ANY = "Matching any of the following rules" +SELECT_MATCH_ALL = "Matching all of the following rules" +MARK_AS_READ_LABEL = "Mark as read" +REPLY_INTERVAL_LABEL = "Reply interval (days)" +KEEP_LABEL = "Keep" +STOP_LABEL = "Don't stop processing rules" +EMAIL_LABEL = "Email" +VACATION_SUBJECT_LABEL = "Subject (optional)" +VACATION_MESSAGE_LABEL = "Message" +REJECT_MESSAGE_LABEL = "Reject message" +ALL_INCOMING_MESSAGES_DESC = "All incoming messages" [POPUPS_SYSTEM_FOLDERS] -TITLE_SYSTEM_FOLDERS = "Selecteer systeem mappen" -SELECT_CHOOSE_ONE = "Kies één" -SELECT_UNUSE_NAME = "Niet gebruiken" -LABEL_SENT = "Verzonden items" -LABEL_DRAFTS = "Concepten" -LABEL_SPAM = "Ongewenste e-mail" -LABEL_TRASH = "Verwijderde items" -LABEL_ARCHIVE = "Archief" -BUTTON_CANCEL = "Annuleer" -BUTTON_CLOSE = "Sluiten" -NOTIFICATION_SENT = "U heeft nog geen \"Verzonden items\" folder aangeduid waar de berichten geplaatst worden na het versturen. -Indien u geen verzonden berichten wilt bewaren, kies de \"Niet gebruiken\" optie." -NOTIFICATION_DRAFTS = "U heeft nog geen \"Concepten\" folder aangeduid waar de berichten bewaard worden tijdens het opstellen." -NOTIFICATION_SPAM = "U heeft nog geen \"Ongewenste e-mail\" folder aangeduid waar de spam berichten geplaatst worden. -Indien u berichten permanent wilt verwijderen, kies de \"Niet gebruiken\" optie." -NOTIFICATION_TRASH = "U heeft nog geen \"Verwijderde items\" folder aangeduid waar de verwijderde berichten geplaatst worden. -Indien u berichten permanent wilt verwijderen, kies de \"Niet gebruiken\" optie." -NOTIFICATION_ARCHIVE = "U heeft nog geen \"Archief\" map aangeduid waar de gearchiveerde berichten geplaatst worden." +TITLE_SYSTEM_FOLDERS = "Select system folders" +SELECT_CHOOSE_ONE = "Choose one" +SELECT_UNUSE_NAME = "Do not use" +LABEL_SENT = "Sent" +LABEL_DRAFTS = "Drafts" +LABEL_SPAM = "Spam" +LABEL_TRASH = "Trash" +LABEL_ARCHIVE = "Archive" +BUTTON_CANCEL = "Cancel" +BUTTON_CLOSE = "Close" +NOTIFICATION_SENT = "You haven't selected \"Sent\" system folder messages are put to after sending. +If you don't want to save sent message, please select \"Do not use\" option." +NOTIFICATION_DRAFTS = "You haven't selected \"Drafts\" system folder messages are saved to while composing." +NOTIFICATION_SPAM = "You haven't selected \"Spam\" system folder spamed messages are placed to. +If you wish to remove messages permanently, please select \"Do not use\" option." +NOTIFICATION_TRASH = "You haven't selected \"Trash\" system folder deleted messages are placed to. +If you wish to remove messages permanently, please select \"Do not use\" option." +NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." [POPUPS_TWO_FACTOR_CFG] -LEGEND_TWO_FACTOR_AUTH = "2-Stap verificatie" -LABEL_ENABLE_TWO_FACTOR = "Gebruik 2-Stap verificatie" -LABEL_TWO_FACTOR_USER = "Gebruikersnaam" +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification (TOTP)" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Geheime sleutel" +LABEL_TWO_FACTOR_SECRET = "Secret" LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" -BUTTON_CREATE = "Nieuwe geheime sleutel aanmaken" +BUTTON_CREATE = "Create a secret" BUTTON_ACTIVATE = "Activate" -BUTTON_CLEAR = "Wissen" +BUTTON_CLEAR = "Clear" BUTTON_LOGOUT = "Logout" BUTTON_DONE = "Done" BUTTON_TEST = "Test" LINK_TEST = "test" -BUTTON_SHOW_SECRET = "Bekijk geheime sleutel" -BUTTON_HIDE_SECRET = "Verberg geheime sleutel" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Geconfigureerd" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Niet geconfigureerd" -TWO_FACTOR_SECRET_DESC = "Importeer deze informatie in uw Google Authenticator-client (of andere TOTP-client) door gebruik te maken van de QR code hier beneden of door de code handmatig in te voeren." -TWO_FACTOR_BACKUP_CODES_DESC = "Als u geen codes ontvangt via de Google Authenticator kan je de backup codes gebruiken om in te loggen. Na gebruik van de backup code wordt deze inactief." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [TITLES] -LOADING = "Ophalen..." -LOGIN = "Inloggen" -MAILBOX = "Mailbox" -SETTINGS = "Instellingen" -COMPOSE = "Opstellen" +LOADING = "Loading" +LOGIN = "Login" +MAILBOX = "MailBox" +SETTINGS = "Settings" +COMPOSE = "Compose" [UPLOAD] -ERROR_FILE_IS_TOO_BIG = "Bestand is te groot" -ERROR_FILE_PARTIALLY_UPLOADED = "Bestand is slechts deels geüpload door onbekende oorzaak" -ERROR_NO_FILE_UPLOADED = "Geen bestand geüpload" -ERROR_MISSING_TEMP_FOLDER = "Tijdelijk bestand ontbreekt" -ERROR_ON_SAVING_FILE = "Onbekende fout bij het opslaan van het bestand" -ERROR_FILE_TYPE = "Onjuist bestandstype" -ERROR_UNKNOWN = "Er is een onbekende fout opgetreden" +ERROR_FILE_IS_TOO_BIG = "File is too big" +ERROR_FILE_PARTIALLY_UPLOADED = "File was partially uploaded due to unknown error" +ERROR_NO_FILE_UPLOADED = "No file uploaded" +ERROR_MISSING_TEMP_FOLDER = "The temporary file is missing" +ERROR_ON_SAVING_FILE = "An unknown file upload error occurred" +ERROR_FILE_TYPE = "Invalid file type" +ERROR_UNKNOWN = "An unknown file upload error occurred" [EDITOR] -TEXT_SWITCHER_PLAINT_TEXT = "Platte tekst" -TEXT_SWITCHER_RICH_FORMATTING = "Tekst met opmaak" -TEXT_SWITCHER_CONFIRM = "Tekst opmaak zal verloren gaan. Wenst u verder te gaan?" +TEXT_SWITCHER_PLAINT_TEXT = "Plain text" +TEXT_SWITCHER_RICH_FORMATTING = "Rich formatting" +TEXT_SWITCHER_CONFIRM = "Text formatting and images will be lost. Are you sure you want to continue?" [SETTINGS_LABELS] -LABEL_PERSONAL_NAME = "Persoonlijk" -LABEL_GENERAL_NAME = "Algemeen" -LABEL_CONTACTS_NAME = "Contactpersonen" -LABEL_FOLDERS_NAME = "Mappen" +LABEL_PERSONAL_NAME = "Personal" +LABEL_GENERAL_NAME = "General" +LABEL_CONTACTS_NAME = "Contacts" +LABEL_FOLDERS_NAME = "Folders" LABEL_ACCOUNTS_NAME = "Accounts" -LABEL_IDENTITY_NAME = "Identiteit" -LABEL_IDENTITIES_NAME = "Identiteiten" +LABEL_IDENTITY_NAME = "Identity" +LABEL_IDENTITIES_NAME = "Identities" LABEL_FILTERS_NAME = "Filters" LABEL_TEMPLATES_NAME = "Templates" -LABEL_SECURITY_NAME = "Beveiliging" +LABEL_SECURITY_NAME = "Security" LABEL_SOCIAL_NAME = "Social" -LABEL_THEMES_NAME = "Thema's" -LABEL_CHANGE_PASSWORD_NAME = "Wachtwoord" +LABEL_THEMES_NAME = "Themes" +LABEL_CHANGE_PASSWORD_NAME = "Password" LABEL_OPEN_PGP_NAME = "OpenPGP" -BUTTON_BACK = "Terug" +BUTTON_BACK = "Back" [SETTINGS_FILTERS] LEGEND_FILTERS = "Filters" -BUTTON_SAVE = "Opslaan" -BUTTON_ADD_FILTER = "Filter toevoegen" -BUTTON_DELETE = "Verwijder" -BUTTON_RAW_SCRIPT = "Maak een custom script" -SUBNAME_NONE = "Geen" -SUBNAME_MOVE_TO = "Verplaats naar map \"%FOLDER%\"" -SUBNAME_FORWARD_TO = "Doorsturen naar \"%EMAIL%\"" -SUBNAME_REJECT = "Afwijzen" -SUBNAME_VACATION_MESSAGE = "Afwezigheidsbericht" -SUBNAME_DISCARD = "Gooi weg" -CAPABILITY_LABEL = "Mogelijkheden" -LOADING_PROCESS = "Bezig met updaten van de filter lijst" -DELETING_ASK = "Weet u het zeker?" -CHACHES_NEED_TO_BE_SAVED_DESC = "Wijzigingen moeten nog opgeslagen worden op de server." +BUTTON_SAVE = "Save" +BUTTON_ADD_FILTER = "Add a Filter" +BUTTON_DELETE = "Delete" +BUTTON_RAW_SCRIPT = "Use Custom User Script" +SUBNAME_NONE = "None" +SUBNAME_MOVE_TO = "Move to \"%FOLDER%\"" +SUBNAME_FORWARD_TO = "Forward to \"%EMAIL%\"" +SUBNAME_REJECT = "Reject" +SUBNAME_VACATION_MESSAGE = "Vacation message" +SUBNAME_DISCARD = "Discard" +CAPABILITY_LABEL = "Capability" +LOADING_PROCESS = "Updating filter list" +DELETING_ASK = "Are you sure?" +CHACHES_NEED_TO_BE_SAVED_DESC = "These changes need to be saved to the server." [SETTINGS_IDENTITY] -LEGEND_IDENTITY = "Identiteit" -LABEL_DISPLAY_NAME = "Naam" -LABEL_REPLY_TO = "Antwoordadres" -LABEL_SIGNATURE = "Handtekening" -LABEL_ADD_SIGNATURE_TO_ALL = "Handtekening standaard toevoegen aan bericht" +LEGEND_IDENTITY = "Identity" +LABEL_DISPLAY_NAME = "Name" +LABEL_REPLY_TO = "Reply-To" +LABEL_SIGNATURE = "Signature" +LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] -LEGEND_SECURITY = "Beveiliging" +LEGEND_SECURITY = "Security" LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" -LABEL_AUTOLOGOUT = "Automatisch uitloggen" -AUTOLOGIN_NEVER_OPTION_NAME = "Nooit" -AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minuten" +LABEL_AUTOLOGOUT = "Auto Logout" +AUTOLOGIN_NEVER_OPTION_NAME = "Never" +AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" [SETTINGS_GENERAL] -LEGEND_GENERAL = "Algemeen" -LABEL_LANGUAGE = "Taal" -LABEL_LAYOUT = "Indeling" -LABEL_LAYOUT_NO_SPLIT = "Geen splitsing" -LABEL_LAYOUT_VERTICAL_SPLIT = "Verticale splitsing" -LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontale splitsing" -LABEL_EDITOR = "Standaard tekst editor" -LABEL_EDITOR_HTML = "HTML" -LABEL_EDITOR_PLAIN = "Platte tekst" -LABEL_EDITOR_HTML_FORCED = "Html (geforceerd)" -LABEL_EDITOR_PLAIN_FORCED = "Platte tekst (geforceerd)" -LABEL_ANIMATION = "Interface animatie" -LABEL_ANIMATION_FULL = "Volledig" -LABEL_ANIMATION_NORMAL = "Normaal" -LABEL_ANIMATION_NONE = "Geen" -LABEL_VIEW_OPTIONS = "Bekijk opties" -LABEL_USE_PREVIEW_PANE = "Toon leesvenster" -LABEL_USE_CHECKBOXES_IN_LIST = "Toon selectievakjes in de lijst" -LABEL_USE_THREADS = "Groepeer berichten" -LABEL_REPLY_SAME_FOLDER = "Plaats antwoorden in de map van het originele bericht" -LABEL_SHOW_IMAGES = "Afbeeldingen altijd weergeven in het bericht" -LABEL_SHOW_ANIMATION = "Toon animaties" -LABEL_MESSAGE_PER_PAGE = "Berichten op pagina" -LABEL_NOTIFICATIONS = "Notificaties" -LABEL_SOUND_NOTIFICATION = "Notificatie geluid" -LABEL_CHROME_NOTIFICATION_DESC = "Toon nieuwe berichten popup" -LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(Geblokkeerd door de browser)" +LEGEND_GENERAL = "General" +LABEL_LANGUAGE = "Language" +LABEL_LAYOUT = "Layout" +LABEL_LAYOUT_NO_SPLIT = "No Split" +LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split" +LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split" +LABEL_EDITOR = "Default text editor" +LABEL_EDITOR_HTML = "Html" +LABEL_EDITOR_PLAIN = "Plain" +LABEL_EDITOR_HTML_FORCED = "Html (forced)" +LABEL_EDITOR_PLAIN_FORCED = "Plain (forced)" +LABEL_ANIMATION = "Interface animation" +LABEL_ANIMATION_FULL = "Full" +LABEL_ANIMATION_NORMAL = "Normal" +LABEL_ANIMATION_NONE = "None" +LABEL_VIEW_OPTIONS = "View options" +LABEL_USE_PREVIEW_PANE = "Use preview pane" +LABEL_USE_CHECKBOXES_IN_LIST = "Display checkboxes in list" +LABEL_USE_THREADS = "Use threads" +LABEL_REPLY_SAME_FOLDER = "Place replies in the folder of the message being replied to" +LABEL_SHOW_IMAGES = "Always display external images in message body" +LABEL_SHOW_ANIMATION = "Show animation" +LABEL_MESSAGE_PER_PAGE = "Messages on page" +LABEL_NOTIFICATIONS = "Notifications" +LABEL_SOUND_NOTIFICATION = "Sound notification" +LABEL_CHROME_NOTIFICATION_DESC = "Show new messages notification popups" +LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(Blocked by the browser)" [SETTINGS_CONTACTS] -LEGEND_CONTACTS = "Contactpersonen" -LABEL_CONTACTS_AUTOSAVE = "Automatisch ontvangers toevoegen aan uw adresboek" -LEGEND_CONTACTS_SYNC = "Server Synchronisatie (CardDAV)" -LABEL_CONTACTS_SYNC_ENABLE = "Server synchronisatie inschakelen" +LEGEND_CONTACTS = "Contacts" +LABEL_CONTACTS_AUTOSAVE = "Automatically add recipients to your address book" +LEGEND_CONTACTS_SYNC = "Remote Synchronization (CardDAV)" +LABEL_CONTACTS_SYNC_ENABLE = "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER = "Server" -LABEL_CONTACTS_SYNC_AB_URL = "Adresboek URL" -LABEL_CONTACTS_SYNC_USER = "Gebruikersnaam" -LABEL_CONTACTS_SYNC_PASSWORD = "Wachtwoord" +LABEL_CONTACTS_SYNC_AB_URL = "Addressbook URL" +LABEL_CONTACTS_SYNC_USER = "User" +LABEL_CONTACTS_SYNC_PASSWORD = "Password" [SETTINGS_THEMES] -LEGEND_THEMES = "Thema's" -LEGEND_THEMES_CUSTOM = "Aangepaste thema configuratie" -LABEL_CUSTOM_TYPE = "Soort" -LABEL_CUSTOM_TYPE_LIGHT = "Licht" -LABEL_CUSTOM_TYPE_DARK = "Donker" -LABEL_CUSTOM_BACKGROUND_IMAGE = "Achtergrond" -BUTTON_UPLOAD_BACKGROUND_IMAGE = "Upload achtergrond afbeelding (JPG, PNG)" -ERROR_FILE_IS_TOO_BIG = "Bestand is te groot" -ERROR_FILE_TYPE_ERROR = "Onjuist bestandstype (alleen JPG and PNG)" -ERROR_UNKNOWN = "Er is een onbekende fout opgetreden" +LEGEND_THEMES = "Themes" +LEGEND_THEMES_CUSTOM = "Custom Theme Configuration" +LABEL_CUSTOM_TYPE = "Type" +LABEL_CUSTOM_TYPE_LIGHT = "Light" +LABEL_CUSTOM_TYPE_DARK = "Dark" +LABEL_CUSTOM_BACKGROUND_IMAGE = "Background" +BUTTON_UPLOAD_BACKGROUND_IMAGE = "Upload background image (JPG, PNG)" +ERROR_FILE_IS_TOO_BIG = "File is too big" +ERROR_FILE_TYPE_ERROR = "Invalid file type (JPG and PNG only)" +ERROR_UNKNOWN = "An unknown file upload error occurred" [SETTINGS_SOCIAL] LEGEND_GOOGLE = "Google" -BUTTON_GOOGLE_CONNECT = "Via Google verbinden" -BUTTON_GOOGLE_DISCONNECT = "Verbinding met Google verbreken" -MAIN_GOOGLE_DESC = "Na activatie van inloggen via Google kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." +BUTTON_GOOGLE_CONNECT = "Connect Google" +BUTTON_GOOGLE_DISCONNECT = "Disconnect Google" +MAIN_GOOGLE_DESC = "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK = "Facebook" -BUTTON_FACEBOOK_CONNECT = "Via Facebook verbinden" -BUTTON_FACEBOOK_DISCONNECT = "Verbinding met Facebook verbreken" -MAIN_FACEBOOK_DESC = "Na activatie van inloggen via Facebook kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." +BUTTON_FACEBOOK_CONNECT = "Connect Facebook" +BUTTON_FACEBOOK_DISCONNECT = "Disconnect Facebook" +MAIN_FACEBOOK_DESC = "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER = "Twitter" -BUTTON_TWITTER_CONNECT = "Via Twitter verbinden" -BUTTON_TWITTER_DISCONNECT = "Verbinding via Twitter verbreken" -MAIN_TWITTER_DESC = "Na activatie van inloggen via Twitter kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." +BUTTON_TWITTER_CONNECT = "Connect Twitter" +BUTTON_TWITTER_DISCONNECT = "Disconnect Twitter" +MAIN_TWITTER_DESC = "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." [SETTINGS_FOLDERS] -LEGEND_FOLDERS = "Mappen lijst" -BUTTON_CREATE = "Maak een map" -BUTTON_SYSTEM = "Selecteer systeem mappen" -BUTTON_DELETE = "Verwijder" -BUTTON_SUBSCRIBE = "Abonneer" -BUTTON_UNSUBSCRIBE = "Abonnement opzeggen" -LOADING_PROCESS = "Mappen lijst aan het bijwerken" -CREATING_PROCESS = "Map aan het aanmaken" -DELETING_PROCESS = "Map aan het wissen" -RENAMING_PROCESS = "Map hernoemen" -DELETING_ASK = "Weet u het zeker?" -TO_MANY_FOLDERS_DESC_1 = "U heeft te veel mappen!" -TO_MANY_FOLDERS_DESC_2 = "Er worden er maar een deel weergegeven om prestatieproblemen te voorkomen." +LEGEND_FOLDERS = "Folder List" +BUTTON_CREATE = "Create Folder" +BUTTON_SYSTEM = "Select System Folders" +BUTTON_DELETE = "Delete" +BUTTON_SUBSCRIBE = "Subscribe" +BUTTON_UNSUBSCRIBE = "Unsubscribe" +LOADING_PROCESS = "Updating folder list" +CREATING_PROCESS = "Creating a folder" +DELETING_PROCESS = "Deleting a folder" +RENAMING_PROCESS = "Renaming a folder" +DELETING_ASK = "Are you sure?" +TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" +TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] -LEGEND_ACCOUNTS = "Account Lijst" -LEGEND_IDENTITIES = "Identiteiten" -LEGEND_ACCOUNTS_AND_IDENTITIES = "Accounts en Identiteiten" -BUTTON_ADD_ACCOUNT = "Account toevoegen" -BUTTON_ADD_IDENTITY = "Identiteit toevoegen" -BUTTON_DELETE = "Wissen" -LOADING_PROCESS = "Account lijst aan het bijwerken" -DELETING_ASK = "Weet u het zeker?" -DEFAULT_IDENTITY_LABEL = "standaard" +LEGEND_ACCOUNTS = "Accounts" +LEGEND_IDENTITIES = "Identities" +LEGEND_ACCOUNTS_AND_IDENTITIES = "Accounts and Identities" +BUTTON_ADD_ACCOUNT = "Add an Account" +BUTTON_ADD_IDENTITY = "Add an Identity" +BUTTON_DELETE = "Delete" +LOADING_PROCESS = "Updating..." +DELETING_ASK = "Are you sure?" +DEFAULT_IDENTITY_LABEL = "default" [SETTINGS_IDENTITIES] -LEGEND_IDENTITY = "Identiteit" -LEGEND_IDENTITIES = "Additionele Identiteit" -LABEL_DEFAULT = "Standaard" -LABEL_DISPLAY_NAME = "Naam" -LABEL_REPLY_TO = "Antwoordadres" -LABEL_SIGNATURE = "Handtekening" -LABEL_ADD_SIGNATURE_TO_ALL = "Handtekening standaard toevoegen aan bericht" -BUTTON_ADD_IDENTITY = "Identiteit toevoegen" -BUTTON_DELETE = "Verwijder" -LOADING_PROCESS = "Identiteit lijst bijwerken" -DELETING_ASK = "Weet u het zeker?" +LEGEND_IDENTITY = "Identity" +LEGEND_IDENTITIES = "Additional Identities" +LABEL_DEFAULT = "Default" +LABEL_DISPLAY_NAME = "Name" +LABEL_REPLY_TO = "Reply-To" +LABEL_SIGNATURE = "Signature" +LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" +BUTTON_ADD_IDENTITY = "Add Identity" +BUTTON_DELETE = "Delete" +LOADING_PROCESS = "Updating identity list" +DELETING_ASK = "Are you sure?" [SETTINGS_CHANGE_PASSWORD] -LEGEND_CHANGE_PASSWORD = "Wachtwoord aanpassen" -LABEL_CURRENT_PASSWORD = "Huidig wachtwoord" -LABEL_NEW_PASSWORD = "Nieuw wachtwoord" -LABEL_REPEAT_PASSWORD = "Bevestig wachtwoord" -BUTTON_UPDATE_PASSWORD = "Wachtwoord wijzigen" -ERROR_PASSWORD_MISMATCH = "Wachtwoorden zijn niet gelijk, probeer opnieuw" +LEGEND_CHANGE_PASSWORD = "Change Password" +LABEL_CURRENT_PASSWORD = "Current password" +LABEL_NEW_PASSWORD = "New password" +LABEL_REPEAT_PASSWORD = "Confirm New Password" +BUTTON_UPDATE_PASSWORD = "Set New Password" +ERROR_PASSWORD_MISMATCH = "Passwords do not match, please try again" [SETTINGS_OPEN_PGP] LEGEND_OPEN_PGP = "OpenPGP" -BUTTON_ADD_OPEN_PGP_KEY = "Importeer OpenPGP sleutel" -BUTTON_GENERATE_OPEN_PGP_KEYS = "Genereer OpenPGP sleutels" -TITLE_PRIVATE = "Privé sleutel" -TITLE_PUBLIC = "Publieke sleutel" -DELETING_ASK = "Weet u het zeker?" +BUTTON_ADD_OPEN_PGP_KEY = "Import OpenPGP Key" +BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" +TITLE_PRIVATE = "Private" +TITLE_PUBLIC = "Public" +DELETING_ASK = "Are you sure?" [SHORTCUTS_HELP] -LEGEND_SHORTCUTS_HELP = "Hulp bij toetsenbord sneltoetsen" +LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" TAB_MAILBOX = "Mailbox" -TAB_MESSAGE_LIST = "Berichtenlijst" -TAB_MESSAGE_VIEW = "Bericht leesvenster" -TAB_COMPOSE = "Opstellen" -LABEL_OPEN_USER_DROPDOWN = "Open gebruikers menu" -LABEL_REPLY = "Beantwoord" -LABEL_REPLY_ALL = "Alle beantwoorden" -LABEL_FORWARD = "Doorsturen" -LABEL_FORWARD_MULTIPLY = "Doorsturen als bijlage(n)" +TAB_MESSAGE_LIST = "Message list" +TAB_MESSAGE_VIEW = "Message view" +TAB_COMPOSE = "Compose" +LABEL_OPEN_USER_DROPDOWN = "Open user dropdown" +LABEL_REPLY = "Reply" +LABEL_REPLY_ALL = "Reply All" +LABEL_FORWARD = "Forward" +LABEL_FORWARD_MULTIPLY = "Forward as attachment(s)" LABEL_HELP = "Help" -LABEL_CHECK_ALL = "Selecteer alle berichten" -LABEL_ARCHIVE = "Archiveren" -LABEL_DELETE = "Verwijderen" -LABEL_OPEN_THREAD = "Open geselecteerde berichtenlijst"" -LABEL_MOVE = "Verplaatsen" -LABEL_READ = "Markeer geselecteerde berichten als gelezen" -LABEL_UNREAD = "Markeer geselecteerde berichten als ongelezen" -LABEL_IMPORTANT = "Belangrijk, vlag geselecteerde berichten" -LABEL_SEARCH = "Zoeken" -LABEL_CANCEL_SEARCH = "Zoekopdracht afbreken" -LABEL_FULLSCREEN_ENTER = "Bericht in volledig scherm lezen (leesvenster ingeschakeld)" -LABEL_VIEW_MESSAGE_ENTER = "Bericht lezen (leesvenster uitgeschakeld)" -LABEL_SWITCH_TO_MESSAGE = "Schakel focus naar bericht" -LABEL_SWITCH_TO_FOLDER_LIST = "Schakel focus naar berichtenlijst" -LABEL_FULLSCREEN_TOGGLE = "Schakel tussen normaal en lezen in volledig scherm" -LABEL_BLOCKQUOTES_TOGGLE = "Schakel blok citaten aan of uit" -LABEL_THREAD_NEXT = "Volgende bericht in groep" -LABEL_THREAD_PREV = "Vorige bericht in groep" -LABEL_PRINT = "Afdrukken" -LABEL_EXIT_FULLSCREEN = "Volledig scherm sluiten" -LABEL_CLOSE_MESSAGE = "Bericht sluiten (leesvenster uitgeschakeld)" -LABEL_SWITCH_TO_LIST = "Schakel focus terug naar berichtenlijst" -LABEL_OPEN_COMPOSE_POPUP = "Open nieuw bericht venster" -LABEL_OPEN_IDENTITIES_DROPDOWN = "Open identiteiten menu" -LABEL_SAVE_MESSAGE = "Concept opslaan" -LABEL_SEND_MESSAGE = "Bericht versturen" -LABEL_CLOSE_COMPOSE = "Nieuw bericht venster sluiten" +LABEL_CHECK_ALL = "Select all messages" +LABEL_ARCHIVE = "Archive" +LABEL_DELETE = "Delete" +LABEL_OPEN_THREAD = "Open selected thread" +LABEL_MOVE = "Move" +LABEL_READ = "Read selected messages" +LABEL_UNREAD = "Unread selected messages" +LABEL_IMPORTANT = "Important, star/flag selected messages" +LABEL_SEARCH = "Search" +LABEL_CANCEL_SEARCH = "Cancel search" +LABEL_FULLSCREEN_ENTER = "Fullscreen (Preview pane layout)" +LABEL_VIEW_MESSAGE_ENTER = "View message (No preview pane layout)" +LABEL_SWITCH_TO_MESSAGE = "Switch focus to selected message" +LABEL_SWITCH_TO_FOLDER_LIST = "Switch focus to folder list" +LABEL_FULLSCREEN_TOGGLE = "Toggle fullscreen mode" +LABEL_BLOCKQUOTES_TOGGLE = "Toggle message blockquotes" +LABEL_THREAD_NEXT = "Next message in thread" +LABEL_THREAD_PREV = "Previous message in thread" +LABEL_PRINT = "Print" +LABEL_EXIT_FULLSCREEN = "Exit fullscreen mode" +LABEL_CLOSE_MESSAGE = "Close message (No preview pane layout)" +LABEL_SWITCH_TO_LIST = "Switch focus back to message list" +LABEL_OPEN_COMPOSE_POPUP = "Open compose popup" +LABEL_OPEN_IDENTITIES_DROPDOWN = "Open identities dropdown" +LABEL_SAVE_MESSAGE = "Save message" +LABEL_SEND_MESSAGE = "Send message" +LABEL_CLOSE_COMPOSE = "Close compose" [PGP_NOTIFICATIONS] -NO_PUBLIC_KEYS_FOUND = "Geen publieke sleutels gevonden" -NO_PUBLIC_KEYS_FOUND_FOR = "Geen publieke sleutels gevonden voor e-mail adres \"%EMAIL%\"" -NO_PRIVATE_KEY_FOUND = "Geen geheime sleutel gevonden" -NO_PRIVATE_KEY_FOUND_FOR = "Geen geheime sleutel gevonden voor e-mail adres \"%EMAIL%\"" -UNVERIFIRED_SIGNATURE = "Ongeverifieerde handtekening" -DECRYPTION_ERROR = "OpenPGP decryptie fout" -GOOD_SIGNATURE = "Juiste handtekening van %USER%" -PGP_ERROR = "OpenPGP foutmelding: %ERROR%" -SPECIFY_FROM_EMAIL = "Geef a.u.b. een VAN e-mail adres op" -SPECIFY_AT_LEAST_ONE_RECIPIENT = "Geef a.u.b. minimaal één ontvanger op" +NO_PUBLIC_KEYS_FOUND = "No public keys found" +NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" +NO_PRIVATE_KEY_FOUND = "No private key found" +NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +UNVERIFIRED_SIGNATURE = "Unverified signature" +DECRYPTION_ERROR = "OpenPGP decryption error" +GOOD_SIGNATURE = "Good signature from %USER%" +PGP_ERROR = "OpenPGP error: %ERROR%" +SPECIFY_FROM_EMAIL = "Please specify FROM email address" +SPECIFY_AT_LEAST_ONE_RECIPIENT = "Please specify at least one recipient" [NOTIFICATIONS] -INVALID_TOKEN = "Ongeldige token" -AUTH_ERROR = "Authenticatie mislukt" -ACCESS_ERROR = "Toegangsfout" -CONNECTION_ERROR = "Kan geen verbinding maken met de Server" -CAPTCHA_ERROR = "Onjuiste CAPTCHA" -SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail adres en wachtwoord en schakel deze functie in in het account instellingen menu." -SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail adres en wachtwoord en schakel deze functie in in het account instellingen menu." -SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail adres en wachtwoord en schakel deze functie in in het account instellingen menu." -DOMAIN_NOT_ALLOWED = "Domein is niet toegestaan" -ACCOUNT_NOT_ALLOWED = "Account is niet toegestaan" -ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "2-Stap verificatie vereist" -ACCOUNT_TWO_FACTOR_AUTH_ERROR = "2-Stap verificatie fout" -COULD_NOT_SAVE_NEW_PASSWORD = "Nieuwe wachtwoord kon niet opgeslagen worden" -CURRENT_PASSWORD_INCORRECT = "Huidig wachtwoord onjuist" -NEW_PASSWORD_SHORT = "Wachtwoord is te kort" -NEW_PASSWORD_WEAK = "Wachtwoord is te makkelijk" -NEW_PASSWORD_FORBIDDENT = "Wachtwoord bevat verboden tekens" -CONTACTS_SYNC_ERROR = "Contactpersonen synchronisatie fout" -CANT_GET_MESSAGE_LIST = "Berichtenlijst kan niet worden opgehaald" -CANT_GET_MESSAGE = "Bericht kan niet worden opgehaald" -CANT_DELETE_MESSAGE = "Kan bericht niet verwijderen" -CANT_MOVE_MESSAGE = "Kan bericht niet verplaatsen" -CANT_SAVE_MESSAGE = "Kan bericht niet opslaan" -CANT_SEND_MESSAGE = "Kan bericht niet verzenden" -INVALID_RECIPIENTS = "Onjuiste ontvangers" -CANT_SAVE_FILTERS = "Kan filters niet opslaan" -CANT_GET_FILTERS = "Kan filters niet ophalen" -FILTERS_ARE_NOT_CORRECT = "Filters zijn onjuist" -CANT_CREATE_FOLDER = "Kan map niet aanmaken" -CANT_RENAME_FOLDER = "Kan map niet hernoemen" -CANT_DELETE_FOLDER = "Kan map niet verwijderen" -CANT_DELETE_NON_EMPTY_FOLDER = "Een niet lege map kan niet verwijderd worden" -CANT_SUBSCRIBE_FOLDER = "Kan niet abonneren op folder" -CANT_UNSUBSCRIBE_FOLDER = "Kan abonnement op folder niet opzeggen" -CANT_SAVE_SETTINGS = "Instellingen kunnen niet opgeslagen worden" -CANT_SAVE_PLUGIN_SETTINGS = "Instellingen kunnen niet opgeslagen worden" -DOMAIN_ALREADY_EXISTS = "Domein bestaat reeds" -CANT_INSTALL_PACKAGE = "Package installeren mislukt" -CANT_DELETE_PACKAGE = "Package verwijderen mislukt" -INVALID_PLUGIN_PACKAGE = "Ongeldig plug-in package" -UNSUPPORTED_PLUGIN_PACKAGE = "Niet ondersteund plug-in package" -LICENSING_SERVER_IS_UNAVAILABLE = "Licentie Server is niet beschikbaar" -LICENSING_DOMAIN_EXPIRED = "Licentie voor dit domein is verlopen" -LICENSING_DOMAIN_BANNED = "Licentie voor dit domein is verboden" -DEMO_SEND_MESSAGE_ERROR = "Vanwege beveiliging is het niet toegestaan dat deze demo account e-mail naar extern verzend!" -DEMO_ACCOUNT_ERROR = "Vanwege beveiliging is deze actie niet toegestaan voor deze account!" -ACCOUNT_ALREADY_EXISTS = "Account bestaat al" -MAIL_SERVER_ERROR = "Fout bij toegang tot de mail Server" -INVALID_INPUT_ARGUMENT = "Ongeldig invoer argument" -UNKNOWN_ERROR = "Er is een onbekende fout opgetreden" +INVALID_TOKEN = "Invalid token" +AUTH_ERROR = "Authentication failed" +ACCESS_ERROR = "Access error" +CONNECTION_ERROR = "Can't connect to server" +CAPTCHA_ERROR = "Incorrect CAPTCHA." +SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings." +SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings." +SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings." +DOMAIN_NOT_ALLOWED = "Domain is not allowed" +ACCOUNT_NOT_ALLOWED = "Account is not allowed" +ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Two factor verification required" +ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Two factor verification error" +COULD_NOT_SAVE_NEW_PASSWORD = "Could not save new password" +CURRENT_PASSWORD_INCORRECT = "Current password incorrect" +NEW_PASSWORD_SHORT = "Password is too short" +NEW_PASSWORD_WEAK = "Password is too easy" +NEW_PASSWORD_FORBIDDENT = "Password contains forbidden characters" +CONTACTS_SYNC_ERROR = "Contacts synchronization error" +CANT_GET_MESSAGE_LIST = "Can't get message list" +CANT_GET_MESSAGE = "Can't get message" +CANT_DELETE_MESSAGE = "Can't delete message" +CANT_MOVE_MESSAGE = "Can't move message" +CANT_SAVE_MESSAGE = "Can't save message" +CANT_SEND_MESSAGE = "Can't send message" +INVALID_RECIPIENTS = "Invalid recipients" +CANT_SAVE_FILTERS = "Can't save filters" +CANT_GET_FILTERS = "Can't get filters" +FILTERS_ARE_NOT_CORRECT = "Filters are not correct" +CANT_CREATE_FOLDER = "Can't create folder" +CANT_RENAME_FOLDER = "Can't rename folder" +CANT_DELETE_FOLDER = "Can't delete folder" +CANT_DELETE_NON_EMPTY_FOLDER = "Can't delete non-empty directory" +CANT_SUBSCRIBE_FOLDER = "Can't subscribe folder" +CANT_UNSUBSCRIBE_FOLDER = "Can't unsubscribe folder" +CANT_SAVE_SETTINGS = "Can't save settings" +CANT_SAVE_PLUGIN_SETTINGS = "Can't save settings" +DOMAIN_ALREADY_EXISTS = "Domain already exists" +CANT_INSTALL_PACKAGE = "Failed to install package" +CANT_DELETE_PACKAGE = "Failed to remove package" +INVALID_PLUGIN_PACKAGE = "Invalid plugin package" +UNSUPPORTED_PLUGIN_PACKAGE = "Unsupported plugin package" +LICENSING_SERVER_IS_UNAVAILABLE = "Subscription server is unvailable" +LICENSING_DOMAIN_EXPIRED = "Subscription for this domain has expired." +LICENSING_DOMAIN_BANNED = "Subscription for this domain is banned." +DEMO_SEND_MESSAGE_ERROR = "For security purposes, this account is not allowed to send messages to external e-mail addresses!" +DEMO_ACCOUNT_ERROR = "For security purposes, this account is not allowed for this action!" +ACCOUNT_ALREADY_EXISTS = "Account already exists" +MAIL_SERVER_ERROR = "An error has occured while accessing mail server" +INVALID_INPUT_ARGUMENT = "Invalid input argument" +UNKNOWN_ERROR = "Unknown error" [STATIC] -BACK_LINK = "Opnieuw laden" -DOMAIN_LIST_DESC = "Lijst van webmail domeinen die toegankelijk zijn" -PHP_EXSTENSIONS_ERROR_DESC = "Vereiste PHP extensies zijn niet beschikbaar in uw PHP configuratie!" -PHP_VERSION_ERROR_DESC = "Uw PHP versie (%VERSION%) is lager dan de minimaal vereiste 5.3.0!" -NO_SCRIPT_TITLE = "JavaScript is benodigd voor deze applicatie" -NO_SCRIPT_DESC = "JavaScript ondersteuning is niet beschikbaar in uw browser. -Gelieve Javascript in te schakelen en opnieuw te proberen." -NO_COOKIE_TITLE = "Cookies ondersteuning is nodig voor deze applicatie" -NO_COOKIE_DESC = "Cookies ondersteuning is niet beschikbaar in uw browser. -Gelieve Cookies in te schakelen en opnieuw te proberen." -BAD_BROWSER_TITLE = "Uw browser is verouderd" -BAD_BROWSER_DESC = "Om alle functies van deze applicatie te gebruiken, -download en installeer een van de volgende browsers:" +BACK_LINK = "Reload" +DOMAIN_LIST_DESC = "List of domains webmail is allowed to access." +PHP_EXSTENSIONS_ERROR_DESC = "Required PHP extension are not available in your PHP configuration!" +PHP_VERSION_ERROR_DESC = "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" +NO_SCRIPT_TITLE = "JavaScript is required for this application." +NO_SCRIPT_DESC = "JavaScript support is not available in your browser. +Please enable JavaScript support in your browser settings and retry." +NO_COOKIE_TITLE = "Cookies support is required for this application." +NO_COOKIE_DESC = "Cookies support is not available in your browser. +Please enable Cookie support in your browser settings and retry." +BAD_BROWSER_TITLE = "Your browser is outdated." +BAD_BROWSER_DESC = "To use all the features of the application, +download and install one of these browsers:" diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index 3d94921f8..f1be023a9 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Klikk på en e-post for å lese" PGP_PASSWORD_INPUT_PLACEHOLDER = "Passord" PGP_SIGNED_MESSAGE_DESC = "OpenPGP-signert melding (klikk for å verifisere)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP-kryptert melding (klikk for å dekryptere)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Lesebekreftelse (meldingen er lest) - %SUBJECT%" @@ -551,6 +554,9 @@ RENAMING_PROCESS = "Endre navn på en mappe" DELETING_ASK = "Er du sikker?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Kontoer" @@ -709,4 +715,4 @@ NO_COOKIE_DESC = "Cookies-støtte er ikke tilgjengelig i nettleseren din . Vennligst aktiver Cookie-støtte i nettleserens innstillinger, og prøv på nytt ." BAD_BROWSER_TITLE = "Nettleseren din er utdatert." BAD_BROWSER_DESC = "Hvis du vil bruke alle funksjonene i programmet, -last ned og installerer en av disse nettleserne:" \ No newline at end of file +last ned og installerer en av disse nettleserne:" diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index 7e22c9237..5bdb1b370 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Wybierz wiadomość z listy w celu jej wyświetlenia" PGP_PASSWORD_INPUT_PLACEHOLDER = "Hasło" PGP_SIGNED_MESSAGE_DESC = "Wiadomość podpisana za pomocą OpenPGP (kliknij, aby zweryfikować)" PGP_ENCRYPTED_MESSAGE_DESC = "Wiadomość zaszyfrowana za pomocą OpenPGP (kliknij, aby odszyfrować)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Potwierdzenie odbioru (wyświetlenia) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Zmiana nazwy folderu" DELETING_ASK = "Czy na pewno usunąć?" TO_MANY_FOLDERS_DESC_1 = "Masz za dużo folderów!" TO_MANY_FOLDERS_DESC_2 = "Pokazaliśmy tylko część z nich aby uniknąć problemów z wydajnością." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Lista kont" diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index 2ef48d5bd..04725a26b 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Selecione uma mensagem para visualizá-la aqui." PGP_PASSWORD_INPUT_PLACEHOLDER = "Senha" PGP_SIGNED_MESSAGE_DESC = "Mensagem assinada com OpenPGP (clique para verificar)" PGP_ENCRYPTED_MESSAGE_DESC = "Mensagem criptografada com OpenPGP (clique para descriptografar)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Aviso de recepção (Visualizada) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renomeando a pasta" DELETING_ASK = "Você tem certeza?" TO_MANY_FOLDERS_DESC_1 = "Você possui muitas pastas!" TO_MANY_FOLDERS_DESC_2 = "Mostraremos apenas uma parte delas, para evitar problemas de desempenho." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Lista de contas" diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index ac2bcc778..61c813ae2 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Selecione uma mensagem na lista para ver o conteúdo aqui." PGP_PASSWORD_INPUT_PLACEHOLDER = "Palavra-passe" PGP_SIGNED_MESSAGE_DESC = "Mensagem assinada com OpenPGP (clique para verificar)" PGP_ENCRYPTED_MESSAGE_DESC = "Mensagem encriptada com OpenPGP (clique para desencriptar)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Recibo de leitura (apresentado) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Renomear a pasta" DELETING_ASK = "Tem a certeza?" TO_MANY_FOLDERS_DESC_1 = "Você tem demasiadas pastas!" TO_MANY_FOLDERS_DESC_2 = "Apenas apresentámos parte delas, para evitar problemas de desempenho." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Lista de contas" diff --git a/rainloop/v/0.0.0/langs/ro.ini b/rainloop/v/0.0.0/langs/ro.ini index 81e5e205f..f265a452d 100644 --- a/rainloop/v/0.0.0/langs/ro.ini +++ b/rainloop/v/0.0.0/langs/ro.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Selectați un mesaj pentru al vizualiza." PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Mesajul dumneavoastră a fost citit - %SUBJECT%" @@ -551,6 +554,9 @@ RENAMING_PROCESS = "Redenumesc dosarul" DELETING_ASK = "Sunteți sigur?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Lista de Conturi" @@ -709,4 +715,4 @@ NO_COOKIE_DESC = "Aparent, Cookie sau nu este acceptat de browser-ul dvs. sau op Întoarceți Cookie, schimband optiunile browserului dvs., apoi încercați din nou." BAD_BROWSER_TITLE = "Browser-ul dvs. este depășit." BAD_BROWSER_DESC = "Pentru a utiliza toate caracteristicile cererii, -descărcați și instalați unul dintre aceste browsere:" \ No newline at end of file +descărcați și instalați unul dintre aceste browsere:" diff --git a/rainloop/v/0.0.0/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini index bf7a2f281..1626f5eb0 100644 --- a/rainloop/v/0.0.0/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Выберите сообщение для просмотр PGP_PASSWORD_INPUT_PLACEHOLDER = "Пароль" PGP_SIGNED_MESSAGE_DESC = "OpenPGP подписанное сообщение (нажмите, чтобы подтвердить)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP шифрованное сообщение (нажмите, чтобы расшифровать)" +LINK_DOWNLOAD_AS_ZIP = "Сохранить как zip" +LINK_SAVE_TO_OWNCLOUD = "Сохранить в ownCloud" +LINK_SAVE_TO_DROPBOX = "Сохранить в Dropbox" [READ_RECEIPT] SUBJECT = "Уведомление о прочтении письма - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Переименование папки" DELETING_ASK = "Точно?" TO_MANY_FOLDERS_DESC_1 = "У вас слишком много папок!" TO_MANY_FOLDERS_DESC_2 = "Мы показали только часть из них, чтобы избежать проблем с производительностью." +HELP_DELETE_FOLDER = "Удалить папку" +HELP_SHOW_HIDE_FOLDER = "Показывать/прятать папку" +HELP_SHOW_HIDE_FOLDER_COUNT = "Показывать/прятать количество сообщений в папке" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Список Аккаунтов" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "По-видимому, Cookie либо не поддержив Включите Cookie, изменив настройки браузера, затем повторите попытку." BAD_BROWSER_TITLE = "Ваш браузер устарел." BAD_BROWSER_DESC = "Чтобы использовать все возможности приложения, -загрузите и установите один из этих браузеров:" \ No newline at end of file +загрузите и установите один из этих браузеров:" diff --git a/rainloop/v/0.0.0/langs/sk.ini b/rainloop/v/0.0.0/langs/sk.ini index 34cdd15a0..3b43c2c58 100644 --- a/rainloop/v/0.0.0/langs/sk.ini +++ b/rainloop/v/0.0.0/langs/sk.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Vyberte správu zo zoznamu pre jej zobrazenie tu." PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Premenovávam prečinok" DELETING_ASK = "Ste si istý?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Zoznam účtov" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Váš internetový prehliadač nepodporuje Cookies. Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova." BAD_BROWSER_TITLE = "Používate zastaralý internetový prehliadač." BAD_BROWSER_DESC = "Aby ste mohli využívať všetky funkcie tejto aplikácie, -použite niektorý z nasledujúcich internetových prehliadačov:" \ No newline at end of file +použite niektorý z nasledujúcich internetových prehliadačov:" diff --git a/rainloop/v/0.0.0/langs/sv.ini b/rainloop/v/0.0.0/langs/sv.ini index d04928ae7..eff3f163e 100644 --- a/rainloop/v/0.0.0/langs/sv.ini +++ b/rainloop/v/0.0.0/langs/sv.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Välj meddelande i listan att visa här." PGP_PASSWORD_INPUT_PLACEHOLDER = "Lösenord" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signerat meddelande (klicka för att verifiera)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP krypterat meddelande (klicka för att dekryptera)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Mottagar kvitto (visad) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Byter namn på en mapp" DELETING_ASK = "Är du säker?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Kontolista" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Kakstöd är inte tillgängligt i webbläsaren. Aktivera kakstöd och försök igen." BAD_BROWSER_TITLE = "Webbläsaren är för gammal." BAD_BROWSER_DESC = "För att använda funktioner i denna applikation, -ladda ner och installera någon av följande webbläsare:" \ No newline at end of file +ladda ner och installera någon av följande webbläsare:" diff --git a/rainloop/v/0.0.0/langs/tr.ini b/rainloop/v/0.0.0/langs/tr.ini index 457bf2dd5..017ec19fb 100644 --- a/rainloop/v/0.0.0/langs/tr.ini +++ b/rainloop/v/0.0.0/langs/tr.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Burada görüntülemek için listeden mesaj seçin." PGP_PASSWORD_INPUT_PLACEHOLDER = "Şifre" PGP_SIGNED_MESSAGE_DESC = "OpenPGP imzalı mesaj (onay için tıklayın)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP şifreli mesaj (çözmek için tıklayın)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -550,6 +553,9 @@ RENAMING_PROCESS = "Klasör değiştiriliyor" DELETING_ASK = "Eminmisiniz?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Hesap Listesi" @@ -708,4 +714,4 @@ NO_COOKIE_DESC = "Çerezler destek tarayıcınızda mevcut değil. Tarayıcı ayarlarında Cookie desteği etkinleştirin ve yeniden deneyin." BAD_BROWSER_TITLE = "Tarayıcınız çok eski." BAD_BROWSER_DESC = "Uygulamanın tüm özelliklerini kullanmak için, -Bu tarayıcılardan birini indirmek ve yükleyin:" \ No newline at end of file +Bu tarayıcılardan birini indirmek ve yükleyin:" diff --git a/rainloop/v/0.0.0/langs/ua.ini b/rainloop/v/0.0.0/langs/ua.ini index 4ac09335d..6d696cb48 100644 --- a/rainloop/v/0.0.0/langs/ua.ini +++ b/rainloop/v/0.0.0/langs/ua.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "Выберіть повідомлення для перег PGP_PASSWORD_INPUT_PLACEHOLDER = "Пароль" PGP_SIGNED_MESSAGE_DESC = "OpenPGP підписане повідомлення (натисніть, щоб підтвердити)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP шифроване повідомлення (натисніть, щоб розшифрувати)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Сповіщення про прочитання цього повідомлення - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "Перейменування теки" DELETING_ASK = "Впевнені?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Список акаунтів" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "Здається, Cookie або не підтримуютьс Увімкніть Cookie, змінив налаштівання браузера, і спробуйте знову." BAD_BROWSER_TITLE = "Ваш браузер застарів." BAD_BROWSER_DESC = "Щоб використовувати всі можливості додатку, -завантажте і встановіть один з цих браузерів:" \ No newline at end of file +завантажте і встановіть один з цих браузерів:" diff --git a/rainloop/v/0.0.0/langs/zh-cn.ini b/rainloop/v/0.0.0/langs/zh-cn.ini index f4826d416..bf69baaba 100644 --- a/rainloop/v/0.0.0/langs/zh-cn.ini +++ b/rainloop/v/0.0.0/langs/zh-cn.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "在此查看列表中选中的邮件。" PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "文件夹重命名" DELETING_ASK = "确定?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "账户列表" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "您的浏览器不支持Cookies。 请启用浏览器的Cookies支持并重试。" BAD_BROWSER_TITLE = "您的浏览器过时了" BAD_BROWSER_DESC = "为了使用所有特性, -下载并安装其中一款浏览器:" \ No newline at end of file +下载并安装其中一款浏览器:" diff --git a/rainloop/v/0.0.0/langs/zh-tw.ini b/rainloop/v/0.0.0/langs/zh-tw.ini index 7d9bf5b42..a2a03f391 100644 --- a/rainloop/v/0.0.0/langs/zh-tw.ini +++ b/rainloop/v/0.0.0/langs/zh-tw.ini @@ -150,6 +150,9 @@ MESSAGE_VIEW_DESC = "在此查看列表中選中的郵件。" PGP_PASSWORD_INPUT_PLACEHOLDER = "Password" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "Download as zip" +LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" +LINK_SAVE_TO_DROPBOX = "Save to Dropbox" [READ_RECEIPT] SUBJECT = "Return Receipt (displayed) - %SUBJECT%" @@ -552,6 +555,9 @@ RENAMING_PROCESS = "資料夾重命名" DELETING_ASK = "確定?" TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." +HELP_DELETE_FOLDER = "Delete folder" +HELP_SHOW_HIDE_FOLDER = "Show/hide folder" +HELP_SHOW_HIDE_FOLDER_COUNT = "Show/hide folder message count" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "帳戶列表" @@ -710,4 +716,4 @@ NO_COOKIE_DESC = "您的瀏覽器不支持Cookies。 請啟用瀏覽器的Cookies支持並重試。" BAD_BROWSER_TITLE = "您的瀏覽器過時了" BAD_BROWSER_DESC = "為了使用所有特性, -下載並安裝其中一款瀏覽器:" \ No newline at end of file +下載並安裝其中一款瀏覽器:" diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.eot b/rainloop/v/0.0.0/static/css/fonts/rainloop.eot index cb64d4537061e1aebe658a89c5240c65c65b531e..d2bf0d5418bcabc87a4f168ae35fbb4b326b1671 100644 GIT binary patch delta 607 zcmY+A&1(~35XNWr+J$CyF}8mIP?i8dD^6JjXafT%eI^~9zM3*qFUuPMc%AgMO5Jw0V@GZP z2yZCNIoox5JrK$Nf#!j^+RE*A?DZaiyakZox-)B6#ZOMp(@Xk6CjBbNo@m zAvH6W7)!(zrm)bkI;@(xY%Uw(GR_AXE=?Ms+f-OUo?%RvhvejC<&dJYcqlw-Troz& zq2I-f9x>Ao(&oj8{;P`M(G{7v!vxC7X<3fQO3?Zb;`9@O{xTfyE?NSLCQNwCg_D9g p;k65o>9dl>ZvrlL)k`fgpe)VbwbHpWUZ>X delta 442 zcmX>xlkv-RMz$~B3=BTr6WPpI_Sruxo#;@JQuxzjBLjoC0RsbrjJu1g8^dA-HXvUB z$XDIGT;SdcwBnolo6S!=W-z;foWj5e3?L@3sUQ<2z+xaiGeaqm1bP|bMz9Ko^Kr+1 Jfm9%S1OU1-Wsv{? diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.svg b/rainloop/v/0.0.0/static/css/fonts/rainloop.svg index 3357f3364..cc66a0e77 100644 --- a/rainloop/v/0.0.0/static/css/fonts/rainloop.svg +++ b/rainloop/v/0.0.0/static/css/fonts/rainloop.svg @@ -122,4 +122,5 @@ + diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.ttf b/rainloop/v/0.0.0/static/css/fonts/rainloop.ttf index 3cc1d79cc064c24b7833497d2d17bfd92e686cbd..09186ead5ced56fdc813ec9d5d3b92e5e0ace302 100644 GIT binary patch delta 636 zcmY+COK1~O6o${4nLCrYxmwAX19U;w*IGQlv;|(QRBP_}I8`p{!O9Deu}fOPRH+cH z*5+EiC*J#{S4nTq%$6-@&&m{l#DOn0tJQ!tq{rbw(!+JDR(Xso*8oh1YD5mF4iU=@cAX!ozsQ9>a6kbnl@T_v_r^Q}kD$ z-vn@k6o&#J;Q*a7NTjLX+ot_m*un*OUG$;dl|BhWAKmB7n`?`pgN|M7f(8i~qZcaj z-bfN-=^SQ^AL>N6U;T3_1w%&aYRWhg3jV%@aQ7l3ZYO~(G09knDPHqGh|{+S`pa>->tjpYg`| M7vHJ!Pv#E(1oLx*jQ{`u delta 403 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�%Fnur%6rjw@5G_ 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 aTKNtgRl!&F-|JrxDh9#gd&1&CApaL7M{(c) literal 13492 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 p;k65o>9dl>ZvrlL)k`fgpe)VbwbHpWUZ>X delta 442 zcmX>xlkv-RMz$~B3=BTr6WPpI_Sruxo#;@JQuxzjBLjoC0RsbrjJu1g8^dA-HXvUB z$XDIGT;SdcwBnolo6S!=W-z;foWj5e3?L@3sUQ<2z+xaiGeaqm1bP|bMz9Ko^Kr+1 Jfm9%S1OU1-Wsv{? diff --git a/vendors/fontastic/fonts/rainloop.svg b/vendors/fontastic/fonts/rainloop.svg index 3357f3364..cc66a0e77 100644 --- a/vendors/fontastic/fonts/rainloop.svg +++ b/vendors/fontastic/fonts/rainloop.svg @@ -122,4 +122,5 @@ + diff --git a/vendors/fontastic/fonts/rainloop.ttf b/vendors/fontastic/fonts/rainloop.ttf index 3cc1d79cc064c24b7833497d2d17bfd92e686cbd..09186ead5ced56fdc813ec9d5d3b92e5e0ace302 100644 GIT binary patch delta 636 zcmY+COK1~O6o${4nLCrYxmwAX19U;w*IGQlv;|(QRBP_}I8`p{!O9Deu}fOPRH+cH z*5+EiC*J#{S4nTq%$6-@&&m{l#DOn0tJQ!tq{rbw(!+JDR(Xso*8oh1YD5mF4iU=@cAX!ozsQ9>a6kbnl@T_v_r^Q}kD$ z-vn@k6o&#J;Q*a7NTjLX+ot_m*un*OUG$;dl|BhWAKmB7n`?`pgN|M7f(8i~qZcaj z-bfN-=^SQ^AL>N6U;T3_1w%&aYRWhg3jV%@aQ7l3ZYO~(G09knDPHqGh|{+S`pa>->tjpYg`| M7vHJ!Pv#E(1oLx*jQ{`u delta 403 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�%Fnur%6rjw@5G_ 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 aTKNtgRl!&F-|JrxDh9#gd&1&CApaL7M{(c) literal 13492 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
  • +
  • +
    + +

Character mapping

    @@ -968,6 +972,10 @@ h2{font-size:18px;padding:0 0 21px 5px;margin:45px 0 0 0;text-transform:uppercas
    +
  • +
    + +
'; + $sTemplateName = \substr(\basename($sFile), 0, -5); + $aList[$sTemplateName] = $sFile; } } } - - return $sResult; } /** diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php index a32e9e965..33eae71bf 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions/OwnCloudSuggestions.php @@ -25,7 +25,7 @@ class OwnCloudSuggestions implements \RainLoop\Providers\Suggestions\ISuggestion try { if ('' === $sQuery || !$oAccount || !\RainLoop\Utils::IsOwnCloudLoggedIn() || - !\class_exists('\\OCP\\Contacts') || !\OCP\Contacts::isEnabled() + !\class_exists('OCP\Contacts') || !\OCP\Contacts::isEnabled() ) { return $aResult; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php index 1f75a9bb2..19b2cb183 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php @@ -1220,11 +1220,23 @@ class ServiceActions */ public function compileTemplates($bAdmin = false, $bJsOutput = true) { - $sHtml = - \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/Components', $this->oActions, 'Component'). - \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/'.($bAdmin ? 'Admin' : 'User'), $this->oActions). - \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/Common', $this->oActions). - $this->oActions->Plugins()->CompileTemplate($bAdmin); + $aTemplates = array(); + + \RainLoop\Utils::CompileTemplates($aTemplates, APP_VERSION_ROOT_PATH.'app/templates/Views/Components', 'Component'); + \RainLoop\Utils::CompileTemplates($aTemplates, APP_VERSION_ROOT_PATH.'app/templates/Views/'.($bAdmin ? 'Admin' : 'User')); + \RainLoop\Utils::CompileTemplates($aTemplates, APP_VERSION_ROOT_PATH.'app/templates/Views/Common'); + + $this->oActions->Plugins()->CompileTemplate($aTemplates, $bAdmin); + + $sHtml = ''; + foreach ($aTemplates as $sName => $sFile) + { + $sName = \preg_replace('/[^a-zA-Z0-9]/', '', $sName); + $sHtml .= ''; + } + + unset($aTemplates); return $bJsOutput ? 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml), $this->Logger()).';' : $sHtml; } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php index 2eebccc0c..594a2fc8e 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -48,7 +48,7 @@ class Utils define('_phpseclib_', true); } - if (!\class_exists('Crypt_RSA')) + if (!\class_exists('Crypt_RSA', false)) { include_once 'Crypt/RSA.php'; \defined('CRYPT_RSA_MODE') || \define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); @@ -470,30 +470,22 @@ class Utils } /** + * @param array $aList * @param string $sDirName - * @param \RainLoop\Actions $oAction * @param string $sNameSuffix = '' - * - * @return string */ - public static function CompileTemplates($sDirName, $oAction, $sNameSuffix = '') + public static function CompileTemplates(&$aList, $sDirName, $sNameSuffix = '') { - $sResult = ''; if (\file_exists($sDirName)) { - $aList = \RainLoop\Utils::FolderFiles($sDirName, '.html'); + $aFileList = \RainLoop\Utils::FolderFiles($sDirName, '.html'); - foreach ($aList as $sName) + foreach ($aFileList as $sName) { $sTemplateName = \substr($sName, 0, -5).$sNameSuffix; - $sResult .= ''; + $aList[$sTemplateName] = $sDirName.'/'.$sName; } - - $sResult = \trim($sResult); } - - return $sResult; } /** @@ -539,14 +531,25 @@ class Utils public static function IsOwnCloud() { return isset($_ENV['RAINLOOP_OWNCLOUD']) && $_ENV['RAINLOOP_OWNCLOUD'] && - \class_exists('\\OC'); + \class_exists('OC'); } /** * @return bool */ public static function IsOwnCloudLoggedIn() { - return self::IsOwnCloud() && \class_exists('\\OCP\\User') && \OCP\User::isLoggedIn(); + return self::IsOwnCloud() && \class_exists('OCP\User') && \OCP\User::isLoggedIn(); + } + + /** + * @param string $sV + * @param bool $bEncode = false + * + * @return string + */ + public static function UrlEncode($sV, $bEncode = false) + { + return $bEncode ? \urlencode($sV) : $sV; } /** @@ -557,7 +560,7 @@ class Utils $sAppPath = ''; if (\RainLoop\Utils::IsOwnCloud()) { - if (\class_exists('\\OC_App')) + if (\class_exists('OC_App')) { $sAppPath = \rtrim(\trim(\OC_App::getAppWebPath('rainloop')), '\\/').'/app/'; } diff --git a/rainloop/v/0.0.0/app/libraries/emogrifier/CHANGELOG.TXT b/rainloop/v/0.0.0/app/libraries/emogrifier/CHANGELOG.TXT new file mode 100644 index 000000000..55c062e72 --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/emogrifier/CHANGELOG.TXT @@ -0,0 +1,73 @@ +2012-05-01 +Made removal of invisible nodes operate in a case-insensitive manner... Thanks Juha P.! + +2012-02-07 +Fixed some recent code introductions to use class constants rather than global constants. +Fixed some recent code introductions to make it cleaner to read. + +2012-01-31 +Fixed a bug that was introduced with the 2011-12-22 revision... Thanks Sagi L. and M. Bąkowski! +Added extraction of diff --git a/rainloop/v/0.0.0/app/templates/Themes/template.less b/rainloop/v/0.0.0/app/templates/Themes/template.less index bd4b0bec8..570df86a5 100644 --- a/rainloop/v/0.0.0/app/templates/Themes/template.less +++ b/rainloop/v/0.0.0/app/templates/Themes/template.less @@ -59,12 +59,15 @@ } .thm-login { - color: @login-color !important; border: @login-border !important; .thm-rgba-background-color(@login-background-color, @login-rgba-background-color); .thm-linear-gradient-mixin(@login-gradient-start, @login-gradient-end); .thm-border-radius(@login-border-radius); .thm-box-shadow(@login-box-shadow); +} + +.thm-login-text { + color: @login-color !important; .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { color: @login-color !important; diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminLogin.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminLogin.html index 1dc30c7c2..ab0051716 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminLogin.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminLogin.html @@ -5,7 +5,7 @@
-
\ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html index 52803486a..2b2c7d611 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html @@ -4,17 +4,19 @@
- + +    +
+ +



diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html index 341ac972f..fdf385d41 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsTemplates.html @@ -14,31 +14,35 @@


- - - - - - - - - - - - - -
- - -    - - - - - - - - - -
+
+
+ + + + + + + + + + + + + +
+ + +    + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/rainloop/v/0.0.0/include.php b/rainloop/v/0.0.0/include.php index f31a560e1..1d438b2e2 100644 --- a/rainloop/v/0.0.0/include.php +++ b/rainloop/v/0.0.0/include.php @@ -70,7 +70,7 @@ Options -Indexes define('APP_DATA_FOLDER_PATH_UNIX', str_replace('\\', '/', APP_DATA_FOLDER_PATH)); $sSalt = @file_get_contents(APP_DATA_FOLDER_PATH.'SALT.php'); - $sData = @file_get_contents(APP_DATA_FOLDER_PATH.'DATA.php'); + $sData = file_exists(APP_DATA_FOLDER_PATH.'DATA.php') ? @file_get_contents(APP_DATA_FOLDER_PATH.'DATA.php') : ''; $sInstalled = @file_get_contents(APP_DATA_FOLDER_PATH.'INSTALLED'); // installation checking data folder @@ -129,29 +129,20 @@ Options -Indexes unset($sCheckName, $sCheckFilePath, $sCheckFolder, $sTest); } - if (false === $sSalt || false === $sData) + if (false === $sSalt) { - if (false === $sSalt) - { - // random salt - $sSalt = '<'.'?php //' - .md5(microtime(true).rand(1000, 5000)) - .md5(microtime(true).rand(5000, 9999)) - .md5(microtime(true).rand(1000, 5000)); + // random salt + $sSalt = '<'.'?php //' + .md5(microtime(true).rand(1000, 5000)) + .md5(microtime(true).rand(5000, 9999)) + .md5(microtime(true).rand(1000, 5000)); - @file_put_contents(APP_DATA_FOLDER_PATH.'SALT.php', $sSalt); - } - - if (false === $sData) - { - // random data folder name - $sData = '<'.'?php //'.md5(microtime(true).rand(1000, 9999)); - @file_put_contents(APP_DATA_FOLDER_PATH.'DATA.php', $sData); - } + @file_put_contents(APP_DATA_FOLDER_PATH.'SALT.php', $sSalt); } define('APP_SALT', md5($sSalt.APP_PRIVATE_DATA_NAME.$sSalt)); - define('APP_PRIVATE_DATA', APP_DATA_FOLDER_PATH.'_data_'.md5($sData).'/'.APP_PRIVATE_DATA_NAME.'/'); + define('APP_PRIVATE_DATA', APP_DATA_FOLDER_PATH.'_data_'.($sData ? md5($sData) : '').'/'.APP_PRIVATE_DATA_NAME.'/'); + define('APP_PLUGINS_PATH', APP_PRIVATE_DATA.'plugins/'); if (APP_VERSION !== $sInstalled || (APP_MULTIPLY && !@is_dir(APP_PRIVATE_DATA))) diff --git a/rainloop/v/0.0.0/langs/bg.ini b/rainloop/v/0.0.0/langs/bg.ini index 68434e2ea..37b1f11c0 100644 --- a/rainloop/v/0.0.0/langs/bg.ini +++ b/rainloop/v/0.0.0/langs/bg.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Двустъпков тест за удостоверяване" LABEL_CODE = "Код" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index e6fd362fa..42742f178 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -319,6 +319,12 @@ BUTTON_SIGN = "Podepsat" BUTTON_ENCRYPT = "Šifrovat" BUTTON_SIGN_AND_ENCRYPT = "Podepsat a šifrovat" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Dvoufázové ověření" LABEL_CODE = "Kód" @@ -600,6 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generovat OpenPGP Klíče" TITLE_PRIVATE = "Soukromý" TITLE_PUBLIC = "Veřejný" DELETING_ASK = "Opravdu to chcete?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Klávesové zkratky" diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index e032f5428..66942ab50 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Unterschreiben" BUTTON_ENCRYPT = "Verschlüsseln" BUTTON_SIGN_AND_ENCRYPT = "Unterschreiben und verschlüsseln" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Zwei-Faktor-Authentifizierung" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP-Schlüssel generieren" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Öffentlich" DELETING_ASK = "Sind Sie sicher?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tastaturkürzel-Hilfe" diff --git a/rainloop/v/0.0.0/langs/en-gb.ini b/rainloop/v/0.0.0/langs/en-gb.ini index d53e0a58d..299ae866c 100644 --- a/rainloop/v/0.0.0/langs/en-gb.ini +++ b/rainloop/v/0.0.0/langs/en-gb.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/en.ini b/rainloop/v/0.0.0/langs/en.ini index fe8aa5ca9..299ae866c 100644 --- a/rainloop/v/0.0.0/langs/en.ini +++ b/rainloop/v/0.0.0/langs/en.ini @@ -607,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini index b47cfc1ca..1622ed3fc 100644 --- a/rainloop/v/0.0.0/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Firmar" BUTTON_ENCRYPT = "Encriptar" BUTTON_SIGN_AND_ENCRYPT = "Firmar and encriptar" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Prueba de verificación de 2 pasos" LABEL_CODE = "Código" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generar llaves OpenPGP" TITLE_PRIVATE = "Privado" TITLE_PUBLIC = "Público" DELETING_ASK = "¿Está usted seguro?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ayuda de atajos de teclado" diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index 83b768154..4593a71b0 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Signer" BUTTON_ENCRYPT = "Chiffrer" BUTTON_SIGN_AND_ENCRYPT = "Signer et chiffrer" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Test d'authentification en deux étapes" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Générer les clefs OpenPGP" TITLE_PRIVATE = "Privé" TITLE_PUBLIC = "Public" DELETING_ASK = "Êtes-vous sûr ?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Aide pour les raccourcis clavier" diff --git a/rainloop/v/0.0.0/langs/hu.ini b/rainloop/v/0.0.0/langs/hu.ini index 40f65c851..21ead746c 100644 --- a/rainloop/v/0.0.0/langs/hu.ini +++ b/rainloop/v/0.0.0/langs/hu.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Aláírás" BUTTON_ENCRYPT = "Titkosítás" BUTTON_SIGN_AND_ENCRYPT = "Aláírás és titkosítás" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-lépés hitelesítés teszt" LABEL_CODE = "Kód" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP kulcs generálás" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini index f4c99a53c..9437d1ff6 100644 --- a/rainloop/v/0.0.0/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index 430bac847..c5b89541a 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Firma" BUTTON_ENCRYPT = "Cifra" BUTTON_SIGN_AND_ENCRYPT = "Firma e cifra" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Verifica a 2 fattori" LABEL_CODE = "Codice" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Genera chiave OpenPGP" TITLE_PRIVATE = "Privata" TITLE_PUBLIC = "Pubblica" DELETING_ASK = "Sei sicuro?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Aiuto sulle scorciatoie da tastiera" diff --git a/rainloop/v/0.0.0/langs/ja-jp.ini b/rainloop/v/0.0.0/langs/ja-jp.ini index f1e394e74..49b3d5630 100644 --- a/rainloop/v/0.0.0/langs/ja-jp.ini +++ b/rainloop/v/0.0.0/langs/ja-jp.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/ko-kr.ini b/rainloop/v/0.0.0/langs/ko-kr.ini index fa6ad1d95..3b143f22d 100644 --- a/rainloop/v/0.0.0/langs/ko-kr.ini +++ b/rainloop/v/0.0.0/langs/ko-kr.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -598,6 +604,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index 55d3a6ea6..9861eeb75 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Pasirašyti" BUTTON_ENCRYPT = "Šifruoti" BUTTON_SIGN_AND_ENCRYPT = "Pasirašyti ir šifruoti" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-jų žingsnių patikrinimo bandymas" LABEL_CODE = "Kodas" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Sukurti OpenPGP raktus" TITLE_PRIVATE = "Privatus" TITLE_PUBLIC = "Viešas" DELETING_ASK = "Jūs įsitikinę?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Sparčiųjų klavišų pagalba" diff --git a/rainloop/v/0.0.0/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini index 97b32023d..c7f1a4a9b 100644 --- a/rainloop/v/0.0.0/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index 6dd376ef4..52dadcc1a 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Ondertekenen" BUTTON_ENCRYPT = "Versleutelen" BUTTON_SIGN_AND_ENCRYPT = "Ondertekenen en versleutelen" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Stap verificatie test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Genereer OpenPGP sleutels" TITLE_PRIVATE = "Privé sleutel" TITLE_PUBLIC = "Publieke sleutel" DELETING_ASK = "Weet u het zeker?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Hulp bij toetsenbord sneltoetsen" diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index 0ce87263f..b9ca5977e 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -319,6 +319,12 @@ BUTTON_SIGN = "Signer" BUTTON_ENCRYPT = "Krypter" BUTTON_SIGN_AND_ENCRYPT = "Signer og krypter" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-stegs verifiseringstest" LABEL_CODE = "Kode" @@ -600,6 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generer OpenPGP-nøkler" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Offentlig" DELETING_ASK = "Er du sikker?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tastatursnarveier" diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index 99c2410d0..27bd84a7b 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Podpisz" BUTTON_ENCRYPT = "Szyfruj" BUTTON_SIGN_AND_ENCRYPT = "Podpisz i szyfruj" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Test autoryzacji dwuskładnikowej" LABEL_CODE = "Kod" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj klucz OpenPGP" TITLE_PRIVATE = "Prywatny" TITLE_PUBLIC = "Publiczny" DELETING_ASK = "Czy na pewno chcesz usunąć?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Skróty klawiaturowe" diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index 95b13403d..cde182e5e 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Assinar" BUTTON_ENCRYPT = "Criptografar" BUTTON_SIGN_AND_ENCRYPT = "Assinar e criptografar" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Testar verificação de duas etapas" LABEL_CODE = "Código" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Gerar chave OpenPGP" TITLE_PRIVATE = "Privado" TITLE_PUBLIC = "Público" DELETING_ASK = "Você tem certeza?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ajuda com os atalhos de teclado" diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index e8389bde4..4293851cd 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Assinar" BUTTON_ENCRYPT = "Encriptar" BUTTON_SIGN_AND_ENCRYPT = "Assinar e encriptar" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Teste de verificação em 2-Etapas" LABEL_CODE = "Código" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Gerar chaves OpenPGP" TITLE_PRIVATE = "Privada" TITLE_PUBLIC = "Pública" DELETING_ASK = "Tem a certeza?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ajuda para atalhos de teclado" diff --git a/rainloop/v/0.0.0/langs/ro.ini b/rainloop/v/0.0.0/langs/ro.ini index ac16663fa..bf2e49f5a 100644 --- a/rainloop/v/0.0.0/langs/ro.ini +++ b/rainloop/v/0.0.0/langs/ro.ini @@ -319,6 +319,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -600,6 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini index 8a4d3a81a..719c2a901 100644 --- a/rainloop/v/0.0.0/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Подпись" BUTTON_ENCRYPT = "Шифрование" BUTTON_SIGN_AND_ENCRYPT = "Подпись и шифрование" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Тест двухфакторной верификации" LABEL_CODE = "Код" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Новый OpenPGP ключ" TITLE_PRIVATE = "Приватный" TITLE_PUBLIC = "Публичный" DELETING_ASK = "Точно?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Сочетания клавиш" diff --git a/rainloop/v/0.0.0/langs/sk.ini b/rainloop/v/0.0.0/langs/sk.ini index 06151f11b..fdfcf753c 100644 --- a/rainloop/v/0.0.0/langs/sk.ini +++ b/rainloop/v/0.0.0/langs/sk.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Step verification test" LABEL_CODE = "Code" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate OpenPGP Keys" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Are you sure?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/sv.ini b/rainloop/v/0.0.0/langs/sv.ini index 8e7572a74..b5b34a4e1 100644 --- a/rainloop/v/0.0.0/langs/sv.ini +++ b/rainloop/v/0.0.0/langs/sv.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Singera" BUTTON_ENCRYPT = "Kryptera" BUTTON_SIGN_AND_ENCRYPT = "Signera och kryptera" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Stegs verifikations test" LABEL_CODE = "Kod" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Skapa OpenPGP nycklar" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Publik" DELETING_ASK = "Är du säker?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tangentbordsgenvägar hjälp" diff --git a/rainloop/v/0.0.0/langs/tr.ini b/rainloop/v/0.0.0/langs/tr.ini index bcf71ddc0..4f39a2960 100644 --- a/rainloop/v/0.0.0/langs/tr.ini +++ b/rainloop/v/0.0.0/langs/tr.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Giriş Yap" BUTTON_ENCRYPT = "Şifrele" BUTTON_SIGN_AND_ENCRYPT = "Giriş Yap and şifrele" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-Basamaklı doğrulama testi" LABEL_CODE = "Kod" @@ -599,6 +605,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP Key Oluştur" TITLE_PRIVATE = "Private" TITLE_PUBLIC = "Public" DELETING_ASK = "Eminmisiniz?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Klavye kısayolları yardım" diff --git a/rainloop/v/0.0.0/langs/ua.ini b/rainloop/v/0.0.0/langs/ua.ini index 459a9aba8..224e93f22 100644 --- a/rainloop/v/0.0.0/langs/ua.ini +++ b/rainloop/v/0.0.0/langs/ua.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Підпис" BUTTON_ENCRYPT = "Шифрування" BUTTON_SIGN_AND_ENCRYPT = "Підпис и шифрування" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Тест двофакторної верифікації" LABEL_CODE = "Код" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Новий OpenPGP ключ" TITLE_PRIVATE = "Приватний" TITLE_PUBLIC = "Публічний" DELETING_ASK = "Впевнені?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Сполучення клавіш" diff --git a/rainloop/v/0.0.0/langs/zh-cn.ini b/rainloop/v/0.0.0/langs/zh-cn.ini index 1fae374cc..8fad0b3f2 100644 --- a/rainloop/v/0.0.0/langs/zh-cn.ini +++ b/rainloop/v/0.0.0/langs/zh-cn.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "两步验证测试" LABEL_CODE = "代码" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "生成 OpenPGP 密匙" TITLE_PRIVATE = "私有" TITLE_PUBLIC = "公开" DELETING_ASK = "你确定吗?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/rainloop/v/0.0.0/langs/zh-tw.ini b/rainloop/v/0.0.0/langs/zh-tw.ini index d0cb7ab5f..9c4e257b2 100644 --- a/rainloop/v/0.0.0/langs/zh-tw.ini +++ b/rainloop/v/0.0.0/langs/zh-tw.ini @@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign" BUTTON_ENCRYPT = "Encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" +LABEL_KEY = "Private Key" +LABEL_PASSWORD = "Password" +BUTTON_DECRYPT = "Decrypt" + [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "兩步驗證測試" LABEL_CODE = "代碼" @@ -601,6 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "生成 OpenPGP 密鑰" TITLE_PRIVATE = "私有" TITLE_PUBLIC = "公開" DELETING_ASK = "你確定嗎?" +GENERATE_ONLY_HTTPS = "HTTPS only" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Keyboard shortcuts help" diff --git a/vendors/openpgp/openpgp-0.10.1.worker.min.js b/vendors/openpgp/openpgp-0.10.1.worker.min.js new file mode 100644 index 000000000..91e75f58e --- /dev/null +++ b/vendors/openpgp/openpgp-0.10.1.worker.min.js @@ -0,0 +1 @@ +/*! OpenPGPjs.org this is LGPL licensed code, see LICENSE/our website for more information.- v0.10.1 - 2015-02-13 */!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g Date: Sun, 5 Jul 2015 22:48:01 +0200 Subject: [PATCH 088/106] Update de.ini --- rainloop/v/0.0.0/langs/de.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index 66942ab50..5151e0589 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -607,7 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP-Schlüssel generieren" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Öffentlich" DELETING_ASK = "Sind Sie sicher?" -GENERATE_ONLY_HTTPS = "HTTPS only" +GENERATE_ONLY_HTTPS = "Nur HTTPS" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tastaturkürzel-Hilfe" From fed1531929e55362ef6b7507dcdc1c706d9cafbb Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 6 Jul 2015 00:50:06 +0400 Subject: [PATCH 089/106] Small fix --- package.json | 2 +- .../v/0.0.0/app/templates/Views/User/PopupsCompose.html | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/package.json b/package.json index 643ab9c44..9e208ed56 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.9.2", - "release": "342", + "release": "343", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html index 6af91975f..82d7ed3c5 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html @@ -149,12 +149,6 @@ -
-
-
-
-
-
From f9221f49f5bfccb9ee33ff7b67f8655c01c4da2b Mon Sep 17 00:00:00 2001 From: Tobias Strobel Date: Sun, 5 Jul 2015 22:57:25 +0200 Subject: [PATCH 090/106] Update de.ini Translated some strings to german. --- rainloop/v/0.0.0/langs/admin/de.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rainloop/v/0.0.0/langs/admin/de.ini b/rainloop/v/0.0.0/langs/admin/de.ini index 20de7d268..501891c83 100644 --- a/rainloop/v/0.0.0/langs/admin/de.ini +++ b/rainloop/v/0.0.0/langs/admin/de.ini @@ -34,7 +34,7 @@ LABEL_ALLOW_GRAVATAR = "Gravatar erlauben" LEGEND_MAIN = "Haupt" LABEL_ATTACHMENT_SIZE_LIMIT = "Größenlimit für Anhänge" LABEL_ALLOW_ADDITIONAL_ACCOUNTS = "Zusätzliche Konten erlauben" -LABEL_ALLOW_IDENTITIES = "Allow multiple identities" +LABEL_ALLOW_IDENTITIES = "Mehrere Identitäten erlauben" LABEL_ALLOW_TEMPLATES = "Vorlagen erlauben" ALERT_WARNING = "Warnung!" HTML_ALERT_WEAK_PASSWORD = "Sie verwenden das Standard-Admin-Passwort. @@ -61,8 +61,8 @@ LABEL_LOGIN_CUSTOM_CSS = "Benutzerdefiniertes CSS" LABEL_LOGIN_SHOW_POWERED_LINK = "\"Powered by RainLoop\"-Link anzeigen" LEGEND_USER = "Benutzer" LABEL_USER_LOGO = "Logo" -LABEL_USER_LOGO_TITLE = "Logo Title" -LABEL_USER_LOGO_MESSAGE = "Logo (Message View)" +LABEL_USER_LOGO_TITLE = "Logo Titel" +LABEL_USER_LOGO_MESSAGE = "Logo (Nachrichten-Ansicht)" LABEL_USER_CUSTOM_CSS = "Benutzerdefiniertes CSS" LEGEND_WELCOME_PAGE = "Willkommensseite" LABEL_WELCOME_PAGE_TITLE = "Titel" @@ -318,4 +318,4 @@ NO_COOKIE_DESC = "Ihr Browser unterstützt Cookies nicht. Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut." BAD_BROWSER_TITLE = "Ihr Browser ist veraltet." BAD_BROWSER_DESC = "Um alle Funktionen dieser Anwendung nutzen zu können, -sollten Sie einen der folgenden Browser herunterladen und installieren:" \ No newline at end of file +sollten Sie einen der folgenden Browser herunterladen und installieren:" From f9ce3b702d20da7af560c00ca9814f04b8c089f4 Mon Sep 17 00:00:00 2001 From: Skibbi Date: Mon, 6 Jul 2015 09:44:39 +0200 Subject: [PATCH 091/106] Update pl.ini --- rainloop/v/0.0.0/langs/pl.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index 27bd84a7b..ac90fa95d 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -607,7 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj klucz OpenPGP" TITLE_PRIVATE = "Prywatny" TITLE_PUBLIC = "Publiczny" DELETING_ASK = "Czy na pewno chcesz usunąć?" -GENERATE_ONLY_HTTPS = "HTTPS only" +GENERATE_ONLY_HTTPS = "Tylko HTTPS" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Skróty klawiaturowe" From d2be1aa7f5604302eb2a4983799dbc05851a42e6 Mon Sep 17 00:00:00 2001 From: Pietro Albini Date: Mon, 6 Jul 2015 10:19:21 +0200 Subject: [PATCH 092/106] Updated italian translation --- rainloop/v/0.0.0/langs/it.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index c5b89541a..3be586128 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -607,7 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Genera chiave OpenPGP" TITLE_PRIVATE = "Privata" TITLE_PUBLIC = "Pubblica" DELETING_ASK = "Sei sicuro?" -GENERATE_ONLY_HTTPS = "HTTPS only" +GENERATE_ONLY_HTTPS = "solo tramite HTTPS" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Aiuto sulle scorciatoie da tastiera" From a1d3351f2323da8c2a6f7fb4ffdee36fe4862da7 Mon Sep 17 00:00:00 2001 From: insertc0in Date: Mon, 6 Jul 2015 10:40:39 +0100 Subject: [PATCH 093/106] Update pt-pt.ini --- rainloop/v/0.0.0/langs/pt-pt.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index 4293851cd..d5f15565d 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -607,7 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Gerar chaves OpenPGP" TITLE_PRIVATE = "Privada" TITLE_PUBLIC = "Pública" DELETING_ASK = "Tem a certeza?" -GENERATE_ONLY_HTTPS = "HTTPS only" +GENERATE_ONLY_HTTPS = "Apenas HTTPS" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Ajuda para atalhos de teclado" From 9ade5a585b9b09e63c036faaddbf736a6e897cd0 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 6 Jul 2015 22:46:44 +0400 Subject: [PATCH 094/106] Clickable notifications (#745) --- dev/Common/Selector.js | 13 +++-- dev/Model/Message.js | 75 ++++++++++++++++------------ dev/Stores/User/Message.js | 27 +++++++++- dev/Stores/User/Notification.js | 16 +++++- dev/View/User/MailBox/MessageList.js | 29 +++++++++++ 5 files changed, 121 insertions(+), 39 deletions(-) diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index be7ed462c..623da8d3f 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -778,10 +778,7 @@ if (bClick) { - this.focusedItem(oItem); - this.selectedItem(oItem); - - this.scrollToFocused(); + this.selectMessageItem(oItem); } } }; @@ -791,6 +788,14 @@ this.oCallbacks[sEventName] = fCallback; }; + Selector.prototype.selectMessageItem = function (oMessageItem) + { + this.focusedItem(oMessageItem); + this.selectedItem(oMessageItem); + + this.scrollToFocused(); + }; + module.exports = Selector; }()); \ No newline at end of file diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 87fc7036c..32eda9cf1 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -781,47 +781,55 @@ */ MessageModel.prototype.populateByMessageListItem = function (oMessage) { - this.folderFullNameRaw = oMessage.folderFullNameRaw; - this.uid = oMessage.uid; - this.hash = oMessage.hash; - this.requestHash = oMessage.requestHash; - this.subject(oMessage.subject()); + if (oMessage) + { + this.folderFullNameRaw = oMessage.folderFullNameRaw; + this.uid = oMessage.uid; + this.hash = oMessage.hash; + this.requestHash = oMessage.requestHash; + this.subject(oMessage.subject()); + } + this.subjectPrefix(this.subjectPrefix()); this.subjectSuffix(this.subjectSuffix()); - this.size(oMessage.size()); - this.dateTimeStampInUTC(oMessage.dateTimeStampInUTC()); - this.priority(oMessage.priority()); + if (oMessage) + { - this.proxy = oMessage.proxy; + this.size(oMessage.size()); + this.dateTimeStampInUTC(oMessage.dateTimeStampInUTC()); + this.priority(oMessage.priority()); - this.fromEmailString(oMessage.fromEmailString()); - this.fromClearEmailString(oMessage.fromClearEmailString()); - this.toEmailsString(oMessage.toEmailsString()); - this.toClearEmailsString(oMessage.toClearEmailsString()); + this.proxy = oMessage.proxy; - this.emails = oMessage.emails; + this.fromEmailString(oMessage.fromEmailString()); + this.fromClearEmailString(oMessage.fromClearEmailString()); + this.toEmailsString(oMessage.toEmailsString()); + this.toClearEmailsString(oMessage.toClearEmailsString()); - this.from = oMessage.from; - this.to = oMessage.to; - this.cc = oMessage.cc; - this.bcc = oMessage.bcc; - this.replyTo = oMessage.replyTo; - this.deliveredTo = oMessage.deliveredTo; + this.emails = oMessage.emails; - this.unseen(oMessage.unseen()); - this.flagged(oMessage.flagged()); - this.answered(oMessage.answered()); - this.forwarded(oMessage.forwarded()); - this.isReadReceipt(oMessage.isReadReceipt()); - this.deletedMark(oMessage.deletedMark()); + this.from = oMessage.from; + this.to = oMessage.to; + this.cc = oMessage.cc; + this.bcc = oMessage.bcc; + this.replyTo = oMessage.replyTo; + this.deliveredTo = oMessage.deliveredTo; - this.priority(oMessage.priority()); + this.unseen(oMessage.unseen()); + this.flagged(oMessage.flagged()); + this.answered(oMessage.answered()); + this.forwarded(oMessage.forwarded()); + this.isReadReceipt(oMessage.isReadReceipt()); + this.deletedMark(oMessage.deletedMark()); - this.selected(oMessage.selected()); - this.checked(oMessage.checked()); - this.hasAttachments(oMessage.hasAttachments()); - this.attachmentsSpecData(oMessage.attachmentsSpecData()); + this.priority(oMessage.priority()); + + this.selected(oMessage.selected()); + this.checked(oMessage.checked()); + this.hasAttachments(oMessage.hasAttachments()); + this.attachmentsSpecData(oMessage.attachmentsSpecData()); + } this.body = null; @@ -830,7 +838,10 @@ this.sInReplyTo = ''; this.sReferences = ''; - this.threads(oMessage.threads()); + if (oMessage) + { + this.threads(oMessage.threads()); + } this.computeSenderEmail(); diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index df2be5ecf..718ba6310 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -279,7 +279,8 @@ require('Stores/User/Account').email(), Translator.i18n('MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION', { 'COUNT': iLen - }) + }), + {'Folder': '', 'Uid': ''} ); } else @@ -290,7 +291,11 @@ Links.notificationMailIcon(), MessageHelper.emailArrayToString( MessageHelper.emailArrayFromJson(aNewMessages[iIndex].From), false), - aNewMessages[iIndex].Subject + aNewMessages[iIndex].Subject, + { + 'Folder': aNewMessages[iIndex].Folder, + 'Uid': aNewMessages[iIndex].Uid + } ); } } @@ -744,6 +749,24 @@ } }; + MessageUserStore.prototype.selectMessageByFolderAndUid = function (sFolder, sUid) + { + if (sFolder && sUid) + { + window.console.log(sFolder, sUid); + + this.message(this.staticMessage.populateByMessageListItem(null)); + this.message().folderFullNameRaw = sFolder; + this.message().uid = sUid; + + this.populateMessageBody(this.message()); + } + else + { + this.message(null); + } + }; + MessageUserStore.prototype.populateMessageBody = function (oMessage) { if (oMessage) diff --git a/dev/Stores/User/Notification.js b/dev/Stores/User/Notification.js index e17e10821..fb8412e92 100644 --- a/dev/Stores/User/Notification.js +++ b/dev/Stores/User/Notification.js @@ -8,6 +8,7 @@ ko = require('ko'), Enums = require('Common/Enums'), + Events = require('Common/Events'), Audio = require('Common/Audio'), Settings = require('Storage/Settings') @@ -161,7 +162,7 @@ } }; - NotificationUserStore.prototype.displayDesktopNotification = function (sImageSrc, sTitle, sText) + NotificationUserStore.prototype.displayDesktopNotification = function (sImageSrc, sTitle, sText, oMessageData) { if (this.enableDesktopNotification()) { @@ -180,6 +181,19 @@ oNotification.show(); } + if (oMessageData) + { + oNotification.onclick = function () { + + window.focus(); + + if (oMessageData.Folder && oMessageData.Uid) + { + Events.pub('mailbox.message.show', [oMessageData.Folder, oMessageData.Uid]); + } + }; + } + window.setTimeout((function (oLocalNotifications) { return function () { if (oLocalNotifications.cancel) diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index aae4ab7ba..cc67227a8 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -292,6 +292,35 @@ }, this) ; + Events + .sub('mailbox.message.show', function (sFolder, sUid) { + + var oMessage = _.find(this.messageList(), function (oItem) { + return oItem && sFolder === oItem.folderFullNameRaw && sUid === oItem.uid; + }); + + if ('INBOX' === sFolder) + { + kn.setHash(Links.mailBox(sFolder, 1)); + } + + if (oMessage) + { + this.selector.selectMessageItem(oMessage); + } + else + { + if ('INBOX' !== sFolder) + { + kn.setHash(Links.mailBox(sFolder, 1)); + } + + MessageStore.selectMessageByFolderAndUid(sFolder, sUid); + } + + }, this) + ; + MessageStore.messageListEndHash.subscribe(function () { this.selector.scrollToTop(); }, this); From d5069ddf85f28d4ab065ab53977e1331e8a16ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rian=20Galliat?= Date: Tue, 7 Jul 2015 15:21:02 +0200 Subject: [PATCH 095/106] Add "ZipArchive::CREATE" flag for PHP 5.6 Since PHP 5.6, "ZipArchive::open" will return "ZipArchive::ER_NOENT" if the "ZipArchive::CREATE" option is not given and the file doesn't exist, while previously, it was created without error with only "ZipArchive::OVERWRITE". --- rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index f1b54287b..c38b77c07 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -2855,7 +2855,7 @@ class Actions if (!empty($sZipFileName)) { $oZip = new \ZipArchive(); - $oZip->open($sZipFileName, \ZIPARCHIVE::OVERWRITE); + $oZip->open($sZipFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE); $oZip->setArchiveComment('RainLoop/'.APP_VERSION); foreach ($aData as $aItem) From 0c664acd1fdfcdd75a3eacf514714f858cae045d Mon Sep 17 00:00:00 2001 From: bruno Date: Tue, 7 Jul 2015 16:34:14 +0200 Subject: [PATCH 096/106] Update fr.ini french translation --- rainloop/v/0.0.0/langs/fr.ini | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index 4593a71b0..23adb4f8c 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -244,7 +244,7 @@ BUTTON_OPEN_PGP = "OpenPGP (Texte non-formatté uniquement)" BUTTON_REQUEST_DSN = "Demander un accusé de réception" [POPUPS_WELCOME_PAGE] -BUTTON_CLOSE = "Close" +BUTTON_CLOSE = "Fermer" [POPUPS_ASK] BUTTON_YES = "Oui" @@ -322,9 +322,9 @@ BUTTON_SIGN_AND_ENCRYPT = "Signer et chiffrer" [POPUPS_MESSAGE_OPEN_PGP] TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" -LABEL_KEY = "Private Key" -LABEL_PASSWORD = "Password" -BUTTON_DECRYPT = "Decrypt" +LABEL_KEY = "Clé Privée" +LABEL_PASSWORD = "Mot de passe" +BUTTON_DECRYPT = "Décrypter" [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Test d'authentification en deux étapes" @@ -445,7 +445,7 @@ LABEL_ACCOUNTS_NAME = "Comptes" LABEL_IDENTITY_NAME = "Identité" LABEL_IDENTITIES_NAME = "Identities" LABEL_FILTERS_NAME = "Filters" -LABEL_TEMPLATES_NAME = "Templates" +LABEL_TEMPLATES_NAME = "Modèles" LABEL_SECURITY_NAME = "Securité" LABEL_SOCIAL_NAME = "Social" LABEL_THEMES_NAME = "Thèmes" @@ -487,7 +487,7 @@ AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" [SETTINGS_GENERAL] LEGEND_GENERAL = "Général" LABEL_LANGUAGE = "Langue" -LABEL_IDENTITY = "Identity" +LABEL_IDENTITY = "Identité" LABEL_LAYOUT = "Disposition" LABEL_LAYOUT_NO_SPLIT = "Pas de séparation" LABEL_LAYOUT_VERTICAL_SPLIT = "Partage vertical" @@ -576,7 +576,7 @@ BUTTON_ADD_ACCOUNT = "Ajouter un compte" BUTTON_ADD_IDENTITY = "Ajouter une identité" BUTTON_DELETE = "Supprimer" LOADING_PROCESS = "Mise à jour de la liste des comptes" -DELETING_ASK = "Êtes-vous sûr ?" +DELETING_ASK = "Êtes-vous sûr-e ?" DEFAULT_IDENTITY_LABEL = "défaut" [SETTINGS_IDENTITIES] @@ -590,7 +590,7 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Ajouter votre signature à tous les messages sorta BUTTON_ADD_IDENTITY = "Ajouter une identitié" BUTTON_DELETE = "Supprimer" LOADING_PROCESS = "Met à jour la liste d'identités" -DELETING_ASK = "Êtes-vous sûr ?" +DELETING_ASK = "Êtes-vous sûr-e ?" [SETTINGS_CHANGE_PASSWORD] LEGEND_CHANGE_PASSWORD = "Modifier le mot de passe" @@ -606,8 +606,8 @@ BUTTON_ADD_OPEN_PGP_KEY = "Importer la clef OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS = "Générer les clefs OpenPGP" TITLE_PRIVATE = "Privé" TITLE_PUBLIC = "Public" -DELETING_ASK = "Êtes-vous sûr ?" -GENERATE_ONLY_HTTPS = "HTTPS only" +DELETING_ASK = "Êtes-vous sûr-e ?" +GENERATE_ONLY_HTTPS = "HTTPS seulement" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Aide pour les raccourcis clavier" @@ -624,7 +624,7 @@ LABEL_HELP = "Aide" LABEL_CHECK_ALL = "Marquer tous les messages comme lus" LABEL_ARCHIVE = "Archiver" LABEL_DELETE = "Supprimer" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Ouvrir le message selectionné" LABEL_MOVE = "Déplacer" LABEL_READ = "Marquer les messages sélectionnés comme lus" LABEL_UNREAD = "Marquer les messages sélectionnés comme non-lus" From 778dd958d449de96e225e8ee7a21898b9d50ec61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rian=20Galliat?= Date: Tue, 7 Jul 2015 18:18:15 +0200 Subject: [PATCH 097/106] Use proper terminology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In French cryptography terminology, "Décrypter" means breaking encryption to get the plaintext (when not knowing the encryption key), while "Déchiffrer" means recovering a plaintext with the encryption key. Link: https://fr.wikipedia.org/wiki/Cryptographie Link: http://www.bortzmeyer.org/cryptage-n-existe-pas.html --- rainloop/v/0.0.0/langs/fr.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index 23adb4f8c..1476d37c1 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -324,7 +324,7 @@ BUTTON_SIGN_AND_ENCRYPT = "Signer et chiffrer" TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" LABEL_KEY = "Clé Privée" LABEL_PASSWORD = "Mot de passe" -BUTTON_DECRYPT = "Décrypter" +BUTTON_DECRYPT = "Déchiffrer" [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "Test d'authentification en deux étapes" From c130ce13041fa5470cecbfbe1dc044a2b7d6178a Mon Sep 17 00:00:00 2001 From: ervee Date: Thu, 23 Jul 2015 08:55:45 +0200 Subject: [PATCH 098/106] Updated Dutch translation (#467) For GENERATE_ONLY_HTTPS --- rainloop/v/0.0.0/langs/nl.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index 52dadcc1a..f9f97524b 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -607,7 +607,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Genereer OpenPGP sleutels" TITLE_PRIVATE = "Privé sleutel" TITLE_PUBLIC = "Publieke sleutel" DELETING_ASK = "Weet u het zeker?" -GENERATE_ONLY_HTTPS = "HTTPS only" +GENERATE_ONLY_HTTPS = "Alleen HTTPS" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Hulp bij toetsenbord sneltoetsen" From f0d70f7e68e70a4505440192f6092de3cf775856 Mon Sep 17 00:00:00 2001 From: COLORLINK Date: Sun, 26 Jul 2015 11:57:07 +0300 Subject: [PATCH 099/106] Create ar.ini --- rainloop/v/0.0.0/langs/ar.ini | 725 ++++++++++++++++++++++++++++++++++ 1 file changed, 725 insertions(+) create mode 100644 rainloop/v/0.0.0/langs/ar.ini diff --git a/rainloop/v/0.0.0/langs/ar.ini b/rainloop/v/0.0.0/langs/ar.ini new file mode 100644 index 000000000..75ab9008e --- /dev/null +++ b/rainloop/v/0.0.0/langs/ar.ini @@ -0,0 +1,725 @@ + +[LOGIN] +LABEL_EMAIL = "إيميل" +LABEL_LOGIN = "تسيجيل الدخول" +LABEL_PASSWORD = "كلمة السر" +LABEL_SIGN_ME = "تذكرني" +LABEL_VERIFICATION_CODE = "كود التحقق" +LABEL_DONT_ASK_VERIFICATION_CODE = "لاتسألني عن الكود الا بعد مرور اسبوعين" +BUTTON_SIGN_IN = "الدخول" +TITLE_SIGN_IN_GOOGLE = "Google+ الدخول باستخدام" +TITLE_SIGN_IN_FACEBOOK = "Facebook الدخول باستخدام" +TITLE_SIGN_IN_TWITTER = "Twitter الدخول باستخدام" +LABEL_FORGOT_PASSWORD = "نسيت كلمة السر" +LABEL_REGISTRATION = "التسجيل" + +[TOP_TOOLBAR] +BUTTON_ADD_ACCOUNT = "ضفّ حساب" +BUTTON_SETTINGS = "الإعدادات" +BUTTON_HELP = "المساعدة" +BUTTON_LOGOUT = "تسجيل الخروج" + +[SEARCH] +MAIN_INPUT_PLACEHOLDER = "بحث" +TITLE_ADV = "البحث المطور" +LABEL_ADV_FROM = "من" +LABEL_ADV_TO = "الى" +LABEL_ADV_SUBJECT = "الموضوع" +LABEL_ADV_TEXT = "النص" +LABEL_ADV_HAS_ATTACHMENT = "يحتوي على مرفق" +LABEL_ADV_HAS_ATTACHMENTS = "يحتوي مرفقات" +LABEL_ADV_FLAGGED = "عليه علم" +LABEL_ADV_UNSEEN = "لم يقرأ" +LABEL_ADV_DATE = "التاريخ" +LABEL_ADV_DATE_ALL = "الكل" +LABEL_ADV_DATE_3_DAYS = "منذ 3 أيام" +LABEL_ADV_DATE_7_DAYS = "منذ أسبوع" +LABEL_ADV_DATE_MONTH = "منذ شهر" +LABEL_ADV_DATE_3_MONTHS = "منذ 3 أشهر" +LABEL_ADV_DATE_6_MONTHS = "منذ 6 أشهر" +LABEL_ADV_DATE_YEAR = "منذ سنة" +BUTTON_ADV_SEARCH = "إبحث" + +[PREVIEW_POPUP] +FULLSCREEN = "إعداد افتراضي لوضع ملء الشاشة" +ZOOM = "Zoom in/out" +CLOSE = "أغلق (Esc)" +LOADING = "..جاري التحميل" +GALLERY_PREV = "السابق( السهم اليسار)" +GALLERY_NEXT = "اليمين(السهم اليميني)" +GALLERY_COUNTER = "%curr% of %total%" +IMAGE_ERROR = "الصورة لم نتمكن من عرض." +AJAX_ERROR = "المحتوى لم نتمكن من عرض." + +[FOLDER_LIST] +BUTTON_COMPOSE = "إنشاء" +BUTTON_CONTACTS = "جهات الإتصال" +INBOX_NAME = "البريد الوارد" +SENT_NAME = "البريد المرسل" +DRAFTS_NAME = "المسودات" +SPAM_NAME = "الرسائل غير المرغوب فيها" +TRASH_NAME = "المهملات" +ARCHIVE_NAME = "الأرشيف" + +[QUOTA] +TITLE = "Quota usage" + +[MESSAGE_LIST] +BUTTON_RELOAD = "أعد تحميل قائمة الرسائل" +BUTTON_MOVE_TO = "..انقل الى" +BUTTON_DELETE = "حذف" +BUTTON_ARCHIVE = "وضع في الأرشيف" +BUTTON_SPAM = "الإبلاغ عن الرسائل غير المرغوب فيها" +BUTTON_NOT_SPAM = "ليست رسائل غير مرغوب فيها" +BUTTON_EMPTY_FOLDER = "افرغ محتويات المجلد" +BUTTON_MULTY_FORWARD = "إعادة توجيه كملحقات" +BUTTON_DELETE_WITHOUT_MOVE = "الحذف نهائياً" +BUTTON_MORE = "المزيد" +MENU_SET_SEEN = "تعليمها بـ مقروءة" +MENU_SET_ALL_SEEN = "تعليم جميع الرسائل كـ مقروءة" +MENU_UNSET_SEEN = "تعليمها بـ غير مقروءة" +MENU_SET_FLAG = "مهمة" +MENU_UNSET_FLAG = "إزالة الأهمية" +MENU_SELECT_ALL = "الكل" +MENU_SELECT_NONE = "بدون" +MENU_SELECT_INVERT = "Invert" +MENU_SELECT_UNSEEN = "غير مقروء" +MENU_SELECT_SEEN = "مقروء" +MENU_SELECT_FLAGGED = "محدد كـ مهم" +MENU_SELECT_UNFLAGGED = "إزالة الأهمية" +EMPTY_LIST = "إفراغ القائمة" +EMPTY_SEARCH_LIST = "ليست هناك أية رسائل تطابق بحثك." +SEARCH_RESULT_FOR = "نتيجة البحث لـ \"%SEARCH%\"" +BACK_TO_MESSAGE_LIST = "العودة الى قائمة الرسائل" +LIST_LOADING = "..جاري التحميل" +EMPTY_SUBJECT_TEXT = "(لايوجدموضوع)" +PUT_MESSAGE_HERE = "حرك الرسالة الى هنا.. لكي تراها في قائمة الرسائل" +TODAY_AT = "اليوم عند %TIME%" +YESTERDAY_AT = "البارحة عند %TIME%" +SEARCH_PLACEHOLDER = "البحث" +NEW_MESSAGE_NOTIFICATION = "يوجد لديك %COUNT% رسالة جديدة!" +QUOTA_SIZE = "Using %SIZE% (%PROC%%) of your %LIMIT%" + +[MESSAGE] +BUTTON_EDIT = "تعديل" +BUTTON_BACK = "العودة" +BUTTON_CLOSE = "إغلاق" +BUTTON_DELETE = "حذف" +BUTTON_ARCHIVE = "أرشيف" +BUTTON_SPAM = "رسالة غير مرغوبة" +BUTTON_NOT_SPAM = "ليست رسالة غير مرغوبة" +BUTTON_MOVE_TO = "انقل الى" +BUTTON_MORE = "المزيد" +BUTTON_REPLY = "الرد" +BUTTON_REPLY_ALL = "الرد على الجميع" +BUTTON_FORWARD = "إعادة توجيه" +BUTTON_FORWARD_AS_ATTACHMENT = "إعادة توجيه كملحقات" +BUTTON_EDIT_AS_NEW = "التعديل كـ جديد" +BUTTON_SHOW_IMAGES = "عرض الصور الخارجية" +BUTTON_NOTIFY_READ_RECEIPT = "لقد طلب المرسل أن يتم إعلامه في حال قراءة الرسالة" +BUTTON_IN_NEW_WINDOW = "العرض في نافذة منفصلة" +BUTTON_THREAD_LIST = "قائمة المواضيع" +BUTTON_THREAD_PREV = "السابق" +BUTTON_THREAD_NEXT = "التالي" +BUTTON_THREAD_MORE = "المزيد من الرسائل" +MENU_HEADERS = "Show message headers" +MENU_VIEW_ORIGINAL = "إظهار المصدر" +MENU_DOWNLOAD_ORIGINAL = ".eml التنزيل كملف" +MENU_FILTER_SIMILAR = "تصفية رسائل مثل هذه" +MENU_PRINT = "طباعة" +EMPTY_SUBJECT_TEXT = "(لايوجد موضوع)" +LABEL_SUBJECT = "الموضوع" +LABEL_DATE = "التاريخ" +LABEL_FROM = "من" +LABEL_FROM_SHORT = "من" +LABEL_TO = "الى" +LABEL_TO_SHORT = "الى" +LABEL_CC = "نسخة الى" +LABEL_BCC = "نسخة مخفية الوجهة" +LABEL_REPLY_TO = "الرد-الى" +PRINT_LABEL_FROM = "من" +PRINT_LABEL_TO = "الى" +PRINT_LABEL_CC = "نسخة الى" +PRINT_LABEL_BCC = "نسخة مخفية الوجهة" +PRINT_LABEL_REPLY_TO = "الرد-الى" +PRINT_LABEL_DATE = "التاريخ" +PRINT_LABEL_SUBJECT = "الموضوع" +PRINT_LABEL_ATTACHMENTS = "الملحقات" +MESSAGE_LOADING = "..جاري التحميل" +MESSAGE_VIEW_DESC = "حدد رسالة من القائمة ليتم عرضها هنا" +PGP_PASSWORD_INPUT_PLACEHOLDER = "كلمة السر" +PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" +PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" +LINK_DOWNLOAD_AS_ZIP = "zip تنزيل كـ " +LINK_SAVE_TO_OWNCLOUD = "ownCloud الحفظ الى" +LINK_SAVE_TO_DROPBOX = "Dropbox الحفظ الى" + +[READ_RECEIPT] +SUBJECT = "إعلام بالقراءة (تم عرضها) - %SUBJECT%" +BODY = "هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%. +" + +[SUGGESTIONS] +SEARCHING_DESC = "يتم البحث..." + +[CONTACTS] +LEGEND_CONTACTS = "جهات الإتصال" +SEARCH_INPUT_PLACEHOLDER = "بحث" +BUTTON_ADD_CONTACT = "إضافة جهة إتصال" +BUTTON_CREATE_CONTACT = "إنشاء" +BUTTON_UPDATE_CONTACT = "تحديث" +BUTTON_IMPORT = "إستيراد (csv, vcf, vCard)" +BUTTON_EXPORT_VCARD = "تصدير كـ (vcf, vCard)" +BUTTON_EXPORT_CSV = "تصدير كـ (csv)" +ERROR_IMPORT_FILE = "خطأ في الإستيراد(نوع ملف غير صحيح)" +LIST_LOADING = "جاري التحميل" +EMPTY_LIST = "لايوجد جهات إتصال" +EMPTY_SEARCH = "لم يتم ايجاد جهة الإتصال" +CLEAR_SEARCH = "إزالة البحث" +CONTACT_VIEW_DESC = "حدد جهة إتصال من القائمة لكي يتم عرضها هنا" +LABEL_DISPLAY_NAME = "الإسم المعروض" +LABEL_EMAIL = "البريد الإلكتروني" +LABEL_PHONE = "رقم الهاتف" +LABEL_WEB = "الموقع" +LABEL_BIRTHDAY = "تاريخ الميلاد" +LINK_ADD_EMAIL = "قم باضافة البريد الالكتروني" +LINK_ADD_PHONE = "قم باضافة رقم الهاتف" +LINK_BIRTHDAY = "تاريخ الميلاد" +PLACEHOLDER_ENTER_DISPLAY_NAME = "ادخل الاسم المعروض" +PLACEHOLDER_ENTER_LAST_NAME = "ادخل اسم العائلة" +PLACEHOLDER_ENTER_FIRST_NAME = "ادخل الاسم" +PLACEHOLDER_ENTER_NICK_NAME = "ادخل اللقب" +LABEL_READ_ONLY = "قراءة فقط" +LABEL_SHARE = "مشاركة" +ADD_MENU_LABEL = "اضافة" +ADD_MENU_NICKNAME = "اللقب" +ADD_MENU_NOTES = "الملاحظات" +ADD_MENU_EMAIL = "البريد الإلكتروني" +ADD_MENU_PHONE = "الهاتف" +ADD_MENU_URL = "الرابط" +ADD_MENU_ADDRESS = "العنوان" +ADD_MENU_BIRTHDAY = "تاريخ الميلاد" +ADD_MENU_TAGS = "Tags" +BUTTON_SHARE_NONE = "لاأحد" +BUTTON_SHARE_ALL = "الجميع" +BUTTON_SYNC = "المزامنة (CardDAV)" + +[COMPOSE] +TITLE_FROM = "من" +TITLE_TO = "الى" +TITLE_CC = "نسخة الى" +TITLE_BCC = "نسخة مخفية الوجهة" +TITLE_REPLY_TO = "الرد-الى" +TITLE_SUBJECT = "الموضوع" +LINK_SHOW_INPUTS = "إظهار جميع الحقول" +BUTTON_SEND = "إرسال" +BUTTON_SAVE = "حفظ" +BUTTON_DELETE = "حذف" +BUTTON_CANCEL = "إلغاء" +BUTTON_MINIMIZE = "تصغير" +SAVED_TIME = "تم الحفظ عند %TIME%" +SAVED_ERROR_ON_SEND = "تم إرسال الرسالة.. ولكن لم يتم حفظها في مجلد المرسلات" +DISCARD_UNSAVED_DATA = "تجاهل البيانات الغير محفوظة؟" +ATTACH_FILES = "ارفاق الملفات" +ATTACH_DROP_FILES_DESC = "حرك الملفات الى هنا" +ATTACH_ITEM_CANCEL = "الغاء" +DROPBOX = "Dropbox" +GOOGLE_DRIVE = "Google Drive" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% wrote" +FORWARD_MESSAGE_TOP_TITLE = "-------- رسالة معاد توجيهها -------" +FORWARD_MESSAGE_TOP_FROM = "من" +FORWARD_MESSAGE_TOP_TO = "الى" +FORWARD_MESSAGE_TOP_CC = "نسخة الى" +FORWARD_MESSAGE_TOP_SENT = "تم الإرسال" +FORWARD_MESSAGE_TOP_SUBJECT = "الموضوع" +EMPTY_TO_ERROR_DESC = "رجاءً حدد مستلم واحد على الأقل." +NO_ATTACHMENTS_HERE_DESC = "لايوجد مرفقات" +ATTACHMENTS_ERROR_DESC = "تحذير! لم يتم إرفاق جميع المرفقات" +ATTACHMENTS_UPLOAD_ERROR_DESC = "لم تنتهي عملية الإرفاق بعد" +BUTTON_REQUEST_READ_RECEIPT = "اطلب اعلاماً بالقراءة" +BUTTON_MARK_AS_IMPORTANT = "تحديده كـ هام" +BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)" +BUTTON_REQUEST_DSN = "اطلب اعلاماً بايصال البريد" + +[POPUPS_WELCOME_PAGE] +BUTTON_CLOSE = "إغلاق" + +[POPUPS_ASK] +BUTTON_YES = "نعم" +BUTTON_NO = "لا" +DESC_WANT_CLOSE_THIS_WINDOW = "هل أنت متأكد من رغبتك باغلاق هذه النافذة؟" +DESC_WANT_DELETE_MESSAGES = "هل أنت متأكد من رغبتك بحذف هذه الرسائل؟" + +[POPUPS_LANGUAGES] +TITLE_LANGUAGES = "حدّد لغتك" + +[POPUPS_ADD_ACCOUNT] +TITLE_ADD_ACCOUNT = "قم باضافة حساب؟" +BUTTON_ADD_ACCOUNT = "إضافة" +TITLE_UPDATE_ACCOUNT = "تحديث الحساب؟" +BUTTON_UPDATE_ACCOUNT = "تحديث" + +[POPUPS_IDENTITY] +TITLE_ADD_IDENTITY = "إضافة هوية؟" +TITLE_UPDATE_IDENTITY = "تحديث الهوية؟" +BUTTON_ADD_IDENTITY = "إضافة" +BUTTON_UPDATE_IDENTITY = "تحديث" +LABEL_EMAIL = "البريد الإلكتروني" +LABEL_NAME = "الإسم" +LABEL_REPLY_TO = "الرد-الى" +LABEL_SIGNATURE = "التوقيع" +LABEL_CC = "نسخة الى" +LABEL_BCC = "نسخة مخفية الوجهة" +LABEL_SIGNATURE_INSERT_BEFORE = "قم بوضع التوقيع قبل النص المأخوذ من الرسائل في عملية الرد" + +[POPUPS_CREATE_FOLDER] +TITLE_CREATE_FOLDER = "إنشاء مجلد؟" +SELECT_NO_PARENT = "" +LABEL_NAME = "إسم المجلد" +LABEL_PARENT = "المجلد الأساسي" +BUTTON_CREATE = "إنشاء" +BUTTON_CANCEL = "إلغاء" +BUTTON_CLOSE = "إغلاق" +TITLE_CREATING_PROCESS = "يتم إنشاء المجلد" + +[POPUPS_CLEAR_FOLDER] +TITLE_CLEAR_FOLDER = "دمج جميع الرسائل من المجلد؟" +BUTTON_CLEAR = "Clear" +BUTTON_CANCEL = "إلغاء" +BUTTON_CLOSE = "إغلاق" +DANGER_DESC_WARNING = "تحذير!" +DANGER_DESC_HTML_1 = "هذا الإجراء سينجم عنه إزالة جميع محتويات المجلد %FOLDER% بشكل كامل" +DANGER_DESC_HTML_2 = "في حال بدء العملية , فلا يمكن ايقافها او الغائها" +TITLE_CLEARING_PROCESS = "...يتم دمج المجلد" + +[POPUPS_IMPORT_OPEN_PGP_KEY] +TITLE_IMPORT_OPEN_PGP_KEY = "OpenPGP استيراد مفتاح " +BUTTON_IMPORT_OPEN_PGP_KEY = "استيراد" + +[POPUPS_VIEW_OPEN_PGP_KEY] +TITLE_VIEW_OPEN_PGP_KEY = "عرض OpenPGP key" +BUTTON_SELECT = "تحديد" +BUTTON_CLOSE = "إغلاق" + +[POPUPS_GENERATE_OPEN_PGP_KEYS] +TITLE_GENERATE_OPEN_PGP_KEYS = "OpenPGP توليد مفتاح" +LABEL_EMAIL = "البريد الإلكتروني" +LABEL_NAME = "الإسم" +LABEL_PASSWORD = "كلمة السر" +LABEL_KEY_BIT_LENGTH = "طول المفتاح" +BUTTON_GENERATE_OPEN_PGP_KEYS = "قم بالتوليد" + +[POPUPS_COMPOSE_OPEN_PGP] +TITLE_COMPOSE_OPEN_PGP = "OpenPGP Sign/Encrypt" +LABEL_SIGN = "تسجيل" +LABEL_ENCRYPT = "تشفير" +LABEL_PASSWORD = "كلمة السر" +BUTTON_SIGN = "تسجيل" +BUTTON_ENCRYPT = "تشفير" +BUTTON_SIGN_AND_ENCRYPT = "سجل و قم بالتشفير" + +[POPUPS_MESSAGE_OPEN_PGP] +TITLE_MESSAGE_OPEN_PGP = "OpenPGP فك تشفير" +LABEL_KEY = "مفتاح خاص" +LABEL_PASSWORD = "كلمة السر" +BUTTON_DECRYPT = "فك تشفير" + +[POPUPS_TWO_FACTOR_TEST] +TITLE_TEST_CODE = "التأكد من الهوية على مرحلتين" +LABEL_CODE = "الكود" +BUTTON_TEST = "تجريب" + +[POPUPS_FILTER] +TITLE_CREATE_FILTER = "إنشاء عامل تصفية؟" +TITLE_EDIT_FILTER = "تحديث عامل التصفية؟" +FILTER_NAME = "الإسم" +LEGEND_CONDITIONS = "الشروط" +LEGEND_ACTIONS = "التطبيقات" +BUTTON_DONE = "إنتهاء" +BUTTON_ADD_CONDITION = "إضافة تطبيق" +SELECT_ACTION_NONE = "None" +SELECT_ACTION_MOVE_TO = "إنقل الى" +SELECT_ACTION_FORWARD_TO = "أعد التوجيه الى" +SELECT_ACTION_REJECT = "الرفض" +SELECT_ACTION_VACATION_MESSAGE = "رسالة العطلة" +SELECT_ACTION_DISCARD = "تجاهل" +SELECT_FIELD_FROM = "من" +SELECT_FIELD_RECIPIENTS = "المستلمين (الى أو نسخة الى)" +SELECT_FIELD_SUBJECT = "الموضوع" +SELECT_FIELD_HEADER = "Header" +SELECT_FIELD_SIZE = "الحجم" +SELECT_TYPE_CONTAINS = "يحتوي" +SELECT_TYPE_NOT_CONTAINS = "لايحتوي" +SELECT_TYPE_MATCHES = "يطابق (* و ? مدعوم)" +SELECT_TYPE_NOT_MATCHES = "لايطابق (* و ? مدعوم)" +SELECT_TYPE_REGEXP = "ممنهج" +SELECT_TYPE_NOT_REGEXP = "غير ممنهج" +SELECT_TYPE_EQUAL_TO = "مساوي الى" +SELECT_TYPE_NOT_EQUAL_TO = "غير مساوي الى" +SELECT_TYPE_OVER = "فوق" +SELECT_TYPE_UNDER = "تحت" +SELECT_MATCH_ANY = "مطابق لإحدى الشروط" +SELECT_MATCH_ALL = "مطابق لجميع الشروط" +MARK_AS_READ_LABEL = "تعليمها بـ مقروءة" +REPLY_INTERVAL_LABEL = "فترة الرد (بلأيام)" +KEEP_LABEL = "الإحتفاظ بها" +STOP_LABEL = "لاتتوقف عن المعالجة بالشروط" +EMAIL_LABEL = "البريد الإلكتروني" +VACATION_SUBJECT_LABEL = "الموضوع (خياري)" +VACATION_MESSAGE_LABEL = "الرسالة" +REJECT_MESSAGE_LABEL = "رفض الرسالة" +ALL_INCOMING_MESSAGES_DESC = "جميع الرسائل الواردة" + +[POPUPS_SYSTEM_FOLDERS] +TITLE_SYSTEM_FOLDERS = "حدد مجلدات النظام" +SELECT_CHOOSE_ONE = "إختر واحد" +SELECT_UNUSE_NAME = "لاتستخدم" +LABEL_SENT = "أرسلت" +LABEL_DRAFTS = "المسودات" +LABEL_SPAM = "الرسائل غير المرغوب فيها" +LABEL_TRASH = "المهملات" +LABEL_ARCHIVE = "الأرشيف" +BUTTON_CANCEL = "إلغاء" +BUTTON_CLOSE = "إغلاق" +NOTIFICATION_SENT = "You haven't selected \"Sent\" system folder messages are put to after sending. +If you don't want to save sent message, please select \"Do not use\" option." +NOTIFICATION_DRAFTS = "You haven't selected \"Drafts\" system folder messages are saved to while composing." +NOTIFICATION_SPAM = "You haven't selected \"Spam\" system folder spamed messages are placed to. +If you wish to remove messages permanently, please select \"Do not use\" option." +NOTIFICATION_TRASH = "You haven't selected \"Trash\" system folder deleted messages are placed to. +If you wish to remove messages permanently, please select \"Do not use\" option." +NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." + +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "التحقق الثنائي (TOTP)" +LABEL_ENABLE_TWO_FACTOR = "تفعيل عملية التحقق الثنائي" +LABEL_TWO_FACTOR_USER = "المستخدم" +LABEL_TWO_FACTOR_STATUS = "الحالة" +LABEL_TWO_FACTOR_SECRET = "السر" +LABEL_TWO_FACTOR_BACKUP_CODES = "كود التحقق الإحتياطي" +BUTTON_CREATE = "قم بإنشاء سر" +BUTTON_ACTIVATE = "فعل" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "تسجيل خروج" +BUTTON_DONE = "إنتهى" +BUTTON_TEST = "تجريب" +LINK_TEST = "تجريب" +BUTTON_SHOW_SECRET = "إظهار السر" +BUTTON_HIDE_SECRET = "إخفاء السر" +TWO_FACTOR_REQUIRE_DESC = "حسابك بحاجة الى إعداد مراحل التحقق الثنائية" +TWO_FACTOR_SECRET_CONFIGURED_DESC = "تم التكوين" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "لم يتم التكوين" +TWO_FACTOR_SECRET_DESC = " قم باستيراد هذه المعلومات لمركز توثيق غوغل باستخدام رمز الكيو-اّر او بنسخ الكود يدوياً (or other TOTP client) " +TWO_FACTOR_BACKUP_CODES_DESC = " إذا لم تتمكن من الحصول على الكود من مركز التوثيق في غوغل يمكنك إستخدام الكود الإحتياطي لتسجيل الدخول,ولكن سيصبح كود الإحتياط غير فعال بعد ذلك " +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "لايمكنك تغيير هذه الإعدادات بدون تجريب." + +[TITLES] +LOADING = "..جاري التحميل" +LOGIN = "تسجيل الدخول" +MAILBOX = "صندوق البريد" +SETTINGS = "الإعدادات" +COMPOSE = "إنشاء" + +[UPLOAD] +ERROR_FILE_IS_TOO_BIG = "حجم الملف كبير جداً" +ERROR_FILE_PARTIALLY_UPLOADED = "لقد تم إضافة الملف بشكل جزئي ..بسبب خطأ غير معروف" +ERROR_NO_FILE_UPLOADED = "لم تتم عملية إضافة الملفات" +ERROR_MISSING_TEMP_FOLDER = "الملف المؤقت مفقود" +ERROR_ON_SAVING_FILE = "حدث خطأ نتيجة إضافة ملف غير معروف النوع" +ERROR_FILE_TYPE = "نوع الملف مرفوض" +ERROR_UNKNOWN = "حدث خطأ نتيجة إضافة ملف غير معروف النوع" + +[EDITOR] +TEXT_SWITCHER_PLAINT_TEXT = "نص عادي" +TEXT_SWITCHER_RICH_FORMATTING = "غني بالتنسيقات" +TEXT_SWITCHER_CONFIRM = "التنسيقات و الصور المضافة ستزال.. هل أنت متأكد من الإستمرار" + +[SETTINGS_LABELS] +LABEL_PERSONAL_NAME = "الشخصي" +LABEL_GENERAL_NAME = "العام" +LABEL_CONTACTS_NAME = "جهات الإتصال" +LABEL_FOLDERS_NAME = "المجلدات" +LABEL_ACCOUNTS_NAME = "الحسابات" +LABEL_IDENTITY_NAME = "الهوية" +LABEL_IDENTITIES_NAME = "الهويات" +LABEL_FILTERS_NAME = "عوامل التصفية" +LABEL_TEMPLATES_NAME = "القوالب" +LABEL_SECURITY_NAME = "الأمان" +LABEL_SOCIAL_NAME = "الشبكات الإجتماعية" +LABEL_THEMES_NAME = "المظاهر العامة" +LABEL_CHANGE_PASSWORD_NAME = "كلمة السر" +LABEL_OPEN_PGP_NAME = "OpenPGP" +BUTTON_BACK = "العودة" + +[SETTINGS_FILTERS] +LEGEND_FILTERS = "عوامل التصفية" +BUTTON_SAVE = "حفظ" +BUTTON_ADD_FILTER = "إضافة عامل تصفية" +BUTTON_DELETE = "حذف" +BUTTON_RAW_SCRIPT = "إستخدام سكربت مخصصة للمستخدم" +SUBNAME_NONE = "None" +SUBNAME_MOVE_TO = " \"%FOLDER%\" نقل الى" +SUBNAME_FORWARD_TO = " \"%EMAIL%\" إعادة توجيه الى" +SUBNAME_REJECT = "رفض" +SUBNAME_VACATION_MESSAGE = "رسالة العطلة" +SUBNAME_DISCARD = "تجاهل" +CAPABILITY_LABEL = "القدرة" +LOADING_PROCESS = "تحديث قائمة عوامل التصفية" +DELETING_ASK = "هل أنت متأكد؟" +CHACHES_NEED_TO_BE_SAVED_DESC = "هذه التغييرات بحاجة الى أن يتم حفظها على المخدم." + +[SETTINGS_IDENTITY] +LEGEND_IDENTITY = "الهوية" +LABEL_DISPLAY_NAME = "الإسم" +LABEL_REPLY_TO = "الرد-الى" +LABEL_SIGNATURE = "التوقيع" +LABEL_ADD_SIGNATURE_TO_ALL = "قم بإضافة توقيعك على جميع الرسائل الصادرة" + +[SETTINGS_SECURITY] +LEGEND_SECURITY = "الأمان" +LABEL_CONFIGURATE_TWO_FACTOR = "تكوين عملية التأكد ثنائية المراحل" +LABEL_AUTOLOGOUT = "تسجيل الخروج التلقائي" +AUTOLOGIN_NEVER_OPTION_NAME = "أبداَ" +AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% دقيقة" + +[SETTINGS_GENERAL] +LEGEND_GENERAL = "عام" +LABEL_LANGUAGE = "اللغة" +LABEL_IDENTITY = "الهوية" +LABEL_LAYOUT = "التصميم" +LABEL_LAYOUT_NO_SPLIT = "بدون إنقسام" +LABEL_LAYOUT_VERTICAL_SPLIT = "إنقسام عمودي" +LABEL_LAYOUT_HORIZONTAL_SPLIT = "إنقسام أفقي" +LABEL_EDITOR = "المحرر النصي الأساسي" +LABEL_EDITOR_HTML = "Html" +LABEL_EDITOR_PLAIN = "عادي" +LABEL_EDITOR_HTML_FORCED = "Html (إجباري)" +LABEL_EDITOR_PLAIN_FORCED = "عادي (إجباري)" +LABEL_ANIMATION = "مؤثرات الواجهة الحية" +LABEL_ANIMATION_FULL = "كامل" +LABEL_ANIMATION_NORMAL = "عادي" +LABEL_ANIMATION_NONE = "بدون" +LABEL_VIEW_OPTIONS = "إظهار الخيارات" +LABEL_USE_PREVIEW_PANE = "استخدام جزئية العرض الجانبي" +LABEL_USE_CHECKBOXES_IN_LIST = "عرض مربعات التحديد في القائمة" +LABEL_USE_THREADS = "إستخدام المواضيع" +LABEL_REPLY_SAME_FOLDER = "ضع الردود في مجلد الرسالة التي يتم الرد عليها" +LABEL_SHOW_IMAGES = "قم دائماَ بعرض الصور القادمة في الرسالة" +LABEL_SHOW_ANIMATION = "أظهر التأثيرات الخاصة " +LABEL_MESSAGE_PER_PAGE = "الرسائل في الصفحة" +LABEL_NOTIFICATIONS = "التنبيهات" +LABEL_SOUND_NOTIFICATION = "صوت التنبيهات" +LABEL_CHROME_NOTIFICATION_DESC = "إظهار نافذة منبثقة في حالة قدوم ايميل جديد" +LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(تم إعتراضها من قبل المتصفح)" + +[SETTINGS_CONTACTS] +LEGEND_CONTACTS = "جهات الإتصال" +LABEL_CONTACTS_AUTOSAVE = "قم باضافة المستلمين تلقائيا الى دفتر العناوين" +LEGEND_CONTACTS_SYNC = " (CardDAV)التزامن عن بعد" +LABEL_CONTACTS_SYNC_ENABLE = "تفعيل التزامن عن بعد" +LABEL_CONTACTS_SYNC_SERVER = "المخدم" +LABEL_CONTACTS_SYNC_AB_URL = "وصلة دفتر العناوين" +LABEL_CONTACTS_SYNC_USER = "المستخدم" +LABEL_CONTACTS_SYNC_PASSWORD = "كلمة السر" + +[SETTINGS_THEMES] +LEGEND_THEMES = "المظاهر العامة" +LEGEND_THEMES_CUSTOM = "تجهيز المظهر المخصص" +LABEL_CUSTOM_TYPE = "النوع" +LABEL_CUSTOM_TYPE_LIGHT = "فاتح" +LABEL_CUSTOM_TYPE_DARK = "غامق" +LABEL_CUSTOM_BACKGROUND_IMAGE = "الخلفية" +BUTTON_UPLOAD_BACKGROUND_IMAGE = " (JPG, PNG)حمل صورة الخلفية " +ERROR_FILE_IS_TOO_BIG = "حجم الملف كبير جداً" +ERROR_FILE_TYPE_ERROR = " مسموحة فقط(JPG,PNG)نوع الملف خطأ " +ERROR_UNKNOWN = " حدث خطأ أثناء رفع الملف" + +[SETTINGS_SOCIAL] +LEGEND_GOOGLE = "غوغل" +BUTTON_GOOGLE_CONNECT = "إتصل بغوغل" +BUTTON_GOOGLE_DISCONNECT = "إفصل الإتصال مع غوغل" +MAIN_GOOGLE_DESC = "بعد تفعيل الإتصال مع غوغل.. يمكنك تسجيل الدخول الى حسابك باستخدام زر غوغل على صفحة تسجيل الدخول" +LEGEND_FACEBOOK = "فيسبوك" +BUTTON_FACEBOOK_CONNECT = "إتصل بفيسبوك" +BUTTON_FACEBOOK_DISCONNECT = "إفصل الإتصال مع فيسبوك" +MAIN_FACEBOOK_DESC = "بعد تفعيل الإتصال مع فيسبوك.. يمكنك تسجيل الدخول الى حسابك باستخدام زر فيسبوك على صفحة تسجيل الدخول" +LEGEND_TWITTER = "تويتر" +BUTTON_TWITTER_CONNECT = "إتصل بتويتر" +BUTTON_TWITTER_DISCONNECT = "إفصل الإتصال بتويتر" +MAIN_TWITTER_DESC = "بعد تفعيل الإتصال مع تويتر.. يمكنك تسجيل الدخول الى حسابك باستخدام زر تويتر على صفحة تسجيل الدخول" + +[SETTINGS_FOLDERS] +LEGEND_FOLDERS = "قائمة المجلدات" +BUTTON_CREATE = "أنشأ مجلد" +BUTTON_SYSTEM = "قم بتحديد مجلدات النظام" +BUTTON_DELETE = "حذف" +BUTTON_SUBSCRIBE = "الإشتراك" +BUTTON_UNSUBSCRIBE = "الغاء الإشتراك" +LOADING_PROCESS = "جاري تحديث قائمة المجلدات" +CREATING_PROCESS = "جاري إنشاء المجلد" +DELETING_PROCESS = "جاري حذف المجلد" +RENAMING_PROCESS = "جاري إعادة تسمية المجلد" +DELETING_ASK = "هل أنت متأكد؟" +TO_MANY_FOLDERS_DESC_1 = "لديك الكثير من المجلدات!" +TO_MANY_FOLDERS_DESC_2 = "لقد قمنا بإظهار جزء منهم تفادياَ لضعف الأداء" +HELP_DELETE_FOLDER = "إحذف المجلد" +HELP_SHOW_HIDE_FOLDER = "إخفاء\إظهار المجلد" +HELP_CHECK_FOR_NEW_MESSAGES = "تأكد\لاتتأكد من وصول ايميلات جديدة" + +[SETTINGS_ACCOUNTS] +LEGEND_ACCOUNTS = "الحسابات" +LEGEND_IDENTITIES = "الهويات" +LEGEND_ACCOUNTS_AND_IDENTITIES = "الحسابات و الهويات" +BUTTON_ADD_ACCOUNT = "قم باضافة حساب" +BUTTON_ADD_IDENTITY = "قم باضافة هوية" +BUTTON_DELETE = "إحذف" +LOADING_PROCESS = "..جاري التحميل" +DELETING_ASK = "هل أنت متأكد؟" +DEFAULT_IDENTITY_LABEL = "الافتراضي" + +[SETTINGS_IDENTITIES] +LEGEND_IDENTITY = "الهوية" +LEGEND_IDENTITIES = "الهويات الإضافية" +LABEL_DEFAULT = "الافتراضي" +LABEL_DISPLAY_NAME = "الإسم" +LABEL_REPLY_TO = "الرد-الى" +LABEL_SIGNATURE = "التوفيع" +LABEL_ADD_SIGNATURE_TO_ALL = "قم باضافة التوقيع الى جميع الرسائل الصادرة" +BUTTON_ADD_IDENTITY = "قم بإضافة هوية" +BUTTON_DELETE = "حذف" +LOADING_PROCESS = "جاري تحديث قائمة الهويات" +DELETING_ASK = "هل أنت متأكد؟" + +[SETTINGS_CHANGE_PASSWORD] +LEGEND_CHANGE_PASSWORD = "غيّر كلمة السر" +LABEL_CURRENT_PASSWORD = "كلمة السر الحالية" +LABEL_NEW_PASSWORD = "كلمة السر الجديدة" +LABEL_REPEAT_PASSWORD = "تأكيد كلمة السر الجديدة" +BUTTON_UPDATE_PASSWORD = "تعيين كلمة السر الجديدة" +ERROR_PASSWORD_MISMATCH = "كلمات السر غير متطابقة,لطفاَ أعد كتابتها" + +[SETTINGS_OPEN_PGP] +LEGEND_OPEN_PGP = "OpenPGP" +BUTTON_ADD_OPEN_PGP_KEY = "OpenPGP إستيراد مفتاح" +BUTTON_GENERATE_OPEN_PGP_KEYS = "OpenPGP توليد مفتاح" +TITLE_PRIVATE = "خاص" +TITLE_PUBLIC = "عام" +DELETING_ASK = "هل أنت متأكد؟" +GENERATE_ONLY_HTTPS = "HTTPS فقط" + +[SHORTCUTS_HELP] +LEGEND_SHORTCUTS_HELP = "مساعدة في إختصارات لوحة المفاتيح" +TAB_MAILBOX = "صندوق البريد" +TAB_MESSAGE_LIST = "قائمة الرسائل" +TAB_MESSAGE_VIEW = "عرض الرسائل" +TAB_COMPOSE = "إنشاء" +LABEL_OPEN_USER_DROPDOWN = "فتح نافذة الأعضاء المنبثقة" +LABEL_REPLY = "الرد" +LABEL_REPLY_ALL = "الرد للجميع" +LABEL_FORWARD = "إعادة التوجيه" +LABEL_FORWARD_MULTIPLY = "إعادة التوجيه كملف مرفق" +LABEL_HELP = "المساعدة" +LABEL_CHECK_ALL = "تحديد جميع الرسائل" +LABEL_ARCHIVE = "أرشيف" +LABEL_DELETE = "حذف" +LABEL_OPEN_THREAD = "فتح المواضيع المحددة" +LABEL_MOVE = "نقل" +LABEL_READ = "إقرأ الرسائل المحددة" +LABEL_UNREAD = "لاتقم بقراءة الرسائل المحددة" +LABEL_IMPORTANT = "هام, النجمة/العلم الرسائل المحددة" +LABEL_SEARCH = "بحث" +LABEL_CANCEL_SEARCH = "إلغاء البحث" +LABEL_FULLSCREEN_ENTER = "وضع ملء الشاشة" +LABEL_VIEW_MESSAGE_ENTER = "مشاهدة الرسائل (بدون نافذة المشاهدة)" +LABEL_SWITCH_TO_MESSAGE = "تحويل التركيز الى الرسائل المحددة" +LABEL_SWITCH_TO_FOLDER_LIST = "تحويل التركيز الى قائمة المجلدات" +LABEL_FULLSCREEN_TOGGLE = "تفعيل وضعية ملء الشاشة" +LABEL_BLOCKQUOTES_TOGGLE = "إقتباس الرسائل" +LABEL_THREAD_NEXT = "الرسالة التالية في الموضوع" +LABEL_THREAD_PREV = "الرسالة السابقة من الموضوع" +LABEL_PRINT = "طباعة" +LABEL_EXIT_FULLSCREEN = "الخروج من وضع ملء الشاشة" +LABEL_CLOSE_MESSAGE = "إغلاق الرسالة (بدون نافذة العرض)" +LABEL_SWITCH_TO_LIST = "تحويل التركيز الى قائمة الرسائل" +LABEL_OPEN_COMPOSE_POPUP = "إفتح نافذة خاصة لإنشاء الرسائل" +LABEL_OPEN_IDENTITIES_DROPDOWN = "فتح قائمة الهويات" +LABEL_SAVE_MESSAGE = "حفظ الرسالة" +LABEL_SEND_MESSAGE = "إرسال الرسالة" +LABEL_CLOSE_COMPOSE = "إغلاق الرسالة" + +[PGP_NOTIFICATIONS] +NO_PUBLIC_KEYS_FOUND = "لم يتم إيجاد المفتاح العام" +NO_PUBLIC_KEYS_FOUND_FOR = "لم يتم إيجاد مفتاح عام\"%EMAIL%\" email" +NO_PRIVATE_KEY_FOUND = "لم يتم إيجاد مفتاح خاص" +NO_PRIVATE_KEY_FOUND_FOR = "لم يتم إيجاد المفتاح الخاص لـ \"%EMAIL%\" email" +UNVERIFIRED_SIGNATURE = "توقيع غير موثق" +DECRYPTION_ERROR = "OpenPGP خطأ فك تشفير" +GOOD_SIGNATURE = "توقيع جيد من %USER%" +PGP_ERROR = "OpenPGP error: %ERROR%" +SPECIFY_FROM_EMAIL = "يرجى التأكد من الإيميل" +SPECIFY_AT_LEAST_ONE_RECIPIENT = "يرجى تحديد مستلم واحد على الأقل" + +[NOTIFICATIONS] +INVALID_TOKEN = "خاطىء token" +AUTH_ERROR = "خطأ في كلمة السر \اسم المستخدم" +ACCESS_ERROR = "خطأ في الوصول" +CONNECTION_ERROR = "لايمكن الإتصال بالمخدم" +CAPTCHA_ERROR = "رمز تحقق خاطىء." +SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك" +SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك" +SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "إن المعرف الإجتماعي غير مرتبط بـ أي حساب حالياَ. سجل الدخول الى مركز التوثيق في بريدك الإلكتروني وفعل هذه الخاصية في إعدادات حسابك" +DOMAIN_NOT_ALLOWED = "غير مسموح لهذا الموقع" +ACCOUNT_NOT_ALLOWED = "الحساب غير مسموح له" +ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "عامل التحقق الثنائي من الهوية مطلوب" +ACCOUNT_TWO_FACTOR_AUTH_ERROR = "خطأ في عملية التحقق الثنائية" +COULD_NOT_SAVE_NEW_PASSWORD = "لم نتمكن من حفظ كلمة السر الجديدة" +CURRENT_PASSWORD_INCORRECT = "كلمة السر الحالية خاطئة" +NEW_PASSWORD_SHORT = "كلمة السر قصيرة جداً" +NEW_PASSWORD_WEAK = "كلمة السر سهلة جداً" +NEW_PASSWORD_FORBIDDENT = "كلمة السر تحتوي على محارف غير مسموح بها" +CONTACTS_SYNC_ERROR = "خطأ في مزامنة جهات الإتصال" +CANT_GET_MESSAGE_LIST = "لايمكن الوصول الى قائمة الرسائل" +CANT_GET_MESSAGE = "لايمكن الوصول الى الرسالة" +CANT_DELETE_MESSAGE = "لايمكن حذف الرسالة" +CANT_MOVE_MESSAGE = "لايمكن نقل الرسالة" +CANT_SAVE_MESSAGE = "لايمكن حفظ الرسالة" +CANT_SEND_MESSAGE = "لايمكن إرسال الرسالة" +INVALID_RECIPIENTS = "يرجى التأكد من عناوين المرسل اليهم" +CANT_SAVE_FILTERS = "لايمكن حفظ عامل التصفية" +CANT_GET_FILTERS = "لايمكن الوصول الى عوامل التصفية" +FILTERS_ARE_NOT_CORRECT = "عوامل التصفية خطأ" +CANT_CREATE_FOLDER = "لايمكن إنشاء مجلد" +CANT_RENAME_FOLDER = "لايمكن إعادة تسمية المجلد" +CANT_DELETE_FOLDER = "لايمكن حذف المجلد" +CANT_DELETE_NON_EMPTY_FOLDER = "لايمكن حذف مجلد ممتلأ" +CANT_SUBSCRIBE_FOLDER = "لايمكن الإشتراك بالمجلد" +CANT_UNSUBSCRIBE_FOLDER = "لايمكن حذف الإشتراك من المجلد" +CANT_SAVE_SETTINGS = "لايمكن حفظ الإعدادات" +CANT_SAVE_PLUGIN_SETTINGS = "لايمكن حفظ الإعدادات" +DOMAIN_ALREADY_EXISTS = "الموقع موجود مسبقاَ" +CANT_INSTALL_PACKAGE = "فشل في تنزيل الحزمة" +CANT_DELETE_PACKAGE = "فشل في إزالة الحزمة" +INVALID_PLUGIN_PACKAGE = "خطأ في الحزمة المراد تنزيلها" +UNSUPPORTED_PLUGIN_PACKAGE = "حزمة غير مدعومة" +LICENSING_SERVER_IS_UNAVAILABLE = "مخدم الإشتراكات غير متوفر" +LICENSING_DOMAIN_EXPIRED = "الإشتراك لهذا الموقع قد انتهى" +LICENSING_DOMAIN_BANNED = "الإشتراك لهذا الموقع قد تم حجبه" +DEMO_SEND_MESSAGE_ERROR = "لأسباب أمنية, هذا الحساب غير مسموح له إرسال رسائل" +DEMO_ACCOUNT_ERROR = "لأسباب أمنية , هذا الحساب قد منع من هذا الإجراء" +ACCOUNT_ALREADY_EXISTS = "الحساب موجود مسبقاَ" +MAIL_SERVER_ERROR = "حدث خطأ أثناء محاولة الوصول الى المخدم البريدي" +INVALID_INPUT_ARGUMENT = "Invalid input argument" +UNKNOWN_ERROR = "خطأ غير معروف" + +[STATIC] +BACK_LINK = "إعادة التحميل" +DOMAIN_LIST_DESC = "قائمة المواقع البريدية المسموح فيها لهذا البريد بالوصول" +PHP_EXSTENSIONS_ERROR_DESC = "!إضافات الـ بي إتش بي المطلوبة,غير متوافرة في إعدادات الـ بي إتش بي لديك" +PHP_VERSION_ERROR_DESC = "أقل من الإصدار المطلوب 5.3.0!(%VERSION%) PHP إصدار " +NO_SCRIPT_TITLE = "الجافا سكريبت مطلوبة لهذا البرنامج" +NO_SCRIPT_DESC = "إن متصفحك لايدعم الجافا سكريبت . يرجى تفعيل الدعم أو تجريب متصفح أخر" +NO_COOKIE_TITLE = "Cookies support is required for this application." +NO_COOKIE_DESC = "Cookies support is not available in your browser. +Please enable Cookie support in your browser settings and retry." +BAD_BROWSER_TITLE = "متصفحك بحاجة الى تحديث" +BAD_BROWSER_DESC = "لإصتخدام جميع ميزات هذا البرنامج يرجى تنزيل أحد المتصفحات التالية الداعمة:" From 787f42432999f1aa485050fda5674cbf2e6ab404 Mon Sep 17 00:00:00 2001 From: Filip Blaauw Date: Tue, 28 Jul 2015 14:02:30 +0200 Subject: [PATCH 100/106] Update no.ini Updated all english strings to norwegian. --- rainloop/v/0.0.0/langs/no.ini | 244 +++++++++++++++++----------------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index b9ca5977e..16a2aa3ab 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -118,10 +118,10 @@ BUTTON_EDIT_AS_NEW = "Endre som ny" BUTTON_SHOW_IMAGES = "Vis eksterne bilder" BUTTON_NOTIFY_READ_RECEIPT = "Avsender har bedt om lesebekreftelse" BUTTON_IN_NEW_WINDOW = "Vis i eget vindu" -BUTTON_THREAD_LIST = "Thread list" -BUTTON_THREAD_PREV = "Previous" -BUTTON_THREAD_NEXT = "Next" -BUTTON_THREAD_MORE = "More messages" +BUTTON_THREAD_LIST = "Trådliste" +BUTTON_THREAD_PREV = "Forrige" +BUTTON_THREAD_NEXT = "Neste" +BUTTON_THREAD_MORE = "Flere meldinger" MENU_HEADERS = "Vis meldingshoder" MENU_VIEW_ORIGINAL = "Vis original" MENU_DOWNLOAD_ORIGINAL = "Last ned som .eml-fil" @@ -151,8 +151,8 @@ PGP_PASSWORD_INPUT_PLACEHOLDER = "Passord" PGP_SIGNED_MESSAGE_DESC = "OpenPGP-signert melding (klikk for å verifisere)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP-kryptert melding (klikk for å dekryptere)" LINK_DOWNLOAD_AS_ZIP = "Download as zip" -LINK_SAVE_TO_OWNCLOUD = "Save to ownCloud" -LINK_SAVE_TO_DROPBOX = "Save to Dropbox" +LINK_SAVE_TO_OWNCLOUD = "Lage i ownCloud" +LINK_SAVE_TO_DROPBOX = "Lagre i Dropbox" [READ_RECEIPT] SUBJECT = "Lesebekreftelse (meldingen er lest) - %SUBJECT%" @@ -184,7 +184,7 @@ LABEL_PHONE = "Telefon" LABEL_WEB = "Web" LABEL_BIRTHDAY = "Bursdag" LINK_ADD_EMAIL = "Legg til en e-postadresse" -LINK_ADD_PHONE = "Legg til en telefon" +LINK_ADD_PHONE = "Legg til telefonnummer" LINK_BIRTHDAY = "Bursdag" PLACEHOLDER_ENTER_DISPLAY_NAME = "Visningsnavn" PLACEHOLDER_ENTER_LAST_NAME = "Etternavn" @@ -234,16 +234,16 @@ FORWARD_MESSAGE_TOP_CC = "CC" FORWARD_MESSAGE_TOP_SENT = "Sendt" FORWARD_MESSAGE_TOP_SUBJECT = "Emne" EMPTY_TO_ERROR_DESC = "Vennligst oppgi minst én mottaker" -NO_ATTACHMENTS_HERE_DESC = "No attachments here." -ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded." +NO_ATTACHMENTS_HERE_DESC = "Ingen vedlegg her." +ATTACHMENTS_ERROR_DESC = "Advarsel! Alle vedleggene er ikke lastet opp ennå." ATTACHMENTS_UPLOAD_ERROR_DESC = "Alle vedleggene er ikke lastet opp ennå" BUTTON_REQUEST_READ_RECEIPT = "Be om en lesebekreftelse når meldingen er lest" -BUTTON_MARK_AS_IMPORTANT = "Mark as important" -BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)" -BUTTON_REQUEST_DSN = "Request a delivery receipt" +BUTTON_MARK_AS_IMPORTANT = "Merk som viktig" +BUTTON_OPEN_PGP = "OpenPGP (Bare i ren tekst)" +BUTTON_REQUEST_DSN = "Be om leveringsbekreftelse" [POPUPS_WELCOME_PAGE] -BUTTON_CLOSE = "Close" +BUTTON_CLOSE = "Lukk" [POPUPS_ASK] BUTTON_YES = "Ja" @@ -257,8 +257,8 @@ TITLE_LANGUAGES = "Velg språk" [POPUPS_ADD_ACCOUNT] TITLE_ADD_ACCOUNT = "Legg til konto?" BUTTON_ADD_ACCOUNT = "Legg til" -TITLE_UPDATE_ACCOUNT = "Update Account?" -BUTTON_UPDATE_ACCOUNT = "Update" +TITLE_UPDATE_ACCOUNT = "Oppdatere konto?" +BUTTON_UPDATE_ACCOUNT = "Oppdater" [POPUPS_IDENTITY] TITLE_ADD_IDENTITY = "Legg til identitet?" @@ -268,10 +268,10 @@ BUTTON_UPDATE_IDENTITY = "Oppdater" LABEL_EMAIL = "E-post" LABEL_NAME = "Navn" LABEL_REPLY_TO = "Svar til" -LABEL_SIGNATURE = "Signature" +LABEL_SIGNATURE = "Signatur" LABEL_CC = "Cc" LABEL_BCC = "Blindkopi" -LABEL_SIGNATURE_INSERT_BEFORE = "Insert this signature before quoted text in replies" +LABEL_SIGNATURE_INSERT_BEFORE = "Legg til denne signaturen før sitert tekst" [POPUPS_CREATE_FOLDER] TITLE_CREATE_FOLDER = "Opprett en mappe ?" @@ -308,7 +308,7 @@ LABEL_EMAIL = "E-post" LABEL_NAME = "Navn" LABEL_PASSWORD = "Passord" LABEL_KEY_BIT_LENGTH = "Nøkkellengde" -BUTTON_GENERATE_OPEN_PGP_KEYS = "Generate" +BUTTON_GENERATE_OPEN_PGP_KEYS = "Generer" [POPUPS_COMPOSE_OPEN_PGP] TITLE_COMPOSE_OPEN_PGP = "OpenPGP signer/krypter" @@ -320,10 +320,10 @@ BUTTON_ENCRYPT = "Krypter" BUTTON_SIGN_AND_ENCRYPT = "Signer og krypter" [POPUPS_MESSAGE_OPEN_PGP] -TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt" -LABEL_KEY = "Private Key" -LABEL_PASSWORD = "Password" -BUTTON_DECRYPT = "Decrypt" +TITLE_MESSAGE_OPEN_PGP = "OpenPGP dekrypter" +LABEL_KEY = "Private nøkkel" +LABEL_PASSWORD = "Passoord" +BUTTON_DECRYPT = "Dekrypter" [POPUPS_TWO_FACTOR_TEST] TITLE_TEST_CODE = "2-stegs verifiseringstest" @@ -331,45 +331,45 @@ LABEL_CODE = "Kode" BUTTON_TEST = "Test" [POPUPS_FILTER] -TITLE_CREATE_FILTER = "Create a filter?" -TITLE_EDIT_FILTER = "Update filter?" -FILTER_NAME = "Name" -LEGEND_CONDITIONS = "Conditions" -LEGEND_ACTIONS = "Actions" -BUTTON_DONE = "Done" -BUTTON_ADD_CONDITION = "Add a Condition" -SELECT_ACTION_NONE = "None" -SELECT_ACTION_MOVE_TO = "Move to" -SELECT_ACTION_FORWARD_TO = "Forward to" -SELECT_ACTION_REJECT = "Reject" -SELECT_ACTION_VACATION_MESSAGE = "Vacation message" -SELECT_ACTION_DISCARD = "Discard" -SELECT_FIELD_FROM = "From" -SELECT_FIELD_RECIPIENTS = "Recipients (To or CC)" -SELECT_FIELD_SUBJECT = "Subject" -SELECT_FIELD_HEADER = "Header" -SELECT_FIELD_SIZE = "Size" -SELECT_TYPE_CONTAINS = "Contains" -SELECT_TYPE_NOT_CONTAINS = "Not Contains" -SELECT_TYPE_MATCHES = "Matches (* and ? supported)" -SELECT_TYPE_NOT_MATCHES = "Not Matches (* and ? supported)" +TITLE_CREATE_FILTER = "Opprette et filter?" +TITLE_EDIT_FILTER = "Oppdater filter?" +FILTER_NAME = "Navn" +LEGEND_CONDITIONS = "Betingelser" +LEGEND_ACTIONS = "Handlinger" +BUTTON_DONE = "Ferdig" +BUTTON_ADD_CONDITION = "Legg til en betingelse" +SELECT_ACTION_NONE = "Ingen" +SELECT_ACTION_MOVE_TO = "Flytt til" +SELECT_ACTION_FORWARD_TO = "Videresend til" +SELECT_ACTION_REJECT = "Avvis" +SELECT_ACTION_VACATION_MESSAGE = "Feriemelding" +SELECT_ACTION_DISCARD = "Forkast" +SELECT_FIELD_FROM = "Fra" +SELECT_FIELD_RECIPIENTS = "Mottakere (til eller CC)" +SELECT_FIELD_SUBJECT = "Emne" +SELECT_FIELD_HEADER = "Meldingshode" +SELECT_FIELD_SIZE = "Størrelse" +SELECT_TYPE_CONTAINS = "Inneholder" +SELECT_TYPE_NOT_CONTAINS = "Inneholder ikke" +SELECT_TYPE_MATCHES = "Matcher (støtte for * og ?)" +SELECT_TYPE_NOT_MATCHES = "Matcher ikke (støtte for * og ?)" SELECT_TYPE_REGEXP = "Regexp" -SELECT_TYPE_NOT_REGEXP = "Not Regexp" -SELECT_TYPE_EQUAL_TO = "Equal To" -SELECT_TYPE_NOT_EQUAL_TO = "Not Equal To" +SELECT_TYPE_NOT_REGEXP = "Ikke Regexp" +SELECT_TYPE_EQUAL_TO = "Er lik" +SELECT_TYPE_NOT_EQUAL_TO = "Er ikke lik" SELECT_TYPE_OVER = "Over" SELECT_TYPE_UNDER = "Under" -SELECT_MATCH_ANY = "Matching any of the following rules" -SELECT_MATCH_ALL = "Matching all of the following rules" -MARK_AS_READ_LABEL = "Mark as read" -REPLY_INTERVAL_LABEL = "Reply interval (days)" -KEEP_LABEL = "Keep" -STOP_LABEL = "Don't stop processing rules" -EMAIL_LABEL = "Email" -VACATION_SUBJECT_LABEL = "Subject (optional)" -VACATION_MESSAGE_LABEL = "Message" -REJECT_MESSAGE_LABEL = "Reject message" -ALL_INCOMING_MESSAGES_DESC = "All incoming messages" +SELECT_MATCH_ANY = "Samsvarer med en av følgende regler" +SELECT_MATCH_ALL = "Samsvarer med alle følgende regler" +MARK_AS_READ_LABEL = "Merk som lest" +REPLY_INTERVAL_LABEL = "Svarintervall (dager)" +KEEP_LABEL = "Behold" +STOP_LABEL = "Ikke stopp bruk av regler" +EMAIL_LABEL = "E-post" +VACATION_SUBJECT_LABEL = "Emne (valgfritt)" +VACATION_MESSAGE_LABEL = "Melding" +REJECT_MESSAGE_LABEL = "Forkast melding" +ALL_INCOMING_MESSAGES_DESC = "Alle innkommende meldinger" [POPUPS_SYSTEM_FOLDERS] TITLE_SYSTEM_FOLDERS = "Velg systemmapper" @@ -399,20 +399,20 @@ LABEL_TWO_FACTOR_STATUS = "Status" LABEL_TWO_FACTOR_SECRET = "Secret" LABEL_TWO_FACTOR_BACKUP_CODES = "Backupkoder" BUTTON_CREATE = "Lag ny secret" -BUTTON_ACTIVATE = "Activate" +BUTTON_ACTIVATE = "Aktiver" BUTTON_CLEAR = "Tøm" -BUTTON_LOGOUT = "Logout" -BUTTON_DONE = "Done" +BUTTON_LOGOUT = "Logg ut" +BUTTON_DONE = "Ferdig" BUTTON_TEST = "Test" LINK_TEST = "test" -BUTTON_SHOW_SECRET = "Vis secret" +BUTTON_SHOW_SECRET = "Vis Secret" BUTTON_HIDE_SECRET = "Skjul Secret" -TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_REQUIRE_DESC = "Din konto krever 2-stegs verifisering." TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfigurert" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Ikke konfigurert" TWO_FACTOR_SECRET_DESC = "Importer denne informasjonen til din Google Authenticator klient (eller andre klienter) ved å bruke QR-koden under, eller ved å skrive inn koden manuelt." -TWO_FACTOR_BACKUP_CODES_DESC = "Om du ikke mottar koder fra Google Authenticator, kan du brukeyou can use backupkodene for å logge inn. Disse kodene vil bli deaktivert etter bruk." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." +TWO_FACTOR_BACKUP_CODES_DESC = "Om du ikke mottar koder fra Google Authenticator, kan du bruke backupkodene for å logge inn. Disse kodene vil bli deaktivert etter bruk." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Du kan ikke endre denne innstillingen før du tester." [TITLES] LOADING = "Laster" @@ -444,7 +444,7 @@ LABEL_ACCOUNTS_NAME = "Kontoer" LABEL_IDENTITY_NAME = "Identitet" LABEL_IDENTITIES_NAME = "Identiteter" LABEL_FILTERS_NAME = "Filters" -LABEL_TEMPLATES_NAME = "Templates" +LABEL_TEMPLATES_NAME = "Maler" LABEL_SECURITY_NAME = "Sikkerhet" LABEL_SOCIAL_NAME = "Sosialt" LABEL_THEMES_NAME = "Tema" @@ -453,21 +453,21 @@ LABEL_OPEN_PGP_NAME = "OpenPGP" BUTTON_BACK = "Tilbake" [SETTINGS_FILTERS] -LEGEND_FILTERS = "Filters" -BUTTON_SAVE = "Save" -BUTTON_ADD_FILTER = "Add a Filter" -BUTTON_DELETE = "Delete" -BUTTON_RAW_SCRIPT = "Use Custom User Script" -SUBNAME_NONE = "None" -SUBNAME_MOVE_TO = "Move to \"%FOLDER%\"" -SUBNAME_FORWARD_TO = "Forward to \"%EMAIL%\"" -SUBNAME_REJECT = "Reject" -SUBNAME_VACATION_MESSAGE = "Vacation message" -SUBNAME_DISCARD = "Discard" -CAPABILITY_LABEL = "Capability" -LOADING_PROCESS = "Updating filter list" -DELETING_ASK = "Are you sure?" -CHACHES_NEED_TO_BE_SAVED_DESC = "These changes need to be saved to the server." +LEGEND_FILTERS = "Filtre" +BUTTON_SAVE = "Lagre" +BUTTON_ADD_FILTER = "Legg til et filter" +BUTTON_DELETE = "Slett" +BUTTON_RAW_SCRIPT = "Bruk egendefinert script" +SUBNAME_NONE = "Ingen" +SUBNAME_MOVE_TO = "Flytt til \"%FOLDER%\"" +SUBNAME_FORWARD_TO = "Videresend til \"%EMAIL%\"" +SUBNAME_REJECT = "Avslå" +SUBNAME_VACATION_MESSAGE = "Feriemelding" +SUBNAME_DISCARD = "Forkast" +CAPABILITY_LABEL = "Evne" +LOADING_PROCESS = "Oppdater filterlisten" +DELETING_ASK = "Er du sikker?" +CHACHES_NEED_TO_BE_SAVED_DESC = "Disse endringene må lagres på serveren." [SETTINGS_IDENTITY] LEGEND_IDENTITY = "Identitet" @@ -477,25 +477,25 @@ LABEL_SIGNATURE = "Signatur" LABEL_ADD_SIGNATURE_TO_ALL = "Vil du legge til signatur i alle utgående meldinger?" [SETTINGS_SECURITY] -LEGEND_SECURITY = "Security" -LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" -LABEL_AUTOLOGOUT = "Auto Logout" -AUTOLOGIN_NEVER_OPTION_NAME = "Never" -AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" +LEGEND_SECURITY = "Sikkerhet" +LABEL_CONFIGURATE_TWO_FACTOR = "Konfiguer 2-stegs verifisering" +LABEL_AUTOLOGOUT = "Logg ut automatisk" +AUTOLOGIN_NEVER_OPTION_NAME = "Aldri" +AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minutt(er)" [SETTINGS_GENERAL] LEGEND_GENERAL = "Generelt" LABEL_LANGUAGE = "Språk" -LABEL_IDENTITY = "Identity" -LABEL_LAYOUT = "Layout" -LABEL_LAYOUT_NO_SPLIT = "No Split" -LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split" -LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split" +LABEL_IDENTITY = "Identitet" +LABEL_LAYOUT = "Utseende" +LABEL_LAYOUT_NO_SPLIT = "Ingen splitting" +LABEL_LAYOUT_VERTICAL_SPLIT = "Vertikal splitting" +LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horisontal splitting" LABEL_EDITOR = "Standard teksteditor" LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_PLAIN = "Ren tekst" -LABEL_EDITOR_HTML_FORCED = "Html (forced)" -LABEL_EDITOR_PLAIN_FORCED = "Plain (forced)" +LABEL_EDITOR_HTML_FORCED = "Html (tvungen)" +LABEL_EDITOR_PLAIN_FORCED = "Ren tekst (tvungen)" LABEL_ANIMATION = "Interface animasjon" LABEL_ANIMATION_FULL = "Full" LABEL_ANIMATION_NORMAL = "Normal" @@ -509,7 +509,7 @@ LABEL_SHOW_IMAGES = "Vis alltid eksterne bilder i meldingsteksten" LABEL_SHOW_ANIMATION = "Vis animasjon" LABEL_MESSAGE_PER_PAGE = "Meldinger på hver side" LABEL_NOTIFICATIONS = "Varsler" -LABEL_SOUND_NOTIFICATION = "Sound notification" +LABEL_SOUND_NOTIFICATION = "Lydvarsler" LABEL_CHROME_NOTIFICATION_DESC = "Vis popup-varsel når du mottar en ny melding" LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(Blokkert av nettleseren)" @@ -561,22 +561,22 @@ CREATING_PROCESS = "Oppretter mappen" DELETING_PROCESS = "Slette en mappe" RENAMING_PROCESS = "Endre navn på en mappe" DELETING_ASK = "Er du sikker?" -TO_MANY_FOLDERS_DESC_1 = "You have too many folders!" -TO_MANY_FOLDERS_DESC_2 = "We have shown only a part of them, to avoid performance problems." -HELP_DELETE_FOLDER = "Delete folder" -HELP_SHOW_HIDE_FOLDER = "Show/hide folder" -HELP_CHECK_FOR_NEW_MESSAGES = "Check/don't check for new messages" +TO_MANY_FOLDERS_DESC_1 = "Du har for mange mapper!" +TO_MANY_FOLDERS_DESC_2 = "Vi har bare vist en del av problemet for å unngå problemer med ytelsen." +HELP_DELETE_FOLDER = "Slett mappe" +HELP_SHOW_HIDE_FOLDER = "Vis/skjul mappe" +HELP_CHECK_FOR_NEW_MESSAGES = "Sjekk/ikke sjekk for nye meldinger" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Kontoer" -LEGEND_IDENTITIES = "Identities" -LEGEND_ACCOUNTS_AND_IDENTITIES = "Accounts and Identities" +LEGEND_IDENTITIES = "Identiteter" +LEGEND_ACCOUNTS_AND_IDENTITIES = "Kontoer og identiteter" BUTTON_ADD_ACCOUNT = "Legg til konto" -BUTTON_ADD_IDENTITY = "Add an Identity" +BUTTON_ADD_IDENTITY = "Legg til en identitet" BUTTON_DELETE = "Slett" LOADING_PROCESS = "Oppdaterer kontoer" DELETING_ASK = "Er du sikker?" -DEFAULT_IDENTITY_LABEL = "default" +DEFAULT_IDENTITY_LABEL = "Standard" [SETTINGS_IDENTITIES] LEGEND_IDENTITY = "Identitet" @@ -606,7 +606,7 @@ BUTTON_GENERATE_OPEN_PGP_KEYS = "Generer OpenPGP-nøkler" TITLE_PRIVATE = "Privat" TITLE_PUBLIC = "Offentlig" DELETING_ASK = "Er du sikker?" -GENERATE_ONLY_HTTPS = "HTTPS only" +GENERATE_ONLY_HTTPS = "Kun HTTPS" [SHORTCUTS_HELP] LEGEND_SHORTCUTS_HELP = "Tastatursnarveier" @@ -618,12 +618,12 @@ LABEL_OPEN_USER_DROPDOWN = "Åpne brukerliste" LABEL_REPLY = "Svar" LABEL_REPLY_ALL = "Svar alle" LABEL_FORWARD = "Videresend" -LABEL_FORWARD_MULTIPLY = "Videresent (mange)" +LABEL_FORWARD_MULTIPLY = "Videresend som vedlegg" LABEL_HELP = "Hjelp" LABEL_CHECK_ALL = "Merk alle meldinger" LABEL_ARCHIVE = "Arkiver" LABEL_DELETE = "Slett" -LABEL_OPEN_THREAD = "Open selected thread" +LABEL_OPEN_THREAD = "Åpne valgt tråd" LABEL_MOVE = "Flytt" LABEL_READ = "Merk som lest" LABEL_UNREAD = "Merk som ulest" @@ -636,8 +636,8 @@ LABEL_SWITCH_TO_MESSAGE = "Flytt fokus til valgt melding" LABEL_SWITCH_TO_FOLDER_LIST = "Flytt fokus til mappeliste" LABEL_FULLSCREEN_TOGGLE = "Fullskjerm modus" LABEL_BLOCKQUOTES_TOGGLE = "Vis/skjul sitert melding" -LABEL_THREAD_NEXT = "Next message in thread" -LABEL_THREAD_PREV = "Previous message in thread" +LABEL_THREAD_NEXT = "Neste melding i tråd" +LABEL_THREAD_PREV = "Forrige melding i tråd" LABEL_PRINT = "Skriv ut" LABEL_EXIT_FULLSCREEN = "Avslutt fullskjerm modus" LABEL_CLOSE_MESSAGE = "Lukk melding" @@ -649,16 +649,16 @@ LABEL_SEND_MESSAGE = "Send melding" LABEL_CLOSE_COMPOSE = "Lukk ny melding" [PGP_NOTIFICATIONS] -NO_PUBLIC_KEYS_FOUND = "No public keys found" -NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" -NO_PRIVATE_KEY_FOUND = "No private key found" -NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" -UNVERIFIRED_SIGNATURE = "Unverified signature" -DECRYPTION_ERROR = "OpenPGP decryption error" -GOOD_SIGNATURE = "Good signature from %USER%" -PGP_ERROR = "OpenPGP error: %ERROR%" -SPECIFY_FROM_EMAIL = "Please specify FROM email address" -SPECIFY_AT_LEAST_ONE_RECIPIENT = "Please specify at least one recipient" +NO_PUBLIC_KEYS_FOUND = "Ingen offentlige nøkler funnet" +NO_PUBLIC_KEYS_FOUND_FOR = "Ingen offentlige nøkler ble funnet for \"%EMAIL%\" epost" +NO_PRIVATE_KEY_FOUND = "Ingen private nøkler funnet" +NO_PRIVATE_KEY_FOUND_FOR = "Ingen private nøkler ble funnet for \"%EMAIL%\" epost" +UNVERIFIRED_SIGNATURE = "Uverifisert signatur" +DECRYPTION_ERROR = "Feil med OpenPGP dekryptering" +GOOD_SIGNATURE = "Godkjent signatur fra %USER%" +PGP_ERROR = "OpenPGP feil: %ERROR%" +SPECIFY_FROM_EMAIL = "Vennligst spesifieser en avsenderadresse" +SPECIFY_AT_LEAST_ONE_RECIPIENT = "Vennligst spesifiser minst én mottaker" [NOTIFICATIONS] INVALID_TOKEN = "Ugyldig token" @@ -686,9 +686,9 @@ CANT_MOVE_MESSAGE = "Kan ikke flytte meldingen" CANT_SAVE_MESSAGE = "Kan ikke lagre melding" CANT_SEND_MESSAGE = "Kan ikke sende melding" INVALID_RECIPIENTS = "Ugyldige mottakere" -CANT_SAVE_FILTERS = "Can't save filters" -CANT_GET_FILTERS = "Can't get filters" -FILTERS_ARE_NOT_CORRECT = "Filters are not correct" +CANT_SAVE_FILTERS = "Kan ikke lagre filtre" +CANT_GET_FILTERS = "Kan ikke hente filtre" +FILTERS_ARE_NOT_CORRECT = "Filtre er ikke korrekte" CANT_CREATE_FOLDER = "Kan ikke opprette mappe" CANT_RENAME_FOLDER = "Kan ikke endre navn på mappen" CANT_DELETE_FOLDER = "Kan ikke slette mappen" @@ -706,7 +706,7 @@ LICENSING_SERVER_IS_UNAVAILABLE = "Abonnement-server er utilgjengelig" LICENSING_DOMAIN_EXPIRED = "Abonnementet for dette domenet er utløpt." LICENSING_DOMAIN_BANNED = "Abonnementet for dette domenet er forbudt." DEMO_SEND_MESSAGE_ERROR = "For sikkerhets skyld, denne demo-konto kan ikke sende meldinger til eksterne e-postadresser!" -DEMO_ACCOUNT_ERROR = "For security purposes, this account is not allowed for this action!" +DEMO_ACCOUNT_ERROR = "For sikkerhetsårsaker er ikke dette valget mulig for denne kontoen" ACCOUNT_ALREADY_EXISTS = "Kontoen finnes allerede" MAIL_SERVER_ERROR = "Det har oppstått en feil under tilgang til e-postserver" INVALID_INPUT_ARGUMENT = "Ugyldig input argument" From 3849fd02b4340107af5d02018a825e99f2ada52b Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 23 Jul 2015 21:57:46 +0400 Subject: [PATCH 101/106] Small fixes --- dev/App/User.js | 4 +-- .../MailSo/Base/StreamWrappers/TempFile.php | 9 +++-- .../0.0.0/app/libraries/MailSo/Base/Utils.php | 32 +++++++++++++++++ .../0.0.0/app/libraries/MailSo/Log/Logger.php | 27 ++++++++++++++ .../v/0.0.0/app/libraries/PHPThumb/GD.php | 6 ++-- .../0.0.0/app/libraries/RainLoop/Actions.php | 36 +++++++++++-------- .../v/0.0.0/app/libraries/RainLoop/Api.php | 2 ++ .../libraries/RainLoop/Config/Application.php | 6 ++-- .../v/0.0.0/app/libraries/RainLoop/Utils.php | 20 ++++++++--- 9 files changed, 113 insertions(+), 29 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index 34ab67f24..290ec2f08 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -1385,7 +1385,7 @@ { PgpStore.openpgp.initWorker(Links.openPgpWorkerJs()); } - + // PgpStore.openpgp.config.useWebCrypto = false; PgpStore.openpgpKeyring = new openpgp.Keyring(); @@ -1521,7 +1521,7 @@ self.initVerticalLayoutResizer(Enums.ClientSideKeyName.FolderListSize); }); - if (Tinycon && !Settings.settingsGet('Filtered')) + if (Tinycon && Settings.settingsGet('FaviconStatus') && !Settings.settingsGet('Filtered') ) { Tinycon.setOptions({ fallback: false diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php index dfe6ff609..196b2b5f5 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php @@ -43,14 +43,16 @@ class TempFile /** * @param string $sHash + * @param string $sFileName * * @return resource|bool */ - public static function CreateStream($sHash) + public static function CreateStream($sHash, &$sFileName = '') { self::Reg(); - return fopen(self::STREAM_NAME.'://'.$sHash, 'r+b'); + $sFileName = self::STREAM_NAME.'://'.$sHash; + return fopen($sFileName, 'r+b'); } /** @@ -72,6 +74,7 @@ class TempFile is_resource(self::$aStreams[$sHashName])) { $this->rSream = self::$aStreams[$sHashName]; + \fseek($this->rSream, 0); $bResult = true; } else @@ -93,7 +96,7 @@ class TempFile */ public function stream_close() { - return -1 !== fseek($this->rSream, 0); + return true; } /** diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index b68dea933..d2608c334 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -2448,6 +2448,38 @@ END; return ('' === $sUser ? '' : $sUser.'@').$sDomain; } + /** + * @param string $sHash + * @param string $sSalt + * + * @return int + */ + public static function HashToId($sHash, $sSalt = '') + { + $sData = $sHash ? @\MailSo\Base\Crypt::XxteaDecrypt(\hex2bin($sHash), \md5($sSalt)) : null; + + $aMatch = array(); + if ($sData && preg_match('/^id:(\d+)$/', $sData, $aMatch) && isset($aMatch[1])) + { + return is_numeric($aMatch[1]) ? (int) $aMatch[1] : null; + } + + return null; + } + + /** + * @param int $iID + * @param string $sSalt + * + * @return string + */ + public static function IdToHash($iID, $sSalt = '') + { + return is_int($iID) ? + \bin2hex(\MailSo\Base\Crypt::XxteaEncrypt('id:'.$iID, \md5($sSalt))) : null + ; + } + /** * @param string $sPassword * diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php index 4ea1dc978..49022c446 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php @@ -371,6 +371,33 @@ class Logger extends \MailSo\Base\Collection return false; } + /** + * @param \Exception $oException + * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * @param bool $bDiplayCrLf = false + * + * @return bool + */ + public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', + $bSearchSecretWords = true, $bDiplayCrLf = false) + { + if ($oException instanceof \Exception) + { + if (isset($oException->__LOGINNED__)) + { + return true; + } + + $oException->__LOGINNED__ = true; + + return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); + } + + return false; + } + /** * @param mixed $mData * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE diff --git a/rainloop/v/0.0.0/app/libraries/PHPThumb/GD.php b/rainloop/v/0.0.0/app/libraries/PHPThumb/GD.php index 190d8a0ad..733fe476c 100644 --- a/rainloop/v/0.0.0/app/libraries/PHPThumb/GD.php +++ b/rainloop/v/0.0.0/app/libraries/PHPThumb/GD.php @@ -1353,13 +1353,13 @@ class GD extends PHPThumb switch ($this->format) { case 'GIF': - $isCompatible = $gdInfo['GIF Create Support']; + $isCompatible = isset($gdInfo['GIF Create Support']); break; case 'JPG': $isCompatible = (isset($gdInfo['JPG Support']) || isset($gdInfo['JPEG Support'])) ? true : false; break; case 'PNG': - $isCompatible = $gdInfo[$this->format . ' Support']; + $isCompatible = isset($gdInfo[$this->format . ' Support']); break; default: $isCompatible = false; @@ -1367,7 +1367,7 @@ class GD extends PHPThumb if (!$isCompatible) { // one last check for "JPEG" instead - $isCompatible = $gdInfo['JPEG Support']; + $isCompatible = isset($gdInfo['JPEG Support']); if (!$isCompatible) { throw new \Exception("Your GD installation does not support {$this->format} image types"); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index c38b77c07..88759c1b5 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -560,7 +560,7 @@ class Actions public function SetAuthLogoutToken() { @\header('X-RainLoop-Action: Logout'); - \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0, '/', null, null, true); + \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0); } /** @@ -575,7 +575,7 @@ class Actions $sSpecAuthToken = '_'.$oAccount->GetAuthTokenQ(); $this->SetSpecAuthToken($sSpecAuthToken); - \RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0, '/', null, null, true); + \RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0); if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken())) { @@ -584,7 +584,7 @@ class Actions 'e' => $oAccount->Email(), 't' => $oAccount->SignMeToken() )), - \time() + 60 * 60 * 24 * 30, '/', null, null, true); + \time() + 60 * 60 * 24 * 30); $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, @@ -632,7 +632,7 @@ class Actions */ private function setAdminAuthToken($sToken) { - \RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0, '/', null, null, true); + \RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0); } /** @@ -1171,7 +1171,7 @@ class Actions 'Time' => \microtime(true), 'MailTo' => 'MailTo', 'To' => $sTo - )), 0, '/', null, null, true); + )), 0); } } @@ -1400,6 +1400,7 @@ class Actions 'MaterialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), 'FolderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50), 'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')), + 'FaviconStatus' => (bool) $oConfig->Get('labs', 'favicon_status', true), 'Filtered' => '' !== \trim(\RainLoop\Api::Config()->Get('labs', 'imap_message_list_permanent_filter', '')), 'Community' => true, 'PremType' => false, @@ -2151,7 +2152,7 @@ class Actions if ($bAdditionalCodeSignMe) { \RainLoop\Utils::SetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, $sSecretHash, - \time() + 60 * 60 * 24 * 14, '/', null, null, true); + \time() + 60 * 60 * 24 * 14); } if (!$bGood && !$this->TwoFactorAuthProvider()->VerifyCode($aData['Secret'], $sAdditionalCode)) @@ -8324,21 +8325,28 @@ class Actions $bDone = false; if ($bThumbnail && !$bDownload) { - \MailSo\Base\StreamWrappers\TempFile::Reg(); + $sFileName = ''; + $rTempResource = \MailSo\Base\StreamWrappers\TempFile::CreateStream( + \MailSo\Base\Utils::Md5Rand($sFileNameOut), $sFileName); - $sFileName = 'mailsotempfile://'.\MailSo\Base\Utils::Md5Rand($sFileNameOut); - - $rTempResource = @\fopen($sFileName, 'r+b'); if (@\is_resource($rTempResource)) { + $bDone = true; + \MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource)); @\fclose($rTempResource); - $oThumb =@ new \PHPThumb\GD($sFileName); - if ($oThumb) + try { - $oThumb->adaptiveResize(60, 60)->show(); - $bDone = true; + $oThumb = new \PHPThumb\GD($sFileName); + if ($oThumb) + { + $oThumb->adaptiveResize(60, 60)->show(); + } + } + catch (\Exception $oException) + { + $self->Logger()->WriteExceptionShort($oException); } } } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php index d3b5eefb3..5680c1359 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php @@ -108,6 +108,8 @@ class Api $sSslCafile = \RainLoop\Api::Config()->Get('ssl', 'cafile', ''); $sSslCapath = \RainLoop\Api::Config()->Get('ssl', 'capath', ''); + \RainLoop\Utils::$CookieDefaultPath = \RainLoop\Api::Config()->Get('labs', 'cookie_path', '/'); + if (!empty($sSslCafile) || !empty($sSslCapath)) { \MailSo\Hooks::Add('Net.NetClient.StreamContextSettings/Filter', function (&$aStreamContextSettings) use ($sSslCafile, $sSslCapath) { diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index a910dc635..1282de2c9 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -329,8 +329,9 @@ Enables caching in the system'), 'smtp_show_server_errors' => array(false), 'sieve_allow_raw_script' => array(false), 'sieve_utf8_folder_name' => array(true), - 'mail_func_clear_headers ' => array(true), - 'mail_func_additional_parameters ' => array(false), + 'mail_func_clear_headers' => array(true), + 'mail_func_additional_parameters' => array(false), + 'favicon_status' => array(true), 'folders_spec_limit' => array(50), 'owncloud_save_folder' => array('Attachments'), 'curl_proxy' => array(''), @@ -347,6 +348,7 @@ Enables caching in the system'), 'fast_cache_memcache_port' => array(11211), 'fast_cache_memcache_expire' => array(43200), 'use_local_proxy_for_external_images' => array(false), + 'cookie_path' => array('/'), 'startup_url' => array(''), 'emogrifier' => array(true), 'dev_email' => array(''), diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php index 594a2fc8e..56a53082f 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -4,6 +4,11 @@ namespace RainLoop; class Utils { + /** + * @var string + */ + static $CookieDefaultPath = '/'; + static $Cookies = null; static $RSA = null; @@ -299,7 +304,7 @@ class Utils if (null === $sToken) { $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); - \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30, '/', null, null, true); + \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); } return \md5('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); @@ -324,7 +329,7 @@ class Utils if (null === $sToken) { $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); - \RainLoop\Utils::SetCookie($sKey, $sToken, 0, '/', null, null, true); + \RainLoop\Utils::SetCookie($sKey, $sToken, 0); } return \md5('Session'.APP_SALT.$sToken.'Token'.APP_SALT); @@ -340,7 +345,7 @@ class Utils $sToken = \RainLoop\Utils::GetCookie($sKey, ''); if (!empty($sToken)) { - \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30, '/', null, null, true); + \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); } } @@ -503,13 +508,18 @@ class Utils return isset(\RainLoop\Utils::$Cookies[$sName]) ? \RainLoop\Utils::$Cookies[$sName] : $mDefault; } - public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = '/', $sDomain = '', $sSecure = false, $bHttpOnly = false) + public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = null, $sDomain = null, $sSecure = null, $bHttpOnly = true) { if (null === \RainLoop\Utils::$Cookies) { \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); } + if (null === $sPath) + { + $sPath = \RainLoop\Utils::$CookieDefaultPath; + } + \RainLoop\Utils::$Cookies[$sName] = $sValue; @\setcookie($sName, $sValue, $iExpire, $sPath, $sDomain, $sSecure, $bHttpOnly); } @@ -522,7 +532,7 @@ class Utils } unset(\RainLoop\Utils::$Cookies[$sName]); - @\setcookie($sName, '', \time() - 3600 * 24 * 30, '/'); + @\setcookie($sName, '', \time() - 3600 * 24 * 30); } /** From 5123841540e8ea9b035cd74080b86d3bbb9a3cf3 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 29 Jul 2015 21:21:24 +0400 Subject: [PATCH 102/106] Pgp improvements --- dev/Common/Audio.js | 2 - dev/Common/Globals.js | 2 + dev/Common/Translator.js | 27 ++- dev/Common/Utils.js | 8 +- dev/Component/Select.js | 7 + dev/Storage/Settings.js | 1 - dev/Stores/User/Message.js | 18 +- dev/Stores/User/Pgp.js | 22 ++ dev/Styles/OpenPgpKey.less | 66 ++++++ dev/View/Popup/ComposeOpenPgp.js | 224 ++++++++++++++---- gulpfile.js | 6 +- package.json | 3 +- rainloop/v/0.0.0/app/i18n/langs.ini | 6 + .../0.0.0/app/libraries/RainLoop/Service.php | 3 +- rainloop/v/0.0.0/app/templates/Index.html | 2 +- .../templates/Views/Components/Select.html | 2 +- .../Views/User/PopupsComposeOpenPgp.html | 77 ++++-- vendors/flags/flags-fixed.css | 1 + 18 files changed, 397 insertions(+), 80 deletions(-) diff --git a/dev/Common/Audio.js b/dev/Common/Audio.js index 8e437fc88..13863510d 100644 --- a/dev/Common/Audio.js +++ b/dev/Common/Audio.js @@ -74,9 +74,7 @@ // Audio.prototype.record = function () // { // this.getUserMedia({audio:true}, function () { -// window.console.log(arguments); // }, function(oError) { -// window.console.log(arguments); // }); // }; diff --git a/dev/Common/Globals.js b/dev/Common/Globals.js index 19a194552..acb582852 100644 --- a/dev/Common/Globals.js +++ b/dev/Common/Globals.js @@ -1,4 +1,6 @@ +/* global RL_COMMUNITY */ + (function () { 'use strict'; diff --git a/dev/Common/Translator.js b/dev/Common/Translator.js index b9fd187ea..5a5e9d87f 100644 --- a/dev/Common/Translator.js +++ b/dev/Common/Translator.js @@ -10,6 +10,7 @@ ko = require('ko'), Enums = require('Common/Enums'), + Utils = require('Common/Utils'), Globals = require('Common/Globals') ; @@ -24,6 +25,8 @@ this.trigger = ko.observable(false); this.i18n = _.bind(this.i18n, this); + + this.init(); } Translator.prototype.data = {}; @@ -293,29 +296,41 @@ { var self = this, - $html = $('html'), - fEmptyFunction = function () {}, iStart = (new Date()).getTime() ; - $html.addClass('rl-changing-language'); + Globals.$html.addClass('rl-changing-language'); $.ajax({ 'url': require('Common/Links').langLink(sLanguage, bAdmin), 'dataType': 'script', 'cache': true }) - .fail(fFail || fEmptyFunction) + .fail(fFail || Utils.emptyFunction) .done(function () { _.delay(function () { + self.reloadData(); - (fDone || fEmptyFunction)(); - $html.removeClass('rl-changing-language'); + + (fDone || Utils.emptyFunction)(); + + Globals.$html + .removeClass('rl-changing-language') + .removeClass('rl-rtl rl-ltr') + .addClass(-1 < Utils.inArray(sLanguage, ['ar', 'he', 'ur']) ? 'rl-rtl' : 'rl-ltr') +// .attr('dir', -1 < Utils.inArray(sLanguage, ['ar', 'he', 'ur']) ? 'rtl' : 'ltr') + ; + }, 500 < (new Date()).getTime() - iStart ? 1 : 500); }) ; }; + Translator.prototype.init = function () + { + Globals.$html.addClass('rl-' + (Globals.$html.attr('dir') || 'ltr')); + }; + module.exports = new Translator(); }()); diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 49119012d..ed59539b0 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -852,7 +852,11 @@ }, convertPre = function () { - return (arguments && 1 < arguments.length) ? arguments[1].toString().replace(/[\n]/gm, '
') : ''; + return (arguments && 1 < arguments.length) ? + arguments[1].toString() + .replace(/[\n]/gm, '
') + .replace(/[\r]/gm, '') + : ''; }, fixAttibuteValue = function () { @@ -868,7 +872,7 @@ sText = sHtml .replace(/\u0002([\s\S]*)\u0002/gm, '\u200C$1\u200C') .replace(/]*><\/p>/gi, '') - .replace(/]*>([\s\S\r\n]*)<\/pre>/gmi, convertPre) + .replace(/]*>([\s\S\r\n\t]*)<\/pre>/gmi, convertPre) .replace(/[\s]+/gm, ' ') .replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gmi, fixAttibuteValue) .replace(/]*>/gmi, '\n') diff --git a/dev/Component/Select.js b/dev/Component/Select.js index a987e7669..046f7603a 100644 --- a/dev/Component/Select.js +++ b/dev/Component/Select.js @@ -7,6 +7,7 @@ _ = require('_'), Utils = require('Common/Utils'), + Translator = require('Common/Translator'), AbstractInput = require('Component/AbstractInput') ; @@ -26,6 +27,12 @@ this.optionsText = oParams.optionsText || null; this.optionsValue = oParams.optionsValue || null; + this.optionsCaption = oParams.optionsCaption || null; + + if (this.optionsCaption) + { + this.optionsCaption = Translator.i18n(this.optionsCaption); + } this.defautOptionsAfterRender = Utils.defautOptionsAfterRender; } diff --git a/dev/Storage/Settings.js b/dev/Storage/Settings.js index ef12c2a8f..3fecebfc2 100644 --- a/dev/Storage/Settings.js +++ b/dev/Storage/Settings.js @@ -16,7 +16,6 @@ { this.oSettings = window['rainloopAppData'] || {}; this.oSettings = Utils.isNormal(this.oSettings) ? this.oSettings : {}; -// window.console.log(this.oSettings); } SettingsStorage.prototype.oSettings = null; diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 718ba6310..53b019820 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -526,6 +526,7 @@ var bNew = false, bIsHtml = false, + sTag = 'div', bHasExternals = false, bHasInternals = false, oBody = null, @@ -584,9 +585,6 @@ bHasExternals = !!oData.Result.HasExternals; bHasInternals = !!oData.Result.HasInternals; - oBody = $('
').hide().addClass('rl-cache-class'); - oBody.data('rl-cache-count', ++Globals.iMessageBodyCacheCount); - if (Utils.isNormal(oData.Result.Html) && '' !== oData.Result.Html) { bIsHtml = true; @@ -625,6 +623,10 @@ ).html() ; } + else + { + sResultHtml = '
' + sResultHtml + '
'; + } sPlain = ''; @@ -633,12 +635,20 @@ oMessage.isPgpSigned(bPgpSigned); oMessage.isPgpEncrypted(bPgpEncrypted); } + else + { + sResultHtml = '
' + sResultHtml + '
'; + } } else { bIsHtml = false; + sResultHtml = '
' + sResultHtml + '
'; } + oBody = $('
').hide().addClass('rl-cache-class'); + oBody.data('rl-cache-count', ++Globals.iMessageBodyCacheCount); + oBody .html(Utils.findEmailAndLinks(sResultHtml)) .addClass('b-text-part ' + (bIsHtml ? 'html' : 'plain')) @@ -753,8 +763,6 @@ { if (sFolder && sUid) { - window.console.log(sFolder, sUid); - this.message(this.staticMessage.populateByMessageListItem(null)); this.message().folderFullNameRaw = sFolder; this.message().uid = sUid; diff --git a/dev/Stores/User/Pgp.js b/dev/Stores/User/Pgp.js index 44815d225..c6ae88594 100644 --- a/dev/Stores/User/Pgp.js +++ b/dev/Stores/User/Pgp.js @@ -82,6 +82,28 @@ }), true)); }; + /** + * @param {string} sEmail + * @return {?} + */ + PgpUserStore.prototype.findPublicKeyByEmailNotNative = function (sEmail) + { + return _.find(this.openpgpkeysPublic(), function (oItem) { + return oItem && sEmail === oItem.email; + }) || null; + }; + + /** + * @param {string} sEmail + * @return {?} + */ + PgpUserStore.prototype.findPrivateKeyByEmailNotNative = function (sEmail) + { + return _.find(this.openpgpkeysPrivate(), function (oItem) { + return oItem && sEmail === oItem.email; + }) || null; + }; + /** * @param {string} sEmail * @param {string=} sPassword diff --git a/dev/Styles/OpenPgpKey.less b/dev/Styles/OpenPgpKey.less index 8b2d753da..b9ff7a9f2 100644 --- a/dev/Styles/OpenPgpKey.less +++ b/dev/Styles/OpenPgpKey.less @@ -19,6 +19,72 @@ } } + .b-compose-open-pgp-content { + &.modal { + width: 700px; + } + + .key-list { + + background-color: #f9f9f9; + border-radius: 5px; + padding: 10px 15px; + margin-top: 10px; + min-height: 40px; + + &-wrp { + overflow: hidden; + text-overflow: ellipsis; + + &.empty { + text-align: center; + padding-top: 10px; + color: #aaa; + font-size: 16px; + } + } + + &__item { + + color: #333; + white-space: nowrap; + + &-delete { + display: inline; + cursor: pointer; + margin-right: 5px; + } + + &-name { + margin-right: 5px; + color: #333; + display: inline; + + &.empty { + color: red; + } + } + + &-error { + margin-right: 5px; + color: red; + display: inline; + } + + &-hash { + margin-right: 5px; + color: #aaa; + display: inline; + } + } + } + + .key-actions { + margin-top: 10px; + min-height: 40px; + } + } + .b-message-open-pgp-content { &.modal { width: 700px; diff --git a/dev/View/Popup/ComposeOpenPgp.js b/dev/View/Popup/ComposeOpenPgp.js index 55a3f638e..2ead22bc8 100644 --- a/dev/View/Popup/ComposeOpenPgp.js +++ b/dev/View/Popup/ComposeOpenPgp.js @@ -28,88 +28,137 @@ { AbstractView.call(this, 'Popups', 'PopupsComposeOpenPgp'); + var self = this; + + this.optionsCaption = Translator.i18n('@i18n/Add a public key'); + this.notification = ko.observable(''); - this.sign = ko.observable(true); - this.encrypt = ko.observable(true); + this.sign = ko.observable(false); + this.encrypt = ko.observable(false); this.password = ko.observable(''); this.password.focus = ko.observable(false); this.buttonFocus = ko.observable(false); - this.from = ko.observable(''); - this.to = ko.observableArray([]); this.text = ko.observable(''); + this.selectedPublicKey = ko.observable(null); - this.resultCallback = null; + this.signKey = ko.observable(null); + this.encryptKeys = ko.observableArray([]); + + this.encryptKeysView = ko.computed(function () { + return _.compact(_.map(this.encryptKeys(), function (oKey) { + return oKey ? oKey.key : null; + })); + }, this); + + this.publicKeysOptions = ko.computed(function () { + return _.compact(_.map(PgpStore.openpgpkeysPublic(), function (oKey) { + return -1 < Utils.inArray(oKey, self.encryptKeysView()) ? null : { + 'id': oKey.guid, + 'name': '(' + oKey.id.substr(-6) + ') ' + oKey.user, + 'key': oKey + }; + })); + }); this.submitRequest = ko.observable(false); + this.resultCallback = null; + // commands this.doCommand = Utils.createCommand(this, function () { var - self = this, bResult = true, oPrivateKey = null, + aPrivateKeys = [], aPublicKeys = [] ; this.submitRequest(true); - if (bResult && this.sign() && '' === this.from()) - { - this.notification(Translator.i18n('PGP_NOTIFICATIONS/SPECIFY_FROM_EMAIL')); - bResult = false; - } - if (bResult && this.sign()) { - oPrivateKey = PgpStore.findPrivateKeyByEmail(this.from(), this.password()); - if (!oPrivateKey) + if (!this.signKey()) + { + this.notification(Translator.i18n('PGP_NOTIFICATIONS/SPECIFY_FROM_EMAIL')); + bResult = false; + } + else if (!this.signKey().key) { this.notification(Translator.i18n('PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND_FOR', { - 'EMAIL': this.from() + 'EMAIL': this.signKey().email })); bResult = false; } - } - if (bResult && this.encrypt() && 0 === this.to().length) - { - this.notification(Translator.i18n('PGP_NOTIFICATIONS/SPECIFY_AT_LEAST_ONE_RECIPIENT')); - bResult = false; + if (bResult) + { + aPrivateKeys = this.signKey().key.getNativeKeys(); + oPrivateKey = aPrivateKeys[0] || null; + + try + { + if (oPrivateKey) + { + oPrivateKey.decrypt(Utils.pString(this.password())); + } + } + catch (e) + { + oPrivateKey = null; + } + + if (!oPrivateKey) + { + this.notification(Translator.i18n('PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND')); + bResult = false; + } + } } if (bResult && this.encrypt()) { - aPublicKeys = []; - _.each(this.to(), function (sEmail) { - var aKeys = PgpStore.findPublicKeysByEmail(sEmail); - if (0 === aKeys.length && bResult) - { - self.notification(Translator.i18n('PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND_FOR', { - 'EMAIL': sEmail - })); + if (0 === this.encryptKeys().length) + { + this.notification(Translator.i18n('PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND')); + bResult = false; + } + else if (this.encryptKeys()) + { + aPublicKeys = []; + _.each(this.encryptKeys(), function (oKey) { + if (oKey && oKey.key) + { + aPublicKeys = aPublicKeys.concat(_.compact(_.flatten(oKey.key.getNativeKeys()))); + } + else if (oKey && oKey.email) + { + self.notification(Translator.i18n('PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND_FOR', { + 'EMAIL': oKey.email + })); + + bResult = false; + } + }); + + if (bResult && (0 === aPublicKeys.length || this.encryptKeys().length !== aPublicKeys.length)) + { bResult = false; } - - aPublicKeys = aPublicKeys.concat(aKeys); - }); - - if (bResult && (0 === aPublicKeys.length || this.to().length !== aPublicKeys.length)) - { - bResult = false; } } - _.delay(function () { + if (bResult && self.resultCallback) + { + _.delay(function () { - if (self.resultCallback && bResult) - { var oPromise = null; + try { if (oPrivateKey && 0 === aPublicKeys.length) @@ -154,17 +203,56 @@ })); } } - } - self.submitRequest(false); + self.submitRequest(false); - }, 10); + }, 10); + } + + return bResult; }, function () { return !this.submitRequest() && (this.sign() || this.encrypt()); }); + this.addCommand = Utils.createCommand(this, function () { + + var + sKeyId = this.selectedPublicKey(), + aKeys = this.encryptKeys(), + oOption = sKeyId ? _.find(this.publicKeysOptions(), function (oItem) { + return oItem && sKeyId === oItem.id; + }) : null + ; + + if (oOption) + { + aKeys.push({ + 'empty': !oOption.key, + 'selected': ko.observable(!!oOption.key), + 'user': oOption.key.user, + 'hash': oOption.key.id.substr(-6), + 'key': oOption.key + }); + + this.encryptKeys(aKeys); + } + + }, function () { + return !this.submitRequest() && this.selectedPublicKey(); + }); + + this.selectedPublicKey.subscribe(function (sValue) { + if (sValue) + { + this.addCommand(); + } + }, this); + this.sDefaultKeyScope = Enums.KeyState.PopupComposeOpenPGP; + this.defautOptionsAfterRender = Utils.defautOptionsAfterRender; + + this.deletePublickKey = _.bind(this.deletePublickKey, this); kn.constructorEnd(this); } @@ -172,16 +260,24 @@ kn.extendAsViewModel(['View/Popup/ComposeOpenPgp', 'PopupsComposeOpenPgpViewModel'], ComposeOpenPgpPopupView); _.extend(ComposeOpenPgpPopupView.prototype, AbstractView.prototype); + ComposeOpenPgpPopupView.prototype.deletePublickKey = function (oKey) + { + this.encryptKeys.remove(oKey); + }; + ComposeOpenPgpPopupView.prototype.clearPopup = function () { this.notification(''); + this.sign(false); + this.encrypt(false); + this.password(''); this.password.focus(false); this.buttonFocus(false); - this.from(''); - this.to([]); + this.signKey(null); + this.encryptKeys([]); this.text(''); this.submitRequest(false); @@ -231,6 +327,8 @@ var aRec = [], + sEmail = '', + oKey = null, oEmail = new EmailModel() ; @@ -258,8 +356,44 @@ return '' === oEmail.email ? false : oEmail.email; })); - this.from(oIdentity ? oIdentity.email() : ''); - this.to(aRec); + if (oIdentity && oIdentity.email()) + { + sEmail = oIdentity.email(); + oKey = PgpStore.findPrivateKeyByEmailNotNative(sEmail); + if (oKey) + { + this.signKey({ + 'user': oKey.user || sEmail, + 'hash': oKey.id.substr(-6), + 'key': oKey + }); + } + } + + if (this.signKey()) + { + this.sign(true); + } + + if (aRec && 0 < aRec.length) + { + this.encryptKeys(_.compact(_.map(aRec, function (sEmail) { + var oKey = PgpStore.findPublicKeyByEmailNotNative(sEmail) || null; + return { + 'empty': !oKey, + 'selected': ko.observable(!!oKey), + 'user': oKey ? (oKey.user || sEmail) : sEmail, + 'hash': oKey ? oKey.id.substr(-6) : '', + 'key': oKey + }; + }))); + + if (0 < this.encryptKeys().length) + { + this.encrypt(true); + } + } + this.text(sText); }; diff --git a/gulpfile.js b/gulpfile.js index 6bce4423f..540b0a738 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -47,6 +47,7 @@ var plumber = require('gulp-plumber'), gulpif = require('gulp-if'), eol = require('gulp-eol'), + livereload = require('gulp-livereload'), gutil = require('gulp-util') ; @@ -242,6 +243,7 @@ gulp.task('css:main-begin', ['less:main'], function() { // .pipe(csslint.reporter()) .pipe(eol('\n', true)) .pipe(gulp.dest(cfg.paths.staticCSS)) + .pipe(livereload()) ; }); @@ -330,7 +332,7 @@ gulp.task('js:webpack:clear', function() { .pipe(require('gulp-rimraf')()); }); -gulp.task('js:webpack', ['js:webpack:clear'], function(callback) { +gulp.task('js:webpack', [/*'js:webpack:clear'*/], function(callback) { var webpack = require('webpack'), @@ -678,12 +680,14 @@ gulp.task('owncloud+', ['package:community-off', 'owncloud-']); //WATCH gulp.task('watch', ['fast'], function() { cfg.watch = true; + livereload.listen(); gulp.watch(cfg.paths.globjs, {interval: 1000}, ['js:app', 'js:admin']); gulp.watch(cfg.paths.less.main.watch, {interval: 1000}, ['css:main']); }); gulp.task('watch+', ['fast+'], function() { cfg.watch = true; + livereload.listen(); gulp.watch(cfg.paths.globjs, {interval: 1000}, ['js:app', 'js:admin']); gulp.watch(cfg.paths.less.main.watch, {interval: 1000}, ['css:main']); }); diff --git a/package.json b/package.json index 9e208ed56..918f2d74e 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "gulp-through": "~0.3.0", "lodash": "~3.9.3", "gulp-if": "~1.2.5", - "node-notifier": "~4.2.3" + "node-notifier": "~4.2.3", + "gulp-livereload": "~3.8.0" } } diff --git a/rainloop/v/0.0.0/app/i18n/langs.ini b/rainloop/v/0.0.0/app/i18n/langs.ini index 9f19d3d74..88bea1b60 100644 --- a/rainloop/v/0.0.0/app/i18n/langs.ini +++ b/rainloop/v/0.0.0/app/i18n/langs.ini @@ -104,6 +104,9 @@ LANG_BS = "Bosanski" LANG_BS_BS = "Bosanski" LANG_BS_BA = "Bosanski" +LANG_AR = "‏العربية‏" +LANG_AR_AR = "‏العربية‏" + [LANGS_NAMES_EN] LANG_EN = "English" LANG_EN_US = "English (US)" @@ -210,3 +213,6 @@ LANG_SR_RS = "Serbian" LANG_BS = "Bosnian" LANG_BS_BS = "Bosnian" LANG_BS_BA = "Bosnian" + +LANG_AR = "Arabic" +LANG_AR_AR = "Arabic" diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php index 5f2c47814..040f04945 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Service.php @@ -266,7 +266,8 @@ class Service '{{BaseAppOpenPgpScriptLink}}' => $aData['OpenPgpJsLink'], '{{BaseAppMainCommonScriptLink}}' => $aData['AppJsCommonLink'], '{{BaseAppMainScriptLink}}' => $aData['AppJsLink'], - '{{BaseDir}}' => \in_array($aData['Language'], array('ar', 'he', 'ur')) ? 'rtl' : 'ltr' + '{{BaseDir}}' => 'ltr' +// '{{BaseDir}}' => \in_array($aData['Language'], array('ar', 'he', 'ur')) ? 'rtl' : 'ltr' ); $aTemplateParameters['{{BaseHash}}'] = \md5( diff --git a/rainloop/v/0.0.0/app/templates/Index.html b/rainloop/v/0.0.0/app/templates/Index.html index 081b99915..da86d980c 100644 --- a/rainloop/v/0.0.0/app/templates/Index.html +++ b/rainloop/v/0.0.0/app/templates/Index.html @@ -1,5 +1,5 @@ - + diff --git a/rainloop/v/0.0.0/app/templates/Views/Components/Select.html b/rainloop/v/0.0.0/app/templates/Views/Components/Select.html index 62d3d4a82..5d6532716 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Components/Select.html +++ b/rainloop/v/0.0.0/app/templates/Views/Components/Select.html @@ -4,7 +4,7 @@    + optionsCaption: optionsCaption, css: className, optionsAfterRender: defautOptionsAfterRender">   diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsComposeOpenPgp.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsComposeOpenPgp.html index 68e6051a0..22020aba9 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsComposeOpenPgp.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsComposeOpenPgp.html @@ -8,34 +8,83 @@
\ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionSize.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionSize.html index 1ae58091d..0830dc800 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionSize.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionSize.html @@ -7,6 +7,6 @@   - +
\ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html index a6246f748..4c80e0f55 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html @@ -14,15 +14,15 @@ - + - + diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html index 09f47cf67..1ebebbb7d 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsOpenPGP.html @@ -12,7 +12,7 @@   
@@ -30,7 +30,9 @@ - + + + @@ -38,12 +40,12 @@ - + - + @@ -51,7 +53,9 @@ - + + + () @@ -60,12 +64,12 @@ - + - + diff --git a/rainloop/v/0.0.0/static/css/svg/icons.svg b/rainloop/v/0.0.0/static/css/svg/icons.svg index c24db56e6..b4b44d0c3 100644 --- a/rainloop/v/0.0.0/static/css/svg/icons.svg +++ b/rainloop/v/0.0.0/static/css/svg/icons.svg @@ -1,7 +1,27 @@ - + + + + + + + + + + + + + + + + + + + + + diff --git a/vendors/fontastic/svg/demo.html b/vendors/fontastic/svg/demo.html index cece46978..44e43c9b0 100644 --- a/vendors/fontastic/svg/demo.html +++ b/vendors/fontastic/svg/demo.html @@ -197,7 +197,27 @@ github.com style (c) Vasily Polovnyov - + + + + + + + + + + + + + + + + + + + + + @@ -217,6 +237,46 @@ github.com style (c) Vasily Polovnyov +
  • + + + + + +
  • + +
  • + + + + + +
  • + +
  • + + + + + +
  • + +
  • + + + + + +
  • + +
  • + + + + + +
  • +

    How to add SVG sprite icons to your project?

    diff --git a/vendors/fontastic/svg/icons.svg b/vendors/fontastic/svg/icons.svg index c24db56e6..b4b44d0c3 100644 --- a/vendors/fontastic/svg/icons.svg +++ b/vendors/fontastic/svg/icons.svg @@ -1,7 +1,27 @@ - + + + + + + + + + + + + + + + + + + + + + diff --git a/vendors/svg4everybody/LICENSE.md b/vendors/svg4everybody/LICENSE.md new file mode 100644 index 000000000..565f84e33 --- /dev/null +++ b/vendors/svg4everybody/LICENSE.md @@ -0,0 +1,15 @@ +# CC0 1.0 Universal License + +Public Domain Dedication + +The person(s) who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. + +In no way are the patent or trademark rights of any person affected by CC0, nor are the rights that other persons may have in the work or in how the work is used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person(s) who associated a work with this deed makes no warranties about the work, and disclaims liability for all uses of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author or the affirmer. + +This is a [human-readable summary of the Legal Code](https://creativecommons.org/publicdomain/zero/1.0/) ([read the full text](https://creativecommons.org/publicdomain/zero/1.0/legalcode)). diff --git a/vendors/svg4everybody/README.md b/vendors/svg4everybody/README.md new file mode 100644 index 000000000..91ce31d0f --- /dev/null +++ b/vendors/svg4everybody/README.md @@ -0,0 +1,107 @@ +# SVG for Everybody + +[SVG for Everybody] is a script that adds [external spritemaps] support to otherwise [SVG-capable browsers]. + +To use **svg4everybody**, include the script in your document. + +```html + +``` + +To support IE6-8 as well, include the legacy script instead. + +```html + +``` + +The IE6-8 script needs to be included in the `` in order to shiv the **svg** and **use** elements. + +If running the standard script in IE9-11, be sure to set [X-UA-Compatible] higher than IE8. This can be done with a response header or the following meta tag. + +```html + +``` + +## Usage + +**spritemap.svg:** +```html + + CodePen + YouTube + Twitter + +``` + +This spritemap works fine in **Chrome**, **Firefox**, and **Opera**. [SVG for Everybody] polyfills the experience in **IE9-11**. + +```html + + + +``` + +![3 SVG logos](http://i.imgur.com/87Npdzn.png) + +Older browsers falls back to PNG images. + +```html + + + +``` + +Fallback PNGs point to the same location as their corresponding SVGs, only with the `#` hash replaced by a `.` dot, and with an appended `.png` extension. + +## Readability and accessibility + +Within your spritemap, each sprite may use a `` element to identify itself. + +```html +<symbol id="codepen"><title>CodePen +``` + +When this sprite is used, its title will be read aloud in [JAWS](http://www.freedomscientific.com/products/fs/JAWS-product-page.asp) and [NVDA](http://www.nvaccess.org/). Then, within your document, each sprite may use a `title` attribute to identify itself. + +```html + +``` + +This title will be read aloud in [VoiceOver](http://www.apple.com/accessibility/osx/voiceover/) and [NVDA](http://www.nvaccess.org/). At present, the `title` attribute is the only way to properly read aloud an SVG in VoiceOver. + +For maximum compatibility, both the `title` attribute in the document and the `title` element in the SVG should be used. + +ARIA roles may be used to provide even more accessibility. `role="presentation"` should be used when a sprite decorates other content. + +```html +
    Find me on Twitter +``` + +Alternatively, `role="img"` should be used when a sprite necessitates its own description. + +```html + +``` + +### Futher reading + +- [Tips for creating accessible SVG](https://www.sitepoint.com/tips-accessible-svg/) +- [Using ARIA to enhance SVG accessibility](http://blog.paciellogroup.com/2013/12/using-aria-enhance-svg-accessibility/) +- [SVG symbol a good choice for icons](http://css-tricks.com/svg-symbol-good-choice-icons/) +- [Implementing inline SVG Icons](https://kartikprabhu.com/article/inline-svg-icons) + +## Smaller SVGs + +SVG files, especially exported from various editors, usually contains a lot of redundant and useless information such as editor metadata, comments, hidden elements, default or non-optimal values and other stuff that can be safely removed or converted without affecting SVG rendering result. + +Use a tool like [SVGO](https://github.com/svg/svgo) to optimize SVG spritemaps. + +```sh +$ [sudo] npm install -g svgo +$ svgo spritemap.svg +``` + +[external spritemaps]: http://css-tricks.com/svg-sprites-use-better-icon-fonts/##Browser+Support +[SVG-capable browsers]: http://caniuse.com/svg +[SVG for Everybody]: https://github.com/jonathantneal/svg4everybody +[X-UA-Compatible]: http://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible diff --git a/vendors/svg4everybody/bower.json b/vendors/svg4everybody/bower.json new file mode 100644 index 000000000..28de08c26 --- /dev/null +++ b/vendors/svg4everybody/bower.json @@ -0,0 +1,20 @@ +{ + "name": "svg4everybody", + "homepage": "https://github.com/jonathantneal/svg4everybody", + "authors": [ + "Jonathan Neal " + ], + "description": "Use external SVG spritemaps today.", + "main": ["svg4everybody.js", "svg4everybody.legacy.js"], + "keywords": [ + "svg", + "spritemaps", + "polyfill", + "ie" + ], + "repository": { + "type": "git", + "url": "git@github.com:jonathantneal/svg4everybody.git" + }, + "license": "CC0 1.0" +} diff --git a/vendors/svg4everybody/package.json b/vendors/svg4everybody/package.json new file mode 100644 index 000000000..2ebbeb0ce --- /dev/null +++ b/vendors/svg4everybody/package.json @@ -0,0 +1,18 @@ +{ + "name" : "svg4everybody", + "description" : "Use external SVG spritemaps in any browser", + "keywords" : ["svg", "sprites", "spritemaps", "symbol", "defs", "oldie", "ie8", "ie9", "safari", "external", "icon", "fallback"], + "author" : "Jonathan Neal (http://jonathantneal.com)", + "contributors" : [], + "dependencies" : [], + "main": "svg4everybody.js", + "homepage": "https://github.com/jonathantneal/svg4everybody", + "bugs": { + "url": "https://github.com/jonathantneal/svg4everybody/issues" + }, + "repository" : { + "type": "git", + "url": "git@github.com:jonathantneal/svg4everybody.git" + }, + "version" : "1.0.0" +} diff --git a/vendors/svg4everybody/svg4everybody.js b/vendors/svg4everybody/svg4everybody.js new file mode 100644 index 000000000..41f8ab788 --- /dev/null +++ b/vendors/svg4everybody/svg4everybody.js @@ -0,0 +1,84 @@ +/*! svg4everybody v1.0.0 | github.com/jonathantneal/svg4everybody */ +(function (document, uses, requestAnimationFrame, CACHE, IE9TO11) { + function embed(svg, g) { + if (g) { + var + viewBox = g.getAttribute('viewBox'), + fragment = document.createDocumentFragment(), + clone = g.cloneNode(true); + + if (viewBox) { + svg.setAttribute('viewBox', viewBox); + } + + while (clone.childNodes.length) { + fragment.appendChild(clone.childNodes[0]); + } + + svg.appendChild(fragment); + } + } + + function onload() { + var xhr = this, x = document.createElement('x'), s = xhr.s; + + x.innerHTML = xhr.responseText; + + xhr.onload = function () { + s.splice(0).map(function (array) { + embed(array[0], x.querySelector('#' + array[1].replace(/(\W)/g, '\\$1'))); + }); + }; + + xhr.onload(); + } + + function onframe() { + var use; + + while ((use = uses[0])) { + var + svg = use.parentNode, + url = use.getAttribute('xlink:href').split('#'), + url_root = url[0], + url_hash = url[1]; + + svg.removeChild(use); + + if (url_root.length) { + var xhr = CACHE[url_root] = CACHE[url_root] || new XMLHttpRequest(); + + if (!xhr.s) { + xhr.s = []; + + xhr.open('GET', url_root); + + xhr.onload = onload; + + xhr.send(); + } + + xhr.s.push([svg, url_hash]); + + if (xhr.readyState === 4) { + xhr.onload(); + } + + } else { + embed(svg, document.getElementById(url_hash)); + } + } + + requestAnimationFrame(onframe); + } + + if (IE9TO11) { + onframe(); + } +})( + document, + document.getElementsByTagName('use'), + window.requestAnimationFrame || window.setTimeout, + {}, + /Trident\/[567]\b/.test(navigator.userAgent) || /Edge\/12/.test(navigator.userAgent) || (navigator.userAgent.match(/AppleWebKit\/(\d+)/) || [])[1] < 538 +); diff --git a/vendors/svg4everybody/svg4everybody.legacy.js b/vendors/svg4everybody/svg4everybody.legacy.js new file mode 100644 index 000000000..193a7eea4 --- /dev/null +++ b/vendors/svg4everybody/svg4everybody.legacy.js @@ -0,0 +1,97 @@ +/*! svg4everybody v1.0.0 | github.com/jonathantneal/svg4everybody */ +(function (document, uses, requestAnimationFrame, CACHE, LTEIE8, IE9TO11) { + function embed(svg, g) { + if (g) { + var + viewBox = g.getAttribute('viewBox'), + fragment = document.createDocumentFragment(), + clone = g.cloneNode(true); + + if (viewBox) { + svg.setAttribute('viewBox', viewBox); + } + + while (clone.childNodes.length) { + fragment.appendChild(clone.childNodes[0]); + } + + svg.appendChild(fragment); + } + } + + function onload() { + var xhr = this, x = document.createElement('x'), s = xhr.s; + + x.innerHTML = xhr.responseText; + + xhr.onload = function () { + s.splice(0).map(function (array) { + embed(array[0], x.querySelector('#' + array[1].replace(/(\W)/g, '\\$1'))); + }); + }; + + xhr.onload(); + } + + function onframe() { + var use; + + while ((use = uses[0])) { + if (LTEIE8) { + var img = new Image(), src, q; + + src = use.getAttribute('xlink:href'); + q = (/\?[^#]+/.exec(src) || [''])[0]; + img.src = src.replace(/\?[^#]+/, '').replace('#', '.').replace(/^\./, '') + '.png' + q; + + use.parentNode.replaceChild(img, use); + } else { + var + svg = use.parentNode, + url = use.getAttribute('xlink:href').split('#'), + url_root = url[0], + url_hash = url[1]; + + svg.removeChild(use); + + if (url_root.length) { + var xhr = CACHE[url_root] = CACHE[url_root] || new XMLHttpRequest(); + + if (!xhr.s) { + xhr.s = []; + + xhr.open('GET', url_root); + + xhr.onload = onload; + + xhr.send(); + } + + xhr.s.push([svg, url_hash]); + + if (xhr.readyState === 4) { + xhr.onload(); + } + + } else { + embed(svg, document.getElementById(url_hash)); + } + } + } + + requestAnimationFrame(onframe); + } + + if (LTEIE8 || IE9TO11) { + onframe(); + } +})( + document, + document.getElementsByTagName('use'), + window.requestAnimationFrame || window.setTimeout, + {}, + /MSIE\s[1-8]\b/.test(navigator.userAgent), + /Trident\/[567]\b/.test(navigator.userAgent) || /Edge\/12/.test(navigator.userAgent) || (navigator.userAgent.match(/AppleWebKit\/(\d+)/) || [])[1] < 538, + document.createElement('svg'), + document.createElement('use') +); From a19429f271c9867c15e0d4c8dee38352dd09088b Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 7 Aug 2015 00:55:53 +0400 Subject: [PATCH 105/106] New languages constants --- rainloop/v/0.0.0/langs/ar.ini | 35 ++++++++++++++++---------------- rainloop/v/0.0.0/langs/bg.ini | 2 ++ rainloop/v/0.0.0/langs/cs.ini | 2 ++ rainloop/v/0.0.0/langs/de.ini | 2 ++ rainloop/v/0.0.0/langs/en-gb.ini | 2 ++ rainloop/v/0.0.0/langs/es.ini | 2 ++ rainloop/v/0.0.0/langs/fr.ini | 2 ++ rainloop/v/0.0.0/langs/hu.ini | 2 ++ rainloop/v/0.0.0/langs/is.ini | 2 ++ rainloop/v/0.0.0/langs/it.ini | 2 ++ rainloop/v/0.0.0/langs/ja-jp.ini | 2 ++ rainloop/v/0.0.0/langs/ko-kr.ini | 2 ++ rainloop/v/0.0.0/langs/lt.ini | 2 ++ rainloop/v/0.0.0/langs/lv.ini | 2 ++ rainloop/v/0.0.0/langs/nl.ini | 2 ++ rainloop/v/0.0.0/langs/no.ini | 2 ++ rainloop/v/0.0.0/langs/pl.ini | 2 ++ rainloop/v/0.0.0/langs/pt-br.ini | 2 ++ rainloop/v/0.0.0/langs/pt-pt.ini | 2 ++ rainloop/v/0.0.0/langs/ro.ini | 2 ++ rainloop/v/0.0.0/langs/ru.ini | 2 ++ rainloop/v/0.0.0/langs/sk.ini | 2 ++ rainloop/v/0.0.0/langs/sv.ini | 2 ++ rainloop/v/0.0.0/langs/tr.ini | 2 ++ rainloop/v/0.0.0/langs/ua.ini | 2 ++ rainloop/v/0.0.0/langs/zh-cn.ini | 2 ++ rainloop/v/0.0.0/langs/zh-tw.ini | 2 ++ 27 files changed, 70 insertions(+), 17 deletions(-) diff --git a/rainloop/v/0.0.0/langs/ar.ini b/rainloop/v/0.0.0/langs/ar.ini index 75ab9008e..1fffb29a1 100644 --- a/rainloop/v/0.0.0/langs/ar.ini +++ b/rainloop/v/0.0.0/langs/ar.ini @@ -150,14 +150,13 @@ MESSAGE_VIEW_DESC = "حدد رسالة من القائمة ليتم عرضها PGP_PASSWORD_INPUT_PLACEHOLDER = "كلمة السر" PGP_SIGNED_MESSAGE_DESC = "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC = "OpenPGP encrypted message (click to decrypt)" -LINK_DOWNLOAD_AS_ZIP = "zip تنزيل كـ " +LINK_DOWNLOAD_AS_ZIP = "zip تنزيل كـ" LINK_SAVE_TO_OWNCLOUD = "ownCloud الحفظ الى" LINK_SAVE_TO_DROPBOX = "Dropbox الحفظ الى" [READ_RECEIPT] SUBJECT = "إعلام بالقراءة (تم عرضها) - %SUBJECT%" -BODY = "هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%. -" +BODY = "هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%." [SUGGESTIONS] SEARCHING_DESC = "يتم البحث..." @@ -293,7 +292,7 @@ DANGER_DESC_HTML_2 = "في حال بدء العملية , فلا يمكن ايق TITLE_CLEARING_PROCESS = "...يتم دمج المجلد" [POPUPS_IMPORT_OPEN_PGP_KEY] -TITLE_IMPORT_OPEN_PGP_KEY = "OpenPGP استيراد مفتاح " +TITLE_IMPORT_OPEN_PGP_KEY = "OpenPGP استيراد مفتاح" BUTTON_IMPORT_OPEN_PGP_KEY = "استيراد" [POPUPS_VIEW_OPEN_PGP_KEY] @@ -367,6 +366,7 @@ STOP_LABEL = "لاتتوقف عن المعالجة بالشروط" EMAIL_LABEL = "البريد الإلكتروني" VACATION_SUBJECT_LABEL = "الموضوع (خياري)" VACATION_MESSAGE_LABEL = "الرسالة" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "رفض الرسالة" ALL_INCOMING_MESSAGES_DESC = "جميع الرسائل الواردة" @@ -409,8 +409,8 @@ BUTTON_HIDE_SECRET = "إخفاء السر" TWO_FACTOR_REQUIRE_DESC = "حسابك بحاجة الى إعداد مراحل التحقق الثنائية" TWO_FACTOR_SECRET_CONFIGURED_DESC = "تم التكوين" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "لم يتم التكوين" -TWO_FACTOR_SECRET_DESC = " قم باستيراد هذه المعلومات لمركز توثيق غوغل باستخدام رمز الكيو-اّر او بنسخ الكود يدوياً (or other TOTP client) " -TWO_FACTOR_BACKUP_CODES_DESC = " إذا لم تتمكن من الحصول على الكود من مركز التوثيق في غوغل يمكنك إستخدام الكود الإحتياطي لتسجيل الدخول,ولكن سيصبح كود الإحتياط غير فعال بعد ذلك " +TWO_FACTOR_SECRET_DESC = "قم باستيراد هذه المعلومات لمركز توثيق غوغل باستخدام رمز الكيو-اّر او بنسخ الكود يدوياً (or other TOTP client)" +TWO_FACTOR_BACKUP_CODES_DESC = "إذا لم تتمكن من الحصول على الكود من مركز التوثيق في غوغل يمكنك إستخدام الكود الإحتياطي لتسجيل الدخول,ولكن سيصبح كود الإحتياط غير فعال بعد ذلك" TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "لايمكنك تغيير هذه الإعدادات بدون تجريب." [TITLES] @@ -458,8 +458,8 @@ BUTTON_ADD_FILTER = "إضافة عامل تصفية" BUTTON_DELETE = "حذف" BUTTON_RAW_SCRIPT = "إستخدام سكربت مخصصة للمستخدم" SUBNAME_NONE = "None" -SUBNAME_MOVE_TO = " \"%FOLDER%\" نقل الى" -SUBNAME_FORWARD_TO = " \"%EMAIL%\" إعادة توجيه الى" +SUBNAME_MOVE_TO = "\"%FOLDER%\" نقل الى" +SUBNAME_FORWARD_TO = "\"%EMAIL%\" إعادة توجيه الى" SUBNAME_REJECT = "رفض" SUBNAME_VACATION_MESSAGE = "رسالة العطلة" SUBNAME_DISCARD = "تجاهل" @@ -505,7 +505,7 @@ LABEL_USE_CHECKBOXES_IN_LIST = "عرض مربعات التحديد في القا LABEL_USE_THREADS = "إستخدام المواضيع" LABEL_REPLY_SAME_FOLDER = "ضع الردود في مجلد الرسالة التي يتم الرد عليها" LABEL_SHOW_IMAGES = "قم دائماَ بعرض الصور القادمة في الرسالة" -LABEL_SHOW_ANIMATION = "أظهر التأثيرات الخاصة " +LABEL_SHOW_ANIMATION = "أظهر التأثيرات الخاصة" LABEL_MESSAGE_PER_PAGE = "الرسائل في الصفحة" LABEL_NOTIFICATIONS = "التنبيهات" LABEL_SOUND_NOTIFICATION = "صوت التنبيهات" @@ -515,7 +515,7 @@ LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(تم إعتراضها من قبل ال [SETTINGS_CONTACTS] LEGEND_CONTACTS = "جهات الإتصال" LABEL_CONTACTS_AUTOSAVE = "قم باضافة المستلمين تلقائيا الى دفتر العناوين" -LEGEND_CONTACTS_SYNC = " (CardDAV)التزامن عن بعد" +LEGEND_CONTACTS_SYNC = "(CardDAV)التزامن عن بعد" LABEL_CONTACTS_SYNC_ENABLE = "تفعيل التزامن عن بعد" LABEL_CONTACTS_SYNC_SERVER = "المخدم" LABEL_CONTACTS_SYNC_AB_URL = "وصلة دفتر العناوين" @@ -529,10 +529,10 @@ LABEL_CUSTOM_TYPE = "النوع" LABEL_CUSTOM_TYPE_LIGHT = "فاتح" LABEL_CUSTOM_TYPE_DARK = "غامق" LABEL_CUSTOM_BACKGROUND_IMAGE = "الخلفية" -BUTTON_UPLOAD_BACKGROUND_IMAGE = " (JPG, PNG)حمل صورة الخلفية " +BUTTON_UPLOAD_BACKGROUND_IMAGE = "(JPG, PNG)حمل صورة الخلفية" ERROR_FILE_IS_TOO_BIG = "حجم الملف كبير جداً" -ERROR_FILE_TYPE_ERROR = " مسموحة فقط(JPG,PNG)نوع الملف خطأ " -ERROR_UNKNOWN = " حدث خطأ أثناء رفع الملف" +ERROR_FILE_TYPE_ERROR = "مسموحة فقط(JPG,PNG)نوع الملف خطأ" +ERROR_UNKNOWN = "حدث خطأ أثناء رفع الملف" [SETTINGS_SOCIAL] LEGEND_GOOGLE = "غوغل" @@ -563,8 +563,8 @@ DELETING_ASK = "هل أنت متأكد؟" TO_MANY_FOLDERS_DESC_1 = "لديك الكثير من المجلدات!" TO_MANY_FOLDERS_DESC_2 = "لقد قمنا بإظهار جزء منهم تفادياَ لضعف الأداء" HELP_DELETE_FOLDER = "إحذف المجلد" -HELP_SHOW_HIDE_FOLDER = "إخفاء\إظهار المجلد" -HELP_CHECK_FOR_NEW_MESSAGES = "تأكد\لاتتأكد من وصول ايميلات جديدة" +HELP_SHOW_HIDE_FOLDER = "إخفاء\\إظهار المجلد" +HELP_CHECK_FOR_NEW_MESSAGES = "تأكد\\لاتتأكد من وصول ايميلات جديدة" [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "الحسابات" @@ -652,6 +652,7 @@ NO_PUBLIC_KEYS_FOUND = "لم يتم إيجاد المفتاح العام" NO_PUBLIC_KEYS_FOUND_FOR = "لم يتم إيجاد مفتاح عام\"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "لم يتم إيجاد مفتاح خاص" NO_PRIVATE_KEY_FOUND_FOR = "لم يتم إيجاد المفتاح الخاص لـ \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "توقيع غير موثق" DECRYPTION_ERROR = "OpenPGP خطأ فك تشفير" GOOD_SIGNATURE = "توقيع جيد من %USER%" @@ -661,7 +662,7 @@ SPECIFY_AT_LEAST_ONE_RECIPIENT = "يرجى تحديد مستلم واحد على [NOTIFICATIONS] INVALID_TOKEN = "خاطىء token" -AUTH_ERROR = "خطأ في كلمة السر \اسم المستخدم" +AUTH_ERROR = "خطأ في كلمة السر \\اسم المستخدم" ACCESS_ERROR = "خطأ في الوصول" CONNECTION_ERROR = "لايمكن الإتصال بالمخدم" CAPTCHA_ERROR = "رمز تحقق خاطىء." @@ -715,7 +716,7 @@ UNKNOWN_ERROR = "خطأ غير معروف" BACK_LINK = "إعادة التحميل" DOMAIN_LIST_DESC = "قائمة المواقع البريدية المسموح فيها لهذا البريد بالوصول" PHP_EXSTENSIONS_ERROR_DESC = "!إضافات الـ بي إتش بي المطلوبة,غير متوافرة في إعدادات الـ بي إتش بي لديك" -PHP_VERSION_ERROR_DESC = "أقل من الإصدار المطلوب 5.3.0!(%VERSION%) PHP إصدار " +PHP_VERSION_ERROR_DESC = "أقل من الإصدار المطلوب 5.3.0!(%VERSION%) PHP إصدار" NO_SCRIPT_TITLE = "الجافا سكريبت مطلوبة لهذا البرنامج" NO_SCRIPT_DESC = "إن متصفحك لايدعم الجافا سكريبت . يرجى تفعيل الدعم أو تجريب متصفح أخر" NO_COOKIE_TITLE = "Cookies support is required for this application." diff --git a/rainloop/v/0.0.0/langs/bg.ini b/rainloop/v/0.0.0/langs/bg.ini index 37b1f11c0..dea61f5e9 100644 --- a/rainloop/v/0.0.0/langs/bg.ini +++ b/rainloop/v/0.0.0/langs/bg.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index 42742f178..2505d5170 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -368,6 +368,7 @@ STOP_LABEL = "Neukončovat zpracování pravidel" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Předmět (volitelný)" VACATION_MESSAGE_LABEL = "Zpráva" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Odmítnout zprávu" ALL_INCOMING_MESSAGES_DESC = "Všechny příchozí zprávy" @@ -653,6 +654,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index 5151e0589..a9a48698e 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Weiterverarbeitung der Regeln nicht verhindern" EMAIL_LABEL = "E-Mail" VACATION_SUBJECT_LABEL = "Betreff (optional)" VACATION_MESSAGE_LABEL = "Nachricht" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Ablehnnachricht" ALL_INCOMING_MESSAGES_DESC = "Alle eingehenden Nachrichten" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Keine öffentlichen Schlüssel gefunden" NO_PUBLIC_KEYS_FOUND_FOR = "Keine öffentlichen Schlüssel für die E-Mail \"%EMAIL%\" gefunden" NO_PRIVATE_KEY_FOUND = "Keine privaten Schlüssel gefunden" NO_PRIVATE_KEY_FOUND_FOR = "Keine privaten Schlüssel für die E-Mail \"%EMAIL%\" gefunden" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Nich verifizierte Unterschrift" DECRYPTION_ERROR = "OpenPGP-Entschlüsselungsfehler" GOOD_SIGNATURE = "Gültige Unterschrift von %USER%" diff --git a/rainloop/v/0.0.0/langs/en-gb.ini b/rainloop/v/0.0.0/langs/en-gb.ini index 299ae866c..53fcf762c 100644 --- a/rainloop/v/0.0.0/langs/en-gb.ini +++ b/rainloop/v/0.0.0/langs/en-gb.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini index 1622ed3fc..2b8461b1a 100644 --- a/rainloop/v/0.0.0/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No se encontraron claves públicas" NO_PUBLIC_KEYS_FOUND_FOR = "No hay claves públicas encontrados para el email %MAIL%" NO_PRIVATE_KEY_FOUND = "No se encontró la clave privada" NO_PRIVATE_KEY_FOUND_FOR = "No hay una clave privada para el email %EMAIL%" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Firma no verificada" DECRYPTION_ERROR = "Error de descifrado OpenPGP" GOOD_SIGNATURE = "Buena firma de %USER%" diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index 1476d37c1..bbbc30d75 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Ne pas arrêter le traîtement des règles" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Sujet (optionnel)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Message rejeté" ALL_INCOMING_MESSAGES_DESC = "Tous les messages entrants" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Aucune clef publique n'a pu être trouvée" NO_PUBLIC_KEYS_FOUND_FOR = "Aucune clef publique n'a pu être trouvée pour \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Aucune clef privée n'a pu être trouvée" NO_PRIVATE_KEY_FOUND_FOR = "Aucune clef privée n'a pu être trouvée pour \"%EMAIL%\"" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Signature non-vérifiée" DECRYPTION_ERROR = "Erreur lors du déchiffrement OpenPGP" GOOD_SIGNATURE = "Signature valide pour %USER%" diff --git a/rainloop/v/0.0.0/langs/hu.ini b/rainloop/v/0.0.0/langs/hu.ini index 21ead746c..30759e708 100644 --- a/rainloop/v/0.0.0/langs/hu.ini +++ b/rainloop/v/0.0.0/langs/hu.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini index 9437d1ff6..bdeab25e0 100644 --- a/rainloop/v/0.0.0/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index 3be586128..a0152eb0b 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Non interrompere l'elaborazione delle regole" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Oggetto (opzionale)" VACATION_MESSAGE_LABEL = "Messaggio" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Rifiuta messagio" ALL_INCOMING_MESSAGES_DESC = "Tutti i messaggi in ingresso" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Nessuna chiave pubblica trovata" NO_PUBLIC_KEYS_FOUND_FOR = "Nessuna chiave pubblica trovata per l'indirizzo email \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Nessuna chiave privata trovata" NO_PRIVATE_KEY_FOUND_FOR = "Nessuna chiave privata trovata per l'indirizzo email \"%EMAIL%\"" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Firma non verificata" DECRYPTION_ERROR = "Decriptazione con OpenPGP fallita" GOOD_SIGNATURE = "Firma valida da %USER%" diff --git a/rainloop/v/0.0.0/langs/ja-jp.ini b/rainloop/v/0.0.0/langs/ja-jp.ini index 49b3d5630..3ec6ea96c 100644 --- a/rainloop/v/0.0.0/langs/ja-jp.ini +++ b/rainloop/v/0.0.0/langs/ja-jp.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/ko-kr.ini b/rainloop/v/0.0.0/langs/ko-kr.ini index 3b143f22d..ad8f59480 100644 --- a/rainloop/v/0.0.0/langs/ko-kr.ini +++ b/rainloop/v/0.0.0/langs/ko-kr.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -651,6 +652,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index 9861eeb75..aa38a2768 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Nesustoti vykdyti taisykles" EMAIL_LABEL = "E-paštas" VACATION_SUBJECT_LABEL = "Tema (nebūtina)" VACATION_MESSAGE_LABEL = "Žinutė" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Atmesti žinutę" ALL_INCOMING_MESSAGES_DESC = "Visi ateinantys laiškai" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Viešų raktų nerasta" NO_PUBLIC_KEYS_FOUND_FOR = "Viešų raktų nerasta \"%EMAIL%\" laiškui" NO_PRIVATE_KEY_FOUND = "Privačių raktų nerasta" NO_PRIVATE_KEY_FOUND_FOR = "Privačių raktų nerasta \"%EMAIL%\" laiškui" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Nepatikrintas parašas" DECRYPTION_ERROR = "OpenPGP dekodavimo klaida" GOOD_SIGNATURE = "Tinkamas parašas %USER%" diff --git a/rainloop/v/0.0.0/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini index c7f1a4a9b..8c99991e7 100644 --- a/rainloop/v/0.0.0/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index f9f97524b..36626bd9b 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Stop niet met uitvoeren van volgende filters" EMAIL_LABEL = "E-mail" VACATION_SUBJECT_LABEL = "Onderwerp (optioneel)" VACATION_MESSAGE_LABEL = "Bericht" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Afwijsbericht" ALL_INCOMING_MESSAGES_DESC = "Alle inkomende berichten" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Geen publieke sleutels gevonden" NO_PUBLIC_KEYS_FOUND_FOR = "Geen publieke sleutels gevonden voor e-mail adres \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Geen geheime sleutel gevonden" NO_PRIVATE_KEY_FOUND_FOR = "Geen geheime sleutel gevonden voor e-mail adres \"%EMAIL%\"" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Ongeverifieerde handtekening" DECRYPTION_ERROR = "OpenPGP decryptie fout" GOOD_SIGNATURE = "Juiste handtekening van %USER%" diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index 16a2aa3ab..197fa8757 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -368,6 +368,7 @@ STOP_LABEL = "Ikke stopp bruk av regler" EMAIL_LABEL = "E-post" VACATION_SUBJECT_LABEL = "Emne (valgfritt)" VACATION_MESSAGE_LABEL = "Melding" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Forkast melding" ALL_INCOMING_MESSAGES_DESC = "Alle innkommende meldinger" @@ -653,6 +654,7 @@ NO_PUBLIC_KEYS_FOUND = "Ingen offentlige nøkler funnet" NO_PUBLIC_KEYS_FOUND_FOR = "Ingen offentlige nøkler ble funnet for \"%EMAIL%\" epost" NO_PRIVATE_KEY_FOUND = "Ingen private nøkler funnet" NO_PRIVATE_KEY_FOUND_FOR = "Ingen private nøkler ble funnet for \"%EMAIL%\" epost" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Uverifisert signatur" DECRYPTION_ERROR = "Feil med OpenPGP dekryptering" GOOD_SIGNATURE = "Godkjent signatur fra %USER%" diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index ac90fa95d..627410425 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Nie zatrzymuj przetwarzania reguł" EMAIL_LABEL = "Adres e-mail" VACATION_SUBJECT_LABEL = "Temat (opcjonalnie)" VACATION_MESSAGE_LABEL = "Wiadomość" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Powód odrzucenia" ALL_INCOMING_MESSAGES_DESC = "Wszystkie przychodzące wiadomości" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Nie znaleziono klucza publicznego" NO_PUBLIC_KEYS_FOUND_FOR = "Nie znaleziono klucza publicznego dla adresu: \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Nie znaleziono klucza prywatnego" NO_PRIVATE_KEY_FOUND_FOR = "Nie znaleziono klucza prywatnego dla adresu: \"%EMAIL%\"" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Niezweryfikowana" DECRYPTION_ERROR = "Błąd deszyfrowania OpenPGP" GOOD_SIGNATURE = "Podpisana przez: %USER%" diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index cde182e5e..b2b7289c9 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Não parar o processamento das regras" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Assunto (opcional)" VACATION_MESSAGE_LABEL = "Mensagem" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Rejeitar mensagem" ALL_INCOMING_MESSAGES_DESC = "Todas as mensagens recebidas" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Nenhuma chave pública encontrada" NO_PUBLIC_KEYS_FOUND_FOR = "Nenhuma chave pública encontrada para o e-mail \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Nenhuma chave privada encontrada" NO_PRIVATE_KEY_FOUND_FOR = "Nenhuma chave privada encontrada para o e-mail \"%EMAIL%\"" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Assinatura não verificada" DECRYPTION_ERROR = "Erro de decripitação de OpenPGP" GOOD_SIGNATURE = "Boa assinatura de %USER%" diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index d5f15565d..2d13ca45f 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Não parar de processar as regras" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Assunto (opcional)" VACATION_MESSAGE_LABEL = "Mensagem" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Rejeitar mensagem" ALL_INCOMING_MESSAGES_DESC = "Todas as mensagens recebidas" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Nenhuma chave pública encontrada" NO_PUBLIC_KEYS_FOUND_FOR = "Nenhuma chave pública encontrada para o email \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Nenhuma chave privada encontrada" NO_PRIVATE_KEY_FOUND_FOR = "Nenhuma chave privada encontrada para o email \"%EMAIL%\"" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Assinatura não verificada" DECRYPTION_ERROR = "Erro de desencriptação OpenPGP" GOOD_SIGNATURE = "Boa assinatura de %USER%" diff --git a/rainloop/v/0.0.0/langs/ro.ini b/rainloop/v/0.0.0/langs/ro.ini index bf2e49f5a..eba8053f2 100644 --- a/rainloop/v/0.0.0/langs/ro.ini +++ b/rainloop/v/0.0.0/langs/ro.ini @@ -368,6 +368,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -653,6 +654,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini index 719c2a901..373cccaab 100644 --- a/rainloop/v/0.0.0/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Не преращать обработку правил" EMAIL_LABEL = "Почтка" VACATION_SUBJECT_LABEL = "Тема (необязательно)" VACATION_MESSAGE_LABEL = "Сообщение" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Причина (будет послана отправителю)" ALL_INCOMING_MESSAGES_DESC = "Все входящие сообщения" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Публичные ключи не найдены" NO_PUBLIC_KEYS_FOUND_FOR = "Публичные ключи для \"%EMAIL%\" не найдены" NO_PRIVATE_KEY_FOUND = "Приватный ключ не найден" NO_PRIVATE_KEY_FOUND_FOR = "Приватный ключ для \"%EMAIL%\" не найден" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Неподтвержденная сигнатура" DECRYPTION_ERROR = "OpenPGP ошибка расшифровки" GOOD_SIGNATURE = "Подтвержденная сигнатура для %USER%" diff --git a/rainloop/v/0.0.0/langs/sk.ini b/rainloop/v/0.0.0/langs/sk.ini index fdfcf753c..10eac6d9a 100644 --- a/rainloop/v/0.0.0/langs/sk.ini +++ b/rainloop/v/0.0.0/langs/sk.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/sv.ini b/rainloop/v/0.0.0/langs/sv.ini index b5b34a4e1..9c0ca8f1a 100644 --- a/rainloop/v/0.0.0/langs/sv.ini +++ b/rainloop/v/0.0.0/langs/sv.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Inga publika nycklar funna" NO_PUBLIC_KEYS_FOUND_FOR = "Inga publika nycklar funna för \"%EMAIL%\" epost" NO_PRIVATE_KEY_FOUND = "Inga privata nycklar funna" NO_PRIVATE_KEY_FOUND_FOR = "Inga privata nycklar funna för \"%EMAIL%\" epost" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Overifierad signatur" DECRYPTION_ERROR = "OpenPGP dekrypterings fel" GOOD_SIGNATURE = "Godkänd signatur för %USER%" diff --git a/rainloop/v/0.0.0/langs/tr.ini b/rainloop/v/0.0.0/langs/tr.ini index 4f39a2960..c51c31911 100644 --- a/rainloop/v/0.0.0/langs/tr.ini +++ b/rainloop/v/0.0.0/langs/tr.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -652,6 +653,7 @@ NO_PUBLIC_KEYS_FOUND = "Public key bulunamadı" NO_PUBLIC_KEYS_FOUND_FOR = "Public key bulunamadı %EMAIL%" NO_PRIVATE_KEY_FOUND = "Private key bulunamadı" NO_PRIVATE_KEY_FOUND_FOR = "Private key bulunamadı %EMAIL%" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Doğrulanmamış imza" DECRYPTION_ERROR = "OpenPGP çözme hatası" GOOD_SIGNATURE = "Geçerli imza %USER%" diff --git a/rainloop/v/0.0.0/langs/ua.ini b/rainloop/v/0.0.0/langs/ua.ini index 224e93f22..4fb9855e4 100644 --- a/rainloop/v/0.0.0/langs/ua.ini +++ b/rainloop/v/0.0.0/langs/ua.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Публічні ключі не знайдено" NO_PUBLIC_KEYS_FOUND_FOR = "Публічні ключі для \"%EMAIL%\" не знайдено" NO_PRIVATE_KEY_FOUND = "Приватний ключ не знайдено" NO_PRIVATE_KEY_FOUND_FOR = "Приватний ключ для \"%EMAIL%\" не знайдено" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Непідтверджена сигнатура" DECRYPTION_ERROR = "OpenPGP помилка розшифрування" GOOD_SIGNATURE = "Підтверджена сигнатура для %USER%" diff --git a/rainloop/v/0.0.0/langs/zh-cn.ini b/rainloop/v/0.0.0/langs/zh-cn.ini index 8fad0b3f2..a607ada0d 100644 --- a/rainloop/v/0.0.0/langs/zh-cn.ini +++ b/rainloop/v/0.0.0/langs/zh-cn.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" diff --git a/rainloop/v/0.0.0/langs/zh-tw.ini b/rainloop/v/0.0.0/langs/zh-tw.ini index 9c4e257b2..0278c11bc 100644 --- a/rainloop/v/0.0.0/langs/zh-tw.ini +++ b/rainloop/v/0.0.0/langs/zh-tw.ini @@ -369,6 +369,7 @@ STOP_LABEL = "Don't stop processing rules" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Subject (optional)" VACATION_MESSAGE_LABEL = "Message" +VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" REJECT_MESSAGE_LABEL = "Reject message" ALL_INCOMING_MESSAGES_DESC = "All incoming messages" @@ -654,6 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR = "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND = "No private key found" NO_PRIVATE_KEY_FOUND_FOR = "No private key found for \"%EMAIL%\" email" +ADD_A_PUBLICK_KEY = "Add a public key" UNVERIFIRED_SIGNATURE = "Unverified signature" DECRYPTION_ERROR = "OpenPGP decryption error" GOOD_SIGNATURE = "Good signature from %USER%" From a5fe78cafaadf0e0b722591f70301543e54cda69 Mon Sep 17 00:00:00 2001 From: insertc0in Date: Thu, 6 Aug 2015 22:24:16 +0100 Subject: [PATCH 106/106] Update pt-pt.ini --- rainloop/v/0.0.0/langs/pt-pt.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index 2d13ca45f..ebc827efd 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -369,7 +369,7 @@ STOP_LABEL = "Não parar de processar as regras" EMAIL_LABEL = "Email" VACATION_SUBJECT_LABEL = "Assunto (opcional)" VACATION_MESSAGE_LABEL = "Mensagem" -VACATION_RECIPIENTS_LABEL = "Recipients (comma separated)" +VACATION_RECIPIENTS_LABEL = "Destinatários (separados por vírgula)" REJECT_MESSAGE_LABEL = "Rejeitar mensagem" ALL_INCOMING_MESSAGES_DESC = "Todas as mensagens recebidas" @@ -655,7 +655,7 @@ NO_PUBLIC_KEYS_FOUND = "Nenhuma chave pública encontrada" NO_PUBLIC_KEYS_FOUND_FOR = "Nenhuma chave pública encontrada para o email \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND = "Nenhuma chave privada encontrada" NO_PRIVATE_KEY_FOUND_FOR = "Nenhuma chave privada encontrada para o email \"%EMAIL%\"" -ADD_A_PUBLICK_KEY = "Add a public key" +ADD_A_PUBLICK_KEY = "Adicionar uma chave pública" UNVERIFIRED_SIGNATURE = "Assinatura não verificada" DECRYPTION_ERROR = "Erro de desencriptação OpenPGP" GOOD_SIGNATURE = "Boa assinatura de %USER%"