OpenPGP improvements (first step)

openpgpjs: 0.7.2 -> 0.10.1
additional fixes
This commit is contained in:
RainLoop Team 2015-06-23 01:33:27 +04:00
parent 09334159c2
commit 34a9b8cbc5
28 changed files with 1363 additions and 644 deletions

View file

@ -109,6 +109,7 @@
'Settings': 'settings', 'Settings': 'settings',
'Menu': 'menu', 'Menu': 'menu',
'PopupComposeOpenPGP': 'compose-open-pgp', 'PopupComposeOpenPGP': 'compose-open-pgp',
'PopupMessageOpenPGP': 'message-open-pgp',
'PopupKeyboardShortcutsHelp': 'popup-keyboard-shortcuts-help', 'PopupKeyboardShortcutsHelp': 'popup-keyboard-shortcuts-help',
'PopupAsk': 'popup-ask' 'PopupAsk': 'popup-ask'
}; };

View file

@ -390,7 +390,7 @@
*/ */
Links.prototype.openPgpJs = function () Links.prototype.openPgpJs = function ()
{ {
return this.sStaticPrefix + 'js/min/openpgp.js'; return this.sStaticPrefix + 'js/min/openpgp.js';
}; };
/** /**

10
dev/External/ko.js vendored
View file

@ -7,6 +7,7 @@
window = require('window'), window = require('window'),
_ = require('_'), _ = require('_'),
$ = require('$'), $ = require('$'),
JSON = require('JSON'),
Opentip = require('Opentip'), Opentip = require('Opentip'),
fDisposalTooltipHelper = function (oElement) { fDisposalTooltipHelper = function (oElement) {
@ -63,6 +64,15 @@
} }
}; };
ko.bindingHandlers.json = {
'init': function (oElement, fValueAccessor) {
$(oElement).text(JSON.stringify(ko.unwrap(fValueAccessor())));
},
'update': function (oElement, fValueAccessor) {
$(oElement).text(JSON.stringify(ko.unwrap(fValueAccessor())));
}
};
ko.bindingHandlers.tooltip = { ko.bindingHandlers.tooltip = {
'init': function (oElement, fValueAccessor) { 'init': function (oElement, fValueAccessor) {

View file

@ -14,8 +14,6 @@
Globals = require('Common/Globals'), Globals = require('Common/Globals'),
Links = require('Common/Links'), Links = require('Common/Links'),
PgpStore = require('Stores/User/Pgp'),
AttachmentModel = require('Model/Attachment'), AttachmentModel = require('Model/Attachment'),
MessageHelper = require('Helper/Message'), MessageHelper = require('Helper/Message'),
@ -82,7 +80,6 @@
}, this); }, this);
this.body = null; this.body = null;
this.plainRaw = '';
this.isHtml = ko.observable(false); this.isHtml = ko.observable(false);
this.hasImages = ko.observable(false); this.hasImages = ko.observable(false);
@ -984,25 +981,6 @@
{ {
this.body.data('rl-is-html', !!this.isHtml()); this.body.data('rl-is-html', !!this.isHtml());
this.body.data('rl-has-images', !!this.hasImages()); this.body.data('rl-has-images', !!this.hasImages());
this.body.data('rl-plain-raw', this.plainRaw);
if (require('Stores/User/Pgp').capaOpenPGP())
{
this.body.data('rl-plain-pgp-signed', !!this.isPgpSigned());
this.body.data('rl-plain-pgp-encrypted', !!this.isPgpEncrypted());
this.body.data('rl-pgp-verify-status', this.pgpSignedVerifyStatus());
this.body.data('rl-pgp-verify-user', this.pgpSignedVerifyUser());
}
}
};
MessageModel.prototype.storePgpVerifyDataInDom = function ()
{
if (this.body && require('Stores/User/Pgp').capaOpenPGP())
{
this.body.data('rl-pgp-verify-status', this.pgpSignedVerifyStatus());
this.body.data('rl-pgp-verify-user', this.pgpSignedVerifyUser());
} }
}; };
@ -1012,157 +990,6 @@
{ {
this.isHtml(!!this.body.data('rl-is-html')); this.isHtml(!!this.body.data('rl-is-html'));
this.hasImages(!!this.body.data('rl-has-images')); this.hasImages(!!this.body.data('rl-has-images'));
this.plainRaw = Utils.pString(this.body.data('rl-plain-raw'));
if (require('Stores/User/Pgp').capaOpenPGP())
{
this.isPgpSigned(!!this.body.data('rl-plain-pgp-signed'));
this.isPgpEncrypted(!!this.body.data('rl-plain-pgp-encrypted'));
this.pgpSignedVerifyStatus(this.body.data('rl-pgp-verify-status'));
this.pgpSignedVerifyUser(this.body.data('rl-pgp-verify-user'));
}
else
{
this.isPgpSigned(false);
this.isPgpEncrypted(false);
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.None);
this.pgpSignedVerifyUser('');
}
}
};
MessageModel.prototype.verifyPgpSignedClearMessage = function ()
{
if (this.isPgpSigned())
{
var
aRes = [],
mPgpMessage = null,
sFrom = this.from && this.from[0] && this.from[0].email ? this.from[0].email : '',
aPublicKeys = PgpStore.findPublicKeysByEmail(sFrom),
oValidKey = null,
oValidSysKey = null,
sPlain = ''
;
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.Error);
this.pgpSignedVerifyUser('');
try
{
mPgpMessage = PgpStore.openpgp.cleartext.readArmored(this.plainRaw);
if (mPgpMessage && mPgpMessage.getText)
{
this.pgpSignedVerifyStatus(
aPublicKeys.length ? Enums.SignedVerifyStatus.Unverified : Enums.SignedVerifyStatus.UnknownPublicKeys);
aRes = mPgpMessage.verify(aPublicKeys);
if (aRes && 0 < aRes.length)
{
oValidKey = _.find(aRes, function (oItem) {
return oItem && oItem.keyid && oItem.valid;
});
if (oValidKey)
{
oValidSysKey = PgpStore.findPublicKeyByHex(oValidKey.keyid.toHex());
if (oValidSysKey)
{
sPlain = mPgpMessage.getText();
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.Success);
this.pgpSignedVerifyUser(oValidSysKey.user);
sPlain =
Globals.$div.empty().append(
$('<pre class="b-plain-openpgp signed verified"></pre>').text(sPlain)
).html()
;
Globals.$div.empty();
this.replacePlaneTextBody(sPlain);
}
}
}
}
}
catch (oExc) {}
this.storePgpVerifyDataInDom();
}
};
MessageModel.prototype.decryptPgpEncryptedMessage = function (sPassword)
{
if (this.isPgpEncrypted())
{
var
aRes = [],
mPgpMessage = null,
mPgpMessageDecrypted = null,
sFrom = this.from && this.from[0] && this.from[0].email ? this.from[0].email : '',
aPublicKey = PgpStore.findPublicKeysByEmail(sFrom),
oPrivateKey = PgpStore.findSelfPrivateKey(sPassword),
oValidKey = null,
oValidSysKey = null,
sPlain = ''
;
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.Error);
this.pgpSignedVerifyUser('');
if (!oPrivateKey)
{
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.UnknownPrivateKey);
}
try
{
mPgpMessage = PgpStore.openpgp.message.readArmored(this.plainRaw);
if (mPgpMessage && oPrivateKey && mPgpMessage.decrypt)
{
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.Unverified);
mPgpMessageDecrypted = mPgpMessage.decrypt(oPrivateKey);
if (mPgpMessageDecrypted)
{
aRes = mPgpMessageDecrypted.verify(aPublicKey);
if (aRes && 0 < aRes.length)
{
oValidKey = _.find(aRes, function (oItem) {
return oItem && oItem.keyid && oItem.valid;
});
if (oValidKey)
{
oValidSysKey = PgpStore.findPublicKeyByHex(oValidKey.keyid.toHex());
if (oValidSysKey)
{
this.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.Success);
this.pgpSignedVerifyUser(oValidSysKey.user);
}
}
}
sPlain = mPgpMessageDecrypted.getText();
sPlain =
Globals.$div.empty().append(
$('<pre class="b-plain-openpgp signed verified"></pre>').text(sPlain)
).html()
;
Globals.$div.empty();
this.replacePlaneTextBody(sPlain);
}
}
}
catch (oExc) {}
this.storePgpVerifyDataInDom();
} }
}; };

View file

@ -7,6 +7,8 @@
_ = require('_'), _ = require('_'),
ko = require('ko'), ko = require('ko'),
PgpStore = require('Stores/User/Pgp'),
AbstractModel = require('Knoin/AbstractModel') AbstractModel = require('Knoin/AbstractModel')
; ;
@ -45,6 +47,22 @@
OpenPgpKeyModel.prototype.armor = ''; OpenPgpKeyModel.prototype.armor = '';
OpenPgpKeyModel.prototype.isPrivate = false; OpenPgpKeyModel.prototype.isPrivate = false;
OpenPgpKeyModel.prototype.getNativeKeys = function ()
{
var oKey = null;
try
{
oKey = PgpStore.openpgp.key.readArmored(this.armor);
if (oKey && !oKey.err && oKey.keys && oKey.keys[0])
{
return oKey.keys;
}
}
catch (e) {}
return null;
};
module.exports = OpenPgpKeyModel; module.exports = OpenPgpKeyModel;
}()); }());

View file

@ -22,6 +22,7 @@
AppStore = require('Stores/User/App'), AppStore = require('Stores/User/App'),
FolderStore = require('Stores/User/Folder'), FolderStore = require('Stores/User/Folder'),
PgpStore = require('Stores/User/Pgp'),
SettingsStore = require('Stores/User/Settings'), SettingsStore = require('Stores/User/Settings'),
Remote = require('Remote/User/Ajax'), Remote = require('Remote/User/Ajax'),
@ -502,6 +503,19 @@
} }
}; };
/**
* @param {Object} oMessageTextBody
*/
MessageUserStore.prototype.initOpenPgpControls = function (oMessageTextBody)
{
if (oMessageTextBody && oMessageTextBody.find)
{
oMessageTextBody.find('.b-plain-openpgp:not(.inited)').each(function () {
PgpStore.initMessageBodyControls($(this));
});
}
};
MessageUserStore.prototype.setMessage = function (oData, bCached) MessageUserStore.prototype.setMessage = function (oData, bCached)
{ {
var var
@ -512,6 +526,7 @@
oBody = null, oBody = null,
oTextBody = null, oTextBody = null,
sId = '', sId = '',
sPlain = '',
sResultHtml = '', sResultHtml = '',
bPgpSigned = false, bPgpSigned = false,
bPgpEncrypted = false, bPgpEncrypted = false,
@ -579,13 +594,13 @@
if ((oMessage.isPgpSigned() || oMessage.isPgpEncrypted()) && require('Stores/User/Pgp').capaOpenPGP()) if ((oMessage.isPgpSigned() || oMessage.isPgpEncrypted()) && require('Stores/User/Pgp').capaOpenPGP())
{ {
oMessage.plainRaw = Utils.pString(oData.Result.Plain); sPlain = Utils.pString(oData.Result.Plain);
bPgpEncrypted = /---BEGIN PGP MESSAGE---/.test(oMessage.plainRaw); bPgpEncrypted = /---BEGIN PGP MESSAGE---/.test(sPlain);
if (!bPgpEncrypted) if (!bPgpEncrypted)
{ {
bPgpSigned = /-----BEGIN PGP SIGNED MESSAGE-----/.test(oMessage.plainRaw) && bPgpSigned = /-----BEGIN PGP SIGNED MESSAGE-----/.test(sPlain) &&
/-----BEGIN PGP SIGNATURE-----/.test(oMessage.plainRaw); /-----BEGIN PGP SIGNATURE-----/.test(sPlain);
} }
Globals.$div.empty(); Globals.$div.empty();
@ -593,7 +608,7 @@
{ {
sResultHtml = sResultHtml =
Globals.$div.append( Globals.$div.append(
$('<pre class="b-plain-openpgp signed"></pre>').text(oMessage.plainRaw) $('<pre class="b-plain-openpgp signed"></pre>').text(sPlain)
).html() ).html()
; ;
} }
@ -601,11 +616,13 @@
{ {
sResultHtml = sResultHtml =
Globals.$div.append( Globals.$div.append(
$('<pre class="b-plain-openpgp encrypted"></pre>').text(oMessage.plainRaw) $('<pre class="b-plain-openpgp encrypted"></pre>').text(sPlain)
).html() ).html()
; ;
} }
sPlain = '';
Globals.$div.empty(); Globals.$div.empty();
oMessage.isPgpSigned(bPgpSigned); oMessage.isPgpSigned(bPgpSigned);
@ -624,8 +641,6 @@
oMessage.isHtml(!!bIsHtml); oMessage.isHtml(!!bIsHtml);
oMessage.hasImages(!!bHasExternals); oMessage.hasImages(!!bHasExternals);
oMessage.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.None);
oMessage.pgpSignedVerifyUser('');
oMessage.body = oBody; oMessage.body = oBody;
if (oMessage.body) if (oMessage.body)
@ -663,6 +678,8 @@
if (oBody) if (oBody)
{ {
this.initOpenPgpControls(oBody);
this.initBlockquoteSwitcher(oBody); this.initBlockquoteSwitcher(oBody);
} }

View file

@ -5,6 +5,10 @@
var var
_ = require('_'), _ = require('_'),
ko = require('ko'), ko = require('ko'),
$ = require('$'),
kn = require('Knoin/Knoin'),
Translator = require('Common/Translator'),
Utils = require('Common/Utils') Utils = require('Common/Utils')
; ;
@ -41,32 +45,41 @@
PgpUserStore.prototype.findPublicKeyByHex = function (sHash) PgpUserStore.prototype.findPublicKeyByHex = function (sHash)
{ {
return _.find(this.openpgpkeysPublic(), function (oItem) { return _.find(this.openpgpkeysPublic(), function (oItem) {
return oItem && sHash === oItem.id; return sHash && oItem && sHash === oItem.id;
});
};
PgpUserStore.prototype.findPrivateKeyByHex = function (sHash)
{
return _.find(this.openpgpkeysPrivate(), function (oItem) {
return sHash && oItem && sHash === oItem.id;
}); });
}; };
PgpUserStore.prototype.findPublicKeysByEmail = function (sEmail) PgpUserStore.prototype.findPublicKeysByEmail = function (sEmail)
{
return _.compact(_.flatten(_.map(this.openpgpkeysPublic(), function (oItem) {
var oKey = oItem && sEmail === oItem.email ? oItem : null;
return oKey ? oKey.getNativeKeys() : [null];
}), true));
};
PgpUserStore.prototype.findPublicKeysBySigningKeyIds = function (aSigningKeyIds)
{ {
var self = this; var self = this;
return _.compact(_.map(this.openpgpkeysPublic(), function (oItem) { return _.compact(_.flatten(_.map(aSigningKeyIds, function (oId) {
var oKey = oId && oId.toHex ? self.findPublicKeyByHex(oId.toHex()) : null;
return oKey ? oKey.getNativeKeys() : [null];
}), true));
};
var oKey = null; PgpUserStore.prototype.findPrivateKeysByEncryptionKeyIds = function (aEncryptionKeyIds, bReturnWrapKeys)
if (oItem && sEmail === oItem.email) {
{ var self = this;
try return _.compact(_.flatten(_.map(aEncryptionKeyIds, function (oId) {
{ var oKey = oId && oId.toHex ? self.findPrivateKeyByHex(oId.toHex()) : null;
oKey = self.openpgp.key.readArmored(oItem.armor); return oKey ? (bReturnWrapKeys ? [oKey] : oKey.getNativeKeys()) : [null];
if (oKey && !oKey.err && oKey.keys && oKey.keys[0]) }), true));
{
return oKey.keys[0];
}
}
catch (e) {}
}
return null;
}));
}; };
/** /**
@ -77,6 +90,7 @@
PgpUserStore.prototype.findPrivateKeyByEmail = function (sEmail, sPassword) PgpUserStore.prototype.findPrivateKeyByEmail = function (sEmail, sPassword)
{ {
var var
oPrivateKeys = [],
oPrivateKey = null, oPrivateKey = null,
oKey = _.find(this.openpgpkeysPrivate(), function (oItem) { oKey = _.find(this.openpgpkeysPrivate(), function (oItem) {
return oItem && sEmail === oItem.email; return oItem && sEmail === oItem.email;
@ -85,18 +99,15 @@
if (oKey) if (oKey)
{ {
oPrivateKeys = oKey.getNativeKeys();
oPrivateKey = oPrivateKeys[0] || null;
try try
{ {
oPrivateKey = this.openpgp.key.readArmored(oKey.armor); if (oPrivateKey)
if (oPrivateKey && !oPrivateKey.err && oPrivateKey.keys && oPrivateKey.keys[0])
{ {
oPrivateKey = oPrivateKey.keys[0];
oPrivateKey.decrypt(Utils.pString(sPassword)); oPrivateKey.decrypt(Utils.pString(sPassword));
} }
else
{
oPrivateKey = null;
}
} }
catch (e) catch (e)
{ {
@ -116,6 +127,259 @@
return this.findPrivateKeyByEmail(require('Stores/User/Account').email(), sPassword); return this.findPrivateKeyByEmail(require('Stores/User/Account').email(), sPassword);
}; };
PgpUserStore.prototype.decryptMessage = function (oMessage, fCallback)
{
var self = this, aPrivateKeys = [], aEncryptionKeyIds = [];
if (oMessage && oMessage.getSigningKeyIds)
{
aEncryptionKeyIds = oMessage.getEncryptionKeyIds();
if (aEncryptionKeyIds)
{
aPrivateKeys = this.findPrivateKeysByEncryptionKeyIds(aEncryptionKeyIds, true);
if (aPrivateKeys && 0 < aPrivateKeys.length)
{
kn.showScreenPopup(require('View/Popup/MessageOpenPgp'), [function (oDecriptedKey) {
if (oDecriptedKey)
{
var oPrivateKey = null, oDecryptedMessage = null;
try
{
oDecryptedMessage = oMessage.decrypt(oDecriptedKey);
}
catch (e)
{
oDecryptedMessage = null;
}
if (oDecryptedMessage)
{
oPrivateKey = self.findPrivateKeyByHex(oDecriptedKey.primaryKey.keyid.toHex());
if (oPrivateKey)
{
self.verifyMessage(oDecryptedMessage, function (oValidKey, aSigningKeyIds) {
fCallback(oPrivateKey, oDecryptedMessage, oValidKey || null, aSigningKeyIds || null);
});
}
else
{
fCallback(oPrivateKey, oDecryptedMessage);
}
}
else
{
fCallback(oPrivateKey, oDecryptedMessage);
}
}
else
{
fCallback(null, null);
}
}, aPrivateKeys]);
return false;
}
}
}
fCallback(null, null);
return false;
};
PgpUserStore.prototype.verifyMessage = function (oMessage, fCallback)
{
var oValid = null, aResult = [], aPublicKeys = [], aSigningKeyIds = [];
if (oMessage && oMessage.getSigningKeyIds)
{
aSigningKeyIds = oMessage.getSigningKeyIds();
if (aSigningKeyIds && 0 < aSigningKeyIds.length)
{
aPublicKeys = this.findPublicKeysBySigningKeyIds(aSigningKeyIds);
if (aPublicKeys && 0 < aPublicKeys.length)
{
try
{
aResult = oMessage.verify(aPublicKeys);
oValid = _.find(_.isArray(aResult) ? aResult : [], function (oItem) {
return oItem && oItem.valid && oItem.keyid;
});
if (oValid && oValid.keyid && oValid.keyid && oValid.keyid.toHex)
{
fCallback(this.findPublicKeyByHex(oValid.keyid.toHex()));
return true;
}
}
catch (e) {}
}
fCallback(null, aSigningKeyIds);
return false;
}
}
fCallback(null);
return false;
};
/**
* @param {*} mDom
*/
PgpUserStore.prototype.controlsHelper = function (mDom, oVerControl, bSuccess, sTitle, sText)
{
if (bSuccess)
{
mDom.removeClass('error').addClass('success').attr('title', sTitle);
oVerControl.removeClass('error').addClass('success').attr('title', sTitle);
}
else
{
mDom.removeClass('success').addClass('error').attr('title', sTitle);
oVerControl.removeClass('success').addClass('error').attr('title', sTitle);
}
if (undefined !== sText)
{
mDom.text(Utils.trim(sText.replace(/(\u200C|\u0002)/g, '')));
}
};
/**
* @param {*} mDom
*/
PgpUserStore.prototype.initMessageBodyControls = function (mDom)
{
if (mDom && !mDom.hasClass('inited'))
{
mDom.addClass('inited');
var
self = this,
bEncrypted = mDom.hasClass('encrypted'),
bSigned = mDom.hasClass('signed'),
oVerControl = null,
sData = ''
;
if (bEncrypted || bSigned)
{
sData = mDom.text();
mDom.data('openpgp-original', sData);
if (bEncrypted)
{
oVerControl = $('<div class="b-openpgp-control"><i class="icon-lock"></i></div>')
.attr('title', Translator.i18n('MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC'));
oVerControl.on('click', function () {
if ($(this).hasClass('success'))
{
return false;
}
var oMessage = self.openpgp.message.readArmored(sData);
if (oMessage && oMessage.getText && oMessage.verify && oMessage.decrypt)
{
self.decryptMessage(oMessage, function (oValidPrivateKey, oDecriptedMessage, oValidPublicKey, aSigningKeyIds) {
if (oDecriptedMessage)
{
if (oValidPublicKey)
{
self.controlsHelper(mDom, oVerControl, true, Translator.i18n('PGP_NOTIFICATIONS/GOOD_SIGNATURE', {
'USER': oValidPublicKey.user + ' (' + oValidPublicKey.id + ')'
}), oDecriptedMessage.getText());
}
else if (oValidPrivateKey)
{
var
aKeyIds = Utils.isNonEmptyArray(aSigningKeyIds) ? aSigningKeyIds : null,
sAdditional = aKeyIds ? _.compact(_.map(aKeyIds, function (oItem) {
return oItem && oItem.toHex ? oItem.toHex() : null;
})).join(', ') : ''
;
self.controlsHelper(mDom, oVerControl, false,
Translator.i18n('PGP_NOTIFICATIONS/UNVERIFIRED_SIGNATURE') +
(sAdditional ? ' (' + sAdditional + ')' : ''),
oDecriptedMessage.getText());
}
else
{
self.controlsHelper(mDom, oVerControl, false,
Translator.i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR'));
}
}
else
{
self.controlsHelper(mDom, oVerControl, false,
Translator.i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR'));
}
});
return false;
}
self.controlsHelper(mDom, oVerControl, false, Translator.i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR'));
return false;
});
}
else if (bSigned)
{
oVerControl = $('<div class="b-openpgp-control"><i class="icon-lock"></i></div>')
.attr('title', Translator.i18n('MESSAGE/PGP_SIGNED_MESSAGE_DESC'));
oVerControl.on('click', function () {
if ($(this).hasClass('success') || $(this).hasClass('error'))
{
return false;
}
var oMessage = self.openpgp.cleartext.readArmored(sData);
if (oMessage && oMessage.getText && oMessage.verify)
{
self.verifyMessage(oMessage, function (oValidKey, aSigningKeyIds) {
if (oValidKey)
{
self.controlsHelper(mDom, oVerControl, true, Translator.i18n('PGP_NOTIFICATIONS/GOOD_SIGNATURE', {
'USER': oValidKey.user + ' (' + oValidKey.id + ')'
}), oMessage.getText());
}
else
{
var
aKeyIds = Utils.isNonEmptyArray(aSigningKeyIds) ? aSigningKeyIds : null,
sAdditional = aKeyIds ? _.compact(_.map(aKeyIds, function (oItem) {
return oItem && oItem.toHex ? oItem.toHex() : null;
})).join(', ') : ''
;
self.controlsHelper(mDom, oVerControl, false,
Translator.i18n('PGP_NOTIFICATIONS/UNVERIFIRED_SIGNATURE') +
(sAdditional ? ' (' + sAdditional + ')' : ''));
}
});
return false;
}
self.controlsHelper(mDom, oVerControl, false, Translator.i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR'));
return false;
});
}
if (oVerControl)
{
mDom.before(oVerControl).before('<div></div>');
}
}
}
};
module.exports = new PgpUserStore(); module.exports = new PgpUserStore();
}()); }());

View file

@ -407,6 +407,16 @@ html.rl-no-preview-pane {
display: inline-block; display: inline-block;
padding: 6px 10px; padding: 6px 10px;
border: 1px dashed #666; border: 1px dashed #666;
background: #fff;
&.success {
border-color: green;
background-color: rgba(0, 255, 0, 0.03);
}
&.error {
border-color: red;
background-color: rgba(255, 0, 0, 0.03);
}
} }
blockquote { blockquote {
@ -424,6 +434,27 @@ html.rl-no-preview-pane {
color: red; color: red;
} }
} }
.b-openpgp-control {
display: inline-block;
cursor: pointer;
color: #777;
/*float: left;*/
&:hover {
color: #111;
}
&.success {
color: green;
cursor: help;
}
&.error {
color: red;
}
}
} }
} }
} }

View file

@ -1,5 +1,5 @@
.popups { .popups {
.b-open-pgp-key-view-content, .b-open-pgp-key-generate-content, .b-open-pgp-key-add-content, .b-compose-open-pgp-content { .b-open-pgp-key-view-content, .b-open-pgp-key-generate-content, .b-open-pgp-key-add-content, .b-compose-open-pgp-content, .b-message-open-pgp-content {
.modal-header { .modal-header {
background-color: #fff; background-color: #fff;
@ -18,4 +18,35 @@
overflow: auto; overflow: auto;
} }
} }
.b-message-open-pgp-content {
&.modal {
width: 700px;
}
.key-list {
margin-top: 5px;
overflow: hidden;
&__item {
color: #555;
cursor: pointer;
text-overflow: ellipsis;
white-space: nowrap;
&__radio {
padding-right: 5px;
}
&__name {
&:hover {
border-bottom: 1px dashed #555;
}
}
}
}
}
} }

View file

@ -632,7 +632,7 @@
oEditor.setPlain(sResult); oEditor.setPlain(sResult);
}); });
}, },
this.oEditor.getData(), this.oEditor.getData(false, true),
this.currentIdentity(), this.currentIdentity(),
this.to(), this.to(),
this.cc(), this.cc(),

View file

@ -109,25 +109,20 @@
if (self.resultCallback && bResult) if (self.resultCallback && bResult)
{ {
try { var oPromise = null;
try
{
if (oPrivateKey && 0 === aPublicKeys.length) if (oPrivateKey && 0 === aPublicKeys.length)
{ {
self.resultCallback( oPromise = PgpStore.openpgp.signClearMessage([oPrivateKey], self.text());
PgpStore.openpgp.signClearMessage([oPrivateKey], self.text())
);
} }
else if (oPrivateKey && 0 < aPublicKeys.length) else if (oPrivateKey && 0 < aPublicKeys.length)
{ {
self.resultCallback( oPromise = PgpStore.openpgp.signAndEncryptMessage(aPublicKeys, oPrivateKey, self.text());
PgpStore.openpgp.signAndEncryptMessage(aPublicKeys, oPrivateKey, self.text())
);
} }
else if (!oPrivateKey && 0 < aPublicKeys.length) else if (!oPrivateKey && 0 < aPublicKeys.length)
{ {
self.resultCallback( oPromise = PgpStore.openpgp.encryptMessage(aPublicKeys, self.text());
PgpStore.openpgp.encryptMessage(aPublicKeys, self.text())
);
} }
} }
catch (e) catch (e)
@ -135,14 +130,30 @@
self.notification(Translator.i18n('PGP_NOTIFICATIONS/PGP_ERROR', { self.notification(Translator.i18n('PGP_NOTIFICATIONS/PGP_ERROR', {
'ERROR': '' + e 'ERROR': '' + e
})); }));
bResult = false;
} }
}
if (bResult) if (oPromise)
{ {
self.cancelCommand(); try
{
oPromise.then(function (mData) {
self.resultCallback(mData);
self.cancelCommand();
})['catch'](function (e) {
self.notification(Translator.i18n('PGP_NOTIFICATIONS/PGP_ERROR', {
'ERROR': '' + e
}));
});
}
catch (e)
{
self.notification(Translator.i18n('PGP_NOTIFICATIONS/PGP_ERROR', {
'ERROR': '' + e
}));
}
}
} }
self.submitRequest(false); self.submitRequest(false);

View file

@ -0,0 +1,179 @@
(function () {
'use strict';
var
_ = require('_'),
ko = require('ko'),
key = require('key'),
Utils = require('Common/Utils'),
Enums = require('Common/Enums'),
kn = require('Knoin/Knoin'),
AbstractView = require('Knoin/AbstractView')
;
/**
* @constructor
* @extends AbstractView
*/
function MessageOpenPgpPopupView()
{
AbstractView.call(this, 'Popups', 'PopupsMessageOpenPgp');
this.notification = ko.observable('');
this.selectedKey = ko.observable(null);
this.privateKeys = ko.observableArray([]);
this.password = ko.observable('');
this.password.focus = ko.observable(false);
this.buttonFocus = ko.observable(false);
this.resultCallback = null;
this.submitRequest = ko.observable(false);
// commands
this.doCommand = Utils.createCommand(this, function () {
this.submitRequest(true);
_.delay(_.bind(function() {
var
oPrivateKeys = [],
oPrivateKey = null
;
try
{
if (this.resultCallback && this.selectedKey())
{
oPrivateKeys = this.selectedKey().getNativeKeys();
oPrivateKey = oPrivateKeys && oPrivateKeys[0] ? oPrivateKeys[0] : null;
if (oPrivateKey)
{
try
{
if (!oPrivateKey.decrypt(Utils.pString(this.password())))
{
oPrivateKey = null;
}
}
catch (e)
{
oPrivateKey = null;
}
}
}
}
catch (oExc)
{
oPrivateKey = null;
}
this.submitRequest(false);
this.cancelCommand();
this.resultCallback(oPrivateKey);
}, this), 100);
}, function () {
return !this.submitRequest();
});
this.sDefaultKeyScope = Enums.KeyState.PopupMessageOpenPGP;
kn.constructorEnd(this);
}
kn.extendAsViewModel(['View/Popup/MessageOpenPgp'], MessageOpenPgpPopupView);
_.extend(MessageOpenPgpPopupView.prototype, AbstractView.prototype);
MessageOpenPgpPopupView.prototype.clearPopup = function ()
{
this.notification('');
this.password('');
this.password.focus(false);
this.buttonFocus(false);
this.selectedKey(false);
this.submitRequest(false);
this.resultCallback = null;
this.privateKeys([]);
};
MessageOpenPgpPopupView.prototype.onBuild = function (oDom)
{
key('tab,shift+tab', Enums.KeyState.PopupMessageOpenPGP, _.bind(function () {
switch (true)
{
case this.password.focus():
this.buttonFocus(true);
break;
case this.buttonFocus():
this.password.focus(true);
break;
}
return false;
}, this));
var self = this;
oDom
.on('click', '.key-list__item', function () {
oDom.find('.key-list__item .key-list__item__radio')
.addClass('icon-radio-unchecked')
.removeClass('icon-radio-checked')
;
$(this).find('.key-list__item__radio')
.removeClass('icon-radio-unchecked')
.addClass('icon-radio-checked')
;
self.selectedKey(ko.dataFor(this));
self.password.focus(true);
})
;
};
MessageOpenPgpPopupView.prototype.onHideWithDelay = function ()
{
this.clearPopup();
};
MessageOpenPgpPopupView.prototype.onShowWithDelay = function ()
{
this.password.focus(true);
// this.buttonFocus(true);
};
MessageOpenPgpPopupView.prototype.onShow = function (fCallback, aPrivateKeys)
{
this.clearPopup();
this.resultCallback = fCallback;
this.privateKeys(aPrivateKeys);
if (this.viewModelDom)
{
this.viewModelDom.find('.key-list__item').first().click();
}
};
module.exports = MessageOpenPgpPopupView;
}());

View file

@ -62,29 +62,36 @@
_.delay(function () { _.delay(function () {
mKeyPair = false; var mPromise = false;
try { try {
mKeyPair = PgpStore.openpgp.generateKeyPair({
mPromise = PgpStore.openpgp.generateKeyPair({
'userId': sUserID, 'userId': sUserID,
'numBits': Utils.pInt(self.keyBitLength()), 'numBits': Utils.pInt(self.keyBitLength()),
'passphrase': Utils.trim(self.password()) 'passphrase': Utils.trim(self.password())
}); });
} catch (e) {
// window.console.log(e);
}
if (mKeyPair && mKeyPair.privateKeyArmored) mPromise.then(function () {
{
oOpenpgpKeyring.privateKeys.importKey(mKeyPair.privateKeyArmored);
oOpenpgpKeyring.publicKeys.importKey(mKeyPair.publicKeyArmored);
oOpenpgpKeyring.store();
require('App/User').reloadOpenPgpKeys(); self.submitRequest(false);
Utils.delegateRun(self, 'cancelCommand');
} if (mKeyPair && mKeyPair.privateKeyArmored)
{
oOpenpgpKeyring.privateKeys.importKey(mKeyPair.privateKeyArmored);
oOpenpgpKeyring.publicKeys.importKey(mKeyPair.publicKeyArmored);
oOpenpgpKeyring.store();
require('App/User').reloadOpenPgpKeys();
Utils.delegateRun(self, 'cancelCommand');
}
})['catch'](function() {
self.submitRequest(false);
});
} catch (e) {}
self.submitRequest(false);
}, 100); }, 100);
return true; return true;

View file

@ -303,16 +303,6 @@
this.viewIsImportant = ko.observable(false); this.viewIsImportant = ko.observable(false);
this.viewIsFlagged = ko.observable(false); this.viewIsFlagged = ko.observable(false);
// PGP
this.viewPgpPassword = ko.observable('');
this.viewPgpSignedVerifyStatus = ko.computed(function () {
return this.message() ? this.message().pgpSignedVerifyStatus() : Enums.SignedVerifyStatus.None;
}, this);
this.viewPgpSignedVerifyUser = ko.computed(function () {
return this.message() ? this.message().pgpSignedVerifyUser() : '';
}, this);
this.viewFromDkimStatusIconClass = ko.computed(function () { this.viewFromDkimStatusIconClass = ko.computed(function () {
var sResult = 'icon-none iconcolor-display-none'; var sResult = 'icon-none iconcolor-display-none';
@ -361,8 +351,6 @@
this.messageActiveDom(null); this.messageActiveDom(null);
this.viewPgpPassword('');
if (oMessage) if (oMessage)
{ {
this.showAttachmnetControls(false); this.showAttachmnetControls(false);
@ -523,48 +511,6 @@
return sResult; return sResult;
}; };
MessageViewMailBoxUserView.prototype.isPgpActionVisible = function ()
{
return Enums.SignedVerifyStatus.Success !== this.viewPgpSignedVerifyStatus();
};
MessageViewMailBoxUserView.prototype.isPgpStatusVerifyVisible = function ()
{
return Enums.SignedVerifyStatus.None !== this.viewPgpSignedVerifyStatus();
};
MessageViewMailBoxUserView.prototype.isPgpStatusVerifySuccess = function ()
{
return Enums.SignedVerifyStatus.Success === this.viewPgpSignedVerifyStatus();
};
MessageViewMailBoxUserView.prototype.pgpStatusVerifyMessage = function ()
{
var sResult = '';
switch (this.viewPgpSignedVerifyStatus())
{
case Enums.SignedVerifyStatus.UnknownPublicKeys:
sResult = Translator.i18n('PGP_NOTIFICATIONS/NO_PUBLIC_KEYS_FOUND');
break;
case Enums.SignedVerifyStatus.UnknownPrivateKey:
sResult = Translator.i18n('PGP_NOTIFICATIONS/NO_PRIVATE_KEY_FOUND');
break;
case Enums.SignedVerifyStatus.Unverified:
sResult = Translator.i18n('PGP_NOTIFICATIONS/UNVERIFIRED_SIGNATURE');
break;
case Enums.SignedVerifyStatus.Error:
sResult = Translator.i18n('PGP_NOTIFICATIONS/DECRYPTION_ERROR');
break;
case Enums.SignedVerifyStatus.Success:
sResult = Translator.i18n('PGP_NOTIFICATIONS/GOOD_SIGNATURE', {
'USER': this.viewPgpSignedVerifyUser()
});
break;
}
return sResult;
};
MessageViewMailBoxUserView.prototype.fullScreen = function () MessageViewMailBoxUserView.prototype.fullScreen = function ()
{ {
this.fullScreenMode(true); this.fullScreenMode(true);
@ -1256,31 +1202,6 @@
return 0 < iCnt ? (100 > iCnt ? iCnt : '99+') : ''; return 0 < iCnt ? (100 > iCnt ? iCnt : '99+') : '';
}; };
/**
* @param {MessageModel} oMessage
*/
MessageViewMailBoxUserView.prototype.verifyPgpSignedClearMessage = function (oMessage)
{
if (oMessage)
{
oMessage.verifyPgpSignedClearMessage();
}
this.checkHeaderHeight();
};
/**
* @param {MessageModel} oMessage
*/
MessageViewMailBoxUserView.prototype.decryptPgpEncryptedMessage = function (oMessage)
{
if (oMessage)
{
oMessage.decryptPgpEncryptedMessage(this.viewPgpPassword());
}
};
/** /**
* @param {MessageModel} oMessage * @param {MessageModel} oMessage
*/ */

View file

@ -11,6 +11,7 @@ var
devVersion: '0.0.0', devVersion: '0.0.0',
releasesPath: 'build/dist/releases', releasesPath: 'build/dist/releases',
community: true, community: true,
watch: false,
rainloopBuilded: false, rainloopBuilded: false,
destPath: '', destPath: '',
@ -30,17 +31,22 @@ var
} }
}, },
_ = require('lodash'),
fs = require('node-fs'), fs = require('node-fs'),
path = require('path'), path = require('path'),
notifier = require('node-notifier'),
gulp = require('gulp'), gulp = require('gulp'),
concat = require('gulp-concat-util'), concat = require('gulp-concat-util'),
header = require('gulp-header'), header = require('gulp-header'),
eol = require('gulp-eol'),
stripbom = require('gulp-stripbom'), stripbom = require('gulp-stripbom'),
rename = require('gulp-rename'), rename = require('gulp-rename'),
replace = require('gulp-replace'), replace = require('gulp-replace'),
uglify = require('gulp-uglify'), uglify = require('gulp-uglify'),
notify = require("gulp-notify"),
plumber = require('gulp-plumber'), plumber = require('gulp-plumber'),
gulpif = require('gulp-if'),
eol = require('gulp-eol'),
gutil = require('gulp-util') gutil = require('gulp-util')
; ;
@ -136,7 +142,7 @@ cfg.paths.js = {
openpgp: { openpgp: {
name: 'openpgp.js', name: 'openpgp.js',
src: [ src: [
'vendors/openpgp/openpgp-0.7.2.min.js' 'vendors/openpgp/openpgp-0.10.1.min.js'
] ]
}, },
encrypt: { encrypt: {
@ -201,14 +207,17 @@ cfg.paths.js = {
// CSS // CSS
gulp.task('less:main', function() { gulp.task('less:main', function() {
var less = require('gulp-less'); var less = require('gulp-less');
return gulp.src(cfg.paths.less.main.src) return gulp.src(cfg.paths.less.main.src)
.pipe(gulpif(cfg.watch, plumber({errorHandler: notify.onError("Error: <%= error.message %>")})))
.pipe(less({ .pipe(less({
'paths': cfg.paths.less.main.options.paths 'paths': cfg.paths.less.main.options.paths
})) }))
.pipe(rename(cfg.paths.less.main.name)) .pipe(rename(cfg.paths.less.main.name))
.pipe(eol('\n', true)) .pipe(eol('\n', true))
.pipe(gulp.dest(cfg.paths.staticCSS)) .pipe(gulp.dest(cfg.paths.staticCSS))
.on('error', gutil.log); .on('error', gutil.log)
;
}); });
gulp.task('css:main-begin', ['less:main'], function() { gulp.task('css:main-begin', ['less:main'], function() {
@ -220,7 +229,6 @@ gulp.task('css:main-begin', ['less:main'], function() {
; ;
return gulp.src(cfg.paths.css.main.src) return gulp.src(cfg.paths.css.main.src)
.pipe(plumber())
.pipe(concat(cfg.paths.css.main.name)) .pipe(concat(cfg.paths.css.main.name))
.pipe(autoprefixer('last 3 versions', '> 1%', 'ie 9', 'Firefox ESR', 'Opera 12.1')) .pipe(autoprefixer('last 3 versions', '> 1%', 'ie 9', 'Firefox ESR', 'Opera 12.1'))
// .pipe(csscomb()) // .pipe(csscomb())
@ -252,7 +260,6 @@ gulp.task('css:main', ['css:clear-less']);
gulp.task('css:main:min', ['css:main'], function() { gulp.task('css:main:min', ['css:main'], function() {
var minifyCss = require('gulp-minify-css'); var minifyCss = require('gulp-minify-css');
return gulp.src(cfg.paths.staticCSS + cfg.paths.css.main.name) return gulp.src(cfg.paths.staticCSS + cfg.paths.css.main.name)
.pipe(plumber())
.pipe(minifyCss({ .pipe(minifyCss({
'keepSpecialComments': 0 'keepSpecialComments': 0
})) }))
@ -330,10 +337,51 @@ gulp.task('js:webpack', ['js:webpack:clear'], function(callback) {
} }
webpack(webpackCfg, function(err, stats) { webpack(webpackCfg, function(err, stats) {
if (err) {
throw new gutil.PluginError('webpack', err); var
fN = function (err) {
if (err)
{
gutil.log('[webpack]', '---');
gutil.log('[webpack]', err.error ? err.error.toString() : '');
gutil.log('[webpack]', err.message || '');
gutil.log('[webpack]', '---');
notifier.notify({
'sound': true,
'title': 'webpack',
'message': err.error ? err.error.toString() : err.message
});
}
}
;
if (err)
{
if (cfg.watch)
{
fN(err);
}
else
{
throw new gutil.PluginError('webpack', err);
}
} }
gutil.log('[webpack]', stats.toString({})); else if (stats && stats.compilation && stats.compilation.errors &&
stats.compilation.errors[0])
{
if (cfg.watch)
{
_.each(stats.compilation.errors, function (err) {
fN(err);
});
}
else
{
throw new gutil.PluginError('webpack', stats.compilation.errors[0]);
}
}
callback(); callback();
}); });
}); });
@ -616,11 +664,13 @@ gulp.task('owncloud+', ['package:community-off', 'owncloud-']);
//WATCH //WATCH
gulp.task('watch', ['fast'], function() { gulp.task('watch', ['fast'], function() {
cfg.watch = true;
gulp.watch(cfg.paths.globjs, {interval: 1000}, ['js:app', 'js:admin']); gulp.watch(cfg.paths.globjs, {interval: 1000}, ['js:app', 'js:admin']);
gulp.watch(cfg.paths.less.main.watch, {interval: 1000}, ['css:main']); gulp.watch(cfg.paths.less.main.watch, {interval: 1000}, ['css:main']);
}); });
gulp.task('watch+', ['fast+'], function() { gulp.task('watch+', ['fast+'], function() {
cfg.watch = true;
gulp.watch(cfg.paths.globjs, {interval: 1000}, ['js:app', 'js:admin']); gulp.watch(cfg.paths.globjs, {interval: 1000}, ['js:app', 'js:admin']);
gulp.watch(cfg.paths.less.main.watch, {interval: 1000}, ['css:main']); gulp.watch(cfg.paths.less.main.watch, {interval: 1000}, ['css:main']);
}); });

View file

@ -1,76 +1,78 @@
{ {
"name": "RainLoop", "name": "RainLoop",
"title": "RainLoop Webmail", "title": "RainLoop Webmail",
"version": "1.9.1", "version": "1.9.1",
"release": "335", "release": "335",
"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",
"author": { "author": {
"name": "RainLoop Team", "name": "RainLoop Team",
"email": "support@rainloop.net", "email": "support@rainloop.net",
"web": "http://rainloop.net" "web": "http://rainloop.net"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/RainLoop/rainloop-webmail.git" "url": "git://github.com/RainLoop/rainloop-webmail.git"
}, },
"licenses": [ "licenses": [
{ {
"type": "AGPL 3.0", "type": "AGPL 3.0",
"ulr": "http://www.gnu.org/licenses/agpl-3.0.html" "ulr": "http://www.gnu.org/licenses/agpl-3.0.html"
}, },
{ {
"type": "RainLoop Software License", "type": "RainLoop Software License",
"ulr": "http://www.rainloop.net/licensing/" "ulr": "http://www.rainloop.net/licensing/"
} }
], ],
"bugs": { "bugs": {
"url": "https://github.com/RainLoop/rainloop-webmail/issues" "url": "https://github.com/RainLoop/rainloop-webmail/issues"
}, },
"keywords": [ "keywords": [
"webmail", "webmail",
"php", "php",
"simple", "simple",
"modern", "modern",
"mail", "mail",
"web-based", "web-based",
"email", "email",
"client", "client",
"plugins" "plugins"
], ],
"readmeFilename": "README.md", "readmeFilename": "README.md",
"ownCloudPackageVersion": "4.3", "ownCloudPackageVersion": "4.3",
"engines": { "engines": {
"node": ">= 0.10.0" "node": ">= 0.10.0"
}, },
"devDependencies": { "devDependencies": {
"node-fs": "*",
"node-fs": "*", "rimraf": "*",
"rimraf": "*", "jshint-summary": "*",
"jshint-summary": "*", "webpack": "*",
"gulp": "*",
"webpack": "*", "gulp-util": "*",
"gulp-uglify": "*",
"gulp": "*", "gulp-rimraf": "*",
"gulp-util": "*", "gulp-jshint": "*",
"gulp-uglify": "*", "gulp-less": "1.3.6",
"gulp-rimraf": "*", "gulp-zip": "*",
"gulp-jshint": "*", "gulp-rename": "*",
"gulp-less": "1.3.6", "gulp-replace": "*",
"gulp-zip": "*", "gulp-header": "*",
"gulp-rename": "*", "gulp-eol": "*",
"gulp-replace": "*", "gulp-stripbom": "*",
"gulp-header": "*", "gulp-minify-css": "*",
"gulp-eol": "*", "gulp-autoprefixer": "*",
"gulp-stripbom": "*", "gulp-csscomb": "*",
"gulp-minify-css": "*", "gulp-closure-compiler": "*",
"gulp-autoprefixer": "*", "gulp-csslint": "*",
"gulp-csscomb": "*", "gulp-beautify": "*",
"gulp-closure-compiler": "*", "gulp-plumber": "*",
"gulp-csslint": "*", "gulp-concat-util": "*",
"gulp-beautify": "*", "gulp-notify": "~2.2.0",
"gulp-plumber": "*", "gulp-through": "~0.3.0",
"gulp-concat-util": "*" "lodash": "~3.9.3",
} "gulp-if": "~1.2.5",
"node-notifier": "~4.2.3"
}
} }

View file

@ -460,6 +460,7 @@ class PdoAddressBook
$this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV'); $this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
$aResponse = null;
try try
{ {
$aResponse = $oClient->propFind($sPath, array( $aResponse = $oClient->propFind($sPath, array(

View file

@ -38,7 +38,7 @@
</div> </div>
</form> </form>
<div class="e-powered thm-powered" data-bind="visible: logoPowered"> <div class="e-powered thm-powered" data-bind="visible: logoPowered">
Powered by <a href="http://rainloop.net" target="_blank">RainLoop</a> Powered by <a href="http://www.rainloop.net" target="_blank">RainLoop</a>
</div> </div>
</center> </center>
</div> </div>

View file

@ -68,7 +68,7 @@
<span data-i18n="TAB_LICENSING/BUTTON_ACTIVATE"></span> <span data-i18n="TAB_LICENSING/BUTTON_ACTIVATE"></span>
</a> </a>
&nbsp;&nbsp; &nbsp;&nbsp;
<a class="btn" href="http://rainloop.net/purchase/" target="_black"> <a class="btn" href="http://www.rainloop.net/purchase/" target="_black">
<i class="icon-purchase"></i> <i class="icon-purchase"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span data-i18n="TAB_LICENSING/BUTTON_PURCHASE"></span> <span data-i18n="TAB_LICENSING/BUTTON_PURCHASE"></span>

View file

@ -116,7 +116,7 @@
</form> </form>
</div> </div>
<div class="e-powered thm-powered" data-bind="visible: logoPowered"> <div class="e-powered thm-powered" data-bind="visible: logoPowered">
Powered by <a href="http://rainloop.net" target="_blank">RainLoop</a> Powered by <a href="http://www.rainloop.net" target="_blank">RainLoop</a>
</div> </div>
<div class="e-languages thm-languages" data-bind="visible: allowLanguagesOnLogin() && socialLoginEnabled()"> <div class="e-languages thm-languages" data-bind="visible: allowLanguagesOnLogin() && socialLoginEnabled()">
<label class="flag-selector"> <label class="flag-selector">

View file

@ -330,25 +330,6 @@
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n text" data-i18n="MESSAGE/BUTTON_NOTIFY_READ_RECEIPT"></span> <span class="i18n text" data-i18n="MESSAGE/BUTTON_NOTIFY_READ_RECEIPT"></span>
</div> </div>
<div class="pgpInfo" data-bind="visible: isPgpStatusVerifyVisible(), css: {'success': isPgpStatusVerifySuccess()}">
<i class="icon-key"></i>
&nbsp;&nbsp;
<span data-bind="text: pgpStatusVerifyMessage()"></span>
</div>
<div class="pgpSigned" data-bind="visible: message() && message().isPgpSigned() && isPgpActionVisible(), click: function() { verifyPgpSignedClearMessage(message()); }">
<i class="icon-lock"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n="MESSAGE/PGP_SIGNED_MESSAGE_DESC"></span>
</div>
<div class="pgpEncrypted" data-bind="visible: message() && message().isPgpEncrypted() && isPgpActionVisible()">
<i class="icon-lock"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n="MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC" data-bind="click: function() { decryptPgpEncryptedMessage(message()); }"></span>
&nbsp;&nbsp;
<input type="password" class="i18n span3 inputPgpPassword"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
style="margin-bottom: 0" data-i18n="[placeholder]MESSAGE/PGP_PASSWORD_INPUT_PLACEHOLDER" data-bind="value: viewPgpPassword, onEnter: function() { decryptPgpEncryptedMessage(message()); }" />
</div>
<div class="attachmentsPlace" data-bind="visible: message() && message().hasVisibleAttachments(), <div class="attachmentsPlace" data-bind="visible: message() && message().hasVisibleAttachments(),
css: {'selection-mode' : showAttachmnetControls, 'unselectedAttachmentsError': highlightUnselectedAttachments}"> css: {'selection-mode' : showAttachmnetControls, 'unselectedAttachmentsError': highlightUnselectedAttachments}">
<ul class="attachmentList" data-bind="foreach: message() ? message().attachments() : []"> <ul class="attachmentList" data-bind="foreach: message() ? message().attachments() : []">

View file

@ -0,0 +1,48 @@
<div class="popups">
<div class="modal hide b-message-open-pgp-content g-ui-user-select-none" data-bind="modal: modalVisibility">
<div>
<div class="modal-header">
<button type="button" class="close" data-bind="command: cancelCommand">&times;</button>
<h3>
<span class="i18n" data-i18n="POPUPS_MESSAGE_OPEN_PGP/TITLE_MESSAGE_OPEN_PGP"></span>
</h3>
</div>
<div class="modal-body">
<div class="form-horizontal">
<div class="alert" data-bind="visible: '' !== notification()">
<span data-bind="text: notification"></span>
</div>
<br />
<div class="control-group">
<label class="i18n control-label" data-i18n="POPUPS_MESSAGE_OPEN_PGP/LABEL_KEY"></label>
<div class="controls key-list" data-bind="foreach: privateKeys" style="margin-top: 5px">
<div class="key-list__item">
<i class="key-list__item__radio icon-radio-unchecked"></i>
<span class="key-list__item__name">
<span data-bind="text: user"></span>
&nbsp;
<span>[<span data-bind="text: id"></span>]</span>
</span>
</div>
<!--<div data-bind="json: $data"></div>-->
</div>
</div>
<div class="control-group">
<label class="i18n control-label" data-i18n="POPUPS_MESSAGE_OPEN_PGP/LABEL_PASSWORD"></label>
<div class="controls">
<input type="password" class="inputPassword input-xlarge" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: password, hasfocus: password.focus, onEnter: doCommand" />
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn buttonDo" data-bind="command: doCommand, hasfocus: buttonFocus">
<i data-bind="css: {'icon-key': !submitRequest(), 'icon-spinner animated': submitRequest()}"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n="POPUPS_MESSAGE_OPEN_PGP/BUTTON_DECRYPT"></span>
</button>
</div>
</div>
</div>
</div>

View file

@ -9,12 +9,12 @@
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n="SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY"></span> <span class="i18n" data-i18n="SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY"></span>
</a> </a>
&nbsp;&nbsp; <!-- &nbsp;&nbsp;
<a class="btn" data-bind="click: generateOpenPgpKey"> <a class="btn" data-bind="click: generateOpenPgpKey">
<i class="icon-key"></i> <i class="icon-key"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n="SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS"></span> <span class="i18n" data-i18n="SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS"></span>
</a> </a>-->
<br /> <br />
<br /> <br />
<br /> <br />

View file

@ -0,0 +1,321 @@
[LOGIN]
LABEL_LOGIN = "Login"
LABEL_PASSWORD = "Hasło"
BUTTON_LOGIN = "Zaloguj"
[TOP_PANEL]
LABEL_PREMIUM = "Premium"
LABEL_ADMIN_PANEL = "Panel administracyjny"
[TABS_LABELS]
LABEL_GENERAL_NAME = "Ogólne"
LABEL_LOGIN_NAME = "Login"
LABEL_BRANDING_NAME = "Personalizacja"
LABEL_CONTACTS_NAME = "Kontakty"
LABEL_DOMAINS_NAME = "Domeny"
LABEL_SECURITY_NAME = "Bezpieczeństwo"
LABEL_INTEGRATION_NAME = "Integracja"
LABEL_PLUGINS_NAME = "Wtyczki"
LABEL_PACKAGES_NAME = "Zarządzanie wtyczkami"
LABEL_LICENSING_NAME = "Licencjonowanie"
LABEL_ABOUT_NAME = "O skrypcie"
[TAB_GENERAL]
LEGEND_INTERFACE = "Interfejs"
LABEL_LANGUAGE = "Język:"
LABEL_LANGUAGE_ADMIN = "Język (admin):"
LABEL_THEME = "Motyw:"
LABEL_ALLOW_LANGUAGES_ON_SETTINGS = "Zezwól użytkownikowi na wybór języka"
LABEL_ALLOW_THEMES_ON_SETTINGS = "Zezwól użytkownikowi na zmianę motywu"
LABEL_ALLOW_BACKGROUND_ON_SETTINGS = "Zezwól użytkownikowi na użycie własnego tła"
LABEL_SHOW_THUMBNAILS = "Pokaż miniatury (załączniki)"
LABEL_ALLOW_GRAVATAR = "Zezwól na używanie gravatarów"
LEGEND_MAIN = "Główne"
LABEL_ATTACHMENT_SIZE_LIMIT = "Maks. rozmiar zał.:"
LABEL_ALLOW_ADDITIONAL_ACCOUNTS = "Zezwól na dodatkowe konta"
LABEL_ALLOW_IDENTITIES = "Zezwól na posiadanie wielu tożsamości"
LABEL_ALLOW_TEMPLATES = "Zezwól na używanie szablonów"
ALERT_WARNING = "Ostrzeżenie!"
HTML_ALERT_WEAK_PASSWORD = "Korzystasz z domyślnego hasła administratora.
<br />
Ze względów bezpieczeństwa, proszę
<strong><a href=\"#/security\">zmienić hasło</a></strong>
na inne."
[TAB_LOGIN]
LEGEND_LOGIN_SCREEN = "Logowanie"
LABEL_DEFAULT_DOMAIN = "Domyślna domena:"
LABEL_DETERMINE_USER_DOMAIN = "Spróbuj określić domenę użytkownika"
LABEL_ALLOW_LANGUAGES_ON_LOGIN = "Zezwól na zmianę języka podczas logowania"
LABEL_DETERMINE_USER_LANGUAGE = "Spróbuj określić język użytkownika"
[TAB_BRANDING]
LEGEND_BRANDING = "Personalizacja"
LABEL_PAGE_TITLE = "Tytuł strony:"
LABEL_LOADING_DESCRIPTION = "Komunikat ład. strony:"
LEGEND_LOGIN = "Login"
LABEL_LOGIN_LOGO = "Logo:"
LABEL_LOGIN_DESCRIPTION = "Opis:"
LABEL_LOGIN_BACKGROUND = "Tło:"
LABEL_LOGIN_CUSTOM_CSS = "Własny arkusz stylów:"
LABEL_LOGIN_SHOW_POWERED_LINK = "Pokaż link: \"Powered by RainLoop\""
LEGEND_USER = "Użytkownik"
LABEL_USER_LOGO = "Logo:"
LABEL_USER_LOGO_TITLE = "Tytuł loga:"
LABEL_USER_LOGO_MESSAGE = "Logo (widok wiad.)"
LABEL_USER_CUSTOM_CSS = "Własny arkusz stylów:"
LEGEND_WELCOME_PAGE = "Str. główna"
LABEL_WELCOME_PAGE_TITLE = "Tytuł:"
LABEL_WELCOME_PAGE_URL = "Adres URL:"
LABEL_WELCOME_PAGE_DISPLAY = "Wyświetl:"
OPTION_WELCOME_PAGE_DISPLAY_NONE = "nigdy"
OPTION_WELCOME_PAGE_DISPLAY_ONCE = "raz"
OPTION_WELCOME_PAGE_DISPLAY_ALWAYS = "zawsze"
HTML_ALERT_PREMIUM = "Ta opcja jest dostępna tylko dla licencji <strong><a href=\"#/licensing\">premium</a></strong>."
[TAB_CONTACTS]
LEGEND_CONTACTS = "Kontakty"
LEGEND_STORAGE = "Baza danych (PDO)"
LABEL_ENABLE_CONTACTS = "Włącz kontakty"
LABEL_ALLOW_SYNC = "Zezwól na synchronizację kontaktów (przy użyciu zewnętrznego serwera CardDAV)"
LABEL_STORAGE_TYPE = "Typ:"
LABEL_STORAGE_DSN = "Adres DSN:"
LABEL_STORAGE_USER = "Użytkownik:"
LABEL_STORAGE_PASSWORD = "Hasło:"
BUTTON_TEST = "Testuj"
ALERT_NOTICE = "Powiadomienie!"
HTML_ALERT_DO_NOT_USE_THIS_DATABASE = "Nie używaj tej bazy danych z dużą ilością aktywnych użytkowników."
HTML_ALERT_DOES_NOT_SUPPORTED = "Twój system nie zawiera wsparcia dla obsługi kontaktów.
<br />
Musisz zainstalować lub uruchomić na serwerze jedno z <strong>rozszerzeń PDO (SQLite / MySQL / PostgreSQL)</strong>."
[TAB_DOMAINS]
LEGEND_DOMAINS = "Domeny"
BUTTON_ADD_DOMAIN = "Dodaj domenę"
DELETE_ARE_YOU_SURE = "Czy na pewno?"
HTML_DOMAINS_HELPER = "Lista domen, do których można uzyskać dostęp poprzez tego klienta.
<br />Kliknij na nazwę, aby skonfigurować domenę."
[TAB_SECURITY]
LEGEND_SECURITY = "Bezpieczeństwo"
LABEL_ALLOW_TWO_STEP = "Zezwól na dwuskładnikową autoryzację"
LABEL_FORCE_TWO_STEP = "Wymuś dwuskładnikową autoryzację"
LABEL_USE_IMAGE_PROXY = "Użyj lokalnego serwera proxy dla zewnętrznych obrazów"
LABEL_ALLOW_OPEN_PGP = "Zezwól na użycie OpenPGP"
LABEL_SHOW_PHP_INFO = "Pokaż informacje o wersji PHP"
LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS = "Dane dostępowe panelu administracyjnego"
LABEL_CURRENT_PASSWORD = "Bieżące hasło:"
LABEL_NEW_LOGIN = "Nowy login:"
LABEL_NEW_PASSWORD = "Nowe hasło:"
LABEL_REPEAT_PASSWORD = "Powtórz hasło:"
BUTTON_UPDATE_PASSWORD = "Zaktualizuj hasło"
LEGEND_SSL = "SSL"
LABEL_REQUIRE_VERIFICATION = "Wymagaj sprawdzania poprawności certyfikatów SSL (IMAP/SMTP)"
LABEL_ALLOW_SELF_SIGNED = "Zezwól na używanie certyfikatów podpisanych przez siebie"
[TAB_INTEGRATIONS]
LEGEND_GOOGLE = "Google"
LABEL_ENABLE_GOOGLE = "Włącz obsługę platformy Google"
LABEL_GOOGLE_AUTH = "Autoryzacja"
LABEL_GOOGLE_DRIVE = "Obsługa dysku Google (widok tworz. wiadomości)"
LABEL_GOOGLE_PREVIEW = "Obsługa przeglądarki Google (podgląd dla plików: Microsoft Word, Excel i PowerPoint)"
LABEL_GOOGLE_CLIENT_ID = "Identyfikator:"
LABEL_GOOGLE_CLIENT_SECRET = "Hasło:"
LABEL_GOOGLE_API_KEY = "Klucz API:"
HINT_GOOGLE_API_KEY = "Wymagane dla obsługi interfejsu usługi: 'Dysk Google'"
LEGEND_FACEBOOK = "Facebook"
LABEL_ENABLE_FACEBOOK = "Włącz obsługę platformy Facebook (autoryzacja)"
LABEL_FACEBOOK_APP_ID = "Identyfikator aplikacji:"
LABEL_FACEBOOK_APP_SECRET = "Hasło aplikacji:"
LEGEND_TWITTER = "Twitter"
LABEL_ENABLE_TWITTER = "Włącz obsługę platformy Twitter (autoryzacja)"
LABEL_TWITTER_CONSUMER_KEY = "Klucz użytkownika:"
LABEL_TWITTER_CONSUMER_SECRET = "Hasło użytkownika:"
LEGEND_DROPBOX = "Dropbox"
LABEL_ENABLE_DROPBOX = "Włącz obsługę platformy Dropbox"
LABEL_DROPBOX_API_KEY = "Klucz API:"
TOP_ALERT = "Szczegółowe informacje na temat obsługi platform, można znaleźść pod adresem: "
[TAB_PLUGINS]
LEGEND_PLUGINS = "Wtyczki"
LABEL_ENABLE_PLUGINS = "Włącz obsługę wtyczek"
ALERT_NO_PLUGINS = "Nie zainstalowano żadnych wtyczek."
LINK_INSTALL_NEW = "Kliknij tutaj, aby zainstalować nowe wtyczki!"
HINT_CLICK_NAME = "Kliknij na nazwę, aby skonfigurować wtyczkę."
[TAB_PACKAGES]
LEGEND_AVAILABLE_FOR_UPDATE = "Aktualizacja"
LEGEND_AVAILABLE_FOR_INSTALLATION = "Do zainstalowania"
LEGEND_INSTALLED_PACKAGES = "Zainstalowane"
ALERT_CANNOT_ACCESS_REPOSITORY = "Nie można uzyskać dostępu do repozytorium."
[TAB_LICENSING]
LABEL_YOUR_DOMAIN = "Domena:"
LABEL_VERSION = "Wersja:"
LABEL_CHECKING = "sprawdzanie..."
TYPE_BASIC_HINT = "Ta domena nie jest licencjonowana do użytku komercyjnego."
TYPE_BASIC_HINT_2 = "Nie można dodać licencji dla tej domeny."
HTML_ALERT_TOP_1 = "RainLoop Webmail korzysta z licencji:"
HTML_ALERT_TOP_2 = "Możesz używać tego klienta <b>za darmo</b>, tylko dla prywatnych <b>(własnych)</b> projektów."
HTML_ALERT_TOP_3 = "Do komercyjnego użytku (używania dodatkowych opcji) <b>RainLoop Webmail</b>, wymagane jest posiadanie
<a href=http://www.rainloop.net/purchase/ target=_blank>ważnej subskrypcji</a>."
TYPE_PREMIUM_LIFETIME = "Dożywotnia"
TYPE_PREMIUM_HINT = "Ta domena nie jest licencjonowana dla użytku komercyjnego."
LABEL_SUB_EXPIRES = "Subskrypcja wygasa:"
BUTTON_ACTIVATE = "Aktywuj klucz"
BUTTON_PURCHASE = "Kup klucz"
BUTTON_TRIAL = "Wersja testowa"
[TAB_ABOUT]
LEGEND_ABOUT = "O skrypcie"
LABEL_TAG_HINT = "Prosty, nowoczesny i szybki klient pocztowy"
LABEL_ALL_RIGHTS_RESERVED = "Wszystkie prawa zastrzeżone."
HINT_READ_CHANGE_LOG = "Przed aktualizacją, proszę przeczytać listę zmian."
HINT_IS_UP_TO_DATE = "Klient RainLoop jest aktualny."
HTML_NEW_VERSION = "Dostępna jest nowa wersja: <b>%VERSION%</b>."
LABEL_UPDATING = "Aktualizowanie..."
LABEL_CHECKING = "Szukanie aktualizacji..."
BUTTON_UPDATE = "Zaktualizuj"
BUTTON_DOWNLOAD = "Pobierz"
BUTTON_CHANGELOG = "Lista zmian"
[POPUPS_ACTIVATE]
TITLE_ACTIVATE = "Aktywacja klucza subskrypcji"
TITLE_ACTIVATION = "Aktywowanie..."
LABEL_DOMAIN = "Domena:"
LABEL_SUB_KEY = "Klucz subskrypcji:"
BUTTON_ACTIVATE = "Aktywuj"
LABEL_ACTIVATED = "Aktywowano"
ERROR_INVALID_SUBS_KEY = "Niepoprawny klucz subskrypcji"
SUBS_KEY_ACTIVATED = "Aktywowano klucz subskrypcji"
HTML_DESC = "Subskrypcja premium dla domeny: <b>%DOMAIN%</b>, zostanie przedłużona po aktywacji.
<br />
Zwróc uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny.
<br /><br />
Po uruchomieniu aktywacji, nie można jej przerwac lub anulować."
[POPUPS_DOMAIN]
TITLE_ADD_DOMAIN = "Dodawanie domeny"
TITLE_ADD_DOMAIN_WITH_NAME = "Dodawanie domeny: \"%NAME%\""
TITLE_EDIT_DOMAIN = "Edycja domeny: \"%NAME%\""
LABEL_NAME = "Nazwa"
NAME_HELPER = "obsługiwany znak wieloznaczności - *"
LABEL_IMAP = "IMAP"
LABEL_SMTP = "SMTP"
LABEL_SIEVE = "SIEVE"
LABEL_SERVER = "Serwer:"
LABEL_PORT = "Port:"
LABEL_SECURE = "Rodzaj połączenia:"
LABEL_WHITE_LIST = "Biała lista"
SECURE_OPTION_NONE = "Bez zabezpieczeń"
SECURE_OPTION_SSL = "SSL/TLS"
SECURE_OPTION_STARTTLS = "STARTTLS"
LABEL_ALLOW_SIEVE_SCRIPTS = "Zezwól na skrypty sieve"
LABEL_ALLOW_USER_SCRIPT = "Zezwól na spersonalizowany skrypt użytkownika"
LABEL_USE_SHORT_LOGIN = "Użyj krótkiego loginu"
LABEL_USE_AUTH = "Użyj autoryzacji"
LABEL_USE_PHP_MAIL = "Użyj funkcji php: 'mail()'"
BUTTON_TEST = "Test"
BUTTON_WHITE_LIST = "Biała lista"
BUTTON_SIEVE_CONFIGURATION = "Konfiguracja sieve"
BUTTON_BACK_TO_IMAP = "Powrót do ustawień serwera IMAP"
BUTTON_BACK = "Wstecz"
BUTTON_CLOSE = "Zamknij"
BUTTON_ADD = "Dodaj"
BUTTON_UPDATE = "Zaktualizuj"
WHITE_LIST_ALERT = "Lista użytkowników domeny, którzy mogą uzyskać dostęp poprzez tego klienta.
Użyj spacji do rozdzielenia."
[POPUPS_PLUGIN]
TITLE_PLUGIN = "Wtyczka: "
DESC_NOTHING_TO_CONFIGURE = "Brak opcji do skonfigurowania"
BUTTON_CLOSE = "Zamknij"
BUTTON_SAVE = "Zapisz"
TOOLTIP_ABOUT_TITLE = "O wtyczce"
[POPUPS_ASK]
BUTTON_YES = "Tak"
BUTTON_NO = "Nie"
DESC_WANT_CLOSE_THIS_WINDOW = "Czy na pewno chcesz zamknąć to okno?"
DESC_WANT_DELETE_MESSAGES = "Czy na pewno chcesz usunąć tą wiadomość(-i)?"
[POPUPS_LANGUAGES]
TITLE_LANGUAGES = "Wybierz swój język"
[HINTS]
BETA = "Beta"
UNSTABLE = "Niestabilna"
WARNING = "Ostrzeżenie!"
NOT_SUPPORTED = "nieobsługiwana"
REQUIRES_PHP_54 = "Wymaga PHP w wersji 5.4 lub wyższej"
[ERRORS]
DOMAIN_ALREADY_EXISTS = "Ta domena już istnieje"
UNKNOWN_ERROR = "Nieznany błąd"
[NOTIFICATIONS]
INVALID_TOKEN = "Nieważny token"
AUTH_ERROR = "Autoryzacja zakończona niepowodzeniem"
ACCESS_ERROR = "Błąd dostępu"
CONNECTION_ERROR = "Nie można połączyć się z serwerem"
CAPTCHA_ERROR = "Niepoprawny kod CAPTCHA."
SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta."
SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta."
SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta."
DOMAIN_NOT_ALLOWED = "Brak zezwolenia na użycie tej domeny"
ACCOUNT_NOT_ALLOWED = "Brak zezwolenia dla tego konta"
ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Wymagana dwuskładnikowa autoryzacja"
ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Błąd autoryzacji dwuskładnikowej"
COULD_NOT_SAVE_NEW_PASSWORD = "Nie można było zapisać nowego hasła"
CURRENT_PASSWORD_INCORRECT = "Bieżące hasło jest niepoprawne"
NEW_PASSWORD_SHORT = "Wybrane hasło jest za krótkie"
NEW_PASSWORD_WEAK = "Wybrane hasło jest zbyt proste"
NEW_PASSWORD_FORBIDDENT = "Wybrane hasło zawiera zakazane znaki"
CONTACTS_SYNC_ERROR = "Błąd synchronizacji kontaktów"
CANT_GET_MESSAGE_LIST = "Nie można pobrać listy wiadomości"
CANT_GET_MESSAGE = "Nie można pobrać wiadomości"
CANT_DELETE_MESSAGE = "Nie można usunąć wiadomości"
CANT_MOVE_MESSAGE = "Nie można przenieść wiadomości"
CANT_SAVE_MESSAGE = "Nie można zapisać wiadomości"
CANT_SEND_MESSAGE = "Nie można wysłać wiadomości"
INVALID_RECIPIENTS = "Niepoprawny adres odbiorcy"
CANT_SAVE_FILTERS = "Nie można zapisać filtrów"
CANT_GET_FILTERS = "Nie można pobrać filtrów"
FILTERS_ARE_NOT_CORRECT = "Brak poprawności filtrów"
CANT_CREATE_FOLDER = "Nie można utworzyć folderu"
CANT_RENAME_FOLDER = "Nie można zmienić nazwy folderu"
CANT_DELETE_FOLDER = "Nie można usunąć folderu"
CANT_DELETE_NON_EMPTY_FOLDER = "Nie można usunąć folderu, w którym znajduje się zawartość"
CANT_SUBSCRIBE_FOLDER = "Nie można zasubskrybować folderu"
CANT_UNSUBSCRIBE_FOLDER = "Nie można usunąć subskrypcji folderu"
CANT_SAVE_SETTINGS = "Nie można zapisać ustawień"
CANT_SAVE_PLUGIN_SETTINGS = "Nie można zapisać ustawień wtyczki"
DOMAIN_ALREADY_EXISTS = "Ta domena już istnieje"
CANT_INSTALL_PACKAGE = "Instalacja wtyczki zakończona niepowodzeniem"
CANT_DELETE_PACKAGE = "Usunięcie wtyczki zakończone niepowodzeniem"
INVALID_PLUGIN_PACKAGE = "Niepoprawna wtyczka"
UNSUPPORTED_PLUGIN_PACKAGE = "Nieobsługiwana wtyczka"
LICENSING_SERVER_IS_UNAVAILABLE = "Serwer aktywacji subskrypcji jest niedostępny"
LICENSING_DOMAIN_EXPIRED = "Subskrypcja dla tej domeny wygasła."
LICENSING_DOMAIN_BANNED = "Subskrypcja dla tej domeny została zawieszona."
DEMO_SEND_MESSAGE_ERROR = "Ze względów bezpieczeństwa, to konto nie posiada zezwolenia na wysyłanie wiadomości na zewnętrzne adresy e-mail!"
DEMO_ACCOUNT_ERROR = "Ze względów bezpieczeństwa, to konto nie posiada uprawnień do wykonania tego zadania!"
ACCOUNT_ALREADY_EXISTS = "To konto już istnieje"
MAIL_SERVER_ERROR = "Wystąpił błąd podczas dostępu do serwera"
INVALID_INPUT_ARGUMENT = "Niepoprawny argument wejścia"
UNKNOWN_ERROR = "Nieznany błąd"
[STATIC]
BACK_LINK = "Odśwież"
DOMAIN_LIST_DESC = "Lista domen, do których można uzyskać dostęp za pomocą tego klienta."
PHP_EXSTENSIONS_ERROR_DESC = "Brak wymaganych rozszerzeń w konfiguracji PHP!"
PHP_VERSION_ERROR_DESC = "Twoja wersja PHP: (%VERSION%), jest niższa niż minimalna: 5.3.0!"
NO_SCRIPT_TITLE = "Ta aplikacja do poprawnej pracy wymaga javascript-u."
NO_SCRIPT_DESC = "Twoja przeglądarka nie obsługuje javascript-u.
Proszę o jego włączenie i ponowną próbę."
NO_COOKIE_TITLE = "Obsługa plików cookies jest wymagana dla poprawnego działania skryptu."
NO_COOKIE_DESC = "Twoja przeglądarka nie obsługuje plików cookies.
Proszę o ich włączenie i ponowną próbę."
BAD_BROWSER_TITLE = "Posiadasz nieaktualną wersję przeglądarki."
BAD_BROWSER_DESC = "Aby korzystać ze wszyskich funkcji tego skryptu, pobierz i zainstaluj jedną z niżej wymienionych przeglądarek:"

View file

@ -320,6 +320,12 @@ BUTTON_SIGN = "Sign"
BUTTON_ENCRYPT = "Encrypt" BUTTON_ENCRYPT = "Encrypt"
BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt" BUTTON_SIGN_AND_ENCRYPT = "Sign and encrypt"
[POPUPS_MESSAGE_OPEN_PGP]
TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt"
LABEL_KEY = "Private Key"
LABEL_PASSWORD = "Password"
BUTTON_DECRYPT = "Decrypt"
[POPUPS_TWO_FACTOR_TEST] [POPUPS_TWO_FACTOR_TEST]
TITLE_TEST_CODE = "2-Step verification test" TITLE_TEST_CODE = "2-Step verification test"
LABEL_CODE = "Code" LABEL_CODE = "Code"

View file

@ -1,6 +1,6 @@
[LOGIN] [LOGIN]
LABEL_EMAIL = "E-mail" LABEL_EMAIL = "Adres e-mail"
LABEL_LOGIN = "Login" LABEL_LOGIN = "Login"
LABEL_PASSWORD = "Hasło" LABEL_PASSWORD = "Hasło"
LABEL_SIGN_ME = "Zapamiętaj mnie" LABEL_SIGN_ME = "Zapamiętaj mnie"
@ -10,34 +10,34 @@ BUTTON_SIGN_IN = "Zaloguj"
TITLE_SIGN_IN_GOOGLE = "Zaloguj się przez Google" TITLE_SIGN_IN_GOOGLE = "Zaloguj się przez Google"
TITLE_SIGN_IN_FACEBOOK = "Zaloguj się przez Facebook" TITLE_SIGN_IN_FACEBOOK = "Zaloguj się przez Facebook"
TITLE_SIGN_IN_TWITTER = "Zaloguj się przez Twitter" TITLE_SIGN_IN_TWITTER = "Zaloguj się przez Twitter"
LABEL_FORGOT_PASSWORD = "Zapomniane hasło" LABEL_FORGOT_PASSWORD = "Zapomniałem hasło"
LABEL_REGISTRATION = "Rejestracja" LABEL_REGISTRATION = "Rejestracja"
[TOP_TOOLBAR] [TOP_TOOLBAR]
BUTTON_ADD_ACCOUNT = "Dodaj konto" BUTTON_ADD_ACCOUNT = "Dodaj konto"
BUTTON_SETTINGS = "Ustawienia" BUTTON_SETTINGS = "Ustawienia"
BUTTON_HELP = "Pomoc" BUTTON_HELP = "Pomoc"
BUTTON_LOGOUT = "Wyloguj się" BUTTON_LOGOUT = "Wyloguj"
[SEARCH] [SEARCH]
MAIN_INPUT_PLACEHOLDER = "Szukaj" MAIN_INPUT_PLACEHOLDER = "Szukaj"
TITLE_ADV = "Wyszukiwanie zaawansowane" TITLE_ADV = "Wyszukiwanie zaawansowane"
LABEL_ADV_FROM = "Od" LABEL_ADV_FROM = "Od:"
LABEL_ADV_TO = "Do" LABEL_ADV_TO = "Do:"
LABEL_ADV_SUBJECT = "Temat" LABEL_ADV_SUBJECT = "Temat:"
LABEL_ADV_TEXT = "Tekst" LABEL_ADV_TEXT = "Tekst:"
LABEL_ADV_HAS_ATTACHMENT = "Z załącznikiem" LABEL_ADV_HAS_ATTACHMENT = "Załącznik"
LABEL_ADV_HAS_ATTACHMENTS = "Z załącznikami" LABEL_ADV_HAS_ATTACHMENTS = "Ma załączniki"
LABEL_ADV_FLAGGED = "Oznaczona" LABEL_ADV_FLAGGED = "Oznaczona"
LABEL_ADV_UNSEEN = "Nieprzeczytana" LABEL_ADV_UNSEEN = "Nieprzeczytana"
LABEL_ADV_DATE = "Data" LABEL_ADV_DATE = "Data:"
LABEL_ADV_DATE_ALL = "Wszystkie" LABEL_ADV_DATE_ALL = "wszystkie"
LABEL_ADV_DATE_3_DAYS = "Do 3 dni" LABEL_ADV_DATE_3_DAYS = "do 3 dni"
LABEL_ADV_DATE_7_DAYS = "Do 1 tygodnia" LABEL_ADV_DATE_7_DAYS = "do tygodnia"
LABEL_ADV_DATE_MONTH = "Do 1 miesiąca" LABEL_ADV_DATE_MONTH = "do miesiąca"
LABEL_ADV_DATE_3_MONTHS = "Do 3 miesięcy" LABEL_ADV_DATE_3_MONTHS = "do 3 miesięcy"
LABEL_ADV_DATE_6_MONTHS = "Do 6 miesięcy" LABEL_ADV_DATE_6_MONTHS = "do 6 miesięcy"
LABEL_ADV_DATE_YEAR = "Do 1 roku" LABEL_ADV_DATE_YEAR = "do roku"
BUTTON_ADV_SEARCH = "Szukaj" BUTTON_ADV_SEARCH = "Szukaj"
[PREVIEW_POPUP] [PREVIEW_POPUP]
@ -47,9 +47,9 @@ CLOSE = "Zamknij (Esc)"
LOADING = "Ładowanie..." LOADING = "Ładowanie..."
GALLERY_PREV = "Poprzedni (strzałka w lewo)" GALLERY_PREV = "Poprzedni (strzałka w lewo)"
GALLERY_NEXT = "Następny (strzałka w prawo)" GALLERY_NEXT = "Następny (strzałka w prawo)"
GALLERY_COUNTER = "%curr% z %total%" GALLERY_COUNTER = "%curr% z: %total%"
IMAGE_ERROR = "Nie można było załadować <a href=\"%url%\" target=\"_blank\">obrazu</a>." IMAGE_ERROR = "Nie można załadować <a href=\"%url%\" target=\"_blank\">obrazu</a>."
AJAX_ERROR = "Nie można było załadować <a href=\"%url%\" target=\"_blank\">zawartości</a>." AJAX_ERROR = "Nie można załadować <a href=\"%url%\" target=\"_blank\">zawartości</a>."
[FOLDER_LIST] [FOLDER_LIST]
BUTTON_COMPOSE = "Utwórz" BUTTON_COMPOSE = "Utwórz"
@ -57,23 +57,23 @@ BUTTON_CONTACTS = "Kontakty"
INBOX_NAME = "Odebrane" INBOX_NAME = "Odebrane"
SENT_NAME = "Wysłane" SENT_NAME = "Wysłane"
DRAFTS_NAME = "Wersje robocze" DRAFTS_NAME = "Wersje robocze"
SPAM_NAME = "Spam" SPAM_NAME = "Niechciane"
TRASH_NAME = "Kosz" TRASH_NAME = "Kosz"
ARCHIVE_NAME = "Archiwum" ARCHIVE_NAME = "Archiwum"
[QUOTA] [QUOTA]
TITLE = "Wykorzystane miejsce" TITLE = "Wykorzystanie miejsca"
[MESSAGE_LIST] [MESSAGE_LIST]
BUTTON_RELOAD = "Odśwież" BUTTON_RELOAD = "Odśwież"
BUTTON_MOVE_TO = "Przenieś do" BUTTON_MOVE_TO = "Przenieś"
BUTTON_DELETE = "Usuń" BUTTON_DELETE = "Usuń"
BUTTON_ARCHIVE = "Archiwum" BUTTON_ARCHIVE = "Archiwizuj"
BUTTON_SPAM = "Oznacz jako spam" BUTTON_SPAM = "Oznacz jako niechciane"
BUTTON_NOT_SPAM = "Oznacz jako wiarygodną" BUTTON_NOT_SPAM = "Oznacz jako pożądane"
BUTTON_EMPTY_FOLDER = "Wyczyść folder" BUTTON_EMPTY_FOLDER = "Usuń zawartość folderu"
BUTTON_MULTY_FORWARD = "Przekaż dalej" BUTTON_MULTY_FORWARD = "Przekaż dalej"
BUTTON_DELETE_WITHOUT_MOVE = "Usuń na stałe" BUTTON_DELETE_WITHOUT_MOVE = "Usuń (pernamentnie)"
BUTTON_MORE = "Więcej" BUTTON_MORE = "Więcej"
MENU_SET_SEEN = "Oznacz jako przeczytane" MENU_SET_SEEN = "Oznacz jako przeczytane"
MENU_SET_ALL_SEEN = "Oznacz wszystkie jako przeczytane" MENU_SET_ALL_SEEN = "Oznacz wszystkie jako przeczytane"
@ -82,7 +82,7 @@ MENU_SET_FLAG = "Oznacz jako ważne"
MENU_UNSET_FLAG = "Oznacz jako nieważne" MENU_UNSET_FLAG = "Oznacz jako nieważne"
MENU_SELECT_ALL = "Wszystkie" MENU_SELECT_ALL = "Wszystkie"
MENU_SELECT_NONE = "Żadne" MENU_SELECT_NONE = "Żadne"
MENU_SELECT_INVERT = "Odwróć" MENU_SELECT_INVERT = "Odwróć zaznaczenie"
MENU_SELECT_UNSEEN = "Nieprzeczytane" MENU_SELECT_UNSEEN = "Nieprzeczytane"
MENU_SELECT_SEEN = "Przeczytane" MENU_SELECT_SEEN = "Przeczytane"
MENU_SELECT_FLAGGED = "Oznaczone jako ważne" MENU_SELECT_FLAGGED = "Oznaczone jako ważne"
@ -90,15 +90,15 @@ MENU_SELECT_UNFLAGGED = "Oznaczone jako nieważne"
EMPTY_LIST = "Pusta lista" EMPTY_LIST = "Pusta lista"
EMPTY_SEARCH_LIST = "Brak wiadomości spełniających kryteria wyszukiwania" EMPTY_SEARCH_LIST = "Brak wiadomości spełniających kryteria wyszukiwania"
SEARCH_RESULT_FOR = "Wyniki wyszukiwania dla: \"%SEARCH%\"" SEARCH_RESULT_FOR = "Wyniki wyszukiwania dla: \"%SEARCH%\""
BACK_TO_MESSAGE_LIST = "powrót do listy wiadomości" BACK_TO_MESSAGE_LIST = "Powrót do listy wiadomości"
LIST_LOADING = "Ładowanie" LIST_LOADING = "Ładowanie..."
EMPTY_SUBJECT_TEXT = "(Brak tematu)" EMPTY_SUBJECT_TEXT = "(Brak tematu)"
PUT_MESSAGE_HERE = "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście" PUT_MESSAGE_HERE = "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście"
TODAY_AT = "Dzisiaj: %TIME%" TODAY_AT = "Dzisiaj: %TIME%"
YESTERDAY_AT = "Wczoraj: %TIME%" YESTERDAY_AT = "Wczoraj: %TIME%"
SEARCH_PLACEHOLDER = "Szukaj" SEARCH_PLACEHOLDER = "Szukaj"
NEW_MESSAGE_NOTIFICATION = "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!" NEW_MESSAGE_NOTIFICATION = "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!"
QUOTA_SIZE = "Wykorzystano: <strong>%SIZE% (%PROC%%)</strong> z przyznanych: <strong>%LIMIT%</strong>" QUOTA_SIZE = "Wykorzystano: <strong>%SIZE% (%PROC%%)</strong> z: <strong>%LIMIT%</strong>"
[MESSAGE] [MESSAGE]
BUTTON_EDIT = "Edytuj" BUTTON_EDIT = "Edytuj"
@ -106,15 +106,15 @@ BUTTON_BACK = "Wstecz"
BUTTON_CLOSE = "Zamknij" BUTTON_CLOSE = "Zamknij"
BUTTON_DELETE = "Usuń" BUTTON_DELETE = "Usuń"
BUTTON_ARCHIVE = "Archiwizuj" BUTTON_ARCHIVE = "Archiwizuj"
BUTTON_SPAM = "Oznacz jako spam" BUTTON_SPAM = "Oznacz jako niechcianą"
BUTTON_NOT_SPAM = "Oznacz jako wiarygodną" BUTTON_NOT_SPAM = "Oznacz jako pożądaną"
BUTTON_MOVE_TO = "Przenieś do" BUTTON_MOVE_TO = "Przenieś"
BUTTON_MORE = "Więcej" BUTTON_MORE = "Więcej"
BUTTON_REPLY = "Odpowiedz" BUTTON_REPLY = "Odpowiedz"
BUTTON_REPLY_ALL = "Odpowiedz wszystkim" BUTTON_REPLY_ALL = "Odpowiedz wszystkim"
BUTTON_FORWARD = "Przekaż dalej" BUTTON_FORWARD = "Przekaż dalej"
BUTTON_FORWARD_AS_ATTACHMENT = "Przekaż jako załącznik" BUTTON_FORWARD_AS_ATTACHMENT = "Przekaż jako załącznik"
BUTTON_EDIT_AS_NEW = "Edytuj jako nową wiadomość" BUTTON_EDIT_AS_NEW = "Zredaguj jako nową wiadomość"
BUTTON_SHOW_IMAGES = "Wyświetl obrazy" BUTTON_SHOW_IMAGES = "Wyświetl obrazy"
BUTTON_NOTIFY_READ_RECEIPT = "Nadawca prosi o potwierdzenie odczytania tej wiadomości" BUTTON_NOTIFY_READ_RECEIPT = "Nadawca prosi o potwierdzenie odczytania tej wiadomości"
BUTTON_IN_NEW_WINDOW = "Wyświetl w osobnym oknie" BUTTON_IN_NEW_WINDOW = "Wyświetl w osobnym oknie"
@ -123,8 +123,8 @@ BUTTON_THREAD_PREV = "Poprzedni"
BUTTON_THREAD_NEXT = "Następny" BUTTON_THREAD_NEXT = "Następny"
BUTTON_THREAD_MORE = "Więcej wiadomości" BUTTON_THREAD_MORE = "Więcej wiadomości"
MENU_HEADERS = "Pokaż nagłówki wiadomości" MENU_HEADERS = "Pokaż nagłówki wiadomości"
MENU_VIEW_ORIGINAL = "Pokaż oryginał" MENU_VIEW_ORIGINAL = "Pokaż zródło"
MENU_DOWNLOAD_ORIGINAL = "Pobież jako plik - .eml" MENU_DOWNLOAD_ORIGINAL = "Pobież jako plik eml"
MENU_FILTER_SIMILAR = "Filtruj podobne wiadomości" MENU_FILTER_SIMILAR = "Filtruj podobne wiadomości"
MENU_PRINT = "Drukuj" MENU_PRINT = "Drukuj"
EMPTY_SUBJECT_TEXT = "(Brak tematu)" EMPTY_SUBJECT_TEXT = "(Brak tematu)"
@ -134,32 +134,32 @@ LABEL_FROM = "Od"
LABEL_FROM_SHORT = "Od" LABEL_FROM_SHORT = "Od"
LABEL_TO = "Do" LABEL_TO = "Do"
LABEL_TO_SHORT = "Do" LABEL_TO_SHORT = "Do"
LABEL_CC = "Kopia do" LABEL_CC = "Kopia"
LABEL_BCC = "Ukryci odbiorcy" LABEL_BCC = "Ukr. kopia"
LABEL_REPLY_TO = "Reply-To" LABEL_REPLY_TO = "Zwrot"
PRINT_LABEL_FROM = "Od" PRINT_LABEL_FROM = "Od"
PRINT_LABEL_TO = "Do" PRINT_LABEL_TO = "Do"
PRINT_LABEL_CC = "Kopia do" PRINT_LABEL_CC = "Kopia"
PRINT_LABEL_BCC = "Ukryci odbiorcy" PRINT_LABEL_BCC = "Ukr. kopia"
PRINT_LABEL_REPLY_TO = "Reply-To" PRINT_LABEL_REPLY_TO = "Zwrot"
PRINT_LABEL_DATE = "Data" PRINT_LABEL_DATE = "Data"
PRINT_LABEL_SUBJECT = "Temat" PRINT_LABEL_SUBJECT = "Temat"
PRINT_LABEL_ATTACHMENTS = "Załączniki" PRINT_LABEL_ATTACHMENTS = "Załączniki"
MESSAGE_LOADING = "Ładowanie..." MESSAGE_LOADING = "Ładowanie wiadomości..."
MESSAGE_VIEW_DESC = "Wybierz wiadomość z listy w celu jej wyświetlenia" MESSAGE_VIEW_DESC = "Wybierz wiadomość do wyświetlenia"
PGP_PASSWORD_INPUT_PLACEHOLDER = "Hasło" PGP_PASSWORD_INPUT_PLACEHOLDER = "Hasło"
PGP_SIGNED_MESSAGE_DESC = "Wiadomość podpisana za pomocą OpenPGP (kliknij, aby zweryfikować)" PGP_SIGNED_MESSAGE_DESC = "Podpisana"
PGP_ENCRYPTED_MESSAGE_DESC = "Wiadomość zaszyfrowana za pomocą OpenPGP (kliknij, aby odszyfrować)" PGP_ENCRYPTED_MESSAGE_DESC = "Zaszyfrowana"
LINK_DOWNLOAD_AS_ZIP = "Pobierz jako zip" LINK_DOWNLOAD_AS_ZIP = "Pobierz jako plik zip"
LINK_SAVE_TO_OWNCLOUD = "Zapisz na ownCloud" LINK_SAVE_TO_OWNCLOUD = "Zapisz w ownCloud"
LINK_SAVE_TO_DROPBOX = "Zapisz na Dropbox" LINK_SAVE_TO_DROPBOX = "Zapisz w Dropbox-ie"
[READ_RECEIPT] [READ_RECEIPT]
SUBJECT = "Potwierdzenie odbioru (wyświetlenia) - %SUBJECT%" SUBJECT = "Potwierdzenie wyświetlenia wiadomości o tytule: %SUBJECT%"
BODY = "To jest potwierdzenie odbioru wiadomości wysłanej do: %READ-RECEIPT%. BODY = "Potwierdzenie wyświetlenia wiadomości wysłanej na adres: %READ-RECEIPT%.
Uwaga: Potwierdzenie odbioru wiadomości przez odbiorcę informuję tylko o tym, że wiadomość została wyświetlona na komputerze odbiorcy. Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, że wiadomość została wyświetlona na komputerze odbiorcy.
Nie ma żadnej gwarancji, że odbiorca odczytał wiadomość i zapoznał się z jej treścią." Nie ma jednak żadnej gwarancji, że odbiorca faktycznie zapoznał się z jej treścią."
[SUGGESTIONS] [SUGGESTIONS]
SEARCHING_DESC = "Wyszukiwanie..." SEARCHING_DESC = "Wyszukiwanie..."
@ -174,20 +174,20 @@ BUTTON_IMPORT = "Importuj (csv, vcf, vCard)"
BUTTON_EXPORT_VCARD = "Eksportuj (vcf, vCard)" BUTTON_EXPORT_VCARD = "Eksportuj (vcf, vCard)"
BUTTON_EXPORT_CSV = "Eksportuj (csv)" BUTTON_EXPORT_CSV = "Eksportuj (csv)"
ERROR_IMPORT_FILE = "Błąd importu (nieprawidłowy format pliku)" ERROR_IMPORT_FILE = "Błąd importu (nieprawidłowy format pliku)"
LIST_LOADING = "Ładowanie" LIST_LOADING = "Ładowanie..."
EMPTY_LIST = "Brak kontaktów" EMPTY_LIST = "Brak kontaktów"
EMPTY_SEARCH = "Nie znaleziono żadnych kontaktów" EMPTY_SEARCH = "Nie znaleziono żadnych kontaktów"
CLEAR_SEARCH = "Wyczyść wyszukiwanie" CLEAR_SEARCH = "Wyczyść wyniki"
CONTACT_VIEW_DESC = "Wybierz kontakt z listy w celu jego wyświetlenia" CONTACT_VIEW_DESC = "Wybierz kontakt do wyświetlenia"
LABEL_DISPLAY_NAME = "Wyświetlana nazwa" LABEL_DISPLAY_NAME = "Nazwa:"
LABEL_EMAIL = "E-mail" LABEL_EMAIL = "Adres e-mail:"
LABEL_PHONE = "Telefon" LABEL_PHONE = "Telefon:"
LABEL_WEB = "Strona WWW" LABEL_WEB = "Strona WWW:"
LABEL_BIRTHDAY = "Urodziny" LABEL_BIRTHDAY = "Urodziny:"
LINK_ADD_EMAIL = "Dodaj adres e-mail" LINK_ADD_EMAIL = "Dodaj adres e-mail"
LINK_ADD_PHONE = "Dodaj nr telefonu" LINK_ADD_PHONE = "Dodaj nr telefonu"
LINK_BIRTHDAY = "Urodziny" LINK_BIRTHDAY = "Urodziny"
PLACEHOLDER_ENTER_DISPLAY_NAME = "Nazwa wyświetlana" PLACEHOLDER_ENTER_DISPLAY_NAME = "Nazwa"
PLACEHOLDER_ENTER_LAST_NAME = "Nazwisko" PLACEHOLDER_ENTER_LAST_NAME = "Nazwisko"
PLACEHOLDER_ENTER_FIRST_NAME = "Imię" PLACEHOLDER_ENTER_FIRST_NAME = "Imię"
PLACEHOLDER_ENTER_NICK_NAME = "Pseudonim" PLACEHOLDER_ENTER_NICK_NAME = "Pseudonim"
@ -196,9 +196,9 @@ LABEL_SHARE = "Udostępnij kontakt"
ADD_MENU_LABEL = "Dodaj" ADD_MENU_LABEL = "Dodaj"
ADD_MENU_NICKNAME = "Pseudonim" ADD_MENU_NICKNAME = "Pseudonim"
ADD_MENU_NOTES = "Notatki" ADD_MENU_NOTES = "Notatki"
ADD_MENU_EMAIL = "E-mail" ADD_MENU_EMAIL = "Adres e-mail"
ADD_MENU_PHONE = "Telefon" ADD_MENU_PHONE = "Telefon"
ADD_MENU_URL = "Adres URL" ADD_MENU_URL = "Adres www"
ADD_MENU_ADDRESS = "Adres" ADD_MENU_ADDRESS = "Adres"
ADD_MENU_BIRTHDAY = "Urodziny" ADD_MENU_BIRTHDAY = "Urodziny"
ADD_MENU_TAGS = "Tagi" ADD_MENU_TAGS = "Tagi"
@ -209,9 +209,9 @@ BUTTON_SYNC = "Synchronizacja (CardDAV)"
[COMPOSE] [COMPOSE]
TITLE_FROM = "Od" TITLE_FROM = "Od"
TITLE_TO = "Do" TITLE_TO = "Do"
TITLE_CC = "DW" TITLE_CC = "Kopia"
TITLE_BCC = "UDW" TITLE_BCC = "Ukr. kopia"
TITLE_REPLY_TO = "Odpowiedź do" TITLE_REPLY_TO = "Zwrot"
TITLE_SUBJECT = "Temat" TITLE_SUBJECT = "Temat"
LINK_SHOW_INPUTS = "Pokaż wszystkie pola" LINK_SHOW_INPUTS = "Pokaż wszystkie pola"
BUTTON_SEND = "Wyślij" BUTTON_SEND = "Wyślij"
@ -222,29 +222,29 @@ BUTTON_MINIMIZE = "Minimalizuj"
SAVED_TIME = "Zapisane: %TIME%" SAVED_TIME = "Zapisane: %TIME%"
SAVED_ERROR_ON_SEND = "Wiadomość została wysłana, ale nie została zapisana w folderze: Wysłane" SAVED_ERROR_ON_SEND = "Wiadomość została wysłana, ale nie została zapisana w folderze: Wysłane"
DISCARD_UNSAVED_DATA = "Odrzucić niezapisane dane?" DISCARD_UNSAVED_DATA = "Odrzucić niezapisane dane?"
ATTACH_FILES = "Dołącz pliki" ATTACH_FILES = "Dodaj załącznik"
ATTACH_DROP_FILES_DESC = "Przeciągnij pliki tutaj" ATTACH_DROP_FILES_DESC = "Przeciągnij pliki tutaj"
ATTACH_ITEM_CANCEL = "Anuluj" ATTACH_ITEM_CANCEL = "Anuluj"
DROPBOX = "Dropbox" DROPBOX = "Dropbox"
GOOGLE_DRIVE = "Dysk Google" GOOGLE_DRIVE = "Dysk Google"
REPLY_MESSAGE_TITLE = "%DATETIME% - %EMAIL%:" REPLY_MESSAGE_TITLE = "%DATETIME% - %EMAIL%"
FORWARD_MESSAGE_TOP_TITLE = "-------- Przekierowana wiadomość -------" FORWARD_MESSAGE_TOP_TITLE = "-------- Przekierowana wiadomość -------"
FORWARD_MESSAGE_TOP_FROM = "Od" FORWARD_MESSAGE_TOP_FROM = "Od:"
FORWARD_MESSAGE_TOP_TO = "Do" FORWARD_MESSAGE_TOP_TO = "Do:"
FORWARD_MESSAGE_TOP_CC = "DW" FORWARD_MESSAGE_TOP_CC = "Kopia do:"
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 = "Brak załączników." NO_ATTACHMENTS_HERE_DESC = "Brak załączników"
ATTACHMENTS_ERROR_DESC = "Ostrzeżenie! Nie wszystkie załaczniki zostały przesłane." ATTACHMENTS_ERROR_DESC = "Ostrzeżenie! Nie wszystkie załaczniki zostały przesłane"
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 = "Potwierdzenie wyświetlenia wiadomości"
BUTTON_MARK_AS_IMPORTANT = "Oznacz jako ważną" BUTTON_MARK_AS_IMPORTANT = "Oznacz jako ważną"
BUTTON_OPEN_PGP = "OpenPGP (Tylko zwykły tekst)" BUTTON_OPEN_PGP = "OpenPGP (tylko wiadomości tekstowe)"
BUTTON_REQUEST_DSN = "Żądaj potwierdzenia dostarczenia" BUTTON_REQUEST_DSN = "Potwierdzenie dostarczenia wiadomości"
[POPUPS_WELCOME_PAGE] [POPUPS_WELCOME_PAGE]
BUTTON_CLOSE = "Close" BUTTON_CLOSE = "Zamknij"
[POPUPS_ASK] [POPUPS_ASK]
BUTTON_YES = "Tak" BUTTON_YES = "Tak"
@ -258,7 +258,7 @@ TITLE_LANGUAGES = "Wybierz język"
[POPUPS_ADD_ACCOUNT] [POPUPS_ADD_ACCOUNT]
TITLE_ADD_ACCOUNT = "Dodawanie konta" TITLE_ADD_ACCOUNT = "Dodawanie konta"
BUTTON_ADD_ACCOUNT = "Dodaj" BUTTON_ADD_ACCOUNT = "Dodaj"
TITLE_UPDATE_ACCOUNT = "Zaktualizować konto?" TITLE_UPDATE_ACCOUNT = "Aktualizacja konta"
BUTTON_UPDATE_ACCOUNT = "Aktualizuj" BUTTON_UPDATE_ACCOUNT = "Aktualizuj"
[POPUPS_IDENTITY] [POPUPS_IDENTITY]
@ -266,32 +266,32 @@ TITLE_ADD_IDENTITY = "Dodawanie tożsamości"
TITLE_UPDATE_IDENTITY = "Aktualizacja tożsamości" TITLE_UPDATE_IDENTITY = "Aktualizacja tożsamości"
BUTTON_ADD_IDENTITY = "Dodaj" BUTTON_ADD_IDENTITY = "Dodaj"
BUTTON_UPDATE_IDENTITY = "Aktualizuj" BUTTON_UPDATE_IDENTITY = "Aktualizuj"
LABEL_EMAIL = "E-mail" LABEL_EMAIL = "Adres e-mail:"
LABEL_NAME = "Nazwa" LABEL_NAME = "Nazwa:"
LABEL_REPLY_TO = "Odpowiedz do" LABEL_REPLY_TO = "Zwrot"
LABEL_SIGNATURE = "Podpis" LABEL_SIGNATURE = "Podpis:"
LABEL_CC = "DW" LABEL_CC = "Kopia"
LABEL_BCC = "Ukryci odbiorcy" LABEL_BCC = "Ukr. kopia"
LABEL_SIGNATURE_INSERT_BEFORE = "Umieść podpis przed cytowanym tekstem w odpowiedziach" LABEL_SIGNATURE_INSERT_BEFORE = "Umieść podpis przed cytowanym tekstem"
[POPUPS_CREATE_FOLDER] [POPUPS_CREATE_FOLDER]
TITLE_CREATE_FOLDER = "Tworzenie folderu" TITLE_CREATE_FOLDER = "Tworzenie folderu"
SELECT_NO_PARENT = "" SELECT_NO_PARENT = ""
LABEL_NAME = "Nazwa folderu" LABEL_NAME = "Nazwa folderu:"
LABEL_PARENT = "Folder nadrzędny" LABEL_PARENT = "Folder nadrzędny:"
BUTTON_CREATE = "Utwórz" BUTTON_CREATE = "Utwórz"
BUTTON_CANCEL = "Anuluj" BUTTON_CANCEL = "Anuluj"
BUTTON_CLOSE = "Zamknij" BUTTON_CLOSE = "Zamknij"
TITLE_CREATING_PROCESS = "Trwa dodawanie folderu" TITLE_CREATING_PROCESS = "Tworzenie folderu"
[POPUPS_CLEAR_FOLDER] [POPUPS_CLEAR_FOLDER]
TITLE_CLEAR_FOLDER = "Czy chcesz usunąć wszystkie wiadomości z folderu?" TITLE_CLEAR_FOLDER = "Usuwanie wszystkich wiadomości z folderu"
BUTTON_CLEAR = "Usuń" BUTTON_CLEAR = "Usuń wszystkie"
BUTTON_CANCEL = "Anuluj" BUTTON_CANCEL = "Anuluj"
BUTTON_CLOSE = "Zamknij" BUTTON_CLOSE = "Zamknij"
DANGER_DESC_WARNING = "Ostrzeżenie!" DANGER_DESC_WARNING = "Ostrzeżenie!"
DANGER_DESC_HTML_1 = "Wszystkie wiadomości w folderze: <strong>%FOLDER%</strong>, zostaną bezpowrotnie usunięte!" DANGER_DESC_HTML_1 = "Wszystkie wiadomości w folderze: <strong>%FOLDER%</strong>, zostaną bezpowrotnie usunięte!"
DANGER_DESC_HTML_2 = "Po rozpoczęciu, proces nie może zostać przerwany lub anulowany." DANGER_DESC_HTML_2 = "Po rozpoczęciu, nie można przerwać lub anulować zadania."
TITLE_CLEARING_PROCESS = "Trwa usuwanie wszystkich wiadomości z folderu..." TITLE_CLEARING_PROCESS = "Trwa usuwanie wszystkich wiadomości z folderu..."
[POPUPS_IMPORT_OPEN_PGP_KEY] [POPUPS_IMPORT_OPEN_PGP_KEY]
@ -305,112 +305,112 @@ BUTTON_CLOSE = "Zamknij"
[POPUPS_GENERATE_OPEN_PGP_KEYS] [POPUPS_GENERATE_OPEN_PGP_KEYS]
TITLE_GENERATE_OPEN_PGP_KEYS = "Generowanie klucza OpenPGP" TITLE_GENERATE_OPEN_PGP_KEYS = "Generowanie klucza OpenPGP"
LABEL_EMAIL = "E-mail" LABEL_EMAIL = "Adres e-mail:"
LABEL_NAME = "Imię i nazwisko" LABEL_NAME = "Imię i nazwisko:"
LABEL_PASSWORD = "Hasło" LABEL_PASSWORD = "Hasło:"
LABEL_KEY_BIT_LENGTH = "Długość klucza" LABEL_KEY_BIT_LENGTH = "Długość klucza:"
BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj" BUTTON_GENERATE_OPEN_PGP_KEYS = "Generuj"
[POPUPS_COMPOSE_OPEN_PGP] [POPUPS_COMPOSE_OPEN_PGP]
TITLE_COMPOSE_OPEN_PGP = "Podpisz/Zaszyfruj" TITLE_COMPOSE_OPEN_PGP = "Podpisywanie/szyfrowanie"
LABEL_SIGN = "Podpisz" LABEL_SIGN = "Podpisz"
LABEL_ENCRYPT = "Zaszyfruj" LABEL_ENCRYPT = "Szyfruj"
LABEL_PASSWORD = "Hasło" LABEL_PASSWORD = "Hasło:"
BUTTON_SIGN = "Podpisz" BUTTON_SIGN = "Podpisz"
BUTTON_ENCRYPT = "Zaszyfruj" BUTTON_ENCRYPT = "Szyfruj"
BUTTON_SIGN_AND_ENCRYPT = "Podpisz i zaszyfruj" BUTTON_SIGN_AND_ENCRYPT = "Podpisz i szyfruj"
[POPUPS_TWO_FACTOR_TEST] [POPUPS_TWO_FACTOR_TEST]
TITLE_TEST_CODE = "Test weryfikacji 2-stopniowej" TITLE_TEST_CODE = "Test autoryzacji dwuskładnikowej"
LABEL_CODE = "Kod" LABEL_CODE = "Kod"
BUTTON_TEST = "Testuj" BUTTON_TEST = "Testuj"
[POPUPS_FILTER] [POPUPS_FILTER]
TITLE_CREATE_FILTER = "Utwórz filtr?" TITLE_CREATE_FILTER = "Tworzenie filtra"
TITLE_EDIT_FILTER = "Zaktualizuj filtr?" TITLE_EDIT_FILTER = "Aktualizacja filtra"
FILTER_NAME = "Nazwa" FILTER_NAME = "Nazwa"
LEGEND_CONDITIONS = "Warunki" LEGEND_CONDITIONS = "Warunki"
LEGEND_ACTIONS = "Akcje" LEGEND_ACTIONS = "Działania"
BUTTON_DONE = "Gotowe" BUTTON_DONE = "Gotowe"
BUTTON_ADD_CONDITION = "Dodaj warunek" BUTTON_ADD_CONDITION = "Dodaj warunek"
SELECT_ACTION_NONE = "Brak" SELECT_ACTION_NONE = "Brak"
SELECT_ACTION_MOVE_TO = "Przenieś do" SELECT_ACTION_MOVE_TO = "Przenieś"
SELECT_ACTION_FORWARD_TO = "Przekaż do" SELECT_ACTION_FORWARD_TO = "Prześlij dalej"
SELECT_ACTION_REJECT = "Odrzuć" SELECT_ACTION_REJECT = "Odrzuć"
SELECT_ACTION_VACATION_MESSAGE = "Wiadomość o nieobecności" SELECT_ACTION_VACATION_MESSAGE = "Wiadomość urlopowa"
SELECT_ACTION_DISCARD = "Usuń" SELECT_ACTION_DISCARD = "Usuń"
SELECT_FIELD_FROM = "Od" SELECT_FIELD_FROM = "Pole 'Od'"
SELECT_FIELD_RECIPIENTS = "Odbiorcy (Do lub DW)" SELECT_FIELD_RECIPIENTS = "Pole 'Kopia' lub 'Ukr. kopia'"
SELECT_FIELD_SUBJECT = "Temat" SELECT_FIELD_SUBJECT = "Pole 'Temat'"
SELECT_FIELD_HEADER = "Nagłówek" SELECT_FIELD_HEADER = "Nagłówek"
SELECT_FIELD_SIZE = "Rozmiar" SELECT_FIELD_SIZE = "Rozmiar"
SELECT_TYPE_CONTAINS = "Zawiera" SELECT_TYPE_CONTAINS = "zawiera"
SELECT_TYPE_NOT_CONTAINS = "Nie zawiera" SELECT_TYPE_NOT_CONTAINS = "nie zawiera"
SELECT_TYPE_MATCHES = "Pasuje (wspierane * oraz ?)" SELECT_TYPE_MATCHES = "zawiera (*,?)"
SELECT_TYPE_NOT_MATCHES = "Nie pasuje (wspierane * oraz ?)" SELECT_TYPE_NOT_MATCHES = "nie zawiera (*,?)"
SELECT_TYPE_REGEXP = "Regexp" SELECT_TYPE_REGEXP = "Wyrażenie regularne:"
SELECT_TYPE_NOT_REGEXP = "Nie Regexp" SELECT_TYPE_NOT_REGEXP = "Niepoprawne wyrażenie regularne:"
SELECT_TYPE_EQUAL_TO = "To" SELECT_TYPE_EQUAL_TO = "Zawiera:"
SELECT_TYPE_NOT_EQUAL_TO = "To nie" SELECT_TYPE_NOT_EQUAL_TO = "Nie zawiera:"
SELECT_TYPE_OVER = "Większy" SELECT_TYPE_OVER = "powyżej"
SELECT_TYPE_UNDER = "Mniejszy" SELECT_TYPE_UNDER = "poniżej"
SELECT_MATCH_ANY = "Spełnia dowolny z warunków" SELECT_MATCH_ANY = "Spełnia dowolny z warunków"
SELECT_MATCH_ALL = "Spełnia wszystkie warunki" SELECT_MATCH_ALL = "Spełnia wszystkie warunki"
MARK_AS_READ_LABEL = "Oznacz jako przeczytane" MARK_AS_READ_LABEL = "Oznacz jako przeczytane"
REPLY_INTERVAL_LABEL = "Odpowiedź po (dni)" REPLY_INTERVAL_LABEL = "Liczba dni, po których wysłać odp."
KEEP_LABEL = "Zachowaj" KEEP_LABEL = "Zachowaj"
STOP_LABEL = "Nie zatrzymuj wykonywania reguł" STOP_LABEL = "Nie zatrzymuj przetwarzania reguł"
EMAIL_LABEL = "Email" EMAIL_LABEL = "Adres e-mail"
VACATION_SUBJECT_LABEL = "Temat (opcjonalnie)" VACATION_SUBJECT_LABEL = "Temat (opcjonalnie)"
VACATION_MESSAGE_LABEL = "Wiadomość" VACATION_MESSAGE_LABEL = "Wiadomość"
REJECT_MESSAGE_LABEL = "Odrzuć wiadomość" REJECT_MESSAGE_LABEL = "Powód odrzucenia"
ALL_INCOMING_MESSAGES_DESC = "Wszystkie przychodzące wiadomości" ALL_INCOMING_MESSAGES_DESC = "Wszystkie przychodzące wiadomości"
[POPUPS_SYSTEM_FOLDERS] [POPUPS_SYSTEM_FOLDERS]
TITLE_SYSTEM_FOLDERS = "Wybierz foldery systemowe" TITLE_SYSTEM_FOLDERS = "Wybieranie folderów systemowych"
SELECT_CHOOSE_ONE = "Wybierz" SELECT_CHOOSE_ONE = "wybierz"
SELECT_UNUSE_NAME = "Nie używaj" SELECT_UNUSE_NAME = "nie używaj"
LABEL_SENT = "Wysłane" LABEL_SENT = "Wysłane:"
LABEL_DRAFTS = "Wersje robocze" LABEL_DRAFTS = "Wersje robocze:"
LABEL_SPAM = "Spam" LABEL_SPAM = "Niechciane:"
LABEL_TRASH = "Kosz" LABEL_TRASH = "Kosz:"
LABEL_ARCHIVE = "Archiwum" LABEL_ARCHIVE = "Archiwum:"
BUTTON_CANCEL = "Anuluj" BUTTON_CANCEL = "Anuluj"
BUTTON_CLOSE = "Zamknij" BUTTON_CLOSE = "Zamknij"
NOTIFICATION_SENT = "Nie został wybrany folder \"Wysłane\", do którego przenoszone są wiadomości po wysłaniu. NOTIFICATION_SENT = "Nie wybrano folderu: \"Wysłane\", do którego przenoszone są wysłane wiadomości.
Jeżeli wysłane wiadomości nie mają być przechowywane, proszę o zaznaczenie opcji: \"Nie używaj\"." Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję: \"Nie używaj\"."
NOTIFICATION_DRAFTS = "Nie został wybrany folder \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia." NOTIFICATION_DRAFTS = "Nie wybrano folderu: \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia."
NOTIFICATION_SPAM = "Nie został wybrany folder \"Spam\", do którego przenoszone są wiadomości oznaczone jako SPAM. NOTIFICATION_SPAM = "Nie wybrano folderu: \"Niechciane\", do którego przenoszone są niepożadane wiadomości.
Jeżeli wiadomości oznaczone jako spam mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"." Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"."
NOTIFICATION_TRASH = "Nie został wybrany folder \"Kosz\", do którego przenoszone są wszystkie usunięte wiadomości. NOTIFICATION_TRASH = "Nie wybrano folderu: \"Kosz\", do którego przenoszone są wszystkie usunięte wiadomości.
Jeżeli wiadomości usunięte mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"." Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"."
NOTIFICATION_ARCHIVE = "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizowanych wiadomości." NOTIFICATION_ARCHIVE = "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizacji wiadomości."
[POPUPS_TWO_FACTOR_CFG] [POPUPS_TWO_FACTOR_CFG]
LEGEND_TWO_FACTOR_AUTH = "Weryfikacja 2-stopniowa" LEGEND_TWO_FACTOR_AUTH = "Dwuskładnikowa autoryzacja"
LABEL_ENABLE_TWO_FACTOR = "Włącz 2-stopniową weryfikację" LABEL_ENABLE_TWO_FACTOR = "Włącz dwuskładnikową autoryzację"
LABEL_TWO_FACTOR_USER = "Użytkownik" LABEL_TWO_FACTOR_USER = "Użytkownik:"
LABEL_TWO_FACTOR_STATUS = "Status" LABEL_TWO_FACTOR_STATUS = "Status:"
LABEL_TWO_FACTOR_SECRET = "Tajna fraza" LABEL_TWO_FACTOR_SECRET = "Tajna fraza:"
LABEL_TWO_FACTOR_BACKUP_CODES = "Kody zapasowe" LABEL_TWO_FACTOR_BACKUP_CODES = "Kody zapasowe:"
BUTTON_CREATE = "Utwórz nową frazę" BUTTON_CREATE = "Utwórz nową frazę"
BUTTON_ACTIVATE = "Activate" BUTTON_ACTIVATE = "Aktywuj"
BUTTON_CLEAR = "Wyczyść" BUTTON_CLEAR = "Wyczyść"
BUTTON_LOGOUT = "Logout" BUTTON_LOGOUT = "Wyloguj"
BUTTON_DONE = "Done" BUTTON_DONE = "Zamknij"
BUTTON_TEST = "Testuj" BUTTON_TEST = "Testuj"
LINK_TEST = "test" LINK_TEST = "Test"
BUTTON_SHOW_SECRET = "Pokaż frazę" BUTTON_SHOW_SECRET = "Pokaż frazę"
BUTTON_HIDE_SECRET = "Ukryj frazę" BUTTON_HIDE_SECRET = "Ukryj frazę"
TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." TWO_FACTOR_REQUIRE_DESC = "Twoje konto wymaga skonfigurowania dwuskładnikowej autoryzacji ."
TWO_FACTOR_SECRET_CONFIGURED_DESC = "Skonfigurowane" TWO_FACTOR_SECRET_CONFIGURED_DESC = "Skonfigurowana"
TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nie skonfigurowane" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nie skonfigurowana"
TWO_FACTOR_SECRET_DESC = "Zaimportuj te informacje do swojego klienta usługi Google Authenticator (lub innego klienta TOTP), używając poniższego kodu QR lub wpisując kod ręcznie." TWO_FACTOR_SECRET_DESC = "Użyj tych informacji w usłudze Google Authenticator (lub innym kliencie TOTP), używając poniższego kodu QR lub wpisując kod ręcznie."
TWO_FACTOR_BACKUP_CODES_DESC = "Jeżeli nie możesz otrzymać kodu poprzez apikację Google Authenticator, możesz użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna." TWO_FACTOR_BACKUP_CODES_DESC = "Jeżeli nie możesz otrzymać kodu poprzez usługę Google Authenticator, możesz użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna."
TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Nie możesz zmienić tego ustawienia przed jego przetestowaniem." TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Nie możesz zmienić tego ustawienia przed jego przetestowaniem."
[TITLES] [TITLES]
LOADING = "Ładowanie" LOADING = "Ładowanie..."
LOGIN = "Login" LOGIN = "Login"
MAILBOX = "Skrzynka Pocztowa" MAILBOX = "Skrzynka Pocztowa"
SETTINGS = "Ustawienia" SETTINGS = "Ustawienia"
@ -442,7 +442,7 @@ LABEL_FILTERS_NAME = "Filtry"
LABEL_TEMPLATES_NAME = "Szablony" LABEL_TEMPLATES_NAME = "Szablony"
LABEL_SECURITY_NAME = "Bezpieczeństwo" LABEL_SECURITY_NAME = "Bezpieczeństwo"
LABEL_SOCIAL_NAME = "Sieci społecznościowe" LABEL_SOCIAL_NAME = "Sieci społecznościowe"
LABEL_THEMES_NAME = "Skórki" LABEL_THEMES_NAME = "Motywy"
LABEL_CHANGE_PASSWORD_NAME = "Hasło" LABEL_CHANGE_PASSWORD_NAME = "Hasło"
LABEL_OPEN_PGP_NAME = "OpenPGP" LABEL_OPEN_PGP_NAME = "OpenPGP"
BUTTON_BACK = "Wstecz" BUTTON_BACK = "Wstecz"
@ -453,56 +453,56 @@ BUTTON_SAVE = "Zapisz"
BUTTON_ADD_FILTER = "Dodaj filtr" BUTTON_ADD_FILTER = "Dodaj filtr"
BUTTON_DELETE = "Usuń" BUTTON_DELETE = "Usuń"
BUTTON_RAW_SCRIPT = "Utwórz własny skrypt użytkownika" BUTTON_RAW_SCRIPT = "Utwórz własny skrypt użytkownika"
SUBNAME_NONE = "None" SUBNAME_NONE = "Brak"
SUBNAME_MOVE_TO = "Przenieś do \"%FOLDER%\"" SUBNAME_MOVE_TO = "Przenieś do \"%FOLDER%\""
SUBNAME_FORWARD_TO = "Przekaż do \"%EMAIL%\"" SUBNAME_FORWARD_TO = "Przekaż do \"%EMAIL%\""
SUBNAME_REJECT = "Odrzuć" SUBNAME_REJECT = "Odrzuć"
SUBNAME_VACATION_MESSAGE = "Wiadomość o nieobecności" SUBNAME_VACATION_MESSAGE = "Wiadomość urlopowa"
SUBNAME_DISCARD = "Usuń" SUBNAME_DISCARD = "Usuń"
CAPABILITY_LABEL = "Możliwości" CAPABILITY_LABEL = "Możliwości"
LOADING_PROCESS = "Aktualizowanie listy filtrów" LOADING_PROCESS = "Aktualizowanie listy filtrów"
DELETING_ASK = "Czy jesteś pewny(a)?" DELETING_ASK = "Czy jesteś pewny(a)?"
CHACHES_NEED_TO_BE_SAVED_DESC = "Zmiany muszą zostać zapisane na serwerze." CHACHES_NEED_TO_BE_SAVED_DESC = "Zmiany te muszą zostać zapisane na serwerze."
[SETTINGS_IDENTITY] [SETTINGS_IDENTITY]
LEGEND_IDENTITY = "Tożsamość" LEGEND_IDENTITY = "Tożsamość"
LABEL_DISPLAY_NAME = "Imię i nazwisko" LABEL_DISPLAY_NAME = "Imię i nazwisko"
LABEL_REPLY_TO = "Zwrotny adres e-mail" LABEL_REPLY_TO = "Zwrot do"
LABEL_SIGNATURE = "Podpis" LABEL_SIGNATURE = "Podpis"
LABEL_ADD_SIGNATURE_TO_ALL = "Dadawaj podpis do wszystkich wysyłanych wiadomości" LABEL_ADD_SIGNATURE_TO_ALL = "Dadawaj podpis do wszystkich wiadomości"
[SETTINGS_SECURITY] [SETTINGS_SECURITY]
LEGEND_SECURITY = "Bezpieczeństwo" LEGEND_SECURITY = "Bezpieczeństwo"
LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_CONFIGURATE_TWO_FACTOR = "Konfiguracja dwuskładnikowej autoryzacji"
LABEL_AUTOLOGOUT = "Automatyczne wylogowanie" LABEL_AUTOLOGOUT = "Auto. wylogowanie:"
AUTOLOGIN_NEVER_OPTION_NAME = "Nidgy" AUTOLOGIN_NEVER_OPTION_NAME = "Nidgy"
AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minut" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minut"
[SETTINGS_GENERAL] [SETTINGS_GENERAL]
LEGEND_GENERAL = "Ogólne" LEGEND_GENERAL = "Ogólne"
LABEL_LANGUAGE = "Język" LABEL_LANGUAGE = "Język:"
LABEL_IDENTITY = "Tożsamość" LABEL_IDENTITY = "Tożsamość:"
LABEL_LAYOUT = "Układ" LABEL_LAYOUT = "Układ:"
LABEL_LAYOUT_NO_SPLIT = "Bez podziału" LABEL_LAYOUT_NO_SPLIT = "bez podziału"
LABEL_LAYOUT_VERTICAL_SPLIT = "Podział w pionie" LABEL_LAYOUT_VERTICAL_SPLIT = "podział w pionie"
LABEL_LAYOUT_HORIZONTAL_SPLIT = "Poział w poziomie" LABEL_LAYOUT_HORIZONTAL_SPLIT = "podział w poziomie"
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"
LABEL_EDITOR_HTML_FORCED = "HTML (wymuszony)" LABEL_EDITOR_HTML_FORCED = "HTML (wymuszony)"
LABEL_EDITOR_PLAIN_FORCED = "Zwykły tekst (wymuszony)" LABEL_EDITOR_PLAIN_FORCED = "zwykły tekst (wymuszony)"
LABEL_ANIMATION = "Animacja interfejsu" LABEL_ANIMATION = "Animacja interfejsu"
LABEL_ANIMATION_FULL = "Pełna" LABEL_ANIMATION_FULL = "pełna"
LABEL_ANIMATION_NORMAL = "Zwykła" LABEL_ANIMATION_NORMAL = "zwykła"
LABEL_ANIMATION_NONE = "Brak" LABEL_ANIMATION_NONE = "brak"
LABEL_VIEW_OPTIONS = "Opcje wyświetlania" LABEL_VIEW_OPTIONS = "Opcje wyświetlania"
LABEL_USE_PREVIEW_PANE = "Wyświetl okno podglądu" LABEL_USE_PREVIEW_PANE = "Wyświetl okno podglądu"
LABEL_USE_CHECKBOXES_IN_LIST = "Wyświetl pola zaznaczenia w listach" LABEL_USE_CHECKBOXES_IN_LIST = "Wyświetl pola zaznaczenia w listach"
LABEL_USE_THREADS = "Używaj wątków" LABEL_USE_THREADS = "Używaj wątków"
LABEL_REPLY_SAME_FOLDER = "Umieść odpowiedź w folderze wiadomości, na którą udzielana jest odpowiedź" LABEL_REPLY_SAME_FOLDER = "Umieść odpowiedzi w folderach, z których pochodzą wiadomości"
LABEL_SHOW_IMAGES = "Zawsze wyświetlaj obrazy w wiadomościach" LABEL_SHOW_IMAGES = "Zawsze wyświetlaj obrazy w wiadomościach"
LABEL_SHOW_ANIMATION = "Odtwarzaj animacje" LABEL_SHOW_ANIMATION = "Użyj animacji"
LABEL_MESSAGE_PER_PAGE = "Wiadomości na stronie" LABEL_MESSAGE_PER_PAGE = "Wiad. na stronie:"
LABEL_NOTIFICATIONS = "Powiadomienia" LABEL_NOTIFICATIONS = "Powiadomienia"
LABEL_SOUND_NOTIFICATION = "Powiadomienia dźwiękowe" LABEL_SOUND_NOTIFICATION = "Powiadomienia dźwiękowe"
LABEL_CHROME_NOTIFICATION_DESC = "Wyświetlaj powiadomienia o nowych wiadomościach" LABEL_CHROME_NOTIFICATION_DESC = "Wyświetlaj powiadomienia o nowych wiadomościach"
@ -513,14 +513,14 @@ LEGEND_CONTACTS = "Kontakty"
LABEL_CONTACTS_AUTOSAVE = "Automatycznie dodaj nieznanych nadawców i odbiorców do książki adresowej" LABEL_CONTACTS_AUTOSAVE = "Automatycznie dodaj nieznanych nadawców i odbiorców do książki adresowej"
LEGEND_CONTACTS_SYNC = "Zdalna synchronizacja (CardDAV)" LEGEND_CONTACTS_SYNC = "Zdalna synchronizacja (CardDAV)"
LABEL_CONTACTS_SYNC_ENABLE = "Włącz zdalną synchronizację" LABEL_CONTACTS_SYNC_ENABLE = "Włącz zdalną synchronizację"
LABEL_CONTACTS_SYNC_SERVER = "Serwer" LABEL_CONTACTS_SYNC_SERVER = "Serwer:"
LABEL_CONTACTS_SYNC_AB_URL = "Adres URL" LABEL_CONTACTS_SYNC_AB_URL = "Adres URL:"
LABEL_CONTACTS_SYNC_USER = "Użytkownik" LABEL_CONTACTS_SYNC_USER = "Użytkownik:"
LABEL_CONTACTS_SYNC_PASSWORD = "Hasło" LABEL_CONTACTS_SYNC_PASSWORD = "Hasło:"
[SETTINGS_THEMES] [SETTINGS_THEMES]
LEGEND_THEMES = "Skórki" LEGEND_THEMES = "Motyw"
LEGEND_THEMES_CUSTOM = "Konfiguracja indywidualnego wyglądu" LEGEND_THEMES_CUSTOM = "Własny motyw"
LABEL_CUSTOM_TYPE = "Typ" LABEL_CUSTOM_TYPE = "Typ"
LABEL_CUSTOM_TYPE_LIGHT = "Jasny" LABEL_CUSTOM_TYPE_LIGHT = "Jasny"
LABEL_CUSTOM_TYPE_DARK = "Ciemny" LABEL_CUSTOM_TYPE_DARK = "Ciemny"
@ -534,15 +534,15 @@ ERROR_UNKNOWN = "Wystąpił nieznany błąd w trakcie przesyłania"
LEGEND_GOOGLE = "Konto Google" LEGEND_GOOGLE = "Konto Google"
BUTTON_GOOGLE_CONNECT = "Połącz z Google" BUTTON_GOOGLE_CONNECT = "Połącz z Google"
BUTTON_GOOGLE_DISCONNECT = "Odłącz" BUTTON_GOOGLE_DISCONNECT = "Odłącz"
MAIN_GOOGLE_DESC = "Po zezwoleniu na logowanie przez Google, możesz zalogować się na to konto używając przycisku: \"Google\" w panelu logowania." MAIN_GOOGLE_DESC = "Po zezwoleniu na logowanie przez: Google, możesz zalogować się na to konto używając przycisku: \"Google\" w panelu logowania."
LEGEND_FACEBOOK = "Facebook" LEGEND_FACEBOOK = "Facebook"
BUTTON_FACEBOOK_CONNECT = "Połącz z Facebook" BUTTON_FACEBOOK_CONNECT = "Połącz z Facebook"
BUTTON_FACEBOOK_DISCONNECT = "Odłącz" BUTTON_FACEBOOK_DISCONNECT = "Odłącz"
MAIN_FACEBOOK_DESC = "Po zezwoleniu na logowanie przez Facebook, możesz zalogować się na to konto używając przycisku: \"Facebook\" w panelu logowania." MAIN_FACEBOOK_DESC = "Po zezwoleniu na logowanie przez: Facebook, możesz zalogować się na to konto używając przycisku: \"Facebook\" w panelu logowania."
LEGEND_TWITTER = "Twitter" LEGEND_TWITTER = "Twitter"
BUTTON_TWITTER_CONNECT = "Połącz z Twitter" BUTTON_TWITTER_CONNECT = "Połącz z Twitter"
BUTTON_TWITTER_DISCONNECT = "Odłącz" BUTTON_TWITTER_DISCONNECT = "Odłącz"
MAIN_TWITTER_DESC = "Po zezwoleniu na logowanie przez Twitter, możesz zalogować się na to konto używając przycisku: \"Twitter\" w panelu logowania." MAIN_TWITTER_DESC = "Po zezwoleniu na logowanie przez: Twitter, możesz zalogować się na to konto używając przycisku: \"Twitter\" w panelu logowania."
[SETTINGS_FOLDERS] [SETTINGS_FOLDERS]
LEGEND_FOLDERS = "Lista Folderów" LEGEND_FOLDERS = "Lista Folderów"
@ -551,7 +551,7 @@ BUTTON_SYSTEM = "Wybierz foldery systemowe"
BUTTON_DELETE = "Usuń" BUTTON_DELETE = "Usuń"
BUTTON_SUBSCRIBE = "Subskrybuj" BUTTON_SUBSCRIBE = "Subskrybuj"
BUTTON_UNSUBSCRIBE = "Zrezygnuj z subskrypcji" BUTTON_UNSUBSCRIBE = "Zrezygnuj z subskrypcji"
LOADING_PROCESS = "Trwa aktualizacja listy folderów" LOADING_PROCESS = "Aktualizacja listy folderów"
CREATING_PROCESS = "Tworzenie folderu" CREATING_PROCESS = "Tworzenie folderu"
DELETING_PROCESS = "Usuwanie folderu" DELETING_PROCESS = "Usuwanie folderu"
RENAMING_PROCESS = "Zmiana nazwy folderu" RENAMING_PROCESS = "Zmiana nazwy folderu"
@ -563,7 +563,7 @@ HELP_SHOW_HIDE_FOLDER = "Pokaż/ukryj folder"
HELP_CHECK_FOR_NEW_MESSAGES = "Sprawdzaj/nie sprawdzaj nowych wiadomości" HELP_CHECK_FOR_NEW_MESSAGES = "Sprawdzaj/nie sprawdzaj nowych wiadomości"
[SETTINGS_ACCOUNTS] [SETTINGS_ACCOUNTS]
LEGEND_ACCOUNTS = "Lista kont" LEGEND_ACCOUNTS = "Konta"
LEGEND_IDENTITIES = "Tożsamości" LEGEND_IDENTITIES = "Tożsamości"
LEGEND_ACCOUNTS_AND_IDENTITIES = "Konta i tożsamości" LEGEND_ACCOUNTS_AND_IDENTITIES = "Konta i tożsamości"
BUTTON_ADD_ACCOUNT = "Dodaj konto" BUTTON_ADD_ACCOUNT = "Dodaj konto"
@ -577,9 +577,9 @@ DEFAULT_IDENTITY_LABEL = "domyślna"
LEGEND_IDENTITY = "Tożsamość" LEGEND_IDENTITY = "Tożsamość"
LEGEND_IDENTITIES = "Dodatkowe tożsamości" LEGEND_IDENTITIES = "Dodatkowe tożsamości"
LABEL_DEFAULT = "Domyślna" LABEL_DEFAULT = "Domyślna"
LABEL_DISPLAY_NAME = "Nazwa" LABEL_DISPLAY_NAME = "Nazwa:"
LABEL_REPLY_TO = "Odpowiedź do" LABEL_REPLY_TO = "Odpowiedź do:"
LABEL_SIGNATURE = "Podpis" LABEL_SIGNATURE = "Podpis:"
LABEL_ADD_SIGNATURE_TO_ALL = "Dodaj podpis do wszystkich wysyłanych wiadomości" LABEL_ADD_SIGNATURE_TO_ALL = "Dodaj podpis do wszystkich wysyłanych wiadomości"
BUTTON_ADD_IDENTITY = "Dodaj tożsamość" BUTTON_ADD_IDENTITY = "Dodaj tożsamość"
BUTTON_DELETE = "Usuń" BUTTON_DELETE = "Usuń"
@ -588,9 +588,9 @@ DELETING_ASK = "Czy na pewno chcesz usunąć?"
[SETTINGS_CHANGE_PASSWORD] [SETTINGS_CHANGE_PASSWORD]
LEGEND_CHANGE_PASSWORD = "Zmiana hasła" LEGEND_CHANGE_PASSWORD = "Zmiana hasła"
LABEL_CURRENT_PASSWORD = "Aktualne hasło" LABEL_CURRENT_PASSWORD = "Aktualne hasło:"
LABEL_NEW_PASSWORD = "Nowe hasło" LABEL_NEW_PASSWORD = "Nowe hasło:"
LABEL_REPEAT_PASSWORD = "Powtórz nowe hasło" LABEL_REPEAT_PASSWORD = "Powtórz nowe hasło:"
BUTTON_UPDATE_PASSWORD = "Zmień hasło na nowe" BUTTON_UPDATE_PASSWORD = "Zmień hasło na nowe"
ERROR_PASSWORD_MISMATCH = "Wpisane hasła nie pasują do siebie, proszę spróbować ponownie" ERROR_PASSWORD_MISMATCH = "Wpisane hasła nie pasują do siebie, proszę spróbować ponownie"
@ -643,13 +643,13 @@ LABEL_SEND_MESSAGE = "Wyślij wiadomość"
LABEL_CLOSE_COMPOSE = "Zamknij okno tworzenia wiadomości" LABEL_CLOSE_COMPOSE = "Zamknij okno tworzenia wiadomości"
[PGP_NOTIFICATIONS] [PGP_NOTIFICATIONS]
NO_PUBLIC_KEYS_FOUND = "Nie znaleziono kluczy publicznych" NO_PUBLIC_KEYS_FOUND = "Nie znaleziono klucza publicznego"
NO_PUBLIC_KEYS_FOUND_FOR = "Nie znaleziono kluczy publicznych dla adresu: \"%EMAIL%\"" NO_PUBLIC_KEYS_FOUND_FOR = "Nie znaleziono klucza publicznego dla adresu: \"%EMAIL%\""
NO_PRIVATE_KEY_FOUND = "Nie znaleziono kluczy prywatnych" NO_PRIVATE_KEY_FOUND = "Nie znaleziono klucza prywatnego"
NO_PRIVATE_KEY_FOUND_FOR = "Nie znaleziono kluczy prywatnych dla adresu: \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND_FOR = "Nie znaleziono klucza prywatnego dla adresu: \"%EMAIL%\""
UNVERIFIRED_SIGNATURE = "Niezweryfikowana sygnatura" UNVERIFIRED_SIGNATURE = "Niezweryfikowana"
DECRYPTION_ERROR = "Błąd deszyfrowania OpenPGP" DECRYPTION_ERROR = "Błąd deszyfrowania OpenPGP"
GOOD_SIGNATURE = "Wiadomość podpisana przez: %USER%" GOOD_SIGNATURE = "Podpisana przez: %USER%"
PGP_ERROR = "Błąd OpenPGP: %ERROR%" PGP_ERROR = "Błąd OpenPGP: %ERROR%"
SPECIFY_FROM_EMAIL = "Proszę podać adres e-mail w polu: OD" SPECIFY_FROM_EMAIL = "Proszę podać adres e-mail w polu: OD"
SPECIFY_AT_LEAST_ONE_RECIPIENT = "Proszę podać przynajmniej jednego odbiorcę" SPECIFY_AT_LEAST_ONE_RECIPIENT = "Proszę podać przynajmniej jednego odbiorcę"
@ -665,8 +665,8 @@ SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Twitter), nie je
SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Konto Google), nie jest powiązane z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe" SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "To społecznościowe ID (Konto Google), nie jest powiązane z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe"
DOMAIN_NOT_ALLOWED = "Domena niedozwolona" DOMAIN_NOT_ALLOWED = "Domena niedozwolona"
ACCOUNT_NOT_ALLOWED = "Konto nie jest dozwolone" ACCOUNT_NOT_ALLOWED = "Konto nie jest dozwolone"
ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Wymagana 2-stopniowa weryfikacja" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Wymagana dwuskładnikowa autoryzacja"
ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Błąd 2-stopniowej weryfikacji" ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Błąd dwuskładnikowej autoryzacji"
COULD_NOT_SAVE_NEW_PASSWORD = "Nie można było zapisać nowego hasła" COULD_NOT_SAVE_NEW_PASSWORD = "Nie można było zapisać nowego hasła"
CURRENT_PASSWORD_INCORRECT = "Obecne hasło jest niepoprawne" CURRENT_PASSWORD_INCORRECT = "Obecne hasło jest niepoprawne"
NEW_PASSWORD_SHORT = "Hasło jest za krótkie" NEW_PASSWORD_SHORT = "Hasło jest za krótkie"

File diff suppressed because one or more lines are too long

View file

@ -12,6 +12,7 @@ module.exports = {
publicPath: 'rainloop/v/0.0.0/static/js/', publicPath: 'rainloop/v/0.0.0/static/js/',
chunkFilename: '[chunkhash].subapp.js' chunkFilename: '[chunkhash].subapp.js'
}, },
// devtool: "#source-map",
plugins: [ plugins: [
// new webpack.optimize.CommonsChunkPlugin('common.js'), // new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.optimize.OccurenceOrderPlugin() new webpack.optimize.OccurenceOrderPlugin()