Interface optimization

Mark as important (compose)
This commit is contained in:
RainLoop Team 2014-12-31 16:21:43 +04:00
parent 821991a263
commit d5eacb6a4d
43 changed files with 1069 additions and 780 deletions

View file

@ -23,6 +23,8 @@
this.enabled = ko.observable(true);
this.id = '';
this.name = ko.observable('');
this.name.error = ko.observable(false);
this.name.focused = ko.observable(false);
@ -33,6 +35,7 @@
// Actions
this.actionValue = ko.observable('');
this.actionMarkAsRead = ko.observable(false);
this.actionSkipOthers = ko.observable(false);
this.actionType = ko.observable(Enums.FiltersAction.Move);
@ -74,18 +77,27 @@
_.extend(FilterModel.prototype, AbstractModel.prototype);
FilterModel.prototype.generateID = function ()
{
this.id = Utils.fakeMd5();
};
FilterModel.prototype.toJson = function ()
{
return {
'ID': this.id,
'Enabled': this.enabled(),
'Name': this.name(),
'ConditionsType': this.conditionsType(),
'Conditions': _.map(this.conditions(), function (oItem) {
return oItem.toJson();
}),
'ActionMarkAsRead': this.actionMarkAsRead(),
'ActionValue': this.actionValue(),
'ActionType': this.actionType()
'ActionType': this.actionType(),
'MarkAsRead': this.actionMarkAsRead() ? '1' : '0',
'SkipOthers': this.actionSkipOthers() ? '1' : '0'
};
};
@ -105,6 +117,7 @@
var bResult = false;
if (oItem && 'Object/Filter' === oItem['@Object'])
{
this.ID = Utils.pString(oItem['ID']);
this.name(Utils.pString(oItem['Name']));
bResult = true;
@ -117,6 +130,8 @@
{
var oClone = new FilterModel();
oClone.ID = this.ID;
oClone.enabled(this.enabled());
oClone.name(this.name());
@ -125,6 +140,8 @@
oClone.conditionsType(this.conditionsType());
oClone.actionMarkAsRead(this.actionMarkAsRead());
oClone.actionSkipOthers(this.actionSkipOthers());
oClone.actionValue(this.actionValue());
oClone.actionType(this.actionType());

View file

@ -13,7 +13,6 @@
;
/**
* @param {*} oKoList
* @constructor
*/
function FilterConditionModel()

View file

@ -144,7 +144,12 @@
return 0 === this.parentUid() && 0 < iCount ? iCount + 1 : '';
}, this);
this.regDisposables([this.attachmentIconClass, this.fullFormatDateValue, this.threadsLenResult]);
this.isImportant = ko.computed(function () {
return Enums.MessagePriority.High === this.priority();
}, this);
this.regDisposables([this.attachmentIconClass, this.fullFormatDateValue,
this.threadsLenResult, this.isImportant]);
}
_.extend(MessageModel.prototype, AbstractModel.prototype);
@ -379,9 +384,17 @@
*/
MessageModel.prototype.initByJson = function (oJsonMessage)
{
var bResult = false;
var
bResult = false,
iPriority = Enums.MessagePriority.Normal
;
if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object'])
{
iPriority = Utils.pInt(oJsonMessage.Priority);
this.priority(-1 < Utils.inArray(iPriority, [Enums.MessagePriority.High, Enums.MessagePriority.Low]) ?
iPriority : Enums.MessagePriority.Normal);
this.folderFullNameRaw = oJsonMessage.Folder;
this.uid = oJsonMessage.Uid;
this.hash = oJsonMessage.Hash;
@ -845,7 +858,9 @@
*/
MessageModel.prototype.viewPopupMessage = function (bPrint)
{
Utils.windowPopupKnockout(this.getDataForWindowPopup(), 'PopupsWindowSimpleMessage', this.subject(), function (oPopupWin) {
Utils.windowPopupKnockout(this.getDataForWindowPopup(), 'PopupsWindowSimpleMessage',
this.subject(), function (oPopupWin)
{
if (oPopupWin && oPopupWin.document && oPopupWin.document.body)
{
$('img.lazy', oPopupWin.document.body).each(function (iIndex, oImg) {
@ -925,6 +940,8 @@
this.forwarded(oMessage.forwarded());
this.isReadReceipt(oMessage.isReadReceipt());
this.priority(oMessage.priority());
this.selected(oMessage.selected());
this.checked(oMessage.checked());
this.hasAttachments(oMessage.hasAttachments());
@ -934,7 +951,6 @@
this.body = null;
this.priority(Enums.MessagePriority.Normal);
this.aDraftInfo = [];
this.sMessageId = '';
this.sInReplyTo = '';

View file

@ -105,6 +105,7 @@
oNew = new FilterModel()
;
oNew.generateID();
require('Knoin/Knoin').showScreenPopup(
require('View/Popup/Filter'), [oNew, function () {
self.filters.push(oNew);

View file

@ -493,9 +493,10 @@
* @param {(Array|null)} aDraftInfo
* @param {string} sInReplyTo
* @param {string} sReferences
* @param {boolean} bMarkAsImportant
*/
RemoteUserStorage.prototype.saveMessage = function (fCallback, sMessageFolder, sMessageUid, sDraftFolder,
sFrom, sTo, sCc, sBcc, sSubject, bTextIsHtml, sText, aAttachments, aDraftInfo, sInReplyTo, sReferences)
sFrom, sTo, sCc, sBcc, sSubject, bTextIsHtml, sText, aAttachments, aDraftInfo, sInReplyTo, sReferences, bMarkAsImportant)
{
this.defaultRequest(fCallback, 'SaveMessage', {
'MessageFolder': sMessageFolder,
@ -511,6 +512,7 @@
'DraftInfo': aDraftInfo,
'InReplyTo': sInReplyTo,
'References': sReferences,
'MarkAsImportant': bMarkAsImportant ? '1' : '0',
'Attachments': aAttachments
}, Consts.Defaults.SaveMessageAjaxTimeout);
};
@ -552,9 +554,11 @@
* @param {string} sInReplyTo
* @param {string} sReferences
* @param {boolean} bRequestReadReceipt
* @param {boolean} bMarkAsImportant
*/
RemoteUserStorage.prototype.sendMessage = function (fCallback, sMessageFolder, sMessageUid, sSentFolder,
sFrom, sTo, sCc, sBcc, sSubject, bTextIsHtml, sText, aAttachments, aDraftInfo, sInReplyTo, sReferences, bRequestReadReceipt)
sFrom, sTo, sCc, sBcc, sSubject, bTextIsHtml, sText, aAttachments, aDraftInfo, sInReplyTo, sReferences,
bRequestReadReceipt, bMarkAsImportant)
{
this.defaultRequest(fCallback, 'SendMessage', {
'MessageFolder': sMessageFolder,
@ -571,6 +575,7 @@
'InReplyTo': sInReplyTo,
'References': sReferences,
'ReadReceiptRequest': bRequestReadReceipt ? '1' : '0',
'MarkAsImportant': bMarkAsImportant ? '1' : '0',
'Attachments': aAttachments
}, Consts.Defaults.SendMessageAjaxTimeout);
};

View file

@ -47,6 +47,8 @@
this.bCapaAdditionalIdentities = Settings.capa(Enums.Capa.AdditionalIdentities);
this.allowContacts = !!Settings.settingsGet('ContactsIsAllowed');
var
self = this,
fCcAndBccCheckHelper = function (aValue) {
@ -76,6 +78,7 @@
this.isHtml = ko.observable(false);
this.requestReadReceipt = ko.observable(false);
this.markAsImportant = ko.observable(false);
this.sendError = ko.observable(false);
this.sendSuccessButSaveError = ko.observable(false);
@ -298,7 +301,8 @@
this.aDraftInfo,
this.sInReplyTo,
this.sReferences,
this.requestReadReceipt()
this.requestReadReceipt(),
this.markAsImportant()
);
}
}
@ -334,7 +338,8 @@
this.prepearAttachmentsForSendOrSave(),
this.aDraftInfo,
this.sInReplyTo,
this.sReferences
this.sReferences,
this.markAsImportant()
);
}
@ -354,6 +359,21 @@
}, this.canBeSendedOrSaved);
this.contactsCommand = Utils.createCommand(this, function () {
if (this.allowContacts)
{
this.skipCommand();
_.delay(function () {
kn.showScreenPopup(require('View/Popup/Contacts'), [true]);
}, 200);
}
}, function () {
return this.allowContacts;
});
Events.sub('interval.2m', function () {
if (this.modalVisibility() && !Data.draftFolderNotEnabled() && !this.isEmptyForm(false) &&
@ -800,6 +820,10 @@
self.initOnShow(sType, oMessageOrArray, aToEmails, sCustomSubject, sCustomPlainText);
}, null, null, null, false]);
}
else if (aToEmails && 0 < aToEmails.length)
{
this.addEmailsToTo(aToEmails);
}
}
else
{
@ -807,6 +831,23 @@
}
};
/**
* @param {Array} aEmails
*/
ComposePopupView.prototype.addEmailsToTo = function (aEmails)
{
var
sTo = Utils.trim(this.to()),
aTo = []
;
aTo = _.uniq(_.compact(_.map(aEmails, function (oItem) {
return oItem ? oItem.toLine(false) : null;
})));
this.to(sTo + ('' === sTo ? '' : ', ') + Utils.trim(aTo.join(', ')));
};
/**
* @param {string=} sType = Enums.ComposeType.Empty
* @param {?MessageModel|Array=} oMessageOrArray = null
@ -1826,6 +1867,7 @@
this.subject('');
this.requestReadReceipt(false);
this.markAsImportant(false);
this.aDraftInfo = null;
this.sInReplyTo = '';

View file

@ -46,6 +46,8 @@
}
;
this.bBackToCompose = false;
this.allowContactsSync = Data.allowContactsSync;
this.enableContactsSync = Data.enableContactsSync;
this.allowExport = !Globals.bMobileDevice;
@ -261,8 +263,13 @@
if (Utils.isNonEmptyArray(aE))
{
self.bBackToCompose = false;
kn.hideScreenPopup(require('View/Popup/Contacts'));
_.delay(function () {
kn.showScreenPopup(require('View/Popup/Compose'), [Enums.ComposeType.Empty, null, aE]);
}, 200);
}
}, function () {
@ -716,8 +723,10 @@
this.initUploader();
};
ContactsPopupView.prototype.onShow = function ()
ContactsPopupView.prototype.onShow = function (bBackToCompose)
{
this.bBackToCompose = Utils.isUnd(bBackToCompose) ? false : !!bBackToCompose;
kn.routeOff();
this.reloadContactList(true);
};
@ -732,6 +741,13 @@
Utils.delegateRunOnDestroy(this.contacts());
this.contacts([]);
if (this.bBackToCompose)
{
this.bBackToCompose = false;
kn.showScreenPopup(require('View/Popup/Compose'));
}
};
module.exports = ContactsPopupView;

View file

@ -165,6 +165,7 @@
this.viewDownloadLink = ko.observable('');
this.viewUserPic = ko.observable(Consts.DataImages.UserDotPic);
this.viewUserPicVisible = ko.observable(false);
this.viewIsImportant = ko.observable(false);
this.viewPgpPassword = ko.observable('');
this.viewPgpSignedVerifyStatus = ko.computed(function () {
@ -202,6 +203,7 @@
this.viewLineAsCcc(oMessage.lineAsCcc());
this.viewViewLink(oMessage.viewLink());
this.viewDownloadLink(oMessage.downloadLink());
this.viewIsImportant(oMessage.isImportant());
sLastEmail = oMessage.fromAsSingleEmail();
Cache.getUserPic(sLastEmail, function (sPic, $sEmail) {

View file

@ -82,6 +82,10 @@ LANG_KO_KR = "한국어"
LANG_BG = "Български"
LANG_BG_BG = "Български"
LANG_VI = "Tiếng Việt"
LANG_VI_VI = "Tiếng Việt"
LANG_VI_VN = "Tiếng Việt"
[LANGS_NAMES_EN]
LANG_EN = "English"
LANG_EN_US = "English (US)"
@ -166,3 +170,7 @@ LANG_KO_KR = "Korean"
LANG_BG = "Bulgarian"
LANG_BG_BG = "Bulgarian"
LANG_VI = "Vietnamese"
LANG_VI_VI = "Vietnamese"
LANG_VI_VN = "Vietnamese"

View file

@ -2751,12 +2751,12 @@ class Actions
*/
public function licenseHelper($sForce = false, $bLongCache = false, $iFastCacheTimeInMin = 10, $iLongCacheTimeInDays = 3)
{
$sDomain = APP_SITE;
$sDomain = \trim(APP_SITE);
$oCacher = $this->Cacher();
$oHttp = \MailSo\Base\Http::SingletonInstance();
if ($oHttp->CheckLocalhost($sDomain) || !$oCacher)
if (0 === \strlen($sDomain) || $oHttp->CheckLocalhost($sDomain) || !$oCacher)
{
return 'NO';
}
@ -4761,6 +4761,7 @@ class Actions
$sSubject = $this->GetActionParam('Subject', '');
$bTextIsHtml = '1' === $this->GetActionParam('TextIsHtml', '0');
$bReadReceiptRequest = '1' === $this->GetActionParam('ReadReceiptRequest', '0');
$bMarkAsImportant = '1' === $this->GetActionParam('MarkAsImportant', '0');
$sText = $this->GetActionParam('Text', '');
$aAttachments = $this->GetActionParam('Attachments', null);
@ -4801,6 +4802,11 @@ class Actions
$oMessage->SetReadReceipt($oAccount->Email());
}
if ($bMarkAsImportant)
{
$oMessage->SetPriority(\MailSo\Mime\Enumerations\MessagePriority::HIGH);
}
$oMessage->SetSubject($sSubject);
$oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sTo);

View file

@ -150,7 +150,22 @@ class Filter
*/
public function FromJSON($aFilter)
{
//
if (\is_array($aFilter))
{
$this->sID = isset($aFilter['ID']) ? $aFilter['ID'] : '';
$this->sName = isset($aFilter['Name']) ? $aFilter['Name'] : '';
$this->sFilterRulesType = isset($aFilter['FilterRulesType']) ? $aFilter['FilterRulesType'] :
\RainLoop\Providers\Filters\Enumerations\FilterRulesType::ALL;
$this->sActionType = isset($aFilter['ActionType']) ? $aFilter['ActionType'] :
\RainLoop\Providers\Filters\Enumerations\ActionType::MOVE_TO;
$this->sActionValue = isset($aFilter['ActionValue']) ? $aFilter['ActionValue'] : '';
$this->bMarkAsRead = isset($aFilter['MarkAsRead']) ? $aFilter['MarkAsRead'] : false;
$this->bSkipOthers = isset($aFilter['SkipOthers']) ? $aFilter['SkipOthers'] : false;
}
}
/**
@ -160,7 +175,15 @@ class Filter
*/
public function ToSimpleJSON($bAjax = false)
{
$aConditions = $this->Conditions();
$aConditions = array();
foreach ($this->Conditions() as $oItem)
{
if ($oItem)
{
$aConditions[] = $oItem->ToSimpleJSON($bAjax);
}
}
return array(
'ID' => $this->ID(),
'Name' => $this->Name(),

View file

@ -0,0 +1,90 @@
<?php
namespace RainLoop\Providers\Filters\Classes;
class FilterCondition
{
/**
* @var string
*/
private $sField;
/**
* @var string
*/
private $sType;
/**
* @var string
*/
private $sValue;
public function __construct()
{
$this->Clear();
}
public function Clear()
{
$this->sField = \RainLoop\Providers\Filters\Enumerations\ConditionField::FROM;
$this->sType = \RainLoop\Providers\Filters\Enumerations\ConditionType::EQUAL_TO;
$this->sValue = '';
}
/**
* @return string
*/
public function Field()
{
return $this->sField;
}
/**
* @return string
*/
public function Type()
{
return $this->sType;
}
/**
* @return string
*/
public function Value()
{
return $this->sValue;
}
/**
* @param array $aFilter
*
* @return array
*/
public function FromJSON($aFilter)
{
if (\is_array($aFilter))
{
$this->sField = isset($aFilter['Field']) ? $aFilter['Field'] :
\RainLoop\Providers\Filters\Enumerations\ConditionField::FROM;
$this->sType = isset($aFilter['Type']) ? $aFilter['Type'] :
\RainLoop\Providers\Filters\Enumerations\ConditionType::EQUAL_TO;
$this->sValue = isset($aFilter['Value']) ? $aFilter['Value'] : '';
}
}
/**
* @param bool $bAjax = false
*
* @return array
*/
public function ToSimpleJSON($bAjax = false)
{
return array(
'Field' => $this->Field(),
'Type' => $this->Type(),
'Value' => $this->Value()
);
}
}

View file

@ -37,8 +37,8 @@
</span>
</div>
<div class="subjectParent actionHandle dragHandle">
<b style="color:red;margin-right:5px" data-bind="visible: isImportant">!</b>
<span class="subject emptySubjectText" data-bind="text: $root.emptySubjectValue"></span>
<!--<span class="subject" data-bind="text: subject"></span>-->
<span class="subject-prefix" data-bind="text: subjectPrefix"></span><span class="subject-suffix" data-bind="text: subjectSuffix"></span>
</div>
</div>

View file

@ -37,8 +37,8 @@
</span>
</div>
<div class="subjectParent actionHandle dragHandle">
<b style="color:red;margin-right:5px" data-bind="visible: isImportant">!</b>
<span class="subject emptySubjectText" data-bind="text: $root.emptySubjectValue"></span>
<!--<span class="subject" data-bind="text: subject"></span>-->
<span class="subject-prefix" data-bind="text: subjectPrefix"></span><span class="subject-suffix" data-bind="text: subjectSuffix"></span>
</div>
<div class="clearfix"></div>

View file

@ -195,6 +195,7 @@
<img class="fromPic" data-bind="visible: viewUserPicVisible, attr: {'src': viewUserPic() }">
<div style="overflow: hidden;">
<div class="subjectParent" data-bind="event: { 'dblclick': toggleFullScreen }">
<b style="color:red;margin-right:5px" data-bind="visible: viewIsImportant">!</b>
<span class="subject" data-bind="text: viewSubject, title: viewSubject"></span>
<span class="i18n emptySubjectText" data-i18n-text="MESSAGE/EMPTY_SUBJECT_TEXT"></span>
</div>

View file

@ -50,6 +50,42 @@
</ul>
<!-- /ko -->
</div>
<div class="btn-group dropdown colored-toggle pull-right">
<a class="btn dropdown-toggle buttonMore" data-toggle="dropdown">
<i class="icon-list"></i>
</a>
<ul class="dropdown-menu g-ui-menu" role="menu">
<li class="e-item" data-bind="click: function () { requestReadReceipt(!requestReadReceipt()); }">
<a class="e-link">
<i class="icon-checkbox-unchecked" data-bind="css: {'icon-checkbox-checked': requestReadReceipt(), 'icon-checkbox-unchecked': !requestReadReceipt() }"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="COMPOSE/BUTTON_REQUEST_READ_RECEIPT"></span>
</a>
</li>
<li class="e-item" data-bind="click: function () { markAsImportant(!markAsImportant()); }">
<a class="e-link">
<i class="icon-checkbox-unchecked" data-bind="css: {'icon-checkbox-checked': markAsImportant(), 'icon-checkbox-unchecked': !markAsImportant() }"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="COMPOSE/BUTTON_MARK_AS_IMPORTANT"></span>
</a>
</li>
<li class="divider" data-bind="visible: capaOpenPGP"></li>
<li class="e-item" data-bind="visible: capaOpenPGP, click: openOpenPgpPopup, css: {'disabled': isHtml()}">
<a class="e-link">
<i class="icon-key"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="COMPOSE/BUTTON_OPEN_PGP"></span>
</a>
</li>
</ul>
</div>
<div class="btn-group pull-right">&nbsp;</div>
<div class="btn-group pull-right">
<a class="btn" data-tooltip-placement="bottom" data-bind="visible: allowContacts, command: contactsCommand, tooltip: 'FOLDER_LIST/BUTTON_CONTACTS'">
<i class="icon-address-book"></i>
</a>
</div>
<div class="btn-group pull-right">&nbsp;</div>
<span class="pull-right" data-bind="visible: !showCcAndBcc()">
<span class="i18n g-ui-link" data-i18n-text="COMPOSE/LINK_SHOW_INPUTS" data-bind="click: function () { showCcAndBcc(true); }"></span>
</span>
@ -115,29 +151,6 @@
<span class="i18n" data-i18n-text="COMPOSE/ATTACH_DROP_FILES_DESC"></span>
</div>
<div class="pull-right">
<div class="btn-group dropdown colored-toggle pull-right">
<a class="btn dropdown-toggle buttonMore" data-toggle="dropdown">
<i class="icon-list"></i>
</a>
<ul class="dropdown-menu g-ui-menu" role="menu">
<li class="e-item" data-bind="click: function () { requestReadReceipt(!requestReadReceipt()); }">
<a class="e-link">
<i class="icon-checkbox-unchecked" data-bind="css: {'icon-checkbox-checked': requestReadReceipt(), 'icon-checkbox-unchecked': !requestReadReceipt() }"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="COMPOSE/BUTTON_REQUEST_READ_RECEIPT"></span>
</a>
</li>
<li class="divider" data-bind="visible: capaOpenPGP"></li>
<li class="e-item" data-bind="visible: capaOpenPGP, click: openOpenPgpPopup, css: {'disabled': isHtml()}">
<a class="e-link">
<i class="icon-key"></i>
&nbsp;&nbsp;
OpenPGP (Plain Text Only)
</a>
</li>
</ul>
</div>
<div class="btn-group pull-right">&nbsp;</div>
<div class="btn-group pull-right">
<a class="btn" data-tooltip-placement="top" data-bind="visible: addAttachmentEnabled(), initDom: composeUploaderButton, tooltip: 'COMPOSE/ATTACH_FILES'">
<i class="icon-attachment"></i>

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Заглавие"
EMPTY_TO_ERROR_DESC = "Моля, изберте поне един получател"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Все още не са качени всички прикрепени файлове"
BUTTON_REQUEST_READ_RECEIPT = "Поискайте разписка за прочитане на съобщението"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Да"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Betreff"
EMPTY_TO_ERROR_DESC = "Geben Sie bitte mindestens einen Empfänger an"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Empfangsbestätigung anfordern"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Ja"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Subject"
EMPTY_TO_ERROR_DESC = "Please specify at least one recipient"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Yes"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Asunto"
EMPTY_TO_ERROR_DESC = "Por favor especifique al menos un destinatario"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Solicitar confirmación de lectura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Sí"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Sujet"
EMPTY_TO_ERROR_DESC = "Merci de spécifier au minimum un destinataire"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Demander une confirmation de lecture"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Oui"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Tárgy"
EMPTY_TO_ERROR_DESC = "Please specify at least one recipient"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Igen"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Viðfangsefni"
EMPTY_TO_ERROR_DESC = "Vinsamlegast taktu fram að minnsta kosti einn viðtakanda"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Yes"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Oggetto"
EMPTY_TO_ERROR_DESC = "Specifica almeno un destinatario"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Richiedi conferma di lettura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Si"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Subject"
EMPTY_TO_ERROR_DESC = "Please specify at least one recipient"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "開封確認を要求しますか?"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "はい"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "제목"
EMPTY_TO_ERROR_DESC = "수신인을 한 명 이상 선택하세요"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Yes"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Tema"
EMPTY_TO_ERROR_DESC = "Prašome nurodyti bent vieną gavėją"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Dar ne visi priedai buvo įkelti"
BUTTON_REQUEST_READ_RECEIPT = "Prašyti pranešti kada bus perskaitytas"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Taip"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Tēma"
EMPTY_TO_ERROR_DESC = "Pievienojat vismaz vienu saņēmēju"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Yes"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Onderwerp"
EMPTY_TO_ERROR_DESC = "Kies ten minste één ontvanger voordat u het bericht verstuurd"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Toevoegen van bijlage(n) is nog niet gereed"
BUTTON_REQUEST_READ_RECEIPT = "Leesbevestiging vragen"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Ja"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Emne"
EMPTY_TO_ERROR_DESC = "Vennligst oppgi minst én mottaker"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Alle vedleggene er ikke lastet opp ennå"
BUTTON_REQUEST_READ_RECEIPT = "Be om en lesebekreftelse når meldingen er lest"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Ja"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Temat"
EMPTY_TO_ERROR_DESC = "Wprowadź co najmniej jednego odbiorcę"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Nie przesłano jeszcze wszystkich załączników"
BUTTON_REQUEST_READ_RECEIPT = "Żądaj potwierdzenia odbioru"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Tak"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Assunto"
EMPTY_TO_ERROR_DESC = "Por favor, especifique pelo menos um destinatário"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Alguns anexos ainda não foram completamente enviados"
BUTTON_REQUEST_READ_RECEIPT = "Pedir recibo de leitura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Sim"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Assunto"
EMPTY_TO_ERROR_DESC = "Por favor, especifique pelo menos um destinatário"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Pedir um recibo de leitura"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Sim"

View file

@ -225,6 +225,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Subiect"
EMPTY_TO_ERROR_DESC = "Vă rugăm să specificați cel puțin un destinatar"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Cere confirmare de citire"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Da"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Тема"
EMPTY_TO_ERROR_DESC = "Укажите как минимум одного получателя"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Запрос о прочтении письма"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Да"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Predmet"
EMPTY_TO_ERROR_DESC = "Zadajte prosím aspoň jedného príjemcu"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Vyžiadať potvrdenie o prečítaní"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Áno"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Ämne"
EMPTY_TO_ERROR_DESC = "Ange minst en mottagare"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Alla bilagor är inte uppladddade än"
BUTTON_REQUEST_READ_RECEIPT = "Begär mottagningskvitto"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Ja"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Konu"
EMPTY_TO_ERROR_DESC = "En az bir alıcı belirtin"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Okundu bilgisi iste"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Evet"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "Тема"
EMPTY_TO_ERROR_DESC = "Вкажіть як мінімум одного отримувача"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Запит про прочитання листа"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "Так"

View file

@ -226,6 +226,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "主题"
EMPTY_TO_ERROR_DESC = "请至少选择一位接收人"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "是"

View file

@ -227,6 +227,8 @@ FORWARD_MESSAGE_TOP_SUBJECT = "主題"
EMPTY_TO_ERROR_DESC = "請至少選擇一位接收人"
ATTACHMENTS_UPLOAD_ERROR_DESC = "Not all attachments have been uploaded yet"
BUTTON_REQUEST_READ_RECEIPT = "Request a read receipt"
BUTTON_MARK_AS_IMPORTANT = "Mark as important"
BUTTON_OPEN_PGP = "OpenPGP (Plain Text Only)"
[POPUPS_ASK]
BUTTON_YES = "是"