From 9b3cfce76628855ea101feaf0470e269d0976ba8 Mon Sep 17 00:00:00 2001 From: James Downie Date: Sat, 29 Jun 2024 20:15:47 +1000 Subject: [PATCH 001/188] Setting the cloned bare repository to safe.directory. --- install-onlyoffice.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install-onlyoffice.sh b/install-onlyoffice.sh index cebb80343..295ed2a39 100755 --- a/install-onlyoffice.sh +++ b/install-onlyoffice.sh @@ -117,6 +117,8 @@ ensure_oo_is_downloaded () { echo "Downloading OnlyOffice..." git clone --bare https://github.com/cryptpad/onlyoffice-builds.git "$BUILDS_DIR" fi + git config --global --add safe.directory /cryptpad/onlyoffice-conf/onlyoffice-builds.git + } install_version () { From e2c9b66fe91f3884c51ecea419c2320e89748774 Mon Sep 17 00:00:00 2001 From: James Downie Date: Sat, 29 Jun 2024 20:36:35 +1000 Subject: [PATCH 002/188] Added a few packages to Dockerfile that are handy for troubleshooting. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e46137658..009662a4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,7 @@ RUN npm install --production \ # Create actual CryptPad image FROM node:lts-slim ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y git rdfind && rm -rf /var/lib/apt/lists/* +RUN apt update && apt install -y git rdfind procps net-tools curl && rm -rf /var/lib/apt/lists/* # Create user and group for CryptPad so it does not run as root RUN groupadd cryptpad -g 4001 From 2d2855679d2eef766f20f928c3ee2bfb922f3ed1 Mon Sep 17 00:00:00 2001 From: James Downie Date: Tue, 2 Jul 2024 09:48:39 +1000 Subject: [PATCH 003/188] Added new install-onlyoffice.sh switch to docker-entrypoint.sh --- docker-entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 3429b90f6..4629fe690 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -31,7 +31,7 @@ fi cd $CPAD_HOME if [ "$CPAD_INSTALL_ONLYOFFICE" == "yes" ]; then - ./install-onlyoffice.sh --accept-license + ./install-onlyoffice.sh --accept-license --trust-repository fi npm run build From b1e30221ce92da9a05aedc2f62c8a7d1b24c28d9 Mon Sep 17 00:00:00 2001 From: James Downie Date: Tue, 2 Jul 2024 19:13:30 +1000 Subject: [PATCH 004/188] Removed a superfluous apt install statement. --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3d23653e7..e2be11805 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,6 @@ RUN npm install --production \ # Create actual CryptPad image FROM node:lts-slim ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y git rdfind && rm -rf /var/lib/apt/lists/* # Create user and group for CryptPad so it does not run as root RUN groupadd cryptpad -g 4001 From 34eee624eda8573a43cff4aa35346fd84902487d Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 4 Jul 2024 10:34:48 +0200 Subject: [PATCH 005/188] Translated using Weblate (Spanish (Cuba)) Currently translated at 4.4% (79 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 4.4% (79 of 1780 strings) Co-authored-by: Mirel Gonzalez Co-authored-by: Raul Gonzalez Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es_CU/ Translation: CryptPad/App --- www/common/translations/messages.es_CU.json | 82 ++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/www/common/translations/messages.es_CU.json b/www/common/translations/messages.es_CU.json index 0967ef424..6766c6e6f 100644 --- a/www/common/translations/messages.es_CU.json +++ b/www/common/translations/messages.es_CU.json @@ -1 +1,81 @@ -{} +{ + "allow_disabled": "Deshabilitado", + "allow_label": "Lista de acceso: {0}", + "allow_enabled": "Habilitado", + "form_condition_v": "Escoge un valor", + "form_alreadyAnswered": "Respondiste a este formulario el {0}", + "form_editAnswer": "Editar mis respuestas", + "form_viewAnswer": "Ver mis respuestas", + "form_viewAllAnswers": "Ver todas las respuestas ({0})", + "form_authAnswer": "Este formulario no puede ser enviado de forma anónima", + "form_requiredWarning": "Las siguientes preguntas requieren una respuesta:", + "form_required_answer": "Respuesta: ", + "form_required_on": "Requerido", + "form_required_off": "Opcional", + "form_preview": "Previsualizar formulario", + "form_geturl": "Copiar enlace público", + "toolbar_preview": "Vista previa", + "form_addMsg": "Agregar envío de mensaje", + "form_responseMsg": "Este mensaje se mostrará después de que los participantes envíen el formulario.", + "form_makeAnon": "Anonimizar respuestas", + "form_editable": "Editando después de enviar", + "form_type_section": "Sección condicional", + "form_condition_q": "Elige una pregunta", + "form_condition_is": "es", + "form_condition_isnot": "no es", + "form_condition_has": "tiene", + "form_condition_hasnot": "no tiene", + "form_conditional": "Mostrar esta sección solo cuando:", + "form_conditional_add": "Agregar condición OR", + "userlist_visitProfile": "Visitar perfil", + "form_colors": "Tema de color", + "creation_new": "Nuevo {0}", + "fc_openIn": "Abrir en {0}", + "download_step3": "Convirtiendo...", + "earlyAccessBlocked": "Esta aplicación aún no está disponible en esta instancia", + "premiumAccess": "Como suscriptor en {0}, Puedes crear nuevos documentos en esta aplicación de acceso anticipado. Ten en cuenta que es experimental y aún no se debe confiar con datos importantes.", + "form_exportSheet": "Exportar a hoja", + "bounce_danger": "El enlace al que hiciste clic no lleva a una página web, sino a algún código o datos que podrían ser maliciosos.\n\n(\"{0}\")\n\nCryptPad bloquea estos por razones de seguridad. Al hacer clic en OK se cerrará esta pestaña.", + "admin_archiveNote": "Nota", + "admin_nameTitle": "Nombre de instancia", + "ui_saved": "{0} salvado", + "admin_descriptionTitle": "Descripción de la instancia", + "admin_descriptionHint": "El texto descriptivo mostrado para esta instancia en la lista de instancias públicas en cryptpad.org", + "footer_source": "Código fuente", + "info_termsFlavour": "Terminos de servicio para esta instancia", + "info_sourceFlavour": "Código fuente para CryptPad", + "support_warning_account": "Por favor, ten en cuenta que los administradores no pueden restablecer contraseñas. Si has perdido las credenciales de tu cuenta pero aún estás conectado, puedes migrar tus datos a una nueva cuenta", + "support_warning_document": "Por favor especifica qué tipo de documento está causando el problema y proporciona un identificador de documento o un enlace", + "support_warning_other": "¿Cuál es la naturaleza de tu pregunta? Por favor, proporciona tanta información relevante como sea posible para que podamos atender tu problema rápidamente", + "support_cat_drives": "Unidad o equipo", + "support_cat_document": "Documento", + "support_cat_abuse": "Reportar abuso", + "ui_openDirectly": "Esta funcionalidad no está disponible cuando CryptPad está incorporado en otro sitio. ¿Deseas abrir este documento en una nueva pestaña?", + "support_cat_debugging": "datos de depuración", + "support_debuggingDataTitle": "Información de depuración de la cuenta", + "support_debuggingDataHint": "La siguiente información se incluye en los tickets de soporte que envías. Ninguna de ella permite a los administradores acceder o descifrar tus documentos. Esta información está encriptada de manera que solo los administradores pueden leerla.", + "fivehundred_internalServerError": "Error Interno del Servidor", + "admin_cacheEvictionRequired": "El servidor ha sido actualizado con la nueva configuración. Por favor, utiliza la Borrar caché botón para asegurarte de que este cambio sea visible para todos los usuarios.", + "admin_reviewCheckupNotice": "Se recomienda revisar el chequeo página para confirmar que esta instancia esté configurada correctamente.", + "admin_infoNotice2": "Consulta la pestaña 'Red' para más detalles.", + "admin_enableDiskMeasurementsTitle": "Medir el rendimiento del disco", + "form_template_poll": "Encuesta Rápida de Programación", + "form_preview_button": "Avance", + "form_anonAnswer": "Las respuestas a este formulario son anónimas", + "form_changeTypeConfirm": "Selecciona el nuevo tipo de pregunta.", + "form_corruptAnswers": "Este formulario ya tiene respuestas. Cambiar este tipo de pregunta puede invalidar los datos de respuestas anteriores.", + "form_conditional_addAnd": "Agregar condición AND", + "form_conditional_hint": "Para hacer esta sección condicional, por favor agregue una pregunta de opción o casilla de verificación por encima de ella", + "premiumOnly": "La creación de nuevos documentos en esta aplicación está actualmente limitada a los suscriptores en {0}. Esta es una aplicación experimental de acceso anticipado para fines de prueba. Pronto estará disponible para todos en {0}.", + "form_answerChoice": "Por favor, elige cómo te gustaría responder a este formulario:", + "bounce_confirm": "Estás a punto de salir: {0}\n\nEstás seguro de que quieres visitar? \"{1}\"?", + "admin_nameHint": "El nombre mostrado para esta instancia en la lista de instancias públicas en cryptpad.org", + "admin_jurisdictionTitle": "Ubicación de alojamiento", + "admin_jurisdictionHint": "El país donde se alojan los datos cifrados de esta instancia", + "support_warning_prompt": "Por favor, elige la categoría más relevante para tu problema. Esto ayuda a los administradores a clasificar y proporciona más sugerencias sobre qué información proporcionar", + "support_warning_drives": "Ten en cuenta que los administradores no pueden identificar carpetas y documentos por su nombre. Para las carpetas compartidas, por favor proporciona unidentificador de documento", + "support_warning_bug": "Por favor, especifica en qué navegador ocurre el problema y si hay alguna extensión instalada. Proporciona la mayor cantidad de detalles posible sobre el problema y los pasos necesarios para reproducirlo", + "support_warning_abuse": "Por favor, reporta el contenido que viola los Terminos de Servicios. Por favor, proporciona enlaces a los documentos ofensivos o perfiles de usuario y describe cómo están violando los términos. Cualquier información adicional sobre el contexto en el que descubriste el contenido o comportamiento puede ayudar a los administradores a prevenir futuras violaciones", + "admin_infoNotice1": "Utiliza los siguientes campos para describir tu instancia. Esta información se utiliza en la página principal de la instancia. También se envía como parte de la telemetría del servidor si optas por incluirte en la lista de instancias públicas de CryptPad.", + "admin_enableDiskMeasurementsHint": "Si está habilitado, se expondrá un punto final de API JSON debajo de/api/profiling. Esto mantiene una medición continua de la entrada/salida de disco dentro del intervalo de tiempo establecido a continuación. Esta configuración puede afectar el rendimiento del servidor y puede revelar datos sensibles. Se recomienda que dejes esta configuración desactivada a menos que sepas lo que estás haciendo." +} From 5383f9ef1c681e1874aeeaac602019d93b2d302c Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 4 Jul 2024 11:33:43 +0200 Subject: [PATCH 006/188] Fix potential memory leak --- lib/api.js | 3 +++ lib/hk-util.js | 1 + lib/storage/file.js | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/lib/api.js b/lib/api.js index c0e570095..bccf917f8 100644 --- a/lib/api.js +++ b/lib/api.js @@ -190,6 +190,9 @@ nThen(function (w) { removed++; } }); + if (Env.store) { + Env.store.closeInactiveChannels(active); + } if (removed) { Env.Log.info("CLEANED_ACTIVE_CHANNELS_MAP", {removed}); } diff --git a/lib/hk-util.js b/lib/hk-util.js index 7080d3d4a..1bc7f2022 100644 --- a/lib/hk-util.js +++ b/lib/hk-util.js @@ -146,6 +146,7 @@ const dropChannel = HK.dropChannel = function (Env, chanName) { expireChannel(Env, chanName); }, TEMPORARY_CHANNEL_LIFETIME); } + store.closeChannel(chanName, function () {}); }; /* checkExpired diff --git a/lib/storage/file.js b/lib/storage/file.js index 2c2888f7a..98cbfd7db 100644 --- a/lib/storage/file.js +++ b/lib/storage/file.js @@ -286,6 +286,16 @@ var closeChannel = function (env, channelName, cb) { } }; +var closeInactiveChannels = function (env, schedule, active) { + Object.keys(env.channels).forEach(channelName => { + if (!active.includes(channelName)) { + schedule.ordered(channelName, function (next) { + closeChannel(env, channelName, next); + }); + } + }); +}; + var clearOffset = function (env, channelId, cb) { var path = mkOffsetPath(env, channelId); // we should always be able to recover from invalid offsets, so failure to delete them @@ -1445,6 +1455,9 @@ module.exports.create = function (conf, _cb) { closeChannel(env, channelName, Util.both(cb, next)); }); }, + closeInactiveChannels: function (active) { + closeInactiveChannels(env, schedule, active); + }, // write to a log file log: function (channelName, content, cb) { // you probably want the events in your log to be in the correct order. From a7e622dddcf945f3bbcaf11ee1baac982d108846 Mon Sep 17 00:00:00 2001 From: Corentin ARNOULD Date: Sat, 6 Jul 2024 10:23:49 +0200 Subject: [PATCH 007/188] Fix bash indentation and trailing whitespaces Some shell scripts had tabs indentation. Made it all four spaces. Hope it's ok with spaces. Some files had a trailing space in it. It was not useful and takes few bytes for nothing. I didn't delete everything. You can find all tab indented lines with: grep -rP '^\t' 2>/dev/null And more trailing space with: grep -rP ' $' 2>/dev/null --- CHANGELOG.md | 4 ++-- Dockerfile | 2 +- LICENSES/BSD-3-Clause.txt | 2 +- LICENSES/MPL-2.0.txt | 2 +- docker-entrypoint.sh | 6 +++--- readme.md | 2 +- scripts/convert-favicons-to-ico.sh | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be2161b23..5b4da42a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ This release introduces a new onboarding flow to guide administrators through th - Onboarding screens & app configuration [#1513](https://github.com/cryptpad/cryptpad/pull/1513) - Bahasa Indonesia is a new available language [fe78b6a](https://github.com/cryptpad/cryptpad/commit/fe78b6ab1dc76ce9eb8d5361c309db8e92117fa8) - - Thanks to our [Weblate](https://weblate.cryptpad.org) contributors who made that happen! + - Thanks to our [Weblate](https://weblate.cryptpad.org) contributors who made that happen! ## Improvements @@ -46,7 +46,7 @@ This release introduces a new onboarding flow to guide administrators through th - Switch to new `http2` Nginx option [#1516](https://github.com/cryptpad/cryptpad/pull/1516) - Server fixes and aggregated stats [#1509](https://github.com/cryptpad/cryptpad/pull/1509) - Create the block folder at boot [#911](https://github.com/cryptpad/cryptpad/pull/911) - - Remove obsolete `version` from `docker-compose.yml` [2e716eb](https://github.com/cryptpad/cryptpad/commit/2e716eb4e39fb835f95a1fa1a340e01142d11b1c) + - Remove obsolete `version` from `docker-compose.yml` [2e716eb](https://github.com/cryptpad/cryptpad/commit/2e716eb4e39fb835f95a1fa1a340e01142d11b1c) - Other - Unsharp the corners when hovering the dismiss button on notification drop-down menu [#1466](https://github.com/cryptpad/cryptpad/pull/1466) - Fix contextual menu `Open` on anonymous drive [#1464](https://github.com/cryptpad/cryptpad/pull/1464) diff --git a/Dockerfile b/Dockerfile index e2be11805..c6d343942 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ COPY . /cryptpad RUN sed -i "s@//httpAddress: 'localhost'@httpAddress: '0.0.0.0'@" /cryptpad/config/config.example.js RUN sed -i "s@installMethod: 'unspecified'@installMethod: 'docker'@" /cryptpad/config/config.example.js - + # Install dependencies RUN npm install --production \ && npm run install:components diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt index ea890afbc..086d3992c 100644 --- a/LICENSES/BSD-3-Clause.txt +++ b/LICENSES/BSD-3-Clause.txt @@ -1,4 +1,4 @@ -Copyright (c) . +Copyright (c) . Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/LICENSES/MPL-2.0.txt b/LICENSES/MPL-2.0.txt index ee6256cdb..d0a1fa148 100644 --- a/LICENSES/MPL-2.0.txt +++ b/LICENSES/MPL-2.0.txt @@ -35,7 +35,7 @@ Mozilla Public License Version 2.0 means any form of the work other than Source Code Form. 1.7. "Larger Work" - means a work that combines Covered Software with other material, in + means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 3429b90f6..59972bac6 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -22,16 +22,16 @@ if [ ! -f "$CPAD_CONF" ]; then eg: docker run -v /path/to/config.js:/cryptpad/config/config.js \n\ #################################################################### \n" - cp "$CPAD_HOME"/config/config.example.js "$CPAD_CONF" + cp "$CPAD_HOME"/config/config.example.js "$CPAD_CONF" - sed -i -e "s@\(httpUnsafeOrigin:\).*[^,]@\1 '$CPAD_MAIN_DOMAIN'@" \ + sed -i -e "s@\(httpUnsafeOrigin:\).*[^,]@\1 '$CPAD_MAIN_DOMAIN'@" \ -e "s@\(^ *\).*\(httpSafeOrigin:\).*[^,]@\1\2 '$CPAD_SANDBOX_DOMAIN'@" "$CPAD_CONF" fi cd $CPAD_HOME if [ "$CPAD_INSTALL_ONLYOFFICE" == "yes" ]; then - ./install-onlyoffice.sh --accept-license + ./install-onlyoffice.sh --accept-license fi npm run build diff --git a/readme.md b/readme.md index d5766eed6..f24355c3d 100644 --- a/readme.md +++ b/readme.md @@ -28,7 +28,7 @@ The most recent version and all past release notes can be found on the [releases ## Setup using Docker -You can find `Dockerfile`, `docker-compose.yml` and `docker-entrypoint.sh` files at the root of this repository. We also publish every release on [Docker Hub](https://hub.docker.com/r/cryptpad/cryptpad) as AMD64 & ARM64 official images. +You can find `Dockerfile`, `docker-compose.yml` and `docker-entrypoint.sh` files at the root of this repository. We also publish every release on [Docker Hub](https://hub.docker.com/r/cryptpad/cryptpad) as AMD64 & ARM64 official images. Previously, Docker images were community maintained, had their own repository and weren't official supported. We changed that with v5.4.0 during July 2023. Thanks to @promasu for all the work on the community images. diff --git a/scripts/convert-favicons-to-ico.sh b/scripts/convert-favicons-to-ico.sh index 6f6980876..972b93df7 100755 --- a/scripts/convert-favicons-to-ico.sh +++ b/scripts/convert-favicons-to-ico.sh @@ -5,6 +5,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later for f in ../customize.dist/favicon/*.png; do - base="$(basename $f ".png")" - magick convert $f -define icon:auto-resize=16,24,32,48,64,72,96,128,256 "$base.ico" + base="$(basename $f ".png")" + magick convert $f -define icon:auto-resize=16,24,32,48,64,72,96,128,256 "$base.ico" done From 3863888fd3b6aae8f670fc987cc95745a806f363 Mon Sep 17 00:00:00 2001 From: mathilde-cryptpad <156299270+mathilde-cryptpad@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:50:41 +0200 Subject: [PATCH 008/188] add a forgotten entry in the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be2161b23..dbfe2d540 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ This release introduces a new onboarding flow to guide administrators through th - Remove x2t from the CryptPad repo [#1454](https://github.com/cryptpad/cryptpad/issues/1454) - Other OnlyOffice users are shown as "Guest" [#1446](https://github.com/cryptpad/cryptpad/issues/1446) - Document PDF exports are empty when remote embedding is disabled [#1472](https://github.com/cryptpad/cryptpad/issues/1472) + - Sometimes images of a presentation are not exported to PDF [#1500](https://github.com/cryptpad/cryptpad/issues/1500) - Automatic upgrade of an OnlyOffice document fails sometimes [#1534](https://github.com/cryptpad/cryptpad/issues/1534) - Import/Export is broken [#1532](https://github.com/cryptpad/cryptpad/issues/1532) - Print is broken [#1533](https://github.com/cryptpad/cryptpad/issues/1533) From 8d0c411a38ca1a13784fee32683fda6e9a7458dd Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Mon, 8 Jul 2024 11:51:43 +0200 Subject: [PATCH 009/188] Do not send OO changes when in read only mode https://github.com/cryptpad/cryptpad/issues/1364 --- www/common/onlyoffice/inner.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 4facd8156..3994f269e 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -1478,6 +1478,10 @@ define([ send({ type: "message" }); break; case "saveChanges": + if (readOnly) { + return; + } + // If we have unsaved data before reloading for a checkpoint... if (APP.onStrictSaveChanges) { delete APP.unsavedLocks; From 6638c4cc499d75b9db9a741e3b44e2b3eb578f36 Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Mon, 8 Jul 2024 14:49:43 +0200 Subject: [PATCH 010/188] Handle ids of OO read only users correctly --- www/common/onlyoffice/inner.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 3994f269e..12d95112a 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -919,7 +919,10 @@ define([ }; const getMyOOIndex = function() { - return findUserByOOId(myOOId).index; + const user = findUserByOOId(myOOId); + return user + ? user.index + : content.ids.length; // Assign an unused id to read-only users }; var getParticipants = function () { From 9c032931d6560239e4c389712830e2ee201c05e9 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:26:26 +0300 Subject: [PATCH 011/188] Add confirmation modal + logic --- www/admin/inner.js | 80 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 13 deletions(-) diff --git a/www/admin/inner.js b/www/admin/inner.js index d513ab0b1..5ae30471a 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -578,23 +578,77 @@ define([ return APP.instanceStatus.enforceMFA; }, query: function (val, setState) { - sFrameChan.query('Q_ADMIN_RPC', { - cmd: 'ADMIN_DECREE', - data: ['ENFORCE_MFA', [val]] - }, function (e, response) { - if (e || response.error) { - UI.warn(Messages.error); - console.error(e, response); + var isChecked = APP.instanceStatus.enforceMFA; + var confirmationContent = isChecked + ? 'Are you sure you want to disable enforced MFA? This action would lessen the security of your account.' + : 'Are you sure you want to enforce MFA? This action would require to set up an authenticator app.'; + + function showConfirmationModal(callback) { + var modal = UI.dialog.customModal(confirmationContent, { + buttons: [{ + className: 'cancel', + name: Messages.cancel, + onClick: function () { + if (!isChecked) { + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['ENFORCE_MFA', [false]] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + } else { + APP.updateStatus(function () { + setState(false); + flushCache(); + }); + } + }); + } + //check the checkbox again + else { + APP.updateStatus(function () { + setState(APP.instanceStatus.enforceMFA); + flushCache(); + }); + } + }, + keys: [27] // Esc key to close modal + }, { + className: 'primary', + name: Messages.settings_save, + onClick: function () { + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['ENFORCE_MFA', [val]] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + } else { + APP.updateStatus(function () { + setState(APP.instanceStatus.enforceMFA); + flushCache(); + }); + } + }); + }, + keys: [13] // Enter key to confirm + }] + }); + var $modal = $(modal); + UI.openCustomModal(modal); + $modal.closest('.alertify').on('mousedown', function (e) { + e.stopPropagation(); + }); } - APP.updateStatus(function () { - setState(APP.instanceStatus.enforceMFA); - flushCache(); - }); - }); - }, + + showConfirmationModal(); + } }); + var getInstanceString = function (attr) { var val = APP.instanceStatus[attr]; var type = typeof(val); From e43b16a6ee5089457dec806a14e7b867d3a7ca7c Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:24:17 +0300 Subject: [PATCH 012/188] Add responsive styling to performance table --- .../src/less2/include/sidebar-layout.less | 22 +++++++++++++++++++ www/admin/inner.js | 2 ++ 2 files changed, 24 insertions(+) diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index 5b616e0e8..eeb5da80a 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -194,6 +194,28 @@ background-color: @cp_sidebar-left-item-bg; } } + + } + .cp-sidebar-table#performance-profiling-table { + @media (max-width: 900px) { + width: 100%; + + tr { + display: flex; + flex-wrap: wrap; + align-items: center; + } + + th, td { + border: none; + flex: 1 1 auto; + width: 5rem; + margin-right: 0; + font-size: 13px; + word-wrap: break-word; + white-space: normal; + } + } } .cp-sidebar-input-block { display: inline-flex; diff --git a/www/admin/inner.js b/www/admin/inner.js index d513ab0b1..7cb627abf 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -3596,6 +3596,8 @@ define([ var table = blocks.table(header, []); + table.id = 'performance-profiling-table'; + const onRefresh = function () { sFrameChan.query('Q_ADMIN_RPC', { cmd: 'GET_WORKER_PROFILES', From 072dba254e3c2be32cd6b261d84510909deb713f Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 10 Jul 2024 14:51:55 +0200 Subject: [PATCH 013/188] Fix calendar refresh issue #1551 --- www/common/outer/calendar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/outer/calendar.js b/www/common/outer/calendar.js index 1b3f02231..21bff21ff 100644 --- a/www/common/outer/calendar.js +++ b/www/common/outer/calendar.js @@ -1055,7 +1055,7 @@ define([ var removeClient = function (ctx, cId) { var idx = ctx.clients.indexOf(cId); - ctx.clients.splice(idx, 1); + if (idx !== -1) { ctx.clients.splice(idx, 1); } Object.keys(ctx.calendars).forEach(function (id) { var cal = ctx.calendars[id]; From 7c57db6420b40b9daa27ed3b45cdd5a9df262f4f Mon Sep 17 00:00:00 2001 From: daria Date: Wed, 10 Jul 2024 16:27:41 +0300 Subject: [PATCH 014/188] change focus style for inputs on calendar modals #1506 --- customize.dist/src/less2/include/forms.less | 3 + www/calendar/app-calendar.less | 740 -------------------- 2 files changed, 3 insertions(+), 740 deletions(-) delete mode 100644 www/calendar/app-calendar.less diff --git a/customize.dist/src/less2/include/forms.less b/customize.dist/src/less2/include/forms.less index 065b9db1d..5d8b242f1 100644 --- a/customize.dist/src/less2/include/forms.less +++ b/customize.dist/src/less2/include/forms.less @@ -28,6 +28,9 @@ } &.tui-full-calendar-content { font-size: @colortheme_app-font-size; + &:focus { + outline: @cryptpad_color_brand solid 2px; + } } &[readonly] { //margin-top:1rem; diff --git a/www/calendar/app-calendar.less b/www/calendar/app-calendar.less deleted file mode 100644 index bdf59fb6d..000000000 --- a/www/calendar/app-calendar.less +++ /dev/null @@ -1,740 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -@import (reference) '../../customize/src/less2/include/framework.less'; -@import (reference) '../../customize/src/less2/include/sidebar-layout.less'; -@import (reference) '../../customize/src/less2/include/tools.less'; -@import (reference) '../../customize/src/less2/include/avatar.less'; -@import (reference) '../../customize/src/less2/include/variables.less'; - -&.cp-app-calendar { - - .framework_min_main(); - .sidebar-layout_main(); - - display: flex; - flex-flow: column; - - .cp-toolbar-bottom-mid > div { - color: @cryptpad_text_col; - .cp-small { display: none; } - } - - .flatpickr-calendar { - z-index: 100001 !important; // Alertify is 100000 - } - #cp-sidebarlayout-container #cp-sidebarlayout-rightside { - padding: 0; - & > div { - margin: 0; - } - - .cp-forcehide { - display: none !important; - } - - - .tui-full-calendar-confirm { - span, i { - padding: 0.5rem; - } - span { - padding-left: 0; - } - width: unset; - } - - .tui-full-calendar-layout { - background-color: @cp_sidebar-right-bg !important; - color: @cryptpad_text_col; - display: flex; - flex-flow: column; - .tui-full-calendar-week-container { - min-height: 0; - display: flex; - flex-flow: column; - .tui-full-calendar-vlayout-area { - display: flex; - flex-flow: column; - flex: 1; - min-height: 0; - & > div:last-child { - flex: 1; - min-height: 0; - } - } - } - .tui-full-calendar-weekday-filled { - background-color: @cp_dropdown-bg-hover !important; - } - - .tui-full-calendar-timegrid-hourmarker-time { - color: @cp_calendar-now !important; - } - .tui-full-calendar-timegrid-hourmarker-line-left, .tui-full-calendar-timegrid-hourmarker-line-today { - border-color: @cp_calendar-now !important; - } - .tui-full-calendar-timegrid-todaymarker { - background-color: @cp_calendar-now !important; - } - - .tui-full-calendar-month { - display: flex; - flex-flow: column; - & > div:last-child { - display: flex; - flex-flow: column; - flex: 1; - min-height: 0; - overflow: hidden; - } - .tui-full-calendar-today .tui-full-calendar-weekday-grid-date-decorator { - background-color: @cp_calendar-now !important; - color: @cp_calendar-now-fg !important; - } - .tui-full-calendar-weekday-schedule-time .tui-full-calendar-weekday-schedule-title { - color: @cryptpad_text_col !important; - } - .tui-full-calendar-extra-date { - .tui-full-calendar-weekday-grid-date { - color: @cp_sidebar-hint !important; - opacity: 0.5; - } - } - .tui-full-calendar-weekday-grid-date { - color: @cryptpad_text_col !important; - } - .tui-full-calendar-month-dayname-item span { - color: @cryptpad_text_col !important; - } - } - .tui-full-calendar-dayname * { - color: @cryptpad_text_col !important; - } - .tui-full-calendar-month-more { - background-color: @cp_sidebar-right-bg !important; - color: @cryptpad_text_col; - span { - color: @cryptpad_text_col !important; - } - } - - .tui-full-calendar-floating-layer.cp-calendar-popup-flex { - top: 0 !important; - left: 0 !important; - right: 0 !important; - bottom: 0 !important; - justify-content: center !important; - align-items: center !important; - .tui-full-calendar-popup { - width: 540px; - max-width: 100%; - max-height: 100%; - } - } - #tui-full-calendar-popup-arrow { - display: none !important; - } - } - .tui-full-calendar-timegrid-timezone { - background-color: @cp_sidebar-right-bg !important; - .tui-full-calendar-timegrid-hour { - color: @cryptpad_text_col !important; - } - color: @cryptpad_text_col; - } - .tui-full-calendar-timegrid-gridline, .tui-full-calendar-time-date { - border-color: @cp_calendar-border !important; - } - .tui-full-calendar-splitter, .tui-full-calendar-left, .tui-full-calendar-dayname-container, .tui-full-calendar-weekday-grid-line { - border-color: @cp_calendar-border !important; - - } - .tui-full-calendar-popup { - border-radius: @variables_radius_L; - } - .tui-full-calendar-popup-container { - min-width: 100%; - background: @cp_flatpickr-bg; - color: @cryptpad_text_col; - border-radius: @variables_radius_L; - font-weight: normal; - .tui-full-calendar-icon:not(.tui-full-calendar-calendar-dot):not(.tui-full-calendar-dropdown-arrow):not(.tui-full-calendar-ic-checkbox):not(.fa-map-marker) { - display: none; - } - .tui-full-calendar-icon { - text-align:center; - } - .tui-full-calendar-popup-detail-item { - a { - color: @cryptpad_color_link; - text-decoration: underline; - } - } - .tui-full-calendar-section-button-save { - height: 40px; - .btn-primary { // Update button - margin-right: 0px; - } - } - - } - li.tui-full-calendar-popup-section-item { - padding: 0 6px; - height: 32px; - } - .tui-full-calendar-popup-section-item { - height: auto; - margin: 0; - &:not(li):not(button) { - padding: 0; - margin-top: 5px; - } - #tui-full-calendar-schedule-calendar { - width: 179px; - top: 0; - } - &:not(button) { - border: none; - display: inline-flex; - align-items: center; - &:hover { - background-color: @cp_dropdown-bg-hover; - } - .tui-full-calendar-content { - text-overflow: ellipsis; - font: @colortheme_app-font; - padding: 0 10px; - } - input { flex: 1; } - } - } - .tui-full-calendar-section-date-dash { - height: auto; - } - .tui-full-calendar-section-title, .tui-full-calendar-section-location, .tui-full-calendar-section-body { - width: 100%; - } - .tui-full-calendar-dropdown-menu { - top: 38px; - width: 221px; // same as button - background-color: @cp_dropdown-bg; - color: @cp_dropdown-fg; - } - .tui-full-calendar-section-state, #tui-full-calendar-schedule-private { - display: none !important; - } - - .tui-full-calendar-popup:not(.tui-full-calendar-popup-detail) { - .tui-full-calendar-section-calendar { - width: 221px; // 50% - } - .tui-full-calendar-popup-section { - display: flex; - align-items: center; - flex-wrap: wrap; - .tui-full-calendar-section-start-date, .tui-full-calendar-section-end-date { - flex: 1; - } - .tui-full-calendar-section-allday { - width: 100%; - height: 32px; - border-radius: @variables_radius; - input[type="checkbox"].tui-full-calendar-checkbox-square:checked + span { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABbmlDQ1BpY2MAACiRdZHNK0RRGMZ/Zoh8NIqFNItZDFmMEiVLxsJmkgZlsLn3zpe6c93uvZNkq2wspizExtfCf8BW2VJKkZKs/AG+Npqu97hqJM7t3PfXc87zds5zIJQyjZJbPwAly3PSE8nYXGY+1vhEMy20EyaqGa49NjWV4t/xfkOdqtf9qtf/+/4cLdmca0Bdk/CwYTue8KhwasWzFW8KdxpFLSu8L5xw5IDCF0rXA35UXAj4VbEzkx6HkOoZK/xg/QcbRack3CccL5ll4/s86iatOWt2Wmq3zCguaSZIEkOnzBImHv1SLcnsb9/Al2+SZfEY8rdZxRFHgaJ4E6KWpWtOal70nHwmqyr333m6+aHBoHtrEhoefP+lBxq3oFrx/Y8D368eQvgezqyaf1lyGnkTvVLT4nsQWYeT85qmb8PpBnTd2ZqjfUlhmaF8Hp6PoS0DHVfQvBBk9b3O0S3MrMkTXcLOLvTK/sjiJ6CLZ94KREMsAAAACXBIWXMAAAsSAAALEgHS3X78AAABHUlEQVQoFWNkaP//n4EMwESGHrAW6mtkZvz3G2g03BsBagz/nRUQ7sNp49//TJ+Byv6BlMbrMjCsC2Jg3BbKwOAgB9GMolGAg4GBESIOIrmA+A9I03xvFHGwCrhGkDOe5TAw9LvAFbEn6jEwwTT9BtodvJ7h/4FHYH0MLBCKgaHTgYGBE8jLN2FgYAJae+4FA8NcLwZWkAtAmoLWMTBsuYNwECMsHrVEGBj2RzEwiIEciATANgE1bb6DJAgMNLhTr71hYHBcxsDw+htCAQ5NIAU/4RpBPKjmf2++MfwHaQpZD7cJyEMB3+BORRL+rybE8FOEk4Hj2FO4KMgdrFAMitun2DTCVSMxYAkBFFYg9j94qCIpwsZEil5wyDIDAAXIUsnSKmq7AAAAAElFTkSuQmCC); - } - .tui-full-calendar-ic-checkbox { - margin-left: 5px; - border-radius: 2px; - } - } - .CodeMirror { - margin-top: 5px; - background: @cp_forms-bg !important; - color: @cryptpad_text_col; - border: 1px solid @cp_forms-border; - border-radius: @variables_radius; - width: 100%; - height: 80px; - font: @colortheme_app-font; - font-size: 16px; - line-height: initial; - padding-left: 0.3rem; - pre { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; - } - } - .CodeMirror-placeholder { - color: @cp_forms-placeholder; - } - } - } - .tui-full-calendar-popup-detail { - font: @colortheme_app-font; - color: @cryptpad_text_col; - box-shadow: @cryptpad_ui_shadow; - .tui-full-calendar-popup-container { - padding-bottom: 17px; - } - .tui-full-calendar-popup-detail-date { - font-size: 14px; - } - .tui-full-calendar-section-button { - margin-top: 10px; - border: 0; - display: flex; - align-items: start; - button { - flex: 1; - margin: 0; - } - } - .tui-full-calendar-popup-top-line { - border-radius: 10px 10px 0px 0px; - height: 10px; - } - .tui-full-calendar-popup-vertical-line { - visibility: hidden; - width: 10px; - } - } - - .cp-recurrence-label, .cp-notif-label { - color: @cryptpad_text_col; - margin-right: 1rem; - i { - margin-right: 0.5rem; - } - } - - .cp-calendar-recurrence-container { - margin-top: 1rem; - .cp-calendar-rec-translated-str { - margin-top: 0.5rem; - } - } - - .cp-calendar-add-notif { - flex-flow: column; - align-items: baseline !important; - margin: 1rem 0; - * { - font-size: @colortheme_app-font-size; - font-weight: normal; - } - & > div { - display: flex; - } - .cp-calendar-notif-list-container { - width: 100%; - margin-bottom: 10px; - .cp-notif-label { - margin-top: 0.5em; - } - } - .cp-calendar-notif-list { - display: flex; - flex-flow: column; - flex: 1; - min-width: 150px; - &:empty { - display: none; - } - .cp-notif-entry { - display: flex; - margin-bottom: 2px; - border-radius: @variables_radius; - background-color: fade(@cryptpad_text_col, 10%); - padding: 0.25rem; - .cp-notif-value { - width: 75%; - display: inline-flex; - line-height: 30px; - vertical-align: middle; - flex-grow: 1; - .cp-before { - flex: 1; - min-width: 0; - } - } - span:not(:last-child) { - margin: 0; - margin-right: 0.3rem; - } - span:first-child { - margin-left: 0.3rem; - } - .btn-danger-outline { - display: block; - margin-right: 0px !important; - background-color: transparent; - color: @cryptpad_text_col; - border-color: @cryptpad_text_col; - &:hover { - color: @cp_buttons-red-color; - background-color: @cp_buttons-red; - border-color: @cp_buttons-red; - } - } - } - } - .cp-notif-empty { - display: none; - margin-bottom: 2px; - border-radius: @variables_radius; - background-color: fade(@cryptpad_text_col, 10%); - padding: 0.25rem 0.5rem; - line-height: 30px; - } - .cp-calendar-notif-list:empty ~ .cp-notif-empty { - display: block; - } - .cp-calendar-notif-form { - align-items: center; - .cp-calendar-notif-form-buttons { - display: inline-flex; - align-items: center; - & > input { - height: 40px; - } - } - // margin-bottom: 20px; - input { - width: 80px; - margin-right: 0.3rem; - } - .fa-plus{ - margin-left:0.3rem; - } - } - } - - .cp-calendar-close { - top: 17px; - right: 17px; - height: auto; - margin-right: 0px; - line-height: initial; - border: 1px solid; - &:not(:hover) { - background: transparent; - } - } - - } - - .cp-calendar-rec-inline, .cp-calendar-rec-block { - &:not(:last-child) { - margin-bottom: 10px; - } - } - .cp-calendar-rec-inline { - display: flex; - flex-flow: row; - align-items: center; - & > *:not(:first-child) { margin-left: 5px; } - .cp-dropdown-container { - position: unset; - } - input[type="number"] { - width: 80px !important; - margin-bottom: 0 !important; - } - .cp-checkmark { - margin-right: 0.5rem; - } - } - .cp-calendar-rec-block { - .cp-calendar-rec-block-title { - margin-bottom: 0.5rem !important; - } - .cp-radio { - margin-bottom: 0.5rem; - } - input[type="radio"]:not(:checked) ~ .cp-checkmark-label { - input { - filter: grayscale(1); - } - } - .cp-checkmark-label { - & > *:not(:first-child) { margin-left: 5px; } - width: 100%; - //height: 26px; - display: flex; - align-items: center; - & > input { - margin-bottom: 0 !important; - } - input { - display: inline; - height: 24px !important; - padding: 0 5px !important; - } - input[type="text"] { - width: 200px !important; - } - input[type="number"] { - width: 80px !important; - margin-bottom: 0 !important; - } - } - } - #cp-calendar-rec-monthly-pick ~ .cp-checkmark-label { - display: flex; - align-items: center; - & > span { - margin-right: 20px; - } - } - button.cp-calendar-pick-el { - display: flex; - align-items: center; - justify-content: center; - &:not(:last-child) { - margin-right: 5px; - } - } - div.cp-calendar-weekly-pick { - button { - width: 50px; - } - } - div.cp-calendar-monthly-pick { - display: flex; - flex-flow: column; - & > div { - display: flex; - &:not(:last-child) { - margin-bottom: 5px; - } - button { - height: 25px; - width: 25px; - &.lastday { - width: 115px; - } - } - } - } - - .tui-full-calendar-ic-repeat-b { - display: none; - & ~ * { - display: none; - } - } - - #cp-toolbar .cp-calendar-browse { - display: flex; - align-items: center; - button { - color: @cp_toolbar-fg; - border-color: @cp_toolbar-fg; - &:hover { - background-color: fade(@cp_toolbar-fg, 50%); - cursor: pointer; - } - } - } - - .cp-calendar-newevent { - &:hover { - cursor: pointer; - } - } - - .cp-toolbar-bottom-right button, .cp-toolbar-user button { - &:hover { - cursor: pointer; - } - } - - #cp-sidebarlayout-leftside { - & > div { - padding: 10px - } - .cp-calendar-new { - display: flex; - align-items: center; - justify-content: space-between; - } - .cp-calendar-list { - overflow-y: auto; - .cp-calendar-team { - height: 30px; - .avatar_main(30px); - .cp-avatar { - margin-right: 10px; - } - .cp-name { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - display: flex; - align-items: center; - justify-content: center; - margin: 5px 0 10px 0; - &:not(:first-child) { - margin-top: 30px; - } - } - .cp-calendar-entry { - display: flex; - align-items: center; - justify-content: space-between; - padding: 5px; - border-radius: @variables_radius; - background-color: @cp_sidebar-left-bg; - &:not(.cp-unclickable) { - cursor: pointer; - } - .cp-dropdown-container { - position: initial; - - .cp-dropdown-content{ - @media screen and (max-width: 600px) - { - left: 50%; - min-width: 45%; - } - } - } - button.cp-calendar-actions { - background-color: transparent; - &:hover { - background-color: @cp_sidebar-left-bg; - } - } - &.cp-ghost { - padding: 0; - button { - .tools_unselectable(); - cursor: pointer; - width: 100%; - display: flex; - justify-content: space-between; - background: transparent; - border: 1px solid @cryptpad_text_col; - border-radius: @variables_radius; - padding: 5px; - height: 36px; - font: @colortheme_app-font; - align-items: center; - color: @cryptpad_text_col; - &:hover { - background-color: @cp_sidebar-left-active; - color: @cp_sidebar-left-active-fg; - border: 0px; - } - i { - margin-left: 5px; - } - } - } - &:not(:last-child) { - margin-bottom: 10px; - } - &:hover { - background: @cp_sidebar-left-item-bg; - } - &.cp-restricted { - color: @cp_drive-header-fg; - } - .cp-calendar-icon { - width: 30px; - display: inline-flex; - height: 30px; - align-items: center; - justify-content: center; - border-radius: @variables_radius; - flex-shrink: 0; - } - &.cp-active { - background-color: @cp_sidebar-left-item-bg; - .cp-calendar-inactive { - display: none; - } - } - &:not(.cp-active) { - .cp-calendar-icon { - background: transparent !important; - } - .cp-calendar-active { - display: none; - } - } - .tools_unselectable(); - .cp-calendar-color { - display: inline-block; - border-radius: 50%; - width: 15px; - height: 15px; - flex-shrink: 0; - } - .cp-calendar-title { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding: 0 5px; - } - } - } - } - .cp-calendar-colorpicker { - width: 100px; - height: 25px; - cursor: pointer; - border: 1px solid @cp_forms-border; - } - - @media (max-width: @browser_media-medium-screen) { - .cp-calendar-notif-list-container, .cp-calendar-notif-form { - flex-direction: column; - align-items: unset !important; - } - .cp-calendar-newevent { - i { - margin: 0 !important; - } - span { - display: none; - } - } - .tui-full-calendar-dayname-leftmargin, .tui-full-calendar-timegrid-right { - margin-left: 40px !important; - } - .tui-full-calendar-allday-left, .tui-full-calendar-timegrid-left { - width: 40px !important; - } - .tui-full-calendar-dayname > span { - display: flex; - flex-flow: column; - line-height: 0; - justify-content: center; - align-items: center; - height: 100%; - } - .tui-full-calendar-dayname * { - font-size: 11px; - line-height: initial; - height: auto; - } - .cp-toolbar-bottom-mid > div { - :not(:first-child) { - display: none; - } - :first-child { - display: inline-block; - } - } - } - -} - From 546ccd63f7eaf5f16c974868bb25aa076088a602 Mon Sep 17 00:00:00 2001 From: daria Date: Wed, 10 Jul 2024 16:58:27 +0300 Subject: [PATCH 015/188] Revert "change focus style for inputs on calendar modals #1506" This reverts commit 7c57db6420b40b9daa27ed3b45cdd5a9df262f4f. --- customize.dist/src/less2/include/forms.less | 3 - www/calendar/app-calendar.less | 740 ++++++++++++++++++++ 2 files changed, 740 insertions(+), 3 deletions(-) create mode 100644 www/calendar/app-calendar.less diff --git a/customize.dist/src/less2/include/forms.less b/customize.dist/src/less2/include/forms.less index 5d8b242f1..065b9db1d 100644 --- a/customize.dist/src/less2/include/forms.less +++ b/customize.dist/src/less2/include/forms.less @@ -28,9 +28,6 @@ } &.tui-full-calendar-content { font-size: @colortheme_app-font-size; - &:focus { - outline: @cryptpad_color_brand solid 2px; - } } &[readonly] { //margin-top:1rem; diff --git a/www/calendar/app-calendar.less b/www/calendar/app-calendar.less new file mode 100644 index 000000000..bdf59fb6d --- /dev/null +++ b/www/calendar/app-calendar.less @@ -0,0 +1,740 @@ +/* + * SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +@import (reference) '../../customize/src/less2/include/framework.less'; +@import (reference) '../../customize/src/less2/include/sidebar-layout.less'; +@import (reference) '../../customize/src/less2/include/tools.less'; +@import (reference) '../../customize/src/less2/include/avatar.less'; +@import (reference) '../../customize/src/less2/include/variables.less'; + +&.cp-app-calendar { + + .framework_min_main(); + .sidebar-layout_main(); + + display: flex; + flex-flow: column; + + .cp-toolbar-bottom-mid > div { + color: @cryptpad_text_col; + .cp-small { display: none; } + } + + .flatpickr-calendar { + z-index: 100001 !important; // Alertify is 100000 + } + #cp-sidebarlayout-container #cp-sidebarlayout-rightside { + padding: 0; + & > div { + margin: 0; + } + + .cp-forcehide { + display: none !important; + } + + + .tui-full-calendar-confirm { + span, i { + padding: 0.5rem; + } + span { + padding-left: 0; + } + width: unset; + } + + .tui-full-calendar-layout { + background-color: @cp_sidebar-right-bg !important; + color: @cryptpad_text_col; + display: flex; + flex-flow: column; + .tui-full-calendar-week-container { + min-height: 0; + display: flex; + flex-flow: column; + .tui-full-calendar-vlayout-area { + display: flex; + flex-flow: column; + flex: 1; + min-height: 0; + & > div:last-child { + flex: 1; + min-height: 0; + } + } + } + .tui-full-calendar-weekday-filled { + background-color: @cp_dropdown-bg-hover !important; + } + + .tui-full-calendar-timegrid-hourmarker-time { + color: @cp_calendar-now !important; + } + .tui-full-calendar-timegrid-hourmarker-line-left, .tui-full-calendar-timegrid-hourmarker-line-today { + border-color: @cp_calendar-now !important; + } + .tui-full-calendar-timegrid-todaymarker { + background-color: @cp_calendar-now !important; + } + + .tui-full-calendar-month { + display: flex; + flex-flow: column; + & > div:last-child { + display: flex; + flex-flow: column; + flex: 1; + min-height: 0; + overflow: hidden; + } + .tui-full-calendar-today .tui-full-calendar-weekday-grid-date-decorator { + background-color: @cp_calendar-now !important; + color: @cp_calendar-now-fg !important; + } + .tui-full-calendar-weekday-schedule-time .tui-full-calendar-weekday-schedule-title { + color: @cryptpad_text_col !important; + } + .tui-full-calendar-extra-date { + .tui-full-calendar-weekday-grid-date { + color: @cp_sidebar-hint !important; + opacity: 0.5; + } + } + .tui-full-calendar-weekday-grid-date { + color: @cryptpad_text_col !important; + } + .tui-full-calendar-month-dayname-item span { + color: @cryptpad_text_col !important; + } + } + .tui-full-calendar-dayname * { + color: @cryptpad_text_col !important; + } + .tui-full-calendar-month-more { + background-color: @cp_sidebar-right-bg !important; + color: @cryptpad_text_col; + span { + color: @cryptpad_text_col !important; + } + } + + .tui-full-calendar-floating-layer.cp-calendar-popup-flex { + top: 0 !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + justify-content: center !important; + align-items: center !important; + .tui-full-calendar-popup { + width: 540px; + max-width: 100%; + max-height: 100%; + } + } + #tui-full-calendar-popup-arrow { + display: none !important; + } + } + .tui-full-calendar-timegrid-timezone { + background-color: @cp_sidebar-right-bg !important; + .tui-full-calendar-timegrid-hour { + color: @cryptpad_text_col !important; + } + color: @cryptpad_text_col; + } + .tui-full-calendar-timegrid-gridline, .tui-full-calendar-time-date { + border-color: @cp_calendar-border !important; + } + .tui-full-calendar-splitter, .tui-full-calendar-left, .tui-full-calendar-dayname-container, .tui-full-calendar-weekday-grid-line { + border-color: @cp_calendar-border !important; + + } + .tui-full-calendar-popup { + border-radius: @variables_radius_L; + } + .tui-full-calendar-popup-container { + min-width: 100%; + background: @cp_flatpickr-bg; + color: @cryptpad_text_col; + border-radius: @variables_radius_L; + font-weight: normal; + .tui-full-calendar-icon:not(.tui-full-calendar-calendar-dot):not(.tui-full-calendar-dropdown-arrow):not(.tui-full-calendar-ic-checkbox):not(.fa-map-marker) { + display: none; + } + .tui-full-calendar-icon { + text-align:center; + } + .tui-full-calendar-popup-detail-item { + a { + color: @cryptpad_color_link; + text-decoration: underline; + } + } + .tui-full-calendar-section-button-save { + height: 40px; + .btn-primary { // Update button + margin-right: 0px; + } + } + + } + li.tui-full-calendar-popup-section-item { + padding: 0 6px; + height: 32px; + } + .tui-full-calendar-popup-section-item { + height: auto; + margin: 0; + &:not(li):not(button) { + padding: 0; + margin-top: 5px; + } + #tui-full-calendar-schedule-calendar { + width: 179px; + top: 0; + } + &:not(button) { + border: none; + display: inline-flex; + align-items: center; + &:hover { + background-color: @cp_dropdown-bg-hover; + } + .tui-full-calendar-content { + text-overflow: ellipsis; + font: @colortheme_app-font; + padding: 0 10px; + } + input { flex: 1; } + } + } + .tui-full-calendar-section-date-dash { + height: auto; + } + .tui-full-calendar-section-title, .tui-full-calendar-section-location, .tui-full-calendar-section-body { + width: 100%; + } + .tui-full-calendar-dropdown-menu { + top: 38px; + width: 221px; // same as button + background-color: @cp_dropdown-bg; + color: @cp_dropdown-fg; + } + .tui-full-calendar-section-state, #tui-full-calendar-schedule-private { + display: none !important; + } + + .tui-full-calendar-popup:not(.tui-full-calendar-popup-detail) { + .tui-full-calendar-section-calendar { + width: 221px; // 50% + } + .tui-full-calendar-popup-section { + display: flex; + align-items: center; + flex-wrap: wrap; + .tui-full-calendar-section-start-date, .tui-full-calendar-section-end-date { + flex: 1; + } + .tui-full-calendar-section-allday { + width: 100%; + height: 32px; + border-radius: @variables_radius; + input[type="checkbox"].tui-full-calendar-checkbox-square:checked + span { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABbmlDQ1BpY2MAACiRdZHNK0RRGMZ/Zoh8NIqFNItZDFmMEiVLxsJmkgZlsLn3zpe6c93uvZNkq2wspizExtfCf8BW2VJKkZKs/AG+Npqu97hqJM7t3PfXc87zds5zIJQyjZJbPwAly3PSE8nYXGY+1vhEMy20EyaqGa49NjWV4t/xfkOdqtf9qtf/+/4cLdmca0Bdk/CwYTue8KhwasWzFW8KdxpFLSu8L5xw5IDCF0rXA35UXAj4VbEzkx6HkOoZK/xg/QcbRack3CccL5ll4/s86iatOWt2Wmq3zCguaSZIEkOnzBImHv1SLcnsb9/Al2+SZfEY8rdZxRFHgaJ4E6KWpWtOal70nHwmqyr333m6+aHBoHtrEhoefP+lBxq3oFrx/Y8D368eQvgezqyaf1lyGnkTvVLT4nsQWYeT85qmb8PpBnTd2ZqjfUlhmaF8Hp6PoS0DHVfQvBBk9b3O0S3MrMkTXcLOLvTK/sjiJ6CLZ94KREMsAAAACXBIWXMAAAsSAAALEgHS3X78AAABHUlEQVQoFWNkaP//n4EMwESGHrAW6mtkZvz3G2g03BsBagz/nRUQ7sNp49//TJ+Byv6BlMbrMjCsC2Jg3BbKwOAgB9GMolGAg4GBESIOIrmA+A9I03xvFHGwCrhGkDOe5TAw9LvAFbEn6jEwwTT9BtodvJ7h/4FHYH0MLBCKgaHTgYGBE8jLN2FgYAJae+4FA8NcLwZWkAtAmoLWMTBsuYNwECMsHrVEGBj2RzEwiIEciATANgE1bb6DJAgMNLhTr71hYHBcxsDw+htCAQ5NIAU/4RpBPKjmf2++MfwHaQpZD7cJyEMB3+BORRL+rybE8FOEk4Hj2FO4KMgdrFAMitun2DTCVSMxYAkBFFYg9j94qCIpwsZEil5wyDIDAAXIUsnSKmq7AAAAAElFTkSuQmCC); + } + .tui-full-calendar-ic-checkbox { + margin-left: 5px; + border-radius: 2px; + } + } + .CodeMirror { + margin-top: 5px; + background: @cp_forms-bg !important; + color: @cryptpad_text_col; + border: 1px solid @cp_forms-border; + border-radius: @variables_radius; + width: 100%; + height: 80px; + font: @colortheme_app-font; + font-size: 16px; + line-height: initial; + padding-left: 0.3rem; + pre { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + } + } + .CodeMirror-placeholder { + color: @cp_forms-placeholder; + } + } + } + .tui-full-calendar-popup-detail { + font: @colortheme_app-font; + color: @cryptpad_text_col; + box-shadow: @cryptpad_ui_shadow; + .tui-full-calendar-popup-container { + padding-bottom: 17px; + } + .tui-full-calendar-popup-detail-date { + font-size: 14px; + } + .tui-full-calendar-section-button { + margin-top: 10px; + border: 0; + display: flex; + align-items: start; + button { + flex: 1; + margin: 0; + } + } + .tui-full-calendar-popup-top-line { + border-radius: 10px 10px 0px 0px; + height: 10px; + } + .tui-full-calendar-popup-vertical-line { + visibility: hidden; + width: 10px; + } + } + + .cp-recurrence-label, .cp-notif-label { + color: @cryptpad_text_col; + margin-right: 1rem; + i { + margin-right: 0.5rem; + } + } + + .cp-calendar-recurrence-container { + margin-top: 1rem; + .cp-calendar-rec-translated-str { + margin-top: 0.5rem; + } + } + + .cp-calendar-add-notif { + flex-flow: column; + align-items: baseline !important; + margin: 1rem 0; + * { + font-size: @colortheme_app-font-size; + font-weight: normal; + } + & > div { + display: flex; + } + .cp-calendar-notif-list-container { + width: 100%; + margin-bottom: 10px; + .cp-notif-label { + margin-top: 0.5em; + } + } + .cp-calendar-notif-list { + display: flex; + flex-flow: column; + flex: 1; + min-width: 150px; + &:empty { + display: none; + } + .cp-notif-entry { + display: flex; + margin-bottom: 2px; + border-radius: @variables_radius; + background-color: fade(@cryptpad_text_col, 10%); + padding: 0.25rem; + .cp-notif-value { + width: 75%; + display: inline-flex; + line-height: 30px; + vertical-align: middle; + flex-grow: 1; + .cp-before { + flex: 1; + min-width: 0; + } + } + span:not(:last-child) { + margin: 0; + margin-right: 0.3rem; + } + span:first-child { + margin-left: 0.3rem; + } + .btn-danger-outline { + display: block; + margin-right: 0px !important; + background-color: transparent; + color: @cryptpad_text_col; + border-color: @cryptpad_text_col; + &:hover { + color: @cp_buttons-red-color; + background-color: @cp_buttons-red; + border-color: @cp_buttons-red; + } + } + } + } + .cp-notif-empty { + display: none; + margin-bottom: 2px; + border-radius: @variables_radius; + background-color: fade(@cryptpad_text_col, 10%); + padding: 0.25rem 0.5rem; + line-height: 30px; + } + .cp-calendar-notif-list:empty ~ .cp-notif-empty { + display: block; + } + .cp-calendar-notif-form { + align-items: center; + .cp-calendar-notif-form-buttons { + display: inline-flex; + align-items: center; + & > input { + height: 40px; + } + } + // margin-bottom: 20px; + input { + width: 80px; + margin-right: 0.3rem; + } + .fa-plus{ + margin-left:0.3rem; + } + } + } + + .cp-calendar-close { + top: 17px; + right: 17px; + height: auto; + margin-right: 0px; + line-height: initial; + border: 1px solid; + &:not(:hover) { + background: transparent; + } + } + + } + + .cp-calendar-rec-inline, .cp-calendar-rec-block { + &:not(:last-child) { + margin-bottom: 10px; + } + } + .cp-calendar-rec-inline { + display: flex; + flex-flow: row; + align-items: center; + & > *:not(:first-child) { margin-left: 5px; } + .cp-dropdown-container { + position: unset; + } + input[type="number"] { + width: 80px !important; + margin-bottom: 0 !important; + } + .cp-checkmark { + margin-right: 0.5rem; + } + } + .cp-calendar-rec-block { + .cp-calendar-rec-block-title { + margin-bottom: 0.5rem !important; + } + .cp-radio { + margin-bottom: 0.5rem; + } + input[type="radio"]:not(:checked) ~ .cp-checkmark-label { + input { + filter: grayscale(1); + } + } + .cp-checkmark-label { + & > *:not(:first-child) { margin-left: 5px; } + width: 100%; + //height: 26px; + display: flex; + align-items: center; + & > input { + margin-bottom: 0 !important; + } + input { + display: inline; + height: 24px !important; + padding: 0 5px !important; + } + input[type="text"] { + width: 200px !important; + } + input[type="number"] { + width: 80px !important; + margin-bottom: 0 !important; + } + } + } + #cp-calendar-rec-monthly-pick ~ .cp-checkmark-label { + display: flex; + align-items: center; + & > span { + margin-right: 20px; + } + } + button.cp-calendar-pick-el { + display: flex; + align-items: center; + justify-content: center; + &:not(:last-child) { + margin-right: 5px; + } + } + div.cp-calendar-weekly-pick { + button { + width: 50px; + } + } + div.cp-calendar-monthly-pick { + display: flex; + flex-flow: column; + & > div { + display: flex; + &:not(:last-child) { + margin-bottom: 5px; + } + button { + height: 25px; + width: 25px; + &.lastday { + width: 115px; + } + } + } + } + + .tui-full-calendar-ic-repeat-b { + display: none; + & ~ * { + display: none; + } + } + + #cp-toolbar .cp-calendar-browse { + display: flex; + align-items: center; + button { + color: @cp_toolbar-fg; + border-color: @cp_toolbar-fg; + &:hover { + background-color: fade(@cp_toolbar-fg, 50%); + cursor: pointer; + } + } + } + + .cp-calendar-newevent { + &:hover { + cursor: pointer; + } + } + + .cp-toolbar-bottom-right button, .cp-toolbar-user button { + &:hover { + cursor: pointer; + } + } + + #cp-sidebarlayout-leftside { + & > div { + padding: 10px + } + .cp-calendar-new { + display: flex; + align-items: center; + justify-content: space-between; + } + .cp-calendar-list { + overflow-y: auto; + .cp-calendar-team { + height: 30px; + .avatar_main(30px); + .cp-avatar { + margin-right: 10px; + } + .cp-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + display: flex; + align-items: center; + justify-content: center; + margin: 5px 0 10px 0; + &:not(:first-child) { + margin-top: 30px; + } + } + .cp-calendar-entry { + display: flex; + align-items: center; + justify-content: space-between; + padding: 5px; + border-radius: @variables_radius; + background-color: @cp_sidebar-left-bg; + &:not(.cp-unclickable) { + cursor: pointer; + } + .cp-dropdown-container { + position: initial; + + .cp-dropdown-content{ + @media screen and (max-width: 600px) + { + left: 50%; + min-width: 45%; + } + } + } + button.cp-calendar-actions { + background-color: transparent; + &:hover { + background-color: @cp_sidebar-left-bg; + } + } + &.cp-ghost { + padding: 0; + button { + .tools_unselectable(); + cursor: pointer; + width: 100%; + display: flex; + justify-content: space-between; + background: transparent; + border: 1px solid @cryptpad_text_col; + border-radius: @variables_radius; + padding: 5px; + height: 36px; + font: @colortheme_app-font; + align-items: center; + color: @cryptpad_text_col; + &:hover { + background-color: @cp_sidebar-left-active; + color: @cp_sidebar-left-active-fg; + border: 0px; + } + i { + margin-left: 5px; + } + } + } + &:not(:last-child) { + margin-bottom: 10px; + } + &:hover { + background: @cp_sidebar-left-item-bg; + } + &.cp-restricted { + color: @cp_drive-header-fg; + } + .cp-calendar-icon { + width: 30px; + display: inline-flex; + height: 30px; + align-items: center; + justify-content: center; + border-radius: @variables_radius; + flex-shrink: 0; + } + &.cp-active { + background-color: @cp_sidebar-left-item-bg; + .cp-calendar-inactive { + display: none; + } + } + &:not(.cp-active) { + .cp-calendar-icon { + background: transparent !important; + } + .cp-calendar-active { + display: none; + } + } + .tools_unselectable(); + .cp-calendar-color { + display: inline-block; + border-radius: 50%; + width: 15px; + height: 15px; + flex-shrink: 0; + } + .cp-calendar-title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 5px; + } + } + } + } + .cp-calendar-colorpicker { + width: 100px; + height: 25px; + cursor: pointer; + border: 1px solid @cp_forms-border; + } + + @media (max-width: @browser_media-medium-screen) { + .cp-calendar-notif-list-container, .cp-calendar-notif-form { + flex-direction: column; + align-items: unset !important; + } + .cp-calendar-newevent { + i { + margin: 0 !important; + } + span { + display: none; + } + } + .tui-full-calendar-dayname-leftmargin, .tui-full-calendar-timegrid-right { + margin-left: 40px !important; + } + .tui-full-calendar-allday-left, .tui-full-calendar-timegrid-left { + width: 40px !important; + } + .tui-full-calendar-dayname > span { + display: flex; + flex-flow: column; + line-height: 0; + justify-content: center; + align-items: center; + height: 100%; + } + .tui-full-calendar-dayname * { + font-size: 11px; + line-height: initial; + height: auto; + } + .cp-toolbar-bottom-mid > div { + :not(:first-child) { + display: none; + } + :first-child { + display: inline-block; + } + } + } + +} + From 471e3954eb0f1da5ee2aebb70f75088687449624 Mon Sep 17 00:00:00 2001 From: daria Date: Wed, 10 Jul 2024 17:01:18 +0300 Subject: [PATCH 016/188] fix error --- customize.dist/src/less2/include/forms.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/customize.dist/src/less2/include/forms.less b/customize.dist/src/less2/include/forms.less index 065b9db1d..5d8b242f1 100644 --- a/customize.dist/src/less2/include/forms.less +++ b/customize.dist/src/less2/include/forms.less @@ -28,6 +28,9 @@ } &.tui-full-calendar-content { font-size: @colortheme_app-font-size; + &:focus { + outline: @cryptpad_color_brand solid 2px; + } } &[readonly] { //margin-top:1rem; From 174b7aff5d80dc3b933048ab43920c8cf88d390c Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 11 Jul 2024 07:53:41 +0200 Subject: [PATCH 017/188] Translated using Weblate (Spanish) Currently translated at 86.7% (1545 of 1780 strings) Co-authored-by: Mirel Gonzalez Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es/ Translation: CryptPad/App --- www/common/translations/messages.es.json | 272 +++++++++++------------ 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/www/common/translations/messages.es.json b/www/common/translations/messages.es.json index 2c3df1e42..20a8a7ea0 100644 --- a/www/common/translations/messages.es.json +++ b/www/common/translations/messages.es.json @@ -553,7 +553,7 @@ "password_info": "El documento que intenta abrir no existe o está protegido con una contraseña. Ingrese la contraseña correcta para acceder a su contenido.", "creation_newPadModalDescription": "Haz clic en una aplicación para crear un nuevo documento. Tú también puedes presionar Tab para seleccionar la aplicación y presiona Enter 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.", + "oo_lostEdits": "Lamentablemente, las ediciones recientes no guardadas no se pudieron recuperar después de sincronizar contenido nuevo.", "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 documento", @@ -863,7 +863,7 @@ "form_open": "Abrir", "form_isPrivate": "Las respuestas son privadas", "form_isPublic": "Las respuestas son públicas", - "form_makePublicWarning": "¿Estás seguro/a que quieres hacer las respuestas a este formulario públicas? Las respuestas pasadas y futuras serán visibles por los participantes. Esto no se puede deshacer.", + "form_makePublicWarning": "¿Estás seguro de querer hacer públicas las respuestas a este formulario? Las respuestas pasadas y futuras serán visibles para los participantes. Esta acción no se puede deshacer.", "form_makePublic": "Publicar respuestas", "form_invalidQuestion": "Pregunta {0}", "form_invalidWarning": "Hay errores en algunas respuestas:", @@ -875,7 +875,7 @@ "form_backButton": "Atrás", "form_viewButton": "Ver", "form_answerAnonymous": "Respuesta anónima en {0}", - "form_showSummary": "Mostrar sumario", + "form_showSummary": "Mostrar resumen", "form_showIndividual": "Mostrar respuestas individuales", "form_editor": "Editor", "form_results_empty": "No hay respuestas", @@ -887,49 +887,49 @@ "form_delete": "Eliminar", "form_reset": "Reiniciar", "form_submit": "Enviar", - "form_maxOptions": "respuesta(s) máximas {0}", + "form_maxOptions": "Máximo {0} respuesta(s)", "form_description_default": "Tu texto aquí", "form_type_page": "Salto de página", "form_type_md": "Descripción", "form_sort_hint": "Por favor arrastre estos ítems desde el más (1) al menos ({0}) preferido.", "form_type_sort": "Lista ordenada", "form_type_poll": "Encuesta", - "form_type_multicheck": "Cuadrícula de casillas de verificación", + "form_type_multicheck": "Grilla de casillas de verificación", "form_type_checkbox": "Casilla de verificación", - "form_type_multiradio": "Escoge la red", + "form_type_multiradio": "Grilla de opciones", "form_type_radio": "Opción", "form_type_textarea": "Párrafo", "form_type_input": "Texto", "form_default": "¿Tu pregunta aquí?", "form_text_number": "Número", "form_text_email": "Correo", - "form_text_url": "Link", + "form_text_url": "Enlace", "form_text_text": "Texto", "form_textType": "Tipo de texto", "form_pollYourAnswers": "Tus respuestas", "form_pollTotal": "Total", - "form_poll_switch": "Intercambio de ejes", - "form_poll_time": "Tiempo", + "form_poll_switch": "Invertir ejes", + "form_poll_time": "Hora", "form_poll_day": "Día", "form_poll_text": "Texto", "form_editType": "Tipo de opción", - "form_editMaxLength": "Máximos carácteres", - "form_editMax": "Máximas opciones seleccionables", + "form_editMaxLength": "Máximo de caracteres", + "form_editMax": "Máximo de opciones seleccionables", "form_editBlock": "Editar", "form_invalid": "Formulario inválido", "share_formView": "Participante", - "share_formAuditor": "Auditor/a", - "share_formEdit": "Autor/a", + "share_formAuditor": "Auditor", + "share_formEdit": "Autor", "admin_supportPrivButton": "Mostrar llave", - "admin_supportPrivHint": "Muestra la llave privada que otros/as administradores/as necesitarán para ver tickets de soporte. Una forma de ingresar esta llave será mostrada en su panel de administrador/a.", + "admin_supportPrivHint": "Muestra la llave privada que otros administradores necesitarán para ver tickets de soporte. Se mostrará un formulario para ingresar esta clave en su panel de administración.", "admin_supportInitGenerate": "Generar llaves de soporte", "admin_supportPrivTitle": "Llave privada del buzón de soporte", "admin_emailHint": "Establece el correo de contacto para tu instancia aquí", - "admin_emailTitle": "Correo de contacto del administrador/a", + "admin_emailTitle": "Correo de contacto del administrador", "oo_importBin": "Presiona OK para importar el formato .bin interno de CryptPad.", "oo_conversionSupport": "Tu navegador no puede manejar la conversión hacia y desde formatos de office. Sugerimos usar una versión reciente de Firefox o Chrome.", "register_registrationIsClosed": "La registración está cerrada.", - "mediatag_defaultImageName": "imágen", + "mediatag_defaultImageName": "imagen", "genericCopySuccess": "Copiado al portapapeles", "toolbar_storeInDrive": "Guardar en CryptDrive", "calendar_noNotification": "Ninguno", @@ -957,9 +957,9 @@ "calendar_newEvent": "Nuevo evento", "calendar_import": "Añadir a mis calendarios", "calendar_errorNoCalendar": "Ningún calendario editable seleccionado", - "calendar_deleteOwned": "Se mantendrá visible para otros/as usuarios/as con los que se haya compartido.", - "calendar_deleteTeamConfirm": "¿Estás seguro/a que quieres eliminar este calendario del equipo?", - "calendar_deleteConfirm": "¿Estás seguro/a que quieres eliminar este calendario de tu cuenta?", + "calendar_deleteOwned": "Se mantendrá visible para otros usuarios con los que se haya compartido.", + "calendar_deleteTeamConfirm": "¿Estás seguro que quieres eliminar este calendario del equipo?", + "calendar_deleteConfirm": "¿Estás seguro que quieres eliminar este calendario de tu cuenta?", "calendar_today": "Hoy", "calendar_month": "Mes", "calendar_week": "Semana", @@ -972,73 +972,73 @@ "calendar_import_temp": "Importar este calendario", "pad_goToAnchor": "Ir al anclaje", "oo_cantMigrate": "Esta hoja excede el tamaño máximo de subida y es muy grande para ser migrada.", - "footer_roadmap": "Hoja de ruta", - "settings_deleteSubscription": "Manejar mi suscripción", + "footer_roadmap": "Plan de acción", + "settings_deleteSubscription": "Administrar mi suscripción", "settings_deleteContinue": "Eliminar mi cuenta", - "settings_deleteWarning": "Advertencia: actualmente estás suscrito/a a un plan premium (pagado o dado por otro/a usuario/a). Por favor cancela tu plan antes de eliminar tu cuenta ya que no será posible sin contactar a soporte una vez tu cuenta esté eliminada.", - "broadcast_newCustom": "Mensaje de los/as administradores/as", + "settings_deleteWarning": "Advertencia: actualmente estás suscrito a un plan premium (pagado o dado por otro usuario). Por favor cancela tu plan antes de eliminar tu cuenta, de otra forma tendrás que contactar al soporte para poder cancelar tu plan.", + "broadcast_newCustom": "Mensaje de los administradores", "broadcast_preview": "Previsualizar notificación", "broadcast_defaultLanguage": "Volver a este idioma", "broadcast_translations": "Traducciones", "admin_broadcastCancel": "Eliminar mensaje", "admin_broadcastActive": "Mensaje activo", - "admin_broadcastButton": "Envíar", - "admin_broadcastHint": "Envía un mensaje a todos/as los/as usuarios/as en esta instancia. Todos/as los/as usuarios/as nuevos/as y existentes lo recibirán como una notificación. Previsualiza los mensajes antes de enviarlos con \"Previsualizar notificación\". Las notificaciones de previsualización tienen un ícono rojo y son visibles sólo para ti.", + "admin_broadcastButton": "Enviar", + "admin_broadcastHint": "Envía un mensaje a todos los usuarios en esta instancia. Todos los usuarios nuevos y existentes lo recibirán como una notificación. Previsualiza los mensajes antes de enviarlos con \"Previsualizar notificación\". Las notificaciones de previsualización tienen un ícono rojo y son visibles sólo para ti.", "admin_broadcastTitle": "Mensaje de difusión", - "broadcast_surveyURL": "Link del cuestionario", + "broadcast_surveyURL": "Enlace del cuestionario", "admin_surveyActive": "Abrir cuestionario", "admin_surveyCancel": "Eliminar", "admin_surveyButton": "Guardar cuestionario", "broadcast_newSurvey": "Un nuevo cuestionario está disponible. Presiona para abrir.", - "admin_surveyHint": "Añade, actualiza o borra un link a un cuestionario externo. Los/as usuarios/as recibirán una notificación y el cuestionario se mantendrá disponible desde el menú de usuario/a.", + "admin_surveyHint": "Añade, actualiza o borra un enlace a un cuestionario externo. Los usuarios recibirán una notificación y el cuestionario se mantendrá disponible desde el menú del usuario.", "admin_surveyTitle": "Cuestionario", - "broadcast_maintenance": "Un mantenimiento está planeado entre las {0} y {1}. CryptPad puede no estar disponible durante ese tiempo.", + "broadcast_maintenance": "Un mantenimiento está planeado entre las {0} y {1}. CryptPad puede que no esté disponible durante ese tiempo.", "broadcast_end": "Terminar", "broadcast_start": "Empezar", "admin_maintenanceCancel": "Cancelar mantenimiento", "admin_maintenanceButton": "Planear mantenimiento", - "admin_maintenanceHint": "Planear un mantenimiento en esta instancia y notificar a todos/as los/as usuarios/as. Limitado a un mantenimiento activo en un momento dado.", + "admin_maintenanceHint": "Planear un mantenimiento en esta instancia y notificar a todos los usuarios. Limitado a un mantenimiento activo en un momento dado.", "admin_maintenanceTitle": "Mantenimiento", "admin_cat_broadcast": "Difusión", "fm_cantUploadHere": "No se puede subir un archivo aquí", - "importError": "Fallo al importar (formato incorrecto)", + "importError": "Error al importar (formato incorrecto)", "addOptionalPassword": "Añadir una contraseña (opcional)", - "settings_colortheme_custom": "Personalizado", + "settings_colortheme_custom": "Personalizar", "pad_settings_show": "Mostrar", - "pad_settings_hide": "Esconder", - "pad_settings_comments": "Escoge si los comentarios deberían ser visibles o escondidos por defecto.", - "pad_settings_outline": "Escoge si la tabla de contemidos debería ser visible o escondida por defecto.", + "pad_settings_hide": "Ocultar", + "pad_settings_comments": "Escoge si los comentarios deberían ser visibles u oculta por defecto.", + "pad_settings_outline": "Escoge si la tabla de contenidos debería ser visible u oculta por defecto.", "pad_settings_width_large": "Ancho total", "pad_settings_width_small": "Modo de página", - "pad_settings_info": "Configuraciones por defecto para este documento. Estos serán aplicados cuando usuarios/as nuevos/as visiten este documento.", + "pad_settings_info": "Configuraciones por defecto para este documento. Estos serán aplicados cuando usuarios nuevos visiten este documento.", "pad_settings_title": "Configuración del documento", - "settings_colorthemeTitle": "Tema del color", - "settings_colorthemeHint": "Cambiar los colores en general de CryptPad en este dispositivo.", - "settings_colortheme_default": "Tema del sistema por defecto ({0})", - "settings_colortheme_light": "Blanco", - "settings_colortheme_dark": "Negro", + "settings_colorthemeTitle": "Tema de color", + "settings_colorthemeHint": "Cambiar los colores de CryptPad en este dispositivo.", + "settings_colortheme_default": "Configuración predeterminada del sistema ({0})", + "settings_colortheme_light": "Claro", + "settings_colortheme_dark": "Oscuro", "settings_cat_style": "Apariencia", "admin_performancePercentHeading": "Porcentaje", "admin_performanceTimeHeading": "Tiempo (segundos)", "admin_performanceKeyHeading": "Comando", "admin_performanceProfilingTitle": "Rendimiento", - "admin_performanceProfilingHint": "Una visión general del tiempo total gastado ejecutando varios comandos en el lado del servidor", + "admin_performanceProfilingHint": "Una visión general del tiempo total dedicado a ejecutar varios comandos del lado del servidor", "admin_cat_performance": "Rendimiento", "redo": "Rehacer", "undo": "Deshacer", - "settings_cacheButton": "Limpiar caché existente", + "settings_cacheButton": "Borrar caché existente", "settings_cacheCheckbox": "Activar caché en este dispositivo", - "settings_cacheHint": "CryptPad guarda partes de tus documentos en la memoria de tu navegador para poder ahorrar en uso de la red y mejorar los tiempos de carga. Puedes desactivar el caché si tu dispositivo no tiene mucho espacio libre. Por razones de seguridad, el caché siempre es limpiado cuando cierras sesión, pero puedes limpiarlo manualmente si quieres recuperar espacio de almacenamiento en tu máquina.", + "settings_cacheHint": "CryptPad guarda partes de tus documentos en la memoria de tu navegador para poder ahorrar conexión y mejorar los tiempos de carga. Puedes desactivar el caché si tu dispositivo no tiene mucho espacio libre. Por razones de seguridad, el caché siempre es borrado cuando cierras sesión, pero puedes borrarlo manualmente si quieres recuperar espacio de almacenamiento en tu dispositivo.", "settings_cacheTitle": "Caché", "docs_link": "Documentación", "creation_helperText": "Abrir en documentación", - "creation_expiresIn": "Expira en", - "register_warning_note": "Debido a la naturaleza encriptada de CryptPad, los/as administradores/as de servicio no podrán recuperar los datos en caso de que olvides tu nombre de usuario/a y/o contraseña. Por favor guardalos en un lugar seguro.", - "register_notes": "
  • Tu contraseña es la llave secreta que encripta todos tus documentos. Si la pierdes no hay forma que podamos recuperar tus datos.
  • Si estás usando una computadora compartida, recuerda cerrar la sesión cuando estés listo/a. Tan solo cerrar la ventana del navegador dejará a tu cuenta expuesta.
  • Para mantener los documentos que creaste y/o guardaste sin acceder, marca \"Importar documentos de tu sesión de invitado/a\".
", + "creation_expiresIn": "Destruir en", + "register_warning_note": "Debido a la naturaleza encriptada de CryptPad, los administradores no podrán recuperar los datos en caso de que olvides tu nombre de usuario y/o contraseña. Por favor, guárdalos en un lugar seguro.", + "register_notes": "
  • Tu contraseña es la llave secreta que encripta todos tus documentos. Si la pierdes no hay forma que podamos recuperar tus datos.
  • Si estás usando una computadora compartida, recuerda cerrar la sesión cuando termines. Cerrar solo la ventana del navegador dejará tu cuenta expuesta.
  • Para quedarte con los documentos que creaste y/o guardaste sin iniciar sesión, marca \"Importar documentos de tu sesión de invitado\".
", "register_notes_title": "Notas importantes", "offlineError": "No se han podido sincronizar los datos más recientes, esta página no puede ser mostrada ahora. La carga continuará cuando tu conexión al servicio sea restaurada.", "share_noContactsOffline": "Actualmente estás fuera de línea. Los contactos no están disponibles.", - "access_offline": "Actualmente estás fuera de línea. Manejo de acceso no está disponible.", + "access_offline": "Actualmente estás fuera de línea. La administración de acceso no está disponible.", "admin_support_first": "Creado en: ", "admin_support_collapse": "Colapsar", "admin_support_open": "Mostrar", @@ -1046,10 +1046,10 @@ "admin_support_answered": "Tickets respondidos:", "admin_support_normal": "Tickets sin responder:", "admin_support_premium": "Tickets premium:", - "contacts_confirmCancel": "¿Estás seguro/a que quieres cancelar tu solicitud de contacto con {0}?", - "history_trimPrompt": "Este documento ha acumulado {0} de historial que puede ralentizar el tiempo de carga. Considere borrar el historial si no es necesario.", + "contacts_confirmCancel": "¿Estás seguro que quieres cancelar tu solicitud de contacto con {0}?", + "history_trimPrompt": "Este documento ha acumulado {0} de historial que puede ralentizar el tiempo de carga. Considera borrar el historial si no lo necesita.", "mediatag_loadButton": "Cargar adjunto", - "settings_mediatagSizeHint": "Tamaño máximo en megabytes (MB) para automáticamente cargar elementos multimedia (imágenes, vídeos, pdf) incrustados en documentos. Elementos más grandes que el tamaño especificado pueden ser cargados manualmente. Use \"-1\" para siempre cargar los elementos multimedia automáticamente.", + "settings_mediatagSizeHint": "Tamaño máximo en megabytes (MB) para cargar automáticamente elementos multimedia (imágenes, vídeos, pdf) dentro de los documentos. Elementos más grandes que el tamaño especificado pueden ser cargados manualmente. Usa \"-1\" para cargar siempre los elementos multimedia automáticamente.", "settings_mediatagSizeTitle": "Límite automático de descarga", "mediatag_notReady": "Por favor complete la descarga", "pad_mediatagOpen": "Abrir archivo", @@ -1067,33 +1067,33 @@ "admin_unarchiveButton": "Restaurar", "admin_unarchiveHint": "Restaurar un documento que fue previamente archivado", "admin_archiveButton": "Archivo", - "admin_archiveHint": "Hacer un documento no disponible sin eliminarlo permanentemente. Será puesto en un directorio 'archivo' y eliminado luego de unos días (configurable en el archivo de configuración del servidor).", - "errorPopupBlocked": "CryptPad necesita poder abrir nuevas pestañas para operar. Por favor permita las ventanas emergentes en la barra de direcciones de su navegador. Estas ventanas nunca van a ser usadas para mostrarle anuncios.", - "unableToDisplay": "No se puede mostrar este documento. Por favor presione Esc para recargar la página. Si el problema persiste, por favor contacte a soporte.", + "admin_archiveHint": "Poner un documento no disponible sin eliminarlo permanentemente. Será puesto en un directorio 'archivo' y eliminado luego de unos días (se puede configurar en el archivo de configuración del servidor).", + "errorPopupBlocked": "CryptPad necesita poder abrir nuevas pestañas para operar. Por favor permita las ventanas emergentes en la barra de direcciones de su navegador. Estas ventanas nunca van a ser usadas para mostrar anuncios.", + "unableToDisplay": "No se puede mostrar el documento. Por favor presione Esc para recargar la página. Si el problema persiste, por favor contacte al soporte.", "documentID": "Identificador del documento", - "error_unhelpfulScriptError": "Error de script: Vea la consola del navegador para los detalles", + "error_unhelpfulScriptError": "Error de script: Vea la consola del navegador para detalles", "tag_edit": "Editar", "tag_add": "Añadir", "loading_state_5": "Reconstruir documento", "loading_state_4": "Cargar equipos", "loading_state_3": "Cargar carpetas compartidas", - "loading_state_2": "Actualizar el contenido", + "loading_state_2": "Actualizar contenido", "loading_state_1": "Cargar el disco", "loading_state_0": "Construir interfaz", "fm_shareFolderPassword": "Proteger esta carpeta con una contraseña (opcional)", "access_destroyPad": "Destruir este documento o carpeta permanentemente", "fm_deletedFolder": "Carpeta eliminada", - "admin_limitUser": "Llave pública del usuario/a", + "admin_limitUser": "Llave pública del usuario", "team_exportButton": "Descargar", - "team_exportHint": "Descargar todos los documentos en el disco de este equipo. Los documentos serán descargados en formatos que sean legibles para otras aplicaciones cuando cierto formato esté disponible. Cuando cierto formato no esté disponible, los documentos serán descargados en un formato legible por CryptPad.", + "team_exportHint": "Descargar todos los documentos en el disco de este equipo. Los documentos serán descargados en formatos que sean legibles por otras aplicaciones cuando el formato esté disponible. Cuando el formato no esté disponible, los documentos serán descargados en un formato legible por CryptPad.", "team_exportTitle": "Descargar disco del equipo", - "admin_cat_quota": "Almacenamiento del usuario/a", - "admin_invalLimit": "Valor de límite inválido", + "admin_cat_quota": "Almacenamiento del usuario", + "admin_invalLimit": "Valor de límite no válido", "admin_invalKey": "Llave pública inválida", "admin_limitSetNote": "Nota", "admin_limitMB": "Límite (en MB)", "admin_setlimitTitle": "Aplicar un límite personalizado", - "admin_setlimitHint": "Establecer límites personalizados para usuarios/as usando su llave pública. Puedes actualizar o borrar un límite existente.", + "admin_setlimitHint": "Establecer límites personalizados para usuarios usando su llave pública. Puedes actualizar o borrar un límite existente.", "admin_limitNote": "Nota: {0}", "admin_limitPlan": "Plan: {0}", "admin_getlimitsTitle": "Límites personalizados", @@ -1101,13 +1101,13 @@ "admin_limit": "Límite actual: {0}", "admin_setlimitButton": "Establecer límite", "admin_defaultlimitTitle": "Límite de almacenamiento (MB)", - "admin_defaultlimitHint": "Límite de almacenamiento máximo para los CryptDrives (usuarios/as y equipos) cuando no hay una regla personalizada aplicada", + "admin_defaultlimitHint": "Límite de almacenamiento máximo para los CryptDrives (usuarios y equipos) cuando no se aplica ninguna regla", "admin_registrationTitle": "Cerrar registración", - "admin_registrationHint": "No permitir a ningún usuario/a nuevo/a registrarse", - "snapshots_cantMake": "La instantánea no pudo ser creada. Estás desconectado/a.", - "snapshots_notFound": "Esta instantánea ya no existe debido a que el historial del documento ha sido borrado.", - "snapshot_error_exists": "Ya hay una instantánea de esta versión", - "snapshots_ooPickVersion": "Debes seleccionar una versión antes de crear una instantánea", + "admin_registrationHint": "Los visitantes de la instancia no pueden crear cuentas. Las invitaciones pueden ser creadas por los administradores.", + "snapshots_cantMake": "La captura no pudo ser creada. Has sido desconectado.", + "snapshots_notFound": "Esta captura ya no existe debido a que el historial del documento ha sido borrado.", + "snapshot_error_exists": "Ya hay una captura de esta versión", + "snapshots_ooPickVersion": "Debes seleccionar una versión antes de crear una captura", "oo_version": "Versión: ", "oo_version_latest": "Último", "snapshots_delete": "Eliminar", @@ -1115,50 +1115,50 @@ "snapshots_close": "Cerrar", "snapshots_restore": "Restaurar", "snapshots_open": "Abrir", - "snapshots_placeholder": "Título de la instantánea", - "snapshots_new": "Nueva Instantánea", - "snapshots_button": "Instantáneas", - "snaphot_title": "Instantánea", - "infobar_versionHash": "Actualmente estás viendo una versión pasada de este documento ({0}).", + "snapshots_placeholder": "Título de la captura", + "snapshots_new": "Nueva captura", + "snapshots_button": "Capturas", + "snaphot_title": "Captura", + "infobar_versionHash": "Actualmente estás viendo una versión antigua de este documento ({0}).", "history_restoreDriveDone": "CryptDrive restaurado", - "history_restoreDrivePrompt": "¿Estás seguro/a de que quieres reemplazar la versión actual del CryptDrive con la versión mostrada?", + "history_restoreDrivePrompt": "¿Estás seguro de que quieres reemplazar la versión actual del CryptDrive con la versión mostrada?", "history_restoreDriveTitle": "Restaurar la versión seleccionada del CryptDrive", - "history_userNext": "Siguiente autor/a", + "history_userNext": "Siguiente autor", "history_fastNext": "Siguiente sesión de edición", - "history_userPrev": "Autor/a previo/a", + "history_userPrev": "Autor previo", "history_fastPrev": "Sesión de edición previa", - "share_versionHash": "Estás a punto de compartir la versión del historial seleccionado del documento en el modo de solo lectura. Esto también dará acceso de visión para todas las versiones del documento.", - "history_shareTitle": "Compartir un link a esta versión", - "history_cantRestore": "Restauración fallida. Estás desconectado/a.", + "share_versionHash": "Estás a punto de compartir la versión del historial seleccionada del documento en el modo de solo lectura. Esto también dará acceso de visión para todas las versiones del documento.", + "history_shareTitle": "Compartir un enlace a esta versión", + "history_cantRestore": "Restauración fallida. Desconectado.", "history_close": "Cerrar", "history_restore": "Restaurar", - "share_bar": "Crear link", + "share_bar": "Crear enlace", "settings_cat_kanban": "Kanban", "settings_kanbanTagsOr": "O", "settings_kanbanTagsAnd": "Y", - "settings_kanbanTagsHint": "Selecciona como quieres que actúe el filtro de etiquetas cuando se seleccionen múltiples etiquetas: solo mostrar tarjetas conteniendo todas las etiquetas seleccionadas (Y) o mostrar tarjetas conteniendo cualquiera de las etiquetas seleccionadas (O)", + "settings_kanbanTagsHint": "Selecciona como quieres que actúe el filtro de etiquetas cuando se seleccionen múltiples etiquetas: mostrar solo tarjetas que contienen todas las etiquetas seleccionadas (Y) o mostrar tarjetas que contienen cualquiera de las etiquetas seleccionadas (O)", "settings_kanbanTagsTitle": "Filtro de etiquetas", - "pad_tocHide": "Esquema", + "pad_tocHide": "Resumen", "fm_noResult": "No se encontraron resultados", "fm_restricted": "No tienes acceso", - "fm_emptyTrashOwned": "Tu basurero contiene documentos que te pertenecen. Puedes borrarlos solamente de tu disco, o detruirlos para todos/as los/as usuarios/as.", + "fm_emptyTrashOwned": "Tu basurero contiene documentos que te pertenecen. Puedes borrarlos solamente de tu disco, o destruirlos para todos los usuarios.", "support_formCategoryError": "Error: la categoría está vacía", "support_category": "Escoge una categoría", "oo_refresh": "Refrescar", - "notification_folderSharedTeam": "{0} ha compartido una carpet con el equipo {2}: {1}", + "notification_folderSharedTeam": "{0} ha compartido una carpeta con el equipo {2}: {1}", "notification_fileSharedTeam": "{0} ha compartido un archivo con el equipo {2}: {1}", "notification_padSharedTeam": "{0} ha compartido un documento con el equipo {2}: {1}", "support_addAttachment": "Añadir adjunto", "support_attachments": "Adjuntos", "support_cat_all": "Todo", "support_cat_other": "Otros", - "support_cat_bug": "Reporte de fallos", + "support_cat_bug": "Reporte de errores", "support_cat_data": "Pérdida de contenido", - "support_cat_account": "Cuenta de usuario/a", + "support_cat_account": "Cuenta de usuario", "info_privacyFlavour": "Política de privacidad para esta instancia", "user_about": "Acerca de CryptPad", - "info_imprintFlavour": "Información legal acerca de los/as administradores/as de esta instancia", - "settings_safeLinkDefault": "Los links seguros ahora están activados por defecto. Por favor usa el menú Compartir para compartir links en lugar de la barra de direcciones de tu navegador.", + "info_imprintFlavour": "Información legal acerca de los administradores de esta instancia", + "settings_safeLinkDefault": "Los links seguros ahora están activados por defecto. Por favor usa Compartir menu para compartir links en lugar de la barra de direcciones de tu navegador.", "support_languagesPreamble": "El equipo de soporte habla los siguientes idiomas:", "slide_textCol": "Color del texto", "slide_backCol": "Color de fondo", @@ -1169,20 +1169,20 @@ "toolbar_savetodrive": "Guardar como imagen", "toolbar_insert": "Insertar", "toolbar_theme": "Tema", - "todo_move": "Tu lista de cosas por hacer ahora está en el kanban {0} en tu Disco.", + "todo_move": "Tu lista de cosas por hacer ahora está en el kanban {0} en tu disco.", "fm_sort": "Ordenar", - "comments_error": "No se puede comentar aquí", + "comments_error": "No se puede añadir comentario aquí", "settings_padNotifCheckbox": "Desactivar las notificaciones de comentarios", - "settings_padNotifHint": "Ignorar las notificaciones cuando alguien responda a uno de tus comentarios", + "settings_padNotifHint": "Ignorar notificaciones cuando alguien responda a uno de tus comentarios", "comments_comment": "Comentar", "comments_resolve": "Resolver", "comments_reply": "Responder", - "comments_submit": "Envíar", + "comments_submit": "Enviar", "comments_edited": "Editado", - "comments_deleted": "Comentario eliminado por su autor/a", + "comments_deleted": "Comentario eliminado por su autor", "mentions_notification": "{0} te ha mencionado en {1}", "unknownPad": "Documento desconocido", - "comments_notification": "Responde a tu comentario \"{0}\" en {1}", + "comments_notification": "Respuestas a tu comentario \"{0}\" en {1}", "cba_title": "Colores del autor", "oo_login": "Por favor accede o regístrate para mejorar el rendimiento de las hojas de cálculo.", "cba_hide": "Esconder los colores del autor", @@ -1209,9 +1209,9 @@ "kanban_body": "Contenido", "kanban_title": "Título", "teams": "Equipos", - "allow_text": "Usar una lista de acceso significa que solo los/as usuarios/as seleccionados/as y propietarios/as podrán acceder a este documento.", + "allow_text": "Usar una lista de acceso significa que solo los usuarios seleccionados y propietarios podrán acceder a este documento.", "logoutEverywhere": "Cerrar sesión en todos lados", - "owner_text": "El/los/as propietario/a/s de un documento son los/as únicos/as usuarios/as autorizados/as para: añadir/expulsar propietarios/as, restringir acceso al documento con una lista de acceso, o eliminar el documento.", + "owner_text": "El o los propietarios de un documento son los únicos usuarios autorizados a: añadir o quitar propietarios, restringir acceso al documento con una lista de acceso, o eliminar el documento.", "access_muteRequests": "Silenciar solicitudes de acceso para este documento", "allow_label": "Lista de acceso: {0}", "allow_disabled": "desactivado", @@ -1249,32 +1249,32 @@ "oo_sheetMigration_complete": "Versión actualizada disponible, presione OK para recargar.", "admin_consentToContactTitle": "Consentir a contacto", "admin_checkupButton": "Ejecutar diagnóstico", - "admin_checkupHint": "CryptoPad incluye una página que automáticamente diagnostica errores comunes y sugiere cómo corregirlos si fuera necesario.", - "admin_checkupTitle": "Valide la configuración de la instancia", - "admin_updateAvailableButton": "Ver las notas de lanzamiento", - "admin_updateAvailableHint": "Una versión nueva de CryptPad está disponible", + "admin_checkupHint": "CryptPad incluye una página que diagnostica automáticamente problemas comunes de configuración y sugiere cómo corregirlos si es necesario.", + "admin_checkupTitle": "Validar la configuración de la instancia", + "admin_updateAvailableButton": "Ver notas de la versión", + "admin_updateAvailableHint": "Una nueva versión de CryptPad está disponible", "admin_updateAvailableTitle": "Nuevas versiones", "admin_cat_network": "Red", "mdToolbar_embed": "Incrustar archivo", - "restrictedLoginPrompt": "No estás autorizado/a a acceder a este documento. Accede si crees que tu cuenta debería poder accederlo.", + "restrictedLoginPrompt": "No estás autorizado a acceder a este documento. Accede si crees que tu cuenta debería tener acceso.", "copyToClipboard": "Copiar al portapapeles", - "settings_driveRedirect": "Redirigirme automáticamente", - "settings_driveRedirectHint": "La redirección automática desde la página de inicio al disco cuando ya accedió ya no está activada por defecto. El comportamiento de legado puede ser activado abajo.", + "settings_driveRedirect": "Redirígeme automáticamente", + "settings_driveRedirectHint": "La redirección automática desde la página de inicio al drive cuando se inicia sesión ya no está habilitada por defecto. El comportamiento anterior puede habilitarse a continuación.", "settings_driveRedirectTitle": "Redirección a la página de inicio", "form_page": "Página {0}/{1}", "form_clear": "Limpiar", - "form_addMultipleHint": "Añadir múltiples fechas y tiempos", + "form_addMultipleHint": "Añadir múltiples fechas y horas", "form_addMultiple": "Añadir todo", - "form_anonymous_blocked": "Las respuestas de invitados/a están bloqueadas para este formulario. Debes acceder o registrarte para enviar respuestas.", - "form_add_item": "Añadir ítem", + "form_anonymous_blocked": "Las respuestas de invitados están bloqueadas para este formulario. Debes iniciar sesión o registrarte para enviar respuestas.", + "form_add_item": "Añadir elemento", "form_add_option": "Añadir opción", - "form_newItem": "Nuevo ítem", + "form_newItem": "Nuevo elemento", "form_newOption": "Nueva opción", - "form_defaultItem": "Ítem {0}", + "form_defaultItem": "Elemento {0}", "form_defaultOption": "Opción {0}", "form_anonymous_off": "Bloqueado", "form_anonymous_on": "Permitido", - "form_anonymous": "Acceso de invitado/a (sin acceder)", + "form_anonymous": "Acceso de invitado (sin sesión iniciada)", "oo_sheetMigration_loading": "Actualizando tu documento a la última versión. Porfavor espera aproximadamente 1 minuto.", "oo_exportInProgress": "Exportación en progreso", "oo_importInProgress": "Importación en progreso", @@ -1453,50 +1453,50 @@ "toolbar_expand": "Expandir barra de herramientas", "toolbar_collapse": "Colapsar barra de herramientas", "support_premiumLink": "Ver opciones de suscripción", - "support_premiumPriority": "Los/as usuarios/as premium ayudan a financiar mejoras a la usabilidad de CryptPad y se benefician de respuestas priorizadas a sus tickets de soporte.", - "form_totalResponses": "Respuestas totales: {0}", + "support_premiumPriority": "Los usuarios premium ayudan a respaldar las mejoras en la usabilidad de CryptPad y se benefician de respuestas prioritarias a sus solicitudes de soporte.", + "form_totalResponses": "Total de respuestas: {0}", "ui_expand": "Expandir", "ui_collapse": "Colapsar", - "fm_link_invalid": "URL inválida", - "fm_link_warning": "Advertencia: la URL excede los 200 carácteres", + "fm_link_invalid": "URL no válida", + "fm_link_warning": "Advertencia: la URL excede los 200 caracteres", "form_anonName": "Tu nombre", - "notification_linkShared": "{0} ha compartido un link contigo: {1}", - "fm_link_name_placeholder": "Mí link", + "notification_linkShared": "{0} ha compartido un enlace contigo: {1}", + "fm_link_name_placeholder": "Mi enlace", "fm_link_url": "URL", - "fm_link_name": "Nombre del link", - "fm_link_type": "Link", - "fm_link_new": "Nuevo link", - "notification_openLink": "Has recibido un link {0} de {1}:", + "fm_link_name": "Nombre del Enlace", + "fm_link_type": "Enlace", + "fm_link_new": "Nuevo enlace", + "notification_openLink": "Has recibido un enlace {0} de {1}:", "form_exportCSV": "Exportar a CSV", - "team_leaveOwner": "Por favor degradate del rol de propietario/a antes de dejar el equipo. Ten en cuenta que los equipos deben tener al menos un/a propietario/a, por favor añade uno/a antes de proceder si actualmente eres el único/a propietario/a.", - "admin_instancePurposeHint": "¿Porqué diriges esta instancia? Tu respuesta será usada para informar al plan de desarrollo si su telemetría esta activada.", + "team_leaveOwner": "Por favor, reduce privilegios de propietario antes de salir del equipo. Ten en cuenta que los equipos deben tener al menos un propietario; añade uno antes de proceder si actualmente eres el único.", + "admin_instancePurposeHint": "¿Porqué usas esta instancia? Tu respuesta será usada para ayudar al plan de desarrollo si la telemetría está activada.", "admin_purpose_business": "Para una empresa u organización comercial", "admin_purpose_public": "Para proveer un servicio gratuito al público", - "admin_purpose_education": "Para una escuela, colegio o universidad", - "admin_purpose_org": "Para una organización sin ánimos de lucro o un grupo de defensa", - "admin_purpose_personal": "Para mí, familia, o amigos/as", + "admin_purpose_education": "Para una escuela o universidad", + "admin_purpose_org": "Para una organización sin fines de lucro o grupo de defensa", + "admin_purpose_personal": "Para mí, familia, o amigos", "admin_purpose_experiment": "Para probar la plataforma o desarrollar nuevas funciones", "admin_purpose_noanswer": "Prefiero no decirlo", "admin_instancePurposeTitle": "Propósito de la instancia", - "resources_learnWhy": "Conoce por qué fue bloqueado", - "resources_openInNewTab": "Abrirlo en una nueva pestaña", - "resources_imageBlocked": "CryptPad bloqueó una imágen remota", + "resources_learnWhy": "Entérate por qué fue bloqueada", + "resources_openInNewTab": "Abrir en una nueva pestaña", + "resources_imageBlocked": "CryptPad bloqueó una imagen remota", "fc_open_formro": "Abrir (como participante)", - "form_poll_hint": ": Si, : No, : Aceptable", + "form_poll_hint": ": Si, : No, : Aceptar", "admin_provideAggregateStatisticsLabel": "Proveer estadísticas adicionales", - "admin_provideAggregateStatisticsHint": "Puedes optar por incluir mediciones de uso adicionales para los/as desarrolladores/as, tal como el número aproximado de usuarios/as diarios y registrados/as para tu instancia.", - "admin_provideAggregateStatisticsTitle": "Agregación estadística", + "admin_provideAggregateStatisticsHint": "Puedes optar por incluir mediciones de uso adicionales para los desarrolladores, tal como el número aproximado de usuarios diarios y registrados en tu instancia.", + "admin_provideAggregateStatisticsTitle": "Estadísticas adicionales", "admin_blockDailyCheckLabel": "Desactivar telemetría del servidor", - "admin_blockDailyCheckHint": "Las instancias de CryptPad envian un mensaje al servidor de los/as desarrolladores/as cuando son lanzadas y una vez por día a partir de entonces. Esto les permite mantenerse al tanto de cuantos servidores están funcionando con que versiones del software. Puedes salirte de esta medición abajo. Los contenidos de este mensaje pueden ser encontrados en el registro de la aplicación del servidor para tu revisión.", + "admin_blockDailyCheckHint": "Las instancias de CryptPad envían un mensaje al servidor de los desarrolladores una vez al día al iniciarse. Esto les permite llevar un registro de cuántos servidores se están ejecutando y qué versiones del software. Puedes optar por no participar en esta medición a continuación. El contenido de este mensaje se puede encontrar en el registro del servidor de la aplicación para tu revisión.", "admin_blockDailyCheckTitle": "Telemetría del servidor", - "admin_removeDonateButtonLabel": "No publicar las campañas de financiación colectiva", - "admin_removeDonateButtonHint": "El desarrollo de CryptPad es financiado parcialmente por subvenciones públicas y donaciones. Publicar nuestros esfuerzos de financiación colectiva en tu instancia ayuda a los/as desarrolladores/as a continuar mejorando la plataforma para todos/as, pero puedes desactivar estos abisos si los encuentras inapropiados.", - "admin_removeDonateButtonTitle": "Participación en la financiación colectiva", + "admin_removeDonateButtonLabel": "No promocionar campañas de crowdfunding", + "admin_removeDonateButtonHint": "El desarrollo de CryptPad está parcialmente financiado por subvenciones públicas y donaciones. Publicitar nuestros esfuerzos de crowdfunding en tu instancia ayuda a los desarrolladores a continuar mejorando la plataforma para todos, pero puedes desactivar estos avisos si los consideras inapropiados.", + "admin_removeDonateButtonTitle": "Participación Crowdfunding", "admin_listMyInstanceLabel": "Listar esta instancia", - "admin_listMyInstanceHint": "Si tu instancia es adecuada para el uso público puedes consentir a que sea enlistada en los directorios de la red. La telemetría del servidor debe estar activada para que esto tenga algún efecto.", - "admin_listMyInstanceTitle": "Listar mi instancia en los directorios públicos", - "admin_consentToContactLabel": "Consiento", - "admin_consentToContactHint": "La telemetría del servidor incluye el correo de contacto del administrador/a para que así los/as desarrolladores/as puedan notificarte de problemas serios con el software o tu configuración. Nunca será compartido, vendido, o usado por razones de marketing. Consiente al contacto si te gustaría estar informado/a de problemas críticos en tu servidor.", + "admin_listMyInstanceHint": "Si tu instancia es adecuada para el uso público puedes aceptar que sea enlistada en los directorios de la red. La telemetría del servidor debe estar activada para que esto tenga efecto.", + "admin_listMyInstanceTitle": "Listar mi instancia en directorios públicos", + "admin_consentToContactLabel": "Acepto", + "admin_consentToContactHint": "La telemetría del servidor incluye el correo electrónico de contacto del administrador para que los desarrolladores puedan notificarte sobre problemas graves con el software o la configuración. Nunca será compartido, vendido ni utilizado con fines de marketing. Acepta para ser contactado si deseas ser informado de problemas críticos en tu servidor.", "calendar_nth_5": "quinto", "calendar_nth_last": "último", "calendar_rec_monthly_nth": "Cada {0} {1} del mes", From b0db6ce9396143db28b62f0aba4f11ad5ddd297b Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 11 Jul 2024 07:53:41 +0200 Subject: [PATCH 018/188] Translated using Weblate (Spanish (Cuba)) Currently translated at 63.3% (1128 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 52.7% (939 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 37.7% (672 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 27.0% (481 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 20.8% (372 of 1780 strings) Co-authored-by: Raul Gonzalez Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es_CU/ Translation: CryptPad/App --- www/common/translations/messages.es_CU.json | 1073 ++++++++++++++++++- 1 file changed, 1072 insertions(+), 1 deletion(-) diff --git a/www/common/translations/messages.es_CU.json b/www/common/translations/messages.es_CU.json index 6766c6e6f..ad364ba5f 100644 --- a/www/common/translations/messages.es_CU.json +++ b/www/common/translations/messages.es_CU.json @@ -77,5 +77,1076 @@ "support_warning_bug": "Por favor, especifica en qué navegador ocurre el problema y si hay alguna extensión instalada. Proporciona la mayor cantidad de detalles posible sobre el problema y los pasos necesarios para reproducirlo", "support_warning_abuse": "Por favor, reporta el contenido que viola los Terminos de Servicios. Por favor, proporciona enlaces a los documentos ofensivos o perfiles de usuario y describe cómo están violando los términos. Cualquier información adicional sobre el contexto en el que descubriste el contenido o comportamiento puede ayudar a los administradores a prevenir futuras violaciones", "admin_infoNotice1": "Utiliza los siguientes campos para describir tu instancia. Esta información se utiliza en la página principal de la instancia. También se envía como parte de la telemetría del servidor si optas por incluirte en la lista de instancias públicas de CryptPad.", - "admin_enableDiskMeasurementsHint": "Si está habilitado, se expondrá un punto final de API JSON debajo de/api/profiling. Esto mantiene una medición continua de la entrada/salida de disco dentro del intervalo de tiempo establecido a continuación. Esta configuración puede afectar el rendimiento del servidor y puede revelar datos sensibles. Se recomienda que dejes esta configuración desactivada a menos que sepas lo que estás haciendo." + "admin_enableDiskMeasurementsHint": "Si está habilitado, se expondrá un punto final de API JSON debajo de/api/profiling. Esto mantiene una medición continua de la entrada/salida de disco dentro del intervalo de tiempo establecido a continuación. Esta configuración puede afectar el rendimiento del servidor y puede revelar datos sensibles. Se recomienda que dejes esta configuración desactivada a menos que sepas lo que estás haciendo.", + "canvas_clear": "Limpiar", + "type": { + "pad": "Texto enriquecido", + "code": "Código", + "poll": "Encuesta", + "kanban": "Kanban", + "slide": "Diapositivas en Markdown", + "drive": "CryptDrive", + "whiteboard": "Pizarra", + "file": "Archivo", + "media": "Medios", + "todo": "Todo", + "contacts": "Contactos", + "sheet": "Hoja", + "form": "Formulario", + "doc": "Documento", + "presentation": "Presentación", + "diagram": "Diagrama", + "teams": "Equipos" + }, + "typeError": "Este documento no es compatible con la aplicación seleccionada", + "padNotPinned": "Este documento caducará después de 3 meses de inactividad, {0}iniciar sesión{1} o {2}registro{3} para preservarlo.", + "anonymousStoreDisabled": "El administrador de esta instancia de CryptPad ha deshabilitado el almacenamiento para invitados. Inicia sesión para acceder a tu propio CryptDrive.", + "expiredError": "Este documento ha llegado a su fecha de destrucción y ya no está disponible.", + "deletedError": "Este documento ha sido eliminado y ya no está disponible.", + "invalidHashError": "El documento que has solicitado tiene una URL no válida.", + "errorCopy": " Aún puede usar la versión actual en modo de solo lectura presionando Esc.", + "errorRedirectToHome": "Aún puedes usar la versión actual en modo de solo lectura presionando Esc.", + "newVersionError": "Una nueva versión de CryptPad está disponible.
Recargar para usar la nueva versión, o presione escape para acceder a su contenido en modo sin conexión.", + "loading": "Cargando...", + "error": "Error", + "saved": "Guardado", + "deleted": "Eliminado", + "deletedFromServer": "Documento destruido", + "mustLogin": "Debes iniciar sesión para acceder a esta página", + "realtime_unrecoverableError": "Se ha producido un error irrecuperable. Haga clic en Aceptar para recargar.", + "disconnected": "Desconectado", + "synchronizing": "Sincronizando", + "reconnecting": "Reconectando", + "typing": "Editando", + "initializing": "Inicializando...", + "uploadFolderButton": "Subir carpeta", + "uploadButtonTitle": "Sube un nuevo archivo a tu CryptDrive", + "saveTemplateButton": "Guardar como plantilla", + "templateSaved": "¡Plantilla guardada!", + "selectTemplate": "Seleccione una plantilla o presione Escape", + "useTemplate": "¿Comenzar con una plantilla?", + "useTemplateOK": "Elige una plantilla (Enter)", + "useTemplateCancel": "Comenzar desde cero (Esc)", + "template_import": "Importar una plantilla", + "previewButtonTitle": "Mostrar u ocultar el modo de vista previa de Markdown", + "presentButtonTitle": "Ingrese al modo de presentación", + "colorButtonTitle": "Cambiar el color del texto en modo presentación", + "propertiesButton": "Propiedades", + "propertiesButtonTitle": "Obtener propiedades del documento", + "printText": "Imprimir", + "printButton": "Imprimir (enter)", + "printButtonTitle2": "Imprima su documento o expórtelo como un archivo PDF", + "printOptions": "Opciones de diseño", + "printSlideNumber": "Mostrar el número de diapositiva", + "printDate": "Mostrar la fecha", + "printCSS": "Reglas de estilo personalizadas (CSS):", + "printTransition": "Habilitar animaciones de transición", + "printBackgroundButton": "Elige una imagen", + "printBackgroundValue": "Fondo actual: {0}", + "printBackgroundNoValue": "No se muestra ninguna imagen de fondo", + "printBackgroundRemove": "Eliminar esta imagen de fondo", + "filePicker_close": "Cerrar", + "filePicker_description": "Elija un archivo de su CryptDrive para incrustarlo o cargue uno nuevo", + "filePicker_filter": "Filtrar archivos por nombre", + "tags_title": "Etiquetas (solo para ti)", + "tags_notShared": "Tus etiquetas no son compartidas con otros usuarios", + "tags_duplicate": "Etiqueta duplicada: {0}", + "tags_noentry": "No puedes etiquetar un documento eliminado", + "slideOptionsText": "Opciones", + "slideOptionsTitle": "Personaliza tus diapositivas", + "languageButton": "Idioma", + "languageButtonTitle": "Seleccione el idioma a utilizar para el resaltado de sintaxis", + "themeButton": "Tema", + "editShare": "Enlace de edición", + "viewShare": "Enlace de solo lectura", + "fileEmbedScript": "Para incrustar este archivo, incluye este script una vez en tu página para cargar la etiqueta de medios:", + "fileEmbedTag": "Luego coloca esta etiqueta de medios en tu página donde desees incrustar:", + "notifyJoined": "{0} se ha unido a la sesión colaborativa", + "notifyRenamed": "{0} ahora se conoce como {1}", + "notifyLeft": "{0} ha abandonado la sesión colaborativa", + "ok": "OK", + "okButton": "OK (enter)", + "cancel": "Cancelar", + "cancelButton": "Cancelar (esc)", + "show_help_button": "Mostrar ayuda", + "help_button": "Ayuda", + "historyText": "Historia", + "historyButton": "Mostrar el historial del documento", + "history_next": "Próxima versión", + "history_prev": "Versión previa", + "history_closeTitle": "Cerrar el historial", + "history_restoreTitle": "Restaurar la versión seleccionada del documento", + "history_restoreDone": "Documento restaurado", + "openLinkInNewTab": "Abrir enlace en una nueva pestaña", + "pad_mediatagWidth": "Ancho (px)", + "pad_mediatagHeight": "Altura (px)", + "pad_mediatagRatio": "Mantener la proporción", + "pad_mediatagBorder": "Ancho del borde (px)", + "pad_mediatagPreview": "Vista previa", + "pad_mediatagOptions": "Propiedades de la imagen", + "kanban_newBoard": "Nuevo tablero", + "kanban_item": "Elemento {0}", + "kanban_todo": "Hacer", + "kanban_done": "Terminado", + "kanban_working": "En progreso", + "kanban_addBoard": "Añadir un tablero", + "poll_publish_button": "Publicar", + "poll_create_user": "Agregar un nuevo usuario", + "poll_create_option": "Agregar una nueva opción", + "poll_commit": "Enviar", + "poll_userPlaceholder": "Tú nombre", + "poll_removeOption": "¿Estás seguro de que deseas eliminar esta opción?", + "poll_remove": "Eliminar", + "poll_edit": "Editar", + "poll_locked": "Bloqueado", + "poll_unlocked": "Desbloqueado", + "poll_bookmark_col": "Marca esta columna para que siempre esté desbloqueada y se muestre al principio para ti", + "poll_bookmarked_col": "Esta es tu columna marcada. Siempre estará desbloqueada y se mostrará al principio para ti.", + "poll_total": "TOTAL", + "poll_comment_list": "Comentarios", + "poll_comment_add": "Añadir un comentario", + "poll_comment_submit": "Enviar", + "poll_comment_remove": "Eliminar este comentario", + "poll_comment_placeholder": "Tú comentario", + "poll_comment_disabled": "Publique esta encuesta usando el botón ✓ para habilitar los comentarios.", + "oo_reconnect": "La conexión del servidor ha vuelto. Haga clic en Aceptar para recargar y continuar con la edición.", + "oo_cantUpload": "No se permite la carga mientras otros usuarios estén presentes.", + "canvas_delete": "Eliminar selección", + "canvas_width": "Ancho", + "canvas_opacity": "Opacidad", + "canvas_opacityLabel": "Opacidad: {0}", + "canvas_widthLabel": "Ancho: {0}", + "canvas_saveToDrive": "Guarde esta imagen como un archivo en su CryptDrive", + "canvas_currentBrush": "Pincel actual", + "canvas_imageEmbed": "Inserta una imagen desde tu computadora", + "profile_uploadSizeError": "Error: tu avatar debe ser más pequeño que {0}", + "profile_error": "Error al crear tu perfil: {0}", + "profile_register": "¡Tienes que registrarte para crear un perfil!", + "profile_viewMyProfile": "Ver mi perfil", + "userlist_addAsFriendTitle": "Enviar \"{0}\"una solicitud de contacto", + "contacts_title": "Contactos", + "contacts_added": "Invitación de contacto aceptada.", + "contacts_rejected": "Invitación de contacto rechazada", + "contacts_send": "Enviar", + "contacts_remove": "Eliminar este contacto", + "contacts_confirmRemove": "Estás seguro de que desea eliminar {0} de tus contactos?", + "contacts_typeHere": "Escriba un mensaje aquí...", + "contacts_padTitle": "Chat", + "contacts_info1": "Estos son tus contactos. Desde aquí podrás:", + "contacts_info2": "Haga clic en el icono de su contacto para chatear con ellos", + "contacts_info3": "Haga doble clic en su icono para ver su perfil", + "contacts_info4": "Cualquiera de los participantes puede borrar permanentemente un historial de chat", + "contacts_removeHistoryTitle": "Limpiar el historial de chat", + "contacts_removeHistoryServerError": "Se produjo un error al eliminar tu historial de chat. Vuelve a intentarlo más tarde", + "contacts_fetchHistory": "Recuperar historial anterior", + "contacts_rooms": "Sala", + "contacts_leaveRoom": "Abandonar esta sala", + "contacts_online": "Otro usuario de esta sala está en línea", + "settings_resetThumbnailsAction": "Limpiar", + "settings_resetThumbnailsDescription": "Limpia todas las miniaturas de documentos almacenados en tu navegador.", + "settings_resetThumbnailsDone": "Todas las miniaturas han sido borradas.", + "settings_import": "Importar", + "settings_importDone": "Importación completada", + "settings_autostoreTitle": "Almacenamiento de documentos en CryptDrive", + "settings_autostoreYes": "Automático", + "settings_autostoreNo": "Manual (nunca pregunte)", + "settings_autostoreMaybe": "Manual (siempre pregunta)", + "settings_userFeedbackTitle": "Comentario", + "settings_userFeedbackHint1": "CryptPad proporciona algunos comentarios muy básicos al servidor para hacernos saber cómo mejorar su experiencia. ", + "settings_userFeedbackHint2": "El contenido de sus documentos nunca será compartido con el servidor.", + "settings_userFeedback": "Habilitar comentarios de los usuarios", + "settings_deleteTitle": "Eliminación de cuenta", + "settings_deleteButton": "Elimina tu cuenta", + "calendar_str_monthday": "en el {0}", + "calendar_str_until": "hasta {0}", + "calendar_rec_until_count": "Después", + "calendar_rec_monthly_pick": "En días", + "calendar_nth_3": "tercero", + "calendar_month_last": "ultimo día", + "calendar_nth_4": "cuarto", + "team_inviteUses": "Usos(s) permitido para este enlace (0 = no limit)", + "form_exportJSON": "Exportar a JSON", + "form_alreadyAnsweredMult": "Respondiste a este formulario en:", + "form_multiple": "Varias veces", + "team_linkUsesInfinite": "(usos ilimitados)", + "og_pricing": "{0} Precios", + "og_features": "{0} Características", + "og_encryptedAppType": "Encriptado {0}", + "admin_documentConflict": "Archivar/restaurar", + "fm_filterBy": "Filtrar", + "fm_rmFilter": "Remover filtro", + "calendar_rec": "Repetir", + "calendar_rec_no": "En tiempo", + "calendar_rec_updated": "Regla actualizada el {0}", + "calendar_rec_daily": "Diario", + "calendar_rec_stop": "Parar de repetir", + "calendar_rec_weekly": "Semanalmente en {0}", + "calendar_rec_edit_all": "Editar todos los eventos", + "calendar_rec_monthly": "Mensual, día {1}", + "calendar_rec_edit_from": "Editar eventos futuros", + "calendar_rec_yearly": "Anualmente en {2}", + "calendar_rec_edit_one": "Editar solo este evento", + "calendar_rec_weekend": "Diariamente los fines de semana", + "calendar_rec_edit": "Este es un evento repetido", + "calendar_str_filter_day": "Días: {0}", + "calendar_rec_weekdays": "Diariamente los fines de semana", + "calendar_str_filter_monthday": "Días del mes: {0}", + "calendar_rec_custom": "Perzonalizado", + "calendar_str_filter_yearday": "Días del año: {0}", + "calendar_str_filter_weekno": "Semanas: {0}", + "calendar_str_filter_month": "Meses: {0}", + "calendar_rec_txt": "Repetir cada", + "admin_onboardingDescPlaceholder": "Texto de descripción de instancia", + "form_editable_off": "Solo una vez", + "form_editable_str": "Envío", + "og_contact": "{0} Contacto", + "ui_jsRequired": "JavaScript debe estar habilitado para realizar la encriptación en tu navegador", + "admin_conflictExplanation": "Existen dos versiones de este documento. Restaurar la versión archivada sobrescribirá la versión activa. Archivar la versión en vivo sobrescribirá la versión archivada. Ninguna acción se puede deshacer.", + "calendar_str_filter": "Filtros:", + "calendar_rec_freq_daily": "días", + "calendar_rec_freq_weekly": "semanas", + "calendar_rec_freq_monthly": "meses", + "calendar_str_for": "para {0} veces", + "calendar_str_nthdayofmonth": "en el {0} de {1}", + "calendar_rec_freq_yearly": "años", + "calendar_rec_until": "Parar de repetir", + "calendar_rec_until_no": "Nunca", + "calendar_str_day": "en {0}", + "calendar_rec_until_date": "En", + "calendar_str_daily": "{0} día(s)", + "calendar_rec_until_count2": "veces", + "calendar_str_weekly": "{0} semana(s)", + "calendar_str_monthly": "{0} meses(s)", + "calendar_str_yearly": "{0} año(s)", + "calendar_nth_1": "primero", + "calendar_list_end": "{0} o {1}", + "calendar_nth_2": "segundo", + "calendar_list": "{0}, {1}", + "calendar_rec_every_date": "Cada {0}", + "calendar_rec_yearly_nth": "Cada {0} {1} de {2}", + "calendar_rec_monthly_nth": "Cada {0} {1} del mes", + "calendar_nth_last": "último", + "calendar_nth_5": "quinto", + "calendar_rec_warn_del": "Este evento ya no se repetirá. Se eliminarán eventos futuros.", + "calendar_rec_warn_delall": "Este evento ya no se repetirá. El primer evento en {0} Se mantendrán, todos los demás serán eliminados.", + "calendar_rec_warn_update": "La regla para repetir este evento fue modificada. Los eventos futuros serán reemplazados.", + "calendar_rec_warn_updateall": "La regla de repetición para este evento fue modificada. El rimer evento en {0} se mantendrá, todos los otros serán remplazados.", + "calendar_removeNotification": "Eliminar recordatorio", + "team_inviteRole": "Rol inicial", + "form_responseNotification": "Nuevas respuestas al formulario: {0}", + "form_deleteAll": "Eliminar todo", + "form_answer_new": "Enviar de nuevo", + "form_allowNotifications": "Notificaciones para nuevas respuestas", + "form_editable_on_del": "Una vez y edita/elimina", + "form_multiple_edit": "Varias veces y edita/elimina", + "team_linkUses": "({0}/{1} recordatorio)", + "form_anonymized": "Las respuestas son anónimas", + "main_title": "CryptPad: conocimiento cero, edición colaborativa en tiempo real", + "padNotPinnedVariable": "Este documento caducará después {4} días de inactividad, {0}{1} o {2}registro{3} para preservarlo.", + "chainpadError": "Se produjo un error crítico al actualizar su contenido. Esta página está en modo de solo lectura para garantizar que no pierda su trabajo.
Presione Esc para continuar viendo este documento o vuelva a cargarlo para intentar editarlo nuevamente.", + "form_settingsButton": "Configuraciones de formulario", + "form_editable_on": "Una vez y editar", + "onLogout": "Estás desconectado, {0}haga clic aquí{1} para iniciar sesión en
o presione Esc para acceder a tu documento en el modo de solo lectura.", + "disabledApp": "Esta aplicación ha sido deshabilitada. Póngase en contacto con el administrador de este CryptPad para obtener más información.", + "common_connectionLost": "Conexión del servidor perdida
Ahora estás en modo de solo lectura hasta que se restablezca la conexión.", + "inactiveError": "Este documento ha sido eliminado por inactividad. Presione Esc para crear un nuevo documento.", + "uploadButton": "Subir archivos", + "saveTemplatePrompt": "Elige un título para la plantilla", + "template_empty": "No hay plantilla disponible", + "backgroundButtonTitle": "Cambiar el color de fondo en la presentación", + "printTitle": "Mostrar el título del documento", + "printBackground": "Usa una imagen de fondo", + "filePickerButton": "Incrustar un archivo almacenado en CryptDrive", + "tags_add": "Actualizar las etiquetas de los documentos seleccionados", + "slide_invalidLess": "Estilo personalizado no válido", + "themeButtonTitle": "Seleccione el tema de color que desea utilizar para los editores de código y diapositivas", + "viewEmbedTag": "Para insertar este documento, incluya este iframe en su página donde desee. Puedes diseñarlo usando atributos CSS o HTML.", + "history_loadMore": "Cargar más historial", + "history_restorePrompt": "¿Está seguro de que desea reemplazar la versión actual del documento con la versión mostrada?", + "pad_mediatagImport": "Guardar en tu CryptDrive", + "poll_optionPlaceholder": "Opción", + "poll_removeUser": "¿Estás seguro de que deseas eliminar a este usuario?", + "poll_descriptionHint": "Describe tu encuesta y usa el botón ✓ (publicar) cuando hayas terminado.\nLa descripción se puede escribir utilizando la sintaxis de rebajas y puede incrustar elementos multimedia desde su CryptDrive.\nCualquiera con el enlace puede cambiar la descripción, pero esto no se recomienda.", + "oo_uploaded": "Tu carga se ha completado. Haga clic en Aceptar para recargar la página o cancelar para continuar en modo de solo lectura.", + "profile_upload": " Sube un nuevo avatar", + "contacts_request": "{0} Me gustaría agregarte como contacto.Aceptar?", + "contacts_warning": "Todo lo que escriba aquí es persistente y está disponible para todos los usuarios actuales y futuros de este documento. ¡Cuidado con la información sensible!", + "contacts_confirmRemoveHistory": "¿Estás seguro de que deseas eliminar permanentemente tu historial de chat? Los datos no se pueden restaurar", + "settings_importTitle": "Importe los documentos recientes de este navegador a su CryptDrive", + "settings_autostoreHint": "Automatico Todos los documentos que visitas se almacenan en tu CryptDrive.
Manual (siempre pregunta) If aún no ha almacenado un documento, se le preguntará si desea almacenarlo en su CryptDrive.
Manual (nunca pregunte) Los documentos no se almacenan automáticamente en su CryptDrive. La opción para almacenarlos quedará oculta.", + "pad_mediatagTitle": "Configuración de etiquetas de medios", + "profileButton": "Perfil", + "profile_uploadTypeError": "Error: tu tipo de avatar no está permitido. Los tipos permitidos son: {0}", + "settings_disableThumbnailsDescription": "Las miniaturas se crean y almacenan automáticamente en tu navegador cuando visitas un nuevo documento. Puedes deshabilitar esta función aquí.", + "settings_deleteHint": "La eliminación de la cuenta es permanente. Su CryptDrive y su lista de documentos se eliminarán del servidor. El resto de sus documentos se eliminarán en 90 días si nadie más los ha almacenado en su CryptDrive.", + "settings_deleteModal": "Comparte la siguiente información con el administrador de tu CryptPad para que tus datos sean eliminados de su servidor.", + "settings_deleted": "Su cuenta de usuario ahora está eliminada. Presione Aceptar para ir a la página de inicio.", + "settings_anonymous": "No has iniciado sesión. Las configuraciones aquí son específicas de este navegador.", + "settings_ownDriveConfirm": "Actualizar su cuenta puede llevar algún tiempo. Deberá volver a iniciar sesión en todos sus dispositivos. ¿Está seguro?", + "settings_logoutEverywhereButton": "Cerrar sesión", + "settings_logoutEverywhere": "Salir de todas las demás sesiones web", + "settings_logoutEverywhereConfirm": "¿Está seguro? Deberá iniciar sesión con todos sus dispositivos.", + "settings_driveDuplicateTitle": "Documentos de propiedad duplicados", + "settings_driveDuplicateLabel": "Ocultar duplicados", + "settings_codeIndentation": "Indentación del editor de código (espacios)", + "settings_codeUseTabs": "Indentar usando tabulaciones (en lugar de espacios)", + "settings_codeFontSize": "Tamaño de fuente en el editor de código", + "settings_padWidth": "Ancho máximo del editor", + "settings_padWidthHint": "Cambiar entre el modo de página (predeterminado) que limita el ancho del editor de texto y el uso de todo el ancho de la pantalla.", + "settings_padWidthLabel": "Reducir el ancho del editor", + "settings_padSpellcheckTitle": "Corrector ortográfico", + "settings_padSpellcheckLabel": "Habilite el corrector ortográfico en documentos de texto enriquecido", + "settings_padOpenLinkTitle": "Abrir enlaces con el primer clic", + "settings_padOpenLinkHint": "Con esta opción puede abrir enlaces incrustados al hacer clic sin la ventana emergente de vista previa", + "settings_padOpenLinkLabel": "Habilitar apertura de enlace directo", + "settings_ownDriveTitle": "Actualizar cuenta", + "settings_ownDriveButton": "Actualiza tu cuenta", + "settings_ownDrivePending": "Su cuenta se está actualizando. No cierre ni vuelva a cargar esta página hasta que se haya completado el proceso.", + "settings_changePasswordTitle": "Cambia tu contraseña", + "mdToolbar_help": "Ayuda", + "mdToolbar_tutorial": "https://www.markdowntutorial.com/", + "mdToolbar_bold": "Negrita", + "mdToolbar_italic": "Itálica", + "mdToolbar_strikethrough": "Tachado", + "mdToolbar_link": "Enlace", + "mdToolbar_quote": "Cita", + "mdToolbar_nlist": "Lista ordenada", + "mdToolbar_list": "Lista de viñetas", + "mdToolbar_check": "Lista de tareas", + "mdToolbar_toc": "Tabla de contenido", + "main_catch_phrase": "Suite de colaboración
cifrada de extremo a extremo y de código abierto", + "about": "Acerca de", + "privacy": "Política de privacidad", + "contact": "Contacto", + "terms": "Términos de servicio", + "features": "Características", + "features_anon": "Invitado", + "features_registered": "Registrado", + "features_premium": "Premium", + "features_f_apps": "Acceso a todas las aplicaciones", + "features_f_core": "Características comunes", + "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_storage0": "Tiempo de almacenamiento limitado", + "features_f_storage0_note": "Los documentos se eliminan después{0} días de inactividad", + "features_f_anon": "Todas las características para usuarios invitados", + "features_f_anon_note": "Con funcionalidad adicional", + "features_f_cryptdrive1": "Funcionalidad completa de CryptDrive", + "features_f_cryptdrive1_note": "Carpetas, carpetas compartidas, plantillas, etiquetas", + "features_f_devices": "Tus documentos en todos tus dispositivos", + "features_f_social": "Funciones sociales", + "features_f_social_note": "Agregue contactos para una colaboración segura, cree un perfil y controles de acceso detallados", + "features_f_file1": "Subir y compartir archivos", + "features_f_storage1": "Almacenamiento personal ({0})", + "features_f_storage1_note": "Los documentos almacenados en su CryptDrive no se eliminan por inactividad", + "features_f_register": "Registrate gratis", + "features_f_reg": "Todas las funciones de usuario registrado", + "features_f_reg_note": "Con beneficios adicionales", + "features_f_storage2": "Espacio de almacenamiento adicional", + "features_f_support": "Soporte más rápido", + "features_f_support_note": "Respuesta prioritaria del equipo de administración a través de correo electrónico y sistema integrado de tickets", + "features_f_supporter": "Privacidad de soporte", + "four04_pageNotFound": "No pudimos encontrar la página que estabas buscando.", + "header_logoTitle": "Vaya a su CryptDrive", + "header_homeTitle": "Ir a la página de inicio de CryptPad", + "edit": "editar", + "view": "vista", + "feedback_about": "Si estás leyendo esto, probablemente tengas curiosidad por saber por qué CryptPad solicita páginas web cuando realizas determinadas acciones.", + "feedback_optout": "Si desea darse de baja, visite su página de configuración de usuario, donde encontrará una casilla de verificación para habilitar o deshabilitar los comentarios de los usuarios.", + "creation_404": "Este documento ya no existe. Utilice el siguiente formulario para crear un nuevo documento.", + "creation_owned": "Documento de propiedad", + "creation_expire": "Documento vencido", + "creation_expireFalse": "Ilimitado", + "creation_expireHours": "Hora(s)", + "creation_expireDays": "Día(s)", + "creation_expireMonths": "Mes(s)", + "creation_password": "Contraseña\n", + "creation_noTemplate": "Documento en blanco", + "creation_newTemplate": "Nueva plantilla", + "creation_create": "Crear", + "creation_owners": "Propietarios", + "creation_noOwner": "Sin propetario", + "creation_expiration": "Fecha de destrucción", + "creation_passwordValue": "Contraseña", + "settings_publicSigningKey": "Clave de firma pública", + "settings_driveDuplicateHint": "Cuando mueve sus documentos de propiedad a una carpeta compartida, se guarda una copia en su CryptDrive para garantizar que mantenga el control sobre ella. Puede ocultar archivos duplicados. Sólo la versión compartida será visible, a menos que se elimine, en cuyo caso el original se mostrará en su ubicación anterior.", + "settings_padSpellcheckHint": "Esta opción le permite habilitar el corrector ortográfico en documentos de texto enriquecido. Los errores de ortografía se subrayarán en rojo y tendrás que mantener presionada la tecla Ctrl o Meta mientras haces clic derecho para ver las opciones correctas.", + "settings_ownDriveHint": "Las cuentas más antiguas no tienen acceso a las funciones más recientes por motivos técnicos. Una actualización gratuita habilitará las funciones actuales y preparará su CryptDrive para futuras actualizaciones.", + "home_host": "Esta es una instancia comunitaria independiente de CryptPad.", + "features_title": "Características", + "features_f_core_note": "Editar, importar y exportar, historial, lista de usuarios, chat", + "features_f_cryptdrive0_note": "Posibilidad de almacenar los documentos visitados en su navegador para poder abrirlos más tarde", + "features_f_devices_note": "Accede a tu CryptDrive desde cualquier lugar con tu cuenta de usuario", + "features_f_storage2_note": "De 5 GB a 50 GB según el plan, límite aumentado de {0} MB para carga de archivos", + "features_f_supporter_note": "Ayude a CryptPad a ser financieramente sostenible y demuestre que el software de mejora de la privacidad financiado voluntariamente por los usuarios debería ser la norma", + "features_f_subscribe_note": "Se necesita una cuenta registrada para suscribirse", + "help_genericMore": "Aprende más sobre cómo CryptPad puede funcionar para ti leyendo nuestroDocumentación", + "feedback_privacy": "Nos preocupamos por tu privacidad y al mismo tiempo queremos que CryptPad sea muy fácil de usar. Usamos este archivo para determinar qué características de la interfaz de usuario son importantes para nuestros usuarios, solicitándolo junto con un parámetro que especifica qué acción se tomó.", + "mdToolbar_defaultText": "Tu texto aquí", + "features_f_file1_note": "Almacene archivos en su CryptDrive: imágenes, archivos PDF, videos y más. Compártelos con tus contactos o incrústalos en tus documentos. (hasta {0}MB)", + "features_f_subscribe": "Suscribirse", + "creation_owned1": "Una propiedad El artículo puede destruirse cuando el propietario lo desee. Destruir un elemento de propiedad hace que no esté disponible en los CryptDrives de otros usuarios.", + "settings_logoutEverywhereTitle": "Cerrar sesiones remotas", + "mdToolbar_heading": "Encabezado", + "mdToolbar_code": "Código", + "fc_hashtag": "Etiquetas", + "forgotten": "Moviendo a la papelera", + "errorState": "Error crítico: {0}", + "readonly": "Solo lectura", + "anonymous": "Invitado", + "users": "Usuarios", + "viewer": "espectador", + "viewers": "espectadores", + "editor": "editor", + "userlist_offline": "Actualmente estás desconectado, la lista de usuarios no está disponible.", + "upgradeAccount": "Actualizar cuenta", + "storageStatus": "Almacenamiento:
{0} usado fuera de {1}", + "MB": "MB", + "GB": "GB", + "formattedMB": "{0} MB", + "formattedGB": "{0} GB", + "pinLimitReached": "Has alcanzado tu límite de almacenamiento", + "pinLimitReachedAlert": "Has alcanzado tu límite de almacenamiento. Los documentos nuevos no se almacenarán en su CryptDrive.
Puede eliminar documentos de su CryptDrive o suscribirse a una oferta premium para aumentar su límite.", + "pinLimitReachedAlertNoAccounts": "Has alcanzado tu límite de almacenamiento", + "pinLimitNotPinned": "Has alcanzado tu límite de almacenamiento.
Este documento no está almacenado en tu CryptDrive.", + "pinLimitDrive": "Has alcanzado tu límite de almacenamiento.
No puedes crear nuevos documentos.", + "importButton": "Importar", + "importButtonTitle": "Importar un documento desde un archivo local", + "exportButton": "Exportar", + "exportButtonTitle": "Exportar este documento a un archivo local", + "exportPrompt": "¿Cómo le gustaría nombrar su archivo?", + "user_rename": "Cambiar nombre para mostrar", + "user_displayName": "Nombre para mostrar", + "user_accountName": "Nombre de la cuenta", + "clickToEdit": "Haz click para editar", + "saveTitle": "Guardar el título (enter)", + "forgetButton": "Eliminar", + "forgetPrompt": "Al hacer clic en Aceptar, este documento se moverá a la papelera. ¿Está seguro?", + "movedToTrash": "Este documento ha sido movido a la papelera.
Acceder a mi Unidad", + "shareButton": "Compartir", + "shareSuccess": "Enlace copiado al portapapeles", + "userListButton": "Lista de usuarios", + "chatButton": "Chat", + "userAccountButton": "Menú del Usuario", + "newButton": "Nuevo", + "newButtonTitle": "Crear un nuevo documento", + "fm_rootName": "Conducir", + "fm_trashName": "Basura", + "fm_filesDataName": "Todos los archivos", + "fm_templateName": "Plantillas", + "fm_searchName": "Buscar", + "fm_recentPadsName": "Reciente", + "fm_ownedPadsName": "Propiedad", + "fm_tagsName": "Etiquetas", + "fm_sharedFolderName": "Carpeta compartida", + "fm_newButton": "Nuevo", + "fm_newFolder": "Nueva carpeta", + "fm_newFile": "Nuevo documento", + "ui_more": "Más", + "fm_folder": "Carpeta", + "fm_sharedFolder": "Carpeta compartida", + "fm_folderName": "Nombre de la carpeta", + "fm_numberOfFolders": "# de carpetas", + "fm_numberOfFiles": "# de archivos", + "fm_fileName": "Nombre del archivo", + "fm_type": "Tipo", + "fm_lastAccess": "Ultimo acceso", + "fm_creation": "Creación", + "fm_forbidden": "Acción prohibida", + "fm_openParent": "Mostrar en la carpeta", + "fm_noname": "Documento sin titulo", + "fm_emptyTrashDialog": "¿Estás seguro de que quieres vaciar la papelera?", + "fm_removePermanentlyDialog": "¿Está seguro de que desea eliminar este elemento de su disco? Permanecerá en los discos de otros usuarios que lo hayan almacenado.", + "fm_deleteOwnedPad": "¿Está seguro de que desea destruir permanentemente este documento?", + "fm_restoreDialog": "¿Está seguro de que desea restaurar {0} a su ubicación anterior?", + "fm_unknownFolderError": "El directorio seleccionado o visitado por última vez ya no existe. Abriendo la carpeta principal...", + "fm_selectError": "No se puede seleccionar el elemento objetivo. Si el problema persiste, intenta recargar la página.", + "fm_categoryError": "No se puede abrir la categoría seleccionada, mostrando la raíz.", + "fm_info_root": "Crea tantas carpetas anidadas como desees aquí para organizar tus archivos.", + "fm_info_recent": "Estos documentos han sido abiertos o modificados recientemente por usted o por personas con las que colabora.", + "fm_info_trash": "Vacía tu papelera para liberar espacio en tu CryptDrive.", + "fm_info_sharedFolder": "Esta es una carpeta compartida. No has iniciado sesión, por lo que solo puedes acceder en modo de solo lectura.
Regístrate o Inicia sesión para poder importarlo a tu CryptDrive y modificarlo.", + "fm_error_cantPin": "Error Interno del Servidor. Vuelva a cargar la página e inténtelo de nuevo.", + "fm_viewListButton": "Vista de la lista", + "fm_viewGridButton": "Vista en cuadrícula", + "fm_canBeShared": "Esta carpeta se puede compartir", + "fm_prop_tagsList": "Etiquetas", + "fm_burnThisDriveButton": "Borre toda la información almacenada por CryptPad en su navegador", + "fm_padIsOwned": "Eres el propietario de este documento", + "fm_padIsOwnedOther": "Este documento es propiedad de otro usuario", + "fm_deletedPads": "Estos documentos ya no existen en el servidor, se eliminaron de su CryptDrive: {0}", + "fm_tags_name": "Nombre de etiqueta", + "fm_tags_used": "Número de usos", + "fm_restoreDrive": "Restablecer su disco a un estado anterior. Para obtener mejores resultados, evite realizar cambios en su disco hasta que se complete este proceso.", + "fm_passwordProtected": "Contraseña protegida", + "fc_newfolder": "Nueva carpeta", + "fc_newsharedfolder": "Nueva carpeta compartida", + "fc_rename": "Renombrar", + "fc_color": "Cambiar el color", + "fc_open": "Abierto", + "fc_open_ro": "Abierto (solo lectura)", + "fc_expandAll": "Expandir todo", + "fc_collapseAll": "Contraer todo", + "fc_delete": "Mover a la papelera", + "fc_delete_owned": "Destruir", + "fc_restore": "Restaurar", + "fc_remove": "Eliminar", + "fc_remove_sharedfolder": "Eliminar", + "fc_empty": "Vaciar la papelera", + "fc_prop": "Propiedades", + "fo_moveUnsortedError": "No puedes mover una carpeta a la lista de plantillas", + "fo_moveFolderToChildError": "No puedes mover una carpeta a uno de sus descendientes", + "login_login": "Iniciar sesión", + "login_register": "Registrarse", + "logoutButton": "Cerrar sesión", + "settingsButton": "Ajustes", + "login_username": "Nombre de usuario", + "login_password": "Contraseña", + "login_confirm": "Confirmar la contraseña", + "login_hashing": "Encriptando tu contraseña, esto podría tomar un tiempo.", + "login_noSuchUser": "Usuario o contraseña invalido", + "login_invalUser": "Nombre de usuario requerido", + "register_importRecent": "Importe documentos de su sesión de invitado", + "register_acceptTerms": "Aceptolos términos de servicio", + "register_passwordsDontMatch": "¡Las contraseñas no coinciden!", + "register_mustAcceptTerms": "Debes aceptar los términos de servicio.", + "register_whyRegister": "¿Por qué registrarse?", + "register_header": "Registro", + "register_writtenPassword": "He anotado mi nombre de usuario y contraseña, proceda", + "register_cancel": "Cancelar", + "register_warning": "Advertencia", + "register_emailWarning0": "Parece que enviaste tu correo electrónico como tu nombre de usuario.", + "register_emailWarning1": "Puede hacerlo si lo desea, pero no se enviará a nuestro servidor.", + "register_emailWarning3": "Si comprende y desea utilizar su correo electrónico como nombre de usuario de todos modos, haga clic en Aceptar.", + "settings_cat_account": "Cuenta", + "settings_cat_drive": "CryptDrive", + "settings_cat_cursor": "Cursor", + "settings_cat_code": "Código", + "settings_cat_pad": "Texto enriquecido", + "settings_cat_subscription": "Suscripción", + "settings_title": "Ajustes", + "settings_save": "Guardar", + "settings_backupCategory": "Copia de seguridad", + "settings_backup": "Copia de seguridad", + "settings_restore": "Restaurar", + "settings_backup2": "Descargar mi CryptDrive", + "settings_backup2Confirm": "Esto descargará todos los documentos y archivos de su CryptDrive. Si desea continuar, elija un nombre y presione OK", + "settings_exportTitle": "Exporta tu CryptDrive", + "settings_exportDescription": "Espere mientras descargamos y desciframos sus documentos. Esto puede tomar unos pocos minutos. Cerrar la pestaña interrumpirá el proceso.", + "settings_exportFailed": "Si un documento requiere más de 1 minuto para descargarse, no se incluirá en la exportación. Se mostrará un enlace a cualquier documento que no haya sido exportado.", + "settings_exportCancel": "¿Está seguro de que desea cancelar la exportación? La próxima vez tendrás que empezar de nuevo desde el principio.", + "settings_export_reading": "Leyendo tu CryptDrive...", + "settings_export_download": "Descargando y descifrando sus documentos...", + "settings_export_compressing": "Comprimiendo datos...", + "settings_export_done": "¡Tu descarga esta lista!", + "settings_exportError": "Ver errores", + "settings_exportErrorDescription": "No pudimos agregar los siguientes documentos a la exportación:", + "settings_exportErrorEmpty": "Este documento no se puede exportar (contenido vacío o no válido).", + "settings_exportErrorMissing": "Este documento no se encuentra en nuestros servidores (caducado o eliminado por su propietario)", + "settings_exportErrorOther": "Se produjo un error al intentar exportar este documento: {0}", + "settings_resetNewTitle": "Limpiar CryptoDrive", + "settings_resetButton": "Limpiar CryptoDrive", + "settings_reset": "Elimina todos los archivos y carpetas de tu CryptDrive", + "settings_resetPrompt": "Esta acción eliminará todos los documentos de su disco.
¿Está seguro de que desea continuar?
Escriba “Me encanta CryptPad” para confirmar.", + "settings_resetDone": "¡Tu disco ahora está vacío!", + "settings_resetError": "Texto de verificación incorrecto. Su CryptDrive no ha sido modificado.", + "settings_resetTipsAction": "Reiniciar", + "settings_resetTips": "Consejos", + "settings_resetTipsButton": "Restablecer los consejos disponibles en CryptDrive", + "settings_resetTipsDone": "Todos los consejos ahora son visibles nuevamente.", + "settings_thumbnails": "Miniaturas", + "settings_disableThumbnailsAction": "Deshabilite la creación de miniaturas en su CryptDrive", + "settings_importConfirm": "¿Está seguro de que desea importar documentos recientes desde este navegador al CryptDrive de su cuenta de usuario?", + "settings_changePasswordHint": "Cambie la contraseña de su cuenta. Ingrese su contraseña actual y confirme la nueva contraseña escribiéndola dos veces.
No podemos restablecer su contraseña si la olvida, ¡así que tenga mucho cuidado!", + "settings_changePasswordButton": "Cambiar la contraseña", + "settings_changePasswordCurrent": "Contraseña actual", + "settings_changePasswordNew": "Nueva contraseña", + "settings_changePasswordNewConfirm": "Confirmar nueva contraseña", + "settings_changePasswordConfirm": "¿Estás seguro de que quieres cambiar tu contraseña? Deberá volver a iniciar sesión en todos sus dispositivos.", + "KB": "kB", + "formattedKB": "{0} kB", + "fm_searchPlaceholder": "Buscar...", + "fm_originalPath": "Ruta original", + "fm_deleteOwnedPads": "¿Está seguro de que desea destruir permanentemente estos documentos?", + "fm_contextMenuError": "No se puede abrir el menú contextual para ese elemento. Si el problema persiste, intenta recargar la página.", + "settings_exportWarning": "Nota: esta herramienta aún se encuentra en una versión beta y puede tener problemas de escalabilidad. Para un mejor rendimiento, se recomienda dejar esta pestaña enfocada.", + "language": "Idioma", + "upgrade": "Mejora", + "fm_newButtonTitle": "Cree un nuevo documento o carpeta, importe un archivo en la carpeta actual.", + "fm_removeSeveralPermanentlyDialog": "¿Está seguro de que desea eliminar estos {0} elementos de su disco? Permanecerán en los discos de otros usuarios que los hayan almacenado.", + "fm_info_template": "Estos documentos se almacenan como plantillas. Se pueden reutilizar al crear nuevos documentos.", + "fm_info_anonymous": "No ha iniciado sesión, por lo que sus documentos caducarán después de {0} días. Borrar el historial de tu navegador puede hacer que desaparezcan.
Regístrate (no se requiere información personal) o Inicia sesión para almacenarlos en su disco indefinidamente. Lea más sobre las cuentas registradas.", + "fm_info_owned": "Usted es el propietario de los documentos aquí mostrados. Esto significa que puedes eliminarlos permanentemente del servidor cuando quieras. Si lo hace, otros usuarios ya no podrán acceder a ellos.", + "fm_renamedPad": "Ha establecido un nombre personalizado para este documento. Su título compartido es:
{0}", + "fo_existingNameError": "Nombre ya utilizado en ese directorio. Por favor elije otro.", + "fo_unavailableName": "Ya existe un archivo o una carpeta con el mismo nombre en la nueva ubicación. Cambie el nombre del elemento e inténtelo de nuevo.", + "login_unhandledError": "Ocurrió un error inesperado :(", + "register_passwordTooShort": "Las contraseñas deben tener al menos {0} caracteres.", + "register_alreadyRegistered": "Este usuario ya existe, ¿quieres iniciar sesión?", + "settings_backupHint": "Haga una copia de seguridad o restaure todo el contenido de su CryptDrive. No contendrá el contenido de sus documentos, sólo las claves para acceder a ellos.", + "settings_backupHint2": "Descarga todos los documentos en tu disco. 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.", + "fm_burnThisDrive": "¿Está seguro de que desea eliminar todo lo almacenado por CryptPad en su navegador?
Esto eliminará su CryptDrive y su historial de su navegador, pero sus documentos seguirán existiendo (encriptados) en nuestro servidor.", + "fm_moveNestedSF": "No puede colocar una carpeta compartida dentro de otra. La carpeta {0} no se movió.", + "login_invalPass": "Se requiere contraseña", + "register_emailWarning2": "No podrá restablecer su contraseña utilizando su correo electrónico como puede hacerlo con muchos otros servicios.", + "todo_title": "CryptTodo", + "autostore_store": "Almacenar", + "team_pending": "Invitado", + "settings_changePasswordError": "Ocurrió un error inesperado. Si no puedes iniciar sesión o cambiar tu contraseña, contacta a los administradores de CryptPad.", + "settings_changePasswordPending": "Se está actualizando tu contraseña. Por favor, no cierres ni recargues esta página hasta que el proceso haya terminado.", + "settings_changePasswordNewPasswordSameAsOld": "Tu nueva contraseña debe ser diferente a tu contraseña actual.", + "settings_cursorColorTitle": "Color del cursor", + "settings_cursorColorHint": "Cambia el color asociado a tu usuario en documentos colaborativos.", + "settings_cursorShareTitle": "Compartir la posición de mi cursor", + "settings_cursorShareHint": "Puedes decidir si quieres que otros usuarios vean la posición de tu cursor en documentos colaborativos.", + "download_step2": "Desencriptando", + "settings_cursorShareLabel": "compartir la posición", + "settings_cursorShowTitle": "Mostrar la posición del cursor de otros usuarios", + "settings_cursorShowHint": "Puedes escoger si quieres ver el cursor de los otros usuarios en documentos colaborativos.", + "settings_cursorShowLabel": "Mostrar cursores", + "upload_title": "Subir archivo", + "upload_modal_title": "Opciones de carga de archivos", + "upload_modal_filename": "Nombre del archivo (extensión {0} agregado automáticamente)", + "upload_modal_owner": "Archivo propio", + "uploadFolder_modal_title": "Opciones de carga de carpeta", + "uploadFolder_modal_filesPassword": "Contraseña de archivos", + "uploadFolder_modal_owner": "Archivos propios", + "uploadFolder_modal_forceSave": "Almacene archivos en su CryptDrive", + "upload_serverError": "Error del servidor: no se puede subir tu archivo en este momento.", + "upload_uploadPending": "Ya tienes una subida en progreso. ¿Quieres cancelarla y subir tu nuevo archivo?", + "upload_success": "Tu archivo ({0}) se ha cargado y agregado exitosamente a su disco.", + "upload_notEnoughSpace": "No hay suficiente espacio para este archivo en su CryptDrive.", + "upload_notEnoughSpaceBrief": "No hay suficiente espacio", + "upload_tooLarge": "Este archivo excede el tamaño máximo de subida permitido para tu cuenta.", + "upload_tooLargeBrief": "El archivo excede el {0}MB límite para esta unidad", + "upload_choose": "Escoge un archivo", + "upload_pending": "Pendiente", + "upload_cancelled": "Cancelado", + "upload_size": "Tamaño", + "upload_mustLogin": "Debes estar conectado para subir archivos", + "upload_up": "Subir", + "download_mt_button": "Descargar", + "download_dl": "Descargar", + "download_step1": "Descargando", + "todo_markAsCompleteTitle": "Marcar esta tarea como completa", + "todo_markAsIncompleteTitle": "Marcar esta tarea como incompleta", + "todo_removeTaskTitle": "Elimina esta tarea de tu lista de tareas pendientes", + "mdToolbar_button": "Muestra u oculta la barra de herramientas Markdown", + "creation_newPadModalDescription": "Haz clic en una aplicación para crear un nuevo documento. También puedes presionar Tabpara seleccionar la aplicación y presioneEnter para confirmar.", + "password_info": "El documento que estás intentando abrir ya no existe o está protegido con una nueva contraseña. Ingresa la contraseña correcta para acceder al contenido.", + "password_error": "Documento no encontrado
Este error puede ser causado por dos factores: o la contraseña es inválida, o el documento ha sido destruido.", + "password_placeholder": "Escriba la contraseña aquí...", + "password_submit": "Enviar", + "properties_addPassword": "Agregar una contraseña", + "properties_changePassword": "cambiar la contraseña", + "properties_confirmNew": "¿Estás seguro? Agregar una contraseña cambiará la URL de este documento y eliminará su historial. Los usuarios sin la contraseña perderán el acceso a este documento", + "properties_confirmChange": "¿Estás seguro? Cambiar la contraseña eliminará su historial. Los usuarios sin la nueva contraseña perderán el acceso a este documento", + "properties_passwordSame": "Las nuevas contraseñas deben diferir de la actual.", + "properties_passwordError": "Ocurrió un error al intentar cambiar la contraseña. Por favor, inténtalo de nuevo.", + "properties_passwordWarning": "La contraseña se cambió con éxito, pero no pudimos actualizar tu CryptDrive con los nuevos datos. Es posible que tengas que eliminar manualmente la versión antigua del documento.
Presiona OK para recargar y actualizar.", + "properties_changePasswordButton": "Enviar", + "share_linkCategory": "Enlace", + "share_linkAccess": "Derechos de acceso", + "share_linkEdit": "Editar", + "share_linkView": "Vista", + "share_linkPresent": "Presente", + "share_linkOpen": "Enlace abierto", + "share_linkCopy": "Copiar enlace", + "share_contactCategory": "Contactos", + "share_embedCategory": "Incrustar", + "share_mediatagCopy": "Copiar etiqueta de medios al portapapeles", + "sharedFolders_duplicate": "Algunos de los documentos que intentabas mover ya estaban compartidos en la carpeta de destino.", + "sharedFolders_create": "Crear una carpeta compartida", + "sharedFolders_create_name": "Nombre de la carpeta", + "sharedFolders_create_owned": "Carpeta propia", + "convertFolderToSF_SFParent": "Esta carpeta no puede ser convertida en una carpeta compartida en su ubicación actual. Muévela fuera de la carpeta compartida que la contiene para continuar.", + "convertFolderToSF_SFChildren": "Esta carpeta no puede ser convertida en una carpeta compartida porque ya contiene carpetas compartidas. Mueve esas carpetas compartidas a otro lugar para continuar.", + "autostore_file": "archivo", + "autostore_sf": "carpeta", + "autostore_pad": "panel", + "autostore_notstored": "Esta {0} No está en tu CryptDrive. ¿Quieres guardarlo ahora?", + "autostore_settings": "Puedes habilitar el almacenamiento automático de documentos en tuAjustes página.", + "autostore_hide": "no almacenar", + "autostore_error": "Error inesperado: no pudimos guardar este documento, por favor intenta de nuevo.", + "autostore_saved": "El documento se guardó exitosamente en tu CryptDrive!", + "autostore_forceSave": "Guarda el archivo en tu CryptDrive", + "autostore_notAvailable": "Debes guardar este documento en tu CryptDrive antes de poder usar esta función.", + "crowdfunding_button": "Soporte CryptoPad", + "crowdfunding_button2": "Donar", + "crowdfunding_popup_no": "Ahora no", + "survey": "Encuesta CryptPad", + "markdown_toc": "Contenido", + "fm_expirablePad": "Vence:{0}", + "admin_authError": "Solo los administradores pueden acceder a esta página", + "admin_cat_general": "General", + "admin_cat_stats": "Estadísticas", + "adminPage": "Administración", + "admin_activeSessionsTitle": "Conexiones activas", + "admin_activePadsTitle": "Documentos activos", + "admin_activePadsHint": "Número de documentos únicos que se están viendo o editando actualmente", + "admin_registeredTitle": "Usuarios registradas", + "admin_registeredHint": "Número de usuarios registrados en su instancia", + "admin_updateLimitTitle": "Actualizar cuotas de usuarios", + "admin_updateLimitButton": "Actualizar cuotas", + "admin_updateLimitDone": "Actualización completada exitosamente", + "admin_flushCacheTitle": "Vaciar el caché HTTP", + "admin_flushCacheButton": "Vaciar caché", + "admin_flushCacheDone": "Caché vaciado exitosamente", + "footer_donate": "Donar", + "contact_admin": "Póngase en contacto con los administradores para: {0}", + "contact_dev": "Contacta con los desarrolladores", + "contact_devHint": "Para solicitudes de funciones, mejoras de usabilidad o para decir gracias.", + "contact_bug": "Reporte de errores", + "contact_chat": "Chat", + "contact_email": "Correo electrónico", + "timeoutError": "Un error ha interrumpido tu conexión con el servidor.
Presiona Esc para recargar la página.", + "admin_diskUsageTitle": "Uso del disco", + "admin_diskUsageButton": "Generar informe", + "settings_codeSpellcheckTitle": "Corrector ortográfico", + "settings_codeSpellcheckLabel": "Habilitar el corrector ortográfico en el editor de código", + "drive_active1Day": "Últimas 24 horas", + "drive_active7Days": "Los últimos 7 días", + "drive_active28Days": "Ultimas 4 semanas", + "drive_activeOld": "Menos reciente", + "friendRequest_later": "Decide después", + "friendRequest_accept": "Aceptar (Enter)", + "friendRequest_decline": "Rechazar", + "friendRequest_accepted": "{0} aceptado su solicitud de contacto", + "friendRequest_received": "{0} quisiera ser tu contacto", + "friendRequest_notification": "{0} te envió una solicitud de contacto", + "notifications_empty": "No hay notificaciones disponibles", + "profile_addDescription": "Agregar una descripción", + "profile_addLink": "Añade un enlace a tu sitio web", + "profile_friendRequestSent": "Solicitud de contacto pendiente...", + "isNotContact": "{0} no es uno de tus contactos", + "notification_fileShared": "{0} ha compartido un archivo contigo: {1}", + "notification_folderShared": "{0} ha compartido una carpeta contigo: {1}", + "share_filterFriend": "Buscar por nombre", + "share_linkFriends": "Compartir con los contactos", + "share_withFriends": "Compartir", + "notifications_dismiss": "Descartar", + "supportPage": "Apoyo", + "admin_cat_support": "Apoyo", + "admin_supportInitPrivate": "Su instancia de CryptPad está configurada para usar un buzón de soporte, pero su cuenta no tiene la clave privada correcta para acceder a ella. Utilice el siguiente formulario para agregar o actualizar la clave privada de su cuenta.", + "admin_supportAddKey": "Agregar clave privada", + "admin_supportAddError": "Clave privada no válida", + "admin_supportInitTitle": "Inicialización del buzón de soporte", + "admin_supportInitHint": "Puede configurar un buzón de soporte para brindarles a los usuarios de su instancia de CryptPad una forma de comunicarse con usted de forma segura si tienen un problema con su cuenta.", + "admin_supportListTitle": "Buzón de soporte", + "support_disabledTitle": "El soporte no está habilitado", + "support_disabledHint": "Esta instancia de CryptPad aún no está configurada para utilizar un formulario de soporte.", + "support_cat_new": "Nueva entrada", + "support_formTitle": "Nueva entrada", + "support_formButton": "Enviar", + "support_formTitleError": "Error: el título está vacío", + "support_formContentError": "Error: el contenido está vacío", + "support_formMessage": "Escribe tu mensaje…", + "support_cat_tickets": "Entradas existentes", + "support_listTitle": "Tickets de soporte", + "support_listHint": "Aquí está la lista de tickets enviados a los administradores y sus respuestas. Un ticket cerrado no se puede reabrir pero sí se puede crear uno nuevo. Puedes ocultar tickets que hayan sido cerrados.", + "support_answer": "Responder", + "support_close": "Cerrar el ticket", + "support_remove": "Eliminar el ticket", + "support_showData": "Mostrar/ocultar datos de usuario", + "support_from": "De: {0}", + "support_closed": "Este ticket ha sido cerrado", + "fc_noAction": "No hay acción disponible", + "notificationsPage": "Notificaciones", + "notifications_cat_all": "Todo", + "notifications_cat_friends": "Solicitudes de contacto", + "notifications_cat_pads": "Comparte conmigo", + "notifications_cat_archived": "Historia", + "notifications_dismissAll": "Descartar todo", + "requestEdit_button": "Solicitar derechos de edición", + "requestEdit_confirm": "{1}ha solicitado la posibilidad de editar el documento {0}. ¿Le gustaría otorgarles acceso?", + "requestEdit_viewPad": "Abrir el documento en una nueva pestaña", + "later": "Decide después", + "requestEdit_accepted": "{1} le ha concedido derechos de edición para el documento {0}", + "requestEdit_sent": "Solicitud enviada", + "properties_unknownUser": "{0} usuario(s) desconocido(s)", + "pricing": "Precios", + "homePage": "Pagina de inicio", + "features_noData": "No se requiere información personal", + "features_emailRequired": "Se requiere dirección de correo electrónico", + "owner_removeText": "Propietarios", + "owner_removePendingText": "Pendiente", + "owner_unknownUser": "desconocido", + "owner_removeMeConfirm": "Está a punto de renunciar a sus derechos de propiedad. No podrás deshacer esta acción. ¿Está seguro?", + "owner_addConfirm": "Los copropietarios podrán cambiar el contenido y eliminarlo como propietario. ¿Está seguro?", + "owner_add": "{0} quiere que seas propietario del documento{1}. ¿Aceptas?", + "owner_request_accepted": "{0} ha aceptado su oferta para ser propietario de{1}", + "owner_request_declined": "{0} Ha rechazado tu oferta para ser propietario de {1}", + "owner_removed": "{0} Ha eliminado tu propiedad de {1}", + "share_linkTeam": "Agregar a la unidad del equipo", + "team_pickFriends": "Escoge qué contactos invitar a este equipo", + "team_inviteModalButton": "Invitar", + "team_pcsSelectLabel": "Almacenar en", + "team_invitedToTeam": "{0} te ha invitado a unirte a su equipo {1}", + "team_kickedFromTeam": "{0} te ha expulsado del equipo: {1}", + "team_acceptInvitation": "{0} ha aceptado tu oferta para unirse al equipo: {1}", + "team_declineInvitation": "{0} Ha rechazado tu oferta para unirse al equipo: {1}", + "team_cat_general": "Acerca de", + "team_cat_list": "equipos", + "team_cat_back": "Volver a equipos", + "team_cat_members": "Miembros", + "team_cat_chat": "Chat", + "team_cat_drive": "Unidad", + "team_cat_admin": "Administración", + "team_infoLabel": "Administración", + "team_createName": "Nombre del equipo", + "team_rosterPromote": "Promover", + "team_rosterDemote": "Degradar", + "team_rosterKick": "Expulsar del equipo", + "team_inviteButton": "Invitar a los miembros", + "team_leaveButton": "dejar este equipo", + "team_owner": "Propietarios", + "team_admins": "Administradores", + "team_members": "Miembros", + "team_nameTitle": "Nombre del equipo", + "team_nameHint": "Establecer el nombre del equipo", + "team_avatarTitle": "avatar del equipo", + "team_maxTeams": "Cada cuenta de usuario solo puede ser miembro de {0} equipos.", + "team_listTitle": "Tus equipos", + "team_listSlot": "Espacio de equipo disponible", + "owner_team_add": "{0} Quiere que tú seas el propietario del equipo. {1}. ¿Aceptas?", + "team_rosterPromoteOwner": "Oferta de propiedad", + "team_ownerConfirm": "Los co-propietarios pueden modificar o eliminar el equipo y quitarte como propietario. ¿Estás seguro?", + "team_kickConfirm": "{0} sabrán que los eliminaste del equipo. ¿Estás seguro?", + "sent": "Mensaje enviado", + "team_deleteTitle": "Eliminación de equipo", + "team_deleteButton": "Borrar", + "team_pendingOwner": "(pendiente)", + "team_pendingOwnerTitle": "Este administrador aún no ha aceptado la oferta de propiedad.", + "team_demoteMeConfirm": "Estás a punto de renunciar a tus derechos. No podrás deshacer esta acción. ¿Estás seguro?", + "team_title": "Equipo: {0}", + "team_quota": "El límite de almacenamiento de tu equipo", + "settings_codeBrackets": "Soportes de cierre automático", + "team_viewers": "Espectadores", + "team_avatarHint": "Tamaño máximo de 500 kB (png, jpg, jpeg, gif)", + "admin_flushCacheHint": "Forzar a todos los usuarios a descargar los últimos recursos después de un cambio en la personalización o configuración. Evita reiniciar el servidor, pero hace que cada usuario activo restablezca su conexión. Úsalo con moderación.", + "pad_base64": "Este documento contiene imágenes almacenadas de una manera ineficiente. Estas imágenes aumentarán significativamente el tamaño del documento en tu CryptDrive, y harán que se cargue más lentamente. Puedes migrar estos archivos a un nuevo formato que se almacenará por separado en tu CryptDrive. ¿Quieres migrar estas imágenes ahora?", + "properties_passwordSuccess": "La contraseña se cambió correctamente.
Presione OK para recargar y actualizar sus derechos de acceso.", + "share_linkEmbed": "Modo incrustado (ocultar barra de herramientas y lista de usuarios)", + "sharedFolders_share": "Comparte este enlace con otros usuarios registrados para darles acceso a la carpeta compartida. Una vez que abran este enlace, la carpeta compartida se agregará a su CryptDrive.", + "sharedFolders_forget": "Este documento solo se guarda en una carpeta compartida, no puedes moverlo a la papelera. Puedes usar tu CryptDrive si quieres eliminarlo.", + "admin_activeSessionsHint": "Número de conexiones activas de websocket (y direcciones IP únicas conectadas)", + "convertFolderToSF_confirm": "Esta carpeta debe ser convertida en una carpeta compartida para que otros puedan verla. ¿Continuar?", + "crowdfunding_popup_text": "

necesitamos tu ayuda!

\"Para asegurar que CryptPad siga desarrollándose activamente, considera apoyar el proyecto a través de la página de OpenCollective, donde puedes ver nuestro\" Plan de trabajo y Metas de financiamiento.", + "friendRequest_declined": "{0} rechazó su solicitud de contacto", + "fm_info_sharedFolderHistory": "Este es solo el historial de su carpeta compartida: {0}
Su CryptDrive permanecerá en modo de solo lectura mientras navega.", + "support_formHint": "Utilice este formulario para comunicarse de forma segura con los administradores sobre problemas y preguntas.
Tenga en cuenta que es posible que algunos problemas/preguntas ya estén abordados en la Guía del usuario de CryptPad. No cree un ticket nuevo si ya tiene un ticket abierto sobre el mismo problema. En su lugar, responda a su mensaje original con cualquier información adicional.", + "features_pricing": "{0} a {2}€ al mes", + "team_cat_create": "Nuevo", + "team_leaveConfirm": "Si abandonas este equipo, perderás el acceso a su CryptDrive, al historial de chat y a otros contenidos. ¿Estás seguro?", + "chrome68": "Parece que estás utilizando el navegador Chrome o Chromium versión 68. Este contiene un error que resulta en que la página se vuelve completamente blanca después de unos segundos o la página no responde a los clics. Para solucionar este problema, puedes cambiar a otra pestaña y volver, o intentar desplazarte en la página. Este error debería ser corregido en la próxima versión de tu navegador.", + "admin_diskUsageHint": "Cantidad de espacio de almacenamiento consumido por varios recursos de CryptPad", + "profile_editDescription": "Edita tu descripción", + "profile_info": "Otros usuarios pueden encontrar su perfil a través de su avatar en las listas de usuarios de documentos.", + "owner_removeConfirm": "¿Está seguro de que desea eliminar la propiedad de los usuarios seleccionados? Se les notificará de esta acción.", + "team_pcsSelectHelp": "Crear un documento propio en la unidad de tu equipo le dará la propiedad al equipo.", + "team_deleteHint": "Eliminar el equipo y todos los documentos propiedad exclusiva del equipo.", + "contact_adminHint": "Para cualquier problema relacionado con su cuenta, límite de almacenamiento o disponibilidad del servicio.\n", + "isContact": "{0} es uno de tus contactos", + "notification_padShared": "{0} ha compartido un documento contigo: {1}", + "admin_supportInitHelp": "Tu servidor aún no está configurado para tener un buzón de soporte. Si deseas tener un buzón de soporte para recibir mensajes de tus usuarios, debes pedirle al administrador del servidor que ejecute el script ubicado en \"./scripts/generate-admin-keys.js\", luego almacene la clave pública en el archivo \"config.js\" y te envíe la clave privada.", + "admin_supportListHint": "Aquí está la lista de tickets enviados por los usuarios al buzón de soporte. Todos los administradores pueden ver los mensajes y sus respuestas. Un ticket cerrado no se puede volver a abrir. Solo puede eliminar (ocultar) tickets cerrados, y otros administradores seguirán viendo los tickets eliminados.", + "openNotificationsApp": "Abrir panel de notificaciones", + "requestEdit_request": "{1} quiere editar el documento {0}", + "owner_request": "{0} quiere que seas dueño de {1}", + "owner_removedPending": "{0} Ha cancelado tu oferta de propiedad para {1}", + "team_infoContent": "Cada equipo tiene su propio CryptDrive, cuota de almacenamiento, chat y lista de miembros. Los propietarios del equipo pueden eliminar todo el equipo, los administradores pueden invitar o expulsar a los miembros, los miembros pueden abandonar el equipo.", + "admin_updateLimitHint": "Se puede forzar una actualización de los límites de almacenamiento del usuario en cualquier momento, pero solo es necesario en caso de error", + "support_notification": "Un administrador ha respondido a su ticket de soporte", + "team_createLabel": "Crear un nuevo equipo", + "team_deleteConfirm": "Estás a punto de eliminar todos los datos de un equipo completo. Esto puede afectar el acceso de otros miembros del equipo a sus datos. Esto no se puede deshacer. ¿Estás seguro de que quieres proceder?", + "history_close": "Cerrar", + "history_cantRestore": "La restauración falló. Estás desconectado.", + "history_shareTitle": "Comparte un enlace a esta versión", + "history_restoreDriveTitle": "Restaurar la versión seleccionada de CryptDrive", + "drive_sfPassword": "Tu carpeta compartida{0} ya no está disponible. Ha sido eliminada por su dueño o ahora está protegida con una nueva contraseña. Puedes eliminar esta carpeta de tu CryptDrive, o recuperar el acceso utilizando la nueva contraseña.", + "drive_sfPasswordError": "Contraseña incorrecta", + "password_error_seed": "¡Documento no encontrado!
Este error puede ser causado por dos factores: o se añadió/cambió una contraseña, o el documento ha sido eliminado del servidor.", + "properties_passwordWarningFile": "La contraseña fue cambiada exitosamente pero no pudimos actualizar tu CryptDrive con los nuevos datos. Puede que tengas que eliminar la versión antigua del archivo manualmente.", + "properties_passwordSuccessFile": "La contraseña fue cambiada exitosamente.", + "teams_table": "Roles", + "teams_table_generic": "Roles y permisos", + "teams_table_generic_view": "Ver: acceder a carpetas y documentos (solo lectura).", + "teams_table_generic_edit": "Editar: crear, modificar y eliminar carpetas y documentos.", + "teams_table_generic_admin": "Gestionar Miembros: invitar y revocar miembros, cambiar roles de miembros hasta Administrador.", + "teams_table_specific": "Excepciones", + "teams_table_specificHint": "Estas son carpetas compartidas antiguas donde los espectadores todavía tienen permiso para editar documentos existentes. Los documentos creados o copiados en estas carpetas tendrán permisos estándar.", + "teams_table_admins": "Administrar miembros", + "teams_table_owners": "Administrar equipo", + "teams_table_role": "Rol", + "pad_wordCount": "Palabras: {0}", + "share_linkPasswordAlert": "Este elemento está protegido por contraseña. Cuando envíes el enlace, el destinatario tendrá que introducir la contraseña.", + "share_embedPasswordAlert": "Este artículo está protegido por contraseña. Cuando insertes este documento, se le pedirá la contraseña a los espectadores.", + "passwordFaqLink": "Leer más sobre contraseñas", + "share_noContactsLoggedIn": "Aún no estás conectado con nadie en CryptPad. Comparte el enlace a tu perfil para que las personas te envíen solicitudes de contacto.", + "share_copyProfileLink": "Copiar enlace de perfil", + "share_noContactsNotLoggedIn": "Inicia sesión o regístrate para ver tus contactos existentes y agregar nuevos.", + "contacts_mute": "Silenciar", + "contacts_unmute": "Dejar de silenciar", + "contacts_manageMuted": "Administrar silenciado", + "contacts_mutedUsers": "Cuentas silenciadas", + "team_inviteLinkTitle": "Crea una invitación personalizada para este equipo", + "team_inviteLinkTempName": "Nombre temporal (visible en la lista de invitaciones pendientes)", + "team_inviteLinkSetPassword": "Proteger el enlace con contraseña (recomendado)", + "team_inviteLinkNote": "Añadir un mensaje personal", + "team_inviteLinkLoading": "Generando tu enlace", + "team_inviteLinkErrorName": "Por favor, añade un nombre para la persona a la que estás invitando. Ellos podrán cambiarlo más tarde. ", + "kanban_tags": "Filtrar por etiqueta", + "team_inviteLinkCopy": "Copiar enlace", + "team_inviteFrom": "De:", + "team_invitePleaseLogin": "Por favor inicie sesión o regístrese para aceptar esta invitación.", + "team_inviteEnterPassword": "Por favor, introduce la contraseña de la invitación para continuar.", + "team_invitePasswordLoading": "Descifrando invitación", + "team_inviteJoin": "Unirse al equipo", + "team_inviteGetData": "Obtener datos del equipo", + "team_cat_link": "Enlace de invitación", + "team_links": "Enlaces de invitación", + "team_inviteLinkError": "Hubo un error al crear el enlace.", + "burnAfterReading_linkBurnAfterReading": "Ver una vez y autodestruirse", + "burnAfterReading_generateLink": "Haga clic en el botón de abajo para generar un enlace.", + "burnAfterReading_proceed": "ver y eliminar", + "burnAfterReading_warningDeleted": "Este documento ha sido borrado permanentemente, una vez que cierres esta ventana no podrás acceder a él de nuevo.", + "oo_invalidFormat": "Este archivo no se puede importar", + "oo_importInProgress": "Importación en curso", + "oo_exportInProgress": "Exportación en curso", + "oo_sheetMigration_loading": "Actualizando tu documento a la última versión. Por favor, espera aproximadamente 1 minuto.", + "oo_sheetMigration_complete": "Versión actualizada disponible, presione OK para recargar.", + "oo_sheetMigration_anonymousEditor": "Este documento requiere una actualización. La edición está deshabilitada para los invitados hasta que un usuario registrado lo abra.", + "imprint": "Aviso Legal", + "settings_cat_security": "Seguridad y Privacidad", + "settings_safeLinksTitle": "Enlaces seguros", + "settings_safeLinksCheckbox": "Habilitar enlaces seguros", + "dontShowAgain": "No volver a mostrar", + "profile_login": "Necesitas iniciar sesión para agregar a este usuario a tus contactos", + "areYouSure": "Estas seguro?", + "historyTrim_historySize": "Historial: {0}", + "historyTrim_contentsSize": "Contenido: {0}", + "trimHistory_button": "Borrar historial", + "trimHistory_getSizeError": "\"Error al calcular el tamaño del historial de tu disco\"", + "trimHistory_error": "Error al borrar el historial", + "kanban_noTags": "No etiquetas", + "trimHistory_success": "\"El historial ha sido eliminado\"", + "trimHistory_needMigration": "Por favor actualiza tu CryptDrive para habilitar esta función.", + "trimHistory_currentSize": "Tamaño del historial actual: {0}", + "settings_trimHistoryTitle": "Borrar historial", + "makeACopy": "Hacer una copia", + "copy_title": "{0} (Copiar)", + "access_main": "Acceso", + "access_allow": "Lista", + "accessButton": "Acceso", + "restrictedError": "No estás autorizado a acceder a este documento", + "contacts": "Contactos", + "access_noContact": "Ningún otro contacto para agregar", + "allow_checkbox": "Habilitar lista de acceso", + "access_muteRequests": "Silenciar solicitudes de acceso a este documento", + "logoutEverywhere": "Cerrar sesión en todas partes", + "allow_text": "Usar una lista de acceso significa que solo los usuarios y dueños seleccionados podrán acceder a este documento.", + "teams": "equipos", + "kanban_title": "Título", + "kanban_body": "Contenido", + "kanban_color": "Color", + "kanban_delete": "Borrar", + "kanban_conflicts": "Actualmente editando:", + "kanban_clearFilter": "Limpiar filtro", + "kanban_editCard": "Editar esta tarjeta", + "kanban_editBoard": "Editar este panel", + "oo_isLocked": "Sincronizando cambios, por favor espera", + "profile_copyKey": "Copiar clave pública", + "admin_openFilesTitle": "Abrir archivos", + "admin_openFilesHint": "Número de descriptores de archivos actualmente abiertos en el servidor.", + "canvas_brush": "Pincel", + "canvas_select": "Seleccionar", + "cba_writtenBy": "Escrito por: {0}", + "cba_properties": "Colores de autor (experimental)", + "cba_enable": "Habilitar", + "cba_disable": "Limpiar y Deshabilitar", + "cba_show": "Mostrar colores del autor", + "cba_hide": "Ocultar colores de autor", + "cba_title": "Colores del autor", + "comments_notification": "Respuestas a tu comentario \"{0}\" en {1}", + "unknownPad": "Documento desconocido", + "mentions_notification": "{0} te ha mencionado en {1}", + "comments_edited": "Editado", + "comments_submit": "enviada", + "comments_resolve": "Resolver", + "comments_comment": "Comentario", + "settings_padNotifTitle": "Notificaciones de comentarios", + "settings_padNotifCheckbox": "Desactivar notificaciones de comentarios", + "comments_error": "No puedes agregar un comentario aquí", + "fm_sort": "Clasificar", + "todo_move": "Tu lista de tareas ahora está en el kanban {0} en tu unidad.", + "toolbar_theme": "Tema", + "toolbar_insert": "Insertar", + "toolbar_savetodrive": "guardar como imagen", + "toolbar_tools": "Herramientas", + "drive_treeButton": "Archivos", + "code_editorTheme": "Tema del editor", + "toolbar_file": "Archivo", + "slide_textCol": "Color de texto", + "support_languagesPreamble": "El equipo de soporte habla los siguientes idiomas:", + "info_imprintFlavour": "Información legal Sobre los administradores de esta instancia", + "user_about": "Acerca de CryptoPad", + "info_privacyFlavour": "Política de privacidad para esta instancia", + "support_cat_account": "Cuenta de usuario", + "support_cat_data": "Pérdida de contenido", + "support_cat_bug": "reporte de error", + "support_cat_other": "Otro", + "support_cat_all": "Todo", + "support_attachments": "Archivos adjuntos", + "support_addAttachment": "Agregar un adjunto", + "notification_fileSharedTeam": "{0} ha compartido un archivo con el equipo {2}: {1}", + "notification_folderSharedTeam": "{0} ha compartido una carpeta con el equipo {2}: {1}", + "oo_refresh": "Actualizar", + "support_category": "Elige una categoría", + "support_formCategoryError": "Error: la categoría está vacía", + "fm_restricted": "No tienes acceso", + "fm_noResult": "No se han encontrado resultados", + "pad_tocHide": "Describir", + "settings_kanbanTagsTitle": "Filtro de etiquetas", + "settings_kanbanTagsAnd": "Y", + "settings_kanbanTagsOr": "O", + "settings_cat_kanban": "Kanban", + "share_bar": "Crear enlace", + "burnAfterReading_warningLink": "Has configurado este documento para autodestruirse. Una vez que un destinatario visite este enlace, podrá ver el documento una vez antes de que se elimine permanentemente.", + "notification_padSharedTeam": "{0} ha compartido un documento con el equipo {2}: {1}", + "settings_kanbanTagsHint": "Selecciona cómo quieres que actúe el filtro de etiquetas al seleccionar múltiples etiquetas: mostrar solo las tarjetas que contienen todas las etiquetas seleccionadas (Y) o mostrar las tarjetas que contienen cualquiera de las etiquetas seleccionadas (O).", + "history_userPrev": "Autor anterior", + "history_userNext": "Próximo autor", + "teams_table_generic_own": "Gestionar Equipo: cambiar el nombre y el avatar del equipo, agregar o eliminar Propietarios, cambiar la suscripción del equipo, eliminar el equipo.", + "share_linkWarning": "Este enlace contiene las claves de tu documento. Los destinatarios obtendrán acceso irrevocable a tu contenido.", + "share_contactPasswordAlert": "Este elemento está protegido por contraseña. Sin embargo, como lo estás compartiendo con un contacto de CryptPad, el destinatario no tendrá que introducir la contraseña.", + "team_inviteLinkNoteMsg": "Este mensaje se mostrará antes de que el destinatario decida si unirse a este equipo.", + "team_inviteTitle": "invitación de equipo", + "burnAfterReading_warningAccess": "Este documento se autodestruirá. Cuando hagas clic en el botón de abajo, podrás ver el contenido una vez antes de que se elimine permanentemente. Cuando cierres esta ventana, no podrás acceder a él de nuevo. Si no estás listo para continuar, puedes cerrar esta ventana y volver más tarde.", + "settings_safeLinkDefault": "Los enlaces seguros ahora están activados por defecto. Por favor, utiliza el Compartir menú para copiar enlaces en lugar de la barra de direcciones de tu navegador.", + "properties_confirmNewFile": "¿Estás seguro? Agregar una contraseña cambiará la URL de este archivo. Los usuarios sin la contraseña perderán el acceso a este archivo.", + "team_inviteLinkWarning": "Las personas que accedan a este enlace podrán unirse a este equipo y ver su contenido. Compártelo cuidadosamente.", + "team_inviteLinkCreate": "Crear enlace", + "team_inviteFromMsg": "{0} te ha invitado a unirte al equipo {1}", + "trimHistory_noHistory": "No se puede eliminar el historial", + "settings_trimHistoryHint": "Ahorra espacio de almacenamiento eliminando el historial de tu disco y las notificaciones. Esto no afectará el historial de tus documentos. Puedes eliminar el historial de documentos en su diálogo de propiedades.", + "cba_hint": "Esta configuración se recordará cuando crees tu próximo documento.", + "comments_deleted": "Comentario eliminado por su autor", + "settings_padNotifHint": "Ignorar notificaciones cuando alguien responde a uno de tus comentarios", + "slide_backCol": "Color de fondo", + "share_versionHash": "Estás a punto de compartir la versión seleccionada del historial del documento en modo de solo lectura. Esto también dará acceso de visualización a todas las versiones del documento.", + "history_fastPrev": "Sesión de edición anterior", + "properties_confirmChangeFile": "¿Estás seguro? Los usuarios sin la nueva contraseña perderán el acceso a este archivo.", + "driveOfflineError": "Tu conexión a CryptPad se ha perdido. Los cambios en este documento no se guardarán en tu CryptDrive. Por favor, cierra todas las pestañas de CryptPad e intenta de nuevo en una nueva ventana. ", + "contacts_muteInfo": "No recibirás ninguna notificación o mensaje de usuarios silenciados.
Ellos no sabrán que los has silenciado. ", + "team_inviteInvalidLinkError": "Este enlace de invitación no es válido.", + "safeLinks_error": "Este enlace fue copiado de la barra de direcciones del navegador y no proporciona acceso al documento. Por favor, utiliza el Compartir menú para compartir directamente con contactos o copiar el enlace. Lee más acerca de la función de Enlaces Seguros..", + "fm_emptyTrashOwned": "Tu papelera contiene documentos de tu propiedad Puedes eliminarlos solo de tu unidad o destruirlospara todos los usuarios.", + "history_restore": "Restaurar", + "history_fastNext": "Próxima sesión de edición", + "settings_safeLinksHint": "CryptPad incluye las claves para descifrar tus documentos en sus enlaces. Cualquiera con acceso a tu historial de navegación puede potencialmente leer tus datos. Esto incluye extensiones de navegador intrusivas y navegadores que sincronizan tu historial a través de dispositivos. Habilitar \"enlaces seguros\" evita que las claves entren en tu historial de navegación o se muestren en tu barra de direcciones siempre que sea posible. Recomendamos encarecidamente que habilites esta función y uses el menú de Compartir {0} para generar enlaces compartibles.", + "owner_text": "Los dueño(s) de un documento son los únicos usuarios autorizados para: añadir/eliminar dueños, restringir el acceso al documento con una lista de acceso, o eliminar el documento.", + "oo_login": "Por favor, inicia sesión o regístrate para mejorar el rendimiento de las hojas de cálculo.", + "comments_reply": "Responder", + "history_restoreDrivePrompt": "¿Estás seguro de que quieres reemplazar la versión actual del CryptDrive con la versión mostrada?" } From f363b5be0716f8ab72ba4148b0297e9e854b48bf Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 11 Jul 2024 07:53:41 +0200 Subject: [PATCH 019/188] Translated using Weblate (Italian) Currently translated at 97.8% (1741 of 1780 strings) Co-authored-by: Viki Halwick Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/it/ Translation: CryptPad/App --- www/common/translations/messages.it.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/www/common/translations/messages.it.json b/www/common/translations/messages.it.json index 4a91325dc..b07289959 100644 --- a/www/common/translations/messages.it.json +++ b/www/common/translations/messages.it.json @@ -1026,12 +1026,12 @@ "unableToDisplay": "Impossibile visualizzare il documento. Premi Esc per ricaricare la pagina. Se il problema persiste, contatta l'assistenza.", "documentID": "Codice identificativo del documento", "error_unhelpfulScriptError": "Errore di script: vedi la console del browser per i dettagli", - "loading_state_5": "Ricostruzione del documento", - "loading_state_4": "Caricamento dei gruppi", - "loading_state_3": "Caricamento delle cartelle condivise", - "loading_state_2": "Aggiornamento del contenuto", - "loading_state_1": "Caricamento del drive", - "loading_state_0": "Creazione dell'interfaccia", + "loading_state_5": "Ricostruzione documento", + "loading_state_4": "Caricamento gruppi", + "loading_state_3": "Caricamento cartelle condivise", + "loading_state_2": "Aggiornamento contenuto", + "loading_state_1": "Caricamento drive", + "loading_state_0": "Creazione interfaccia", "fm_shareFolderPassword": "Proteggi questa cartella con una password (facoltativo)", "access_destroyPad": "Distruggi questo documento o questa cartella in modo permanente", "fm_deletedFolder": "Cartella eliminata", From c60b14b466d4613e782436efa540593d53b6d0dc Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 11 Jul 2024 07:53:41 +0200 Subject: [PATCH 020/188] Translated using Weblate (Bulgarian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 25.0% (446 of 1780 strings) Co-authored-by: Weblate Co-authored-by: Мария Рангелова Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/bg/ Translation: CryptPad/App --- www/common/translations/messages.bg.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/www/common/translations/messages.bg.json b/www/common/translations/messages.bg.json index d83656818..31c392ee2 100644 --- a/www/common/translations/messages.bg.json +++ b/www/common/translations/messages.bg.json @@ -426,5 +426,25 @@ "settings_logoutEverywhereConfirm": "Сигурен ли си? Ще трябва да влезеш на всичките си устройства.", "settings_driveDuplicateHint": "Когато преместите вашите документи в споделена папка, копие от тях се запазва във вашия CryptDrive, за да се гарантира, контрола ви върху него. Можете да скриете дублираните файлове. Само споделената версия ще бъде видима, освен ако не бъде изтрита, в този случай оригиналът ще се покаже на предишното си място.", "settings_padWidthHint": "Превключване между режим на страница (по подразбиране), който ограничава ширината на текстовия редактор, и използване на цялата ширина на екрана.", - "settings_padSpellcheckHint": "Тази опция ви позволява да активирате проверка на правописа в документи с форматиран текст. Правописните грешки ще бъдат подчертани в червено и ще трябва да задържите клавиша Ctrl или Meta, докато щраквате с десния бутон, за да видите опциите." + "settings_padSpellcheckHint": "Тази опция ви позволява да активирате проверка на правописа в документи с форматиран текст. Правописните грешки ще бъдат подчертани в червено и ще трябва да задържите клавиша Ctrl или Meta, докато щраквате с десния бутон, за да видите опциите.", + "settings_padSpellcheckLabel": "Активиране на проверката на правописа в документи с форматиран текст", + "settings_padOpenLinkTitle": "Отваряне на връзки при първо щракване", + "settings_padOpenLinkHint": "С тази възможност можете да отваряте вградени връзки при щракване без изскачащ прозорец за показване", + "settings_padOpenLinkLabel": "Разрешаване на отварянето на директната връзка", + "settings_ownDriveTitle": "Актуализиране на профила", + "settings_ownDriveHint": "По-старите акаунти нямат достъп до най-новите функции поради технически причини. Безплатното обновяване ще активира текущите функции и ще подготви вашия CryptDrive за бъдещи обновявания.", + "settings_ownDriveButton": "Надграждане на профила ви", + "settings_ownDriveConfirm": "Надграждането на вашия акаунт може да отнеме известно време. Ще трябва да влезете отново през всичките си устройства. Сигурен ли сте?", + "settings_ownDrivePending": "Вашият профил се надгражда. Моля, не затваряйте и не презареждайте тази страница, докато процесът не приключи.", + "settings_changePasswordTitle": "Промяна на паролата", + "settings_changePasswordHint": "Променете паролата на профила си. Въведете текущата си парола и потвърдете новата парола, като я въведете два пъти.
Не можем да възстановим паролата ви, ако я забравите, така че бъдете много внимателни!", + "settings_changePasswordButton": "Промяна на парола", + "settings_changePasswordCurrent": "Текуща парола", + "settings_changePasswordNew": "Нова парола", + "settings_changePasswordNewConfirm": "Потвърждаване на новата парола", + "settings_changePasswordConfirm": "Сигурни ли сте, че искате да промените паролата си? Ще трябва да влезете отново през всичките си устройства.", + "settings_changePasswordPending": "Вашата парола се обновява. Моля, не затваряйте и не презареждайте тази страница, докато процесът не приключи.", + "settings_cursorColorTitle": "Цвят на курсора", + "settings_changePasswordError": "Възникна неочаквана грешка. Ако не можете да влезете или да промените паролата си, свържете се с администраторите на CryptPad.", + "settings_changePasswordNewPasswordSameAsOld": "Вашата нова парола трябва да е различна от настоящата." } From bc77d140ecd31b87f004fd53e7962d92b89cc9a2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 11 Jul 2024 07:53:41 +0200 Subject: [PATCH 021/188] Translated using Weblate (French) Currently translated at 100.0% (1780 of 1780 strings) Co-authored-by: Mathilde Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/fr/ Translation: CryptPad/App --- www/common/translations/messages.fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 9457c52fd..5dc663a98 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -1249,7 +1249,7 @@ "form_makePublic": "Publier les réponses", "form_invalidQuestion": "Questions {0}", "form_invalidWarning": "Certaines réponses contiennent des erreurs :", - "form_input_ph_url": "https://example.net/exemple", + "form_input_ph_url": "https://example.net", "form_input_ph_email": "courriel_exemple@example.net", "form_notAnswered": "{0} réponses vides", "form_answerWarning": "Identité non confirmée", From 81f70c6a6722428cf4fb0f06942fa87277b39bbd Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Thu, 11 Jul 2024 13:08:50 +0300 Subject: [PATCH 022/188] Add border to table --- customize.dist/src/less2/include/sidebar-layout.less | 1 + 1 file changed, 1 insertion(+) diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index eeb5da80a..bb037d366 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -199,6 +199,7 @@ .cp-sidebar-table#performance-profiling-table { @media (max-width: 900px) { width: 100%; + border: 1px solid @cp_drive-icon-border; tr { display: flex; From a4171d19ebda7716bf6449d448356e9e66dea5c4 Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 11 Jul 2024 14:28:55 +0300 Subject: [PATCH 023/188] fix focus style on `new calendar` button #1506 --- www/calendar/app-calendar.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/www/calendar/app-calendar.less b/www/calendar/app-calendar.less index bdf59fb6d..d219cfd3f 100644 --- a/www/calendar/app-calendar.less +++ b/www/calendar/app-calendar.less @@ -633,6 +633,9 @@ color: @cp_sidebar-left-active-fg; border: 0px; } + &:focus { + outline: @cryptpad_color_brand solid 2px; + } i { margin-left: 5px; } From 848387edcce1dd765cf12f98dd9dfd9c433aeb22 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Thu, 11 Jul 2024 14:49:15 +0300 Subject: [PATCH 024/188] Fix overlapping variable names --- www/code/inner.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/code/inner.js b/www/code/inner.js index 670e2097a..4be60351a 100644 --- a/www/code/inner.js +++ b/www/code/inner.js @@ -106,7 +106,7 @@ define([ framework._.toolbar.$theme.append($showAuthorColors); markers.setButton($showAuthorColors); }; - var mkPrintButton = function (framework, $content) { + var mkPrintButton = function (framework, $content, $print) { var $printButton = framework._.sfCommon.createButton('print', true); $printButton.click(function () { $print.html($content.html()); @@ -115,8 +115,8 @@ define([ framework.feedback('PRINT_CODE'); UI.clearTooltipsDelay(); }); - var $print = UIElements.getEntryFromButton($printButton); - framework._.toolbar.$drawer.append($print); + var $dropdownEntry = UIElements.getEntryFromButton($printButton); + framework._.toolbar.$drawer.append($dropdownEntry); }; var mkMarkdownTb = function (editor, framework) { var $codeMirrorContainer = $('#cp-app-code-container'); From 4a289d003d9ceaab50d58a949bdd1954e2359949 Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 11 Jul 2024 14:56:01 +0300 Subject: [PATCH 025/188] fix focus style on drive sidebar #1506 --- customize.dist/src/less2/include/drive.less | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/customize.dist/src/less2/include/drive.less b/customize.dist/src/less2/include/drive.less index 239f73287..3672a540e 100644 --- a/customize.dist/src/less2/include/drive.less +++ b/customize.dist/src/less2/include/drive.less @@ -30,6 +30,11 @@ .cp-unselectable { .tools_unselectable(); } + .btn-primary{ + &:focus { + outline: @cryptpad_color_brand solid 2px; + } + } /* local mixins */ @drive_icon-margin: 10px; @@ -348,6 +353,9 @@ overflow: hidden; text-overflow: ellipsis; } + &:focus { + outline: @cryptpad_color_brand solid 2px; + } } } } @@ -373,6 +381,9 @@ padding-left: 20px; .leftside-menu-category_main(); margin: 0; + &:focus { + outline: @cryptpad_color_brand solid 2px; + } } } } @@ -399,6 +410,9 @@ position: relative; top: -1px; } + &:focus { + outline: @cryptpad_color_brand solid 2px; + } } .cp-app-drive-tree-docs { box-shadow: @cryptpad_ui_shadow; From be807d884a1a027ee2b6decd0e31c8fb73b5d057 Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 11 Jul 2024 15:26:43 +0300 Subject: [PATCH 026/188] fix overlapping focus on drive sidebar --- customize.dist/src/less2/include/drive.less | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/customize.dist/src/less2/include/drive.less b/customize.dist/src/less2/include/drive.less index 3672a540e..a4dca3826 100644 --- a/customize.dist/src/less2/include/drive.less +++ b/customize.dist/src/less2/include/drive.less @@ -334,11 +334,10 @@ overflow: hidden; text-overflow: ellipsis; .leftside-menu-category_main(); - margin: 0; display: flex; align-items: center; cursor: pointer; - margin-left: -5px; + margin: 0 0 2px -5px; padding-left: 5px; .fa, .cptools { display: inline-block; From f82fe763af9b3a766dd0635253be43fab9eea738 Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Thu, 11 Jul 2024 14:44:48 +0200 Subject: [PATCH 027/188] =?UTF-8?q?Send=20Pad=E2=80=99s=20plain=20password?= =?UTF-8?q?=20when=20sharing=20ownership?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The password is sent via `Mailbox` and then is still oblivious to the server - Otherwise a bogus file is created (#1522) - Also fix the file stored and fix #1521 --- www/common/outer/mailbox-handlers.js | 1 + www/common/sframe-common-outer.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/www/common/outer/mailbox-handlers.js b/www/common/outer/mailbox-handlers.js index cfa749084..a2b2ed08a 100644 --- a/www/common/outer/mailbox-handlers.js +++ b/www/common/outer/mailbox-handlers.js @@ -384,6 +384,7 @@ define([ var channel = content.channel || content.teamChannel; if (content.password) { + content.pw = content.password; var key = ctx.store.driveSecret.keys.cryptKey; content.password = Crypto.encrypt(content.password, key); } diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 6c46ced04..508937e41 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -1083,7 +1083,7 @@ define([ Cryptpad.addSharedFolder(null, secret, cb); } else { var _data = { - password: data.password, + password: data.pw || data.password, href: data.href, channel: data.channel, title: data.title, From da63f7d51ed95f5daf985ceeca7b279813e39d27 Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Thu, 11 Jul 2024 14:50:19 +0200 Subject: [PATCH 028/188] Minor: fix a typo in comment --- www/common/common-ui-elements.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 5405bf319..f56584e19 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -3615,7 +3615,7 @@ define([ // Add the pad to your drive // This command will also add your mailbox to the metadata log - // The callback is called when the pad is stored, independantly of the metadata command + // The callback is called when the pad is stored, independently of the metadata command if (data.calendar) { var calendarModule = common.makeUniversal('calendar'); var calendarData = data.calendar; From 9098823fd72598e0b96eb70e69c742d61cc4c9fb Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 11 Jul 2024 16:11:51 +0300 Subject: [PATCH 029/188] change focus style on elements from Ctrl+E modal #1506 --- customize.dist/src/less2/include/drive.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/customize.dist/src/less2/include/drive.less b/customize.dist/src/less2/include/drive.less index 239f73287..424e12519 100644 --- a/customize.dist/src/less2/include/drive.less +++ b/customize.dist/src/less2/include/drive.less @@ -953,6 +953,9 @@ li, li .fa, li .cptools { cursor: pointer; border-radius: @variables_radius; + &:focus { + outline: @cryptpad_color_brand solid 2px; + } } &> p { display: flex; From f72ed440e63eea8d4ba995079d9fddc819c1aa5e Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 11 Jul 2024 16:48:26 +0300 Subject: [PATCH 030/188] fix focus issues on `Ctrl+E` modal #1558 --- www/common/common-interface.js | 1 + 1 file changed, 1 insertion(+) diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 2c4d57799..d153b0483 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -670,6 +670,7 @@ define([ $modal: $blockContainer, show: function () { $blockContainer.css('display', 'flex'); + addTabListener($blockContainer); }, hide: hide }; From a29aab157d90a4f0a6dfa0fa52c8c754a67fa84c Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 11 Jul 2024 17:22:35 +0300 Subject: [PATCH 031/188] fix focus issues on modals that use UI.alert #1561 --- www/common/common-interface.js | 1 + 1 file changed, 1 insertion(+) diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 2c4d57799..9ed80b7e8 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -719,6 +719,7 @@ define([ Notifier.notify(); }); + addTabListener(frame); return { element: frame, delete: close From 13a82303e051df48cc3ff3c8198a6816f5b7d6c5 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 12 Jul 2024 11:29:13 +0200 Subject: [PATCH 032/188] Make background color white while printing --- customize.dist/src/print.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/customize.dist/src/print.css b/customize.dist/src/print.css index 076a294a9..7cdf6d3c9 100644 --- a/customize.dist/src/print.css +++ b/customize.dist/src/print.css @@ -8,3 +8,8 @@ margin: 3cm; size: A4 portrait; } +@media print { + body { + background: white !important; + } +} From 09067da34117fc6048072bf76bd0f40dbb1cf29d Mon Sep 17 00:00:00 2001 From: daria Date: Fri, 12 Jul 2024 12:45:41 +0300 Subject: [PATCH 033/188] change focus style on Ctrl+E modals #1561 --- customize.dist/src/less2/include/icons.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/icons.less b/customize.dist/src/less2/include/icons.less index e3a273a92..bf3e3afc3 100644 --- a/customize.dist/src/less2/include/icons.less +++ b/customize.dist/src/less2/include/icons.less @@ -33,8 +33,8 @@ color: @cp_drive-fg; } &.cp-icons-element-selected { - background: @cp_drive-icon-hover; color: @cp_drive-fg; + outline: @cryptpad_color_brand solid 2px; } .fa, .cptools { display: block; From 1ac0cd3e1d15ed511d98f274012fb8ffd51a29ed Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Fri, 12 Jul 2024 17:59:50 +0200 Subject: [PATCH 034/188] Use the correct password when sharing a pad to a contact - Fix #1270; - Force reload option added. --- www/common/cryptpad-common.js | 3 ++- www/common/notifications.js | 1 + www/common/outer/mailbox-handlers.js | 7 +++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 4525c8287..e2d6a3746 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -2619,7 +2619,8 @@ define([ disableCache: localStorage['CRYPTPAD_STORE|disableCache'], driveEvents: !rdyCfg.noDrive, //rdyCfg.driveEvents // Boolean lastVisit: Number(localStorage.lastVisit) || undefined, - blockId: blockId + blockId: blockId, + blockHash: blockHash }; common.userHash = userHash || LocalStore.getUserHash(); diff --git a/www/common/notifications.js b/www/common/notifications.js index 82fb4b45d..8ec80c2e9 100644 --- a/www/common/notifications.js +++ b/www/common/notifications.js @@ -129,6 +129,7 @@ define([ var obj = { p: msg.content.isTemplate ? ['template'] : undefined, t: teamNotification || undefined, + f: 1, pw: msg.content.password || '' }; common.openURL(Hash.getNewPadURL(msg.content.href, obj)); diff --git a/www/common/outer/mailbox-handlers.js b/www/common/outer/mailbox-handlers.js index a2b2ed08a..06de11374 100644 --- a/www/common/outer/mailbox-handlers.js +++ b/www/common/outer/mailbox-handlers.js @@ -8,7 +8,8 @@ define([ '/common/common-hash.js', '/common/common-util.js', '/components/chainpad-crypto/crypto.js', -], function (ApiConfig, Messaging, Hash, Util, Crypto) { + '/common/outer/login-block.js', + ], function (ApiConfig, Messaging, Hash, Util, Crypto, Block) { // Random timeout between 10 and 30 times your sync time (lag + chainpad sync) var getRandomTimeout = function (ctx) { @@ -265,7 +266,9 @@ define([ } if (content.password) { - var key = ctx.store.driveSecret.keys.cryptKey; + var uHash = ctx.store.data.blockHash; + var uSecret = Block.parseBlockHash(uHash); + var key = uSecret.keys.symmetric; content.password = Crypto.encrypt(content.password, key); } From f3c7b7f0bc1c81327fbf681eaa6bca83da6041fa Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 15 Jul 2024 07:43:38 +0200 Subject: [PATCH 035/188] Translated using Weblate (Spanish (Cuba)) Currently translated at 98.7% (1758 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 87.5% (1558 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 84.2% (1500 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 84.2% (1499 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 79.6% (1417 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 67.3% (1199 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 67.3% (1199 of 1780 strings) Co-authored-by: Desire Hernandez Co-authored-by: Raul Gonzalez Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es_CU/ Translation: CryptPad/App --- www/common/translations/messages.es_CU.json | 636 +++++++++++++++++++- 1 file changed, 634 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.es_CU.json b/www/common/translations/messages.es_CU.json index ad364ba5f..08b455d71 100644 --- a/www/common/translations/messages.es_CU.json +++ b/www/common/translations/messages.es_CU.json @@ -89,7 +89,7 @@ "whiteboard": "Pizarra", "file": "Archivo", "media": "Medios", - "todo": "Todo", + "todo": "Lista de tareas", "contacts": "Contactos", "sheet": "Hoja", "form": "Formulario", @@ -1148,5 +1148,637 @@ "owner_text": "Los dueño(s) de un documento son los únicos usuarios autorizados para: añadir/eliminar dueños, restringir el acceso al documento con una lista de acceso, o eliminar el documento.", "oo_login": "Por favor, inicia sesión o regístrate para mejorar el rendimiento de las hojas de cálculo.", "comments_reply": "Responder", - "history_restoreDrivePrompt": "¿Estás seguro de que quieres reemplazar la versión actual del CryptDrive con la versión mostrada?" + "history_restoreDrivePrompt": "¿Estás seguro de que quieres reemplazar la versión actual del CryptDrive con la versión mostrada?", + "loading_state_2": "Actualizar contenido", + "loading_state_3": "Cargar carpetas compartidas", + "loading_state_4": "Cargar equipos", + "loading_state_5": "Reconstruir documento", + "tag_edit": "Editar", + "error_unhelpfulScriptError": "Error de script: consulta la consola del navegador para más detalles", + "documentID": "Identificador del documento", + "admin_registrationTitle": "Cerrar registro", + "admin_defaultlimitHint": "Límite máximo de almacenamiento para CryptDrives (usuarios y equipos) cuando no se aplica ninguna regla personalizada", + "admin_defaultlimitTitle": "Límite de almacenamiento (MB)", + "admin_setlimitButton": "Establecer límite", + "admin_limit": "Límite actual: {0}", + "admin_getlimitsHint": "Enumere todos los límites de almacenamiento personalizados aplicados a su instancia.", + "admin_limitPlan": "Plan: {0}", + "admin_setlimitTitle": "Aplicar un límite personalizado", + "admin_limitMB": "Límite (en MB)", + "admin_invalLimit": "Valor límite no válido", + "admin_cat_quota": "Almacenamiento de usuario", + "team_exportTitle": "Descargar unidad de equipo", + "team_exportButton": "Descargar", + "fm_deletedFolder": "Carpeta eliminada", + "access_destroyPad": "Destruye este documento o carpeta permanentemente", + "fm_shareFolderPassword": "Proteja esta carpeta con una contraseña (opcional)", + "loading_state_0": "Construir interfaz", + "admin_archiveButton": "Archivo", + "admin_unarchiveHint": "Restaurar un documento que había sido previamente archivado", + "admin_unarchiveButton": "Restaurar", + "admin_archiveInput": "URL del documento", + "admin_archiveInput2": "URL del documento", + "restoredFromServer": "Documento restaurado", + "archivedFromServer": "Documento archivado", + "allowNotifications": "Permitir notificaciones", + "fileTableHeader": "Descargas y subidas", + "download_zip": "Construyendo archivo ZIP…", + "download_zip_file": "Archivo {0}/{1}", + "Offline": "Desconectado", + "mediatag_saveButton": "Guardar", + "pad_mediatagShare": "Compartir archivo", + "pad_mediatagOpen": "Abrir documento", + "mediatag_notReady": "Por favor completa la descarga", + "settings_mediatagSizeTitle": "Límite de descarga automática", + "mediatag_loadButton": "Cargar adjunto", + "history_trimPrompt": "Este documento ha acumulado {0} de historial que puede ralentizar el tiempo de carga. Considere eliminar el historial si no es necesario.", + "contacts_confirmCancel": "¿Está seguro de que desea cancelar su solicitud de contacto con {0}?", + "admin_support_premium": "Entradas premium:", + "admin_support_normal": "Boletos sin respuesta:", + "admin_support_answered": "Tickets respondidos:", + "admin_support_closed": "Tickets cerrados:", + "admin_support_open": "Mostrar", + "admin_support_collapse": "Colapsar", + "admin_support_first": "Creado en: ", + "admin_support_last": "Actualizado en: ", + "share_noContactsOffline": "Actualmente estás desconectado. Los contactos no están disponibles.", + "register_notes_title": "Notas importantes", + "admin_getlimitsTitle": "Límites personalizados", + "admin_limitSetNote": "Nota", + "team_exportHint": "Descarga todos los documentos en el disco de este equipo. 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.", + "admin_invalKey": "Clave pública no válida", + "loading_state_1": "Cargar unidad", + "settings_mediatagSizeHint": "Tamaño máximo en megabytes (MB) para cargar automáticamente elementos multimedia (imágenes, vídeos, pdf) incrustados en documentos. Los elementos más grandes que el tamaño especificado se pueden cargar manualmente. Utilice \"-1\" para cargar siempre los elementos multimedia automáticamente.", + "access_offline": "Actualmente estás desconectado. La gestión de acceso no está disponible.", + "admin_setlimitHint": "Establezca límites personalizados para los usuarios utilizando su clave pública. Puede actualizar o eliminar un límite existente.", + "errorPopupBlocked": "CryptPad necesita poder abrir nuevas pestañas para funcionar. Permita ventanas emergentes en la barra de direcciones de su navegador. Estas ventanas nunca serán utilizadas para mostrarte publicidad.", + "admin_limitNote": "Nota: {0}", + "admin_limitUser": "Clave pública del usuario", + "tag_add": "Añadir", + "unableToDisplay": "No se puede mostrar el documento. Presione Esc para recargar la página. Si el problema persiste, comuníquese con el soporte.", + "admin_archiveHint": "Hacer que un documento no esté disponible sin eliminarlo permanentemente. Se colocará en un directorio de 'archivo' y se eliminará después de unos días (configurable en el archivo de configuración del servidor).", + "offlineError": "No se pueden sincronizar los datos más recientes; esta página no se puede mostrar en este momento. La carga continuará cuando se restablezca su conexión al servicio.", + "infobar_versionHash": "Actualmente estás viendo una versión anterior de este documento ({0}).", + "snaphot_title": "Instantánea", + "snapshots_button": "Instantáneas", + "snapshots_new": "Nueva instantánea", + "snapshots_placeholder": "Título de la instantánea", + "snapshots_open": "Abierto", + "snapshots_restore": "Restaurar", + "snapshots_close": "Cerrar", + "snapshots_delete": "Eliminar", + "oo_version_latest": "Ultimo", + "oo_version": "Versión: ", + "snapshot_error_exists": "Ya existe una instantánea de esta versión", + "snapshots_notFound": "Esta instantánea ya no existe porque se eliminó el historial del documento.", + "snapshots_cantMake": "No se pudo crear la instantánea. Estás desconectado.", + "register_notes": "
  • Su contraseña es la clave secreta que cifra todos sus documentos. Si lo pierdes no hay manera de que podamos recuperar tus datos.
  • Si está utilizando una computadora compartida, recuerda cerrar sesión Cuando acabes. Sólo cerrar la ventana del navegador deja su cuenta expuesta.
  • Para conservar los documentos que creó y/o almacenó sin iniciar sesión, marque \"Importar documentos desde su sesión de invitado\".
", + "register_warning_note": "Debido a la naturaleza cifrada de CryptPad, los administradores del servicio no podrán recuperar datos en caso de que olvide su nombre de usuario y/o contraseña. Guárdelos en un lugar seguro.", + "creation_expiresIn": "Destruir en", + "creation_helperText": "Abierto en documentación", + "docs_link": "Documentación", + "settings_cacheTitle": "Cache", + "settings_cacheCheckbox": "Habilitar caché en este dispositivo", + "settings_cacheButton": "Borrar caché existente", + "undo": "Deshacer", + "redo": "Rehacer", + "admin_cat_performance": "Rendimiento", + "admin_performanceProfilingHint": "Una descripción general del tiempo total dedicado a ejecutar varios comandos del lado del servidor", + "admin_performanceProfilingTitle": "Rendimiento", + "admin_performanceKeyHeading": "Comando", + "admin_performanceTimeHeading": "Tiempo (segundos)", + "admin_performancePercentHeading": "Porcentaje", + "settings_cat_style": "Apariencia", + "settings_colortheme_dark": "Oscuro", + "settings_colortheme_light": "Luz", + "settings_colortheme_default": "Predeterminado del sistema ({0})", + "settings_colorthemeTitle": "Tema de color", + "pad_settings_title": "Configuración del documento", + "pad_settings_info": "Configuración predeterminada para este documento. Estos se aplicarán cuando nuevos usuarios visiten este documento.", + "pad_settings_width_small": "Modo de página", + "pad_settings_width_large": "Ancho completo", + "pad_settings_comments": "Elija si los Comentarios deben estar visibles u ocultos de forma predeterminada.", + "pad_settings_hide": "Esconder", + "pad_settings_show": "Mostrar", + "settings_colortheme_custom": "Personalizado", + "addOptionalPassword": "Agregar una contraseña (opcional)", + "importError": "No se pudo importar (formato incorrecto)", + "fm_cantUploadHere": "No se puede subir un archivo aquí", + "toolbar_degraded": "Actualmente hay más de {0} editores presentes en este documento. La lista de usuarios y el chat están deshabilitados para mejorar el rendimiento.", + "admin_cat_broadcast": "Transmisión", + "admin_maintenanceTitle": "Mantenimiento", + "admin_maintenanceButton": "Planificar mantenimiento", + "admin_maintenanceCancel": "Cancelar mantenimiento", + "broadcast_start": "Comenzar", + "broadcast_end": "Fin", + "broadcast_maintenance": "Está previsto un mantenimiento entre {0} and {1}.Es posible que CryptPad no esté disponible en ese momento.", + "admin_surveyTitle": "Encuesta", + "broadcast_newSurvey": "Una nueva encuesta está disponible. Haga clic para abrir.", + "admin_surveyButton": "Guardar encuesta", + "admin_surveyCancel": "Eliminar", + "form_update": "Actualizar", + "broadcast_surveyURL": "Enlace de encuesta", + "admin_broadcastButton": "Enviar", + "admin_broadcastActive": "Mensaje activo", + "admin_broadcastCancel": "Borrar mensaje", + "broadcast_translations": "Traducciones", + "broadcast_defaultLanguage": "Recurrir a este idioma", + "broadcast_preview": "Vista previa de notificación", + "broadcast_newCustom": "Mensaje de los administradores", + "settings_deleteContinue": "Borrar mi cuenta", + "settings_deleteSubscription": "Administrar mi suscripción", + "footer_roadmap": "Hoja de ruta", + "oo_cantMigrate": "Esta hoja excede el tamaño máximo de carga y es demasiado grande para migrarla.", + "pad_goToAnchor": "Ir al ancla", + "calendar_import_temp": "Importar este calendario", + "calendar_weekNumber": "Semana {0}", + "calendar_before": "antes", + "calendar": "Calendario", + "calendar_default": "Mi calendario", + "calendar_new": "Nuevo calendario", + "calendar_day": "Día", + "calendar_week": "Semana", + "calendar_month": "Mes", + "calendar_today": "Hoy", + "calendar_deleteConfirm": "¿Estás seguro de que deseas eliminar este calendario de tu cuenta?", + "calendar_deleteTeamConfirm": "¿Estás seguro de que deseas eliminar este calendario del equipo?", + "calendar_deleteOwned": "Permanecerá visible para otros usuarios con los que se haya compartido.", + "calendar_errorNoCalendar": "No se ha seleccionado ningún calendario editable", + "calendar_import": "Añadir a mis calendarios", + "calendar_newEvent": "Nuevo evento", + "calendar_dateRange": "{0} - {1}", + "calendar_dateTimeRange": "{0} {1} - {2}", + "calendar_update": "Actualizar", + "calendar_title": "Título", + "calendar_loc": "Ubicación", + "form_submitWarning": "Enviar de todos modos", + "calendar_allDay": "Todo el día", + "calendar_minutes": "Minutos", + "calendar_hours": "Horas", + "calendar_days": "Días", + "calendar_more": "{0} más", + "reminder_now": "{0} ha empezado", + "reminder_inProgress": "{0} ha comenzado el {1}", + "reminder_inProgressAllDay": "Hoy: {0}", + "reminder_minutes": "{0} comenzará en {1} minuto(s)", + "reminder_time": "{0} hoy a las {1}", + "reminder_date": "{0} en {1}", + "settings_notifCalendarHint": "Activa/desactiva todas las notificaciones de los próximos eventos del calendario.", + "settings_notifCalendarCheckbox": "Habilitar notificaciones de calendario", + "calendar_notifications": "Recordatorios", + "calendar_addNotification": "Agregar recordatorio", + "calendar_noNotification": "Ninguno", + "genericCopySuccess": "Copiado al portapapeles", + "mediatag_defaultImageName": "imagen", + "register_registrationIsClosed": "El registro está cerrado.", + "oo_importBin": "Haz clic en OK para importar el formato .bin interno de CryptPad.", + "admin_emailTitle": "Correo electrónico de contacto del administrador", + "admin_emailHint": "Establece el correo electrónico de contacto para tu instancia aquí", + "admin_supportPrivTitle": "Clave privada del buzón de soporte", + "admin_supportInitGenerate": "Generar claves de soporte", + "admin_supportPrivButton": "Mostrar clave", + "share_formEdit": "Autor", + "share_formView": "Participante", + "form_invalid": "Formulario inválido", + "form_editBlock": "Editar", + "form_editMaxLength": "Caracteres máximos", + "form_editType": "Tipo de opción", + "form_poll_text": "Texto", + "form_poll_day": "Día", + "form_poll_time": "Hora", + "form_poll_switch": "Intercambiar ejes", + "form_pollTotal": "Total", + "form_pollYourAnswers": "Tus respuestas", + "form_textType": "Tipo de texto", + "form_text_text": "Texto", + "form_text_url": "Enlace", + "form_text_email": "Correo", + "form_text_number": "Número", + "form_default": "¿Tu pregunta aquí?", + "form_type_input": "Texto", + "form_type_radio": "Escoge", + "form_type_multiradio": "Cuadrícula de elección", + "form_type_checkbox": "Casilla de verificación", + "form_type_multicheck": "Cuadrícula de Casillas de Verificación", + "form_type_poll": "Encuesta", + "form_sort_hint": "Por favor arrastre estos elementos desde la mayoría (1) al menos{0}) preferido.", + "form_type_md": "Descripción", + "form_type_page": "Salto de Página", + "form_description_default": "Tu texto aquí", + "form_maxLength": "Límite de caracteres: {0}/{1}", + "form_submit": "Enviar", + "form_reset": "Reiniciar", + "form_updateWarning": "Actualizar de todos modos", + "form_answered": "Ya has respondido este formulario", + "form_results": "Respuestas ({0})", + "form_results_empty": "No hay respuestas", + "form_editor": "Editor", + "form_showIndividual": "Mostrar respuestas individuales", + "form_showSummary": "Mostrar resumen", + "form_answerAnonymous": "Respuesta anónima en {0}", + "form_viewButton": "Vista", + "form_backButton": "Atrás", + "form_answerName": "Respuesta de {0} en {1}", + "form_answerWarning": "Identidad no confirmada", + "form_notAnswered": "{0} respuestas vacías", + "form_input_ph_url": "https://example.com", + "form_invalidWarning": "Hay errores en algunas respuestas:", + "form_invalidQuestion": "Pregunta {0}", + "form_makePublic": "Publicar respuestas", + "form_isPublic": "Las respuestas son públicas", + "form_isPrivate": "Las respuestas son privadas", + "form_open": "Abierto", + "form_setEnd": "Establecer fecha de cierre", + "form_removeEnd": "Eliminar fecha de cierre", + "form_isOpen": "Este formulario está abierto", + "form_isClosed": "Este formulario se cerró el {0}", + "form_willClose": "Este formulario se cerrará el {0}", + "form_anonymous": "Acceso de invitado (sin iniciar sesión)", + "form_anonymous_on": "Permitido", + "form_anonymous_off": "Bloqueado", + "form_defaultItem": "Artículo {0}", + "form_newOption": "Nueva opción", + "form_newItem": "Nuevo artículo", + "form_add_option": "Agregar opción", + "form_add_item": "Agregar artículo", + "form_addMultiple": "Agregar todo", + "form_addMultipleHint": "Agregar varias fechas y horas", + "form_clear": "Borrar", + "form_page": "Página {0}/{1}", + "form_anonymousBox": "Responder anónimamente", + "settings_driveRedirectTitle": "redirección a la página de inicio", + "admin_registrationHint": "Los visitantes de la instancia no pueden crear cuentas. Los administradores pueden crear invitaciones.", + "admin_onboardingNamePlaceholder": "Título de instancia", + "history_restoreDriveDone": "CryptDrive restaurado", + "oo_deletedVersion": "Esta versión ya no existe en el historial.", + "snapshots_ooPickVersion": "Debes seleccionar una versión antes de crear una instantánea", + "settings_cacheHint": "CryptPad almacena partes de sus documentos en la memoria de su navegador para ahorrar uso de la red y mejorar los tiempos de carga. Puedes desactivar el caché si tu dispositivo no tiene mucho espacio de almacenamiento libre. Por razones de seguridad, el caché siempre se borra cuando cierras sesión, pero puedes borrarlo manualmente si deseas recuperar espacio de almacenamiento en tu máquina.", + "settings_colorthemeHint": "Cambie los colores generales de CryptPad en este dispositivo.", + "pad_settings_outline": "Elija si la tabla de contenido debe estar visible u oculta de forma predeterminada.", + "oo_lostEdits": "Lamentablemente, sus ediciones recientes no guardadas no se pudieron recuperar después de sincronizar contenido nuevo.", + "admin_maintenanceHint": "Planifique un mantenimiento en esta instancia y notifique a todos los usuarios. Limitado a un mantenimiento activo a la vez.", + "admin_surveyHint": "Agregue, actualice o elimine un enlace a una encuesta externa. Los usuarios recibirán una notificación y la encuesta permanecerá disponible en el menú de usuario.", + "admin_surveyActive": "Abrir encuesta", + "admin_broadcastTitle": "Mensaje de transmisión", + "admin_broadcastHint": "Envíe un mensaje a todos los usuarios de esta instancia. Todos los usuarios nuevos y existentes lo recibirán como notificación. Obtenga una vista previa de los mensajes antes de enviarlos con \"Vista previa de notificación\". Las notificaciones de vista previa tienen un ícono rojo y solo usted puede verlas.", + "settings_deleteWarning": "Advertencia: actualmente estás suscrito a un plan premium (pagado o proporcionado por otro usuario). Cancela tu plan antes de eliminar tu cuenta, ya que no será posible hacerlo sin contactar con soporte una vez que tu cuenta sea eliminada.", + "settings_notifCalendarTitle": "Notificaciones del calendario", + "oo_conversionSupport": "Tu navegador no puede manejar la conversión de y hacia formatos de Office. Te sugerimos usar una versión reciente de Firefox o Chrome.", + "form_type_sort": "Lista ordenada", + "form_input_ph_email": "email@example.com", + "form_defaultOption": "Opción {0}", + "form_anonymous_blocked": "Las respuestas de los invitados están bloqueadas para este formulario. Usted debe iniciar sesión o registrarse enviar respuestas.", + "settings_driveRedirectHint": "La redirección automática desde la página de inicio hasta el drive cuando se inicia sesión ya no está habilitada por defecto. El comportamiento heredado puede ser habilitado a continuación.", + "reminder_missed": "{0} tuvo lugar el {1}", + "toolbar_storeInDrive": "Almacenar en CryptDrive", + "form_editMax": "Opciones máximas seleccionables", + "admin_supportPrivHint": "Muestra la clave privada que necesitarán otros administradores para ver los tickets de soporte. Un formulario para ingresar esta clave se mostrará en su panel de administración.", + "share_formAuditor": "Auditor", + "form_type_textarea": "Párrafo", + "form_delete": "Borrar", + "form_maxOptions": "máximo {0} respuesta(s)", + "form_cantFindAnswers": "No se pueden recuperar tus respuestas existentes para este formulario.", + "form_makePublicWarning": "¿Estás seguro de que quieres hacer públicas las respuestas a este formulario? Las respuestas pasadas y futuras serán visibles para los participantes. Esto no se puede deshacer.", + "mdToolbar_embed": "Insertar archivo", + "team_leaveOwner": "Por favor, reduce tu rol de propietario antes de salir del equipo. Ten en cuenta que cada equipo debe tener al menos un propietario; por favor, añade otro propietario antes de proceder si eres el único propietario actualmente.", + "form_exportCSV": "Exportar a CSV", + "notification_openLink": "Has recibido un enlace {0} de {1}:", + "fm_link_new": "Nuevo enlace", + "settings_driveRedirect": "Redirigirme automáticamente", + "copyToClipboard": "Copiar al portapapeles", + "restrictedLoginPrompt": "No estás autorizado a acceder a este documento. Iniciar sesión si cree que su cuenta debería poder acceder a ella.", + "admin_cat_network": "Red", + "admin_updateAvailableTitle": "Nuevas versiones", + "admin_updateAvailableHint": "Una nueva versión de CryptPad está disponible", + "admin_updateAvailableButton": "Ver notas de la versión", + "admin_checkupTitle": "Validar la configuración de la instancia", + "admin_checkupHint": "CryptPad incluye una página que diagnostica automáticamente problemas de configuración comunes y sugiere cómo corregirlos si es necesario.", + "admin_checkupButton": "Ejecutar diagnóstico", + "admin_consentToContactTitle": "Consentimiento para contactar", + "admin_consentToContactHint": "La telemetría del servidor incluye el correo electrónico de contacto del administrador para que los desarrolladores puedan notificarte sobre problemas graves con el software o tu configuración. Nunca será compartido, vendido ni utilizado con fines de marketing. Da tu consentimiento para que te contacten si deseas estar informado sobre problemas críticos en tu servidor.", + "admin_consentToContactLabel": "Doy mi consentimiento", + "admin_listMyInstanceTitle": "Listar mi instancia en directorios públicos", + "admin_listMyInstanceHint": "Si su instancia es adecuada para uso público, puede dar su consentimiento para aparecer en directorios web. La telemetría del servidor debe estar habilitada para que esto tenga algún efecto.", + "admin_listMyInstanceLabel": "Listar esta instancia", + "admin_removeDonateButtonTitle": "Participación en financiamiento colectivo", + "admin_removeDonateButtonLabel": "No hagas publicidad de campañas de financiamiento colectivo", + "admin_blockDailyCheckTitle": "Telemetría del servidor", + "admin_blockDailyCheckLabel": "Deshabilitar la telemetría del servidor", + "admin_provideAggregateStatisticsTitle": "Agregación estadística", + "admin_provideAggregateStatisticsHint": "Puede optar por proporcionar métricas de uso adicionales a los desarrolladores, como la cantidad aproximada de usuarios registrados y diarios para su instancia.", + "admin_provideAggregateStatisticsLabel": "Proporcionar estadísticas agregadas", + "form_poll_hint": ": Si, : No, : Aceptable", + "fc_open_formro": "Abierto (como participante)", + "resources_imageBlocked": "CryptPad bloqueó una imagen remota", + "resources_openInNewTab": "Ábrelo en una nueva pestaña", + "resources_learnWhy": "Descubra por qué fue bloqueado", + "admin_instancePurposeTitle": "Propósito de la instancia", + "admin_purpose_noanswer": "Prefiero no decirlo", + "admin_purpose_experiment": "Para probar la plataforma o desarrollar nuevas funciones", + "admin_purpose_personal": "Para mi, familia o amigos", + "admin_purpose_org": "Para una organización sin fines de lucro o un grupo de defensa", + "admin_purpose_education": "Para una escuela, colegio o universidad", + "admin_purpose_public": "Brindar un servicio gratuito al público", + "admin_purpose_business": "Para una empresa u organización comercial", + "admin_instancePurposeHint": "¿Por qué ejecuta esta instancia? Su respuesta se utilizará para informar la hoja de ruta de desarrollo si su telemetría está habilitada.", + "fm_link_type": "Enlace", + "fm_link_name": "Nombre del enlace", + "fm_link_url": "URL", + "fm_link_name_placeholder": "Mi enlace", + "notification_linkShared": "{0} ha compartido un enlace contigo: {1}", + "form_anonName": "Tu nombre", + "form_answerAs": "Responder como", + "fm_link_invalid": "URL invalida", + "ui_collapse": "Colapsar", + "ui_expand": "Expandir", + "form_totalResponses": "Respuestas totales: {0}", + "support_premiumLink": "Ver opciones de suscripción", + "toolbar_collapse": "Contraer barra de herramientas", + "toolbar_expand": "Expandir barra de herramientas", + "profile_defaultAlt": "Imagen de perfil predeterminada", + "upload_modal_alt": "Texto alternativo", + "upload_addOptionalAlt": "Agregar texto descriptivo (opcional)", + "admin_bytesWrittenTitle": "Ventana de medición del rendimiento del disco", + "admin_bytesWrittenHint": "Si ha habilitado las mediciones de rendimiento del disco, la duración de la ventana se puede configurar a continuación.", + "admin_setDuration": "Establecer duración", + "ui_ms": "milisegundos", + "admin_enableembedsTitle": "Habilitar la incrustación remota", + "admin_enableembedsHint": "Permitir que los documentos y medios de esta instancia puedan ser incrustados en otros sitios web. Esto agregará una opción de 'Incrustar' en el menú Compartir. Por razones de seguridad, las aplicaciones que utilizan OnlyOffice (Sheets, Document, Presentation) no pueden ser incrustadas incluso si esta configuración está activa.", + "error_embeddingDisabled": "La incrustación está deshabilitada para esta instancia de CryptPad", + "error_incorrectAccess": "Solo se puede acceder a esta página a través de {0}.", + "ui_experimental": "Esta característica se considera experimental.", + "admin_noticeTitle": "Aviso de la página de inicio", + "admin_noticeHint": "Un mensaje opcional para mostrar en la página de inicio", + "footer_website": "Sitio web del proyecto", + "home_location": "Los datos cifrados están alojados en {0}", + "home_morestorage": "Para más espacio de almacenamiento:", + "login_instance": "Conéctese a su cuenta en {0}", + "register_instance": "Creando una nueva cuenta en {0}", + "admin_uptimeTitle": "Hora de almuerzo", + "admin_uptimeHint": "Fecha y hora en que se lanzó el servidor", + "admin_removeDonateButtonHint": "El desarrollo de CryptPad está parcialmente financiado por subvenciones públicas y donaciones. Publicitar nuestros esfuerzos de financiamiento colectivo en tu instancia ayuda a los desarrolladores a seguir mejorando la plataforma para todos, pero puedes desactivar estos avisos si consideras que no son apropiados.", + "error_embeddingDisabledSpecific": "La incrustación está deshabilitada para esta aplicación CryptPad.", + "admin_blockDailyCheckHint": "Las instancias de CryptPad envían un mensaje al servidor de los desarrolladores cuando se lanzan y una vez al día después. Esto les permite realizar un seguimiento de cuántos servidores están ejecutando qué versiones del software. Puedes optar por no participar en esta medición a continuación. El contenido de este mensaje se puede encontrar en el registro del servidor de aplicaciones para que lo revises.", + "fm_link_warning": "Advertencia: la URL supera los 200 caracteres", + "support_premiumPriority": "Los usuarios Premium ayudan a respaldar las mejoras en la usabilidad de CryptPad y se benefician de respuestas prioritarias a sus tickets de soporte.", + "error_evalPermitted": "Solo se puede acceder a esta página a través de {0}.\n\nEste error está vinculado a los encabezados Content-Security-Policy, podría deberse a: un navegador desactualizado que no los admite, extensiones del navegador que interfieren con su correcto comportamiento o una configuración incorrecta de esta instancia de CryptPad.", + "admin_cat_database": "Base de datos", + "admin_restoreBlock": "Restaurar bloque archivado", + "admin_getPinList": "Lista de pines actual", + "form_condorcetRanked": "Parejas clasificadas", + "admin_generatedAt": "Marca de tiempo del informe", + "ui_true": "Verdadero", + "ui_false": "falso", + "ui_undefined": "desconocido", + "ui_none": "ninguno", + "ui_generateReport": "Generar informe", + "ui_success": "Éxito", + "ui_restore": "Restaurar", + "ui_fetch": "Buscar", + "ui_confirm": "Confirmar", + "ui_archive": "Archivar", + "admin_archiveReason": "Especifique el motivo del archivo y confirme que desea continuar", + "admin_restoreReason": "Especifique el motivo de la restauración y confirme que desea continuar", + "admin_accountMetadataTitle": "Información de la cuenta", + "admin_accountMetadataHint": "Ingrese la clave pública de un usuario para obtener datos sobre su cuenta.", + "admin_documentMetadataTitle": "Información del Documento", + "admin_documentMetadataHint": "Consultar un documento o archivo a través de su ID o URL", + "admin_documentType": "Tipo de Documento", + "admin_documentSize": "Tamaño del documento", + "admin_documentMetadata": "Metadatos actuales", + "admin_documentCreationTime": "Creado", + "admin_documentModifiedTime": "Última modificación", + "admin_currentlyOpen": "Actualmente abierto", + "admin_channelAvailable": "Disponible", + "admin_channelArchived": "Archivado", + "admin_documentMetadataPlaceholder": "URL o ID del documento", + "admin_blockMetadataTitle": "Información del bloqueo de inicio de sesión", + "admin_blockMetadataHint": "El bloque de inicio de sesión es lo que permite que una cuenta inicie sesión en CryptPad con la combinación de nombre de usuario + contraseña", + "admin_blockMetadataPlaceholder": "URL de bloqueo absoluto o relativo", + "admin_accountMetadataPlaceholder": "Identificación de usuario (clave de firma pública)", + "admin_firstPinTime": "Tiempo de actividad del primer pin", + "admin_lastPinTime": "Hora de actividad del último pin", + "admin_currentlyOnline": "Está actualmente en línea", + "admin_planName": "Nombre del plan", + "admin_note": "Nota del plano", + "admin_storageUsage": "Datos almacenados", + "admin_channelCount": "Número de documentos", + "admin_fileCount": "Número de archivos", + "admin_pinLogAvailable": "El registro de pines está disponible", + "admin_pinLogArchived": "El registro de pines está archivado", + "admin_blockKey": "Bloquear clave pública", + "admin_blockAvailable": "El bloque está disponible", + "admin_blockArchived": "El bloque está archivado", + "admin_archiveBlock": "Bloque de archivo", + "admin_archiveDocument": "Archivar documento", + "admin_restoreDocument": "Restaurar documento", + "admin_planlimit": "Límite de almacenamiento", + "admin_reportContent": "Reportar contenido", + "admin_getRawMetadata": "Historial de metadatos", + "og_teamDrive": "Unidad de equipo", + "og_default": "CryptPad: suite de colaboración cifrada de extremo a extremo", + "og_login": "Inicia sesión en {0}", + "og_register": "Registre una cuenta en {0}", + "form_showCondorcetMethod": "Método condorcet", + "form_condorcetSchulze": "Schulze", + "admin_invitationEmail": "Correo electrónico del usuario", + "admin_registrationSsoTitle": "Cerrar el registro SSO", + "admin_invitationCreate": "Crear enlace de invitación", + "admin_invitationTitle": "Enlaces de invitación", + "admin_invitationLink": "Enlace de invitación", + "admin_invitationDeleteConfirm": "¿Estás seguro de que deseas eliminar esta invitación?", + "admin_invitationCopy": "Copiar link", + "admin_usersTitle": "Directorio de usuarios", + "admin_invitationAlias": "Nombre de usuario", + "admin_usersHint": "Lista de cuentas conocidas en esta instancia. Seleccione a continuación para agregar cuentas automáticamente o ingrese información manualmente usando el formulario.", + "admin_usersRemove": "Eliminar", + "admin_usersAdd": "Agregar usuario conocido", + "admin_storeInvitedLabel": "Almacenar automáticamente los usuarios invitados", + "admin_usersRemoveConfirm": "¿Está seguro de que desea eliminar este usuario del directorio? Aún podrán acceder y utilizar su cuenta.", + "admin_storeSsoLabel": "Almacenar automáticamente los usuarios invitados", + "admin_usersBlock": "URL de bloqueo de inicio de sesión del usuario (opcional)", + "register_invalidToken": "El enlace de invitación no es válido", + "form_showCondorcetWinner": "ganador: ", + "recovery_mfa_description": "Si has perdido el acceso a tu método de Autenticación de Dos Factores, puedes desactivar el 2FA para tu cuenta utilizando tu código de recuperación. Por favor, comienza ingresando tu nombre de usuario y contraseña:", + "access_passwordUsed": "Esta contraseña ya se ha utilizado para este documento. No se puede volver a utilizar.", + "ssoauth_form_hint_register": "Agregue una contraseña de CryptPad para mayor seguridad o déjela vacía y continúe. Si no agrega una contraseña, las claves que protegen sus datos estarán disponibles para los administradores de la instancia.", + "ssoauth_form_hint_login": "Por favor ingrese su contraseña de CryptPad", + "form_condorcetExtendedDisplay": "Número de partidos ganados por cada candidato: ", + "form_type_date": "Fecha", + "done": "Hecho", + "continue": "Continuar", + "mfa_setup_label": "Para habilitar la Autenticación de Dos Factores (2FA), por favor comienza introduciendo tu contraseña de cuenta", + "mfa_setup_button": "Comenzar la configuración 2FA", + "mfa_revoke_button": "Confirmar desactivar 2FA", + "mfa_revoke_code": "Por favor ingrese su código de verificación", + "mfa_status_on": "2FA está activo en esta cuenta", + "mfa_status_off": "2FA no está activo en esta cuenta", + "mfa_recovery_title": "Guarde este código de recuperación ahora", + "mfa_recovery_warning": "Este código no se mostrará de nuevo, por favor guárdalo en un lugar seguro ahora y no lo compartas con nadie.", + "mfa_enable": "Habilitar 2FA", + "mfa_disable": "Deshabilitar 2FA", + "settings_otp_code": "Código de verificación", + "settings_otp_invalid": "código de verificación invalido", + "settings_otp_tuto": "Por favor, escanea este código QR con tu aplicación de autenticación e ingresa el código de verificación para confirmar.", + "settings_removeOwnedTitle": "Destruye todos los documentos que posees", + "settings_removeOwnedText": "Por favor, espera mientras tus documentos están siendo destruidos...", + "recovery_header": "recuperación 2FA", + "recovery_mfa_secret": "Ingrese su código de recuperación para desactivar 2FA para su cuenta:", + "recovery_forgot": "Olvidé el código de recuperación", + "recovery_mfa_error": "Error desconocido. Vuelva a cargar e inténtelo de nuevo.", + "recovery_mfa_disabled": "La autenticación multifactor ya está deshabilitada para esta cuenta.", + "admin_totpEnabled": "2FA está habilitada", + "admin_totpRecoveryMethod": "Método de recuperación 2FA", + "admin_totpFailed": "Verificación de firma fallida", + "admin_totpCheck": "Verificación de firma exitosa", + "admin_totpDisable": "Deshabilitar 2FA para esta cuenta", + "admin_totpDisableButton": "Desactivar", + "register_nameTooLong": "Los nombres de usuario deben tener menos de {0} caracteres", + "loading_enter_otp": "Esta cuenta está protegida con Autenticación de Dos Factores. Por favor, introduce tu código de verificación", + "loading_recover": "¿No puedes obtener un código? Recupera tu cuenta", + "recovery_mfa_secret_ph": "Código de recuperación", + "label_logo": "CryptPad logo", + "login_notFilledUser": "Por favor, ingresa un nombre de usuario", + "login_notFilledPass": "Por favor ingrese una contraseña", + "calendar_settings": "Configuración del calendario", + "goLeft": "Izquierda", + "goRight": "Derecha", + "date": "Fecha", + "context_menu": "Acciones de carpeta", + "label_viewMode": "Alternar modo de visualización", + "team_nameAlreadySet": "El nombre del equipo ya está configurado en {0}", + "selectLanguage": "Selecciona un idioma", + "dph_reason": "Razón: {0}", + "dph_sf_destroyed": "Carpeta compartida{0} fue destruido por un dueño", + "dph_sf_destroyed_team": "Carpeta compartida{0} en la unidad del equipo {1} fue destruido por un dueño", + "admin_archiveAccount": "Archivar esta cuenta", + "admin_archiveAccountInfo": "Incluyendo sus documentos de propiedad", + "admin_archiveAccountConfirm": "Por favor especifique el motivo del archivo, esto se mostrará al usuario.", + "admin_restoreAccount": "Restaurar esta cuenta", + "admin_accountSuspended": "Cuenta archivada por administrador", + "admin_accountReport": "Informe de archivo de cuenta", + "admin_channelPlaceholder": "Marcador de posición de documento destruido", + "dph_default": "Este contenido ya no está disponible", + "dph_account_destroyed": "Esta cuenta fue eliminada por su propietario", + "dph_account_moderated": "Esta cuenta ha sido suspendida por el equipo de moderación", + "dph_account_pw": "La contraseña de esta cuenta fue cambiada", + "dph_pad_destroyed": "Este documento fue destruido por un propietario", + "dph_pad_moderated": "Este documento fue eliminado por el equipo de moderación", + "dph_pad_moderated_account": "Este documento fue eliminado por pertenecer a una cuenta suspendida", + "dph_pad_pw": "Este documento está protegido con una nueva contraseña", + "dph_tmp_moderated": "Esta plantilla fue eliminada por el equipo de moderación", + "dph_tmp_moderated_account": "Esta plantilla fue eliminada por pertenecer a una cuenta suspendida", + "status": "Página de estado", + "calendar_rec_change": "Mover un evento repetido a un calendario diferente. Solo puede aplicar este cambio a este evento o a todos los eventos repetidos.", + "calendar_desc": "Descripción", + "calendar_description": "Descripción:{0}{1}", + "sso_login_description": "Login with", + "sso_register_description": "Registrar con", + "ssoauth_header": "Contraseña de CryptoPad", + "duplicate": "Duplicar", + "kanban_showTags": "Ver todas las etiquetas", + "kanban_hideTags": "Ver menos etiquetas", + "admin_forcemfaTitle": "Autenticación obligatoria de dos factores", + "calendar_rec_change_first": "Mover el primer evento repetido a un calendario diferente. Todos los eventos repetidos también se moverán.", + "admin_cat_security": "Seguridad", + "admin_logoTitle": "Logotipo personalizado", + "admin_cat_customize": "Personalizar", + "admin_colorTitle": "Acentuar el color", + "admin_supportAdd": "Agregar un contacto al equipo de soporte", + "admin_logoHint": "SVG, PNG o JPG, tamaño máximo 200 KB", + "admin_logoButton": "Subir nuevo", + "admin_logoRemoveButton": "Restaurar valor predeterminado", + "admin_colorHint": "Cambie el color de acento de su instancia de CryptPad. Asegúrese de que el texto y los botones sean legibles con suficiente contraste tanto en temas claros como oscuros.", + "admin_colorCurrent": "Color de acento actual", + "admin_supportDisabled": "El sistema de soporte está deshabilitado.", + "admin_colorChange": "Cambiar el color", + "admin_colorPick": "Elige un color", + "admin_colorPreview": "Vista previa del color", + "admin_supportSetupHint": "Cree o actualice las claves de soporte.", + "admin_supportDelete": "Desactivar soporte", + "admin_supportSetupTitle": "Inicializar soporte", + "admin_supportEnabled": "El sistema de soporte está habilitado.", + "admin_supportConfirm": "¿Está seguro? Esto eliminará todos los tickets existentes y bloqueará el acceso de todos los moderadores.", + "support_cat_settings": "Ajustes", + "admin_supportMembers": "Equipo de apoyo", + "admin_supportRotateNotify": "Advertencia: se han generado nuevas claves pero un error inesperado impidió que el sistema las enviara a los moderadores. Elimine y vuelva a agregar a todos los miembros del equipo de soporte", + "support_pending_tag": "Archivado", + "support_cat_closed": "Cerrado", + "support_cat_search": "Buscar", + "support_cat_open": "Bandeja de entrada", + "support_openTicketTitle": "Abrir un ticket con un usuario", + "admin_supportTeamTitle": "Administrar el equipo de soporte", + "support_cat_legacy": "Legado", + "support_pending": "Entradas archivadas:", + "support_privacyHint": "Marque esta opción para responder como 'El equipo de soporte' en lugar de su propio nombre de usuario", + "support_active_tag": "Bandeja de entrada", + "support_closed_tag": "Cerrado", + "support_notificationsTitle": "Desactivar notificaciones", + "support_notificationsHint": "Marque esta opción para desactivar las notificaciones de nuevos tickets y respuestas", + "support_recordedEmpty": "Sin fragmentos", + "support_userChannel": "ID del canal de notificaciones del usuario", + "support_recordedId": "ID de fragmento (único)", + "support_userKey": "Clave pública del usuario", + "support_invalChan": "Canal de notificaciones no válido", + "support_recordedTitle": "Fragmentos", + "admin_supportTeamHint": "Agregar y eliminar personas del equipo de soporte de la instancia", + "support_pasteUserData": "Pegue los datos del usuario aquí", + "support_legacyButton": "Consigue entradas activas", + "support_legacyClear": "Eliminar para esta cuenta", + "support_recordedHint": "Almacene texto común como accesos directos con un solo clic para insertarlo en mensajes de soporte.", + "support_recordedContent": "Contenido", + "support_legacyTitle": "Ver datos de soporte antiguos", + "support_searchLabel": "Buscar (título o ID del ticket)", + "support_team": "El equipo de soporte", + "support_legacyDump": "Exportar todo", + "support_insertRecorded": "Insertar fragmento", + "support_moveActive": "Pasar a activo", + "support_answerAs": "Respondiendo como {0}", + "support_movePending": "Mover al archivo", + "support_copyUserData": "Copiar datos de usuario", + "moderationPage": "Mesa de ayuda", + "admin_supportOpen": "Abrir mesa de ayuda", + "admin_supportInit": "Inicializar la mesa de ayuda en esta instancia", + "admin_cat_users": "Directorio de usuarios", + "support_userNotification": "Nuevo ticket de soporte o respuesta: {0}", + "admin_forcemfaHint": "A todos los usuarios de esta instancia se les pedirá que configuren la autenticación de dos factores para iniciar sesión en su cuenta. Tenga en cuenta que los usuarios existentes no podrán seguir usando su cuenta sin configurar una aplicación TOTP.", + "install_token": "Ficha de instalación", + "install_header": "Instalación", + "install_instance": "Cree la primera cuenta de administrador y luego proceda a personalizar esta instancia", + "install_launch": "Configuración de instancia", + "admin_appSelection": "Configuración de la aplicación", + "admin_appsTitle": "Aplicaciones de instancia", + "admin_appsHint": "Elija qué aplicaciones habilitar en esta instancia.", + "admin_cat_apps": "Aplicaciones", + "onboarding_save_error": "Algunas opciones no se pudieron guardar correctamente. Visite el panel de administración para verificar los valores.", + "onboarding_upload": "Seleccionar logotipo", + "admin_onboardingNameTitle": "Bienvenido a tu instancia de CryptPad", + "admin_onboardingNameHint": "Elija un título, descripción, color destacado y logotipo (todos son opcionales)", + "admin_onboardingOptionsTitle": "Opciones de instancia", + "admin_onboardingOptionsHint": "Seleccione la opción adecuada para su instancia.
Estas configuraciones se pueden cambiar más adelante en el panel de administración.", + "dph_account_inactive": "Esta cuenta fue eliminada por inactividad", + "form_showDetails": "Detalles", + "form_noCondorcetWinner": "Ningún ganador", + "settings_mfaTitle": "Autenticación de Dos Factores (2FA)", + "settings_mfaHint": "Protege tu cuenta con un código de verificación adicional proporcionado por una aplicación de autenticación de tu elección", + "mfa_revoke_label": "Para desactivar la Autenticación de Dos Factores (2FA), por favor comienza introduciendo tu contraseña de cuenta", + "mfa_recovery_hint": "Si pierdes el acceso a tu aplicación de autenticación, puedes quedar bloqueado de tu cuenta de CryptPad. Este código de recuperación puede ser utilizado para desactivar la Autenticación de Dos Factores (2FA) y permitirte volver a entrar.", + "settings_removeOwnedButton": "Destruye los documentos que posees", + "settings_removeOwnedHint": "Todos los documentos de los cuales eres el único dueño serán destruidos permanentemente", + "recovery_forgot_text": "Por favor copie la siguiente información y envíalo por correo electrónico A los administradores de su instancia", + "admin_totpRecoveryTitle": "Recuperación 2FA", + "admin_totpRecoveryHint": "Los usuarios pueden copiar los datos de recuperación en la página de recuperación de 2FA /recovery/ y enviarlos por correo electrónico a los administradores de la instancia. Pegue los datos de recuperación a continuación para desactivar 2FA para una cuenta", + "team_nameTooLong": "El nombre del equipo es demasiado largo (máximo 50 caracteres)", + "dph_sf_pw": "La carpeta compartida {0} está protegida con una nueva contraseña. Ingrese la nueva contraseña para acceder o eliminar esta carpeta de su disco.", + "admin_accountReportFull": "Obtener informe detallado", + "dph_pad_inactive": "Este documento fue eliminado por inactividad", + "dph_tmp_destroyed": "Esta plantilla fue destruida por un propietario", + "dph_tmp_pw": "Esta plantilla está protegida con una nueva contraseña. Ábrelo desde tu disco para ingresar la nueva contraseña.", + "support_openTicketHint": "Copie los datos del usuario destinatario de su página de perfil o de un ticket de soporte existente. Recibirán una notificación de CryptPad sobre este mensaje.", + "support_legacyHint": "Vea tickets del sistema de soporte heredado y recréelos en el nuevo.", + "admin_diskUsageWarning": "¡Úselo con precaución! Dependiendo del tamaño de los datos almacenados en la instancia, generar este informe puede consumir toda la memoria disponible en el servidor y provocar una falla.", + "loading_mfa_required": "En esta instancia se requiere autenticación de dos factores. Actualice su cuenta utilizando una aplicación de autenticación y el formulario a continuación.", + "admin_invitationHint": "Los enlaces de invitación crean una cuenta cada uno, incluso si el registro está cerrado. El nombre de usuario y el correo electrónico son únicamente para fines de identificación. CryptPad no enviará por correo electrónico el enlace de invitación (ni cualquier otra cosa), copie el enlace y envíelo utilizando el canal seguro de su elección.", + "support_privacyTitle": "Responder anónimamente", + "install_notes": "
  • Cree su primera cuenta de administrador en esta página. Los administradores administran la configuración de la instancia, incluidas las cuotas de almacenamiento, y tienen acceso a herramientas de moderación.
  • Su contraseña es la clave secreta que cifra todos sus documentos y privilegios de administrador en esta instancia. Si lo pierde, no hay forma de que podamos recuperar sus datos.
  • Si está utilizando una computadora compartida, recuerda cerrar sesión Cuando acabes. Sólo cerrar la ventana del navegador deja su cuenta expuesta.
" } From 44aee13a56135063f5ef1ea6448254e18ae8400c Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 15 Jul 2024 12:02:07 +0200 Subject: [PATCH 036/188] Compute new metadata first and fallback to old system if needed --- lib/storage/file.js | 29 +++++++-- .../00000000000000000000000000000000.ndjson | 7 +++ ...00000000000000000000000001.metadata.ndjson | 5 ++ .../00000000000000000000000000000001.ndjson | 7 +++ ...00000000000000000000000002.metadata.ndjson | 1 + .../00000000000000000000000000000002.ndjson | 6 ++ ...00000000000000000000000003.metadata.ndjson | 6 ++ .../00000000000000000000000000000003.ndjson | 6 ++ .../00000000000000000000000000000004.ndjson | 6 ++ scripts/tests/test-metadata.js | 60 +++++++++++++++++++ 10 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000000.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000001.metadata.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000001.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000002.metadata.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000002.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000003.metadata.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000003.ndjson create mode 100644 scripts/tests/test-data/00/00000000000000000000000000000004.ndjson create mode 100644 scripts/tests/test-metadata.js diff --git a/lib/storage/file.js b/lib/storage/file.js index 2c2888f7a..d33c42f5f 100644 --- a/lib/storage/file.js +++ b/lib/storage/file.js @@ -429,7 +429,27 @@ How to proceed */ + let requiresChannel = true; + let all = []; nThen(function (w) { + let first = true; + getDedicatedMetadata(env, channelId, (err, line) => { + if (first && !err) { + if (!Array.isArray(line)) { + requiresChannel = false; + } + first = false; + } + all.push({err, line}); + }, w(function (err) { + if (err) { + // stream errors? + w.abort(); + return void cb(err); + } + })); + }).nThen(function (w) { + if (!requiresChannel) { return; } // returns the first line of a channel, parsed... getChannelMetadata(env, channelId, w(function (err, data) { if (err) { @@ -445,13 +465,10 @@ How to proceed handler(null, data); })); }).nThen(function () { - getDedicatedMetadata(env, channelId, handler, function (err) { - if (err) { - // stream errors? - return void cb(err); - } - cb(); + all.forEach(({err, line}) => { + handler(err, line); }); + cb(); }); }; diff --git a/scripts/tests/test-data/00/00000000000000000000000000000000.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000000.ndjson new file mode 100644 index 000000000..cdbaaefa2 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000000.ndjson @@ -0,0 +1,7 @@ +{"owners":["TestOwner"],"validateKey":"TestKey","channel":"0","created":1721035117462} +[0,"test","MSG","test",1721035117969] +[0,"test","MSG","test2",1721035117969] +[0,"test","MSG","test3",1721035117969] +[0,"test","MSG","test4",1721035117969] +[0,"test","MSG","test5",1721035117969] +[0,"test","MSG","test6",1721035117969] diff --git a/scripts/tests/test-data/00/00000000000000000000000000000001.metadata.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000001.metadata.ndjson new file mode 100644 index 000000000..1cafb44c2 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000001.metadata.ndjson @@ -0,0 +1,5 @@ +["RESTRICT_ACCESS",[true],1721035145090] +["ADD_ALLOWED",["NewAllowedKeyNewAllowedKeyNewAllowedKeyNewAl"],1721035148115] +["ADD_PENDING_OWNERS",["PendingOwner"],1721035151295] +["RESTRICT_ACCESS",[false],1721035155836] +["RESTRICT_ACCESS",[true],1721035156728] diff --git a/scripts/tests/test-data/00/00000000000000000000000000000001.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000001.ndjson new file mode 100644 index 000000000..cdbaaefa2 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000001.ndjson @@ -0,0 +1,7 @@ +{"owners":["TestOwner"],"validateKey":"TestKey","channel":"0","created":1721035117462} +[0,"test","MSG","test",1721035117969] +[0,"test","MSG","test2",1721035117969] +[0,"test","MSG","test3",1721035117969] +[0,"test","MSG","test4",1721035117969] +[0,"test","MSG","test5",1721035117969] +[0,"test","MSG","test6",1721035117969] diff --git a/scripts/tests/test-data/00/00000000000000000000000000000002.metadata.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000002.metadata.ndjson new file mode 100644 index 000000000..7c47d09d3 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000002.metadata.ndjson @@ -0,0 +1 @@ +{"owners":["TestOwner"],"validateKey":"TestKey","channel":"0","created":1721035117462} diff --git a/scripts/tests/test-data/00/00000000000000000000000000000002.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000002.ndjson new file mode 100644 index 000000000..99973c454 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000002.ndjson @@ -0,0 +1,6 @@ +[0,"test","MSG","test",1721035117969] +[0,"test","MSG","test2",1721035117969] +[0,"test","MSG","test3",1721035117969] +[0,"test","MSG","test4",1721035117969] +[0,"test","MSG","test5",1721035117969] +[0,"test","MSG","test6",1721035117969] diff --git a/scripts/tests/test-data/00/00000000000000000000000000000003.metadata.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000003.metadata.ndjson new file mode 100644 index 000000000..ffcb25082 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000003.metadata.ndjson @@ -0,0 +1,6 @@ +{"owners":["TestOwner"],"validateKey":"TestKey","channel":"0","created":1721035117462} +["RESTRICT_ACCESS",[true],1721035145090] +["ADD_ALLOWED",["NewAllowedKeyNewAllowedKeyNewAllowedKeyNewAl"],1721035148115] +["ADD_PENDING_OWNERS",["PendingOwner"],1721035151295] +["RESTRICT_ACCESS",[false],1721035155836] +["RESTRICT_ACCESS",[true],1721035156728] diff --git a/scripts/tests/test-data/00/00000000000000000000000000000003.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000003.ndjson new file mode 100644 index 000000000..99973c454 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000003.ndjson @@ -0,0 +1,6 @@ +[0,"test","MSG","test",1721035117969] +[0,"test","MSG","test2",1721035117969] +[0,"test","MSG","test3",1721035117969] +[0,"test","MSG","test4",1721035117969] +[0,"test","MSG","test5",1721035117969] +[0,"test","MSG","test6",1721035117969] diff --git a/scripts/tests/test-data/00/00000000000000000000000000000004.ndjson b/scripts/tests/test-data/00/00000000000000000000000000000004.ndjson new file mode 100644 index 000000000..99973c454 --- /dev/null +++ b/scripts/tests/test-data/00/00000000000000000000000000000004.ndjson @@ -0,0 +1,6 @@ +[0,"test","MSG","test",1721035117969] +[0,"test","MSG","test2",1721035117969] +[0,"test","MSG","test3",1721035117969] +[0,"test","MSG","test4",1721035117969] +[0,"test","MSG","test5",1721035117969] +[0,"test","MSG","test6",1721035117969] diff --git a/scripts/tests/test-metadata.js b/scripts/tests/test-metadata.js new file mode 100644 index 000000000..30d5ddc8c --- /dev/null +++ b/scripts/tests/test-metadata.js @@ -0,0 +1,60 @@ +const Store = require("../../lib/storage/file"); +const Meta = require("../../lib/metadata"); +const nThen = require('nthen'); + +let chanOld = '00000000000000000000000000000000'; +let chanOldUpdated = '00000000000000000000000000000001'; +let chanNew = '00000000000000000000000000000002'; +let chanNewUpdated = '00000000000000000000000000000003'; +let chanNoMeta = '00000000000000000000000000000004'; + +Store.create({ + filePath: './test-data/' +}, (err, store) => { + if (err) { return void console.error(err); } + + const readMetadata = (channel, cb) => { + const ref = {}; + const h = Meta.createLineHandler(ref, console.error); + store.readChannelMetadata(channel, h, () => { + cb(ref && ref.meta); + }); + }; + + nThen(w => { + readMetadata(chanOld, w(meta => { + if (!meta || meta.validateKey !== "TestKey") { + console.log('OldChanNoUpdate', meta); + throw new Error("Error with old channel without metadata update"); + } + })); + readMetadata(chanOldUpdated, w(meta => { + if (!meta || meta.validateKey !== "TestKey" || !meta.restricted || !meta.allowed.includes('NewAllowedKeyNewAllowedKeyNewAllowedKeyNewAl')) { + console.log('OldChanUpdate', meta); + throw new Error("Error with old channel with metadata updates"); + } + })); + readMetadata(chanNew, w(meta => { + if (!meta || meta.validateKey !== "TestKey") { + console.log('NewChanNoUpdate', meta); + throw new Error("Error with new channel without metadata update"); + } + })); + readMetadata(chanNewUpdated, w(meta => { + if (!meta || meta.validateKey !== "TestKey" || !meta.restricted || !meta.allowed.includes('NewAllowedKeyNewAllowedKeyNewAllowedKeyNewAl')) { + console.log('NewChanUpdate', meta); + throw new Error("Error with new channel with metadata updates"); + } + })); + readMetadata(chanNoMeta, w(meta => { + if (meta && Object.keys(meta).length) { + console.log('NoMetadataChan', meta); + throw new Error("Error with channel without metadata"); + } + })); + }).nThen(() => { + console.log('Success'); + process.exit(1); + }); +}) + From e4da9285d0d840eec2304b1b8cc76541d184cc37 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:40:44 +0300 Subject: [PATCH 037/188] Implement review fixes - change modal constructor and add translation keys --- customize.dist/messages.js | 3 +- www/admin/inner.js | 89 +++++++++++--------------------------- 2 files changed, 27 insertions(+), 65 deletions(-) diff --git a/customize.dist/messages.js b/customize.dist/messages.js index 2459a246f..0e748c98e 100755 --- a/customize.dist/messages.js +++ b/customize.dist/messages.js @@ -133,7 +133,8 @@ define(req, function(AppConfig, Default, Language) { return text; } }; - + Messages.admin_mfa_confirm_enable = "Are you sure you want to enable Multi-Factor Authentication?"; // XXX + Messages.admin_mfa_confirm_disable = "Are you sure you want to disable Multi-Factor Authentication?"; // XXX return Messages; }); diff --git a/www/admin/inner.js b/www/admin/inner.js index 5ae30471a..0d66c52c1 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -579,71 +579,32 @@ define([ }, query: function (val, setState) { var isChecked = APP.instanceStatus.enforceMFA; - var confirmationContent = isChecked - ? 'Are you sure you want to disable enforced MFA? This action would lessen the security of your account.' - : 'Are you sure you want to enforce MFA? This action would require to set up an authenticator app.'; - - function showConfirmationModal(callback) { - var modal = UI.dialog.customModal(confirmationContent, { - buttons: [{ - className: 'cancel', - name: Messages.cancel, - onClick: function () { - if (!isChecked) { - sFrameChan.query('Q_ADMIN_RPC', { - cmd: 'ADMIN_DECREE', - data: ['ENFORCE_MFA', [false]] - }, function (e, response) { - if (e || response.error) { - UI.warn(Messages.error); - console.error(e, response); - } else { - APP.updateStatus(function () { - setState(false); - flushCache(); - }); - } - }); - } - //check the checkbox again - else { - APP.updateStatus(function () { - setState(APP.instanceStatus.enforceMFA); - flushCache(); - }); - } - }, - keys: [27] // Esc key to close modal - }, { - className: 'primary', - name: Messages.settings_save, - onClick: function () { - sFrameChan.query('Q_ADMIN_RPC', { - cmd: 'ADMIN_DECREE', - data: ['ENFORCE_MFA', [val]] - }, function (e, response) { - if (e || response.error) { - UI.warn(Messages.error); - console.error(e, response); - } else { - APP.updateStatus(function () { - setState(APP.instanceStatus.enforceMFA); - flushCache(); - }); - } - }); - }, - keys: [13] // Enter key to confirm - }] + function showConfirmation(isChecked, setState) { + const confirmationContent = isChecked ? Messages.admin_mfa_confirm_disable : Messages.admin_mfa_confirm_enable; + UI.confirm(confirmationContent, function (confirmed) { + if (!confirmed) { + // User canceled their changes, restore the checkbox value + setState(isChecked); + return; + } + // User confirmed their changes, call the command and update the state + sFrameChan.query('Q_ADMIN_RPC', { + cmd: 'ADMIN_DECREE', + data: ['ENFORCE_MFA', [val]] + }, function (e, response) { + if (e || response.error) { + UI.warn(Messages.error); + console.error(e, response); + } else { + APP.updateStatus(function () { + setState(APP.instanceStatus.enforceMFA); + flushCache(); + }); + } }); - var $modal = $(modal); - UI.openCustomModal(modal); - $modal.closest('.alertify').on('mousedown', function (e) { - e.stopPropagation(); - }); - } - - showConfirmationModal(); + }); + } + showConfirmation(isChecked, setState); } }); From fe17b416792a753c2040d29a0b0c78160b943341 Mon Sep 17 00:00:00 2001 From: daria Date: Tue, 16 Jul 2024 15:35:51 +0300 Subject: [PATCH 038/188] fix focus issues on modals that use UI.prompt #1561 --- www/common/common-interface.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 9ed80b7e8..42e965685 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -164,12 +164,12 @@ define([ dialog.okButton = function (content, classString) { var sel = typeof(classString) === 'string'? 'button.ok.' + classString:'button.btn.ok.primary'; - return h(sel, { tabindex: '2', }, content || Messages.okButton); + return h(sel, content || Messages.okButton); }; dialog.cancelButton = function (content, classString) { var sel = typeof(classString) === 'string'? 'button.' + classString:'button.btn.cancel'; - return h(sel, { tabindex: '1'}, content || Messages.cancelButton); + return h(sel, content || Messages.cancelButton); }; dialog.message = function (text) { @@ -771,7 +771,7 @@ define([ document.body.appendChild(frame); setTimeout(function () { - $(input).select().focus(); + addTabListener(frame); Notifier.notify(); }); }; From 482e3274542e5280339f8ab23561e120e0fadb3e Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:34:41 +0300 Subject: [PATCH 039/188] Adjust general table styling to flex and make the performance one responsive #1099 --- .eslintrc.js | 2 +- .../src/less2/include/sidebar-layout.less | 32 ++++++------------- www/admin/app-admin.less | 12 +++++++ 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 209a4718e..924eddfc3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,7 +35,7 @@ module.exports = { 4 ], 'linebreak-style': [ - 'error', + 'off', // git handles linebreak conversion for us 'unix' ], 'quotes': [ diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index bb037d366..bafc9a77e 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -174,6 +174,9 @@ } .cp-sidebar-table { margin-top: @sidebar_base-margin; + tr { + display: flex; + } pre { margin: 0; } @@ -189,34 +192,17 @@ margin-right: @sidebar_base-margin; } } + th, td { + flex: 1; + word-wrap: break-word; + white-space: normal; + min-width: 13rem; + } tbody { tr:nth-child(odd) { background-color: @cp_sidebar-left-item-bg; } } - - } - .cp-sidebar-table#performance-profiling-table { - @media (max-width: 900px) { - width: 100%; - border: 1px solid @cp_drive-icon-border; - - tr { - display: flex; - flex-wrap: wrap; - align-items: center; - } - - th, td { - border: none; - flex: 1 1 auto; - width: 5rem; - margin-right: 0; - font-size: 13px; - word-wrap: break-word; - white-space: normal; - } - } } .cp-sidebar-input-block { display: inline-flex; diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index fbaaf4b5e..6d9edc132 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -28,6 +28,18 @@ max-height: 250px; } } + #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] .cp-sidebar-table#performance-profiling-table { + @media (max-width: @browser_media-not-small) { + width: 100%; + tr { + width: 100%; + } + th, td { + margin-right: 0; + min-width: 1rem; + } + } + } .cp-admin-color-current { width: 20px; height: 20px; From 1f3b664bfe6bd0f74da9fc18a9553966935f4ac3 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:26:10 +0300 Subject: [PATCH 040/188] Refactor code #1099 --- customize.dist/src/less2/include/sidebar-layout.less | 9 --------- www/admin/app-admin.less | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index bafc9a77e..5b616e0e8 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -174,9 +174,6 @@ } .cp-sidebar-table { margin-top: @sidebar_base-margin; - tr { - display: flex; - } pre { margin: 0; } @@ -192,12 +189,6 @@ margin-right: @sidebar_base-margin; } } - th, td { - flex: 1; - word-wrap: break-word; - white-space: normal; - min-width: 13rem; - } tbody { tr:nth-child(odd) { background-color: @cp_sidebar-left-item-bg; diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index 6d9edc132..74c71f0cf 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -29,6 +29,15 @@ } } #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] .cp-sidebar-table#performance-profiling-table { + tr { + display: flex; + } + th, td { + flex: 1; + word-wrap: break-word; + white-space: normal; + min-width: 13rem; + } @media (max-width: @browser_media-not-small) { width: 100%; tr { From c9d5f2c236ae500b413962b0e49bac75f78fb8e1 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Wed, 17 Jul 2024 17:30:28 +0300 Subject: [PATCH 041/188] Add horizontal scrollbar to table #1099 --- www/admin/app-admin.less | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index 74c71f0cf..ff86dd6c6 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -29,6 +29,10 @@ } } #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] .cp-sidebar-table#performance-profiling-table { + display: flex; + flex-wrap: wrap; + flex-direction: column; + overflow-x: auto; tr { display: flex; } From 35109ae44698e5ebc35c8ed52e77c0bfd446b694 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Wed, 17 Jul 2024 17:46:59 +0300 Subject: [PATCH 042/188] Make confirm button responsive #1406 --- customize.dist/src/less2/include/alertify.less | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 0890d8010..c225708aa 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -327,6 +327,8 @@ nav { padding: @alertify_padding-base; text-align: right; + display: flex; + align-items: center; button, div.cp-button-confirm { margin: 0px !important; &:not(:first-child):not(.left) { @@ -339,6 +341,17 @@ div.cp-button-confirm { vertical-align: middle; } + .btn.btn-danger { + overflow-wrap: break-word; + white-space: normal; + } + @media screen and (max-width: @browser_media-medium-screen){ + justify-content: flex-end; + .btn.btn-danger { + width: 100%; + line-height: inherit; + } + } } } } From a1b617f0ca2e0abf09161cde40e3ae3354c8bacc Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:18:56 +0300 Subject: [PATCH 043/188] Wrap table inside a div #1099 --- www/admin/app-admin.less | 8 ++++---- www/admin/inner.js | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index ff86dd6c6..333173927 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -28,11 +28,9 @@ max-height: 250px; } } - #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] .cp-sidebar-table#performance-profiling-table { - display: flex; - flex-wrap: wrap; - flex-direction: column; + #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] div { overflow-x: auto; + .cp-sidebar-table#performance-profiling-table { tr { display: flex; } @@ -41,6 +39,7 @@ word-wrap: break-word; white-space: normal; min-width: 13rem; + margin-right: 0px; } @media (max-width: @browser_media-not-small) { width: 100%; @@ -53,6 +52,7 @@ } } } +} .cp-admin-color-current { width: 20px; height: 20px; diff --git a/www/admin/inner.js b/www/admin/inner.js index 7cb627abf..a0be7e2ea 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -3598,6 +3598,10 @@ define([ table.id = 'performance-profiling-table'; + var div = document.createElement('div'); + div.id = 'performance-table-container'; + div.appendChild(table); + const onRefresh = function () { sFrameChan.query('Q_ADMIN_RPC', { cmd: 'GET_WORKER_PROFILES', @@ -3629,7 +3633,7 @@ define([ onRefresh(); onRefreshPerformance.reg(onRefresh); - cb(table); + cb(div); }); From ffebbc6e807bfca12a7e4492a7900d204e1f2df4 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:20:20 +0300 Subject: [PATCH 044/188] More specific div selector #1099 --- www/admin/app-admin.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index 333173927..3845b858e 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -28,7 +28,7 @@ max-height: 250px; } } - #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] div { + #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] div#performance-table-container { overflow-x: auto; .cp-sidebar-table#performance-profiling-table { tr { From 11cf84a985511781a673dfeca77808fba9063bb6 Mon Sep 17 00:00:00 2001 From: David Benque Date: Thu, 18 Jul 2024 15:42:56 +0100 Subject: [PATCH 045/188] Update linter rules Prevent line break errors on Windows --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 209a4718e..924eddfc3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,7 +35,7 @@ module.exports = { 4 ], 'linebreak-style': [ - 'error', + 'off', // git handles linebreak conversion for us 'unix' ], 'quotes': [ From e1b2be39c0f48f4f9e0234880295ee27ac19758a Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Fri, 19 Jul 2024 11:50:37 +0200 Subject: [PATCH 046/188] Fix: old password sent upon updating a password for the first time - Finish to fix #1521 --- www/common/sframe-common-outer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 508937e41..b4031d155 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -1359,7 +1359,7 @@ define([ var viewH = Utils.Hash.getViewHashFromKeys(_secret); var href = Utils.Hash.hashToHref(editH, parsed.type); var roHref = Utils.Hash.hashToHref(viewH, parsed.type); - Cryptpad.setPadAttribute('password', password, w(), parsed.getUrl()); + Cryptpad.setPadAttribute('password', pw, w(), parsed.getUrl()); Cryptpad.setPadAttribute('channel', chan, w(), parsed.getUrl()); Cryptpad.setPadAttribute('href', href, w(), parsed.getUrl()); Cryptpad.setPadAttribute('roHref', roHref, w(), parsed.getUrl()); From 727c9d7b8828bf81c1771fe61f16069d83cae046 Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Fri, 19 Jul 2024 11:54:10 +0200 Subject: [PATCH 047/188] Fix the 'Preview document' link when sharing ownership - The password should not be asked in this context - Remove deprecated use of the drive secret - Related to #1270 and #1521 --- www/common/common-ui-elements.js | 2 +- www/common/outer/mailbox-handlers.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index f56584e19..10db8c37c 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -3559,7 +3559,7 @@ define([ $(link).click(function (e) { e.preventDefault(); e.stopPropagation(); - var obj = { pw: msg.content.password || '' }; + var obj = { pw: msg.content.password || '', f: 1 }; common.openURL(Hash.getNewPadURL(msg.content.href, obj)); }); diff --git a/www/common/outer/mailbox-handlers.js b/www/common/outer/mailbox-handlers.js index 06de11374..6ecac6a54 100644 --- a/www/common/outer/mailbox-handlers.js +++ b/www/common/outer/mailbox-handlers.js @@ -387,8 +387,10 @@ define([ var channel = content.channel || content.teamChannel; if (content.password) { + var uHash = ctx.store.data.blockHash; + var uSecret = Block.parseBlockHash(uHash); + var key = uSecret.keys.symmetric; content.pw = content.password; - var key = ctx.store.driveSecret.keys.cryptKey; content.password = Crypto.encrypt(content.password, key); } From 750635db4eeaf0ed662ede3f33ab49563136fe90 Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Fri, 19 Jul 2024 11:57:40 +0200 Subject: [PATCH 048/188] minor: use of let instead of var - To avoid some secrets to live outside their intended scope. --- www/common/outer/mailbox-handlers.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/www/common/outer/mailbox-handlers.js b/www/common/outer/mailbox-handlers.js index 6ecac6a54..0b98bbe9f 100644 --- a/www/common/outer/mailbox-handlers.js +++ b/www/common/outer/mailbox-handlers.js @@ -266,9 +266,9 @@ define([ } if (content.password) { - var uHash = ctx.store.data.blockHash; - var uSecret = Block.parseBlockHash(uHash); - var key = uSecret.keys.symmetric; + let uHash = ctx.store.data.blockHash; + let uSecret = Block.parseBlockHash(uHash); + let key = uSecret.keys.symmetric; content.password = Crypto.encrypt(content.password, key); } @@ -387,9 +387,9 @@ define([ var channel = content.channel || content.teamChannel; if (content.password) { - var uHash = ctx.store.data.blockHash; - var uSecret = Block.parseBlockHash(uHash); - var key = uSecret.keys.symmetric; + let uHash = ctx.store.data.blockHash; + let uSecret = Block.parseBlockHash(uHash); + let key = uSecret.keys.symmetric; content.pw = content.password; content.password = Crypto.encrypt(content.password, key); } From 8ceccb678c42e5d2d2fa5ca5a60e3bb8617e15b9 Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Fri, 19 Jul 2024 12:10:05 +0200 Subject: [PATCH 049/188] Cleaning code: use a function to encrypt the password - Use a function to encrypt the password for later use in URLs as it is used both to share a password-protected pad and share ownership of a password-protected pad; - related do #1270 and #1522. --- www/common/outer/mailbox-handlers.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/www/common/outer/mailbox-handlers.js b/www/common/outer/mailbox-handlers.js index 0b98bbe9f..906be2843 100644 --- a/www/common/outer/mailbox-handlers.js +++ b/www/common/outer/mailbox-handlers.js @@ -238,6 +238,14 @@ define([ cb(true); }; + // Encrypt the password under the right key before sending it via URL hash + var encryptPassword = function(ctx, password) { + let uHash = ctx.store.data.blockHash; + let uSecret = Block.parseBlockHash(uHash); + let key = uSecret.keys.symmetric; + return Crypto.encrypt(password, key); + }; + // Hide duplicates when receiving a SHARE_PAD notification: // Keep only one notification per channel: the stronger and more recent one var channels = {}; @@ -266,10 +274,7 @@ define([ } if (content.password) { - let uHash = ctx.store.data.blockHash; - let uSecret = Block.parseBlockHash(uHash); - let key = uSecret.keys.symmetric; - content.password = Crypto.encrypt(content.password, key); + content.password = encryptPassword(ctx, content.password); } // Update the data @@ -387,11 +392,8 @@ define([ var channel = content.channel || content.teamChannel; if (content.password) { - let uHash = ctx.store.data.blockHash; - let uSecret = Block.parseBlockHash(uHash); - let key = uSecret.keys.symmetric; content.pw = content.password; - content.password = Crypto.encrypt(content.password, key); + content.password = encryptPassword(ctx, content.password); } if (addOwners[channel]) { return void cb(true); } From 2a3998a4732fffb534535d01753c22681ea5bc67 Mon Sep 17 00:00:00 2001 From: daria Date: Mon, 22 Jul 2024 14:06:14 +0300 Subject: [PATCH 050/188] fix focus issues on calendar modals #1561 --- www/calendar/inner.js | 2 ++ www/common/common-interface.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 9cac57978..b971b2247 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -2209,6 +2209,7 @@ APP.recurrenceRule = { setFormat(allDay); }); }); + UI.addTabListener(el); }; var onCalendarEditPopup = function (el) { var $el = $(el); @@ -2276,6 +2277,7 @@ APP.recurrenceRule = { $b.closest('.tui-full-calendar-floating-layer').hide(); }); }); + UI.addTabListener(el); }; var onPopupRemoved = function () { var start, end; diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 42e965685..98fd748db 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -577,7 +577,7 @@ define([ return frame; }; - let addTabListener = frame => { + let addTabListener = UI.addTabListener = frame => { // find focusable elements let modalElements = $(frame).find('a, button, input, [tabindex]:not([tabindex="-1"]), textarea').filter(':visible').filter(':not(:disabled)'); From 86e029d4333f85257065da2cd69d583c8ff2c6e3 Mon Sep 17 00:00:00 2001 From: daria Date: Mon, 22 Jul 2024 15:42:44 +0300 Subject: [PATCH 051/188] add focus to certain calendar modal elements + make changes to focus styling --- www/calendar/app-calendar.less | 13 +++++++++++++ www/calendar/inner.js | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/www/calendar/app-calendar.less b/www/calendar/app-calendar.less index bdf59fb6d..91974d210 100644 --- a/www/calendar/app-calendar.less +++ b/www/calendar/app-calendar.less @@ -157,6 +157,11 @@ border-radius: @variables_radius_L; } .tui-full-calendar-popup-container { + .tui-full-calendar-section-allday{ + &:focus { + outline: @cryptpad_color_brand solid 2px; + } + } min-width: 100%; background: @cp_flatpickr-bg; color: @cryptpad_text_col; @@ -208,6 +213,9 @@ text-overflow: ellipsis; font: @colortheme_app-font; padding: 0 10px; + &:focus{ + outline: @cryptpad_color_brand solid 2px; + } } input { flex: 1; } } @@ -403,6 +411,11 @@ & > input { height: 40px; } + .tui-full-calendar-content{ + &:focus{ + outline: @cryptpad_color_brand solid 2px; + } + } } // margin-bottom: 20px; input { diff --git a/www/calendar/inner.js b/www/calendar/inner.js index b971b2247..f3dac10a4 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -2147,6 +2147,13 @@ APP.recurrenceRule = { $el.find('input').attr('autocomplete', 'off'); $el.find('.tui-full-calendar-dropdown-button').addClass('btn btn-secondary'); $el.find('.tui-full-calendar-popup-close').addClass('btn btn-cancel fa fa-times cp-calendar-close').empty(); + $el.find('.tui-full-calendar-section-allday').attr('tabindex', 0); + $el.find('.cp-calendar-close').attr('tabindex',-1); + $el.find('.tui-full-calendar-section-allday').keydown(function (e) { + if (e.which === 13) { + $(this).click(); + } + }); var $container = $el.closest('.tui-full-calendar-floating-layer'); $container.addClass('cp-calendar-popup-flex'); From 4544be6b4d9fa7291b19cb366f7dd492dfe07340 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 23 Jul 2024 10:36:46 +0200 Subject: [PATCH 052/188] Partial revert of fd77428 when counting registered users --- lib/commands/admin-rpc.js | 21 +-------------------- lib/commands/quota.js | 4 +--- www/admin/inner.js | 3 +-- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/lib/commands/admin-rpc.js b/lib/commands/admin-rpc.js index ae7dcc45f..72176f3a0 100644 --- a/lib/commands/admin-rpc.js +++ b/lib/commands/admin-rpc.js @@ -116,13 +116,6 @@ var getRegisteredUsers = Admin.getRegisteredUsers = function (Env, Server, cb) { } folders = list; })); - Fs.readdir(dirB, waitFor(function (err, list) { - if (err) { - waitFor.abort(); - return void done(err); - } - foldersB = list; - })); }).nThen(function (waitFor) { folders.forEach(function (f) { var dir = Env.paths.pin + '/' + f; @@ -135,20 +128,8 @@ var getRegisteredUsers = Admin.getRegisteredUsers = function (Env, Server, cb) { users += list.length; })); }); - }).nThen(function (waitFor) { - foldersB.forEach(function (f) { - var dir = Env.paths.block + '/' + f; - Fs.readdir(dir, waitFor(function (err, list) { - if (err) { return; } - // Don't count placeholders - list = list.filter(name => { - return !/\.placeholder$/.test(name); - }); - blocks += list.length; - })); - }); }).nThen(function () { - done(void 0, {users, blocks}); + done(void 0, {users}); }); }); }; diff --git a/lib/commands/quota.js b/lib/commands/quota.js index 2397b7680..6fb33bee3 100644 --- a/lib/commands/quota.js +++ b/lib/commands/quota.js @@ -161,13 +161,11 @@ var queryAccountServer = function (Env, cb) { nThen(waitFor => { Admin.getRegisteredUsers(Env, null, waitFor((err, data) => { if (err) { return; } - stats.registered = data.blocks; + stats.registered = data.users; if (Env.lastPingRegisteredUsers) { stats.usersDiff = stats.registered - Env.lastPingRegisteredUsers; } Env.lastPingRegisteredUsers = stats.registered; - let teams = (data.users - data.blocks); - if (teams > 0) { stats.teams = teams; } })); }).nThen(() => { if (Env.maxConcurrentWs) { diff --git a/www/admin/inner.js b/www/admin/inner.js index d513ab0b1..3ca4f173f 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -2713,8 +2713,7 @@ define([ }, function (e, arr) { pre.innerText = ''; let data = arr[0]; - pre.append(String(data.blocks)); - pre.append(' (old value including teams: ' + String(data.users) + ')'); // XXX + pre.append(String(data.users)); }); }; onRefresh(); From 2963ca3002537f72b8c23f01c0800fbfe0346768 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 23 Jul 2024 13:06:36 +0200 Subject: [PATCH 053/188] lint compliance --- lib/commands/admin-rpc.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/commands/admin-rpc.js b/lib/commands/admin-rpc.js index 72176f3a0..9030159f8 100644 --- a/lib/commands/admin-rpc.js +++ b/lib/commands/admin-rpc.js @@ -104,10 +104,8 @@ var shutdown = function (Env, Server, cb) { var getRegisteredUsers = Admin.getRegisteredUsers = function (Env, Server, cb) { Env.batchRegisteredUsers('', cb, function (done) { var dir = Env.paths.pin; - var dirB = Env.paths.block; - var folders, foldersB; + var folders; var users = 0; - var blocks = 0; nThen(function (waitFor) { Fs.readdir(dir, waitFor(function (err, list) { if (err) { From 7d14f80fdb93304337623c674419fe5e6c8c1092 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:14:12 +0300 Subject: [PATCH 054/188] Make admin tables responsive #1099 --- www/admin/app-admin.less | 50 ++++++++++++++++++++++------------------ www/admin/inner.js | 24 +++++++++++-------- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/www/admin/app-admin.less b/www/admin/app-admin.less index 3845b858e..8bc3c3d85 100644 --- a/www/admin/app-admin.less +++ b/www/admin/app-admin.less @@ -28,30 +28,36 @@ max-height: 250px; } } - #cp-sidebarlayout-container #cp-sidebarlayout-rightside .cp-sidebarlayout-element[data-item] div#performance-table-container { - overflow-x: auto; - .cp-sidebar-table#performance-profiling-table { - tr { - display: flex; - } - th, td { - flex: 1; - word-wrap: break-word; - white-space: normal; - min-width: 13rem; - margin-right: 0px; - } - @media (max-width: @browser_media-not-small) { - width: 100%; - tr { - width: 100%; - } - th, td { - margin-right: 0; - min-width: 1rem; + #cp-sidebarlayout-container { + #cp-sidebarlayout-rightside { + .cp-sidebarlayout-element[data-item] { + div#cp-admin-table-container { + overflow-x: auto; + .cp-sidebar-table#cp-admin-table { + tr { + display: flex; + } + th, td { + flex: 1; + word-wrap: break-word; + white-space: normal; + min-width: 13rem; + margin-right: 0px; + } + @media (max-width: @browser_media-not-small) { + width: 100%; + tr { + width: 100%; + } + th, td { + margin-right: 0; + min-width: 7rem; + } + } + } + } } } - } } .cp-admin-color-current { width: 20px; diff --git a/www/admin/inner.js b/www/admin/inner.js index a0be7e2ea..e606337fa 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -1101,6 +1101,9 @@ define([ "" ]; var list = blocks.table(header, []); + list.setAttribute('id', 'cp-admin-table'); + let div = blocks.block([list]); + div.setAttribute('id', 'cp-admin-table-container'); var nav = blocks.nav([button, refreshButton]); var form = blocks.form([ @@ -1201,7 +1204,7 @@ define([ }); }); - cb([form, list]); + cb([form, div]); }); var getBlockId = (val) => { @@ -1413,6 +1416,9 @@ define([ "" ]; var list = blocks.table(header, []); + list.setAttribute('id', 'cp-admin-table'); + let div = blocks.block([list]); + div.setAttribute('id', 'cp-admin-table-container'); var nav = blocks.nav([button, refreshButton]); @@ -1581,7 +1587,7 @@ define([ }); }); - cb([form, list]); + cb([form, div]); }); // Msg.admin_defaultlimitHint, .admin_defaultlimitTitle @@ -1741,6 +1747,9 @@ define([ Messages.admin_note ]; var table = blocks.table(header, []); + table.setAttribute('id', 'cp-admin-table'); + let div = blocks.block([table]); + div.setAttribute('id', 'cp-admin-table-container'); let $table = $(table).hide(); APP.refreshLimits = function () { @@ -1798,7 +1807,7 @@ define([ }); }; APP.refreshLimits(); - cb(table); + cb(div); }); // Msg.admin_accountMetadataHint.admin_accountMetadataTitle @@ -3595,12 +3604,9 @@ define([ ]; var table = blocks.table(header, []); - - table.id = 'performance-profiling-table'; - - var div = document.createElement('div'); - div.id = 'performance-table-container'; - div.appendChild(table); + table.setAttribute('id', 'cp-admin-table'); + let div = blocks.block([table]); + div.setAttribute('id', 'cp-admin-table-container'); const onRefresh = function () { sFrameChan.query('Q_ADMIN_RPC', { From 9823fd564e1f0b2fe8d9e79f170fed5623b060cf Mon Sep 17 00:00:00 2001 From: Wolfgang Ginolas Date: Tue, 23 Jul 2024 16:27:42 +0200 Subject: [PATCH 055/188] Fix broken OnlyOffice Document https://github.com/cryptpad/cryptpad/issues/1572 --- install-onlyoffice.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install-onlyoffice.sh b/install-onlyoffice.sh index e711837a6..6f9981c34 100755 --- a/install-onlyoffice.sh +++ b/install-onlyoffice.sh @@ -33,7 +33,7 @@ main() { install_version v4 6ebc6938 install_version v5 88a356f0 install_version v6 abd8a309 - install_version v7 ba82142f + install_version v7 e1267803 install_x2t v7.3+1 ab0c05b0e4c81071acea83f0c6a8e75f5870c360ec4abc4af09105dd9b52264af9711ec0b7020e87095193ac9b6e20305e446f2321a541f743626a598e5318c1 rm -rf "$BUILDS_DIR" From fa097a43775ba5ec2f9632e96bdcc3762dd99e1a Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 24 Jul 2024 11:35:25 +0200 Subject: [PATCH 056/188] Translated using Weblate (English) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1780 of 1780 strings) Co-authored-by: David Benqué Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/en/ Translation: CryptPad/App --- www/common/translations/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.json b/www/common/translations/messages.json index a36fced88..484c8b81e 100644 --- a/www/common/translations/messages.json +++ b/www/common/translations/messages.json @@ -628,8 +628,8 @@ "admin_activeSessionsHint": "Number of active websocket connections (and unique IP addresses connected)", "admin_activePadsTitle": "Active documents", "admin_activePadsHint": "Number of unique documents currently being viewed or edited", - "admin_registeredTitle": "Registered users", - "admin_registeredHint": "Number of users registered on your instance", + "admin_registeredTitle": "User and team drives", + "admin_registeredHint": "Number of active drives on your instance", "admin_updateLimitTitle": "Update user quotas", "admin_updateLimitHint": "Forcing an update of user storage limits can be done any time, but is only necessary in the event of an error", "admin_updateLimitButton": "Update quotas", From 5905f37fc6f289ce4e0caaf8ec7173d157190a83 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 24 Jul 2024 11:35:25 +0200 Subject: [PATCH 057/188] Translated using Weblate (German) Currently translated at 100.0% (1780 of 1780 strings) Co-authored-by: Jan Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/de/ Translation: CryptPad/App --- www/common/translations/messages.de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index 247d98bba..0efd83cc2 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -607,8 +607,8 @@ "admin_activeSessionsHint": "Anzahl aktiver Websocket-Verbindungen (und verbundener IP-Adressen)", "admin_activePadsTitle": "Aktive Dokumente", "admin_activePadsHint": "Anzahl der Dokumente, die gerade angesehen oder bearbeitet werden", - "admin_registeredTitle": "Registrierte Nutzer", - "admin_registeredHint": "Anzahl der auf deiner Instanz registrierten Nutzer", + "admin_registeredTitle": "Nutzer und Team-Drives", + "admin_registeredHint": "Anzahl aktiver Drives auf deiner Instanz", "admin_updateLimitTitle": "Nutzer-Quotas aktualisieren", "admin_updateLimitHint": "Das Erzwingen einer Aktualisierung der Speicherbegrenzungen für Nutzer ist jederzeit möglich, aber nur im Fehlerfall notwendig", "admin_updateLimitButton": "Quotas aktualisieren", From 8c39136faeeca110acf67143cf707110ae619662 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 24 Jul 2024 11:35:25 +0200 Subject: [PATCH 058/188] Translated using Weblate (Swedish) Currently translated at 94.3% (1680 of 1780 strings) Translated using Weblate (Swedish) Currently translated at 93.5% (1665 of 1780 strings) Co-authored-by: Helle Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/sv/ Translation: CryptPad/App --- www/common/translations/messages.sv.json | 35 +++++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/www/common/translations/messages.sv.json b/www/common/translations/messages.sv.json index 6f3aafa9b..8b3703bdb 100644 --- a/www/common/translations/messages.sv.json +++ b/www/common/translations/messages.sv.json @@ -6,12 +6,12 @@ "whiteboard": "Whiteboard", "drive": "CryptDrive", "slide": "Markdown bilder", - "poll": "Röstning", + "poll": "Omröstning", "code": "Kod", "todo": "Att-göra", "teams": "Teams", "sheet": "Kalkylark", - "pad": "Rik text", + "pad": "Rich text", "kanban": "Kanban", "presentation": "Presentation", "doc": "Dokument", @@ -137,11 +137,11 @@ "chainpadError": "Ett kritiskt fel har uppstått när ditt innehåll uppdaterades. Denna sida är i skrivskyddat läge för att säkerställa att du inte förlorar ditt arbete.
Tryck Esc för att fortsätta visa detta dokument, eller ladda om och försök redigera igen.", "inactiveError": "Det här dokumentet har tagits bort på grund av inaktivitet. Vänligen tryck Esc för att skapa ett nytt dokument.", "deletedError": "Det här dokumentet har tagits bort och är inte längre tillgängligt.", - "expiredError": "Det här dokument har nått sitt makuleringsdatum och är inte längre tillgängligt.", + "expiredError": "Det här dokument har nått sitt utgångsdatum och är inte längre tillgängligt.", "padNotPinnedVariable": "Detta dokument kommer gå ut efter {4} dagars inaktivitet, {0}logga in{1} eller {2}registrera dig{3} för att bevara det.", "padNotPinned": "Det här dokument kommer automatiskt gå ut efter 3 månader av inaktivitet, {0}logga in{1} eller {2}registrera dig{3} för att bevara det.", "onLogout": "Du är utloggad, {0}klicka här{1} för att logga in
eller tryck Esc för att öppna ditt dokument i skrivskyddat läge.", - "typeError": "Det här dokument är inte kompatibelt med vald applikationen", + "typeError": "Det här dokumentet är inte kompatibelt med den valda applikationen", "kanban_working": "Pågående", "kanban_done": "Färdigt", "kanban_todo": "Att göra", @@ -480,7 +480,7 @@ "settings_changePasswordCurrent": "Nuvarande lösenord", "settings_changePasswordNew": "Nytt lösenord", "features_f_core": "Vanliga funktioner", - "creation_expiration": "Makuleringsdatum", + "creation_expiration": "Förfallodatum", "share_linkAccess": "Behörighetsinställningar", "share_linkOpen": "Öppna länk", "share_linkCopy": "Kopiera länk", @@ -755,7 +755,7 @@ "admin_support_closed": "Avslutade ärenden:", "form_makeAnon": "Anonymisera svaren", "team_exportButton": "Ladda ned", - "creation_expiresIn": "Makulera om", + "creation_expiresIn": "Förfaller om", "footer_website": "Projektets webbplats", "form_condition_isnot": "är inte", "creation_expire": "Utgående dokument", @@ -986,7 +986,7 @@ "history_restoreDrivePrompt": "Är du säker på att du vill ersätta den nuvarande versionen av CryptDrive med den här versionen?", "infobar_versionHash": "Du visar för närvarande en tidigare version av detta dokument ({0}).", "oo_deletedVersion": "Denna version finns inte längre i historien.", - "admin_registrationHint": "Tillåt inga nya användare att registrera sig", + "admin_registrationHint": "Besökare till instansen har inte möjlighet att skapa konton. Inbjudningar kan skapas av administratörer.", "admin_defaultlimitTitle": "Lagringsgräns (MB)", "error_unhelpfulScriptError": "Skriptfel: Se webbläsarkonsolen för mer information", "pad_settings_comments": "Välj om kommentarerna ska vara synliga eller dolda som standard.", @@ -1122,7 +1122,7 @@ "fm_info_root": "Skapa så många mappar här som du vill för att sortera dina filer.", "fm_info_template": "Dessa dokument lagras som mallar. De kan återanvändas när du skapar nya dokument.", "fm_info_trash": "Töm papperskorgen för att frigöra utrymme i din CryptDrive.", - "admin_flushCacheHint": "Tvinga användare att ladda ner de senaste tillgångarna på klientsidan (endast om din server är i uppdaterat läge)", + "admin_flushCacheHint": "Tvinga alla användare att ladda ner de senaste tillgångarna efter ändring i anpassningar eller inställningar. Detta undviker omstart av servern men tvingar varje aktiv användare att återansluta, använd sparsamt.", "contact_admin": "Kontakta administratörerna för: {0}", "contact_adminHint": "För eventuella problem relaterade till ditt konto, lagringsgräns eller tillgänglighet av tjänsten.\n", "owner_addConfirm": "Delägare kommer att kunna ändra innehållet och ta bort dig som ägare. Är du säker?", @@ -1334,7 +1334,7 @@ "settings_importConfirm": "Är du säker på att du vill importera de senaste dokumenten från den här webbläsaren till ditt användarkontos CryptDrive?", "settings_changePasswordHint": "Ändra ditt kontos lösenord. Ange ditt nuvarande lösenord och bekräfta det nya lösenordet genom att skriva det två gånger.
Vi kan inte återställa ditt lösenord om du glömmer det, så var mycket försiktig!", "creation_newPadModalDescription": "Klicka på en app för att skapa ett nytt dokument. Du kan också trycka på Tabb för att välja appen och trycka på Retur för att bekräfta.", - "settings_autostoreTitle": "Pad lagring i CryptDrive", + "settings_autostoreTitle": "Dokument lagring i CryptDrive", "settings_changePasswordNewConfirm": "Bekräfta nytt lösenord", "properties_addPassword": "Lägg till ett lösenord", "admin_supportInitHint": "Du kan konfigurera en supportbrevlåda för att ge användare av din CryptPad-instans ett sätt att kontakta dig säkert om de har problem med sitt konto.", @@ -1665,5 +1665,20 @@ "access_passwordUsed": "Lösenordet har använts tidigare för det här dokumentet. Det kan inte återanvändas.", "status": "Status-sida", "admin_diskUsageWarning": "Använd med försiktighet! Beroende på storleken på de data som lagras på instansen kan generering av denna rapport använda allt tillgängligt minne på servern och leda till en krasch.", - "dph_pad_pw": "Det här dokumentet skyddas med ett nytt lösenord" + "dph_pad_pw": "Det här dokumentet skyddas med ett nytt lösenord", + "calendar_rec_change_first": "Flyttar den första återkommande händelsen till en annan kalender. Samtliga återkommande händelser kommer också att flyttas.", + "admin_forcemfaTitle": "Obligatorisk Två-Faktor Autentisering", + "calendar_desc": "Beskrivning", + "calendar_description": "Beskrivning:{0}{1}", + "sso_login_description": "Logga in med", + "sso_register_description": "Registrera med", + "ssoauth_form_hint_login": "Var vänlig ange ditt CryptPad lösenord", + "duplicate": "Duplicera", + "kanban_showTags": "Se alla taggar", + "kanban_hideTags": "Se färre taggar", + "ssoauth_header": "CryptPad Lösenord", + "admin_forcemfaHint": "Alla användare av den här instansen kommer att uppmanas att ställa in tvåfaktorsautentisering för att logga in på sitt konto. Notera att existerande användare inte kommer att kunna behålla sina konton utan att ställa in en TOTP-lösning.", + "ssoauth_form_hint_register": "Lägg till ett CryptPad-lösenord för extra säkerhet eller lämna tomt och fortsätt. Om du inte lägger till ett lösenord kommer nycklarna som skyddar din data att vara tillgänglig för instansadministratörerna.", + "calendar_rec_change": "Flyttar en återkommande händelse till en annan kalender. Du kan bara applicera förändringen till denna eller alla återkommande händelser.", + "admin_channelPlaceholder": "Förfallna dokument platshållare" } From 4583351a956ab6d84c6ccc09d13d59e0be83d825 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 24 Jul 2024 11:35:25 +0200 Subject: [PATCH 059/188] Translated using Weblate (Spanish (Cuba)) Currently translated at 98.6% (1756 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 98.7% (1758 of 1780 strings) Translated using Weblate (Spanish (Cuba)) Currently translated at 98.7% (1758 of 1780 strings) Co-authored-by: Desire Hernandez Co-authored-by: Weblate Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/es_CU/ Translation: CryptPad/App --- www/common/translations/messages.es_CU.json | 114 ++++++++++---------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/www/common/translations/messages.es_CU.json b/www/common/translations/messages.es_CU.json index 08b455d71..1533939e5 100644 --- a/www/common/translations/messages.es_CU.json +++ b/www/common/translations/messages.es_CU.json @@ -104,16 +104,16 @@ "expiredError": "Este documento ha llegado a su fecha de destrucción y ya no está disponible.", "deletedError": "Este documento ha sido eliminado y ya no está disponible.", "invalidHashError": "El documento que has solicitado tiene una URL no válida.", - "errorCopy": " Aún puede usar la versión actual en modo de solo lectura presionando Esc.", - "errorRedirectToHome": "Aún puedes usar la versión actual en modo de solo lectura presionando Esc.", - "newVersionError": "Una nueva versión de CryptPad está disponible.
Recargar para usar la nueva versión, o presione escape para acceder a su contenido en modo sin conexión.", + "errorCopy": " Aún puedes usar la versión actual en modo de solo lectura presionando Esc.", + "errorRedirectToHome": "Presiona Esc para ser redirigido a tu CryptDrive.", + "newVersionError": "Una nueva versión de CryptPad está disponible.
Recargar para usar la nueva versión, o presiona escape para acceder a tu contenido en modo sin conexión.", "loading": "Cargando...", "error": "Error", "saved": "Guardado", "deleted": "Eliminado", "deletedFromServer": "Documento destruido", "mustLogin": "Debes iniciar sesión para acceder a esta página", - "realtime_unrecoverableError": "Se ha producido un error irrecuperable. Haga clic en Aceptar para recargar.", + "realtime_unrecoverableError": "Se ha producido un error irrecuperable. Haga click en Aceptar para recargar.", "disconnected": "Desconectado", "synchronizing": "Sincronizando", "reconnecting": "Reconectando", @@ -123,7 +123,7 @@ "uploadButtonTitle": "Sube un nuevo archivo a tu CryptDrive", "saveTemplateButton": "Guardar como plantilla", "templateSaved": "¡Plantilla guardada!", - "selectTemplate": "Seleccione una plantilla o presione Escape", + "selectTemplate": "Selecciona una plantilla o presiona escape", "useTemplate": "¿Comenzar con una plantilla?", "useTemplateOK": "Elige una plantilla (Enter)", "useTemplateCancel": "Comenzar desde cero (Esc)", @@ -135,7 +135,7 @@ "propertiesButtonTitle": "Obtener propiedades del documento", "printText": "Imprimir", "printButton": "Imprimir (enter)", - "printButtonTitle2": "Imprima su documento o expórtelo como un archivo PDF", + "printButtonTitle2": "Imprime tu documento o expórtalo como un archivo PDF", "printOptions": "Opciones de diseño", "printSlideNumber": "Mostrar el número de diapositiva", "printDate": "Mostrar la fecha", @@ -146,7 +146,7 @@ "printBackgroundNoValue": "No se muestra ninguna imagen de fondo", "printBackgroundRemove": "Eliminar esta imagen de fondo", "filePicker_close": "Cerrar", - "filePicker_description": "Elija un archivo de su CryptDrive para incrustarlo o cargue uno nuevo", + "filePicker_description": "Elije un archivo de tu CryptDrive para incrustarlo o cargua uno nuevo", "filePicker_filter": "Filtrar archivos por nombre", "tags_title": "Etiquetas (solo para ti)", "tags_notShared": "Tus etiquetas no son compartidas con otros usuarios", @@ -155,7 +155,7 @@ "slideOptionsText": "Opciones", "slideOptionsTitle": "Personaliza tus diapositivas", "languageButton": "Idioma", - "languageButtonTitle": "Seleccione el idioma a utilizar para el resaltado de sintaxis", + "languageButtonTitle": "Selecciona el idioma a utilizar para el resaltado de sintaxis", "themeButton": "Tema", "editShare": "Enlace de edición", "viewShare": "Enlace de solo lectura", @@ -170,7 +170,7 @@ "cancelButton": "Cancelar (esc)", "show_help_button": "Mostrar ayuda", "help_button": "Ayuda", - "historyText": "Historia", + "historyText": "Historial", "historyButton": "Mostrar el historial del documento", "history_next": "Próxima versión", "history_prev": "Versión previa", @@ -188,7 +188,7 @@ "kanban_item": "Elemento {0}", "kanban_todo": "Hacer", "kanban_done": "Terminado", - "kanban_working": "En progreso", + "kanban_working": "En curso", "kanban_addBoard": "Añadir un tablero", "poll_publish_button": "Publicar", "poll_create_user": "Agregar un nuevo usuario", @@ -209,16 +209,16 @@ "poll_comment_remove": "Eliminar este comentario", "poll_comment_placeholder": "Tú comentario", "poll_comment_disabled": "Publique esta encuesta usando el botón ✓ para habilitar los comentarios.", - "oo_reconnect": "La conexión del servidor ha vuelto. Haga clic en Aceptar para recargar y continuar con la edición.", + "oo_reconnect": "La conexión del servidor ha vuelto. Haga click en Aceptar para recargar y continuar con la edición.", "oo_cantUpload": "No se permite la carga mientras otros usuarios estén presentes.", "canvas_delete": "Eliminar selección", "canvas_width": "Ancho", "canvas_opacity": "Opacidad", "canvas_opacityLabel": "Opacidad: {0}", "canvas_widthLabel": "Ancho: {0}", - "canvas_saveToDrive": "Guarde esta imagen como un archivo en su CryptDrive", + "canvas_saveToDrive": "Guarda esta imagen como un archivo en su CryptDrive", "canvas_currentBrush": "Pincel actual", - "canvas_imageEmbed": "Inserta una imagen desde tu computadora", + "canvas_imageEmbed": "Incrusta una imagen desde tu computadora", "profile_uploadSizeError": "Error: tu avatar debe ser más pequeño que {0}", "profile_error": "Error al crear tu perfil: {0}", "profile_register": "¡Tienes que registrarte para crear un perfil!", @@ -229,17 +229,17 @@ "contacts_rejected": "Invitación de contacto rechazada", "contacts_send": "Enviar", "contacts_remove": "Eliminar este contacto", - "contacts_confirmRemove": "Estás seguro de que desea eliminar {0} de tus contactos?", - "contacts_typeHere": "Escriba un mensaje aquí...", + "contacts_confirmRemove": "¿Estás seguro de que deseas eliminar {0} de tus contactos?", + "contacts_typeHere": "Escribe un mensaje aquí...", "contacts_padTitle": "Chat", "contacts_info1": "Estos son tus contactos. Desde aquí podrás:", - "contacts_info2": "Haga clic en el icono de su contacto para chatear con ellos", - "contacts_info3": "Haga doble clic en su icono para ver su perfil", + "contacts_info2": "Hacer click en el icono del contacto para chatear con ellos", + "contacts_info3": "Hacer doble click en su icono para ver su perfil", "contacts_info4": "Cualquiera de los participantes puede borrar permanentemente un historial de chat", "contacts_removeHistoryTitle": "Limpiar el historial de chat", "contacts_removeHistoryServerError": "Se produjo un error al eliminar tu historial de chat. Vuelve a intentarlo más tarde", "contacts_fetchHistory": "Recuperar historial anterior", - "contacts_rooms": "Sala", + "contacts_rooms": "Salas", "contacts_leaveRoom": "Abandonar esta sala", "contacts_online": "Otro usuario de esta sala está en línea", "settings_resetThumbnailsAction": "Limpiar", @@ -342,8 +342,8 @@ "team_linkUses": "({0}/{1} recordatorio)", "form_anonymized": "Las respuestas son anónimas", "main_title": "CryptPad: conocimiento cero, edición colaborativa en tiempo real", - "padNotPinnedVariable": "Este documento caducará después {4} días de inactividad, {0}{1} o {2}registro{3} para preservarlo.", - "chainpadError": "Se produjo un error crítico al actualizar su contenido. Esta página está en modo de solo lectura para garantizar que no pierda su trabajo.
Presione Esc para continuar viendo este documento o vuelva a cargarlo para intentar editarlo nuevamente.", + "padNotPinnedVariable": "Este documento caducará después {4} días de inactividad, {0}inicia sesión{1} o {2}registro{3} para preservarlo.", + "chainpadError": "Se produjo un error crítico al actualizar su contenido. Esta página está en modo de solo lectura para garantizar que no pierdas tu trabajo.
Presiona Esc para continuar viendo este documento o vuelve a cargarlo para intentar editarlo nuevamente.", "form_settingsButton": "Configuraciones de formulario", "form_editable_on": "Una vez y editar", "onLogout": "Estás desconectado, {0}haga clic aquí{1} para iniciar sesión en
o presione Esc para acceder a tu documento en el modo de solo lectura.", @@ -359,17 +359,17 @@ "filePickerButton": "Incrustar un archivo almacenado en CryptDrive", "tags_add": "Actualizar las etiquetas de los documentos seleccionados", "slide_invalidLess": "Estilo personalizado no válido", - "themeButtonTitle": "Seleccione el tema de color que desea utilizar para los editores de código y diapositivas", - "viewEmbedTag": "Para insertar este documento, incluya este iframe en su página donde desee. Puedes diseñarlo usando atributos CSS o HTML.", + "themeButtonTitle": "Selecciona el tema de color que deseas utilizar para los editores de código y diapositivas", + "viewEmbedTag": "Para incrustar este documento, incluye este iframe en tu página donde desee. Puedes diseñarlo usando atributos CSS o HTML.", "history_loadMore": "Cargar más historial", - "history_restorePrompt": "¿Está seguro de que desea reemplazar la versión actual del documento con la versión mostrada?", + "history_restorePrompt": "¿Estás seguro de que deseas reemplazar la versión actual del documento con la versión mostrada?", "pad_mediatagImport": "Guardar en tu CryptDrive", "poll_optionPlaceholder": "Opción", "poll_removeUser": "¿Estás seguro de que deseas eliminar a este usuario?", - "poll_descriptionHint": "Describe tu encuesta y usa el botón ✓ (publicar) cuando hayas terminado.\nLa descripción se puede escribir utilizando la sintaxis de rebajas y puede incrustar elementos multimedia desde su CryptDrive.\nCualquiera con el enlace puede cambiar la descripción, pero esto no se recomienda.", - "oo_uploaded": "Tu carga se ha completado. Haga clic en Aceptar para recargar la página o cancelar para continuar en modo de solo lectura.", + "poll_descriptionHint": "Describe tu encuesta y usa el botón ✓ (publicar) cuando hayas terminado.\nLa descripción se puede escribir utilizando la sintaxis de rebajas y puedes incrustar elementos multimedia desde tu CryptDrive.\nCualquiera con el enlace puede cambiar la descripción, pero esto no se recomienda.", + "oo_uploaded": "Tu carga se ha completado. Haga click en Aceptar para recargar la página o cancelar para continuar en modo de solo lectura.", "profile_upload": " Sube un nuevo avatar", - "contacts_request": "{0} Me gustaría agregarte como contacto.Aceptar?", + "contacts_request": "{0} le gustaría agregarte como contacto.Aceptar?", "contacts_warning": "Todo lo que escriba aquí es persistente y está disponible para todos los usuarios actuales y futuros de este documento. ¡Cuidado con la información sensible!", "contacts_confirmRemoveHistory": "¿Estás seguro de que deseas eliminar permanentemente tu historial de chat? Los datos no se pueden restaurar", "settings_importTitle": "Importe los documentos recientes de este navegador a su CryptDrive", @@ -491,7 +491,7 @@ "mdToolbar_heading": "Encabezado", "mdToolbar_code": "Código", "fc_hashtag": "Etiquetas", - "forgotten": "Moviendo a la papelera", + "forgotten": "Movido a la basura", "errorState": "Error crítico: {0}", "readonly": "Solo lectura", "anonymous": "Invitado", @@ -507,7 +507,7 @@ "formattedMB": "{0} MB", "formattedGB": "{0} GB", "pinLimitReached": "Has alcanzado tu límite de almacenamiento", - "pinLimitReachedAlert": "Has alcanzado tu límite de almacenamiento. Los documentos nuevos no se almacenarán en su CryptDrive.
Puede eliminar documentos de su CryptDrive o suscribirse a una oferta premium para aumentar su límite.", + "pinLimitReachedAlert": "Has alcanzado tu límite de almacenamiento. Los documentos nuevos no se almacenarán en tu CryptDrive.
Puedes eliminar documentos de tu CryptDrive o suscribirte a una oferta premium para aumentar tu límite.", "pinLimitReachedAlertNoAccounts": "Has alcanzado tu límite de almacenamiento", "pinLimitNotPinned": "Has alcanzado tu límite de almacenamiento.
Este documento no está almacenado en tu CryptDrive.", "pinLimitDrive": "Has alcanzado tu límite de almacenamiento.
No puedes crear nuevos documentos.", @@ -515,14 +515,14 @@ "importButtonTitle": "Importar un documento desde un archivo local", "exportButton": "Exportar", "exportButtonTitle": "Exportar este documento a un archivo local", - "exportPrompt": "¿Cómo le gustaría nombrar su archivo?", - "user_rename": "Cambiar nombre para mostrar", - "user_displayName": "Nombre para mostrar", + "exportPrompt": "¿Cómo te gustaría nombrar tu archivo?", + "user_rename": "Cambiar nombre de usuario", + "user_displayName": "Nombre de usuario", "user_accountName": "Nombre de la cuenta", "clickToEdit": "Haz click para editar", "saveTitle": "Guardar el título (enter)", "forgetButton": "Eliminar", - "forgetPrompt": "Al hacer clic en Aceptar, este documento se moverá a la papelera. ¿Está seguro?", + "forgetPrompt": "Al hacer click en Aceptar, este documento se moverá a la basura ¿Está seguro?", "movedToTrash": "Este documento ha sido movido a la papelera.
Acceder a mi Unidad", "shareButton": "Compartir", "shareSuccess": "Enlace copiado al portapapeles", @@ -531,7 +531,7 @@ "userAccountButton": "Menú del Usuario", "newButton": "Nuevo", "newButtonTitle": "Crear un nuevo documento", - "fm_rootName": "Conducir", + "fm_rootName": "Unidad", "fm_trashName": "Basura", "fm_filesDataName": "Todos los archivos", "fm_templateName": "Plantillas", @@ -555,11 +555,11 @@ "fm_creation": "Creación", "fm_forbidden": "Acción prohibida", "fm_openParent": "Mostrar en la carpeta", - "fm_noname": "Documento sin titulo", - "fm_emptyTrashDialog": "¿Estás seguro de que quieres vaciar la papelera?", - "fm_removePermanentlyDialog": "¿Está seguro de que desea eliminar este elemento de su disco? Permanecerá en los discos de otros usuarios que lo hayan almacenado.", - "fm_deleteOwnedPad": "¿Está seguro de que desea destruir permanentemente este documento?", - "fm_restoreDialog": "¿Está seguro de que desea restaurar {0} a su ubicación anterior?", + "fm_noname": "Documento sin título", + "fm_emptyTrashDialog": "¿Estás seguro de que quieres vaciar la basura?", + "fm_removePermanentlyDialog": "¿Estás seguro de que deseas eliminar este elemento de tu unidad? Permanecerá en las unidades de otros usuarios que lo hayan almacenado.", + "fm_deleteOwnedPad": "¿Estás seguro de que deseas destruir permanentemente este documento?", + "fm_restoreDialog": "¿Estás seguro de que deseas restaurar {0} a su ubicación anterior?", "fm_unknownFolderError": "El directorio seleccionado o visitado por última vez ya no existe. Abriendo la carpeta principal...", "fm_selectError": "No se puede seleccionar el elemento objetivo. Si el problema persiste, intenta recargar la página.", "fm_categoryError": "No se puede abrir la categoría seleccionada, mostrando la raíz.", @@ -578,7 +578,7 @@ "fm_deletedPads": "Estos documentos ya no existen en el servidor, se eliminaron de su CryptDrive: {0}", "fm_tags_name": "Nombre de etiqueta", "fm_tags_used": "Número de usos", - "fm_restoreDrive": "Restablecer su disco a un estado anterior. Para obtener mejores resultados, evite realizar cambios en su disco hasta que se complete este proceso.", + "fm_restoreDrive": "Restablecer tu disco a un estado anterior. Para obtener mejores resultados, evita realizar cambios en tu disco hasta que se complete este proceso.", "fm_passwordProtected": "Contraseña protegida", "fc_newfolder": "Nueva carpeta", "fc_newsharedfolder": "Nueva carpeta compartida", @@ -612,13 +612,13 @@ "register_passwordsDontMatch": "¡Las contraseñas no coinciden!", "register_mustAcceptTerms": "Debes aceptar los términos de servicio.", "register_whyRegister": "¿Por qué registrarse?", - "register_header": "Registro", + "register_header": "Inscribirse", "register_writtenPassword": "He anotado mi nombre de usuario y contraseña, proceda", "register_cancel": "Cancelar", "register_warning": "Advertencia", "register_emailWarning0": "Parece que enviaste tu correo electrónico como tu nombre de usuario.", "register_emailWarning1": "Puede hacerlo si lo desea, pero no se enviará a nuestro servidor.", - "register_emailWarning3": "Si comprende y desea utilizar su correo electrónico como nombre de usuario de todos modos, haga clic en Aceptar.", + "register_emailWarning3": "Si comprendes y deseas utilizar su correo electrónico como nombre de usuario de todos modos, haga click en Aceptar.", "settings_cat_account": "Cuenta", "settings_cat_drive": "CryptDrive", "settings_cat_cursor": "Cursor", @@ -631,13 +631,13 @@ "settings_backup": "Copia de seguridad", "settings_restore": "Restaurar", "settings_backup2": "Descargar mi CryptDrive", - "settings_backup2Confirm": "Esto descargará todos los documentos y archivos de su CryptDrive. Si desea continuar, elija un nombre y presione OK", + "settings_backup2Confirm": "Esto descargará todos los documentos y archivos de tu CryptDrive. Si deseas continuar, elija un nombre y presione OK", "settings_exportTitle": "Exporta tu CryptDrive", - "settings_exportDescription": "Espere mientras descargamos y desciframos sus documentos. Esto puede tomar unos pocos minutos. Cerrar la pestaña interrumpirá el proceso.", + "settings_exportDescription": "Espera mientras descargamos y desciframos tus documentos. Esto puede tomar unos pocos minutos. Cerrar la pestaña interrumpirá el proceso.", "settings_exportFailed": "Si un documento requiere más de 1 minuto para descargarse, no se incluirá en la exportación. Se mostrará un enlace a cualquier documento que no haya sido exportado.", "settings_exportCancel": "¿Está seguro de que desea cancelar la exportación? La próxima vez tendrás que empezar de nuevo desde el principio.", "settings_export_reading": "Leyendo tu CryptDrive...", - "settings_export_download": "Descargando y descifrando sus documentos...", + "settings_export_download": "Descargando y descifrando tus documentos...", "settings_export_compressing": "Comprimiendo datos...", "settings_export_done": "¡Tu descarga esta lista!", "settings_exportError": "Ver errores", @@ -645,18 +645,18 @@ "settings_exportErrorEmpty": "Este documento no se puede exportar (contenido vacío o no válido).", "settings_exportErrorMissing": "Este documento no se encuentra en nuestros servidores (caducado o eliminado por su propietario)", "settings_exportErrorOther": "Se produjo un error al intentar exportar este documento: {0}", - "settings_resetNewTitle": "Limpiar CryptoDrive", - "settings_resetButton": "Limpiar CryptoDrive", + "settings_resetNewTitle": "Limpiar CryptDrive", + "settings_resetButton": "Limpiar CryptDrive", "settings_reset": "Elimina todos los archivos y carpetas de tu CryptDrive", - "settings_resetPrompt": "Esta acción eliminará todos los documentos de su disco.
¿Está seguro de que desea continuar?
Escriba “Me encanta CryptPad” para confirmar.", - "settings_resetDone": "¡Tu disco ahora está vacío!", - "settings_resetError": "Texto de verificación incorrecto. Su CryptDrive no ha sido modificado.", + "settings_resetPrompt": "Esta acción eliminará todos los documentos de su unidad.
¿Está seguro de que desea continuar?
Escriba “Me encanta CryptPad” para confirmar.", + "settings_resetDone": "¡Tu unidad ahora está vacía!", + "settings_resetError": "Texto de verificación incorrecto. Tu CryptDrive no ha sido modificado.", "settings_resetTipsAction": "Reiniciar", "settings_resetTips": "Consejos", "settings_resetTipsButton": "Restablecer los consejos disponibles en CryptDrive", "settings_resetTipsDone": "Todos los consejos ahora son visibles nuevamente.", "settings_thumbnails": "Miniaturas", - "settings_disableThumbnailsAction": "Deshabilite la creación de miniaturas en su CryptDrive", + "settings_disableThumbnailsAction": "Deshabilita la creación de miniaturas en tu CryptDrive", "settings_importConfirm": "¿Está seguro de que desea importar documentos recientes desde este navegador al CryptDrive de su cuenta de usuario?", "settings_changePasswordHint": "Cambie la contraseña de su cuenta. Ingrese su contraseña actual y confirme la nueva contraseña escribiéndola dos veces.
No podemos restablecer su contraseña si la olvida, ¡así que tenga mucho cuidado!", "settings_changePasswordButton": "Cambiar la contraseña", @@ -668,26 +668,26 @@ "formattedKB": "{0} kB", "fm_searchPlaceholder": "Buscar...", "fm_originalPath": "Ruta original", - "fm_deleteOwnedPads": "¿Está seguro de que desea destruir permanentemente estos documentos?", + "fm_deleteOwnedPads": "¿Estás seguro de que deseas destruir permanentemente estos documentos?", "fm_contextMenuError": "No se puede abrir el menú contextual para ese elemento. Si el problema persiste, intenta recargar la página.", "settings_exportWarning": "Nota: esta herramienta aún se encuentra en una versión beta y puede tener problemas de escalabilidad. Para un mejor rendimiento, se recomienda dejar esta pestaña enfocada.", "language": "Idioma", - "upgrade": "Mejora", + "upgrade": "Actualización", "fm_newButtonTitle": "Cree un nuevo documento o carpeta, importe un archivo en la carpeta actual.", - "fm_removeSeveralPermanentlyDialog": "¿Está seguro de que desea eliminar estos {0} elementos de su disco? Permanecerán en los discos de otros usuarios que los hayan almacenado.", + "fm_removeSeveralPermanentlyDialog": "¿Está seguro de que desea eliminar estos {0} elementos de su disco? Permanecerán en las unidades de otros usuarios que los hayan almacenado.", "fm_info_template": "Estos documentos se almacenan como plantillas. Se pueden reutilizar al crear nuevos documentos.", "fm_info_anonymous": "No ha iniciado sesión, por lo que sus documentos caducarán después de {0} días. Borrar el historial de tu navegador puede hacer que desaparezcan.
Regístrate (no se requiere información personal) o Inicia sesión para almacenarlos en su disco indefinidamente. Lea más sobre las cuentas registradas.", "fm_info_owned": "Usted es el propietario de los documentos aquí mostrados. Esto significa que puedes eliminarlos permanentemente del servidor cuando quieras. Si lo hace, otros usuarios ya no podrán acceder a ellos.", "fm_renamedPad": "Ha establecido un nombre personalizado para este documento. Su título compartido es:
{0}", "fo_existingNameError": "Nombre ya utilizado en ese directorio. Por favor elije otro.", - "fo_unavailableName": "Ya existe un archivo o una carpeta con el mismo nombre en la nueva ubicación. Cambie el nombre del elemento e inténtelo de nuevo.", + "fo_unavailableName": "Ya existe un archivo o una carpeta con el mismo nombre en la nueva ubicación. Cambia el nombre del elemento e inténtelo de nuevo.", "login_unhandledError": "Ocurrió un error inesperado :(", "register_passwordTooShort": "Las contraseñas deben tener al menos {0} caracteres.", "register_alreadyRegistered": "Este usuario ya existe, ¿quieres iniciar sesión?", - "settings_backupHint": "Haga una copia de seguridad o restaure todo el contenido de su CryptDrive. No contendrá el contenido de sus documentos, sólo las claves para acceder a ellos.", - "settings_backupHint2": "Descarga todos los documentos en tu disco. 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_backupHint": "Haga una copia de seguridad o restaura todo el contenido de tu CryptDrive. No contendrá el contenido de tus documentos, sólo las claves para acceder a ellos.", + "settings_backupHint2": "Descarga todos los documentos en tu 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.", "fm_burnThisDrive": "¿Está seguro de que desea eliminar todo lo almacenado por CryptPad en su navegador?
Esto eliminará su CryptDrive y su historial de su navegador, pero sus documentos seguirán existiendo (encriptados) en nuestro servidor.", - "fm_moveNestedSF": "No puede colocar una carpeta compartida dentro de otra. La carpeta {0} no se movió.", + "fm_moveNestedSF": "No puedes colocar una carpeta compartida dentro de otra. La carpeta {0} no se movió.", "login_invalPass": "Se requiere contraseña", "register_emailWarning2": "No podrá restablecer su contraseña utilizando su correo electrónico como puede hacerlo con muchos otros servicios.", "todo_title": "CryptTodo", From 3bcc16220baf7c246a77f6db802f03e47832ed1a Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 24 Jul 2024 11:35:25 +0200 Subject: [PATCH 060/188] Translated using Weblate (French) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1780 of 1780 strings) Co-authored-by: David Benqué Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/fr/ Translation: CryptPad/App --- www/common/translations/messages.fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 5dc663a98..0b4f2432d 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -609,8 +609,8 @@ "admin_activeSessionsHint": "Nombre de connexions websocket actives (et adresses IP uniques connectées)", "admin_activePadsTitle": "Documents actifs", "admin_activePadsHint": "Nombre de documents uniques actuellement ouverts (lus ou modifiés)", - "admin_registeredTitle": "Utilisateur·ices enregistré·es", - "admin_registeredHint": "Nombre d'utilisateur·ices enregistré·es sur votre instance", + "admin_registeredTitle": "Drives utilisateur·ices et équipes", + "admin_registeredHint": "Nombre de drives actifs sur votre instance", "admin_updateLimitTitle": "Mettre à jour les quotas", "admin_updateLimitHint": "Forcer la mise à jour des limites de stockage des utilisateur·ices peut être effectué à tout moment, mais cela n'est utile que lorsqu'une erreur survient", "admin_updateLimitButton": "Mettre à jour les quotas", From e37ae3b8d3a806eae809c65183321fa18dee4878 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 24 Jul 2024 11:35:25 +0200 Subject: [PATCH 061/188] Translated using Weblate (Indonesian) Currently translated at 100.0% (1780 of 1780 strings) Co-authored-by: Linerly Translate-URL: https://weblate.cryptpad.org/projects/cryptpad/app/id/ Translation: CryptPad/App --- www/common/translations/messages.id.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.id.json b/www/common/translations/messages.id.json index 2477397e8..0ece6d2c3 100644 --- a/www/common/translations/messages.id.json +++ b/www/common/translations/messages.id.json @@ -647,8 +647,8 @@ "fm_expirablePad": "Kedaluwarsa: {0}", "admin_activePadsTitle": "Dokumen aktif", "admin_activePadsHint": "Jumlah dokumen unik yang saat ini ditampilkan atau disunting", - "admin_registeredTitle": "Pengguna terdaftar", - "admin_registeredHint": "Jumlah pengguna terdaftar di server Anda", + "admin_registeredTitle": "Pengguna dan drive tim", + "admin_registeredHint": "Jumlah drive aktif di server Anda", "admin_updateLimitButton": "Perbarui kuota", "admin_updateLimitDone": "Pembaruan berhasil", "admin_flushCacheDone": "Tembolok berhasil dibersihkan", From 6ed9ea3fa331d9ab4107d7271adb7029cbca30c9 Mon Sep 17 00:00:00 2001 From: daria Date: Wed, 24 Jul 2024 12:37:49 +0300 Subject: [PATCH 062/188] fix focus bug on one-time events modal --- www/calendar/inner.js | 1 + 1 file changed, 1 insertion(+) diff --git a/www/calendar/inner.js b/www/calendar/inner.js index f3dac10a4..982c22662 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -2252,6 +2252,7 @@ APP.recurrenceRule = { var data = ev.schedule || {}; var id = data.id; + UI.addTabListener(el); if (!id) { return; } if (id.indexOf('|') === -1) { return; } // Original event ID doesn't contain | From bb73e171ab4ad1ebd65f65446534f44b9bd292c7 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 24 Jul 2024 12:08:48 +0200 Subject: [PATCH 063/188] Enable Arabic, Swedish and Cuban Spanish languages --- customize.dist/messages.js | 8 +++++--- customize.dist/translations/messages.ar.js | 18 ++++++++++++++++++ customize.dist/translations/messages.es_CU.js | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 customize.dist/translations/messages.ar.js create mode 100644 customize.dist/translations/messages.es_CU.js diff --git a/customize.dist/messages.js b/customize.dist/messages.js index 2459a246f..a5784b495 100755 --- a/customize.dist/messages.js +++ b/customize.dist/messages.js @@ -5,11 +5,13 @@ (function () { // add your module to this map so it gets used var map = { + 'ar': 'اَلْعَرَبِيَّةُ', 'ca': 'Català', 'cs': 'Čeština', 'de': 'Deutsch', - 'el': 'Ελληνικά', + //'el': 'Ελληνικά', 'es': 'Español', + 'es_CU': 'Español cubano', 'eu': 'Euskara', 'fi': 'Suomi', 'fr': 'Français', @@ -22,9 +24,9 @@ var map = { 'pl': 'Polski', 'pt-br': 'Português do Brasil', 'pt-pt': 'Português do Portugal', - 'ro': 'Română', + //'ro': 'Română', 'ru': 'Русский', - //'sv': 'Svenska', + 'sv': 'Svenska', //'te': 'తెలుగు', 'uk': 'Українська', 'zh': '中文(簡體)', diff --git a/customize.dist/translations/messages.ar.js b/customize.dist/translations/messages.ar.js new file mode 100644 index 000000000..e55c4f50a --- /dev/null +++ b/customize.dist/translations/messages.ar.js @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +/* + * You can override the translation text using this file. + * The recommended method is to make a copy of this file (/customize.dist/translations/messages.{LANG}.js) + in a 'customize' directory (/customize/translations/messages.{LANG}.js). + * If you want to check all the existing translation keys, you can open the internal language file + but you should not change it directly (/common/translations/messages.{LANG}.js) +*/ +define(['/common/translations/messages.ar.js'], function (Messages) { + // Replace the existing keys in your copied file here: + // Messages.button_newpad = "New Rich Text Document"; + + return Messages; +}); + diff --git a/customize.dist/translations/messages.es_CU.js b/customize.dist/translations/messages.es_CU.js new file mode 100644 index 000000000..255febd27 --- /dev/null +++ b/customize.dist/translations/messages.es_CU.js @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +/* + * You can override the translation text using this file. + * The recommended method is to make a copy of this file (/customize.dist/translations/messages.{LANG}.js) + in a 'customize' directory (/customize/translations/messages.{LANG}.js). + * If you want to check all the existing translation keys, you can open the internal language file + but you should not change it directly (/common/translations/messages.{LANG}.js) +*/ +define(['/common/translations/messages.es_CU.js'], function (Messages) { + // Replace the existing keys in your copied file here: + // Messages.button_newpad = "New Rich Text Document"; + + return Messages; +}); + From 2800e7f4302984bb9e45c5125141e1b1bf8ee080 Mon Sep 17 00:00:00 2001 From: daria Date: Wed, 24 Jul 2024 14:47:09 +0300 Subject: [PATCH 064/188] remove unnecessary line --- www/calendar/inner.js | 1 - 1 file changed, 1 deletion(-) diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 982c22662..5dc05b2b8 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -2285,7 +2285,6 @@ APP.recurrenceRule = { $b.closest('.tui-full-calendar-floating-layer').hide(); }); }); - UI.addTabListener(el); }; var onPopupRemoved = function () { var start, end; From eec885f365bf96f888e4e5b426983fe0f613fe78 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 24 Jul 2024 14:14:30 +0200 Subject: [PATCH 065/188] Fix cancel button in UI.confirm #1576 --- www/common/common-interface.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 2c4d57799..2103f3f82 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -811,19 +811,11 @@ define([ addTabListener(frame); - frame.addEventListener('keydown', function(e) { - if (e.keyCode === 13) { - if (document.activeElement === $ok[0]) { - $ok.click(); - } else if (document.activeElement === $cancel[0]) { - $cancel.click(); - } - } else if (e.keyCode === 27) { - $cancel.click(); - } - }); - listener = listenForKeys(function () { + // Only trigger OK if cancel is not focused + if (document.activeElement === $cancel[0]) { + return void $cancel.click(); + } $ok.click(); }, function () { $cancel.click(); From b819a5d8278fd283228cc5b684e2ee490328f68e Mon Sep 17 00:00:00 2001 From: daria Date: Thu, 25 Jul 2024 13:34:43 +0300 Subject: [PATCH 066/188] add option to exit description editor on the calendar modal --- www/calendar/inner.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 5dc05b2b8..267b69958 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -2063,6 +2063,15 @@ APP.recurrenceRule = { editor.setOption('readOnly', false); editor.setOption('autoRefresh', true); editor.setOption('gutters', []); + editor.on('keydown', function (editor, e) { + if (e.which === 27) { + let $next = $(e.target).closest('.tui-full-calendar-popup-section').next(); + if ($next.length) { + $next.find('#tui-full-calendar-schedule-start-date').focus(); + } + e.stopPropagation(); + } + }); cm.configureTheme(common, function () {}); editor.setValue(oldEventBody); From f46d76decb76367704e1bf2f4cb9f47b03d64d81 Mon Sep 17 00:00:00 2001 From: David Benque Date: Thu, 25 Jul 2024 13:54:11 +0100 Subject: [PATCH 067/188] Update version strings --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index df6e37a6d..9cfeae305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cryptpad", - "version": "2024.6.0", + "version": "2024.6.1", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index cf44ccd5b..ed0b3375b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "a collaborative office suite that is end-to-end encrypted and open-source", - "version": "2024.6.0", + "version": "2024.6.1", "license": "AGPL-3.0+", "repository": { "type": "git", From e4529d41b438088db39696a9855bb670d2e749a4 Mon Sep 17 00:00:00 2001 From: David Benque Date: Thu, 25 Jul 2024 14:09:21 +0100 Subject: [PATCH 068/188] Add changelog for 2024.6.1 --- CHANGELOG.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbfe2d540..813930b3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,51 @@ SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and cont SPDX-License-Identifier: AGPL-3.0-or-later --> +# 2024.6.1 + +## Goals + +This is a bugfix release to address issues that were reported by Cryptpad.fr users. We took the opportunity to update the translations with some new languages contributed by the community. + +## Improvements + +- Translations update from CryptPad Translations [#1575](https://github.com/cryptpad/cryptpad/pull/1575) + - Added: Español cubano, اَلْعَرَبِيَّةُ Arabic, Svenska + - Removed some languages without enough coverage + - Greek (16%) + - Romanian (36%) + +## Fixes +- Calendar events sometimes don’t appear when created [#1551](https://github.com/cryptpad/cryptpad/issues/1551) fixed by [072dba2](https://github.com/cryptpad/cryptpad/commit/072dba254e3c2be32cd6b261d84510909deb713f) +- Revert the new method of counting registered users in the admin panel [4544be6](https://github.com/cryptpad/cryptpad/commit/4544be6b4d9fa7291b19cb366f7dd492dfe07340) +- Fix broken OnlyOffice Document [#1572](https://github.com/cryptpad/cryptpad/issues/1572) +- Fix printing in Code documents [#1557](https://github.com/cryptpad/cryptpad/pull/1557) [#1478](https://github.com/cryptpad/cryptpad/pull/1478) +- Fix OnlyOffice undefined functions [#1550](https://github.com/cryptpad/cryptpad/pull/1550) +- Fix keyboard operation of confirm modals [#1576](https://github.com/cryptpad/cryptpad/issues/1576) + - Pressing Enter on the "Cancel" button triggered the "OK" button instead + + +## Upgrade notes + +If you are upgrading from a version older than `2024.6.0` please read the upgrade notes of all versions between yours and `2024.6.1` to avoid configuration issues. + +To upgrade: + +1. Stop your server +2. Get the latest code with git + +```bash +git fetch origin --tags +git checkout 2024.6.1 +npm ci +npm run install:components +./install-onlyoffice.sh +``` + +3. Restart your server +4. Review your instance's checkup page to ensure that you are passing all tests + + # 2024.6.0 ## Goals From 31a30e2bf9952e4c247f3133315591caadc75b9b Mon Sep 17 00:00:00 2001 From: David Benque Date: Thu, 25 Jul 2024 14:46:06 +0100 Subject: [PATCH 069/188] Bump more version numbers --- .github/ISSUE_TEMPLATE/bug_resolution.yml | 1 + package-lock.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_resolution.yml b/.github/ISSUE_TEMPLATE/bug_resolution.yml index da1a7c9d5..85f0f639a 100644 --- a/.github/ISSUE_TEMPLATE/bug_resolution.yml +++ b/.github/ISSUE_TEMPLATE/bug_resolution.yml @@ -89,6 +89,7 @@ body: label: Version description: What version of CryptPad are you running? options: + - 2024.6.1 - 2024.6.0 - 2024.3.1 - 2024.3.0 diff --git a/package-lock.json b/package-lock.json index 9cfeae305..cb5c4e714 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "cryptpad", - "version": "2024.6.0", + "version": "2024.6.1", "license": "AGPL-3.0+", "dependencies": { "@mcrowe/minibloom": "^0.2.0", From bba8bc84a1028b2de352eea45060757a164c94a9 Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Thu, 25 Jul 2024 22:25:26 +0300 Subject: [PATCH 070/188] Make password confirmation button responsive #1406 --- .../src/less2/include/alertify.less | 13 ------------ www/settings/app-settings.less | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index c225708aa..0890d8010 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -327,8 +327,6 @@ nav { padding: @alertify_padding-base; text-align: right; - display: flex; - align-items: center; button, div.cp-button-confirm { margin: 0px !important; &:not(:first-child):not(.left) { @@ -341,17 +339,6 @@ div.cp-button-confirm { vertical-align: middle; } - .btn.btn-danger { - overflow-wrap: break-word; - white-space: normal; - } - @media screen and (max-width: @browser_media-medium-screen){ - justify-content: flex-end; - .btn.btn-danger { - width: 100%; - line-height: inherit; - } - } } } } diff --git a/www/settings/app-settings.less b/www/settings/app-settings.less index ee5c1afc9..a3e47ab39 100644 --- a/www/settings/app-settings.less +++ b/www/settings/app-settings.less @@ -38,6 +38,22 @@ margin-left: 0.5rem; } + .alertify { + nav { + display: flex; + justify-content: center; + align-items: flex-end; + @media screen and (max-width: @browser_media-medium-screen) { + .btn-danger { + line-height: inherit; + overflow-wrap: break-word; + white-space: normal; + width: 100%; + } + } + } + } + #cp-sidebarlayout-container { #cp-sidebarlayout-rightside { input[type="checkbox"] { @@ -113,6 +129,11 @@ margin-left: 10px; } } + nav { + display: flex; + justify-content: center; + align-items: flex-end; + } @media (max-width: 840px) { .cp-password-container { From 3eece44804a1b0f97a26fdfff887cbeb435b855d Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:19:26 +0300 Subject: [PATCH 071/188] Generalize solution to install and register confirmation buttons #1406 --- customize.dist/src/less2/pages/page-install.less | 11 +++++++---- customize.dist/src/less2/pages/page-register.less | 11 +++++++---- www/common/common-interface.js | 8 ++++++-- www/install/main.js | 2 +- www/register/main.js | 2 +- www/settings/app-settings.less | 2 +- www/settings/inner.js | 4 ++-- 7 files changed, 25 insertions(+), 15 deletions(-) diff --git a/customize.dist/src/less2/pages/page-install.less b/customize.dist/src/less2/pages/page-install.less index 47579bd12..d2c773adf 100644 --- a/customize.dist/src/less2/pages/page-install.less +++ b/customize.dist/src/less2/pages/page-install.less @@ -45,11 +45,14 @@ display: flex; align-items: center; justify-content: flex-end; - } - @media screen and (max-width: 600px) { - nav .btn-danger { - line-height: inherit; + @media screen and (max-width: @browser_media-medium-screen) { + .btn-confirm { + line-height: inherit; + overflow-wrap: break-word; + white-space: normal; + width: 100%; + } } } diff --git a/customize.dist/src/less2/pages/page-register.less b/customize.dist/src/less2/pages/page-register.less index 9e5d5caee..24216b49e 100644 --- a/customize.dist/src/less2/pages/page-register.less +++ b/customize.dist/src/less2/pages/page-register.less @@ -70,11 +70,14 @@ display: flex; align-items: center; justify-content: flex-end; - } - @media screen and (max-width: 600px) { - nav .btn-danger { - line-height: inherit; + @media screen and (max-width: @browser_media-medium-screen) { + .btn-confirm { + line-height: inherit; + overflow-wrap: break-word; + white-space: normal; + width: 100%; + } } } diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 2c4d57799..e58f04a67 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -775,10 +775,10 @@ define([ }); }; - UI.confirm = function (msg, cb, opt, force) { + UI.confirm = function (msg, cb, opt, force, className) { cb = cb || function () {}; opt = opt || {}; - + console.log('Parameters:', { msg, cb, opt, force, className }); var message; if (typeof(msg) === 'string') { if (!force) { msg = Util.fixHTML(msg); } @@ -791,6 +791,10 @@ define([ var ok = dialog.okButton(opt.ok, opt.okClass); var cancel = dialog.cancelButton(opt.cancel, opt.cancelClass); + if (className) { + ok.classList.add(className); + } + var frame = dialog.frame([ message, dialog.nav(opt.reverseOrder? diff --git a/www/install/main.js b/www/install/main.js index 92d6ddcbc..3eb97bf79 100644 --- a/www/install/main.js +++ b/www/install/main.js @@ -194,7 +194,7 @@ define([ done: function ($dialog) { $dialog.find('> div').addClass('half'); }, - }); + }, false, 'btn-confirm'); }, 150); }; diff --git a/www/register/main.js b/www/register/main.js index b9c7e6565..48e4a6e24 100644 --- a/www/register/main.js +++ b/www/register/main.js @@ -180,7 +180,7 @@ define([ done: function ($dialog) { $dialog.find('> div').addClass('half'); }, - }); + }, false, 'btn-confirm'); }, 150); }; diff --git a/www/settings/app-settings.less b/www/settings/app-settings.less index a3e47ab39..6c52d14ca 100644 --- a/www/settings/app-settings.less +++ b/www/settings/app-settings.less @@ -44,7 +44,7 @@ justify-content: center; align-items: flex-end; @media screen and (max-width: @browser_media-medium-screen) { - .btn-danger { + .btn-confirm{ line-height: inherit; overflow-wrap: break-word; white-space: normal; diff --git a/www/settings/inner.js b/www/settings/inner.js index e23459d9d..51cb76efb 100644 --- a/www/settings/inner.js +++ b/www/settings/inner.js @@ -812,7 +812,7 @@ define([ done: function($dialog) { $dialog.find('> div').addClass('half'); }, - }); + }, false, 'btn-confirm'); }; $(form).find('button').click(function() { @@ -866,7 +866,7 @@ define([ if (err || obj.error) { return UI.alert(Messages.settings_changePasswordError); } spinner.done(); }); - }); + }, null, null, 'cp-button-confirm'); }; $form.find('button').click(function() { From 72a6c3b5cdfc3aee841694a7c8b11fc43941d09a Mon Sep 17 00:00:00 2001 From: DianaXWiki <139217939+DianaXWiki@users.noreply.github.com> Date: Sun, 28 Jul 2024 19:36:47 +0300 Subject: [PATCH 072/188] Refactor code + fix i and a tags classes mismatch #1567 --- www/common/common-ui-elements.js | 115 ++++++++++++------------------- 1 file changed, 43 insertions(+), 72 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 5405bf319..980076528 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -623,13 +623,19 @@ define([ var appType = (common.getMetadataMgr().getMetadata().type || 'pad').toUpperCase(); data = data || {}; if (!callback && data.callback) { callback = data.callback; } + + function createIconButton(iconClasses, buttonClasses, title, text, ariaLabel) { + return $('