Merge branch 'staging' into ooslide

pull/1/head
ansuz 4 years ago
commit cddace08ea

@ -32,11 +32,15 @@
* pinning?
* oo rebuild
* OnlyOffice v6.2
* some buttons that we were hiding have new ids and needed to be hidden again
* translations
* updated catch-phrase (Collaboration suite\nend-to-end-encrypted and open-source
* CKEditor
* cursor jump when clicking on a comment bubble
* keybindings for common styles
* test if this affects scroll position (it shouldn't)
* check that CTRL-space doesn't mess with anything and that it is what Google uses
* test on Mac
* nodrive
* load anonymous accounts without creating a drive
* faster load time, less junk on the server

@ -54,7 +54,7 @@ module.exports = {
* and it may have unintended consequences in practice.
*
*/
httpUnsafeOrigin: 'http://localhost:3000/',
httpUnsafeOrigin: 'http://localhost:3000',
/* httpSafeOrigin is the URL that is used for the 'sandbox' described above.
* If you're testing or developing with CryptPad on your local machine then

@ -16,15 +16,19 @@ var Env = require("./lib/env").create(config);
var app = Express();
var canonicalizeOrigin = function (s) {
return (s || '').trim().replace(/\/+$/, '');
};
(function () {
// you absolutely must provide an 'httpUnsafeOrigin'
if (typeof(config.httpUnsafeOrigin) !== 'string') {
throw new Error("No 'httpUnsafeOrigin' provided");
}
config.httpUnsafeOrigin = config.httpUnsafeOrigin.trim();
config.httpUnsafeOrigin = canonicalizeOrigin(config.httpUnsafeOrigin);
if (typeof(config.httpSafeOrigin) === 'string') {
config.httpSafeOrigin = config.httpSafeOrigin.trim().replace(/\/$/, '');
config.httpSafeOrigin = canonicalizeOrigin(config.httpSafeOrigin);
}
// fall back to listening on a local address

@ -179,5 +179,24 @@ define(function() {
// You can change the value here.
// config.maxOwnedTeams = 5;
// The userlist displayed in collaborative documents is stored alongside the document data.
// Everytime someone with edit rights joins a document or modify their user data (display
// name, avatar, color, etc.), they update the "userlist" part of the document. When too many
// editors are in the same document, all these changes increase the risks of conflicts which
// require CPU time to solve. A "degraded" mode can now be set when a certain number of editors
// are in a document at the same time. This mode disables the userlist, the chat and the
// position of other users' cursor. You can configure the number of user from which the session
// will enter into degraded mode. A big number may result in collaborative edition being broken,
// but this number depends on the network and CPU performances of each user's device.
config.degradedLimit = 8;
// In "legacy" mode, one-time users were always creating an "anonymous" drive when visiting CryptPad
// in which they could store their pads. The new "driveless" mode allow users to open an existing
// pad without creating a drive in the background. The drive will only be created if they visit
// a different page (Drive, Settings, etc.) or try to create a new pad themselves. You can disable
// the driveless mode by changing the following value to "false"
config.allowDrivelessMode = true;
config.allowDrivelessMode = true;
return config;
});

@ -1552,6 +1552,8 @@ define([
faqLine,
]);
$(content).find('a').attr('target', '_blank');
var buttons = [
{
className: 'primary',

@ -1095,6 +1095,7 @@ define([
common.changePadPassword = function (Crypt, Crypto, data, cb) {
var href = data.href;
var oldPassword = data.oldPassword;
var newPassword = data.password;
var teamId = data.teamId;
if (!href) { return void cb({ error: 'EINVAL_HREF' }); }
@ -1123,7 +1124,9 @@ define([
var isSharedFolder = parsed.type === 'drive';
var optsGet = {};
var optsGet = {
password: oldPassword
};
var optsPut = {
password: newPassword,
metadata: {},
@ -1133,7 +1136,7 @@ define([
var cryptgetVal;
Nthen(function (waitFor) {
if (parsed.hashData && parsed.hashData.password) {
if (parsed.hashData && parsed.hashData.password && !oldPassword) {
common.getPadAttribute('password', waitFor(function (err, password) {
optsGet.password = password;
}), href);
@ -1418,6 +1421,7 @@ define([
common.changeOOPassword = function (data, _cb) {
var cb = Util.once(Util.mkAsync(_cb));
var href = data.href;
var oldPassword = data.oldPassword;
var newPassword = data.password;
var teamId = data.teamId;
if (!href) { return void cb({ error: 'EINVAL_HREF' }); }
@ -1452,12 +1456,16 @@ define([
validateKey: newSecret.keys.validateKey
},
};
var optsGet = {};
var optsGet = {
password: oldPassword
};
Nthen(function (waitFor) {
common.getPadAttribute('', waitFor(function (err, _data) {
padData = _data;
if (!oldPassword) {
optsGet.password = padData.password;
}
}), href);
common.getAccessKeys(waitFor(function (keys) {
optsGet.accessKeys = keys;

@ -888,9 +888,16 @@ define([
});
}
var href = data.href;
var hashes = priv.hashes || {};
var bestHash = hashes.editHash || hashes.viewHash || hashes.fileHash;
if (data.fakeHref) {
href = Hash.hashToHref(bestHash, priv.app);
}
sframeChan.query(q, {
teamId: typeof(owned) !== "boolean" ? owned : undefined,
href: data.href,
href: href,
oldPassword: priv.password,
password: newPass
}, function (err, data) {
$(passwordOk).text(Messages.properties_changePasswordButton);
@ -956,7 +963,7 @@ define([
spinner.spin();
sframeChan.query('Q_DELETE_OWNED', {
teamId: typeof(owned) !== "boolean" ? owned : undefined,
channel: data.channel
channel: data.channel || priv.channel
}, function (err, obj) {
spinner.done();
UI.findCancelButton().click();

@ -331,6 +331,8 @@ define([
teamId = data.teamId;
}
// XXX CLEAR CACHE
if (channel === store.driveChannel && !force) {
return void cb({error: 'User drive removal blocked!'});
}
@ -586,11 +588,14 @@ define([
var proxy = store.proxy || {};
var disableThumbnails = Util.find(proxy, ['settings', 'general', 'disableThumbnails']);
var teams = (store.modules['team'] && store.modules['team'].getTeamsData(app)) || {};
if (!proxy.uid) {
store.noDriveUid = store.noDriveUid || Hash.createChannelId();
}
var metadata = {
// "user" is shared with everybody via the userlist
user: {
name: proxy[Constants.displayNameKey] || store.noDriveName || "",
uid: proxy.uid || Hash.createChannelId(), // Random uid in nodrive mode
uid: proxy.uid || store.noDriveUid, // Random uid in nodrive mode
avatar: Util.find(proxy, ['profile', 'avatar']),
profile: Util.find(proxy, ['profile', 'view']),
color: getUserColor(),
@ -858,6 +863,7 @@ define([
Store.setDisplayName = function (clientId, value, cb) {
if (!store.proxy) {
store.noDriveName = value;
broadcast([clientId], "UPDATE_METADATA");
return void cb();
}
if (store.modules['profile']) {
@ -2836,7 +2842,10 @@ define([
store.driveMetadata = info.metadata;
if (!rt.proxy.drive || typeof(rt.proxy.drive) !== 'object') { rt.proxy.drive = {}; }
if (!rt.proxy[Constants.displayNameKey] && store.noDriveName) {
store.proxy[Constants.displayNameKey] = store.noDriveName;
rt.proxy[Constants.displayNameKey] = store.noDriveName;
}
if (!rt.proxy.uid && store.noDriveUid) {
rt.proxy.uid = store.noDriveUid;
}
/*
// deprecating localStorage migration as of 4.2.0

@ -2,11 +2,12 @@ define([
'/common/common-util.js',
'/common/common-constants.js',
'/customize/messages.js',
'/customize/application_config.js',
'/bower_components/chainpad-crypto/crypto.js',
], function (Util, Constants, Messages, Crypto) {
], function (Util, Constants, Messages, AppConfig, Crypto) {
var Cursor = {};
var DEGRADED = 3; // XXX Number of users before switching to degraded mode
var DEGRADED = AppConfig.degradedLimit || 8;
var convertToUint8 = function (obj) {
var l = Object.keys(obj).length;
@ -51,6 +52,12 @@ define([
});
};
var updateDegraded = function (ctx, wc, chan) {
var m = wc.members;
chan.degraded = (m.length-1) >= DEGRADED;
ctx.emit('DEGRADED', { degraded: chan.degraded }, chan.clients);
};
var initCursor = function (ctx, obj, client, cb) {
var channel = obj.channel;
var secret = obj.secret;
@ -93,14 +100,10 @@ define([
// ==> And push the new tab to the list
chan.clients.push(client);
updateDegraded(ctx, chan.wc, chan);
return void cb();
}
var updateDegraded = function (ctx, wc, chan) {
var m = wc.members;
chan.degraded = (m.length-1) >= DEGRADED;
ctx.emit('DEGRADED', { degraded: chan.degraded }, chan.clients);
};
var onOpen = function (wc) {
ctx.channels[channel] = ctx.channels[channel] || {};

@ -537,10 +537,9 @@ define([
if (peer === hk) { return; }
if (channel.readOnly) { return; }
// XXX review
// Sending myData is used to build a "mapId" object which links
// netflux IDs to a curvePublic/uid. We use this map in friend chat
// to detect is the other user is online and we also use it in team chat
// to detect if the other user is online and we also use it in team chat
// to show if other team members are online (in the roster section).
// It is not needed in the pad chat for now and only causes useless
// network usage.

@ -868,7 +868,6 @@ define([
if (fId && Env.folders[fId] && Env.folders[fId].deleting) {
delete Env.folders[fId].deleting;
}
console.error(obj.error, chan);
Feedback.send('ERROR_DELETING_OWNED_PAD=' + chan + '|' + obj.error, true);
return void cb();
}
@ -881,6 +880,11 @@ define([
ids.push(fId);
}
if (!ids.length) {
toDelete = undefined;
return void cb();
}
ids.forEach(function (id) {
var paths = findFile(Env, id);
var _resolved = _resolvePaths(Env, paths);
@ -912,8 +916,13 @@ define([
});
});
}).nThen(function () {
if (!toDelete) {
// Nothing to delete
cb();
} else {
// Remove deleted pads from the drive
_delete(Env, { resolved: toDelete }, cb);
}
// If we were using the access modal, send a refresh command
if (data.channel) {
Env.Store.refreshDriveUI();

@ -221,8 +221,11 @@ define([
}
} catch (e) { console.error(e); }
// NOTE: Driveless mode should only work for existing pads, but we can't check that
// before creating the worker because we need the anon RPC to do so.
// We're only going to check if a hash exists in the URL or not.
Cryptpad.ready(waitFor(), {
noDrive: cfg.noDrive,
noDrive: cfg.noDrive && AppConfig.allowDrivelessMode && currentPad.hash,
driveEvents: cfg.driveEvents,
cache: Boolean(cfg.cache),
currentPad: currentPad
@ -1404,6 +1407,7 @@ define([
};
config.data = {
app: parsed.type,
channel: secret.channel,
hashes: hashes,
password: password,
isTemplate: isTemplate,

@ -212,6 +212,7 @@ MessengerUI, Messages) {
var $editUsersList = $('<div>', {'class': 'cp-toolbar-userlist-others'})
.appendTo($editUsers);
var degradedLimit = Config.degradedLimit || 8;
if (!online) {
$('<em>').text(Messages.userlist_offline).appendTo($editUsersList);
numberOfEditUsers = '?';
@ -219,8 +220,7 @@ MessengerUI, Messages) {
} else if (metadataMgr.isDegraded() === true) {
numberOfEditUsers = Math.max(metadataMgr.getChannelMembers().length - 1, 0);
numberOfViewUsers = '';
Messages.toolbar_degraded = "Too many editors are present in the pad. The userlist has been disabled to improve performances"; // XXX
$('<em>').text(Messages.toolbar_degraded).appendTo($editUsersList);
$('<em>').text(Messages._getKey('toolbar_degraded', [degradedLimit])).appendTo($editUsersList);
}
// Update the buttons

@ -250,7 +250,7 @@
"fm_sharedFolderName": "Geteilter Ordner",
"fm_searchPlaceholder": "Suchen...",
"fm_newButton": "Neu",
"fm_newButtonTitle": "Ein neues Pad oder Ordner erstellen, oder eine Datei in den aktuellen Ordner importieren",
"fm_newButtonTitle": "Erstelle ein neues Dokument oder einen neuen Ordner, importiere eine Datei in den aktuellen Ordner.",
"fm_newFolder": "Neuer Ordner",
"fm_newFile": "Neues Pad",
"fm_folder": "Ordner",
@ -596,7 +596,7 @@
"creation_noOwner": "Kein Eigentümer",
"creation_expiration": "Ablaufdatum",
"creation_passwordValue": "Passwort",
"creation_newPadModalDescription": "Klicke auf einen Pad-Typ, um das entsprechende Pad zu erstellen. Du kannst auch die <b>Tab</b>-Taste für die Auswahl und die <b>Enter</b>-Taste zum Bestätigen benutzen.",
"creation_newPadModalDescription": "Klicke auf einen Dokument-Typ, um das entsprechende Dokument zu erstellen. Du kannst auch die <b>Tab</b>-Taste für die Auswahl und die <b>Enter</b>-Taste zum Bestätigen benutzen.",
"password_info": "Das Pad, das du öffnen möchtest, existiert nicht mehr oder ist mit einem Passwort geschützt. Gib das richtige Passwort ein, um den Inhalt anzuzeigen.",
"password_error": "Pad nicht gefunden!<br>Dieser Fehler kann zwei Ursachen haben: Entweder ist das Passwort ungültig oder das Pad wurde vom Server gelöscht.",
"password_placeholder": "Gib das Passwort hier ein...",
@ -1188,5 +1188,6 @@
"addOptionalPassword": "Passwort hinzufügen (optional)",
"oo_lostEdits": "Leider konnten deine letzten ungespeicherten Bearbeitungen nach dem Synchronisieren neuer Inhalte nicht wiederhergestellt werden.",
"fm_cantUploadHere": "Hochladen hier nicht möglich",
"importError": "Import fehlgeschlagen (falsches Format)"
"importError": "Import fehlgeschlagen (falsches Format)",
"toolbar_degraded": "Derzeit bearbeiten über {0} Benutzer dieses Dokument. Die Benutzerliste und der Chat wurden deaktiviert, um die Performance zu verbessern."
}

@ -106,8 +106,8 @@
"fm_originalPath": "Enlace original",
"fm_noname": "Documento sin título",
"fm_emptyTrashDialog": "¿Seguro que quieres vaciar la papelera?",
"fm_removeSeveralPermanentlyDialog": "¿Seguro que quieres eliminar estos {0} elementos de la papelera para siempre?",
"fm_removePermanentlyDialog": "¿Seguro que quieres eliminar este elemento para siempre?",
"fm_removeSeveralPermanentlyDialog": "¿Estás seguro de que quieres eliminar estos {0} elementos de tu unidad? Permanecerán en las unidades de otros usuarios que los hayan almacenado.",
"fm_removePermanentlyDialog": "¿Estás seguro de que quieres eliminar este elemento de tu unidad? Permanecerá en las unidades de otros usuarios que lo hayan almacenado.",
"fm_restoreDialog": "¿Seguro que quieres recuperar {0}?",
"fm_unknownFolderError": "La carpeta seleccionada ya no existe. Abriendo la carpeta anterior...",
"fm_contextMenuError": "No se pudo abrir el menú para este elemento. Si persiste el problema, recarga la página.",
@ -120,7 +120,7 @@
"fc_open_ro": "Abrir (sólo lectura)",
"fc_delete": "Eliminar",
"fc_restore": "Recuperar",
"fc_remove": "Eliminar para siempre",
"fc_remove": "Eliminar",
"fc_empty": "Vaciar la papelera",
"fc_prop": "Propiedades",
"fo_moveUnsortedError": "No puedes mover una carpeta en la lista de documentos no organizados",
@ -139,11 +139,11 @@
"login_invalUser": "Nombre de usuario requerido",
"login_invalPass": "Contraseña requerida",
"login_unhandledError": "Ha ocurrido un error inesperado :(",
"register_importRecent": "Importe el historial de tu sesión anónima",
"register_importRecent": "Importar documentos de su sesión no registrada",
"register_acceptTerms": "Acepto los <a href='/terms.html' tabindex='-1'>términos de servicio</a>",
"register_passwordsDontMatch": "Las contraseñas no corresponden",
"register_mustAcceptTerms": "Tienes que aceptar los términos de servicio",
"register_header": "Bienvenido a CryptPad",
"register_header": "Registrar",
"settings_title": "Preferencias",
"settings_save": "Guardar",
"settings_backup": "Copia de seguridad",
@ -156,7 +156,7 @@
"settings_resetTipsDone": "Todos los consejos ahora están visibles",
"footer_aboutUs": "Acerca de nosotros",
"about": "Acerca de nosotros",
"privacy": "Privacidad",
"privacy": "Política de privacidad",
"contact": "Contacto",
"terms": "Términos de Servicio",
"movedToTrash": "Este pad fue movido a la papelera.<br><a href\"/drive/\">Acceder a mi Drive</a>",
@ -170,7 +170,7 @@
"blog": "Blog",
"driveReadmeTitle": "¿Qué es CryptPad?",
"readme_welcome": "¡Bienvenido a CryptPad!",
"readme_p1": "Bienvenido a CryptPad, aquí podrás anotar cosas solo o con otra gente.",
"readme_p1": "Bienvenido a CryptPad, aquí es donde puedes tomar nota de las cosas solo y con tus contactos.",
"readme_p2": "Este pad es una guía rápida para aprender a usar a CryptPad para tomar notas, organizarlas y trabajar con más personas.",
"readme_cat1": "Conoce tu CryptDrive",
"readme_cat1_l1": "Crea un pad: En CryptDrive, haz clic en {0} y luego en {1} para crear un pad.",
@ -205,11 +205,11 @@
"feedback_optout": "Si quieres darte de baja, visita <a href='/settings/'>tus preferencias</a>, donde podrás activar o desactivar el feedback",
"fm_searchName": "Buscar",
"fm_searchPlaceholder": "Buscar...",
"fm_newButtonTitle": "Crear un nuevo pad o carpeta",
"fm_newButtonTitle": "Crear un nuevo documento o carpeta.",
"fm_openParent": "Mostrar en carpeta",
"register_writtenPassword": "He escrito mi usuario y contraseña, continuar",
"register_cancel": "Volver",
"register_warning": "Zero Knowledge significa que no podemos recuperar tus datos si pierdes tu contraseña.",
"register_cancel": "Cancelar",
"register_warning": "<i class='fa fa-warning'></i> Advertencia",
"register_alreadyRegistered": "Este usuario ya existe, ¿iniciar sesión?",
"button_newwhiteboard": "Nueva Pizarra",
"saveTemplateButton": "Guardar como plantilla",
@ -223,8 +223,8 @@
"canvas_opacity": "Opacidad",
"settings_publicSigningKey": "Clave de Firma Pública",
"historyButton": "Mostrar el historial del documento",
"history_next": "Ir a la versión anterior",
"history_prev": "Ir a la versión posterior",
"history_next": "Siguiente versión",
"history_prev": "Versión anterior",
"history_closeTitle": "Cerrar el historial",
"history_restoreTitle": "Restaurar la versión seleccionada del documento",
"history_restorePrompt": "¿Estás seguro de que quieres cambiar la versión actual del documento por ésta?",
@ -251,7 +251,7 @@
"newVersion": "<b>CryptPad ha sido actualizado!</b><br>Puedes ver lo que ha cambiado aquí (en inglés):<br><a href=\"https://github.com/xwiki-labs/cryptpad/releases/tag/{0}\" target=\"_blank\">Notas de versión para CryptPad {0}</a>",
"pinLimitReachedAlertNoAccounts": "Has llegado a tu límite de espacio",
"previewButtonTitle": "Mostrar/esconder la vista previa Markdown",
"fm_info_anonymous": "No estás conectado, así que estos pads pueden ser borrados (<a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">¿por qué?</a>). <a href=\"/register/\">Regístrate</a> o <a href=\"/login/\">Inicia sesión</a> para asegurarlos.",
"fm_info_anonymous": "No has iniciado sesión, por lo que tus documentos expirarán después de {0} días. Borrar el historial de tu navegador puede hacer que desaparezcan.<br><a href=\"/register/\">Inscríbete</a> (no se requieren datos personales) o <a href=\"/login/\">Ingresa</a> para almacenarlos en tu disco de forma indefinida. <a href=\"https://docs.cryptpad.fr/en/user_guide/user_account.html#account-types\" target=\"_blank\">Más información sobre las cuentas registradas</a>.",
"fm_alert_anonymous": "Hola, estás usando CryptPad anónimamente. Está bien, pero tus pads pueden ser borrados después de un périodo de inactividad. Hemos desactivado funciones avanzadas de CryptDrive para usuarios anónimos porque queremos dejar claro que no es un lugar seguro para almacenar cosas. Puedes <a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">leer este articulo</a> (en inglés) acerca de por qué hacemos esto y por qué deberías <a href=\"/register/\">Registrarte</a> e <a href=\"/login/\">Iniciar sesión</a>.",
"fm_error_cantPin": "Error del servidor. Por favor, recarga la página e inténtalo de nuevo.",
"upload_notEnoughSpace": "No tienes suficiente espacio para este archivo en tu CryptDrive",
@ -269,7 +269,7 @@
"fm_info_trash": "Vacía tu papelera para liberar espacio en tu CryptDrive.",
"upload_mustLogin": "Tienes que estar conectado para subir archivos",
"uploadButton": "Subir",
"uploadButtonTitle": "Subir un archivo a la carpeta",
"uploadButtonTitle": "Subir un archivo a tu CryptDrive",
"filePickerButton": "Incrustar un archivo",
"filePicker_close": "Cerrar",
"filePicker_description": "Elige un archivo de tu CryptDrive para incrustarlo o sube uno nuevo",
@ -337,7 +337,7 @@
"settings_cat_code": "Código",
"settings_codeIndentation": "Indentación del editor de código (espacios)",
"settings_codeUseTabs": "Utilizar tabulaciones en vez de espacios",
"main_catch_phrase": "El Cloud Zero Knowledge",
"main_catch_phrase": "Paquete de colaboración<br> de extremo a extremo encriptado y de código abierto",
"button_newkanban": "Nuevo Kanban",
"button_newsheet": "Nueva Hoja",
"padNotPinned": "Esta nota expirará luego de 3 meses de inactividad, {0}ingresar{1} o {2}registrarse{3}para conservar.",
@ -350,7 +350,7 @@
"errorCopy": " Aún puedes acceder al contenido presionando <em>Esc</em>.<br>Una vez que cierres esta ventana no te será posible acceder a ella nuevamente.",
"errorRedirectToHome": "Presiona<em>Esc</em>para ser redirigido a tu Cryptdrive.",
"newVersionError": "Una nueva versión de CryptPad está disponible.<br><a href='#'>Recargar</a> para usar la nueva versión, o presiona escape para acceder a tu contenido en <b>modo offline</>.",
"deletedFromServer": "Nota borrada desde el servidor",
"deletedFromServer": "Nota borrada",
"mustLogin": "Debes haber ingresado a tu cuenta para acceder a esta página",
"disabledApp": "Esta nota ha sido eliminada por inactividad. Presione Esc para crear una nueva nota.",
"initializing": "Iniciando...",
@ -442,7 +442,7 @@
"fm_moveNestedSF": "No puedes poner una carpeta compartida dentro de otra. La carpeta {0} no se movió.",
"fm_passwordProtected": "Protegido por una contraseña",
"fc_newsharedfolder": "Nueva carpeta compartida",
"fc_delete_owned": "Eliminar desde el servidor",
"fc_delete_owned": "Destruir",
"fc_remove_sharedfolder": "Eliminar",
"fc_hashtag": "Etiquetas",
"register_passwordTooShort": "La contraseña debe tener por los menos {0} caracteres de largo.",
@ -451,8 +451,8 @@
"settings_cat_cursor": "Cursor",
"settings_cat_pad": "Texto enriquecido",
"settings_cat_subscription": "Suscripción",
"settings_backupHint": "Respalde o recupere todo sus contenido ne CryptDrive. No tendrán el contenido de sus archivos, solo las llaves para acceder a ellos.",
"settings_backupHint2": "Descargue el contenido actual de sus notas. Las notas serán descargadas en un formato de leíble si el formato esta disponible.",
"settings_backupHint": "Respalde o recupere todo sus contenido en CryptDrive. No tendrán el contenido de sus archivos, solo las llaves para acceder a ellos.",
"settings_backupHint2": "Descargue todos los documentos de su unidad. Los documentos se descargarán en formatos legibles por otras aplicaciones cuando dicho formato esté disponible. Cuando dicho formato no esté disponible, los documentos se descargarán en un formato legible por CryptPad.",
"settings_backup2": "Descargar mi CryptDrive",
"settings_backup2Confirm": "Esto descargara todas las notas y archivos desde su CryptDrive. Si desea continuar, elija un nombre y presione OK",
"settings_exportTitle": "Exportar su CryptDrive",
@ -506,7 +506,7 @@
"settings_autostoreHint": "<b> Automático </b> Todos los pads que visita se almacenan en su CryptDrive. <br> <b> Manual (siempre pregunte) </b> Si aún no ha guardado un pad, se le preguntará si desea para almacenarlos en su CryptDrive. <br> <b> Manual (nunca preguntar) </b> Los Pads no se almacenan automáticamente en su Cryptpad. La opción para almacenarlos estará oculta.",
"settings_driveDuplicateTitle": "Pads de propiedad duplicadas",
"settings_driveDuplicateHint": "Cuando mueve sus propias Pads a una carpeta compartida, se guarda una copia en su CryptDrive para asegurarse de que conserva su control sobre ella. Puedes ocultar archivos duplicados. Solo la versión compartida será visible, a menos que se elimine, en cuyo caso el original se mostrará en su ubicación anterior.",
"settings_padWidthHint": "Los Pads de texto enriquecido usan de manera predeterminada el ancho máximo disponible en su pantalla y puede ser difícil de leer. Puede reducir el ancho del editor aquí.",
"settings_padWidthHint": "Cambia entre el modo de página (por defecto) que limita el ancho del editor de texto, y el uso del ancho total de la pantalla.",
"settings_padSpellcheckHint": "Esta opción le permite habilitar la corrección ortográfica en los Pads de texto enriquecido. Los errores ortográficos estarán subrayados en rojo y tendrá que mantener presionada la tecla Ctrl o Meta mientras hace clic derecho para ver las opciones correctas.",
"settings_padSpellcheckLabel": "Habilite el corrector ortográfico en el Pad de texto enriquecido",
"settings_ownDriveConfirm": "La actualización de su cuenta puede llevar algún tiempo. Deberá volver a iniciar sesión en todos sus dispositivos. ¿Estás seguro?",
@ -536,7 +536,7 @@
"uploadFolder_modal_owner": "Archivos de propiedad",
"uploadFolder_modal_forceSave": "Almacene sus archivos en su CryptDrive",
"upload_notEnoughSpaceBrief": "Sin espacio suficiente",
"upload_tooLargeBrief": "Archivo muy grande",
"upload_tooLargeBrief": "El archivo supera el límite de {0}MB",
"upload_up": "Subir",
"download_dl": "Descargar",
"download_step1": "Descargando",
@ -556,52 +556,91 @@
"mdToolbar_check": "Lista de tarea",
"mdToolbar_code": "Código",
"mdToolbar_toc": "Tablas de contenidos",
"home_host": "Esta es una instancia de comunidad independiente de CryptPad. Su código fuente está disponible <a href=\"https://github.com/xwiki-labs/cryptpad\" target=\"_blank\" rel=\"noreferrer noopener\"> en GitHub </a>.",
"whatis_title": "¿Que es CryptPad?",
"whatis_collaboration": "Colaboración fácil y rápida",
"home_host": "Esta es una instancia comunitaria independiente de CryptPad.",
"whatis_title": "¿Qué es CryptPad?",
"whatis_collaboration": "Colaboración privada",
"whatis_drive": "Organización con CryptDrive",
"features": "Caracteristicas",
"features_title": "Comparación de características",
"features_anon": "Usuario anonimo",
"features_registered": "Usuario registrado",
"features_premium": "Usuarios Premium",
"features_f_apps": "Acceso a las principales aplicaciones",
"features_f_core": "Características comunes para las aplicaciones",
"features_title": "Características",
"features_anon": "No registrado",
"features_registered": "Registrado",
"features_premium": "Premium",
"features_f_apps": "Acceso a todas las aplicaciones",
"features_f_core": "Características comunes",
"features_f_core_note": "Editar, Importar y Exportar, Historial, Lista de usuarios, Chat",
"features_f_file0": "Abrir archivos",
"features_f_file0_note": "Ver y descargar archivos compartidos por otros usuarios",
"features_f_file0": "Abrir documentos",
"features_f_file0_note": "Ver y descargar documentos compartidos por otros usuarios",
"features_f_cryptdrive0": "Acceso limitado a CryptDrive",
"features_f_cryptdrive0_note": "Posibilidad de almacenar los pads visitados en su navegador para poder abrirlos más tarde",
"features_f_storage0": "Tiempo de almacenamiento limitado",
"features_f_storage0_note": "Las Pads creadas corren el riesgo de eliminación después de 3 meses de inactividad",
"features_f_storage0_note": "Los documentos se eliminan después de {0} días de inactividad",
"features_f_anon": "Todas las funciones de usuario anónimo",
"features_f_anon_note": "Con mejor usabilidad y más poder sobre tus pads",
"features_f_anon_note": "Con funcionalidad adicional",
"features_f_cryptdrive1": "Funcionalidad completa de CryptDrive",
"features_f_cryptdrive1_note": "Carpetas, compartir carpetas, plantillas, tareas",
"features_f_devices": "Tus pads en todos tus dispositivos",
"features_f_devices_note": "Acceda a su CryptDrive en todas partes con su cuenta de usuario",
"features_f_social": "Aplicaciones sociales",
"features_f_social_note": "Crear un perfil, usar un avatar, hablar con contactos",
"features_f_social": "Características sociales",
"features_f_social_note": "Añadir contactos para una colaboración segura, crear un perfil, controles de acceso detallados",
"features_f_file1": "Subir y compartir archivos",
"features_f_file1_note": "Compartir archivos con tus contactos o incrustarlo en tus notas",
"features_f_storage1": "Almacenamiento permanente (50 MB)",
"features_f_storage1_note": "Los Pads almacenados en su CryptDrive nunca se eliminan por inactividad",
"features_f_file1_note": "Almacena archivos en tu CryptDrive: imágenes, PDFs, vídeos y mucho más. Compártelos con tus contactos o incrústalos en tus documentos. (hasta {0}MB)",
"features_f_storage1": "Almacenamiento Personal ({0})",
"features_f_storage1_note": "Los documentos almacenados en su CryptDrive no se borran por inactividad",
"features_f_register": "Registrate gratis",
"features_f_reg": "Todas las funciones de usuario registrado",
"features_f_reg_note": "Y ayudar al desarrollo de CryptPad",
"features_f_reg_note": "Con beneficios adicionales",
"features_f_storage2": "Espacio de almacenamiento adicional",
"features_f_storage2_note": "De 5GB a 50GB dependiendo del plan seleccionado",
"features_f_storage2_note": "De 5GB a 50GB según el plan, límite aumentado de {0}MB para la subida de archivos",
"features_f_support": "Soporte más rápido",
"features_f_support_note": "Soporte profesional por correo electrónico con el plan Team",
"features_f_supporter": "Conviértete en un defensor de la privacidad",
"features_f_supporter_note": "Ayúdenos a mostrar que el software para mejorar la privacidad debería ser la norma",
"features_f_subscribe": "Suscríbase a premium",
"features_f_subscribe_note": "Primero debe iniciar sesión en CryptPad",
"features_f_support_note": "Respuesta prioritaria del equipo de administración a través del correo electrónico y del sistema de tickets incorporado",
"features_f_supporter": "Apoyar la privacidad",
"features_f_supporter_note": "Ayudar a CryptPad a ser financieramente sostenible y demostrar que el software de mejora de la privacidad financiado voluntariamente por los usuarios debería ser la norma",
"features_f_subscribe": "Suscribirse",
"features_f_subscribe_note": "Se necesita una cuenta registrada para suscribirse",
"four04_pageNotFound": "No pudimos encontrar la página que estabas buscando.",
"help_genericMore": "Obtenga más información sobre cómo CryptPad puede funcionar para usted leyendo nuestras <a> Preguntas frecuentes </a>",
"storageStatus": "Almacenamiento:<br /><b>{0}</b> usado de <b>{1}</b>",
"settings_cursorColorTitle": "Color de puntero",
"mdToolbar_button": "Mostrar u ocultar la barra de herramientas de Markdown",
"creation_404": "Esta almohadilla ya no existe. Utilice el siguiente formulario para crear un nuevo pad.",
"creation_owned1": "Un pad <b>propio</b> puede ser eliminado del servidor cuando el propietario lo desee. Al eliminar un pad propio se elimina de los CryptDrives de otros usuarios."
"creation_404": "Este pad ya no existe. Utilice el siguiente formulario para crear un nuevo pad.",
"creation_owned1": "Un objeto <b>propiedad</b> puede ser destruido cuando el propietario lo desee. La destrucción de un objeto propio hace que no esté disponible en los CryptDrives de otros usuarios.",
"settings_padNotifTitle": "Notificaciones de comentarios",
"password_info": "El bloc que intentas abrir no existe o está protegido con una contraseña. Ingrese la contraseña correcta para acceder a su contenido.",
"creation_newPadModalDescription": "Haz click en un tipo de documento para crearlo. Tú también puedes presionar <b>Tab</b> para seleccionar el tipo y presiona <b>Enter</b> para confirmar.",
"toolbar_degraded": "Actualmente hay más de {0} editores en este documento. La lista de usuarios y el chat están desactivados para mejorar el rendimiento.",
"oo_lostEdits": "Lamentablemente, las ediciones recientes no guardadas no se pueden recuperar después de sincronizar el nuevo contenido.",
"properties_passwordError": "Se ha producido un error al intentar cambiar la contraseña. Por favor, inténtelo de nuevo.",
"properties_passwordSame": "Las nuevas contraseñas deben diferir de la actual.",
"properties_confirmChange": "¿Está seguro? Al cambiar la contraseña se eliminará su historial. Los usuarios que no tengan la nueva contraseña perderán el acceso a este pad",
"properties_confirmNew": "¿Está seguro? Añadir una contraseña cambiará la URL de este pad y eliminará su historial. Los usuarios sin la contraseña perderán el acceso a este pad",
"properties_changePassword": "Cambiar la contraseña",
"properties_addPassword": "Añadir una contraseña",
"password_submit": "Enviar",
"password_placeholder": "Escriba la contraseña aquí...",
"password_error": "¡No se ha encontrado el pad!<br>Este error puede ser causado por dos factores: o la contraseña no es válida, o el pad ha sido borrado del servidor.",
"creation_passwordValue": "Contraseña",
"creation_expiration": "Fecha de vencimiento",
"creation_noOwner": "Sin propietario",
"creation_owners": "Propietarios",
"creation_create": "Crear",
"creation_newTemplate": "Nueva plantilla",
"creation_noTemplate": "Sin plantilla",
"creation_password": "Contraseña\n",
"creation_expireMonths": "Mes(es)",
"creation_expireDays": "Día(s)",
"creation_expireHours": "Hora(s)",
"creation_expireFalse": "Ilimitado",
"creation_expire": "Pad expirando",
"creation_owned": "Pad propio",
"share_linkCategory": "Enlace",
"sharedFolders_forget": "Este bloc sólo se almacena en una carpeta compartida, no puedes moverlo a la papelera. Puedes usar tu CryptDrive si quieres borrarlo.",
"share_mediatagCopy": "Copiar mediatag al portapapeles",
"share_contactCategory": "Contactos",
"share_linkCopy": "Copiar",
"share_linkOpen": "Previsualizar",
"share_linkView": "Ver",
"share_linkEdit": "Editar",
"share_linkAccess": "Permisos de acceso",
"properties_passwordWarning": "La contraseña ha sido cambiada con éxito pero fue incapaz de actualizar tu CryptDrive con los nuevos datos. Es posible que tenga que eliminar la versión antigua del pad manualmente.<br>Pulse OK para recargar y actualizar sus derechos de acceso.",
"properties_passwordSuccess": "La contraseña ha sido cambiada con éxito.<br>Pulsa OK para recargar y actualizar tus derechos de acceso."
}

@ -254,7 +254,7 @@
"fm_sharedFolderName": "Dossier partagé",
"fm_searchPlaceholder": "Rechercher...",
"fm_newButton": "Nouveau",
"fm_newButtonTitle": "Créer un nouveau pad ou un dossier, importer un fichier dans le dossier courant",
"fm_newButtonTitle": "Créer un nouveau document ou un dossier, importer un fichier dans le dossier actuel.",
"fm_newFolder": "Nouveau dossier",
"fm_newFile": "Nouveau pad",
"fm_folder": "Dossier",
@ -603,7 +603,7 @@
"creation_noOwner": "Pas de propriétaire",
"creation_expiration": "Date d'expiration",
"creation_passwordValue": "Mot de passe",
"creation_newPadModalDescription": "Cliquez sur un type de pad pour le créer. Vous pouvez aussi appuyer sur <b>Tab</b> pour sélectionner un type et appuyer sur <b>Entrée</b> pour valider.",
"creation_newPadModalDescription": "Cliquer sur le type de document à créer. Vous pouvez aussi utiliser les touches <b>Tab</b> pour sélectionner un type et <b>Entrée</b> pour valider.",
"password_info": "Le pad auquel vous essayez d'accéder n'existe plus ou est protégé par un mot de passe. Entrez le bon mot de passe pour accéder à son contenu.",
"password_error": "Pad introuvable !<br>Cette erreur peut provenir de deux facteurs. Soit le mot de passe est faux, soit le pad a été supprimé du serveur.",
"password_placeholder": "Tapez le mot de passe ici...",
@ -1188,5 +1188,6 @@
"addOptionalPassword": "Ajouter un mot de passe (optionnel)",
"fm_cantUploadHere": "Impossible d'importer un fichier ici",
"importError": "Impossible d'importer (mauvais format)",
"oo_lostEdits": "Vos récentes modifications non sauvegardées n'ont pas pu être récupérées après la synchronisation du nouveau contenu."
"oo_lostEdits": "Vos récentes modifications non sauvegardées n'ont pas pu être récupérées après la synchronisation du nouveau contenu.",
"toolbar_degraded": "Au moins {0} éditeurs sont actuellement connectés à ce document. La liste des utilisateurs et le chat sont désactivés pour améliorer les performances."
}

@ -257,7 +257,7 @@
"fm_sharedFolderName": "Shared folder",
"fm_searchPlaceholder": "Search...",
"fm_newButton": "New",
"fm_newButtonTitle": "Create a new pad or folder, import a file in the current folder",
"fm_newButtonTitle": "Create a new document or folder, import a file in the current folder.",
"fm_newFolder": "New folder",
"fm_newFile": "New pad",
"fm_morePads": "More",
@ -618,7 +618,7 @@
"creation_noOwner": "No owner",
"creation_expiration": "Expiration date",
"creation_passwordValue": "Password",
"creation_newPadModalDescription": "Click on a pad type to create it. You can also press <b>Tab</b> to select the type and press <b>Enter</b> to confirm.",
"creation_newPadModalDescription": "Click on a document type to create it. You can also press <b>Tab</b> to select the type and press <b>Enter</b> to confirm.",
"password_info": "The pad you're trying to open no longer exist or is protected with a password. Enter the correct password to access its content.",
"password_error": "Pad not found!<br>This error can be caused by two factors: either the password in invalid, or the pad has been deleted from the server.",
"password_placeholder": "Type the password here...",
@ -1188,5 +1188,6 @@
"addOptionalPassword": "Add a password (optional)",
"importError": "Failed to import (wrong format)",
"fm_cantUploadHere": "Can't upload a file here",
"oo_lostEdits": "Unfortunately your recent unsaved edits could not be recovered after synchronising new content."
"oo_lostEdits": "Unfortunately your recent unsaved edits could not be recovered after synchronising new content.",
"toolbar_degraded": "Over {0} editors are currently present in this document. The user list and chat are disabled to improve performance."
}

@ -44,6 +44,7 @@ define([
meta.debugDrive = drive;
};
SFCommonO.start({
noDrive: true,
addData:addData
});
});

@ -101,6 +101,7 @@ define([
origin: window.location.origin,
pathname: window.location.pathname,
feedbackAllowed: Utils.Feedback.state,
channel: config.data.channel,
hashes: config.data.hashes,
password: config.data.password,
propChannels: config.data.getPropChannels(),

Loading…
Cancel
Save