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',
'Menu': 'menu',
'PopupComposeOpenPGP': 'compose-open-pgp',
'PopupMessageOpenPGP': 'message-open-pgp',
'PopupKeyboardShortcutsHelp': 'popup-keyboard-shortcuts-help',
'PopupAsk': 'popup-ask'
};

View file

@ -390,7 +390,7 @@
*/
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'),
_ = require('_'),
$ = require('$'),
JSON = require('JSON'),
Opentip = require('Opentip'),
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 = {
'init': function (oElement, fValueAccessor) {

View file

@ -14,8 +14,6 @@
Globals = require('Common/Globals'),
Links = require('Common/Links'),
PgpStore = require('Stores/User/Pgp'),
AttachmentModel = require('Model/Attachment'),
MessageHelper = require('Helper/Message'),
@ -82,7 +80,6 @@
}, this);
this.body = null;
this.plainRaw = '';
this.isHtml = ko.observable(false);
this.hasImages = ko.observable(false);
@ -984,25 +981,6 @@
{
this.body.data('rl-is-html', !!this.isHtml());
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.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('_'),
ko = require('ko'),
PgpStore = require('Stores/User/Pgp'),
AbstractModel = require('Knoin/AbstractModel')
;
@ -45,6 +47,22 @@
OpenPgpKeyModel.prototype.armor = '';
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;
}());

View file

@ -22,6 +22,7 @@
AppStore = require('Stores/User/App'),
FolderStore = require('Stores/User/Folder'),
PgpStore = require('Stores/User/Pgp'),
SettingsStore = require('Stores/User/Settings'),
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)
{
var
@ -512,6 +526,7 @@
oBody = null,
oTextBody = null,
sId = '',
sPlain = '',
sResultHtml = '',
bPgpSigned = false,
bPgpEncrypted = false,
@ -579,13 +594,13 @@
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)
{
bPgpSigned = /-----BEGIN PGP SIGNED MESSAGE-----/.test(oMessage.plainRaw) &&
/-----BEGIN PGP SIGNATURE-----/.test(oMessage.plainRaw);
bPgpSigned = /-----BEGIN PGP SIGNED MESSAGE-----/.test(sPlain) &&
/-----BEGIN PGP SIGNATURE-----/.test(sPlain);
}
Globals.$div.empty();
@ -593,7 +608,7 @@
{
sResultHtml =
Globals.$div.append(
$('<pre class="b-plain-openpgp signed"></pre>').text(oMessage.plainRaw)
$('<pre class="b-plain-openpgp signed"></pre>').text(sPlain)
).html()
;
}
@ -601,11 +616,13 @@
{
sResultHtml =
Globals.$div.append(
$('<pre class="b-plain-openpgp encrypted"></pre>').text(oMessage.plainRaw)
$('<pre class="b-plain-openpgp encrypted"></pre>').text(sPlain)
).html()
;
}
sPlain = '';
Globals.$div.empty();
oMessage.isPgpSigned(bPgpSigned);
@ -624,8 +641,6 @@
oMessage.isHtml(!!bIsHtml);
oMessage.hasImages(!!bHasExternals);
oMessage.pgpSignedVerifyStatus(Enums.SignedVerifyStatus.None);
oMessage.pgpSignedVerifyUser('');
oMessage.body = oBody;
if (oMessage.body)
@ -663,6 +678,8 @@
if (oBody)
{
this.initOpenPgpControls(oBody);
this.initBlockquoteSwitcher(oBody);
}

View file

@ -5,6 +5,10 @@
var
_ = require('_'),
ko = require('ko'),
$ = require('$'),
kn = require('Knoin/Knoin'),
Translator = require('Common/Translator'),
Utils = require('Common/Utils')
;
@ -41,32 +45,41 @@
PgpUserStore.prototype.findPublicKeyByHex = function (sHash)
{
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)
{
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;
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;
if (oItem && sEmail === oItem.email)
{
try
{
oKey = self.openpgp.key.readArmored(oItem.armor);
if (oKey && !oKey.err && oKey.keys && oKey.keys[0])
{
return oKey.keys[0];
}
}
catch (e) {}
}
return null;
}));
PgpUserStore.prototype.findPrivateKeysByEncryptionKeyIds = function (aEncryptionKeyIds, bReturnWrapKeys)
{
var self = this;
return _.compact(_.flatten(_.map(aEncryptionKeyIds, function (oId) {
var oKey = oId && oId.toHex ? self.findPrivateKeyByHex(oId.toHex()) : null;
return oKey ? (bReturnWrapKeys ? [oKey] : oKey.getNativeKeys()) : [null];
}), true));
};
/**
@ -77,6 +90,7 @@
PgpUserStore.prototype.findPrivateKeyByEmail = function (sEmail, sPassword)
{
var
oPrivateKeys = [],
oPrivateKey = null,
oKey = _.find(this.openpgpkeysPrivate(), function (oItem) {
return oItem && sEmail === oItem.email;
@ -85,18 +99,15 @@
if (oKey)
{
oPrivateKeys = oKey.getNativeKeys();
oPrivateKey = oPrivateKeys[0] || null;
try
{
oPrivateKey = this.openpgp.key.readArmored(oKey.armor);
if (oPrivateKey && !oPrivateKey.err && oPrivateKey.keys && oPrivateKey.keys[0])
if (oPrivateKey)
{
oPrivateKey = oPrivateKey.keys[0];
oPrivateKey.decrypt(Utils.pString(sPassword));
}
else
{
oPrivateKey = null;
}
}
catch (e)
{
@ -116,6 +127,259 @@
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();
}());

View file

@ -407,6 +407,16 @@ html.rl-no-preview-pane {
display: inline-block;
padding: 6px 10px;
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 {
@ -424,6 +434,27 @@ html.rl-no-preview-pane {
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 {
.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 {
background-color: #fff;
@ -18,4 +18,35 @@
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);
});
},
this.oEditor.getData(),
this.oEditor.getData(false, true),
this.currentIdentity(),
this.to(),
this.cc(),

View file

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

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 () {
mKeyPair = false;
var mPromise = false;
try {
mKeyPair = PgpStore.openpgp.generateKeyPair({
mPromise = PgpStore.openpgp.generateKeyPair({
'userId': sUserID,
'numBits': Utils.pInt(self.keyBitLength()),
'passphrase': Utils.trim(self.password())
});
} catch (e) {
// window.console.log(e);
}
if (mKeyPair && mKeyPair.privateKeyArmored)
{
oOpenpgpKeyring.privateKeys.importKey(mKeyPair.privateKeyArmored);
oOpenpgpKeyring.publicKeys.importKey(mKeyPair.publicKeyArmored);
oOpenpgpKeyring.store();
mPromise.then(function () {
require('App/User').reloadOpenPgpKeys();
Utils.delegateRun(self, 'cancelCommand');
}
self.submitRequest(false);
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);
return true;

View file

@ -303,16 +303,6 @@
this.viewIsImportant = 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 () {
var sResult = 'icon-none iconcolor-display-none';
@ -361,8 +351,6 @@
this.messageActiveDom(null);
this.viewPgpPassword('');
if (oMessage)
{
this.showAttachmnetControls(false);
@ -523,48 +511,6 @@
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 ()
{
this.fullScreenMode(true);
@ -1256,31 +1202,6 @@
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
*/

View file

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

View file

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

View file

@ -38,7 +38,7 @@
</div>
</form>
<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>
</center>
</div>

View file

@ -68,7 +68,7 @@
<span data-i18n="TAB_LICENSING/BUTTON_ACTIVATE"></span>
</a>
&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>
&nbsp;&nbsp;
<span data-i18n="TAB_LICENSING/BUTTON_PURCHASE"></span>

View file

@ -116,7 +116,7 @@
</form>
</div>
<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 class="e-languages thm-languages" data-bind="visible: allowLanguagesOnLogin() && socialLoginEnabled()">
<label class="flag-selector">

View file

@ -330,25 +330,6 @@
&nbsp;&nbsp;
<span class="i18n text" data-i18n="MESSAGE/BUTTON_NOTIFY_READ_RECEIPT"></span>
</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(),
css: {'selection-mode' : showAttachmnetControls, 'unselectedAttachmentsError': highlightUnselectedAttachments}">
<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;
<span class="i18n" data-i18n="SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY"></span>
</a>
&nbsp;&nbsp;
<!-- &nbsp;&nbsp;
<a class="btn" data-bind="click: generateOpenPgpKey">
<i class="icon-key"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n="SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS"></span>
</a>
</a>-->
<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_SIGN_AND_ENCRYPT = "Sign and encrypt"
[POPUPS_MESSAGE_OPEN_PGP]
TITLE_MESSAGE_OPEN_PGP = "OpenPGP Decrypt"
LABEL_KEY = "Private Key"
LABEL_PASSWORD = "Password"
BUTTON_DECRYPT = "Decrypt"
[POPUPS_TWO_FACTOR_TEST]
TITLE_TEST_CODE = "2-Step verification test"
LABEL_CODE = "Code"

View file

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