Interface redesign (attachments, new preview pane layout)

This commit is contained in:
RainLoop Team 2015-01-04 23:30:07 +04:00
parent 6755a0ce51
commit e3e7c1d963
64 changed files with 1286 additions and 1009 deletions

View file

@ -1315,26 +1315,6 @@
bTwitter = Settings.settingsGet('AllowTwitterSocial') bTwitter = Settings.settingsGet('AllowTwitterSocial')
; ;
// Utils.initOnStartOrLangChange(function () {
//
// $.extend(true, $.magnificPopup.defaults, {
// 'tClose': Utils.i18n('PREVIEW_POPUP/CLOSE'),
// 'tLoading': Utils.i18n('PREVIEW_POPUP/LOADING'),
// 'gallery': {
// 'tPrev': Utils.i18n('PREVIEW_POPUP/GALLERY_PREV'),
// 'tNext': Utils.i18n('PREVIEW_POPUP/GALLERY_NEXT'),
// 'tCounter': Utils.i18n('PREVIEW_POPUP/GALLERY_COUNTER')
// },
// 'image': {
// 'tError': Utils.i18n('PREVIEW_POPUP/IMAGE_ERROR')
// },
// 'ajax': {
// 'tError': Utils.i18n('PREVIEW_POPUP/AJAX_ERROR')
// }
// });
//
// }, this);
if (SimplePace) if (SimplePace)
{ {
SimplePace.set(70); SimplePace.set(70);
@ -1359,19 +1339,30 @@
{ {
if ($LAB && window.crypto && window.crypto.getRandomValues && Settings.capa(Enums.Capa.OpenPGP)) if ($LAB && window.crypto && window.crypto.getRandomValues && Settings.capa(Enums.Capa.OpenPGP))
{ {
$LAB.script(window.openpgp ? '' : Links.openPgpJs()).wait(function () { var fOpenpgpCallback = function (openpgp) {
if (window.openpgp) Data.openpgp = openpgp;
{ Data.openpgpKeyring = new openpgp.Keyring();
Data.openpgp = window.openpgp;
Data.openpgpKeyring = new window.openpgp.Keyring();
Data.capaOpenPGP(true); Data.capaOpenPGP(true);
Events.pub('openpgp.init'); Events.pub('openpgp.init');
self.reloadOpenPgpKeys(); self.reloadOpenPgpKeys();
};
if (window.openpgp)
{
fOpenpgpCallback(window.openpgp);
}
else
{
$LAB.script(Links.openPgpJs()).wait(function () {
if (window.openpgp)
{
fOpenpgpCallback(window.openpgp);
} }
}); });
} }
}
else else
{ {
Data.capaOpenPGP(false); Data.capaOpenPGP(false);

View file

@ -52,6 +52,7 @@
'Themes': 'THEMES', 'Themes': 'THEMES',
'UserBackground': 'USER_BACKGROUND', 'UserBackground': 'USER_BACKGROUND',
'Sieve': 'SIEVE', 'Sieve': 'SIEVE',
'AttachmentThumbnails': 'ATTACHMENT_THUMBNAILS',
'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS', 'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS',
'AdditionalIdentities': 'ADDITIONAL_IDENTITIES' 'AdditionalIdentities': 'ADDITIONAL_IDENTITIES'
}; };

168
dev/Common/Mime.js Normal file
View file

@ -0,0 +1,168 @@
(function () {
'use strict';
module.exports = {
'eml' : 'message/rfc822',
'mime' : 'message/rfc822',
'txt' : 'text/plain',
'text' : 'text/plain',
'def' : 'text/plain',
'list' : 'text/plain',
'in' : 'text/plain',
'ini' : 'text/plain',
'log' : 'text/plain',
'sql' : 'text/plain',
'cfg' : 'text/plain',
'conf' : 'text/plain',
'asc' : 'text/plain',
'rtx' : 'text/richtext',
'vcard' : 'text/vcard',
'vcf' : 'text/vcard',
'htm' : 'text/html',
'html' : 'text/html',
'csv' : 'text/csv',
'ics' : 'text/calendar',
'ifb' : 'text/calendar',
'xml' : 'text/xml',
'json' : 'application/json',
'swf' : 'application/x-shockwave-flash',
'hlp' : 'application/winhlp',
'wgt' : 'application/widget',
'chm' : 'application/vnd.ms-htmlhelp',
'p10' : 'application/pkcs10',
'p7c' : 'application/pkcs7-mime',
'p7m' : 'application/pkcs7-mime',
'p7s' : 'application/pkcs7-signature',
'torrent' : 'application/x-bittorrent',
// scripts
'js' : 'application/javascript',
'pl' : 'text/perl',
'css' : 'text/css',
'asp' : 'text/asp',
'php' : 'application/x-httpd-php',
'php3' : 'application/x-httpd-php',
'php4' : 'application/x-httpd-php',
'php5' : 'application/x-httpd-php',
'phtml' : 'application/x-httpd-php',
// images
'png' : 'image/png',
'jpg' : 'image/jpeg',
'jpeg' : 'image/jpeg',
'jpe' : 'image/jpeg',
'jfif' : 'image/jpeg',
'gif' : 'image/gif',
'bmp' : 'image/bmp',
'cgm' : 'image/cgm',
'ief' : 'image/ief',
'ico' : 'image/x-icon',
'tif' : 'image/tiff',
'tiff' : 'image/tiff',
'svg' : 'image/svg+xml',
'svgz' : 'image/svg+xml',
'djv' : 'image/vnd.djvu',
'djvu' : 'image/vnd.djvu',
'webp' : 'image/webp',
// archives
'zip' : 'application/zip',
'7z' : 'application/x-7z-compressed',
'rar' : 'application/x-rar-compressed',
'exe' : 'application/x-msdownload',
'dll' : 'application/x-msdownload',
'scr' : 'application/x-msdownload',
'com' : 'application/x-msdownload',
'bat' : 'application/x-msdownload',
'msi' : 'application/x-msdownload',
'cab' : 'application/vnd.ms-cab-compressed',
'gz' : 'application/x-gzip',
'tgz' : 'application/x-gzip',
'bz' : 'application/x-bzip',
'bz2' : 'application/x-bzip2',
'deb' : 'application/x-debian-package',
// fonts
'psf' : 'application/x-font-linux-psf',
'otf' : 'application/x-font-otf',
'pcf' : 'application/x-font-pcf',
'snf' : 'application/x-font-snf',
'ttf' : 'application/x-font-ttf',
'ttc' : 'application/x-font-ttf',
// audio
'mp3' : 'audio/mpeg',
'amr' : 'audio/amr',
'aac' : 'audio/x-aac',
'aif' : 'audio/x-aiff',
'aifc' : 'audio/x-aiff',
'aiff' : 'audio/x-aiff',
'wav' : 'audio/x-wav',
'wma' : 'audio/x-ms-wma',
'wax' : 'audio/x-ms-wax',
'midi' : 'audio/midi',
'mp4a' : 'audio/mp4',
'ogg' : 'audio/ogg',
'weba' : 'audio/webm',
'ra' : 'audio/x-pn-realaudio',
'ram' : 'audio/x-pn-realaudio',
'rmp' : 'audio/x-pn-realaudio-plugin',
'm3u' : 'audio/x-mpegurl',
// video
'flv' : 'video/x-flv',
'qt' : 'video/quicktime',
'mov' : 'video/quicktime',
'wmv' : 'video/windows-media',
'avi' : 'video/x-msvideo',
'mpg' : 'video/mpeg',
'mpeg' : 'video/mpeg',
'mpe' : 'video/mpeg',
'm1v' : 'video/mpeg',
'm2v' : 'video/mpeg',
'3gp' : 'video/3gpp',
'3g2' : 'video/3gpp2',
'h261' : 'video/h261',
'h263' : 'video/h263',
'h264' : 'video/h264',
'jpgv' : 'video/jpgv',
'mp4' : 'video/mp4',
'mp4v' : 'video/mp4',
'mpg4' : 'video/mp4',
'ogv' : 'video/ogg',
'webm' : 'video/webm',
'm4v' : 'video/x-m4v',
'asf' : 'video/x-ms-asf',
'asx' : 'video/x-ms-asf',
'wm' : 'video/x-ms-wm',
'wmx' : 'video/x-ms-wmx',
'wvx' : 'video/x-ms-wvx',
'movie' : 'video/x-sgi-movie',
// adobe
'pdf' : 'application/pdf',
'psd' : 'image/vnd.adobe.photoshop',
'ai' : 'application/postscript',
'eps' : 'application/postscript',
'ps' : 'application/postscript',
// ms office
'doc' : 'application/msword',
'dot' : 'application/msword',
'rtf' : 'application/rtf',
'xls' : 'application/vnd.ms-excel',
'ppt' : 'application/vnd.ms-powerpoint',
'docx' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'xlsx' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'dotx' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
'pptx' : 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
// open office
'odt' : 'application/vnd.oasis.opendocument.text',
'ods' : 'application/vnd.oasis.opendocument.spreadsheet'
};
}());

View file

@ -15,6 +15,8 @@
Autolinker = require('Autolinker'), Autolinker = require('Autolinker'),
JSEncrypt = require('JSEncrypt'), JSEncrypt = require('JSEncrypt'),
Mime = require('Common/Mime'),
Enums = require('Common/Enums'), Enums = require('Common/Enums'),
Consts = require('Common/Consts'), Consts = require('Common/Consts'),
Globals = require('Common/Globals') Globals = require('Common/Globals')
@ -1060,6 +1062,7 @@
oData.capaAdditionalIdentities = ko.observable(false); oData.capaAdditionalIdentities = ko.observable(false);
oData.capaGravatar = ko.observable(false); oData.capaGravatar = ko.observable(false);
oData.capaSieve = ko.observable(false); oData.capaSieve = ko.observable(false);
oData.capaAttachmentThumbnails = ko.observable(false);
oData.determineUserLanguage = ko.observable(false); oData.determineUserLanguage = ko.observable(false);
oData.determineUserDomain = ko.observable(false); oData.determineUserDomain = ko.observable(false);
@ -2029,6 +2032,45 @@
$('#rl-head-viewport').attr('content', aContent.join(', ')); $('#rl-head-viewport').attr('content', aContent.join(', '));
}; };
/**
* @param {string} sFileName
* @return {string}
*/
Utils.getFileExtension = function (sFileName)
{
sFileName = Utils.trim(sFileName).toLowerCase();
var sResult = sFileName.split('.').pop();
return (sResult === sFileName) ? '' : sResult;
};
/**
* @param {string} sFileName
* @return {string}
*/
Utils.mimeContentType = function (sFileName)
{
var
sExt = '',
sResult = 'application/octet-stream'
;
sFileName = Utils.trim(sFileName).toLowerCase();
if ('winmail.dat' === sFileName)
{
return 'application/ms-tnef';
}
sExt = Utils.getFileExtension(sFileName);
if (sExt && 0 < sExt.length && !Utils.isUnd(Mime[sExt]))
{
sResult = Mime[sExt];
}
return sResult;
};
/** /**
* @param {mixed} mPropOrValue * @param {mixed} mPropOrValue
* @param {mixed} mValue * @param {mixed} mValue

View file

@ -167,13 +167,21 @@
return Links.attachmentPreview(this.download); return Links.attachmentPreview(this.download);
}; };
/**
* @return {string}
*/
AttachmentModel.prototype.linkThumbnail = function ()
{
return this.hasThumbnail() ? Links.attachmentThumbnailPreview(this.download) : '';
};
/** /**
* @return {string} * @return {string}
*/ */
AttachmentModel.prototype.linkThumbnailPreviewStyle = function () AttachmentModel.prototype.linkThumbnailPreviewStyle = function ()
{ {
return !this.hasThumbnail() ? '' : var sLink = this.linkThumbnail();
'background:url(' + Links.attachmentThumbnailPreview(this.download) + ')'; return '' === sLink ? '' : 'background:url(' + sLink + ')';
}; };
/** /**
@ -253,10 +261,14 @@
return true; return true;
}; };
AttachmentModel.prototype.iconClass = function () /**
* @param {string} sMimeType
* @returns {string}
*/
AttachmentModel.staticIconClassHelper = function (sMimeType)
{ {
var var
aParts = this.mimeType.toLocaleString().split('/'), aParts = sMimeType.toLocaleString().split('/'),
sClass = 'icon-file' sClass = 'icon-file'
; ;
@ -333,6 +345,14 @@
return sClass; return sClass;
}; };
/**
* @returns {string}
*/
AttachmentModel.prototype.iconClass = function ()
{
return AttachmentModel.staticIconClassHelper(this.mimeType);
};
module.exports = AttachmentModel; module.exports = AttachmentModel;
}()); }());

View file

@ -9,6 +9,8 @@
Utils = require('Common/Utils'), Utils = require('Common/Utils'),
AttachmentModel = require('Model/Attachment'),
AbstractModel = require('Knoin/AbstractModel') AbstractModel = require('Knoin/AbstractModel')
; ;
@ -37,17 +39,37 @@
this.size = ko.observable(Utils.isUnd(nSize) ? null : nSize); this.size = ko.observable(Utils.isUnd(nSize) ? null : nSize);
this.tempName = ko.observable(''); this.tempName = ko.observable('');
this.progress = ko.observable(''); this.progress = ko.observable(0);
this.error = ko.observable(''); this.error = ko.observable('');
this.waiting = ko.observable(true); this.waiting = ko.observable(true);
this.uploading = ko.observable(false); this.uploading = ko.observable(false);
this.enabled = ko.observable(true); this.enabled = ko.observable(true);
this.complete = ko.observable(false);
this.progressText = ko.computed(function () {
var iP = this.progress();
return 0 === iP ? '' : '' + (99 === iP ? 100 : iP) + '%';
}, this);
this.progressStyle = ko.computed(function () {
var iP = this.progress();
return 0 === iP ? '' : 'width:' + (99 === iP ? 100 : iP) + '%';
}, this);
this.title = ko.computed(function () {
var sError = this.error();
return '' !== sError ? sError : this.fileName();
}, this);
this.friendlySize = ko.computed(function () { this.friendlySize = ko.computed(function () {
var mSize = this.size(); var mSize = this.size();
return null === mSize ? '' : Utils.friendlySize(this.size()); return null === mSize ? '' : Utils.friendlySize(this.size());
}, this); }, this);
this.mimeType = ko.computed(function () {
return Utils.mimeContentType(this.fileName());
}, this);
this.regDisposables([this.friendlySize]); this.regDisposables([this.friendlySize]);
} }
@ -63,6 +85,7 @@
/** /**
* @param {AjaxJsonComposeAttachment} oJsonAttachment * @param {AjaxJsonComposeAttachment} oJsonAttachment
* @return {boolean}
*/ */
ComposeAttachmentModel.prototype.initByUploadJson = function (oJsonAttachment) ComposeAttachmentModel.prototype.initByUploadJson = function (oJsonAttachment)
{ {
@ -80,6 +103,15 @@
return bResult; return bResult;
}; };
/**
* @return {string}
*/
ComposeAttachmentModel.prototype.iconClass = function ()
{
return AttachmentModel.staticIconClassHelper(this.mimeType());
};
module.exports = ComposeAttachmentModel; module.exports = ComposeAttachmentModel;
}()); }());

View file

@ -106,6 +106,7 @@
; ;
Globals.$html.toggleClass('rl-no-preview-pane', Enums.Layout.NoPreview === Data.layout()); Globals.$html.toggleClass('rl-no-preview-pane', Enums.Layout.NoPreview === Data.layout());
Globals.$html.toggleClass('rl-bottom-preview-pane', Enums.Layout.BottomPreview === Data.layout());
Data.folderList.subscribe(fResizeFunction); Data.folderList.subscribe(fResizeFunction);
Data.messageList.subscribe(fResizeFunction); Data.messageList.subscribe(fResizeFunction);
@ -113,6 +114,7 @@
Data.layout.subscribe(function (nValue) { Data.layout.subscribe(function (nValue) {
Globals.$html.toggleClass('rl-no-preview-pane', Enums.Layout.NoPreview === nValue); Globals.$html.toggleClass('rl-no-preview-pane', Enums.Layout.NoPreview === nValue);
Globals.$html.toggleClass('rl-bottom-preview-pane', Enums.Layout.BottomPreview === nValue);
}); });
Events.sub('mailbox.inbox-unread-count', function (nCount) { Events.sub('mailbox.inbox-unread-count', function (nCount) {

View file

@ -32,6 +32,7 @@
this.capaGravatar = Data.capaGravatar; this.capaGravatar = Data.capaGravatar;
this.capaAdditionalAccounts = Data.capaAdditionalAccounts; this.capaAdditionalAccounts = Data.capaAdditionalAccounts;
this.capaAdditionalIdentities = Data.capaAdditionalIdentities; this.capaAdditionalIdentities = Data.capaAdditionalIdentities;
this.capaAttachmentThumbnails = Data.capaAttachmentThumbnails;
this.weakPassword = Data.weakPassword; this.weakPassword = Data.weakPassword;
@ -114,6 +115,12 @@
}); });
}); });
self.capaAttachmentThumbnails.subscribe(function (bValue) {
Remote.saveAdminConfig(null, {
'CapaAttachmentThumbnails': bValue ? '1' : '0'
});
});
self.capaThemes.subscribe(function (bValue) { self.capaThemes.subscribe(function (bValue) {
Remote.saveAdminConfig(null, { Remote.saveAdminConfig(null, {
'CapaThemes': bValue ? '1' : '0' 'CapaThemes': bValue ? '1' : '0'

View file

@ -36,13 +36,6 @@
this.useCheckboxesInList = Data.useCheckboxesInList; this.useCheckboxesInList = Data.useCheckboxesInList;
this.allowLanguagesOnSettings = Data.allowLanguagesOnSettings; this.allowLanguagesOnSettings = Data.allowLanguagesOnSettings;
this.usePreviewPaneCheckbox = ko.computed({
read: this.usePreviewPane,
write: function (bValue) {
this.layout(bValue ? Enums.Layout.SidePreview : Enums.Layout.NoPreview);
}
}, this);
this.isDesktopNotificationsSupported = ko.computed(function () { this.isDesktopNotificationsSupported = ko.computed(function () {
return Enums.DesktopNotifications.NotSupported !== Data.desktopNotificationsPermisions(); return Enums.DesktopNotifications.NotSupported !== Data.desktopNotificationsPermisions();
}); });
@ -60,6 +53,7 @@
this.mppTrigger = ko.observable(Enums.SaveSettingsStep.Idle); this.mppTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.editorDefaultTypeTrigger = ko.observable(Enums.SaveSettingsStep.Idle); this.editorDefaultTypeTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.layoutTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.isAnimationSupported = Globals.bAnimationSupported; this.isAnimationSupported = Globals.bAnimationSupported;
@ -72,12 +66,16 @@
{'id': Enums.EditorDefaultType.PlainForced, 'name': Utils.i18n('SETTINGS_GENERAL/LABEL_EDITOR_PLAIN_FORCED')} {'id': Enums.EditorDefaultType.PlainForced, 'name': Utils.i18n('SETTINGS_GENERAL/LABEL_EDITOR_PLAIN_FORCED')}
]; ];
}, this); }, this);
}
GeneralUserSettings.prototype.toggleLayout = function () this.layoutTypes = ko.computed(function () {
{ Globals.langChangeTrigger();
this.layout(Enums.Layout.NoPreview === this.layout() ? Enums.Layout.SidePreview : Enums.Layout.NoPreview); return [
}; {'id': Enums.Layout.NoPreview, 'name': Utils.i18n('SETTINGS_GENERAL/LABEL_LAYOUT_NO_SPLIT')},
{'id': Enums.Layout.SidePreview, 'name': Utils.i18n('SETTINGS_GENERAL/LABEL_LAYOUT_VERTICAL_SPLIT')},
{'id': Enums.Layout.BottomPreview, 'name': Utils.i18n('SETTINGS_GENERAL/LABEL_LAYOUT_HORIZONTAL_SPLIT')}
];
}, this);
}
GeneralUserSettings.prototype.onBuild = function () GeneralUserSettings.prototype.onBuild = function ()
{ {
@ -88,6 +86,7 @@
var var
f0 = Utils.settingsSaveHelperSimpleFunction(self.editorDefaultTypeTrigger, self), f0 = Utils.settingsSaveHelperSimpleFunction(self.editorDefaultTypeTrigger, self),
f1 = Utils.settingsSaveHelperSimpleFunction(self.mppTrigger, self), f1 = Utils.settingsSaveHelperSimpleFunction(self.mppTrigger, self),
f2 = Utils.settingsSaveHelperSimpleFunction(self.layoutTrigger, self),
fReloadLanguageHelper = function (iSaveSettingsStep) { fReloadLanguageHelper = function (iSaveSettingsStep) {
return function() { return function() {
self.languageTrigger(iSaveSettingsStep); self.languageTrigger(iSaveSettingsStep);
@ -164,7 +163,7 @@
Data.messageList([]); Data.messageList([]);
Remote.saveSettings(null, { Remote.saveSettings(f2, {
'Layout': nValue 'Layout': nValue
}); });
}); });

View file

@ -45,6 +45,7 @@
this.capaAdditionalAccounts(Settings.capa(Enums.Capa.AdditionalAccounts)); this.capaAdditionalAccounts(Settings.capa(Enums.Capa.AdditionalAccounts));
this.capaAdditionalIdentities(Settings.capa(Enums.Capa.AdditionalIdentities)); this.capaAdditionalIdentities(Settings.capa(Enums.Capa.AdditionalIdentities));
this.capaGravatar(Settings.capa(Enums.Capa.Gravatar)); this.capaGravatar(Settings.capa(Enums.Capa.Gravatar));
this.capaAttachmentThumbnails(Settings.capa(Enums.Capa.AttachmentThumbnails));
this.capaSieve(Settings.capa(Enums.Capa.Sieve)); this.capaSieve(Settings.capa(Enums.Capa.Sieve));
this.determineUserLanguage(!!Settings.settingsGet('DetermineUserLanguage')); this.determineUserLanguage(!!Settings.settingsGet('DetermineUserLanguage'));
this.determineUserDomain(!!Settings.settingsGet('DetermineUserDomain')); this.determineUserDomain(!!Settings.settingsGet('DetermineUserDomain'));
@ -74,6 +75,7 @@
{ {
this.layout(mLayout); this.layout(mLayout);
} }
this.facebookSupported(!!Settings.settingsGet('SupportedFacebookSocial')); this.facebookSupported(!!Settings.settingsGet('SupportedFacebookSocial'));
this.facebookEnable(!!Settings.settingsGet('AllowFacebookSocial')); this.facebookEnable(!!Settings.settingsGet('AllowFacebookSocial'));
this.facebookAppID(Settings.settingsGet('FacebookAppID')); this.facebookAppID(Settings.settingsGet('FacebookAppID'));

View file

@ -12,8 +12,158 @@
} }
} }
.textAreaParent { .textAreaParent, .attachmentAreaParent {
overflow: hidden; overflow: hidden;
position: relative;
}
.attachmentAreaParent {
padding: 10px 10px 6px 10px;
background: #ddd;
border-top: 1px solid #ccc;
overflow-y: auto;
}
.attachmentAreaParent {
.no-attachments-desc {
padding: 50px 10px;
text-align: center;
font-size: 24px;
color: #666;
text-shadow: 0 1px 0 #fff;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}
.attachmentList {
margin: 0;
padding: 10px;
.attachmentItem {
display: inline-block;
margin: 3px 6px;;
max-width: 200px;
min-width: 60px;
overflow: hidden;
/*cursor: pointer;*/
list-style: none;
line-height: 24px;
border: 0;
background-color: #fff;
box-shadow: 0 1px 5px #ccc;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04), 0 1px 5px rgba(0, 0, 0, 0.1);
border-radius: 2px;
&.waiting {
opacity: 0.6;
}
&.error {
.attachmentIcon, .attachmentSize, .attachmentName {
color: red;
}
}
.attachmentIconParent {
position: relative;
height: 56px;
width: 60px;
background: none;
.iconPreview, .iconBG, .iconMain, .iconProgress {
position: absolute;
top: 0;
left: 0;
display: inline-block;
width: 100%;
height: 100%;
}
.iconProgress {
background: #eee;
width: 0%;
}
.iconBG {
font-size: 18px;
text-align: center;
color: #999;
font-weight: bold;
line-height: 55px;
text-shadow: 0 1px 0 #FFF;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
}
.iconPreview {
display: none;
background: #555;
background-image: none;
background: rgba(0, 0, 0, .5) !important;
.attachmentIcon {
color: #fff;
text-shadow: 0 1px 0 #000;
}
}
}
.attachmentNameParent {
position: relative;
margin-left: 60px;
padding: 4px;
padding-left: 6px;
min-width: 90px;
color: #333;
background: #fafafa;
border-left: 1px solid #ddd;
}
.attachmentIcon {
margin: 6px 0 0 13px;
font-size: 36px;
width: 36px;
height: 36px;
color: #aaa;
}
.attachmentIconParent.hasPreview:hover {
.iconPreview {
display: inline-block;
}
.iconMain {
display: none;
}
}
.showPreview {
display: none;
}
.attachmentIconParent.hasPreview {
.showPreview {
display: inline;
}
.hidePreview {
display: none;
}
}
}
}
} }
.b-header-toolbar { .b-header-toolbar {

View file

@ -230,6 +230,51 @@ html.rl-no-preview-pane {
} }
} }
html.rl-bottom-preview-pane {
#rl-sub-left {
right: @rlBottomMargin !important;
width: inherit;
.b-message-list-wrapper {
bottom: inherit;
height: 300px;
box-shadow: none;
}
.messageList .inputSearch {
width: 300px !important;
}
}
#rl-sub-right {
left: 0 !important;
.messageView .top-toolbar {
display: none;
}
.b-message-view-wrapper {
top: 356px;
left: 0;
right: 5px;
box-shadow: none;
}
.message-fixed-button-toolbar {
top: 370px;
}
}
#rl-right .ui-resizable-handle {
display: none !important;
}
}
.visible-on-ctrl, .visible-on-ctrl-btn { .visible-on-ctrl, .visible-on-ctrl-btn {
display: none; display: none;
} }

View file

@ -30,12 +30,11 @@ html.rl-no-preview-pane {
top: 50px + @rlLowMargin; top: 50px + @rlLowMargin;
bottom: @rlLowMargin + @rlBottomMargin; bottom: @rlLowMargin + @rlBottomMargin;
right: @rlLowMargin; right: @rlLowMargin;
left: -1px; left: -2px;
overflow: hidden; /*overflow: hidden;*/
border: @rlLowBorderSize solid @rlMainDarkColor; border: @rlLowBorderSize solid @rlMainDarkColor;
.border-top-right-radius(@rlLowBorderRadius); .border-radius(@rlLowBorderRadius);
.border-bottom-right-radius(@rlLowBorderRadius);
background-color: #fff; background-color: #fff;
@ -58,8 +57,8 @@ html.rl-no-preview-pane {
text-align: center; text-align: center;
font-size: 24px; font-size: 24px;
line-height: 30px; line-height: 30px;
padding-top: 120px;
color: #999; color: #999;
padding: 120px 10px 0 10px;
} }
.b-message-view-desc.error { .b-message-view-desc.error {
@ -70,7 +69,10 @@ html.rl-no-preview-pane {
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
} }
.messageItemDropdown { .message-fixed-button-toolbar {
float: right;
z-index: 100; z-index: 100;
position: fixed; position: fixed;
top: 70px; top: 70px;
@ -155,7 +157,7 @@ html.rl-no-preview-pane {
margin: 0 5px 0 0; margin: 0 5px 0 0;
background: #fff; background: #fff;
border: 1px solid #ccc; border: 1px solid #ccc;
border-radius: 10px; border-radius: 6px;
box-sizing: border-box; box-sizing: border-box;
} }
@ -240,10 +242,8 @@ html.rl-no-preview-pane {
max-width: 200px; max-width: 200px;
min-width: 60px; min-width: 60px;
overflow: hidden; overflow: hidden;
cursor: pointer;
list-style: none; list-style: none;
line-height: 24px; line-height: 24px;
/*border: 2px solid grey;*/
border: 0; border: 0;
background-color: #fff; background-color: #fff;
box-shadow: 0 1px 5px #ccc; box-shadow: 0 1px 5px #ccc;
@ -294,6 +294,8 @@ html.rl-no-preview-pane {
padding-left: 6px; padding-left: 6px;
min-width: 90px; min-width: 90px;
cursor: pointer;
color: #333; color: #333;
background: #fafafa; background: #fafafa;
border-left: 1px solid #ddd; border-left: 1px solid #ddd;
@ -441,7 +443,7 @@ html.rl-no-preview-pane {
&.message-focused .b-content { &.message-focused .b-content {
z-index: 102; z-index: 102;
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.3); box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.2);
border-radius: @rlLowBorderRadius; border-radius: @rlLowBorderRadius;
border-color: darken(@rlMainDarkColor, 5%); border-color: darken(@rlMainDarkColor, 5%);
} }
@ -479,26 +481,26 @@ html.rl-message-fullscreen {
} }
.messageView .b-content { .messageView .b-content {
position: fixed; position: fixed !important;
margin: 5px; margin: 5px !important;
top: 0; top: 0 !important;
left: 0; left: 0 !important;
right: 0; right: 0 !important;
bottom: 0; bottom: 0 !important;
z-index: 10000; z-index: 10000 !important;
border: @rlLowBorderSize solid @rlMainDarkColor; border: @rlLowBorderSize solid @rlMainDarkColor !important;
border-radius: @rlLowBorderRadius; border-radius: @rlLowBorderRadius !important;
.messageItemDropdown { .message-fixed-button-toolbar {
top: 20px; top: 20px !important;
} }
.buttonUnFull { .buttonUnFull {
display: inline-block; display: inline-block !important;
} }
.buttonFull { .buttonFull {
display: none; display: none !important;
} }
} }
} }

View file

@ -34,6 +34,29 @@
vertical-align: middle; vertical-align: middle;
} }
.accountPlace {
background-color: #000;
background-color: rgba(0, 0, 0, 0.5);
color: #fff;
text-shadow: 0 1px 0 #000;
position: absolute;
top: 11px;
right: 70px;
display: inline-block;
height: 28px;
max-width: 250px;
border-radius: 4px;
font-size: 16px;
line-height: 30px;
padding: 1px 8px;
overflow: hidden;
text-overflow: ellipsis;
border-radius: 4px;
font-weight: bold;
}
.account-item { .account-item {
.icon-ok { .icon-ok {
@ -58,3 +81,7 @@
padding-right: 5px; padding-right: 5px;
} }
} }
html.ssm-state-mobile .accountPlace {
max-width: 150px !important;
}

View file

@ -135,6 +135,8 @@ html.rgba.textshadow {
text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
padding: 5px 10px; padding: 5px 10px;
border-radius: 2px; border-radius: 2px;
overflow: hidden;
text-overflow: ellipsis;
} }
.tooltip-big { .tooltip-big {

View file

@ -10,7 +10,7 @@
@rlMainBorderRadius: 5px; @rlMainBorderRadius: 5px;
@rlLowBorderRadius: 3px; @rlLowBorderRadius: 3px;
@rlMainShadow: 0px 2px 8px rgba(0, 0, 0, 0.3); @rlMainShadow: 0px 2px 8px rgba(0, 0, 0, 0.2);
@rlLowMargin: 8px; @rlLowMargin: 8px;
@rlBottomMargin: 5px; @rlBottomMargin: 5px;

View file

@ -51,6 +51,9 @@
var var
self = this, self = this,
fResizeSub = function () {
Utils.windowResize();
},
fCcAndBccCheckHelper = function (aValue) { fCcAndBccCheckHelper = function (aValue) {
if (false === self.showCcAndBcc() && 0 < aValue.length) if (false === self.showCcAndBcc() && 0 < aValue.length)
{ {
@ -89,6 +92,7 @@
this.emptyToError = ko.observable(false); this.emptyToError = ko.observable(false);
this.attachmentsInProcessError = ko.observable(false); this.attachmentsInProcessError = ko.observable(false);
this.attachmentsInErrorError = ko.observable(false);
this.showCcAndBcc = ko.observable(false); this.showCcAndBcc = ko.observable(false);
this.cc.subscribe(fCcAndBccCheckHelper, this); this.cc.subscribe(fCcAndBccCheckHelper, this);
@ -101,21 +105,45 @@
this.attachments = ko.observableArray([]); this.attachments = ko.observableArray([]);
this.attachmentsInProcess = this.attachments.filter(function (oItem) { this.attachmentsInProcess = this.attachments.filter(function (oItem) {
return oItem && '' === oItem.tempName(); return oItem && !oItem.complete();
}); });
this.attachmentsInReady = this.attachments.filter(function (oItem) { this.attachmentsInReady = this.attachments.filter(function (oItem) {
return oItem && '' !== oItem.tempName(); return oItem && oItem.complete();
}); });
this.attachments.subscribe(function () { this.attachmentsInError = this.attachments.filter(function (oItem) {
this.triggerForResize(); return oItem && '' !== oItem.error();
});
this.attachmentsCount = ko.computed(function () {
return this.attachments().length;
}, this);
this.attachmentsInErrorCount = ko.computed(function () {
return this.attachmentsInError().length;
}, this);
this.attachmentsInProcessCount = ko.computed(function () {
return this.attachmentsInProcess().length;
}, this); }, this);
this.isDraftFolderMessage = ko.computed(function () { this.isDraftFolderMessage = ko.computed(function () {
return '' !== this.draftFolder() && '' !== this.draftUid(); return '' !== this.draftFolder() && '' !== this.draftUid();
}, this); }, this);
this.attachmentsPlace = ko.observable(false);
this.attachments.subscribe(fResizeSub);
this.attachmentsPlace.subscribe(fResizeSub);
this.attachmentsInErrorCount.subscribe(function (iN) {
if (0 === iN)
{
this.attachmentsInErrorError(false);
}
}, this);
this.composeUploaderButton = ko.observable(null); this.composeUploaderButton = ko.observable(null);
this.composeUploaderDropPlace = ko.observable(null); this.composeUploaderDropPlace = ko.observable(null);
this.dragAndDropEnabled = ko.observable(false); this.dragAndDropEnabled = ko.observable(false);
@ -227,6 +255,7 @@
this.saveMessageResponse = _.bind(this.saveMessageResponse, this); this.saveMessageResponse = _.bind(this.saveMessageResponse, this);
this.sendCommand = Utils.createCommand(this, function () { this.sendCommand = Utils.createCommand(this, function () {
var var
sTo = Utils.trim(this.to()), sTo = Utils.trim(this.to()),
sSentFolder = Data.sentFolder(), sSentFolder = Data.sentFolder(),
@ -236,6 +265,12 @@
if (0 < this.attachmentsInProcess().length) if (0 < this.attachmentsInProcess().length)
{ {
this.attachmentsInProcessError(true); this.attachmentsInProcessError(true);
this.attachmentsPlace(true);
}
else if (0 < this.attachmentsInError().length)
{
this.attachmentsInErrorError(true);
this.attachmentsPlace(true);
} }
else if (0 === sTo.length) else if (0 === sTo.length)
{ {
@ -1111,6 +1146,7 @@
if (oAttachment) if (oAttachment)
{ {
oAttachment.tempName(sTempName); oAttachment.tempName(sTempName);
oAttachment.waiting(false).uploading(false).complete(true);
} }
} }
} }
@ -1118,7 +1154,7 @@
} }
else else
{ {
self.setMessageAttachmentFailedDowbloadText(); self.setMessageAttachmentFailedDownloadText();
} }
}, aDownloads); }, aDownloads);
@ -1480,7 +1516,7 @@
if (oItem) if (oItem)
{ {
oItem.progress(' - ' + window.Math.floor(iLoaded / iTotal * 100) + '%'); oItem.progress(window.Math.floor(iLoaded / iTotal * 100));
} }
}, this)) }, this))
@ -1499,9 +1535,14 @@
this.attachments.push(oAttachment); this.attachments.push(oAttachment);
this.attachmentsPlace(true);
if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize) if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize)
{ {
oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG')); oAttachment
.waiting(false).uploading(true).complete(true)
.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG'));
return false; return false;
} }
@ -1529,8 +1570,7 @@
if (oItem) if (oItem)
{ {
oItem.waiting(false); oItem.waiting(false).uploading(true).complete(false);
oItem.uploading(true);
} }
}, this)) }, this))
@ -1562,6 +1602,7 @@
oAttachment oAttachment
.waiting(false) .waiting(false)
.uploading(false) .uploading(false)
.complete(true)
.error(sError) .error(sError)
; ;
} }
@ -1570,6 +1611,7 @@
oAttachment oAttachment
.waiting(false) .waiting(false)
.uploading(false) .uploading(false)
.complete(true)
; ;
oAttachment.initByUploadJson(oAttachmentJson); oAttachment.initByUploadJson(oAttachmentJson);
@ -1639,7 +1681,7 @@
oAttachment.fromMessage = true; oAttachment.fromMessage = true;
oAttachment.cancel = this.cancelAttachmentHelper(oMessage.requestHash); oAttachment.cancel = this.cancelAttachmentHelper(oMessage.requestHash);
oAttachment.waiting(false).uploading(true); oAttachment.waiting(false).uploading(true).complete(true);
this.attachments.push(oAttachment); this.attachments.push(oAttachment);
} }
@ -1663,13 +1705,15 @@
oAttachment.fromMessage = false; oAttachment.fromMessage = false;
oAttachment.cancel = this.cancelAttachmentHelper(oDropboxFile['link']); oAttachment.cancel = this.cancelAttachmentHelper(oDropboxFile['link']);
oAttachment.waiting(false).uploading(true); oAttachment.waiting(false).uploading(true).complete(false);
this.attachments.push(oAttachment); this.attachments.push(oAttachment);
this.attachmentsPlace(true);
if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize) if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize)
{ {
oAttachment.uploading(false); oAttachment.uploading(false).complete(true);
oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG')); oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG'));
return false; return false;
} }
@ -1677,7 +1721,7 @@
Remote.composeUploadExternals(function (sResult, oData) { Remote.composeUploadExternals(function (sResult, oData) {
var bResult = false; var bResult = false;
oAttachment.uploading(false); oAttachment.uploading(false).complete(true);
if (Enums.StorageResultType.Success === sResult && oData && oData.Result) if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
{ {
@ -1717,13 +1761,15 @@
oAttachment.fromMessage = false; oAttachment.fromMessage = false;
oAttachment.cancel = this.cancelAttachmentHelper(oDriveFile['downloadUrl']); oAttachment.cancel = this.cancelAttachmentHelper(oDriveFile['downloadUrl']);
oAttachment.waiting(false).uploading(true); oAttachment.waiting(false).uploading(true).complete(false);
this.attachments.push(oAttachment); this.attachments.push(oAttachment);
this.attachmentsPlace(true);
if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize) if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize)
{ {
oAttachment.uploading(false); oAttachment.uploading(false).complete(true);
oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG')); oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG'));
return false; return false;
} }
@ -1731,7 +1777,7 @@
Remote.composeUploadDrive(function (sResult, oData) { Remote.composeUploadDrive(function (sResult, oData) {
var bResult = false; var bResult = false;
oAttachment.uploading(false); oAttachment.uploading(false).complete(true);
if (Enums.StorageResultType.Success === sResult && oData && oData.Result) if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
{ {
@ -1803,7 +1849,7 @@
oAttachment.fromMessage = true; oAttachment.fromMessage = true;
oAttachment.cancel = this.cancelAttachmentHelper(oItem.download); oAttachment.cancel = this.cancelAttachmentHelper(oItem.download);
oAttachment.waiting(false).uploading(true); oAttachment.waiting(false).uploading(true).complete(false);
this.attachments.push(oAttachment); this.attachments.push(oAttachment);
} }
@ -1825,7 +1871,7 @@
} }
}; };
ComposePopupView.prototype.setMessageAttachmentFailedDowbloadText = function () ComposePopupView.prototype.setMessageAttachmentFailedDownloadText = function ()
{ {
_.each(this.attachments(), function(oAttachment) { _.each(this.attachments(), function(oAttachment) {
if (oAttachment && oAttachment.fromMessage) if (oAttachment && oAttachment.fromMessage)
@ -1833,6 +1879,7 @@
oAttachment oAttachment
.waiting(false) .waiting(false)
.uploading(false) .uploading(false)
.complete(true)
.error(Utils.getUploadErrorDescByCode(Enums.UploadErrorCode.FileNoUploaded)) .error(Utils.getUploadErrorDescByCode(Enums.UploadErrorCode.FileNoUploaded))
; ;
} }
@ -1869,6 +1916,8 @@
this.requestReadReceipt(false); this.requestReadReceipt(false);
this.markAsImportant(false); this.markAsImportant(false);
this.attachmentsPlace(false);
this.aDraftInfo = null; this.aDraftInfo = null;
this.sInReplyTo = ''; this.sInReplyTo = '';
this.bFromDraft = false; this.bFromDraft = false;

View file

@ -81,7 +81,7 @@
this.dragOverBodyArea = ko.observable(null); this.dragOverBodyArea = ko.observable(null);
this.messageListItemTemplate = ko.computed(function () { this.messageListItemTemplate = ko.computed(function () {
return Enums.Layout.NoPreview !== Data.layout() ? return Enums.Layout.SidePreview === Data.layout() ?
'MailMessageListItem' : 'MailMessageListItemNoPreviewPane'; 'MailMessageListItem' : 'MailMessageListItemNoPreviewPane';
}); });

View file

@ -345,27 +345,8 @@
} }
}, this); }, this);
// $('.attachmentsPlace', oDom).magnificPopup({
// 'delegate': '.attachmentImagePreview:visible',
// 'type': 'image',
// 'gallery': {
// 'enabled': true,
// 'preload': [1, 1],
// 'navigateByImgClick': true
// },
// 'callbacks': {
// 'open': function() {
// Globals.useKeyboardShortcuts(false);
// },
// 'close': function() {
// Globals.useKeyboardShortcuts(true);
// }
// },
// 'mainClass': 'mfp-fade',
// 'removalDelay': 400
// });
this.pswpDom = $('.pswp', oDom)[0]; this.pswpDom = $('.pswp', oDom)[0];
if (this.pswpDom) if (this.pswpDom)
{ {
oDom oDom
@ -375,18 +356,31 @@
oPs = null, oPs = null,
oEl = oEvent.currentTarget || null, oEl = oEvent.currentTarget || null,
aItems = [] aItems = []
// fThumbBoundsFn = function (index) {
// var oRes = null, oEl = aItems[index], oPos = null;
// if (oEl && oEl.el)
// {
// oPos = oEl.el.find('.iconBG').offset();
// oRes = oPos && oPos.top && oPos.left ?
// {x: oPos.left, y: oPos.top, w: 60} : null;
// }
//
// return oRes;
// }
; ;
oDom.find('.attachmentImagePreview[data-index]').each(function (index, oSubElement) { oDom.find('.attachmentImagePreview[data-index]').each(function (index, oSubElement) {
var $oItem = $(oSubElement); var
$oItem = $(oSubElement)
;
aItems.push({ aItems.push({
w: 600, h: 400, // 'el': $oItem,
'w': 600, 'h': 400,
'src': $oItem.attr('href'), 'src': $oItem.attr('href'),
'title': $oItem.attr('title') || '' 'title': $oItem.attr('title') || ''
}); });
}); });
if (aItems && 0 < aItems.length) if (aItems && 0 < aItems.length)
@ -400,6 +394,7 @@
'errorMsg': '<div class="pswp__error-msg">' + sErrorMessage + '</div>', 'errorMsg': '<div class="pswp__error-msg">' + sErrorMessage + '</div>',
'showHideOpacity': true, 'showHideOpacity': true,
'tapToToggleControls': false, 'tapToToggleControls': false,
// 'getThumbBoundsFn': fThumbBoundsFn,
'timeToIdle': 0, 'timeToIdle': 0,
'timeToIdleOutside': 0, 'timeToIdleOutside': 0,
'history': false, 'history': false,
@ -414,7 +409,7 @@
item.w = item.img.width; item.w = item.img.width;
item.h = item.img.height; item.h = item.img.height;
oPs.updateSize(); oPs.updateSize(true);
} }
}); });
@ -434,13 +429,13 @@
// setup maito protocol // setup maito protocol
return !(!!oEvent && 3 !== oEvent['which'] && Utils.mailToHelper($(this).attr('href'), require('View/Popup/Compose'))); return !(!!oEvent && 3 !== oEvent['which'] && Utils.mailToHelper($(this).attr('href'), require('View/Popup/Compose')));
}) })
.on('click', '.attachmentsPlace .attachmentPreview', function (oEvent) { .on('click', '.attachmentsPlace .attachmentIconParent', function (oEvent) {
if (oEvent && oEvent.stopPropagation) if (oEvent && oEvent.stopPropagation)
{ {
oEvent.stopPropagation(); oEvent.stopPropagation();
} }
}) })
.on('click', '.attachmentsPlace .attachmentItem', function () { .on('click', '.attachmentsPlace .attachmentItem .attachmentNameParent', function () {
var var
oAttachment = ko.dataFor(this) oAttachment = ko.dataFor(this)

View file

@ -95,8 +95,6 @@ cfg.paths.css = {
'vendors/normalize/normalize.css', 'vendors/normalize/normalize.css',
'vendors/fontastic/styles.css', 'vendors/fontastic/styles.css',
'vendors/jquery-nanoscroller/nanoscroller.css', 'vendors/jquery-nanoscroller/nanoscroller.css',
// 'vendors/jquery-magnific-popup/magnific-popup.css',
// 'vendors/jquery-magnific-popup/magnific-popup-animations.css',
'vendors/jquery-letterfx/jquery-letterfx.min.css', 'vendors/jquery-letterfx/jquery-letterfx.min.css',
'vendors/simple-pace/styles.css', 'vendors/simple-pace/styles.css',
'vendors/inputosaurus/inputosaurus.css', 'vendors/inputosaurus/inputosaurus.css',
@ -390,12 +388,6 @@ regOtherMinTask('other:pace', 'vendors/simple-pace/', 'simple-pace.js', 'simple-
regOtherMinTask('other:rl', 'vendors/rl/', 'rl.js', 'rl-1.3.min.js', regOtherMinTask('other:rl', 'vendors/rl/', 'rl.js', 'rl-1.3.min.js',
'/*! RainLoop Index Helper v1.3 (c) 2014 RainLoop Team; Licensed under MIT */\n'); '/*! RainLoop Index Helper v1.3 (c) 2014 RainLoop Team; Licensed under MIT */\n');
gulp.task('package-inc-release', function() {
fs.writeFileSync('package.json',
fs.readFileSync('package.json', 'utf8').replace(/"release":\s?"[\d]+",/, '"release": "' +
(1 + parseInt(pkg.release, 10)) + '",'));
});
gulp.task('fontastic-fonts:clear', function() { gulp.task('fontastic-fonts:clear', function() {
return cleanDir('rainloop/v/' + cfg.devVersion + '/static/css/fonts/rainloop.*'); return cleanDir('rainloop/v/' + cfg.devVersion + '/static/css/fonts/rainloop.*');
}); });
@ -537,8 +529,6 @@ gulp.task('default', ['js:libs', 'js:boot', 'js:openpgp', 'js:min', 'css:main:mi
gulp.task('fast', ['js:app', 'js:admin', 'js:chunks', 'css:main']); gulp.task('fast', ['js:app', 'js:admin', 'js:chunks', 'css:main']);
gulp.task('rainloop', ['js:lint', 'rainloop:copy', 'rainloop:setup', 'rainloop:zip', 'rainloop:md5', 'rainloop:clean']); gulp.task('rainloop', ['js:lint', 'rainloop:copy', 'rainloop:setup', 'rainloop:zip', 'rainloop:md5', 'rainloop:clean']);
gulp.task('rainloop+', ['rainloop', 'package-inc-release']);
gulp.task('owncloud', ['rainloop:owncloud:copy', 'rainloop:owncloud:setup', 'rainloop:owncloud:zip', 'rainloop:owncloud:md5', 'rainloop:owncloud:clean']); gulp.task('owncloud', ['rainloop:owncloud:copy', 'rainloop:owncloud:setup', 'rainloop:owncloud:zip', 'rainloop:owncloud:md5', 'rainloop:owncloud:clean']);
//WATCH //WATCH
@ -547,16 +537,13 @@ gulp.task('watch', ['fast'], function() {
gulp.watch(cfg.paths.less.main.watch, {interval: 500}, ['css:main']); gulp.watch(cfg.paths.less.main.watch, {interval: 500}, ['css:main']);
}); });
// aliases // ALIASES
gulp.task('w', ['watch']); gulp.task('w', ['watch']);
gulp.task('f', ['fast']); gulp.task('f', ['fast']);
gulp.task('rl', ['rainloop']); gulp.task('rl', ['rainloop']);
gulp.task('rl+', ['rainloop+']);
gulp.task('build', ['rainloop']); gulp.task('build', ['rainloop']);
gulp.task('build+', ['rainloop+']);
gulp.task('b', ['build']); gulp.task('b', ['build']);
gulp.task('b+', ['build+']);
gulp.task('own', ['owncloud']); gulp.task('own', ['owncloud']);
gulp.task('js:hint', ['js:lint']); gulp.task('js:hint', ['js:lint']);

View file

@ -7,9 +7,9 @@ if (!defined('APP_VERSION'))
define('APP_INDEX_ROOT_PATH', str_replace('\\', '/', rtrim(dirname(__FILE__), '\\/').'/')); define('APP_INDEX_ROOT_PATH', str_replace('\\', '/', rtrim(dirname(__FILE__), '\\/').'/'));
} }
if (file_exists(APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/index.php')) if (file_exists(APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/include.php'))
{ {
include APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/index.php'; include APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/include.php';
} }
else else
{ {

View file

@ -2,7 +2,7 @@
"name": "RainLoop", "name": "RainLoop",
"title": "RainLoop Webmail", "title": "RainLoop Webmail",
"version": "1.7.2", "version": "1.7.2",
"release": "220", "release": "224",
"description": "Simple, modern & fast web-based email client", "description": "Simple, modern & fast web-based email client",
"homepage": "http://rainloop.net", "homepage": "http://rainloop.net",
"main": "gulpfile.js", "main": "gulpfile.js",

View file

@ -882,7 +882,6 @@ class Utils
'p7c' => 'application/pkcs7-mime', 'p7c' => 'application/pkcs7-mime',
'p7m' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime',
'p7s' => 'application/pkcs7-signature', 'p7s' => 'application/pkcs7-signature',
'ttf' => 'application/x-ttf',
'torrent' => 'application/x-bittorrent', 'torrent' => 'application/x-bittorrent',
// scripts // scripts
@ -963,7 +962,6 @@ class Utils
'flv' => 'video/x-flv', 'flv' => 'video/x-flv',
'qt' => 'video/quicktime', 'qt' => 'video/quicktime',
'mov' => 'video/quicktime', 'mov' => 'video/quicktime',
'wmv' => 'video/windows-media',
'avi' => 'video/x-msvideo', 'avi' => 'video/x-msvideo',
'mpg' => 'video/mpeg', 'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg', 'mpeg' => 'video/mpeg',
@ -976,6 +974,7 @@ class Utils
'h263' => 'video/h263', 'h263' => 'video/h263',
'h264' => 'video/h264', 'h264' => 'video/h264',
'jpgv' => 'video/jpgv', 'jpgv' => 'video/jpgv',
'mp4' => 'video/mp4',
'mp4v' => 'video/mp4', 'mp4v' => 'video/mp4',
'mpg4' => 'video/mp4', 'mpg4' => 'video/mp4',
'ogv' => 'video/ogg', 'ogv' => 'video/ogg',

View file

@ -2067,7 +2067,7 @@ class Actions
} }
return $this->TrueResponse(__FUNCTION__); return $this->TrueResponse(__FUNCTION__);
return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Save($aFilters)); // return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Save($aFilters));
} }
/** /**
@ -2539,6 +2539,9 @@ class Actions
case \RainLoop\Enumerations\Capa::GRAVATAR: case \RainLoop\Enumerations\Capa::GRAVATAR:
$this->setConfigFromParams($oConfig, $sParamName, 'labs', 'allow_gravatar', 'bool'); $this->setConfigFromParams($oConfig, $sParamName, 'labs', 'allow_gravatar', 'bool');
break; break;
case \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS:
$this->setConfigFromParams($oConfig, $sParamName, 'interface', 'show_attachment_thumbnail', 'bool');
break;
case \RainLoop\Enumerations\Capa::THEMES: case \RainLoop\Enumerations\Capa::THEMES:
$this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_themes', 'bool'); $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_themes', 'bool');
break; break;
@ -2636,6 +2639,7 @@ class Actions
$this->setCapaFromParams($oConfig, 'CapaGravatar', \RainLoop\Enumerations\Capa::GRAVATAR); $this->setCapaFromParams($oConfig, 'CapaGravatar', \RainLoop\Enumerations\Capa::GRAVATAR);
$this->setCapaFromParams($oConfig, 'CapaThemes', \RainLoop\Enumerations\Capa::THEMES); $this->setCapaFromParams($oConfig, 'CapaThemes', \RainLoop\Enumerations\Capa::THEMES);
$this->setCapaFromParams($oConfig, 'CapaUserBackground', \RainLoop\Enumerations\Capa::USER_BACKGROUND); $this->setCapaFromParams($oConfig, 'CapaUserBackground', \RainLoop\Enumerations\Capa::USER_BACKGROUND);
$this->setCapaFromParams($oConfig, 'CapaAttachmentThumbnails', \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS);
$this->setConfigFromParams($oConfig, 'DetermineUserLanguage', 'login', 'determine_user_language', 'bool'); $this->setConfigFromParams($oConfig, 'DetermineUserLanguage', 'login', 'determine_user_language', 'bool');
$this->setConfigFromParams($oConfig, 'DetermineUserDomain', 'login', 'determine_user_domain', 'bool'); $this->setConfigFromParams($oConfig, 'DetermineUserDomain', 'login', 'determine_user_domain', 'bool');
@ -3538,6 +3542,19 @@ class Actions
\is_file(APP_INDEX_ROOT_PATH.'rainloop/v/'.$sNewVersion.'/index.php')) \is_file(APP_INDEX_ROOT_PATH.'rainloop/v/'.$sNewVersion.'/index.php'))
{ {
$bResult = \copy($sTmpFolder.'/index.php', APP_INDEX_ROOT_PATH.'index.php'); $bResult = \copy($sTmpFolder.'/index.php', APP_INDEX_ROOT_PATH.'index.php');
if ($bResult)
{
if (\MailSo\Base\Utils::FunctionExistsAndEnabled('opcache_invalidate'))
{
@\opcache_invalidate(APP_INDEX_ROOT_PATH.'index.php', true);
}
if (\MailSo\Base\Utils::FunctionExistsAndEnabled('apc_delete_file'))
{
@\apc_delete_file(APP_INDEX_ROOT_PATH.'index.php');
}
}
} }
else else
{ {
@ -3577,6 +3594,7 @@ class Actions
$aDirs = @\array_map('basename', @\array_filter(@\glob($sVPath.'*'), 'is_dir')); $aDirs = @\array_map('basename', @\array_filter(@\glob($sVPath.'*'), 'is_dir'));
$this->Logger()->Write('Versions GC: Count:'.(\is_array($aDirs) ? \count($aDirs) : 0)); $this->Logger()->Write('Versions GC: Count:'.(\is_array($aDirs) ? \count($aDirs) : 0));
if (\is_array($aDirs) && 5 < \count($aDirs)) if (\is_array($aDirs) && 5 < \count($aDirs))
{ {
\uasort($aDirs, 'version_compare'); \uasort($aDirs, 'version_compare');
@ -6945,6 +6963,11 @@ class Actions
$aResult[] = \RainLoop\Enumerations\Capa::GRAVATAR; $aResult[] = \RainLoop\Enumerations\Capa::GRAVATAR;
} }
if ($oConfig->Get('interface', 'show_attachment_thumbnail', true))
{
$aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS;
}
if ($oConfig->Get('labs', 'allow_prefetch', false)) if ($oConfig->Get('labs', 'allow_prefetch', false))
{ {
$aResult[] = \RainLoop\Enumerations\Capa::PREFETCH; $aResult[] = \RainLoop\Enumerations\Capa::PREFETCH;
@ -8017,6 +8040,7 @@ class Actions
$bHook = true; $bHook = true;
$sClassName = \get_class($mResponse); $sClassName = \get_class($mResponse);
$bHasSimpleJsonFunc = \method_exists($mResponse, 'ToSimpleJSON'); $bHasSimpleJsonFunc = \method_exists($mResponse, 'ToSimpleJSON');
$bThumb = $this->GetCapa(false, \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS);
if ($bHasSimpleJsonFunc) if ($bHasSimpleJsonFunc)
{ {
@ -8278,7 +8302,7 @@ class Actions
'CID' => $mResponse->Cid(), 'CID' => $mResponse->Cid(),
'ContentLocation' => $mResponse->ContentLocation(), 'ContentLocation' => $mResponse->ContentLocation(),
'IsInline' => $mResponse->IsInline(), 'IsInline' => $mResponse->IsInline(),
'IsThumbnail' => !!$this->Config()->Get('interface', 'show_attachment_thumbnail', true), 'IsThumbnail' => $bThumb,
'IsLinked' => ($mFoundedCIDs && \in_array(\trim(\trim($mResponse->Cid()), '<>'), $mFoundedCIDs)) || 'IsLinked' => ($mFoundedCIDs && \in_array(\trim(\trim($mResponse->Cid()), '<>'), $mFoundedCIDs)) ||
($mFoundedContentLocationUrls && \in_array(\trim($mResponse->ContentLocation()), $mFoundedContentLocationUrls)) ($mFoundedContentLocationUrls && \in_array(\trim($mResponse->ContentLocation()), $mFoundedContentLocationUrls))
)); ));
@ -8300,8 +8324,6 @@ class Actions
'FileName' => $mResult['FileName'], 'FileName' => $mResult['FileName'],
'Framed' => $mResult['Framed'] 'Framed' => $mResult['Framed']
)); ));
$this->Logger()->WriteDump($mResult);
} }
else if ('MailSo\Mail\Folder' === $sClassName) else if ('MailSo\Mail\Folder' === $sClassName)
{ {

View file

@ -192,7 +192,7 @@ abstract class AbstractConfig
return true; return true;
} }
$aData = @\parse_ini_file($this->sFile, true); $aData = \RainLoop\Utils::CustomParseIniFile($this->sFile, true);
if (\is_array($aData) && 0 < count($aData)) if (\is_array($aData) && 0 < count($aData))
{ {
foreach ($aData as $sSectionKey => $aSectionValue) foreach ($aData as $sSectionKey => $aSectionValue)

View file

@ -12,6 +12,7 @@ class Capa
const THEMES = 'THEMES'; const THEMES = 'THEMES';
const USER_BACKGROUND = 'USER_BACKGROUND'; const USER_BACKGROUND = 'USER_BACKGROUND';
const SIEVE = 'SIEVE'; const SIEVE = 'SIEVE';
const ATTACHMENT_THUMBNAILS = 'ATTACHMENT_THUMBNAILS';
const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS'; const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS';
const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES'; const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES';
} }

View file

@ -166,7 +166,7 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
if (\file_exists($this->sDomainPath.'/'.$sRealFileName.'.ini') && if (\file_exists($this->sDomainPath.'/'.$sRealFileName.'.ini') &&
(!$bCheckDisabled || 0 === \strlen($sDisabled) || false === \strpos(','.$sDisabled.',', ','.\MailSo\Base\Utils::IdnToAscii($sName, true).','))) (!$bCheckDisabled || 0 === \strlen($sDisabled) || false === \strpos(','.$sDisabled.',', ','.\MailSo\Base\Utils::IdnToAscii($sName, true).',')))
{ {
$aDomain = @\parse_ini_file($this->sDomainPath.'/'.$sRealFileName.'.ini'); $aDomain = \RainLoop\Utils::CustomParseIniFile($this->sDomainPath.'/'.$sRealFileName.'.ini');
// fix misspellings (#119) // fix misspellings (#119)
if (\is_array($aDomain)) if (\is_array($aDomain))
{ {

View file

@ -149,16 +149,16 @@ class Utils
} }
/** /**
* @param string $FileName * @param string $sFileName
* @param array $aResultLang * @param array $aResultLang
* *
* @return void * @return void
*/ */
public static function ReadAndAddLang($FileName, &$aResultLang) public static function ReadAndAddLang($sFileName, &$aResultLang)
{ {
if (\file_exists($FileName)) if (\file_exists($sFileName))
{ {
$aLang = @\parse_ini_file($FileName, true); $aLang = \RainLoop\Utils::CustomParseIniFile($sFileName, true);
if (\is_array($aLang)) if (\is_array($aLang))
{ {
foreach ($aLang as $sKey => $mValue) foreach ($aLang as $sKey => $mValue)
@ -307,6 +307,23 @@ class Utils
@\setcookie($sName, '', \time() - 3600 * 24 * 30, '/'); @\setcookie($sName, '', \time() - 3600 * 24 * 30, '/');
} }
/**
* @param string $sFileName
* @param bool $bProcessSections = false
*
* @return array
*/
public static function CustomParseIniFile($sFileName, $bProcessSections = false)
{
if (\MailSo\Base\Utils::FunctionExistsAndEnabled('parse_ini_file'))
{
return @\parse_ini_file($sFileName, !!$bProcessSections);
}
$sData = @\file_get_contents($sFileName);
return \is_string($sData) ? @\parse_ini_string($sData, !!$bProcessSections) : null;
}
public static function CustomBaseConvert($sNumberInput, $sFromBaseInput = '0123456789', $sToBaseInput = '0123456789') public static function CustomBaseConvert($sNumberInput, $sFromBaseInput = '0123456789', $sToBaseInput = '0123456789')
{ {
if ($sFromBaseInput === $sToBaseInput) if ($sFromBaseInput === $sToBaseInput)

View file

@ -76,6 +76,14 @@
</div> </div>
<div class="control-group"> <div class="control-group">
<div class="controls"> <div class="controls">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'Show thumbnails (attachments)',
value: capaAttachmentThumbnails,
inline: false
}
}"></div>
<div data-bind="component: { <div data-bind="component: {
name: 'Checkbox', name: 'Checkbox',
params: { params: {

View file

@ -1,8 +1,18 @@
<div class="b-attacment"> <li class="attachmentItem clearfix" data-tooltip-placement="bottom" data-bind="attr: { 'title': title }, css: {'waiting': waiting, 'error': '' !== error()}">
<label data-bind="click: function () { enabled(!enabled()); }"> <div class="attachmentIconParent pull-left">
<i class="checkboxAttachment" data-bind="css: enabled() ? 'checkboxMessage icon-checkbox-checked' : 'checkboxMessage icon-checkbox-unchecked'"></i> <div class="iconMain">
&nbsp;&nbsp; <i class="attachmentIcon attachmentMainIcon" data-bind="css: iconClass(), visible: !uploading() || 0 === progress()"></i>
<span class="name" data-bind="text: fileName"></span> </div>
(<span class="size" data-bind="text: friendlySize"></span>) <div class="iconProgress" data-bind="attr: { 'style': progressStyle }, visible: uploading"></div>
</label> <div class="iconBG" data-bind="text: progressText, visible: uploading"></div>
</div> </div>
<div class="attachmentNameParent">
<button type="button" class="close pull-right" style="margin-top:-4px;" data-bind="click: cancel">×</button>
<div style="white-space: nowrap; text-overflow: ellipsis; overflow: hidden;">
<span class="attachmentName" data-bind="text: fileName"></span>&nbsp;
</div>
<div>
<span class="attachmentSize" data-bind="text: friendlySize"></span>&nbsp;
</div>
</div>
</li>

View file

@ -1,13 +0,0 @@
<div class="b-attacment-in-process" data-bind="css: {'error': '' !== error(), 'uploading': uploading, 'waiting': waiting }, in18nInit: true">
<a class="close" data-bind="click: cancel">&times;</a>
<span class="uploading"><i class="icon-spinner animated"></i></span>
<span class="namedStr">
<span class="name" data-bind="text: fileName"></span>
&nbsp;&nbsp;
(<span class="size" data-bind="text: friendlySize"></span>)
<span class="upload-progress" data-bind="text: progress"></span>
</span>
<div class="error">
<span data-bind="text: error"></span>
</div>
</div>

View file

@ -1,10 +1,10 @@
<!-- ko template: { name: 'PhotoSwipe' } --><!-- /ko --> <!-- ko template: { name: 'PhotoSwipe' } --><!-- /ko -->
<div id="rl-sub-right"> <div id="rl-sub-right">
<div class="messageView" data-bind="css: {'message-selected': isMessageSelected, 'message-focused': message.focused}"> <div class="messageView" data-bind="css: {'message-selected': isMessageSelected, 'message-focused': message.focused}">
<div class="toolbar g-ui-user-select-none"> <div class="toolbar top-toolbar g-ui-user-select-none" data-bind="visible: !usePreviewPane()">
<nobr> <nobr>
<div class="messageButtons btn-toolbar"> <div class="messageButtons btn-toolbar">
<div class="btn-group" data-tooltip-placement="bottom" data-bind="visible: !usePreviewPane(), tooltip: 'MESSAGE/BUTTON_CLOSE'"> <div class="btn-group" data-tooltip-placement="bottom" data-bind="tooltip: 'MESSAGE/BUTTON_CLOSE'">
<a class="btn btn-dark-disabled-border buttonClose" data-bind="command: closeMessage"> <a class="btn btn-dark-disabled-border buttonClose" data-bind="command: closeMessage">
<i class="icon-remove"></i> <i class="icon-remove"></i>
</a> </a>
@ -42,7 +42,7 @@
</div> </div>
</nobr> </nobr>
</div> </div>
<div class="b-content thm-message-view-background-color"> <div class="b-content b-message-view-wrapper thm-message-view-background-color">
<div> <div>
<div class="b-message-view-checked-helper" data-bind="visible: !message() && '' === messageError() && hasCheckedMessages()"> <div class="b-message-view-checked-helper" data-bind="visible: !message() && '' === messageError() && hasCheckedMessages()">
<span data-bind="text: printableCheckedMessageCount()"></span> <span data-bind="text: printableCheckedMessageCount()"></span>
@ -57,7 +57,8 @@
<div data-bind="visible: message"> <div data-bind="visible: message">
<div class="btn-group colored-toggle pull-right messageItemDropdown"> <div class="message-fixed-button-toolbar clearfix">
<div class="btn-group colored-toggle pull-right">
<a class="btn btn-dark-disabled-border buttonReply" data-tooltip-placement="bottom" <a class="btn btn-dark-disabled-border buttonReply" data-tooltip-placement="bottom"
data-bind="command: replyCommand, tooltip: 'MESSAGE/BUTTON_REPLY'"> data-bind="command: replyCommand, tooltip: 'MESSAGE/BUTTON_REPLY'">
<i class="icon-reply"></i> <i class="icon-reply"></i>
@ -176,6 +177,12 @@
</li> </li>
</ul> </ul>
</div> </div>
<div class="btn-group pull-right" data-bind="visible: isDraftFolder()" style="margin-right: 5px">
<a class="btn btn-success buttonEdit" data-bind="command: messageEditCommand">
<i class="icon-pencil icon-white"></i>
</a>
</div>
</div>
<div class="messageItem" data-bind="css: viewLineAsCcc(), nano: true"> <div class="messageItem" data-bind="css: viewLineAsCcc(), nano: true">
<div class="content g-scrollbox" tabindex="0" data-bind="hasfocus: messageDomFocused"> <div class="content g-scrollbox" tabindex="0" data-bind="hasfocus: messageDomFocused">
@ -295,7 +302,8 @@
</div> </div>
<div class="attachmentsPlace" data-bind="visible: message() && message().hasVisibleAttachments()"> <div class="attachmentsPlace" data-bind="visible: message() && message().hasVisibleAttachments()">
<ul class="attachmentList" data-bind="foreach: message() ? message().attachments() : []"> <ul class="attachmentList" data-bind="foreach: message() ? message().attachments() : []">
<li class="attachmentItem clearfix" draggable="true" data-bind="visible: !isLinked, title: fileName, event: { 'dragstart': eventDragStart }"> <li class="attachmentItem clearfix" draggable="true" data-tooltip-placement="bottom"
data-bind="visible: !isLinked, event: { 'dragstart': eventDragStart }, attr: { 'title': fileName }">
<div class="attachmentIconParent pull-left" data-bind="css: { 'hasPreview': hasPreview() }"> <div class="attachmentIconParent pull-left" data-bind="css: { 'hasPreview': hasPreview() }">
<div class="hidePreview"> <div class="hidePreview">
<div class="iconMain"> <div class="iconMain">
@ -303,7 +311,7 @@
</div> </div>
</div> </div>
<div class="showPreview"> <div class="showPreview">
<a data-bind="css: {'attachmentImagePreview': isImage()}, attr: {'href': linkPreviewMain(), title: fileName, 'data-index': $index}"> <a data-bind="css: {'attachmentImagePreview': isImage()}, attr: {'href': linkPreviewMain(), 'data-index': $index}" target="_blank">
<div class="iconMain"> <div class="iconMain">
<i class="attachmentIcon attachmentMainIcon" data-bind="css: iconClass()"></i> <i class="attachmentIcon attachmentMainIcon" data-bind="css: iconClass()"></i>
</div> </div>

View file

@ -26,7 +26,7 @@
<div> <div>
<div class="b-header g-ui-user-select-none"> <div class="b-header g-ui-user-select-none">
<div class="g-ui-table"> <div class="g-ui-table">
<div class="e-row"> <div class="e-row" style="height: 40px;">
<div class="e-cell e-label"> <div class="e-cell e-label">
<label class="control-label"> <label class="control-label">
<span class="i18n" data-i18n-text="COMPOSE/TITLE_FROM"></span> <span class="i18n" data-i18n-text="COMPOSE/TITLE_FROM"></span>
@ -50,7 +50,7 @@
</ul> </ul>
<!-- /ko --> <!-- /ko -->
</div> </div>
<div class="btn-group dropdown colored-toggle pull-right"> <div class="btn-group dropdown colored-toggle pull-right" style="margin-right: 4px;">
<a class="btn dropdown-toggle buttonMore" data-toggle="dropdown"> <a class="btn dropdown-toggle buttonMore" data-toggle="dropdown">
<i class="icon-list"></i> <i class="icon-list"></i>
</a> </a>
@ -139,18 +139,33 @@
<div class="e-row"> <div class="e-row">
<div class="e-cell e-label"></div> <div class="e-cell e-label"></div>
<div class="e-cell e-value"> <div class="e-cell e-value">
<div class="b-appachments pull-left" data-bind="visible: 0 < attachments().length">
<div data-bind="template: { name: 'ComposeAttachment', foreach: attachmentsInReady }"></div>
<div data-bind="template: { name: 'ComposeAttachmentInProcess', foreach: attachmentsInProcess }"></div>
<span class="help-block error-desc" data-bind="visible: attachmentsInProcessError">
<span class="i18n" data-i18n-text="COMPOSE/ATTACHMENTS_UPLOAD_ERROR_DESC"></span>
</span>
</div>
<div> <div>
<div class="b-attachment-place" data-bind="visible: addAttachmentEnabled() && dragAndDropEnabled() && dragAndDropVisible(), initDom: composeUploaderDropPlace, css: {'dragAndDropOver': dragAndDropOver}"> <div class="b-attachment-place" data-bind="visible: addAttachmentEnabled() && dragAndDropEnabled() && dragAndDropVisible(), initDom: composeUploaderDropPlace, css: {'dragAndDropOver': dragAndDropOver}">
<span class="i18n" data-i18n-text="COMPOSE/ATTACH_DROP_FILES_DESC"></span> <span class="i18n" data-i18n-text="COMPOSE/ATTACH_DROP_FILES_DESC"></span>
</div> </div>
<div class="pull-right"> <div class="pull-left">
<div class="btn-group" data-toggle="buttons-radio">
<button type="button" class="btn" data-bind="click: function () { attachmentsPlace(false); },
css: { 'active': !attachmentsPlace() }">
<i class="icon-file-text"></i>
</button>
<button type="button" class="btn" data-bind="click: function () { attachmentsPlace(true); },
css: { 'btn-danger': 0 < attachmentsInErrorCount(), 'active': attachmentsPlace() }">
<span data-bind="visible: 0 < attachmentsCount()">
<b data-bind="text: attachmentsCount"></b>
&nbsp;&nbsp;
</span>
<i data-bind="css: { 'icon-attachment': 0 === attachmentsInProcessCount(), 'icon-spinner animated': 0 < attachmentsInProcessCount(), 'icon-white': 0 < attachmentsInErrorCount() }"></i>
</button>
</div>
<span class="help-block error-desc" data-bind="visible: attachmentsInProcessError">
<span class="i18n" data-i18n-text="COMPOSE/ATTACHMENTS_UPLOAD_ERROR_DESC"></span>
</span>
<span class="help-block error-desc" data-bind="visible: !attachmentsInProcessError() && attachmentsInErrorError()">
<span class="i18n" data-i18n-text="COMPOSE/ATTACHMENTS_ERROR_DESC"></span>
</span>
</div>
<div class="pull-right" style="margin-right: 4px;">
<div class="btn-group pull-right"> <div class="btn-group pull-right">
<a class="btn" data-tooltip-placement="top" data-bind="visible: addAttachmentEnabled(), initDom: composeUploaderButton, tooltip: 'COMPOSE/ATTACH_FILES'"> <a class="btn" data-tooltip-placement="top" data-bind="visible: addAttachmentEnabled(), initDom: composeUploaderButton, tooltip: 'COMPOSE/ATTACH_FILES'">
<i class="icon-attachment"></i> <i class="icon-attachment"></i>
@ -169,8 +184,19 @@
</div> </div>
</div> </div>
<div class="attachmentAreaParent b-content" style="height: 200px; min-height: 200px" data-bind="nano: true, visible: attachmentsPlace, initResizeTrigger: [resizer(), 200, 47]">
<div class="content g-scrollbox">
<div class="content-wrapper">
<ul class="attachmentList" data-bind="template: { name: 'ComposeAttachment', foreach: attachments }"></ul>
<div class="no-attachments-desc" data-bind="visible: 0 === attachments().length">
<span class="i18n" data-i18n-text="COMPOSE/NO_ATTACHMENTS_HERE_DESC"></span>
</div>
</div>
</div>
</div>
<div class="textAreaParent" style="height: 200px; min-height: 200px" <div class="textAreaParent" style="height: 200px; min-height: 200px"
data-bind="initDom: composeEditorArea, initResizeTrigger: [resizer(), 200, 30]"></div> data-bind="visible: !attachmentsPlace(), initDom: composeEditorArea, initResizeTrigger: [resizer(), 200, 30]"></div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -38,6 +38,23 @@
}"></div> }"></div>
</div> </div>
</div> </div>
<div class="control-group">
<label class="control-label" style="padding-top: 0;">
<span class="i18n" data-i18n-text="SETTINGS_GENERAL/LABEL_LAYOUT"></span>
</label>
<div class="controls">
<div data-bind="component: {
name: 'Select',
params: {
options: layoutTypes,
value: layout,
trigger: layoutTrigger,
optionsText: 'name',
optionsValue: 'id'
}
}"></div>
</div>
</div>
</div> </div>
<div class="form-horizontal"> <div class="form-horizontal">
<div class="legend"> <div class="legend">
@ -74,13 +91,6 @@
value: useCheckboxesInList value: useCheckboxesInList
} }
}"></div> }"></div>
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'SETTINGS_GENERAL/LABEL_USE_PREVIEW_PANE',
value: usePreviewPaneCheckbox
}
}"></div>
<div data-bind="visible: threading, component: { <div data-bind="visible: threading, component: {
name: 'Checkbox', name: 'Checkbox',
params: { params: {

View file

@ -1,11 +1,9 @@
<div class="b-system-drop-down g-ui-user-select-none"> <div class="b-system-drop-down g-ui-user-select-none">
<div class="b-toolbar"> <div class="b-toolbar">
<div class="btn-toolbar"> <div class="btn-toolbar">
<div class="accountPlace" data-bind="text: emailTitle()"></div>
<div class="btn-group pull-right dropdown colored-toggle" data-bind="registrateBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger"> <div class="btn-group pull-right dropdown colored-toggle" data-bind="registrateBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger">
<a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown" <a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown" data-toggle="dropdown">
data-toggle="dropdown" data-tooltip-placement="left" data-tooltip-i18n="off"
data-tooltip-class="tooltip-big" data-bind="tooltip: emailTitle">
<i data-bind="css: {'icon-user': !loading(), 'icon-spinner animated': loading()}"></i> <i data-bind="css: {'icon-user': !loading(), 'icon-spinner animated': loading()}"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="caret"></span> <span class="caret"></span>

View file

@ -0,0 +1,212 @@
<?php
if (defined('APP_VERSION'))
{
if (!defined('APP_START'))
{
define('APP_START', microtime(true));
@ini_set('register_globals', 0);
@ini_set('zend.ze1_compatibility_mode', 0);
@ini_set('magic_quotes_gpc', 0);
@ini_set('magic_quotes_runtime', 0);
define('APP_DEFAULT_DENY_ALL_HTACCESS', 'Deny from all
<IfModule mod_autoindex.c>
Options -Indexes
</ifModule>');
define('APP_START_TIME', time());
define('APP_REQUEST_RND', md5(APP_START.rand(10000, 99999).APP_START));
define('APP_VERSION_ROOT_PATH', APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/');
define('APP_USE_APC_CACHE', true);
$sCustomDataPath = '';
if (file_exists(APP_INDEX_ROOT_PATH.'include.php'))
{
include_once APP_INDEX_ROOT_PATH.'include.php';
$sCustomDataPath = function_exists('__get_custom_data_full_path') ? rtrim(trim(__get_custom_data_full_path()), '\\/') : '';
}
define('APP_DATA_FOLDER_PATH', 0 === strlen($sCustomDataPath) ? APP_INDEX_ROOT_PATH.'data/' : $sCustomDataPath.'/');
unset($sCustomDataPath);
if (function_exists('date_default_timezone_set'))
{
date_default_timezone_set('UTC');
}
$sSite = strtolower(trim(empty($_SERVER['HTTP_HOST']) ? (empty($_SERVER['SERVER_NAME']) ? '' : $_SERVER['SERVER_NAME']) : $_SERVER['HTTP_HOST']));
$sSite = 'www.' === substr($sSite, 0, 4) ? substr($sSite, 4) : $sSite;
$sSite = preg_replace('/^.+@/', '', preg_replace('/:[\d]+$/', '', $sSite));
$sSite = in_array($sSite, array('localhost', '127.0.0.1', '::1', '::1/128', '0:0:0:0:0:0:0:1')) ? 'localhost' : $sSite;
define('APP_SITE', $sSite);
define('APP_SITE_CLEAR', 0 < strlen(APP_SITE) ? trim(preg_replace('/[^a-zA-Z0-9_.\-]+/', '_', trim(strtolower(APP_SITE))), ' _') : '');
define('APP_DEFAULT_PRIVATE_DATA_NAME', '_default_');
$sPrivateDataFolderInternalName = @file_exists(APP_INDEX_ROOT_PATH.'MULTIPLY') ? APP_SITE : '';
define('APP_PRIVATE_DATA_NAME', 0 === strlen($sPrivateDataFolderInternalName) ? APP_DEFAULT_PRIVATE_DATA_NAME : $sPrivateDataFolderInternalName);
define('APP_MULTIPLY', 0 < strlen($sPrivateDataFolderInternalName) && APP_DEFAULT_PRIVATE_DATA_NAME !== APP_PRIVATE_DATA_NAME);
define('APP_DUMMY', '********');
define('APP_DEV_VERSION', '0.0.0');
define('APP_API_PATH', 'http://api.rainloop.net/');
define('APP_REP_PATH', 'http://repository.rainloop.net/v1/');
define('APP_REPO_CORE_FILE', 'http://repository.rainloop.net/v2/core.{{channel}}.json');
define('APP_WEB_PATH', 'rainloop/v/'.APP_VERSION.'/');
define('APP_WEB_STATIC_PATH', APP_WEB_PATH.'static/');
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');
$sInstalled = @file_get_contents(APP_DATA_FOLDER_PATH.'INSTALLED');
// installation checking data folder
if (APP_VERSION !== $sInstalled)
{
include APP_VERSION_ROOT_PATH.'check.php';
$sCheckName = 'delete_if_you_see_it_after_install';
$sCheckFolder = APP_DATA_FOLDER_PATH.$sCheckName;
$sCheckFilePath = APP_DATA_FOLDER_PATH.$sCheckName.'/'.$sCheckName.'.file';
@unlink($sCheckFilePath);
@rmdir($sCheckFolder);
if (!@is_dir(APP_DATA_FOLDER_PATH))
{
@mkdir(APP_DATA_FOLDER_PATH, 0755);
}
else
{
@chmod(APP_DATA_FOLDER_PATH, 0755);
}
$sTest = '';
switch (true)
{
case !@is_dir(APP_DATA_FOLDER_PATH):
$sTest = 'is_dir';
break;
case !@is_readable(APP_DATA_FOLDER_PATH):
$sTest = 'is_readable';
break;
case !@is_writable(APP_DATA_FOLDER_PATH):
$sTest = 'is_writable';
break;
case !@mkdir($sCheckFolder, 0755):
$sTest = 'mkdir';
break;
case false === @file_put_contents($sCheckFilePath, time()):
$sTest = 'file_put_contents';
break;
case !@unlink($sCheckFilePath):
$sTest = 'unlink';
break;
case !@rmdir($sCheckFolder):
$sTest = 'rmdir';
break;
}
if (!empty($sTest))
{
echo '[202] Data folder permisions error ['.$sTest.']';
exit(202);
}
unset($sCheckName, $sCheckFilePath, $sCheckFolder, $sTest);
}
if (false === $sSalt || false === $sData)
{
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));
@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);
}
}
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_PLUGINS_PATH', APP_PRIVATE_DATA.'plugins/');
if (APP_VERSION !== $sInstalled || (APP_MULTIPLY && !@is_dir(APP_PRIVATE_DATA)))
{
define('APP_INSTALLED_START', true);
define('APP_INSTALLED_VERSION', $sInstalled);
@file_put_contents(APP_DATA_FOLDER_PATH.'INSTALLED', APP_VERSION);
@file_put_contents(APP_DATA_FOLDER_PATH.'index.html', 'Forbidden');
@file_put_contents(APP_DATA_FOLDER_PATH.'index.php', 'Forbidden');
@file_put_contents(APP_DATA_FOLDER_PATH.'.htaccess', APP_DEFAULT_DENY_ALL_HTACCESS);
if (!@is_dir(APP_PRIVATE_DATA))
{
@mkdir(APP_PRIVATE_DATA, 0755, true);
}
foreach (array('logs', 'cache', 'configs', 'plugins', 'storage') as $sName)
{
if (!@is_dir(APP_PRIVATE_DATA.$sName))
{
@mkdir(APP_PRIVATE_DATA.$sName, 0755, true);
}
}
if (!@file_exists(APP_PRIVATE_DATA.'domains/disabled'))
{
if (!@is_dir(APP_PRIVATE_DATA.'domains'))
{
@mkdir(APP_PRIVATE_DATA.'domains', 0755);
}
if (@is_dir(APP_PRIVATE_DATA.'domains'))
{
$sFile = $sNewFile = '';
$aFiles = @glob(APP_VERSION_ROOT_PATH.'app/domains/*');
if (is_array($aFiles) && 0 < \count($aFiles))
{
foreach ($aFiles as $sFile)
{
if (@is_file($sFile))
{
$sNewFile = APP_PRIVATE_DATA.'domains/'.basename($sFile);
if (!@file_exists($sNewFile))
{
@copy($sFile, $sNewFile);
}
}
}
}
unset($aFiles, $sFile, $sNewFile);
}
}
}
unset($sSite, $sSalt, $sData, $sInstalled, $sPrivateDataFolderInternalName);
}
include APP_VERSION_ROOT_PATH.'app/handle.php';
if (defined('RAINLOOP_EXIT_ON_END') && RAINLOOP_EXIT_ON_END)
{
exit(0);
}
}

View file

@ -1,197 +0,0 @@
<?php
if (defined('APP_VERSION'))
{
if (!defined('APP_START'))
{
define('APP_START', microtime(true));
@ini_set('register_globals', 0);
@ini_set('zend.ze1_compatibility_mode', 0);
@ini_set('magic_quotes_gpc', 0);
@ini_set('magic_quotes_runtime', 0);
define('APP_DEFAULT_DENY_ALL_HTACCESS', 'Deny from all
<IfModule mod_autoindex.c>
Options -Indexes
</ifModule>');
define('APP_START_TIME', time());
define('APP_REQUEST_RND', md5(APP_START.rand(10000, 99999).APP_START));
define('APP_VERSION_ROOT_PATH', APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/');
define('APP_USE_APC_CACHE', true);
$sCustomDataPath = '';
if (file_exists(APP_INDEX_ROOT_PATH.'include.php'))
{
include_once APP_INDEX_ROOT_PATH.'include.php';
$sCustomDataPath = function_exists('__get_custom_data_full_path') ? rtrim(trim(__get_custom_data_full_path()), '\\/') : '';
}
define('APP_DATA_FOLDER_PATH', 0 === strlen($sCustomDataPath) ? APP_INDEX_ROOT_PATH.'data/' : $sCustomDataPath.'/');
unset($sCustomDataPath);
if (function_exists('date_default_timezone_set'))
{
date_default_timezone_set('UTC');
}
$sSite = strtolower(trim(empty($_SERVER['HTTP_HOST']) ? (empty($_SERVER['SERVER_NAME']) ? '' : $_SERVER['SERVER_NAME']) : $_SERVER['HTTP_HOST']));
$sSite = 'www.' === substr($sSite, 0, 4) ? substr($sSite, 4) : $sSite;
$sSite = preg_replace('/^.+@/', '', preg_replace('/:[\d]+$/', '', $sSite));
$sSite = in_array($sSite, array('localhost', '127.0.0.1', '::1', '::1/128', '0:0:0:0:0:0:0:1')) ? 'localhost' : $sSite;
define('APP_SITE', $sSite);
define('APP_SITE_CLEAR', 0 < strlen(APP_SITE) ? trim(preg_replace('/[^a-zA-Z0-9_.\-]+/', '_', trim(strtolower(APP_SITE))), ' _') : '');
define('APP_DEFAULT_PRIVATE_DATA_NAME', '_default_');
$sPrivateDataFolderInternalName = @file_exists(APP_INDEX_ROOT_PATH.'MULTIPLY') ? APP_SITE : '';
define('APP_PRIVATE_DATA_NAME', 0 === strlen($sPrivateDataFolderInternalName) ? APP_DEFAULT_PRIVATE_DATA_NAME : $sPrivateDataFolderInternalName);
define('APP_MULTIPLY', 0 < strlen($sPrivateDataFolderInternalName) && APP_DEFAULT_PRIVATE_DATA_NAME !== APP_PRIVATE_DATA_NAME);
define('APP_DUMMY', '********');
define('APP_DEV_VERSION', '0.0.0');
define('APP_API_PATH', 'http://api.rainloop.net/');
define('APP_REP_PATH', 'http://repository.rainloop.net/v1/');
define('APP_REPO_CORE_FILE', 'http://repository.rainloop.net/v2/core.{{channel}}.json');
define('APP_WEB_PATH', 'rainloop/v/'.APP_VERSION.'/');
define('APP_WEB_STATIC_PATH', APP_WEB_PATH.'static/');
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');
$sInstalled = @file_get_contents(APP_DATA_FOLDER_PATH.'INSTALLED');
// installation checking data folder
if (APP_VERSION !== $sInstalled)
{
include APP_VERSION_ROOT_PATH.'check.php';
$sCheckName = 'delete_if_you_see_it_after_install';
$sCheckFolder = APP_DATA_FOLDER_PATH.$sCheckName;
$sCheckFilePath = APP_DATA_FOLDER_PATH.$sCheckName.'/'.$sCheckName.'.file';
@unlink($sCheckFilePath);
@rmdir($sCheckFolder);
if (!@is_dir(APP_DATA_FOLDER_PATH))
{
@mkdir(APP_DATA_FOLDER_PATH, 0755);
}
else
{
@chmod(APP_DATA_FOLDER_PATH, 0755);
}
$sTest = '';
switch (true)
{
case !@is_dir(APP_DATA_FOLDER_PATH):
$sTest = 'is_dir';
break;
case !@is_readable(APP_DATA_FOLDER_PATH):
$sTest = 'is_readable';
break;
case !@is_writable(APP_DATA_FOLDER_PATH):
$sTest = 'is_writable';
break;
case !@mkdir($sCheckFolder, 0755):
$sTest = 'mkdir';
break;
case false === @file_put_contents($sCheckFilePath, time()):
$sTest = 'file_put_contents';
break;
case !@unlink($sCheckFilePath):
$sTest = 'unlink';
break;
case !@rmdir($sCheckFolder):
$sTest = 'rmdir';
break;
}
if (!empty($sTest))
{
echo '[202] Data folder permisions error ['.$sTest.']';
exit(202);
}
unset($sCheckName, $sCheckFilePath, $sCheckFolder, $sTest);
}
if (false === $sSalt || false === $sData)
{
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));
@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);
}
}
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_PLUGINS_PATH', APP_PRIVATE_DATA.'plugins/');
if (APP_VERSION !== $sInstalled || (APP_MULTIPLY && !@is_dir(APP_PRIVATE_DATA)))
{
define('APP_INSTALLED_START', true);
define('APP_INSTALLED_VERSION', $sInstalled);
@file_put_contents(APP_DATA_FOLDER_PATH.'INSTALLED', APP_VERSION);
@file_put_contents(APP_DATA_FOLDER_PATH.'index.html', 'Forbidden');
@file_put_contents(APP_DATA_FOLDER_PATH.'index.php', 'Forbidden');
@file_put_contents(APP_DATA_FOLDER_PATH.'.htaccess', APP_DEFAULT_DENY_ALL_HTACCESS);
if (!@is_dir(APP_PRIVATE_DATA))
{
@mkdir(APP_PRIVATE_DATA, 0755, true);
}
foreach (array('logs', 'cache', 'configs', 'plugins', 'storage') as $sName)
{
if (!@is_dir(APP_PRIVATE_DATA.$sName))
{
@mkdir(APP_PRIVATE_DATA.$sName, 0755, true);
}
}
if (!@file_exists(APP_PRIVATE_DATA.'domains/default.ini'))
{
if (!@is_dir(APP_PRIVATE_DATA.'domains'))
{
@mkdir(APP_PRIVATE_DATA.'domains', 0755);
@copy(APP_VERSION_ROOT_PATH.'app/domains/disabled', APP_PRIVATE_DATA.'domains/disabled');
@copy(APP_VERSION_ROOT_PATH.'app/domains/gmail.com.ini', APP_PRIVATE_DATA.'domains/gmail.com.ini');
@copy(APP_VERSION_ROOT_PATH.'app/domains/yahoo.com.ini', APP_PRIVATE_DATA.'domains/yahoo.com.ini');
@copy(APP_VERSION_ROOT_PATH.'app/domains/outlook.com.ini', APP_PRIVATE_DATA.'domains/outlook.com.ini');
@copy(APP_VERSION_ROOT_PATH.'app/domains/qq.com.ini', APP_PRIVATE_DATA.'domains/qq.com.ini');
}
@copy(APP_VERSION_ROOT_PATH.'app/domains/default.ini.dist', APP_PRIVATE_DATA.'domains/default.ini');
}
}
unset($sSite, $sSalt, $sData, $sInstalled, $sPrivateDataFolderInternalName);
}
include APP_VERSION_ROOT_PATH.'app/handle.php';
if (defined('RAINLOOP_EXIT_ON_END') && RAINLOOP_EXIT_ON_END)
{
exit(0);
}
}

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Изпратено" FORWARD_MESSAGE_TOP_SENT = "Изпратено"
FORWARD_MESSAGE_TOP_SUBJECT = "Заглавие" FORWARD_MESSAGE_TOP_SUBJECT = "Заглавие"
EMPTY_TO_ERROR_DESC = "Моля, изберте поне един получател" EMPTY_TO_ERROR_DESC = "Моля, изберте поне един получател"
NO_ATTACHMENTS_HERE_DESC = "No attachments here."
ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded."
ATTACHMENTS_UPLOAD_ERROR_DESC = "Все още не са качени всички прикрепени файлове" ATTACHMENTS_UPLOAD_ERROR_DESC = "Все още не са качени всички прикрепени файлове"
BUTTON_REQUEST_READ_RECEIPT = "Поискайте разписка за прочитане на съобщението" BUTTON_REQUEST_READ_RECEIPT = "Поискайте разписка за прочитане на съобщението"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Общи" LEGEND_GENERAL = "Общи"
LABEL_LANGUAGE = "Език" LABEL_LANGUAGE = "Език"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Текстов редактор по подразбиране" LABEL_EDITOR = "Текстов редактор по подразбиране"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Обикновен" LABEL_EDITOR_PLAIN = "Обикновен"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Gesendet" FORWARD_MESSAGE_TOP_SENT = "Gesendet"
FORWARD_MESSAGE_TOP_SUBJECT = "Betreff" FORWARD_MESSAGE_TOP_SUBJECT = "Betreff"
EMPTY_TO_ERROR_DESC = "Geben Sie bitte mindestens einen Empfänger an" EMPTY_TO_ERROR_DESC = "Geben Sie bitte mindestens einen Empfänger an"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Empfangsbestätigung anfordern" BUTTON_REQUEST_READ_RECEIPT = "Empfangsbestätigung anfordern"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Wenn Sie keine Codes via Google Authenticator er
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Allgemein" LEGEND_GENERAL = "Allgemein"
LABEL_LANGUAGE = "Sprache" LABEL_LANGUAGE = "Sprache"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Standard-Text-Editor" LABEL_EDITOR = "Standard-Text-Editor"
LABEL_EDITOR_HTML = "HTML" LABEL_EDITOR_HTML = "HTML"
LABEL_EDITOR_PLAIN = "Text" LABEL_EDITOR_PLAIN = "Text"

View file

@ -225,7 +225,9 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Sent" FORWARD_MESSAGE_TOP_SENT = "Sent"
FORWARD_MESSAGE_TOP_SUBJECT = "Subject" FORWARD_MESSAGE_TOP_SUBJECT = "Subject"
EMPTY_TO_ERROR_DESC = "Please specify at least one recipient" EMPTY_TO_ERROR_DESC = "Please specify at least one recipient"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet" 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_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)" BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
@ -409,6 +411,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "General" LEGEND_GENERAL = "General"
LABEL_LANGUAGE = "Language" 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 = "Default text editor"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Plain" LABEL_EDITOR_PLAIN = "Plain"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Enviado" FORWARD_MESSAGE_TOP_SENT = "Enviado"
FORWARD_MESSAGE_TOP_SUBJECT = "Asunto" FORWARD_MESSAGE_TOP_SUBJECT = "Asunto"
EMPTY_TO_ERROR_DESC = "Por favor especifique al menos un destinatario" EMPTY_TO_ERROR_DESC = "Por favor especifique al menos un destinatario"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Solicitar confirmación de lectura" BUTTON_REQUEST_READ_RECEIPT = "Solicitar confirmación de lectura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Si usted no puede recibir los códigos a través
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "General" LEGEND_GENERAL = "General"
LABEL_LANGUAGE = "Idioma" LABEL_LANGUAGE = "Idioma"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Editor de texto predeterminado" LABEL_EDITOR = "Editor de texto predeterminado"
LABEL_EDITOR_HTML = "HTML" LABEL_EDITOR_HTML = "HTML"
LABEL_EDITOR_PLAIN = "Texto plano" LABEL_EDITOR_PLAIN = "Texto plano"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Envoyé" FORWARD_MESSAGE_TOP_SENT = "Envoyé"
FORWARD_MESSAGE_TOP_SUBJECT = "Sujet" FORWARD_MESSAGE_TOP_SUBJECT = "Sujet"
EMPTY_TO_ERROR_DESC = "Merci de spécifier au minimum un destinataire" EMPTY_TO_ERROR_DESC = "Merci de spécifier au minimum un destinataire"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Demander une confirmation de lecture" BUTTON_REQUEST_READ_RECEIPT = "Demander une confirmation de lecture"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Si vous ne pouvez pas recevoir les codes par Goo
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Général" LEGEND_GENERAL = "Général"
LABEL_LANGUAGE = "Langue" LABEL_LANGUAGE = "Langue"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Éditeur de texte par défaut" LABEL_EDITOR = "Éditeur de texte par défaut"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Brut" LABEL_EDITOR_PLAIN = "Brut"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Küldő" FORWARD_MESSAGE_TOP_SENT = "Küldő"
FORWARD_MESSAGE_TOP_SUBJECT = "Tárgy" FORWARD_MESSAGE_TOP_SUBJECT = "Tárgy"
EMPTY_TO_ERROR_DESC = "Please specify at least one recipient" 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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "General" LEGEND_GENERAL = "General"
LABEL_LANGUAGE = "Language" 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 = "Default text editor"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Plain" LABEL_EDITOR_PLAIN = "Plain"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Sent" FORWARD_MESSAGE_TOP_SENT = "Sent"
FORWARD_MESSAGE_TOP_SUBJECT = "Viðfangsefni" FORWARD_MESSAGE_TOP_SUBJECT = "Viðfangsefni"
EMPTY_TO_ERROR_DESC = "Vinsamlegast taktu fram að minnsta kosti einn viðtakanda" EMPTY_TO_ERROR_DESC = "Vinsamlegast taktu fram að minnsta kosti einn viðtakanda"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Almennt" LEGEND_GENERAL = "Almennt"
LABEL_LANGUAGE = "Tungumál" LABEL_LANGUAGE = "Tungumál"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Sjálfgefinn textaritill" LABEL_EDITOR = "Sjálfgefinn textaritill"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Venjulegur" LABEL_EDITOR_PLAIN = "Venjulegur"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Inviato il" FORWARD_MESSAGE_TOP_SENT = "Inviato il"
FORWARD_MESSAGE_TOP_SUBJECT = "Oggetto" FORWARD_MESSAGE_TOP_SUBJECT = "Oggetto"
EMPTY_TO_ERROR_DESC = "Specifica almeno un destinatario" EMPTY_TO_ERROR_DESC = "Specifica almeno un destinatario"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Richiedi conferma di lettura" BUTTON_REQUEST_READ_RECEIPT = "Richiedi conferma di lettura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Se non puoi ricevere codici da Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Generali" LEGEND_GENERAL = "Generali"
LABEL_LANGUAGE = "Lingua" LABEL_LANGUAGE = "Lingua"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Editor di testo di default" LABEL_EDITOR = "Editor di testo di default"
LABEL_EDITOR_HTML = "HTML" LABEL_EDITOR_HTML = "HTML"
LABEL_EDITOR_PLAIN = "Testo semplice" LABEL_EDITOR_PLAIN = "Testo semplice"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Sent" FORWARD_MESSAGE_TOP_SENT = "Sent"
FORWARD_MESSAGE_TOP_SUBJECT = "Subject" FORWARD_MESSAGE_TOP_SUBJECT = "Subject"
EMPTY_TO_ERROR_DESC = "Please specify at least one recipient" 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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "開封確認を要求しますか?" BUTTON_REQUEST_READ_RECEIPT = "開封確認を要求しますか?"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "全般" LEGEND_GENERAL = "全般"
LABEL_LANGUAGE = "言語" LABEL_LANGUAGE = "言語"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "メール形式" LABEL_EDITOR = "メール形式"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "プレーンテキスト" LABEL_EDITOR_PLAIN = "プレーンテキスト"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "참조"
FORWARD_MESSAGE_TOP_SENT = "보냄" FORWARD_MESSAGE_TOP_SENT = "보냄"
FORWARD_MESSAGE_TOP_SUBJECT = "제목" FORWARD_MESSAGE_TOP_SUBJECT = "제목"
EMPTY_TO_ERROR_DESC = "수신인을 한 명 이상 선택하세요" EMPTY_TO_ERROR_DESC = "수신인을 한 명 이상 선택하세요"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -391,6 +393,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "일반" LEGEND_GENERAL = "일반"
LABEL_LANGUAGE = "언어" LABEL_LANGUAGE = "언어"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "기본 본문 편집 도구" LABEL_EDITOR = "기본 본문 편집 도구"
LABEL_EDITOR_HTML = "Html 편집기" LABEL_EDITOR_HTML = "Html 편집기"
LABEL_EDITOR_PLAIN = "텍스트 편집기" LABEL_EDITOR_PLAIN = "텍스트 편집기"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "Kopija CC"
FORWARD_MESSAGE_TOP_SENT = "Išsiųstas" FORWARD_MESSAGE_TOP_SENT = "Išsiųstas"
FORWARD_MESSAGE_TOP_SUBJECT = "Tema" FORWARD_MESSAGE_TOP_SUBJECT = "Tema"
EMPTY_TO_ERROR_DESC = "Prašome nurodyti bent vieną gavėją" EMPTY_TO_ERROR_DESC = "Prašome nurodyti bent vieną gavėją"
NO_ATTACHMENTS_HERE_DESC = "No attachments here."
ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded."
ATTACHMENTS_UPLOAD_ERROR_DESC = "Dar ne visi priedai buvo įkelti" ATTACHMENTS_UPLOAD_ERROR_DESC = "Dar ne visi priedai buvo įkelti"
BUTTON_REQUEST_READ_RECEIPT = "Prašyti pranešti kada bus perskaitytas" BUTTON_REQUEST_READ_RECEIPT = "Prašyti pranešti kada bus perskaitytas"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Jei negaunate kodo per Google autentifikavimo kl
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Pagrindiniai" LEGEND_GENERAL = "Pagrindiniai"
LABEL_LANGUAGE = "Kalba" LABEL_LANGUAGE = "Kalba"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Numatytas teksto redaktorius" LABEL_EDITOR = "Numatytas teksto redaktorius"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Paprastas" LABEL_EDITOR_PLAIN = "Paprastas"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Nosūtīts" FORWARD_MESSAGE_TOP_SENT = "Nosūtīts"
FORWARD_MESSAGE_TOP_SUBJECT = "Tēma" FORWARD_MESSAGE_TOP_SUBJECT = "Tēma"
EMPTY_TO_ERROR_DESC = "Pievienojat vismaz vienu saņēmēju" EMPTY_TO_ERROR_DESC = "Pievienojat vismaz vienu saņēmēju"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Vispārējie" LEGEND_GENERAL = "Vispārējie"
LABEL_LANGUAGE = "Valoda" LABEL_LANGUAGE = "Valoda"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Galvenais teksta editors" LABEL_EDITOR = "Galvenais teksta editors"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Teksts" LABEL_EDITOR_PLAIN = "Teksts"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Verzonden" FORWARD_MESSAGE_TOP_SENT = "Verzonden"
FORWARD_MESSAGE_TOP_SUBJECT = "Onderwerp" FORWARD_MESSAGE_TOP_SUBJECT = "Onderwerp"
EMPTY_TO_ERROR_DESC = "Kies ten minste één ontvanger voordat u het bericht verstuurd" EMPTY_TO_ERROR_DESC = "Kies ten minste één ontvanger voordat u het bericht verstuurd"
NO_ATTACHMENTS_HERE_DESC = "No attachments here."
ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded."
ATTACHMENTS_UPLOAD_ERROR_DESC = "Toevoegen van bijlage(n) is nog niet gereed" ATTACHMENTS_UPLOAD_ERROR_DESC = "Toevoegen van bijlage(n) is nog niet gereed"
BUTTON_REQUEST_READ_RECEIPT = "Leesbevestiging vragen" BUTTON_REQUEST_READ_RECEIPT = "Leesbevestiging vragen"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Als u geen codes ontvangt via de Google Authenti
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Algemeen" LEGEND_GENERAL = "Algemeen"
LABEL_LANGUAGE = "Taal" LABEL_LANGUAGE = "Taal"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Standaard tekst editor" LABEL_EDITOR = "Standaard tekst editor"
LABEL_EDITOR_HTML = "HTML" LABEL_EDITOR_HTML = "HTML"
LABEL_EDITOR_PLAIN = "Platte tekst" LABEL_EDITOR_PLAIN = "Platte tekst"

View file

@ -223,6 +223,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Sendt" FORWARD_MESSAGE_TOP_SENT = "Sendt"
FORWARD_MESSAGE_TOP_SUBJECT = "Emne" FORWARD_MESSAGE_TOP_SUBJECT = "Emne"
EMPTY_TO_ERROR_DESC = "Vennligst oppgi minst én mottaker" 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."
ATTACHMENTS_UPLOAD_ERROR_DESC = "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_REQUEST_READ_RECEIPT = "Be om en lesebekreftelse når meldingen er lest"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -393,6 +395,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Om du ikke mottar koder fra Google Authenticator
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Generelt" LEGEND_GENERAL = "Generelt"
LABEL_LANGUAGE = "Språk" LABEL_LANGUAGE = "Språk"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Standard teksteditor" LABEL_EDITOR = "Standard teksteditor"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Ren tekst" LABEL_EDITOR_PLAIN = "Ren tekst"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Wysłany" FORWARD_MESSAGE_TOP_SENT = "Wysłany"
FORWARD_MESSAGE_TOP_SUBJECT = "Temat" FORWARD_MESSAGE_TOP_SUBJECT = "Temat"
EMPTY_TO_ERROR_DESC = "Wprowadź co najmniej jednego odbiorcę" EMPTY_TO_ERROR_DESC = "Wprowadź co najmniej jednego odbiorcę"
NO_ATTACHMENTS_HERE_DESC = "No attachments here."
ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded."
ATTACHMENTS_UPLOAD_ERROR_DESC = "Nie przesłano jeszcze wszystkich załączników" ATTACHMENTS_UPLOAD_ERROR_DESC = "Nie przesłano jeszcze wszystkich załączników"
BUTTON_REQUEST_READ_RECEIPT = "Żądaj potwierdzenia odbioru" BUTTON_REQUEST_READ_RECEIPT = "Żądaj potwierdzenia odbioru"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -409,6 +411,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Jeżeli nie możesz otrzymać kodu poprzez apika
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Ogólne" LEGEND_GENERAL = "Ogólne"
LABEL_LANGUAGE = "Język" LABEL_LANGUAGE = "Język"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Format wiadomości" LABEL_EDITOR = "Format wiadomości"
LABEL_EDITOR_HTML = "HTML" LABEL_EDITOR_HTML = "HTML"
LABEL_EDITOR_PLAIN = "Zwykły tekst" LABEL_EDITOR_PLAIN = "Zwykły tekst"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Recebida" FORWARD_MESSAGE_TOP_SENT = "Recebida"
FORWARD_MESSAGE_TOP_SUBJECT = "Assunto" FORWARD_MESSAGE_TOP_SUBJECT = "Assunto"
EMPTY_TO_ERROR_DESC = "Por favor, especifique pelo menos um destinatário" EMPTY_TO_ERROR_DESC = "Por favor, especifique pelo menos um destinatário"
NO_ATTACHMENTS_HERE_DESC = "No attachments here."
ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded."
ATTACHMENTS_UPLOAD_ERROR_DESC = "Alguns anexos ainda não foram completamente enviados" ATTACHMENTS_UPLOAD_ERROR_DESC = "Alguns anexos ainda não foram completamente enviados"
BUTTON_REQUEST_READ_RECEIPT = "Pedir recibo de leitura" BUTTON_REQUEST_READ_RECEIPT = "Pedir recibo de leitura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Se você não puder receber os códigos via Goog
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Geral" LEGEND_GENERAL = "Geral"
LABEL_LANGUAGE = "Idioma" LABEL_LANGUAGE = "Idioma"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Editor de texto padrão" LABEL_EDITOR = "Editor de texto padrão"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Texto Simples" LABEL_EDITOR_PLAIN = "Texto Simples"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Enviar" FORWARD_MESSAGE_TOP_SENT = "Enviar"
FORWARD_MESSAGE_TOP_SUBJECT = "Assunto" FORWARD_MESSAGE_TOP_SUBJECT = "Assunto"
EMPTY_TO_ERROR_DESC = "Por favor, especifique pelo menos um destinatário" EMPTY_TO_ERROR_DESC = "Por favor, especifique pelo menos um destinatário"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Pedir um recibo de leitura" BUTTON_REQUEST_READ_RECEIPT = "Pedir um recibo de leitura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Geral" LEGEND_GENERAL = "Geral"
LABEL_LANGUAGE = "Linguagem" LABEL_LANGUAGE = "Linguagem"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Editor de texto padrão" LABEL_EDITOR = "Editor de texto padrão"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Simples" LABEL_EDITOR_PLAIN = "Simples"

View file

@ -223,6 +223,8 @@ FORWARD_MESSAGE_TOP_CC = "Copie"
FORWARD_MESSAGE_TOP_SENT = "Primit la" FORWARD_MESSAGE_TOP_SENT = "Primit la"
FORWARD_MESSAGE_TOP_SUBJECT = "Subiect" FORWARD_MESSAGE_TOP_SUBJECT = "Subiect"
EMPTY_TO_ERROR_DESC = "Vă rugăm să specificați cel puțin un destinatar" EMPTY_TO_ERROR_DESC = "Vă rugăm să specificați cel puțin un destinatar"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Cere confirmare de citire" BUTTON_REQUEST_READ_RECEIPT = "Cere confirmare de citire"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -393,6 +395,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Setări de bază" LEGEND_GENERAL = "Setări de bază"
LABEL_LANGUAGE = "Limbă" LABEL_LANGUAGE = "Limbă"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Editor de text implicit" LABEL_EDITOR = "Editor de text implicit"
LABEL_EDITOR_HTML = "Formatat" LABEL_EDITOR_HTML = "Formatat"
LABEL_EDITOR_PLAIN = "Simplu" LABEL_EDITOR_PLAIN = "Simplu"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "Копия"
FORWARD_MESSAGE_TOP_SENT = "Отправлено" FORWARD_MESSAGE_TOP_SENT = "Отправлено"
FORWARD_MESSAGE_TOP_SUBJECT = "Тема" FORWARD_MESSAGE_TOP_SUBJECT = "Тема"
EMPTY_TO_ERROR_DESC = "Укажите как минимум одного получателя" EMPTY_TO_ERROR_DESC = "Укажите как минимум одного получателя"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Запрос о прочтении письма" BUTTON_REQUEST_READ_RECEIPT = "Запрос о прочтении письма"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Если вы не можете получить
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Основные Настройки" LEGEND_GENERAL = "Основные Настройки"
LABEL_LANGUAGE = "Язык" LABEL_LANGUAGE = "Язык"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Редактор текста по умолчанию" LABEL_EDITOR = "Редактор текста по умолчанию"
LABEL_EDITOR_HTML = "Форматированный" LABEL_EDITOR_HTML = "Форматированный"
LABEL_EDITOR_PLAIN = "Простой" LABEL_EDITOR_PLAIN = "Простой"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "Kópia"
FORWARD_MESSAGE_TOP_SENT = "Odoslať" FORWARD_MESSAGE_TOP_SENT = "Odoslať"
FORWARD_MESSAGE_TOP_SUBJECT = "Predmet" FORWARD_MESSAGE_TOP_SUBJECT = "Predmet"
EMPTY_TO_ERROR_DESC = "Zadajte prosím aspoň jedného príjemcu" EMPTY_TO_ERROR_DESC = "Zadajte prosím aspoň jedného príjemcu"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Vyžiadať potvrdenie o prečítaní" BUTTON_REQUEST_READ_RECEIPT = "Vyžiadať potvrdenie o prečítaní"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Všeobecné" LEGEND_GENERAL = "Všeobecné"
LABEL_LANGUAGE = "Jazyk" LABEL_LANGUAGE = "Jazyk"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Predvolený editor správ" LABEL_EDITOR = "Predvolený editor správ"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Text" LABEL_EDITOR_PLAIN = "Text"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Skickat" FORWARD_MESSAGE_TOP_SENT = "Skickat"
FORWARD_MESSAGE_TOP_SUBJECT = "Ämne" FORWARD_MESSAGE_TOP_SUBJECT = "Ämne"
EMPTY_TO_ERROR_DESC = "Ange minst en mottagare" EMPTY_TO_ERROR_DESC = "Ange minst en mottagare"
NO_ATTACHMENTS_HERE_DESC = "No attachments here."
ATTACHMENTS_ERROR_DESC = "Warning! Not all attachments have been uploaded."
ATTACHMENTS_UPLOAD_ERROR_DESC = "Alla bilagor är inte uppladddade än" ATTACHMENTS_UPLOAD_ERROR_DESC = "Alla bilagor är inte uppladddade än"
BUTTON_REQUEST_READ_RECEIPT = "Begär mottagningskvitto" BUTTON_REQUEST_READ_RECEIPT = "Begär mottagningskvitto"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Om du inte kan ta emot koderna med Google Authen
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Allmänt" LEGEND_GENERAL = "Allmänt"
LABEL_LANGUAGE = "Språk" LABEL_LANGUAGE = "Språk"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Textredigerare" LABEL_EDITOR = "Textredigerare"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Enkel" LABEL_EDITOR_PLAIN = "Enkel"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "CC"
FORWARD_MESSAGE_TOP_SENT = "Gönder" FORWARD_MESSAGE_TOP_SENT = "Gönder"
FORWARD_MESSAGE_TOP_SUBJECT = "Konu" FORWARD_MESSAGE_TOP_SUBJECT = "Konu"
EMPTY_TO_ERROR_DESC = "En az bir alıcı belirtin" EMPTY_TO_ERROR_DESC = "En az bir alıcı belirtin"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Okundu bilgisi iste" BUTTON_REQUEST_READ_RECEIPT = "Okundu bilgisi iste"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -393,6 +395,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Google Şifrematik'te aracılığıyla kodları
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Genel" LEGEND_GENERAL = "Genel"
LABEL_LANGUAGE = "Dil" LABEL_LANGUAGE = "Dil"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Varsayılan text editör" LABEL_EDITOR = "Varsayılan text editör"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Düz" LABEL_EDITOR_PLAIN = "Düz"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "Копія"
FORWARD_MESSAGE_TOP_SENT = "Надіслано" FORWARD_MESSAGE_TOP_SENT = "Надіслано"
FORWARD_MESSAGE_TOP_SUBJECT = "Тема" FORWARD_MESSAGE_TOP_SUBJECT = "Тема"
EMPTY_TO_ERROR_DESC = "Вкажіть як мінімум одного отримувача" EMPTY_TO_ERROR_DESC = "Вкажіть як мінімум одного отримувача"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Запит про прочитання листа" BUTTON_REQUEST_READ_RECEIPT = "Запит про прочитання листа"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "Якщо Ви не можете отримати
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Основні Налаштування" LEGEND_GENERAL = "Основні Налаштування"
LABEL_LANGUAGE = "Мова" LABEL_LANGUAGE = "Мова"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "Редактор тексту за змовчуванням" LABEL_EDITOR = "Редактор тексту за змовчуванням"
LABEL_EDITOR_HTML = "Форматований" LABEL_EDITOR_HTML = "Форматований"
LABEL_EDITOR_PLAIN = "Простий" LABEL_EDITOR_PLAIN = "Простий"

View file

@ -224,6 +224,8 @@ FORWARD_MESSAGE_TOP_CC = "抄送"
FORWARD_MESSAGE_TOP_SENT = "发送" FORWARD_MESSAGE_TOP_SENT = "发送"
FORWARD_MESSAGE_TOP_SUBJECT = "主题" FORWARD_MESSAGE_TOP_SUBJECT = "主题"
EMPTY_TO_ERROR_DESC = "请至少选择一位接收人" EMPTY_TO_ERROR_DESC = "请至少选择一位接收人"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -394,6 +396,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "一般设置" LEGEND_GENERAL = "一般设置"
LABEL_LANGUAGE = "语言" LABEL_LANGUAGE = "语言"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "默认格式" LABEL_EDITOR = "默认格式"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Plain" LABEL_EDITOR_PLAIN = "Plain"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_CC = "複本"
FORWARD_MESSAGE_TOP_SENT = "發送" FORWARD_MESSAGE_TOP_SENT = "發送"
FORWARD_MESSAGE_TOP_SUBJECT = "主題" FORWARD_MESSAGE_TOP_SUBJECT = "主題"
EMPTY_TO_ERROR_DESC = "請至少選擇一位接收人" EMPTY_TO_ERROR_DESC = "請至少選擇一位接收人"
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" ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt" BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important" BUTTON_MARK_AS_IMPORTANT = "Mark as important"
@ -395,6 +397,10 @@ TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authentica
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "一般設置" LEGEND_GENERAL = "一般設置"
LABEL_LANGUAGE = "語言" LABEL_LANGUAGE = "語言"
LABEL_LAYOUT = "Layout"
LABEL_LAYOUT_NO_SPLIT = "No Split"
LABEL_LAYOUT_VERTICAL_SPLIT = "Vertical Split"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Horizontal Split"
LABEL_EDITOR = "默認格式" LABEL_EDITOR = "默認格式"
LABEL_EDITOR_HTML = "Html" LABEL_EDITOR_HTML = "Html"
LABEL_EDITOR_PLAIN = "Plain" LABEL_EDITOR_PLAIN = "Plain"

View file

@ -1,492 +0,0 @@
/* Magnific Popup CSS */
.mfp-bg {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 502;
overflow: hidden;
position: fixed;
background: #0b0b0b;
opacity: 0.8;
filter: alpha(opacity=80); }
.mfp-wrap {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 503;
position: fixed;
outline: none !important;
-webkit-backface-visibility: hidden; }
.mfp-container {
height: 100%;
text-align: center;
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
padding: 0 8px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
.mfp-container:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle; }
.mfp-align-top .mfp-container:before {
display: none; }
.mfp-content {
position: relative;
display: inline-block;
vertical-align: middle;
margin: 0 auto;
text-align: left;
z-index: 505; }
.mfp-inline-holder .mfp-content,
.mfp-ajax-holder .mfp-content {
width: 100%;
cursor: auto; }
.mfp-ajax-cur {
cursor: progress; }
.mfp-zoom-out-cur {
cursor: -moz-zoom-out;
cursor: -webkit-zoom-out;
cursor: zoom-out; }
.mfp-zoom-out-cur,
.mfp-zoom-out-cur .mfp-image-holder .mfp-close {
cursor: pointer; }
.mfp-zoom {
cursor: pointer;
cursor: -webkit-zoom-in;
cursor: -moz-zoom-in;
cursor: zoom-in; }
.mfp-auto-cursor .mfp-content {
cursor: auto; }
.mfp-close,
.mfp-arrow,
.mfp-preloader,
.mfp-counter {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none; }
.mfp-loading.mfp-figure {
display: none; }
.mfp-hide {
display: none !important; }
.mfp-preloader {
color: #cccccc;
position: absolute;
top: 50%;
width: auto;
text-align: center;
margin-top: -0.8em;
left: 8px;
right: 8px;
z-index: 504; }
.mfp-preloader a {
color: #cccccc; }
.mfp-preloader a:hover {
color: white; }
.mfp-s-ready .mfp-preloader {
display: none; }
.mfp-s-error .mfp-content {
display: none; }
button.mfp-close,
button.mfp-arrow {
overflow: visible;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
display: block;
padding: 0;
z-index: 506; }
button::-moz-focus-inner {
padding: 0;
border: 0; }
.mfp-close {
width: 44px;
height: 44px;
line-height: 44px;
position: absolute;
right: 0;
top: 0;
text-decoration: none;
text-align: center;
opacity: 0.65;
padding: 0 0 18px 10px;
color: white;
font-style: normal;
font-size: 28px;
font-family: Arial, Baskerville, monospace; }
.mfp-close:hover, .mfp-close:focus {
opacity: 1; }
.mfp-close:active {
top: 1px; }
.mfp-close-btn-in .mfp-close {
color: #333333; }
.mfp-image-holder .mfp-close,
.mfp-iframe-holder .mfp-close {
color: white;
right: -6px;
text-align: right;
padding-right: 6px;
width: 100%; }
.mfp-counter {
position: absolute;
top: 0;
right: 0;
color: #cccccc;
font-size: 12px;
line-height: 18px; }
.mfp-arrow {
position: absolute;
top: 0;
opacity: 0.65;
margin: 0;
top: 50%;
margin-top: -55px;
padding: 0;
width: 90px;
height: 110px;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
.mfp-arrow:active {
margin-top: -54px; }
.mfp-arrow:hover,
.mfp-arrow:focus {
opacity: 1; }
.mfp-arrow:before, .mfp-arrow:after,
.mfp-arrow .mfp-b,
.mfp-arrow .mfp-a {
content: '';
display: block;
width: 0;
height: 0;
position: absolute;
left: 0;
top: 0;
margin-top: 35px;
margin-left: 35px;
border: solid transparent; }
.mfp-arrow:after,
.mfp-arrow .mfp-a {
opacity: 0.8;
border-top-width: 12px;
border-bottom-width: 12px;
top: 8px; }
.mfp-arrow:before,
.mfp-arrow .mfp-b {
border-top-width: 20px;
border-bottom-width: 20px; }
.mfp-arrow-left {
left: 0; }
.mfp-arrow-left:after,
.mfp-arrow-left .mfp-a {
border-right: 12px solid black;
left: 5px; }
.mfp-arrow-left:before,
.mfp-arrow-left .mfp-b {
border-right: 20px solid white; }
.mfp-arrow-right {
right: 0; }
.mfp-arrow-right:after,
.mfp-arrow-right .mfp-a {
border-left: 12px solid black;
left: 3px; }
.mfp-arrow-right:before,
.mfp-arrow-right .mfp-b {
border-left: 20px solid white; }
.mfp-iframe-holder {
padding-top: 40px;
padding-bottom: 40px; }
.mfp-iframe-holder .mfp-content {
line-height: 0;
width: 100%;
max-width: 900px; }
.mfp-iframe-scaler {
width: 100%;
height: 0;
overflow: hidden;
padding-top: 56.25%; }
.mfp-iframe-scaler iframe {
position: absolute;
display: block;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: black; }
.mfp-iframe-holder .mfp-close {
top: -40px; }
/* Main image in popup */
img.mfp-img {
width: auto;
max-width: 100%;
height: auto;
display: block;
line-height: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 40px 0 40px;
margin: 0 auto; }
/* The shadow behind the image */
.mfp-figure:after {
content: '';
position: absolute;
left: 0;
top: 40px;
bottom: 40px;
display: block;
right: 0;
width: auto;
height: auto;
z-index: -1;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); }
.mfp-figure {
line-height: 0; }
.mfp-bottom-bar {
margin-top: -36px;
position: absolute;
top: 100%;
left: 0;
width: 100%;
cursor: auto; }
.mfp-title {
text-align: left;
line-height: 18px;
color: #f3f3f3;
word-break: break-word;
padding-right: 36px; }
.mfp-figure small {
color: #bdbdbd;
display: block;
font-size: 12px;
line-height: 14px; }
.mfp-image-holder .mfp-content {
max-width: 100%; }
.mfp-gallery .mfp-image-holder .mfp-figure {
cursor: pointer; }
@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
/**
* Remove all paddings around the image on small screen
*/
.mfp-img-mobile .mfp-image-holder {
padding-left: 0;
padding-right: 0; }
.mfp-img-mobile img.mfp-img {
padding: 0; }
/* The shadow behind the image */
.mfp-img-mobile .mfp-figure:after {
top: 0;
bottom: 0; }
.mfp-img-mobile .mfp-bottom-bar {
background: rgba(0, 0, 0, 0.6);
bottom: 0;
margin: 0;
top: auto;
padding: 3px 5px;
position: fixed;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
.mfp-img-mobile .mfp-bottom-bar:empty {
padding: 0; }
.mfp-img-mobile .mfp-counter {
right: 5px;
top: 3px; }
.mfp-img-mobile .mfp-close {
top: 0;
right: 0;
width: 35px;
height: 35px;
line-height: 35px;
background: rgba(0, 0, 0, 0.6);
position: fixed;
text-align: center;
padding: 0; }
.mfp-img-mobile .mfp-figure small {
display: inline;
margin-left: 5px; } }
@media all and (max-width: 800px) {
.mfp-arrow {
-webkit-transform: scale(0.75);
transform: scale(0.75); }
.mfp-arrow-left {
-webkit-transform-origin: 0;
transform-origin: 0; }
.mfp-arrow-right {
-webkit-transform-origin: 100%;
transform-origin: 100%; }
.mfp-container {
padding-left: 6px;
padding-right: 6px; } }
.mfp-ie7 .mfp-img {
padding: 0; }
.mfp-ie7 .mfp-bottom-bar {
width: 600px;
left: 50%;
margin-left: -300px;
margin-top: 5px;
padding-bottom: 5px; }
.mfp-ie7 .mfp-container {
padding: 0; }
.mfp-ie7 .mfp-content {
padding-top: 44px; }
.mfp-ie7 .mfp-close {
top: 0;
right: 0;
padding-top: 0; }
/* overlay at start */
.mfp-fade.mfp-bg {
opacity: 0;
-webkit-transition: all 0.15s ease-out;
-moz-transition: all 0.15s ease-out;
transition: all 0.15s ease-out;
}
/* overlay animate in */
.mfp-fade.mfp-bg.mfp-ready {
opacity: 0.8;
}
/* overlay animate out */
.mfp-fade.mfp-bg.mfp-removing {
opacity: 0;
}
/* content at start */
.mfp-fade.mfp-wrap .mfp-content {
opacity: 0;
-webkit-transition: all 0.15s ease-out;
-moz-transition: all 0.15s ease-out;
transition: all 0.15s ease-out;
}
/* content animate it */
.mfp-fade.mfp-wrap.mfp-ready .mfp-content {
opacity: 1;
}
/* content animate out */
.mfp-fade.mfp-wrap.mfp-removing .mfp-content {
opacity: 0;
}
/**
* Fade-zoom animation for first dialog
*/
/* start state */
.my-mfp-zoom-in .zoom-anim-dialog {
opacity: 0;
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
-o-transform: scale(0.8);
transform: scale(0.8);
}
/* animate in */
.my-mfp-zoom-in.mfp-ready .zoom-anim-dialog {
opacity: 1;
-webkit-transform: scale(1);
-moz-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1);
}
/* animate out */
.my-mfp-zoom-in.mfp-removing .zoom-anim-dialog {
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-ms-transform: scale(0.8);
-o-transform: scale(0.8);
transform: scale(0.8);
opacity: 0;
}
/* Dark overlay, start state */
.my-mfp-zoom-in.mfp-bg {
opacity: 0;
-webkit-transition: opacity 0.3s ease-out;
-moz-transition: opacity 0.3s ease-out;
-o-transition: opacity 0.3s ease-out;
transition: opacity 0.3s ease-out;
}
/* animate in */
.my-mfp-zoom-in.mfp-ready.mfp-bg {
opacity: 0.8;
}
/* animate out */
.my-mfp-zoom-in.mfp-removing.mfp-bg {
opacity: 0;
}

File diff suppressed because one or more lines are too long