Merge branch 'staging' into communities-kanban

This commit is contained in:
yflory
2020-03-09 15:14:08 +01:00
43 changed files with 970 additions and 576 deletions

View File

@@ -1194,21 +1194,28 @@ define([
var $spinner = $('<span>', {'class': 'fa fa-spinner fa-pulse'}).hide();
var state = false;
var to;
var spin = function () {
clearTimeout(to);
state = true;
$ok.hide();
$spinner.show();
};
var hide = function () {
clearTimeout(to);
state = false;
$ok.hide();
$spinner.hide();
};
var done = function () {
clearTimeout(to);
state = false;
$ok.show();
$spinner.hide();
to = setTimeout(function () {
$ok.hide();
}, 500);
};
if ($container && $container.append) {

View File

@@ -953,7 +953,6 @@ define([
'data-curve': data.curvePublic || '',
'data-name': name.toLowerCase(),
'data-order': i,
title: name,
style: 'order:'+i+';'
},[
avatar,
@@ -2426,9 +2425,9 @@ define([
case 'access':
button = $('<button>', {
'class': 'fa fa-unlock-alt cp-toolbar-icon-access',
title: "ACCESS", // XXX
title: Messages.accessButton,
}).append($('<span>', {'class': 'cp-toolbar-drawer-element'})
.text("ACCESS")) // XXX
.text(Messages.accessButton))
.click(common.prepareFeedback(type))
.click(function () {
common.isPadStored(function (err, data) {
@@ -2827,13 +2826,13 @@ define([
};
UIElements.displayAvatar = function (common, $container, href, name, cb) {
var displayDefault = function () {
var text = getFirstEmojiOrCharacter(name);
var text = (href && typeof(href) === "string") ? href : getFirstEmojiOrCharacter(name);
var $avatar = $('<span>', {'class': 'cp-avatar-default'}).text(text);
$container.append($avatar);
if (cb) { cb(); }
};
if (!window.Symbol) { return void displayDefault(); } // IE doesn't have Symbol
if (!href) { return void displayDefault(); }
if (!href || href.length === 1) { return void displayDefault(); }
var centerImage = function ($img, $image, img) {
var w = img.width;
@@ -3385,13 +3384,13 @@ define([
}
options.push({ tag: 'hr' });
// Add login or logout button depending on the current status
if (accountName) {
if (priv.loggedIn) {
options.push({
tag: 'a',
attributes: {
'class': 'cp-toolbar-menu-logout-everywhere fa fa-plug',
},
content: h('span', "CLOSE REMOTE SESSIONS") // XXX Messages.settings_logoutEverywhereTitle)
content: h('span', Messages.logoutEverywhere)
});
options.push({
tag: 'a',
@@ -3481,7 +3480,9 @@ define([
});
$userAdmin.find('a.cp-toolbar-menu-logout-everywhere').click(function () {
Common.getSframeChannel().query('Q_LOGOUT_EVERYWHERE', null, function () { });
Common.getSframeChannel().query('Q_LOGOUT_EVERYWHERE', null, function () {
window.parent.location = origin + '/';
});
});
$userAdmin.find('a.cp-toolbar-menu-settings').click(function () {
if (padType) {
@@ -4228,18 +4229,20 @@ define([
if (err.loaded) {
msg += Messages.errorCopy;
}
if (toolbar && typeof toolbar.deleted === "function") { toolbar.deleted(); }
} else if (err.type === 'EDELETED') {
if (priv.burnAfterReading) { return void cb(); }
msg = Messages.deletedError;
if (err.loaded) {
msg += Messages.errorCopy;
}
if (toolbar && typeof toolbar.deleted === "function") { toolbar.deleted(); }
} else if (err.type === 'ERESTRICTED') {
msg = Messages.restrictedError || "RESTRICTED"; // XXX
msg = Messages.restrictedError;
if (toolbar && typeof toolbar.failed === "function") { toolbar.failed(true); }
}
var sframeChan = common.getSframeChannel();
sframeChan.event('EV_SHARE_OPEN', {hidden: true});
if (toolbar && typeof toolbar.deleted === "function") { toolbar.deleted(); }
UI.errorLoadingScreen(msg, Boolean(err.loaded), Boolean(err.loaded));
(cb || function () {})();
};

View File

@@ -309,15 +309,24 @@ define([
var mermaid_source = [];
var mermaid_cache = {};
var canonicalizeMermaidSource = function (src) {
// ignore changes to empty lines, since that won't affect
// since it will have no effect on the rendered charts
return src.replace(/\n[ \t]*\n*[ \t]*\n/g, '\n');
};
// iterate over the unrendered mermaid inputs, caching their source as you go
$(newDomFixed).find('pre.mermaid').each(function (index, el) {
if (el.childNodes.length === 1 && el.childNodes[0].nodeType === 3) {
var src = el.childNodes[0].wholeText;
var src = canonicalizeMermaidSource(el.childNodes[0].wholeText);
el.setAttribute('mermaid-source', src);
mermaid_source[index] = src;
}
});
// remember the previous scroll position
var $parent = $content.parent();
var scrollTop = $parent.scrollTop();
// iterate over rendered mermaid charts
$content.find('pre.mermaid:not([processed="true"])').each(function (index, el) {
// retrieve the attached source code which it was drawn
@@ -388,7 +397,12 @@ define([
var cached = mermaid_cache[src];
// check if you had cached a pre-rendered instance of the supplied source
if (typeof(cached) !== 'object') { return; }
if (typeof(cached) !== 'object') {
try {
Mermaid.init(undefined, $(el));
} catch (e) { console.error(e); }
return;
}
// if there's a cached rendering, empty out the contained source code
// which would otherwise be drawn again.
@@ -399,12 +413,9 @@ define([
// and set a flag indicating that this graph need not be reprocessed
el.setAttribute('data-processed', true);
});
try {
// finally, draw any graphs which have changed and were thus not cached
Mermaid.init(undefined, $content.find('pre.mermaid:not([data-processed="true"])'));
} catch (e) { console.error(e); }
}
// recover the previous scroll position to avoid jank
$parent.scrollTop(scrollTop);
};
return DiffMd;

View File

@@ -325,6 +325,10 @@ define([
'tabindex': '-1',
'data-icon': faOpenInCode,
}, Messages.fc_openInCode)),
h('li', h('a.cp-app-drive-context-savelocal.dropdown-item', {
'tabindex': '-1',
'data-icon': 'fa-cloud-upload',
}, Messages.pad_mediatagImport)), // Save in your CryptDrive
$separator.clone()[0],
h('li', h('a.cp-app-drive-context-expandall.dropdown-item', {
'tabindex': '-1',
@@ -344,14 +348,10 @@ define([
'tabindex': '-1',
'data-icon': 'fa-shhare-alt',
}, Messages.shareButton)),
h('li', h('a.cp-app-drive-context-savelocal.dropdown-item', {
h('li', h('a.cp-app-drive-context-access.dropdown-item', {
'tabindex': '-1',
'data-icon': 'fa-cloud-upload',
}, Messages.pad_mediatagImport)), // Save in your CryptDrive
h('li', h('a.cp-app-drive-context-download.dropdown-item', {
'tabindex': '-1',
'data-icon': faDownload,
}, Messages.download_mt_button)),
'data-icon': faAccess,
}, Messages.accessButton)),
$separator.clone()[0],
h('li', h('a.cp-app-drive-context-newfolder.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1',
@@ -441,6 +441,10 @@ define([
'tabindex': '-1',
'data-icon': faCopy,
}, Messages.makeACopy)),
h('li', h('a.cp-app-drive-context-download.dropdown-item', {
'tabindex': '-1',
'data-icon': faDownload,
}, Messages.download_mt_button)),
h('li', h('a.cp-app-drive-context-delete.dropdown-item.cp-app-drive-context-editable', {
'tabindex': '-1',
'data-icon': faTrash,
@@ -458,14 +462,10 @@ define([
'data-icon': faDelete,
}, Messages.fc_remove_sharedfolder)),
$separator.clone()[0],
h('li', h('a.cp-app-drive-context-access.dropdown-item', {
'tabindex': '-1',
'data-icon': faAccess,
}, "ACCESS")), // XXX
h('li', h('a.cp-app-drive-context-properties.dropdown-item', {
'tabindex': '-1',
'data-icon': faProperties,
}, Messages.fc_prop)),
}, Messages.fc_prop))
])
]);
// add icons to the contextmenu options
@@ -1279,7 +1279,7 @@ define([
case 'tree':
show = ['open', 'openro', 'openincode', 'expandall', 'collapseall',
'color', 'download', 'share', 'savelocal', 'rename', 'delete', 'makeacopy',
'deleteowned', 'removesf', 'properties', 'hashtag'];
'deleteowned', 'removesf', 'access', 'properties', 'hashtag'];
break;
case 'default':
show = ['open', 'openro', 'share', 'openparent', 'delete', 'deleteowned', 'properties', 'access', 'hashtag', 'makeacopy'];

View File

@@ -11,10 +11,7 @@ define([
Messages, nThen) {
var Access = {};
// XXX contacts, teams, access_noContact
Messages.contacts = "Contacts"; // XXX
Messages.teams = "Teams"; // XXX
Messages.access_noContact = "No other contact to add"; // XXX
var evRedrawAll = Util.mkEvent();
@@ -26,6 +23,7 @@ define([
data.mailbox = obj.mailbox;
data.restricted = obj.restricted;
data.allowed = obj.allowed;
data.rejected = obj.rejected;
};
var loadMetadata = function (common, data, waitFor, redraw) {
common.getPadMetadata({
@@ -120,7 +118,7 @@ define([
if (teamOwner && teams[teamOwner] && teams[teamOwner].edPublic === ed) { me = true; }
if (ed === edPublic && !teamOwner) { me = true; }
nThen(function (waitFor) {
var msg = me ? Messages.owner_removeMeConfirm : Messages.owner_removeConfirm; // XXX check existing keys
var msg = me ? Messages.owner_removeMeConfirm : Messages.owner_removeConfirm;
UI.confirm(msg, waitFor(function (yes) {
if (!yes) {
waitFor.abort();
@@ -162,6 +160,10 @@ define([
});
};
if (pending && !Object.keys(_owners).length) {
return $();
}
var msg = pending ? Messages.owner_removePendingText
: Messages.owner_removeText;
var removeCol = UIElements.getUserGrid(msg, {
@@ -338,6 +340,7 @@ define([
pending_owners = data.pending_owners || [];
$div1.empty();
$div2.empty();
$div1.append(h('p', Messages.owner_text));
$div1.append(drawRemove(false)).append(drawRemove(true));
$div2.append(drawAdd());
});
@@ -438,12 +441,6 @@ define([
}
});
// XXX allow_removeConfirm, allow_checkbox, allow_text, allow_addConfirm
Messages.allow_addConfirm = "Are you sure?"; // XXX
Messages.allow_removeConfirm = "Are you sure?"; // XXX
Messages.allow_checkbox = "Enable allow list"; // XXX
Messages.allow_text = 'Pewpewpew'; // XXX
var remove = function (el) {
// Check selection
var $el = $(el);
@@ -701,7 +698,8 @@ define([
}
// Otherwise it's a stranger
_owners[ed] = {
name: '???', // XXX unkwown?
avatar: '?',
name: Messages.owner_unknownUser,
};
strangers++;
});
@@ -884,18 +882,13 @@ define([
return $d;
};
var drawRight = function () {
// XXX allow_enabled, allow_disabled, allow_label
Messages.allow_enabled = 'ENABLED'; // XXX
Messages.allow_disabled = 'DISABLED'; // XXX
Messages.allow_label = 'Allow list: {0}'; // XXX
// Owners
var content = [];
var _ownersGrid = getUserList(common, data.owners);
if (_ownersGrid && _ownersGrid.div) {
content.push(h('label', Messages.creation_owners));
content.push(_ownersGrid.div);
} else {
} else if (!data.rejected) {
content.push(UI.dialog.selectable(Messages.creation_noOwner, {
id: 'cp-app-prop-owners',
}));
@@ -939,9 +932,6 @@ define([
});
}
// XXX access_muteRequests
Messages.access_muteRequests = "Mute access requests for this pad"; // XXX
// Mute access requests
var priv = common.getMetadataMgr().getPrivateData();
var edPublic = priv.edPublic;
@@ -1105,10 +1095,6 @@ define([
});
}));
}).nThen(function () {
// XXX access_main, access_allow
Messages.access_main = 'ACCESS'; // XXX
Messages.access_allow = 'ALLOW'; // XXX
var tabs = UI.dialog.tabs([{
title: Messages.access_main,
icon: "fa fa-unlock-alt",

View File

@@ -78,6 +78,7 @@ define([
Realtime.whenRealtimeSyncs(s.realtime, waitFor());
if (s.sharedFolders && typeof (s.sharedFolders) === "object") {
for (var k in s.sharedFolders) {
if (!s.sharedFolders[k].realtime) { continue; } // Deprecated
Realtime.whenRealtimeSyncs(s.sharedFolders[k].realtime, waitFor());
}
}
@@ -583,6 +584,7 @@ define([
support: Util.find(store.proxy, ['mailboxes', 'support', 'channel']),
pendingFriends: store.proxy.friends_pending || {},
supportPrivateKey: Util.find(store.proxy, ['mailboxes', 'supportadmin', 'keys', 'curvePrivate']),
accountName: store.proxy.login_name || '',
teams: teams,
plan: account.plan
}
@@ -1522,11 +1524,39 @@ define([
},
onError: function (err) {
channel.bcast("PAD_ERROR", err);
delete channels[data.channel];
Store.leavePad(null, data, function () {});
},
onChannelError: function (err) {
channel.bcast("PAD_ERROR", err);
delete channels[data.channel];
Store.leavePad(null, data, function () {});
},
onRejected: function (allowed, _cb) {
var cb = Util.once(Util.mkAsync(_cb));
// There is an allow list: check if we can authenticate
if (!Array.isArray(allowed)) { return void cb('EINVAL'); }
if (!store.loggedIn || !store.proxy.edPublic) { return void cb('EFORBIDDEN'); }
var rpc;
var teamModule = store.modules['team'];
var teams = (teamModule && teamModule.getTeams()) || [];
if (allowed.indexOf(store.proxy.edPublic) !== -1) {
// We are allowed: use our own rpc
rpc = store.rpc;
} else if (teams.some(function (teamId) {
// We're not allowed: check our teams
var ed = Util.find(store, ['proxy', 'teams', teamId, 'keys', 'drive', 'edPublic']);
if (allowed.indexOf(ed) === -1) { return false; }
// This team is allowed: use its rpc
var t = teamModule.getTeam(teamId);
rpc = t.rpc;
return true;
})) {}
if (!rpc) { return void cb('EFORBIDDEN'); }
rpc.send('COOKIE', '', function (err) {
cb(err);
});
},
onConnectionChange: function (info) {
if (!info.state) {
@@ -1776,6 +1806,10 @@ define([
var metadata = (obj && obj[0]) || {};
cb(metadata);
// If you don't have access to the metadata, stop here
// (we can't update the local data)
if (metadata.rejected) { return; }
// Update owners and expire time in the drive
getAllStores().forEach(function (s) {
var allData = s.manager.findChannel(data.channel, true);

View File

@@ -60,7 +60,6 @@ define([
if (!c) {
c = ctx.clients[client] = {
channel: channel,
padChan: padChan,
cursor: {}
};
} else {
@@ -95,6 +94,8 @@ define([
ctx.channels[channel] = ctx.channels[channel] || {};
var chan = ctx.channels[channel];
chan.padChan = padChan;
if (!c.id) { c.id = wc.myID + '-' + client; }
if (chan.clients) {
// If 2 tabs from the same worker have been opened at the same time,

View File

@@ -12,7 +12,6 @@ define([
if (!c) {
c = ctx.clients[client] = {
channel: channel,
padChan: padChan,
};
} else {
return void cb();
@@ -45,6 +44,7 @@ define([
};
chan = ctx.channels[channel];
chan.padChan = padChan;
// Create our client ID using the netflux ID
if (!c.id) { c.id = wc.myID + '-' + client; }

View File

@@ -214,6 +214,18 @@ define([
});
} catch (e) {}
delete allSharedFolders[secret.channel];
// This shouldn't be called on init because we're calling "isNewChannel" first,
// but we can still call "cb" just in case. This wait we make sure we won't block
// the initial "waitFor"
return void cb();
}
if (info.error === "ERESTRICTED" ) {
// This shouldn't happen: allow list are disabled for shared folders
// but call "cb" to make sure we won't block the initial "waitFor"
sf.teams.forEach(function (obj) {
obj.store.manager.restrictedProxy(obj.id, secret.channel);
});
return void cb();
}
}
});

View File

@@ -724,7 +724,7 @@ define([
if (dedup.length !== files[TEMPLATE].length) {
files[TEMPLATE] = dedup;
}
var us = files[TEMPLATE].slice();
var us = files[TEMPLATE];
var rootFiles = exp.getFiles([ROOT]);
var toClean = [];
us.forEach(function (el, idx) {

View File

@@ -67,6 +67,13 @@ define([
}
};
var restrictedProxy = function (Env, id, channel) {
var lm = { proxy: { deprecated: true } };
removeProxy(Env, id);
addProxy(Env, id, lm, function () {});
return void Env.Store.refreshDriveUI();
};
/*
Tools
*/
@@ -1118,6 +1125,7 @@ define([
addProxy: callWithEnv(addProxy),
removeProxy: callWithEnv(removeProxy),
deprecateProxy: callWithEnv(deprecateProxy),
restrictedProxy: callWithEnv(restrictedProxy),
addSharedFolder: callWithEnv(_addSharedFolder),
// Drive
command: callWithEnv(onCommand),

View File

@@ -131,6 +131,8 @@ define([
if (state === STATE.INFINITE_SPINNER && newState !== STATE.READY) { return; }
if (newState === STATE.INFINITE_SPINNER || newState === STATE.DELETED) {
state = newState;
} else if (newState === STATE.ERROR) {
state = newState;
} else if (state === STATE.DISCONNECTED && newState !== STATE.INITIALIZING) {
throw new Error("Cannot transition from DISCONNECTED to " + newState); // FIXME we are getting "DISCONNECTED to READY" on prod
} else if (state !== STATE.READY && newState === STATE.HISTORY_MODE) {
@@ -161,6 +163,10 @@ define([
}
case STATE.ERROR: {
evStart.reg(function () {
if (text === 'ERESTRICTED') {
toolbar.failed(true);
return;
}
toolbar.errorState(true, text);
var msg = Messages.chainpadError;
UI.errorLoadingScreen(msg, true, true);
@@ -171,6 +177,10 @@ define([
evStart.reg(function () { toolbar.forgotten(); });
break;
}
case STATE.FORBIDDEN: {
evStart.reg(function () { toolbar.deleted(); });
break;
}
case STATE.DELETED: {
evStart.reg(function () { toolbar.deleted(); });
break;
@@ -403,7 +413,11 @@ define([
};
var onError = function (err) {
common.onServerError(err, toolbar, function () {
common.onServerError(err, null, function () {
if (err.type === 'ERESTRICTED') {
stateChange(STATE.ERROR, err.type);
return;
}
stateChange(STATE.DELETED);
});
};

View File

@@ -164,9 +164,6 @@ define([
queue.next();
if (e === 'TOO_LARGE') {
$pv.text(Messages.upload_tooLargeBrief);
// XXX translate
// instead of "This file exceeds the maximum upload size"
// use "the maximum upload size allowed for your account"
return void UI.alert(Messages.upload_tooLarge);
}
if (e === 'NOT_ENOUGH_SPACE') {

View File

@@ -423,7 +423,7 @@ define([
};
var additionalPriv = {
app: parsed.type,
accountName: Utils.LocalStore.getAccountName(),
loggedIn: Utils.LocalStore.isLoggedIn(),
origin: window.location.origin,
pathname: window.location.pathname,
fileHost: ApiConfig.fileHost,
@@ -784,7 +784,7 @@ define([
});
sframeChan.on('Q_LOGOUT_EVERYWHERE', function (data, cb) {
Cryptpad.logoutFromAll(cb);
Cryptpad.logoutFromAll(Utils.Util.bake(Utils.LocalStore.logout, cb));
});
sframeChan.on('EV_NOTIFY', function (data) {

View File

@@ -69,7 +69,7 @@ define([
funcs.getAppConfig = function () { return AppConfig; };
funcs.isLoggedIn = function () {
return ctx.metadataMgr.getPrivateData().accountName;
return ctx.metadataMgr.getPrivateData().loggedIn;
};
// MISC

View File

@@ -166,14 +166,14 @@ MessengerUI, Messages) {
});
};
var showColors = false;
var updateUserList = function (toolbar, config) {
var updateUserList = function (toolbar, config, forceOffline) {
if (!config.displayed || config.displayed.indexOf('userlist') === -1) { return; }
// Make sure the elements are displayed
var $userButtons = toolbar.userlist;
var $userlistContent = toolbar.userlistContent;
var metadataMgr = config.metadataMgr;
var online = metadataMgr.isConnected();
var online = !forceOffline && metadataMgr.isConnected();
var userData = metadataMgr.getMetadata().users;
var viewers = metadataMgr.getViewers();
var priv = metadataMgr.getPrivateData();
@@ -1260,12 +1260,15 @@ MessengerUI, Messages) {
initClickEvents(toolbar, config);
initNotifications(toolbar, config);
var failed = toolbar.failed = function () {
var failed = toolbar.failed = function (hideUserList) {
toolbar.connected = false;
if (toolbar.spinner) {
toolbar.spinner.text(Messages.disconnected);
}
if (hideUserList) {
updateUserList(toolbar, config, true);
}
//checkLag(toolbar, config);
};
toolbar.initializing = function (/*userId*/) {
@@ -1312,7 +1315,7 @@ MessengerUI, Messages) {
toolbar.deleted = function (/*userId*/) {
toolbar.isErrorState = true;
toolbar.connected = false;
updateUserList(toolbar, config);
updateUserList(toolbar, config, true);
if (toolbar.spinner) {
toolbar.spinner.text(Messages.deletedFromServer);
}

View File

@@ -536,8 +536,8 @@
"settings_creationSkipFalse": "Mostra",
"settings_templateSkip": "Salta la finestra de selecció de plantilla",
"settings_templateSkipHint": "Quan genereu un document nou buit, si teniu desades plantilles per aquest tipus de document, apareix una finestra preguntant-vos si voleu utilitzar una plantilla. Aquí podeu triar si no voleu veure mai més la finestra i no utilitzar una plantilla.",
"settings_ownDriveTitle": "Habilita les darreres funcionalitats del compte",
"settings_ownDriveHint": "Per raons tècniques, els comptes antics no tenen accés a totes les funcionalitats noves. Si feu una actualització a un compte nou, preparareu el vostre CryptDrive per les properes funcionalitats sense interrompre la vostra activitat habitual.",
"settings_ownDriveTitle": "Milloreu el compte",
"settings_ownDriveHint": "Degut a raons tècniques els comptes antics no tenen accés a les darreres funcionalitats . Una actualització gratuïta habilitarà les funcionalitats actuals i prepararà el vostre CryptDrive per futures actualitzacions.",
"settings_ownDriveButton": "Milloreu el vostre compte",
"settings_ownDriveConfirm": "Millorar el vostre compte porta una estona. Necessitareu tornar-vos a connectar en tots els vostres dispositius. Segur que ho voleu fer?",
"settings_ownDrivePending": "El vostre compte s'està posant al dia. No tanqueu ni torneu a carregar aquesta pàgina fins que el procés hagi acabat.",
@@ -616,5 +616,8 @@
"download_step2": "Desxifrant",
"download_step1": "Descarregant",
"download_dl": "Descarrega",
"download_resourceNotAvailable": "El recurs sol·licitat no estava disponible... Premeu Esc per continuar."
"download_resourceNotAvailable": "El recurs sol·licitat no estava disponible... Premeu Esc per continuar.",
"about_contributors": "Col·laboracions clau",
"about_core": "Desenvolupament principal",
"about_intro": "CryptPad s'ha creat dins l'Equip de Recerca de <a href=\"http://xwiki.com\">XWiki SAS</a>, una petita empresa de París, França i Iasi, Romania. Hi ha 3 membres de l'equip central treballant amb CryptPad més una quantitat de persones col·laboradores, dins i fora d'XWiki SAS."
}

View File

@@ -547,7 +547,7 @@
"upload_success": "Deine Datei ({0}) wurde erfolgreich hochgeladen und zu deinem CryptDrive hinzugefügt.",
"upload_notEnoughSpace": "Der verfügbare Speicherplatz in deinem CryptDrive reicht leider nicht für diese Datei.",
"upload_notEnoughSpaceBrief": "Unzureichender Speicherplatz",
"upload_tooLarge": "Diese Datei ist zu groß, um hochgeladen zu werden.",
"upload_tooLarge": "Diese Datei überschreitet die für deinen Account erlaubte maximale Größe.",
"upload_tooLargeBrief": "Datei zu groß",
"upload_choose": "Eine Datei wählen",
"upload_pending": "In der Warteschlange",
@@ -1141,14 +1141,14 @@
"register_emailWarning1": "Wenn du möchtest, kannst du dies tun. Allerdings wird sie nicht an unseren Server gesendet.",
"register_emailWarning2": "Du kannst dein Passwort nicht wie bei vielen anderen Diensten mit der E-Mail-Adresse zurücksetzen.",
"register_emailWarning3": "Wenn du dies verstanden hast und die E-Mail-Adresse dennoch als Benutzername verwenden möchtest, klicke auf OK.",
"owner_unknownUser": "Unbekannter Benutzer",
"owner_unknownUser": "?????",
"owner_removeButton": "Ausgewählte Eigentümer entfernen",
"owner_removeConfirm": "Bist du sicher, dass die Eigentümerschaft der ausgewählten Benutzer entfernen möchtest? Sie werden über diese Aktion informiert.",
"owner_removeMeConfirm": "Du bist dabei, deine Rechte als Eigentümer aufzugeben. Diese Aktion kannst du nicht rückgängig machen. Bist du sicher?",
"owner_openModalButton": "Eigentümer verwalten",
"owner_add": "{0} möchte ein Eigentümer des Pads <b>{1}</b> sein. Bist du damit einverstanden?",
"owner_removeText": "Einen Eigentümer entfernen",
"owner_removePendingText": "Eine ausstehende Einladung zurückziehen",
"owner_removeText": "Eigentümer",
"owner_removePendingText": "Ausstehend",
"owner_addText": "Einen Kontakt zur Mit-Eigentümerschaft einladen",
"owner_removePendingButton": "Ausgewählte Einladungen zurückziehen",
"owner_addButton": "Zur Eigentümerschaft einladen",
@@ -1311,5 +1311,17 @@
"historyTrim_historySize": "Verlauf: {0}",
"areYouSure": "Bist du sicher?",
"makeACopy": "Kopie erstellen",
"copy_title": "{0} (Kopie)"
"copy_title": "{0} (Kopie)",
"access_noContact": "Keine weiteren Kontakte zum Hinzufügen verfügbar",
"access_muteRequests": "Zugriffsanfragen für dieses Pad stummschalten",
"owner_text": "Nur Eigentümer sind berechtigt für: Hinzufügen/Entfernen von Eigentümern, Beschränkung des Zugriffs mit Zugriffslisten und Löschen des Pads.",
"accessButton": "Zugriff",
"access_allow": "Liste",
"allow_label": "Zugriffsliste: {0}",
"allow_checkbox": "Bei der Verwendung von Zugriffslisten können nur Eigentümer und ausgewählte Nutzer auf das Dokument zugreifen.",
"access_main": "Zugriff",
"allow_disabled": "deaktiviert",
"allow_enabled": "aktiviert",
"contacts": "Kontakte",
"restrictedError": "Du bist nicht berechtigt, auf dieses Dokument zuzugreifen"
}

View File

@@ -500,7 +500,7 @@
"settings_pinningError": "Un problème est survenu",
"settings_usageAmount": "Vos pads épinglés occupent {0} Mo",
"settings_logoutEverywhereButton": "Se déconnecter",
"settings_logoutEverywhereTitle": "Se déconnecter partout",
"settings_logoutEverywhereTitle": "Fermer les autres sessions",
"settings_logoutEverywhere": "Se déconnecter de force de toutes les autres sessions",
"settings_logoutEverywhereConfirm": "Êtes-vous sûr ? Vous devrez vous reconnecter sur tous vos autres appareils.",
"settings_driveDuplicateTitle": "Doublons des pads dont vous êtes propriétaire",
@@ -554,7 +554,7 @@
"upload_success": "Votre fichier ({0}) a été importé avec succès et ajouté à votre CryptDrive.",
"upload_notEnoughSpace": "Il n'y a pas assez d'espace libre dans votre CryptDrive pour ce fichier.",
"upload_notEnoughSpaceBrief": "Pas assez d'espace",
"upload_tooLarge": "Ce fichier dépasse la taille maximale autorisée.",
"upload_tooLarge": "Ce fichier dépasse la taille maximale autorisée pour votre compte.",
"upload_tooLargeBrief": "Fichier trop volumineux",
"upload_choose": "Choisir un fichier",
"upload_pending": "En attente",
@@ -1142,10 +1142,10 @@
"register_emailWarning1": "Vous pouvez continuer, mais ces données ne sont pas nécessaires et ne seront pas envoyées à notre serveur.",
"register_emailWarning2": "Vous ne pourrez pas réinitialiser votre mot de passe en utilisant votre adresse email comme sur beaucoup d'autres services.",
"register_emailWarning3": "Si vous souhaitez tout de même utiliser votre adresse email comme nom d'utilisateur, appuyez sur OK.",
"owner_removeText": "Supprimer un propriétaire existant",
"owner_removePendingText": "Annuler une offre en attente",
"owner_removeText": "Propriétaires",
"owner_removePendingText": "En attente",
"owner_addText": "Proposer à un contact d'être co-propriétaire de ce document",
"owner_unknownUser": "Utilisateur inconnu",
"owner_unknownUser": "inconnu",
"owner_removeButton": "Supprimer les propriétaires sélectionnés",
"owner_removePendingButton": "Annuler les offres sélectionnées",
"owner_addButton": "Proposer d'être propriétaire",
@@ -1311,5 +1311,20 @@
"historyTrim_historySize": "Historique : {0}",
"areYouSure": "Êtes-vous sûr ?",
"copy_title": "{0} (copie)",
"makeACopy": "Créer une copie"
"makeACopy": "Créer une copie",
"owner_text": "Le(s) propriétaire(s) d'un pad sont les seuls utilisateurs autorisés à : ajouter/supprimer des propriétaires, restreindre l'accès au bloc-notes avec une liste d'accès, ou à supprimer le pad.",
"access_muteRequests": "Masquer les requêtes d'accès pour ce pad",
"allow_label": "Liste d'accès : {0}",
"allow_disabled": "désactivée",
"allow_enabled": "activée",
"allow_checkbox": "Activer la liste d'accès",
"access_noContact": "Il n'y a plus de contacts à ajouter",
"contacts": "Contacts",
"restrictedError": "Vous n'êtes pas autorisé à accéder à ce document",
"accessButton": "Accès",
"access_allow": "Liste",
"access_main": "Accès",
"logoutEverywhere": "Se déconnecter partout",
"allow_text": "L'utilisation d'une liste d'accès signifie que seuls les utilisateurs et propriétaires sélectionnés pourront accéder à ce document.",
"teams": "Équipes"
}

View File

@@ -513,7 +513,7 @@
"settings_pinningError": "Something went wrong",
"settings_usageAmount": "Your pinned pads occupy {0}MB",
"settings_logoutEverywhereButton": "Log out",
"settings_logoutEverywhereTitle": "Log out everywhere",
"settings_logoutEverywhereTitle": "Close remote sessions",
"settings_logoutEverywhere": "Force log out of all other web sessions",
"settings_logoutEverywhereConfirm": "Are you sure? You will need to log in with all your devices.",
"settings_driveDuplicateTitle": "Duplicated owned pads",
@@ -571,7 +571,7 @@
"upload_success": "Your file ({0}) has been successfully uploaded and added to your drive.",
"upload_notEnoughSpace": "There is not enough space for this file in your CryptDrive.",
"upload_notEnoughSpaceBrief": "Not enough space",
"upload_tooLarge": "This file exceeds the maximum upload size.",
"upload_tooLarge": "This file exceeds the maximum upload size allowed for your account.",
"upload_tooLargeBrief": "File too large",
"upload_choose": "Choose a file",
"upload_pending": "Pending",
@@ -1147,10 +1147,10 @@
"features_noData": "No personal information required",
"features_pricing": "Between {0} and {2}€ per month",
"features_emailRequired": "Email address required",
"owner_removeText": "Remove an existing owner",
"owner_removePendingText": "Cancel a pending offer",
"owner_removeText": "Owners",
"owner_removePendingText": "Pending",
"owner_addText": "Offer co-ownership to a contact",
"owner_unknownUser": "Unknown user",
"owner_unknownUser": "unknown",
"owner_removeButton": "Remove selected owners",
"owner_removePendingButton": "Cancel selected offers",
"owner_addButton": "Offer ownership",
@@ -1311,5 +1311,20 @@
"settings_trimHistoryTitle": "Delete History",
"settings_trimHistoryHint": "Save storage space by deleting the history of your drive and notifications. This will not affect the history of your pads. You can delete the history of pads in their properties dialog.",
"makeACopy": "Make a copy",
"copy_title": "{0} (copy)"
"copy_title": "{0} (copy)",
"access_main": "Access",
"access_allow": "List",
"accessButton": "Access",
"restrictedError": "You are not authorised to access this document",
"contacts": "Contacts",
"access_noContact": "No other contact to add",
"allow_checkbox": "Enable access list",
"allow_enabled": "enabled",
"allow_disabled": "disabled",
"allow_label": "Access list: {0}",
"access_muteRequests": "Mute access requests for this pad",
"owner_text": "The owner(s) of a pad are the only users authorised to: add/remove owners, restrict access to the pad with an access list, or delete the pad.",
"logoutEverywhere": "Log out everywhere",
"allow_text": "Using an access list means that only selected users and owners will be able to access this document.",
"teams": "Teams"
}