Merge branch 'staging' into communities-trim

This commit is contained in:
yflory
2020-02-11 11:10:12 +01:00
47 changed files with 1525 additions and 1280 deletions

View File

@@ -62,7 +62,9 @@ var factory = function (Util, Crypto, Nacl) {
};
Hash.getHiddenHashFromKeys = function (type, secret, opts) {
var mode = ((secret.keys && secret.keys.editKeyStr) || secret.key) ? 'edit/' : 'view/';
opts = opts || {};
var canEdit = (secret.keys && secret.keys.editKeyStr) || secret.key;
var mode = (!opts.view && canEdit) ? 'edit/' : 'view/';
var pass = secret.password ? 'p/' : '';
if (secret.keys && secret.keys.fileKeyStr) { mode = ''; }

View File

@@ -70,6 +70,7 @@ define([
if (typeof(yes) === 'function') { yes(e); }
break;
}
$(el || window).off('keydown', handler);
};
$(el || window).keydown(handler);
@@ -587,7 +588,7 @@ define([
$ok.click();
}, function () {
$cancel.click();
}, ok);
}, frame);
document.body.appendChild(frame);
setTimeout(function () {
@@ -1117,7 +1118,7 @@ define([
var dontShowAgain = h('div.cp-corner-dontshow', [
h('span.fa.fa-times'),
Messages.dontShowAgain || "Don't show again" // XXX
Messages.dontShowAgain
]);
var popup = h('div.cp-corner-container', [

View File

@@ -554,21 +554,27 @@ define([
if (!data.noPassword) {
var hasPassword = data.password;
var $pwLabel = $('<label>', {'for': 'cp-app-prop-password'}).text(Messages.creation_passwordValue)
.hide().appendTo($d);
var password = UI.passwordInput({
id: 'cp-app-prop-password',
readonly: 'readonly'
});
var $password = $(password).hide();
var $pwInput = $password.find('.cp-password-input');
$pwInput.val(data.password).click(function () {
$pwInput[0].select();
});
$d.append(password);
if (hasPassword) {
$('<label>', {'for': 'cp-app-prop-password'}).text(Messages.creation_passwordValue)
.appendTo($d);
var password = UI.passwordInput({
id: 'cp-app-prop-password',
readonly: 'readonly'
});
var $pwInput = $(password).find('.cp-password-input');
$pwInput.val(data.password).click(function () {
$pwInput[0].select();
});
$d.append(password);
$pwLabel.show();
$password.css('display', 'flex');
}
if (!data.noEditPassword && owned) { // FIXME SHEET fix password change for sheets
// In the properties, we should have the edit href if we know it.
// We should know it because the pad is stored, but it's better to check...
if (!data.noEditPassword && owned && data.href) { // FIXME SHEET fix password change for sheets
var sframeChan = common.getSframeChannel();
var isOO = parsed.type === 'sheet';
@@ -628,7 +634,7 @@ define([
sframeChan.query(q, {
teamId: typeof(owned) !== "boolean" ? owned : undefined,
href: data.href || data.roHref,
href: data.href,
password: newPass
}, function (err, data) {
$(passwordOk).text(Messages.properties_changePasswordButton);
@@ -638,24 +644,41 @@ define([
return void UI.alert(Messages.properties_passwordError);
}
UI.findOKButton().click();
if (isFile) {
onProgress.stop();
$pwLabel.show();
$password.css('display', 'flex');
$pwInput.val(newPass);
// If the current document is a file or if we're changing the password from a drive,
// we don't have to reload the page at the end.
// Tell the user the password change was successful and abort
if (isFile || priv.app !== parsed.type) {
if (onProgress && onProgress.stop) { onProgress.stop(); }
$(passwordOk).text(Messages.properties_changePasswordButton);
var alertMsg = data.warning ? Messages.properties_passwordWarningFile
: Messages.properties_passwordSuccessFile;
return void UI.alert(alertMsg, undefined, {force: true});
}
// If we didn't have a password, we have to add the /p/
// If we had a password and we changed it to a new one, we just have to reload
// If we had a password and we removed it, we have to remove the /p/
// Pad password changed: update the href
// Use hidden hash if needed (we're an owner of this pad so we know it is stored)
var useUnsafe = Util.find(priv, ['settings', 'security', 'unsafeLinks']);
var href = (priv.readOnly && data.roHref) ? data.roHref : data.href;
if (useUnsafe === false) {
var newParsed = Hash.parsePadUrl(href);
var newSecret = Hash.getSecrets(newParsed.type, newParsed.hash, newPass);
var newHash = Hash.getHiddenHashFromKeys(parsed.type, newSecret, {});
href = Hash.hashToHref(newHash, parsed.type);
}
if (data.warning) {
return void UI.alert(Messages.properties_passwordWarning, function () {
common.gotoURL(hasPassword && newPass ? undefined : (data.href || data.roHref));
common.gotoURL(href);
}, {force: true});
}
return void UI.alert(Messages.properties_passwordSuccess, function () {
if (!isSharedFolder) {
common.gotoURL(hasPassword && newPass ? undefined : (data.href || data.roHref));
common.gotoURL(href);
}
}, {force: true});
});
@@ -3817,7 +3840,7 @@ define([
]);
var settings = h('div.cp-creation-remember', [
UI.createCheckbox('cp-creation-remember', Messages.creation_saveSettings, false),
UI.createCheckbox('cp-creation-remember', Messages.dontShowAgain, false),
createHelper('/settings/#creation', Messages.creation_settings),
h('div.cp-creation-remember-help.cp-creation-slider', [
h('span.fa.fa-exclamation-circle.cp-creation-warning'),

View File

@@ -1037,11 +1037,12 @@ define([
}, waitFor());
}
}).nThen(function () {
common.drive.onChange.fire({path: ['drive', Constants.storageKey]});
cb({
warning: warning,
hash: newHash,
href: newHref,
roHref: newRoHref
roHref: newRoHref,
});
});
};
@@ -1170,6 +1171,7 @@ define([
channel: newSecret.channel
}, waitFor());
}).nThen(function () {
common.drive.onChange.fire({path: ['drive', Constants.storageKey]});
cb({
warning: warning,
hash: newHash,
@@ -1404,6 +1406,7 @@ define([
}, waitFor());
}));
}).nThen(function () {
common.drive.onChange.fire({path: ['drive', Constants.storageKey]});
cb({
warning: warning,
hash: newHash,
@@ -2121,7 +2124,10 @@ define([
var parsedNew = Hash.parsePadUrl(newHref);
if (parsedOld.hashData && parsedNew.hashData &&
parsedOld.getUrl() !== parsedNew.getUrl()) {
if (!parsedOld.hashData.key) { oldHref = newHref; return; }
if (parsedOld.hashData.version !== 3 && !parsedOld.hashData.key) {
oldHref = newHref;
return;
}
// If different, reload
document.location.reload();
return;

View File

@@ -587,7 +587,7 @@ define([
var displayedCategories = [ROOT, TRASH, SEARCH, RECENT];
// PCS enabled: display owned pads
if (AppConfig.displayCreationScreen) { displayedCategories.push(OWNED); }
//if (AppConfig.displayCreationScreen) { displayedCategories.push(OWNED); }
// Templates enabled: display template category
if (AppConfig.enableTemplates) { displayedCategories.push(TEMPLATE); }
// Tags used: display Tags category
@@ -1037,18 +1037,16 @@ define([
var href = isRo ? data.roHref : (data.href || data.roHref);
var priv = metadataMgr.getPrivateData();
var useUnsafe = Util.find(priv, ['settings', 'security', 'unsafeLinks']);
if (useUnsafe) {
if (useUnsafe !== false) { // true of undefined: use unsafe links
return void window.open(APP.origin + href);
}
// Get hidden hash
var parsed = Hash.parsePadUrl(href);
var secret = Hash.getSecrets(parsed.type, parsed.hash, data.password);
if (isRo && secret.keys && secret.keys.editKeyStr) {
delete secret.keys.editKeyStr;
delete secret.key;
}
var hash = Hash.getHiddenHashFromKeys(parsed.type, secret);
var opts = {};
if (isRo) { opts.view = true; }
var hash = Hash.getHiddenHashFromKeys(parsed.type, secret, opts);
var hiddenHref = Hash.hashToHref(hash, parsed.type);
window.open(APP.origin + hiddenHref);
};
@@ -1177,13 +1175,9 @@ define([
} else if ($element.is('.cp-app-drive-element-noreadonly')) {
hide.push('openro'); // Remove open 'view' mode
}
// if it's not a plain text file
// XXX: there is a bug with this code in anon shared folder, so we disable it
if (APP.loggedIn || !APP.newSharedFolder) {
var metadata = manager.getFileData(manager.find(path));
if (!metadata || !Util.isPlainTextFile(metadata.fileType, metadata.title)) {
hide.push('openincode');
}
var metadata = manager.getFileData(manager.find(path));
if (!metadata || !Util.isPlainTextFile(metadata.fileType, metadata.title)) {
hide.push('openincode');
}
} else if ($element.is('.cp-app-drive-element-sharedf')) {
if (containsFolder) {
@@ -1206,8 +1200,7 @@ define([
hide.push('collapseall');
}
containsFolder = true;
hide.push('share'); // XXX CONVERT
hide.push('savelocal'); // XXX CONVERT
hide.push('savelocal');
hide.push('openro');
hide.push('openincode');
hide.push('properties');
@@ -1943,6 +1936,44 @@ define([
};
var getIcon = UI.getIcon;
var createShareButton = function (id, $container) {
var $shareBlock = $('<button>', {
'class': 'cp-toolbar-share-button',
title: Messages.shareButton
});
$sharedIcon.clone().appendTo($shareBlock);
$('<span>').text(Messages.shareButton).appendTo($shareBlock);
var data = manager.getSharedFolderData(id);
var parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};
var roParsed = Hash.parsePadUrl(data.roHref) || {};
if (!parsed.hash && !roParsed.hash) { return void console.error("Invalid href: "+(data.href || data.roHref)); }
var friends = common.getFriends();
var ro = folders[id] && folders[id].version >= 2;
var modal = UIElements.createShareModal({
teamId: APP.team,
origin: APP.origin,
pathname: "/drive/",
friends: friends,
title: data.title,
password: data.password,
sharedFolder: true,
common: common,
hashes: {
editHash: parsed.hash,
viewHash: ro && roParsed.hash,
}
});
// If we're a viewer and this is an old shared folder (no read-only mode), we
// can't share the read-only URL and we don't have access to the edit one.
// We should hide the share button.
if (!modal) { return; }
$shareBlock.click(function () {
UI.openCustomModal(modal);
});
$container.append($shareBlock);
return $shareBlock;
};
// Create the "li" element corresponding to the file/folder located in "path"
var createElement = function (path, elPath, root, isFolder) {
// Forbid drag&drop inside the trash
@@ -2023,6 +2054,15 @@ define([
});
delete APP.newFolder;
}
if (isSharedFolder && APP.convertedFolder === element) {
setTimeout(function () {
var $fakeButton = createShareButton(element, $('<div>'));
if (!$fakeButton) { return; }
$fakeButton.click();
}, 100);
}
return $element;
};
@@ -2560,43 +2600,6 @@ define([
$container.append($block);
};
var createShareButton = function (id, $container) {
var $shareBlock = $('<button>', {
'class': 'cp-toolbar-share-button',
title: Messages.shareButton
});
$sharedIcon.clone().appendTo($shareBlock);
$('<span>').text(Messages.shareButton).appendTo($shareBlock);
var data = manager.getSharedFolderData(id);
var parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};
var roParsed = Hash.parsePadUrl(data.roHref) || {};
if (!parsed.hash && !roParsed.hash) { return void console.error("Invalid href: "+(data.href || data.roHref)); }
var friends = common.getFriends();
var ro = folders[id] && folders[id].version >= 2;
var modal = UIElements.createShareModal({
teamId: APP.team,
origin: APP.origin,
pathname: "/drive/",
friends: friends,
title: data.title,
password: data.password,
sharedFolder: true,
common: common,
hashes: {
editHash: parsed.hash,
viewHash: ro && roParsed.hash,
}
});
// If we're a viewer and this is an old shared folder (no read-only mode), we
// can't share the read-only URL and we don't have access to the edit one.
// We should hide the share button.
if (!modal) { return; }
$shareBlock.click(function () {
UI.openCustomModal(modal);
});
$container.append($shareBlock);
};
var SORT_FOLDER_DESC = 'sortFoldersDesc';
var SORT_FILE_BY = 'sortFilesBy';
var SORT_FILE_DESC = 'sortFilesDesc';
@@ -3241,21 +3244,23 @@ define([
var path = currentPath.slice(1);
var root = Util.find(data, path);
var realPath = [ROOT, SHARED_FOLDER].concat(path);
if (manager.hasSubfolder(root)) { $list.append($folderHeader); }
// display sub directories
var keys = Object.keys(root);
var sortedFolders = sortElements(true, currentPath, keys, null, !getSortFolderDesc());
var sortedFiles = sortElements(false, currentPath, keys, APP.store[SORT_FILE_BY], !getSortFileDesc());
var sortedFolders = sortElements(true, realPath, keys, null, !getSortFolderDesc());
var sortedFiles = sortElements(false, realPath, keys, APP.store[SORT_FILE_BY], !getSortFileDesc());
sortedFolders.forEach(function (key) {
if (manager.isFile(root[key])) { return; }
var $element = createElement(currentPath, key, root, true);
var $element = createElement(realPath, key, root, true);
$element.appendTo($list);
});
if (manager.hasFile(root)) { $list.append($fileHeader); }
// display files
sortedFiles.forEach(function (key) {
if (manager.isFolder(root[key])) { return; }
var $element = createElement(currentPath, key, root, false);
var $element = createElement(realPath, key, root, false);
if (!$element) { return; }
$element.appendTo($list);
});
@@ -3340,7 +3345,9 @@ define([
// in history mode we want to focus the version number input
if (!history.isHistoryMode && !APP.mobile()) {
var st = $tree.scrollTop() || 0;
$tree.find('#cp-app-drive-tree-search-input').focus();
if (!$('.alertify').length) {
$tree.find('#cp-app-drive-tree-search-input').focus();
}
$tree.scrollTop(st);
}
$tree.find('#cp-app-drive-tree-search-input')[0].selectionStart = getSearchCursor();
@@ -3490,6 +3497,9 @@ define([
} else {
$content.scrollTop(s);
}
delete APP.convertedFolder;
appStatus.ready(true);
};
var displayDirectory = APP.displayDirectory = function (path, force) {
@@ -3977,6 +3987,14 @@ define([
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
}).nThen(function () {
common.openURL('/code/');
// We need to restore sessionStorage for the next time we want to create a pad from this tab
// NOTE: the 100ms timeout is to fix a race condition in firefox where sessionStorage
// would be deleted before the new tab was created
setTimeout(function () {
common.sessionStorage.put(Constants.newPadFileData, '', function () {});
common.sessionStorage.put(Constants.newPadPathKey, '', function () {});
common.sessionStorage.put(Constants.newPadTeamKey, '', function () {});
}, 100);
});
}
@@ -4056,8 +4074,7 @@ define([
if (manager.isFolder(el) && !manager.isSharedFolder(el)) { // Folder
// if folder is inside SF
return UI.warn('ERROR: Temporarily disabled'); // XXX CONVERT
/*if (manager.isInSharedFolder(paths[0].path)) {
if (manager.isInSharedFolder(paths[0].path)) {
return void UI.alert(Messages.convertFolderToSF_SFParent);
}
// if folder already contains SF
@@ -4085,10 +4102,14 @@ define([
if (!res) { return; }
var password = $(convertContent).find('#cp-upload-password').val() || undefined;
var owned = Util.isChecked($(convertContent).find('#cp-upload-owned'));
manager.convertFolderToSharedFolder(paths[0].path, owned, password, refresh);
manager.convertFolderToSharedFolder(paths[0].path, owned, password, function (err, obj) {
if (err || obj && obj.error) { return void console.error(err || obj.error); }
if (obj && obj.fId) { APP.convertedFolder = obj.fId; }
refresh();
});
});
}*/
} else { // File
}
} else { // File or shared folder
var sf = manager.isSharedFolder(el);
data = sf ? manager.getSharedFolderData(el) : manager.getFileData(el);
parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};

View File

@@ -33,6 +33,16 @@ define([
NetConfig, AppConfig,
Crypto, ChainPad, CpNetflux, Listmap, nThen, Saferphore) {
// Default settings for new users
var NEW_USER_SETTINGS = {
drive: {
hideDuplicate: true
},
general: {
allowUserFeedback: true
}
};
var create = function () {
var Store = window.Cryptpad_Store = {};
var postMessage = function () {};
@@ -2284,7 +2294,7 @@ define([
if (!store.loggedIn) { return void cb(); }
Store.pinPads(null, data, cb);
};
if (!proxy.settings) { proxy.settings = {}; }
if (!proxy.settings) { proxy.settings = NEW_USER_SETTINGS; }
if (!proxy.friends_pending) { proxy.friends_pending = {}; }
var manager = store.manager = ProxyManager.create(proxy.drive, {
onSync: function (cb) { onSync(null, cb); },
@@ -2370,13 +2380,7 @@ define([
}
}
if (!proxy.settings || !proxy.settings.general ||
typeof(proxy.settings.general.allowUserFeedback) !== 'boolean') {
proxy.settings = proxy.settings || {};
proxy.settings.general = proxy.settings.general || {};
proxy.settings.general.allowUserFeedback = true;
}
returned.feedback = proxy.settings.general.allowUserFeedback;
returned.feedback = Util.find(proxy, ['settings', 'general', 'allowUserFeedback']);
Feedback.init(returned.feedback);
if (typeof(cb) === 'function') { cb(returned); }

View File

@@ -587,14 +587,10 @@ define([
// convert a folder to a Shared Folder
var _convertFolderToSharedFolder = function (Env, data, cb) {
return void cb({
error: 'DISABLED'
}); // XXX CONVERT
/*var path = data.path;
var path = data.path;
var folderElement = Env.user.userObject.find(path);
// don't try to convert top-level elements (trash, root, etc) to shared-folders
// TODO also validate that you're in root (not templates, etc)
if (data.path.length <= 1) {
if (path.length <= 1 || path[0] !== UserObject.ROOT) {
return void cb({
error: 'E_INVAL_PATH',
});
@@ -664,6 +660,21 @@ define([
newPath: newPath,
copy: false,
}, waitFor());
}).nThen(function (waitFor) {
// Move the owned pads from the old folder to root
var paths = [];
Object.keys(folderElement).forEach(function (el) {
if (!Env.user.userObject.isFile(folderElement[el])) { return; }
var data = Env.user.userObject.getFileData(folderElement[el]);
if (!data || !_ownedByMe(Env, data.owners)) { return; }
// This is an owned pad: move it to ROOT before deleting the initial folder
paths.push(path.concat(el));
});
_move(Env, {
paths: paths,
newPath: [UserObject.ROOT],
copy: false,
}, waitFor());
}).nThen(function () {
// migrate metadata
var sharedFolderElement = Env.user.proxy[UserObject.SHARED_FOLDERS][SFId];
@@ -678,9 +689,11 @@ define([
// remove folder
Env.user.userObject.delete([path], function () {
cb();
cb({
fId: SFId
});
});
});*/
});
};
// Delete permanently some pads or folders

View File

@@ -53,11 +53,17 @@ define([
var $table = File.$table = $('<table>', { id: 'cp-fileupload-table' });
var hover = false;
var createTableContainer = function ($body) {
File.$container = $('<div>', { id: 'cp-fileupload' }).append(tableHeader).append($table).appendTo($body);
$('.cp-fileupload-header-close').click(function () {
File.$container.fadeOut();
});
File.$container.mouseenter(function () {
hover = true;
}).mouseleave(function () {
hover = false;
});
return File.$container;
};
@@ -202,6 +208,11 @@ define([
window.setTimeout(function () { File.$container.show(); });
var file = queue.queue.shift();
if (file.dl) { return void file.dl(file); }
if (file.$line && file.$line[0] && !hover) {
var line = file.$line[0];
line.scrollIntoView(false);
}
delete file.$line;
upload(file);
};
queue.push = function (obj) {
@@ -217,10 +228,10 @@ define([
$('<div>', {'class':'cp-fileupload-table-progressbar'}).appendTo($progressContainer);
$('<span>', {'class':'cp-fileupload-table-progress-value'}).text(Messages.upload_pending).appendTo($progressContainer);
var $tr = $('<tr>', {id: id}).appendTo($table);
var $tr = obj.$line = $('<tr>', {id: id}).appendTo($table);
var $lines = $table.find('tr[id]');
if ($lines.length > 5) {
$lines.slice(0, $lines.length - 5).remove();
//$lines.slice(0, $lines.length - 5).remove();
}
var $cancel = $('<span>', {'class': 'cp-fileupload-table-cancel-button fa fa-times'}).click(function () {
@@ -250,6 +261,13 @@ define([
// cancel
$('<td>', {'class': 'cp-fileupload-table-cancel'}).append($cancel).appendTo($tr);
var tw = $table.width();
var cw = File.$container.prop('clientWidth');
var diff = tw - cw;
if (diff && diff > 0) {
$table.css('margin-right', diff+'px');
}
queue.next();
};

View File

@@ -646,7 +646,7 @@ define([
var opts = parsed.getOptions();
var hash = Utils.Hash.getHiddenHashFromKeys(parsed.type, secret, opts);
var useUnsafe = Utils.Util.find(settings, ['security', 'unsafeLinks']);
if (!useUnsafe && window.history && window.history.replaceState) {
if (useUnsafe === false && window.history && window.history.replaceState) {
if (!/^#/.test(hash)) { hash = '#' + hash; }
window.history.replaceState({}, window.document.title, hash);
}
@@ -684,7 +684,7 @@ define([
var opts = parsed.getOptions();
var hash = Utils.Hash.getHiddenHashFromKeys(parsed.type, secret, opts);
var useUnsafe = Utils.Util.find(settings, ['security', 'unsafeLinks']);
if (!useUnsafe && window.history && window.history.replaceState) {
if (useUnsafe === false && window.history && window.history.replaceState) {
if (!/^#/.test(hash)) { hash = '#' + hash; }
window.history.replaceState({}, window.document.title, hash);
}
@@ -1125,12 +1125,12 @@ define([
});
sframeChan.on('Q_OO_PASSWORD_CHANGE', function (data, cb) {
data.href = data.href || currentPad.href;
data.href = data.href;
Cryptpad.changeOOPassword(data, cb);
});
sframeChan.on('Q_PAD_PASSWORD_CHANGE', function (data, cb) {
data.href = data.href || currentPad.href;
data.href = data.href;
Cryptpad.changePadPassword(Cryptget, Crypto, data, cb);
});

View File

@@ -142,7 +142,13 @@ define([
if (!$mt || !$mt.is('media-tag')) { return; }
var chanStr = $mt.attr('src');
var keyStr = $mt.attr('data-crypto-key');
var channel = chanStr.replace(/\/blob\/[0-9a-f]{2}\//i, '');
// Remove origin
var a = document.createElement('a');
a.href = chanStr;
var src = a.pathname;
// Get channel id
var channel = src.replace(/\/blob\/[0-9a-f]{2}\//i, '');
// Get key
var key = keyStr.replace(/cryptpad:/i, '');
var metadata = $mt[0]._mediaObject._blob.metadata;
ctx.sframeChan.query('Q_IMPORT_MEDIATAG', {

View File

@@ -181,7 +181,6 @@
"okButton": "D'acord (Enter)",
"cancel": "Cancel·la",
"cancelButton": "Cancel·la (Esc)",
"doNotAskAgain": "No ho preguntis més (Esc)",
"show_help_button": "Mostra l'ajuda",
"hide_help_button": "Amaga l'ajuda",
"help_button": "Ajuda",
@@ -299,7 +298,7 @@
"contacts_confirmRemoveHistory": "De debò voleu suprimir permanentment el vostre historial de xat? Les dades no es podran restaurar",
"contacts_removeHistoryServerError": "Hi ha hagut un error mentre es suprimia el vostre historial del xat. Torneu-ho a provar",
"contacts_fetchHistory": "Recupera l'historial antic",
"contacts_friends": "Amistats",
"contacts_friends": "Contactes",
"contacts_rooms": "Sales",
"contacts_leaveRoom": "Deixa aquesta sala",
"contacts_online": "En aquesta sala hi ha una altra persona en línia",
@@ -585,5 +584,37 @@
"upload_mustLogin": "Cal que inicieu la sessió per carregar un fitxer",
"upload_up": "Carrega",
"download_button": "Desxifra i descarrega",
"download_mt_button": "Descarrega"
"download_mt_button": "Descarrega",
"home_ngi": "Guanyador del premi NGI",
"home_host_agpl": "CryptPad es distribueix sota els termes de la llicència de programari AGPL3",
"home_host": "Aquesta és una instància comunitària independent de CryptPad. El codi font està disponible<a href=\"https://github.com/xwiki-labs/cryptpad\" target=\"_blank\" rel=\"noreferrer noopener\">a GitHub</a>.",
"home_product": "CryptPad és una alternativa, respectuosa amb la privacitat, a les utilitats d'oficina i els serveis al núvol. Tot el contingut desat a CryptPad es xifra abans de ser enviat, això vol dir que ningú pot accedir a les vostres dades sense que li doneu les claus (fins i tot nosaltres).",
"mdToolbar_toc": "Taula de continguts",
"mdToolbar_code": "Codi",
"mdToolbar_check": "Llista de tasques",
"mdToolbar_list": "Llista de vinyetes",
"mdToolbar_nlist": "Llista ordenada",
"mdToolbar_quote": "Cita",
"mdToolbar_link": "Enllaç",
"mdToolbar_heading": "Capçalera",
"mdToolbar_strikethrough": "Tatxat",
"mdToolbar_italic": "Cursiva",
"mdToolbar_bold": "Negreta",
"mdToolbar_tutorial": "https://ca.wikipedia.org/wiki/Markdown",
"mdToolbar_help": "Suport",
"mdToolbar_defaultText": "El vostre text",
"mdToolbar_button": "Mostra o amaga la barra d'eines de Markdown",
"pad_base64": "Aquest document conté imatges emmagatzemades de forma ineficient. Aquestes imatges augmenten significativament la mida del document al CryptDrive i fa que la càrrega sigui més lenta. Podeu migrar les imatges a un format diferent perquè es guardin per separat al CryptDrive. Voleu migrar ara aquestes imatges?",
"todo_markAsIncompleteTitle": "Marca la tasca com incompleta",
"pad_hideToolbar": "Amaga la barra d'eines",
"pad_showToolbar": "Mostra la barra d'eines",
"todo_removeTaskTitle": "Elimina la tasca del llistat",
"todo_markAsCompleteTitle": "Marca la tasca com a completada",
"todo_newTodoNameTitle": "Afegiu la tasca al llistat",
"todo_newTodoNamePlaceholder": "Descriviu la tasca...",
"todo_title": "CryptTasques",
"download_step2": "Desxifrant",
"download_step1": "Descarregant",
"download_dl": "Descarrega",
"download_resourceNotAvailable": "El recurs sol·licitat no estava disponible... Premeu Esc per continuar."
}

View File

@@ -179,7 +179,6 @@
"okButton": "OK (Enter)",
"cancel": "Abbrechen",
"cancelButton": "Abbrechen (Esc)",
"doNotAskAgain": "Nicht mehr fragen (Esc)",
"show_help_button": "Hilfe anzeigen",
"hide_help_button": "Hilfe verbergen",
"help_button": "Hilfe",
@@ -515,8 +514,8 @@
"settings_creationSkipFalse": "Anzeigen",
"settings_templateSkip": "Wahl der Vorlage überspringen",
"settings_templateSkipHint": "Wenn du ein neues Pad erstellst und passende Vorlagen vorhanden sind, erscheint ein Dialog zur Auswahl einer Vorlage. Hier kannst du diesen Dialog überspringen und somit keine Vorlage verwenden.",
"settings_ownDriveTitle": "Aktiviere die neuesten Funktionen für dein Konto",
"settings_ownDriveHint": "Aus technischen Gründen sind nicht alle neue Funktionen für ältere Konten verfügbar. Ein kostenloses Upgrade wird dein CryptDrive für zukünftige Funktionen vorbereiten, ohne deine Arbeit zu stören.",
"settings_ownDriveTitle": "Account aktualisieren",
"settings_ownDriveHint": "Aus technischen Gründen sind nicht alle neue Funktionen für ältere Konten verfügbar. Eine kostenlose Aktualisierung wird die neuen Funktionen aktivieren und dein CryptDrive für zukünftige Aktualisierungen vorbereiten.",
"settings_ownDriveButton": "Upgrade deines Kontos",
"settings_ownDriveConfirm": "Das Upgrade deines Kontos kann einige Zeit dauern. Du wirst dich auf allen Geräten neu einloggen müssen. Bist du sicher?",
"settings_ownDrivePending": "Das Upgrade deines Kontos läuft. Bitte schließe die Seite nicht und lade sie nicht neu, bis dieser Vorgang abgeschlossen ist.",
@@ -911,7 +910,7 @@
"feedback_about": "Wenn du das liest, fragst du dich wahrscheinlich, weshalb dein Browser bei der der Ausführung mancher Aktionen Anfragen an Webseiten sendet",
"feedback_privacy": "Wir respektieren deine Datenschutz, aber gleichzeitig wollen wir, dass die Benutzung von CryptPad sehr leicht ist. Deshalb wollen wir erfahren, welche Funktion am wichtigsten für unsere Benutzer ist, indem wir diese mit einer genauen Parameterbeschreibung anfordern.",
"feedback_optout": "Wenn du das nicht möchtest, kannst du es in <a href='/settings/'>deinen Einstellungen</a> deaktivieren",
"creation_404": "Dieses Pad existiert nicht mehr. Benutze das folgende Formular, um ein neues Pad zu gestalten.",
"creation_404": "Dieses Pad existiert nicht mehr. Benutze das folgende Formular, um ein neues Pad zu erstellen.",
"creation_ownedTitle": "Pad-Typ",
"creation_owned": "Eigenes Pad",
"creation_ownedTrue": "Eigenes Pad",
@@ -931,7 +930,6 @@
"creation_noTemplate": "Keine Vorlage",
"creation_newTemplate": "Neue Vorlage",
"creation_create": "Erstellen",
"creation_saveSettings": "Dieses Dialog nicht mehr anzeigen",
"creation_settings": "Mehr Einstellungen anzeigen",
"creation_rememberHelp": "Gehe zu deinen Einstellungen, um diese Auswahl zurückzusetzen",
"creation_owners": "Eigentümer",
@@ -998,7 +996,6 @@
"crowdfunding_popup_text": "<h3>Wir brauchen deine Hilfe!</h3>Um sicherzustellen, dass CryptPad weiter aktiv entwickelt wird, unterstütze bitte das Projekt über die <a href=\"https://opencollective.com/cryptpad\">OpenCollective Seite</a>, wo du unsere <b>Roadmap</b> und <b>Funding-Ziele</b> lesen kannst.",
"crowdfunding_popup_yes": "OpenCollective besuchen",
"crowdfunding_popup_no": "Nicht jetzt",
"crowdfunding_popup_never": "Nicht mehr darum bitten",
"invalidHashError": "Das angeforderte Dokument hat eine ungültige URL.",
"oo_cantUpload": "Das Hochladen von Dateien ist nicht erlaubt, während andere Nutzer anwesend sind.",
"oo_uploaded": "Das Hochladen wurde abgeschlossen. Klicke auf OK zum Neuladen der Seite oder auf Abbrechen zum Fortfahren im schreibgeschützten Modus.",
@@ -1099,7 +1096,7 @@
"support_formMessage": "Gib deine Nachricht ein...",
"support_cat_tickets": "Vorhandene Tickets",
"support_listTitle": "Support-Tickets",
"support_listHint": "Hier ist die Liste der an die Administratoren gesendeten Tickets und der dazugehörigen Antworten. Ein geschlossenes Ticket kann nicht wieder geöffnet werden, du kannst jedoch ein neues Ticket eröffnen. Du kannst geschlossene Tickets ausblenden, aber sie werden weiterhin für die Administratoren sichtbar sein.",
"support_listHint": "Hier ist die Liste der an die Administratoren gesendeten Tickets und der dazugehörigen Antworten. Ein geschlossenes Ticket kann nicht wieder geöffnet werden, aber du kannst ein neues Ticket eröffnen. Du kannst geschlossene Tickets ausblenden.",
"support_answer": "Antworten",
"support_close": "Ticket schließen",
"support_remove": "Ticket entfernen",
@@ -1293,5 +1290,12 @@
"oo_sheetMigration_anonymousEditor": "Die Bearbeitung dieser Tabelle ist für anonyme Benutzer deaktiviert, bis sie von einem registrierten Benutzer auf die neueste Version aktualisiert wird.",
"imprint": "Impressum",
"isContact": "{0} ist einer deiner Kontakte",
"isNotContact": "{0} ist <b>nicht</b> einer deiner Kontakte"
"isNotContact": "{0} ist <b>nicht</b> einer deiner Kontakte",
"settings_cat_security": "Vertraulichkeit",
"settings_safeLinksHint": "CryptPad fügt den Pad-Links die Schlüssel zum Entschlüsseln der Inhalte hinzu. Jeder, der Zugriff auf den Browserverlauf hat, kann möglicherweise die Daten lesen. Dazu gehören Browsererweiterungen und Browser, die den Verlauf geräteübergreifend synchronisieren. Die Aktivierung von \"sicheren Links\" verhindert, dass die Schlüssel in den Browserverlauf gelangen oder in der Adressleiste angezeigt werden, wann immer dies möglich ist. Wir empfehlen dringend, diese Funktion zu aktivieren und das Menü {0} Teilen zu verwenden.",
"dontShowAgain": "Nicht mehr anzeigen",
"profile_login": "Du musst dich einloggen, um diesen Benutzer zu deinen Kontakten hinzuzufügen",
"safeLinks_error": "Dieser Link gibt dir keinen Zugriff auf das Dokument",
"settings_safeLinksCheckbox": "Sichere Links aktivieren",
"settings_safeLinksTitle": "Sichere Links"
}

View File

@@ -151,7 +151,6 @@
"okButton": "OK (enter)",
"cancel": "Ακύρωση",
"cancelButton": "Ακύρωση (esc)",
"doNotAskAgain": "Να μην ρωτηθώ ξανά (Esc)",
"historyText": "Ιστορικό",
"historyButton": "Εμφάνιση ιστορικού του εγγράφου",
"history_next": "Μετάβαση στην επόμενη έκδοση",

View File

@@ -479,7 +479,6 @@
"slide_invalidLess": "Estilo personalizado no válido",
"fileShare": "Copiar link",
"ok": "OK",
"doNotAskAgain": "No preguntar nuevamente (Esc)",
"show_help_button": "Mostrar ayuda",
"hide_help_button": "Esconder ayuda",
"help_button": "Ayuda",

View File

@@ -184,7 +184,6 @@
"okButton": "OK (Enter)",
"cancel": "Keskeytä",
"cancelButton": "Keskeytä (Esc)",
"doNotAskAgain": "Älä kysy uudestaan (Esc)",
"show_help_button": "Näytä ohje",
"hide_help_button": "Piilota ohje",
"help_button": "Ohje",

View File

@@ -181,7 +181,6 @@
"okButton": "OK (Entrée)",
"cancel": "Annuler",
"cancelButton": "Annuler (Échap)",
"doNotAskAgain": "Ne plus demander (Échap)",
"show_help_button": "Afficher l'aide",
"hide_help_button": "Cacher l'aide",
"help_button": "Aide",
@@ -522,8 +521,8 @@
"settings_creationSkipFalse": "Afficher",
"settings_templateSkip": "Passer la fenêtre de choix d'un modèle",
"settings_templateSkipHint": "Quand vous créez un nouveau pad, et si vous possédez des modèles pour ce type de pad, une fenêtre peut apparaître pour demander si vous souhaitez importer un modèle. Ici vous pouvez choisir de ne jamais montrer cette fenêtre et donc de ne jamais utiliser de modèle.",
"settings_ownDriveTitle": "Activer les dernières fonctionnalités du compte",
"settings_ownDriveHint": "Pour des raisons techniques, les comptes utilisateurs les plus anciens n'ont pas accès à toutes les fonctionnalités. Une mise à niveau gratuite permet de préparer votre CryptDrive pour les nouveautés à venir sans perturber vos activités habituelles.",
"settings_ownDriveTitle": "Mise à jour du compte",
"settings_ownDriveHint": "Les comptes plus anciens n'ont pas accès aux dernières fonctionnalités, pour des raisons techniques. Une mise à niveau gratuite permet d'activer les fonctionnalités actuelles et de préparer votre CryptDrive pour les futures mises à jour.",
"settings_ownDriveButton": "Mettre à niveau votre compte",
"settings_ownDriveConfirm": "La mise à niveau peut prendre du temps. Vous devrez vous reconnecter sur tous vos appareils. Voulez-vous continuer ?",
"settings_ownDrivePending": "Votre compte est en train d'être mis à jour. Veuillez ne pas fermer ou recharger cette page avant que le traitement soit terminé.",
@@ -938,7 +937,6 @@
"creation_noTemplate": "Pas de modèle",
"creation_newTemplate": "Nouveau modèle",
"creation_create": "Créer",
"creation_saveSettings": "Ne plus me demander",
"creation_settings": "Voir davantage de préférences",
"creation_rememberHelp": "Ouvrez votre page de Préférences pour voir ce formulaire à nouveau",
"creation_owners": "Propriétaires",
@@ -1006,7 +1004,6 @@
"crowdfunding_popup_text": "<h3>Aider CryptPad</h3>Pour vous assurer que CryptPad soit activement développé, nous vous invitons à supporter le projet via la <a href=\"https://opencollective.com/cryptpad\">page OpenCollective</a>, où vous pouvez trouver notre <b>Roadmap</b> et nos <b>objectifs de financement</b>.",
"crowdfunding_popup_yes": "Voir la page",
"crowdfunding_popup_no": "Pas maintenant",
"crowdfunding_popup_never": "Ne plus demander",
"survey": "Enquête CryptPad",
"markdown_toc": "Sommaire",
"debug_getGraph": "Obtenir le code permettant de générer un graphe de ce document",
@@ -1293,5 +1290,12 @@
"oo_sheetMigration_anonymousEditor": "L'édition de cette feuille de calcul est désactivée pour les utilisateurs anonymes jusqu'à ce qu'elle soit mise à jour par un utilisateur enregistré.",
"imprint": "Mentions légales",
"isContact": "{0} est dans vos contacts",
"isNotContact": "{0} n'est <b>pas</b> dans vos contacts"
"isNotContact": "{0} n'est <b>pas</b> dans vos contacts",
"settings_safeLinksHint": "CryptPad inclut dans ses liens les clés permettant de déchiffrer vos pads. Toute personne ayant accès à votre historique de navigation peut potentiellement lire vos données. Cela inclut les extensions de navigateur intrusives et les navigateurs qui synchronisent votre historique entre les appareils. L'activation des \"liens sécurisés\" empêche les clés d'entrer dans votre historique de navigation ou d'être affichées dans votre barre d'adresse quand cela est possible. Nous vous recommandons vivement d'activer cette fonction et d'utiliser le menu {0} Partager.",
"profile_login": "Vous devez vous connecter pour ajouter cet utilisateur à vos contacts",
"dontShowAgain": "Ne plus demander",
"safeLinks_error": "Le lien utilisé ne permet pas d'ouvrir ce document",
"settings_safeLinksCheckbox": "Activer les liens sécurisés",
"settings_safeLinksTitle": "Liens Sécurisés",
"settings_cat_security": "Confidentialité"
}

View File

@@ -181,7 +181,6 @@
"okButton": "OK (Enter)",
"cancel": "Cancella",
"cancelButton": "Cancella (Esc)",
"doNotAskAgain": "Non chiedere più (Esc)",
"show_help_button": "Mostra l'aiuto",
"hide_help_button": "Nascondi l'aiuto",
"help_button": "Aiuto",

View File

@@ -184,7 +184,6 @@
"okButton": "OK (enter)",
"cancel": "Cancel",
"cancelButton": "Cancel (esc)",
"doNotAskAgain": "Don't ask me again (Esc)",
"show_help_button": "Show help",
"hide_help_button": "Hide help",
"help_button": "Help",
@@ -535,8 +534,8 @@
"settings_creationSkipFalse": "Display",
"settings_templateSkip": "Skip the template selection modal",
"settings_templateSkipHint": "When you create a new empty pad, if you have stored templates for this type of pad, a modal appears to ask if you want to use a template. Here you can choose to never show this modal and so to never use a template.",
"settings_ownDriveTitle": "Enable latest account features",
"settings_ownDriveHint": "For technical reasons, older accounts do not have access to all of our latest features. A free upgrade to a new account will prepare your CryptDrive for upcoming features without disrupting your usual activities.",
"settings_ownDriveTitle": "Update Account",
"settings_ownDriveHint": "Older accounts do not have access to the latest features, due to technical reasons. A free update will enable current features, and prepare your CryptDrive for future updates.",
"settings_ownDriveButton": "Upgrade your account",
"settings_ownDriveConfirm": "Upgrading your account may take some time. You will need to log back in on all your devices. Are you sure?",
"settings_ownDrivePending": "Your account is being upgraded. Please do not close or reload this page until the process has completed.",
@@ -936,7 +935,7 @@
"feedback_about": "If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions",
"feedback_privacy": "We care about your privacy, and at the same time we want CryptPad to be very easy to use. We use this file to figure out which UI features matter to our users, by requesting it along with a parameter specifying which action was taken.",
"feedback_optout": "If you would like to opt out, visit <a href='/settings/'>your user settings page</a>, where you'll find a checkbox to enable or disable user feedback",
"creation_404": "This pad not longer exists. Use the following form to create a new pad.",
"creation_404": "This pad no longer exists. Use the following form to create a new pad.",
"creation_ownedTitle": "Type of pad",
"creation_owned": "Owned pad",
"creation_ownedTrue": "Owned pad",
@@ -956,7 +955,6 @@
"creation_noTemplate": "No template",
"creation_newTemplate": "New template",
"creation_create": "Create",
"creation_saveSettings": "Don't show this again",
"creation_settings": "View more settings",
"creation_rememberHelp": "Visit your Settings page to reset this preference",
"creation_owners": "Owners",
@@ -1028,7 +1026,6 @@
"crowdfunding_popup_text": "<h3>We need your help!</h3>To ensure that CryptPad is actively developed, consider supporting the project via the <a href=\"https://opencollective.com/cryptpad\">OpenCollective page</a>, where you can see our <b>Roadmap</b> and <b>Funding goals</b>.",
"crowdfunding_popup_yes": "Go to OpenCollective",
"crowdfunding_popup_no": "Not now",
"crowdfunding_popup_never": "Don't ask me again",
"survey": "CryptPad survey",
"markdown_toc": "Contents",
"fm_expirablePad": "Expires: {0}",
@@ -1293,5 +1290,12 @@
"oo_sheetMigration_loading": "Upgrading your spreadsheet to the latest version",
"oo_sheetMigration_complete": "Updated version available, press OK to reload.",
"oo_sheetMigration_anonymousEditor": "Editing this spreadsheet is disabled for anonymous users until it is upgraded to the latest version by a registered user.",
"imprint": "Legal notice"
"imprint": "Legal notice",
"settings_cat_security": "Confidentiality",
"settings_safeLinksTitle": "Safe Links",
"settings_safeLinksCheckbox": "Enable safe links",
"safeLinks_error": "This link does not give you access to the document",
"dontShowAgain": "Don't show again",
"profile_login": "You need to log in to add this user to your contacts",
"settings_safeLinksHint": "CryptPad includes the keys to decrypt your pads in their links. Anyone with access to your browsing history can potentially read your data. This includes intrusive browser extensions and browsers that sync your history across devices. Enabling \"safe links\" prevents the keys from entering your browsing history or being displayed in your address bar whenever possible. We strongly recommend that you enable this feature and use the {0} Share menu."
}

View File

@@ -193,7 +193,6 @@
"crowdfunding_button": "Støtt CryptPad",
"crowdfunding_popup_yes": "Gå til OpenCollective",
"crowdfunding_popup_no": "Ikke nå",
"crowdfunding_popup_never": "Ikke spør igjen takk",
"markdown_toc": "Innhold",
"fm_expirablePad": "Denne paden vill utgå på dato den {0}",
"admin_authError": "Kun admin-tilgang",

View File

@@ -409,7 +409,6 @@
"fileEmbedScript": "",
"fileEmbedTag": "",
"ok": "",
"doNotAskAgain": "",
"show_help_button": "",
"hide_help_button": "",
"help_button": "",

View File

@@ -395,7 +395,6 @@
"fileEmbedTitle": "Include fișierul într-o pagină externă",
"fileEmbedTag": "După care plasează această etichetă Media oriunde pe pagina unde vrei sa o plasezi",
"ok": "Ok",
"doNotAskAgain": "Nu mă întreba din nou (Esc)",
"show_help_button": "Arată ajutorul",
"hide_help_button": "Maschează ajutorul",
"help_button": "Ajutor",

View File

@@ -175,7 +175,6 @@
"okButton": "OK (Enter)",
"cancel": "Отмена",
"cancelButton": "Отмена (Esc)",
"doNotAskAgain": "Не спрашивать снова (Esc)",
"show_help_button": "Показать справку",
"hide_help_button": "Скрыть справку",
"help_button": "Справка",
@@ -299,7 +298,6 @@
"fm_removeSeveralPermanentlyDialog": "Вы уверены, что хотите навсегда удалить {0} элементов из вашего Хранилища?",
"crowdfunding_button": "Поддержите CryptPad",
"crowdfunding_popup_no": "Не сейчас",
"crowdfunding_popup_never": "Не спрашивать меня снова",
"markdown_toc": "Содержимое",
"fm_expirablePad": "Этот блокнот истечет {0}",
"fileEmbedTitle": "Встроить файл во внешнюю страницу",