diff --git a/customize.dist/messages.js b/customize.dist/messages.js index 45dd2fac2..9bf35793f 100755 --- a/customize.dist/messages.js +++ b/customize.dist/messages.js @@ -13,6 +13,7 @@ var map = { 'pt-br': 'Português do Brasil', 'ro': 'Română', 'ru': 'Русский', + //'sv': 'Svenska', //'te': 'తెలుగు', 'zh': '繁體中文', //'nl': 'Nederlands' diff --git a/customize.dist/translations/messages.sv.js b/customize.dist/translations/messages.sv.js new file mode 100644 index 000000000..60665701d --- /dev/null +++ b/customize.dist/translations/messages.sv.js @@ -0,0 +1,14 @@ +/* + * 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.sv.js'], function (Messages) { + // Replace the existing keys in your copied file here: + // Messages.button_newpad = "New Rich Text Document"; + + return Messages; +}); + diff --git a/lib/compute-index.js b/lib/compute-index.js new file mode 100644 index 000000000..7a146e060 --- /dev/null +++ b/lib/compute-index.js @@ -0,0 +1,173 @@ +/* jshint esversion: 6 */ +/* global process */ + +const HK = require("./hk-util"); +const Store = require("./storage/file"); +const Util = require("./common-util"); +const nThen = require("nthen"); + +const Env = {}; + +var ready = false; +var store; +const init = function (config, cb) { + if (!config) { + return void cb('E_INVALID_CONFIG'); + } + + Store.create(config, function (_store) { + store = _store; + cb(); + }); +}; + +const tryParse = function (Env, str) { + try { + return JSON.parse(str); + } catch (err) { + // XXX + } +}; + +/* computeIndex + can call back with an error or a computed index which includes: + * cpIndex: + * array including any checkpoints pushed within the last 100 messages + * processed by 'sliceCpIndex(cpIndex, line)' + * offsetByHash: + * a map containing message offsets by their hash + * this is for every message in history, so it could be very large... + * except we remove offsets from the map if they occur before the oldest relevant checkpoint + * size: in bytes + * metadata: + * validationKey + * expiration time + * owners + * ??? (anything else we might add in the future) + * line + * the number of messages in history + * including the initial metadata line, if it exists + +*/ +const computeIndex = function (channelName, cb) { + const cpIndex = []; + let messageBuf = []; + let i = 0; + + const CB = Util.once(cb); + + const offsetByHash = {}; + let size = 0; + nThen(function (w) { + // iterate over all messages in the channel log + // old channels can contain metadata as the first message of the log + // skip over metadata as that is handled elsewhere + // otherwise index important messages in the log + store.readMessagesBin(channelName, 0, (msgObj, readMore) => { + let msg; + // keep an eye out for the metadata line if you haven't already seen it + // but only check for metadata on the first line + if (!i && msgObj.buff.indexOf('{') === 0) { + i++; // always increment the message counter + msg = tryParse(Env, msgObj.buff.toString('utf8')); + if (typeof msg === "undefined") { return readMore(); } + + // validate that the current line really is metadata before storing it as such + // skip this, as you already have metadata... + if (HK.isMetadataMessage(msg)) { return readMore(); } + } + i++; + if (msgObj.buff.indexOf('cp|') > -1) { + msg = msg || tryParse(Env, msgObj.buff.toString('utf8')); + if (typeof msg === "undefined") { return readMore(); } + // cache the offsets of checkpoints if they can be parsed + if (msg[2] === 'MSG' && msg[4].indexOf('cp|') === 0) { + cpIndex.push({ + offset: msgObj.offset, + line: i + }); + // we only want to store messages since the latest checkpoint + // so clear the buffer every time you see a new one + messageBuf = []; + } + } + // if it's not metadata or a checkpoint then it should be a regular message + // store it in the buffer + messageBuf.push(msgObj); + return readMore(); + }, w((err) => { + if (err && err.code !== 'ENOENT') { + w.abort(); + return void CB(err); + } + + // once indexing is complete you should have a buffer of messages since the latest checkpoint + // map the 'hash' of each message to its byte offset in the log, to be used for reconnecting clients + messageBuf.forEach((msgObj) => { + const msg = tryParse(Env, msgObj.buff.toString('utf8')); + if (typeof msg === "undefined") { return; } + if (msg[0] === 0 && msg[2] === 'MSG' && typeof(msg[4]) === 'string') { + // msgObj.offset is API guaranteed by our storage module + // it should always be a valid positive integer + offsetByHash[HK.getHash(msg[4])] = msgObj.offset; + } + // There is a trailing \n at the end of the file + size = msgObj.offset + msgObj.buff.length + 1; + }); + })); + }).nThen(function () { + // return the computed index + CB(null, { + // Only keep the checkpoints included in the last 100 messages + cpIndex: HK.sliceCpIndex(cpIndex, i), + offsetByHash: offsetByHash, + size: size, + //metadata: metadata, + line: i + }); + }); +}; + +process.on('message', function (data) { + if (!data || !data.txid) { + return void process.send({ + error:'E_INVAL' + }); + } + const txid = data.txid; + + if (!ready) { + return void init(data.config, function (err) { + if (err) { + return void process.send({ + txid: txid, + error: err, + }); + } + ready = true; + process.send({txid: txid,}); + }); + } + + const channel = data.args; + if (!channel) { + return void process.send({ + error: 'E_NO_CHANNEL', + }); + } + + // computeIndex + computeIndex(channel, function (err, index) { + if (err) { + return void process.send({ + txid: txid, + error: err, + }); + } + return void process.send({ + txid: txid, + value: index, + }); + }); +}); + diff --git a/lib/historyKeeper.js b/lib/historyKeeper.js index a3a33c4e6..23dbf5fd1 100644 --- a/lib/historyKeeper.js +++ b/lib/historyKeeper.js @@ -238,6 +238,19 @@ module.exports.create = function (config, cb) { if (err) { throw new Error(err); } Env.blobStore = blob; })); + }).nThen(function (w) { + HK.initializeIndexWorkers(Env, { + filePath: config.filePath, + archivePath: config.archivePath, + channelExpirationMs: config.channelExpirationMs, + verbose: config.verbose, + openFileLimit: config.openFileLimit, + }, w(function (err, computeIndex) { + if (err) { + throw new Error(err); + } + Env.computeIndex = computeIndex; + })); }).nThen(function (w) { // create a task store require("./storage/tasks").create(config, w(function (e, tasks) { diff --git a/lib/hk-util.js b/lib/hk-util.js index 2bcae56e3..97e5c3014 100644 --- a/lib/hk-util.js +++ b/lib/hk-util.js @@ -7,7 +7,8 @@ const Util = require("./common-util"); const MetaRPC = require("./commands/metadata"); const Nacl = require('tweetnacl/nacl-fast'); const { fork } = require('child_process'); -const numCPUs = require('os').cpus().length; +const OS = require("os"); +const numCPUs = OS.cpus().length; const now = function () { return (new Date()).getTime(); }; const ONE_DAY = 1000 * 60 * 60 * 24; // one day in milliseconds @@ -62,7 +63,7 @@ const tryParse = function (Env, str) { clients from forking on checkpoints and dropping forked history. */ -const sliceCpIndex = function (cpIndex, line) { +const sliceCpIndex = HK.sliceCpIndex = function (cpIndex, line) { // Remove "old" checkpoints (cp sent before 100 messages ago) const minLine = Math.max(0, (line - 100)); let start = cpIndex.slice(0, -2); @@ -203,108 +204,6 @@ const getMetadata = HK.getMetadata = function (Env, channelName, _cb) { }); }; -/* computeIndex - can call back with an error or a computed index which includes: - * cpIndex: - * array including any checkpoints pushed within the last 100 messages - * processed by 'sliceCpIndex(cpIndex, line)' - * offsetByHash: - * a map containing message offsets by their hash - * this is for every message in history, so it could be very large... - * except we remove offsets from the map if they occur before the oldest relevant checkpoint - * size: in bytes - * metadata: - * validationKey - * expiration time - * owners - * ??? (anything else we might add in the future) - * line - * the number of messages in history - * including the initial metadata line, if it exists - -*/ -const computeIndex = function (Env, channelName, cb) { - const store = Env.store; - const Log = Env.Log; - - const cpIndex = []; - let messageBuf = []; - let i = 0; - - const CB = Util.once(cb); - - const offsetByHash = {}; - let size = 0; - nThen(function (w) { - // iterate over all messages in the channel log - // old channels can contain metadata as the first message of the log - // skip over metadata as that is handled elsewhere - // otherwise index important messages in the log - store.readMessagesBin(channelName, 0, (msgObj, readMore) => { - let msg; - // keep an eye out for the metadata line if you haven't already seen it - // but only check for metadata on the first line - if (!i && msgObj.buff.indexOf('{') === 0) { - i++; // always increment the message counter - msg = tryParse(Env, msgObj.buff.toString('utf8')); - if (typeof msg === "undefined") { return readMore(); } - - // validate that the current line really is metadata before storing it as such - // skip this, as you already have metadata... - if (isMetadataMessage(msg)) { return readMore(); } - } - i++; - if (msgObj.buff.indexOf('cp|') > -1) { - msg = msg || tryParse(Env, msgObj.buff.toString('utf8')); - if (typeof msg === "undefined") { return readMore(); } - // cache the offsets of checkpoints if they can be parsed - if (msg[2] === 'MSG' && msg[4].indexOf('cp|') === 0) { - cpIndex.push({ - offset: msgObj.offset, - line: i - }); - // we only want to store messages since the latest checkpoint - // so clear the buffer every time you see a new one - messageBuf = []; - } - } - // if it's not metadata or a checkpoint then it should be a regular message - // store it in the buffer - messageBuf.push(msgObj); - return readMore(); - }, w((err) => { - if (err && err.code !== 'ENOENT') { - w.abort(); - return void CB(err); - } - - // once indexing is complete you should have a buffer of messages since the latest checkpoint - // map the 'hash' of each message to its byte offset in the log, to be used for reconnecting clients - messageBuf.forEach((msgObj) => { - const msg = tryParse(Env, msgObj.buff.toString('utf8')); - if (typeof msg === "undefined") { return; } - if (msg[0] === 0 && msg[2] === 'MSG' && typeof(msg[4]) === 'string') { - // msgObj.offset is API guaranteed by our storage module - // it should always be a valid positive integer - offsetByHash[getHash(msg[4], Log)] = msgObj.offset; - } - // There is a trailing \n at the end of the file - size = msgObj.offset + msgObj.buff.length + 1; - }); - })); - }).nThen(function () { - // return the computed index - CB(null, { - // Only keep the checkpoints included in the last 100 messages - cpIndex: sliceCpIndex(cpIndex, i), - offsetByHash: offsetByHash, - size: size, - //metadata: metadata, - line: i - }); - }); -}; - /* getIndex calls back with an error if anything goes wrong or with a cached index for a channel if it exists @@ -326,7 +225,7 @@ const getIndex = (Env, channelName, cb) => { } Env.batchIndexReads(channelName, cb, function (done) { - computeIndex(Env, channelName, (err, ret) => { + Env.computeIndex(Env, channelName, (err, ret) => { // this is most likely an unrecoverable filesystem error if (err) { return void done(err); } // cache the computed result if possible @@ -912,17 +811,77 @@ HK.onDirectMessage = function (Env, Server, seq, userId, json) { }); }; -/* onChannelMessage - Determine what we should store when a message a broadcasted to a channel" +HK.initializeIndexWorkers = function (Env, config, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); - * ignores ephemeral channels - * ignores messages sent to expired channels - * rejects duplicated checkpoints - * validates messages to channels that have validation keys - * caches the id of the last saved checkpoint - * adds timestamps to incoming messages - * writes messages to the store -*/ + const workers = []; + + const response = Util.response(); + const initWorker = function (worker, cb) { + //console.log("initializing index worker"); + const txid = Util.uid(); + response.expect(txid, function (err) { + if (err) { return void cb(err); } + //console.log("worker initialized"); + workers.push(worker); + cb(); + }, 15000); + + worker.send({ + txid: txid, + config: config, + }); + + worker.on('message', function (res) { + if (!res || !res.txid) { return; } + //console.log(res); + response.handle(res.txid, [res.error, res.value]); + }); + worker.on('exit', function () { + var idx = workers.indexOf(worker); + if (idx !== -1) { + workers.splice(idx, 1); + } + var w = fork('lib/compute-index'); + initWorker(w, function (err) { + if (err) { + throw new Error(err); + } + workers.push(w); + }); + }); + }; + + var workerIndex = 0; + var sendCommand = function (Env, channel, cb) { + workerIndex = (workerIndex + 1) % workers.length; + if (workers.length === 0 || + typeof(workers[workerIndex].send) !== 'function') { + return void cb("NO_WORKERS"); + } + Env.store.getWeakLock(channel, function (next) { + const txid = Util.uid(); + response.expect(txid, Util.both(next, cb), 45000); + workers[workerIndex].send({ + txid: txid, + args: channel, + }); + }); + }; + + nThen(function (w) { + OS.cpus().forEach(function () { + initWorker(fork('lib/compute-index'), w(function (err) { + if (!err) { return; } + w.abort(); + return void cb(err); + })); + }); + }).nThen(function () { + //console.log("index workers ready"); + cb(void 0, sendCommand); + }); +}; HK.initializeValidationWorkers = function (Env) { if (typeof(Env.validateMessage) !== 'undefined') { @@ -983,6 +942,17 @@ HK.initializeValidationWorkers = function (Env) { }; }; +/* onChannelMessage + Determine what we should store when a message a broadcasted to a channel" + + * ignores ephemeral channels + * ignores messages sent to expired channels + * rejects duplicated checkpoints + * validates messages to channels that have validation keys + * caches the id of the last saved checkpoint + * adds timestamps to incoming messages + * writes messages to the store +*/ HK.onChannelMessage = function (Env, Server, channel, msgStruct) { //console.log(+new Date(), "onChannelMessage"); const Log = Env.Log; diff --git a/lib/storage/file.js b/lib/storage/file.js index 68ae2e8db..25ff021f0 100644 --- a/lib/storage/file.js +++ b/lib/storage/file.js @@ -984,16 +984,17 @@ module.exports.create = function (conf, cb) { // make sure the store's directory exists Fse.mkdirp(env.root, PERMISSIVE, w(function (err) { if (err && err.code !== 'EEXIST') { - throw err; + throw err; // XXX } })); // make sure the cold storage directory exists Fse.mkdirp(env.archiveRoot, PERMISSIVE, w(function (err) { if (err && err.code !== 'EEXIST') { - throw err; + throw err; // XXX } })); }).nThen(function () { + // XXX leave a place for an error cb({ // OLDER METHODS // write a new message to a log @@ -1038,6 +1039,12 @@ module.exports.create = function (conf, cb) { }); }, + getWeakLock: function (channelName, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); + if (!isValidChannelId(channelName)) { return void cb(new Error('EINVAL')); } + schedule.unordered(channelName, cb); + }, + // METHODS for deleting data // remove a channel and its associated metadata log if present removeChannel: function (channelName, cb) { diff --git a/www/common/translations/messages.es.json b/www/common/translations/messages.es.json index 046291dc3..ac040aca1 100644 --- a/www/common/translations/messages.es.json +++ b/www/common/translations/messages.es.json @@ -12,12 +12,12 @@ "todo": "Lista de tareas", "file": "Archivo", "media": "Media", - "sheet": "Hoja (Beta)", + "sheet": "Hoja de Cálculo", "teams": "Equipos" }, "disconnected": "Desconectado", "synchronizing": "Sincronizando", - "reconnecting": "Reconectando...", + "reconnecting": "Reconectando", "lag": "Retraso", "readonly": "Sólo lectura", "anonymous": "Anónimo", @@ -205,7 +205,7 @@ "settings_resetTips": "Consejos en CryptDrive", "settings_resetTipsButton": "Restaurar consejos", "settings_resetTipsDone": "Todos los consejos ahora están visibles", - "main_info": "

Colabora con Confianza


Cultiva ideas juntos con documentos compartidos con tecnología Zero Knowledge que protege tu privacidad.", + "main_info": "

Colabora con Confianza

Cultiva ideas juntos con documentos compartidos con tecnología Zero Knowledge que protege tu privacidad.", "footer_applications": "Aplicaciones", "footer_contact": "Contacto", "footer_aboutUs": "Acerca de nosotros", @@ -281,7 +281,7 @@ "register_alreadyRegistered": "Este usuario ya existe, ¿iniciar sesión?", "button_newwhiteboard": "Nueva Pizarra", "wrongApp": "No se pudo mostrar el contenido de la sesión en tiempo real en tu navegador. Por favor, actualiza la página.", - "synced": "Todo está guardado.", + "synced": "Todo está guardado", "saveTemplateButton": "Guardar como plantilla", "saveTemplatePrompt": "Elige un título para la plantilla", "templateSaved": "¡Plantilla guardada!", @@ -308,7 +308,7 @@ "history_restorePrompt": "¿Estás seguro de que quieres cambiar la versión actual del documento por ésta?", "history_restoreDone": "Documento restaurado", "fc_sizeInKilobytes": "Tamaño en Kilobytes", - "deleted": "El pad fue borrado de tu CryptDrive", + "deleted": "Borrado", "upgrade": "Mejorar", "upgradeTitle": "Mejora tu cuenta para obtener más espacio", "upgradeAccount": "Mejorar cuenta", @@ -322,8 +322,8 @@ "pinLimitNotPinned": "Has llegado al límite de espacio.
Este pad no estará presente en tu CryptDrive.", "pinLimitDrive": "Has llegado al límite de espacio.
No puedes crear nuevos pads.", "printTransition": "Activar transiciones", - "history_version": "Versión: ", - "settings_logoutEverywhereTitle": "Cerrar sesión en todas partes", + "history_version": "Versión:", + "settings_logoutEverywhereTitle": "Cerrar sesiones remotas", "settings_logoutEverywhere": "Cerrar todas las otras sesiones", "settings_logoutEverywhereConfirm": "¿Estás seguro? Tendrás que volver a iniciar sesión con todos tus dispositivos.", "upload_serverError": "Error: no se pudo subir tu archivo en este momento.", @@ -337,7 +337,7 @@ "fm_alert_anonymous": "Hola, estás usando CryptPad anónimamente. Está bien, pero tus pads pueden ser borrados después de un périodo de inactividad. Hemos desactivado funciones avanzadas de CryptDrive para usuarios anónimos porque queremos dejar claro que no es un lugar seguro para almacenar cosas. Puedes leer este articulo (en inglés) acerca de por qué hacemos esto y por qué deberías Registrarte e Iniciar sesión.", "fm_error_cantPin": "Error del servidor. Por favor, recarga la página e inténtalo de nuevo.", "upload_notEnoughSpace": "No tienes suficiente espacio para este archivo en tu CryptDrive", - "upload_tooLarge": "Este archivo supera el límite de carga.", + "upload_tooLarge": "Este archivo supera el límite de carga permitido por tu cuenta.", "upload_choose": "Escoge un archivo", "upload_pending": "Esperando", "upload_cancelled": "Cancelado", @@ -392,7 +392,7 @@ "realtime_unrecoverableError": "El motor de tiempo real ha encontrado un error. Haga clic en OK para recargar la página.", "typing": "Editando", "profile_viewMyProfile": "Ver mi perfil", - "userlist_addAsFriendTitle": "Enviar \"{0}\" una solicitud de amistad", + "userlist_addAsFriendTitle": "Enviar \"{0}\" una solicitud de contacto", "contacts_title": "Contactos", "contacts_addError": "Error al agregar este contacto a la lista", "contacts_added": "Invitación aceptada", @@ -441,14 +441,14 @@ "main_catch_phrase": "El Cloud Zero Knowledge", "button_newkanban": "Nuevo Kanban", "button_newsheet": "Nueva Hoja", - "padNotPinned": "Esta nota expirará luego de 3 meses de inactividad, {0}ingresar{1} o {2}registrarse{3}para conservar", + "padNotPinned": "Esta nota expirará luego de 3 meses de inactividad, {0}ingresar{1} o {2}registrarse{3}para conservar.", "anonymousStoreDisabled": "El webmaster de esta instancia de CryptPad a deshabilitado al almacenamiento para usuarios anónimos. Debes ingresar para poder usar CrytDrive.", - "expiredError": "Este pad ha expirado y ya no está disponible", + "expiredError": "Este pad ha expirado y ya no está disponible.", "deletedError": "Esta nota ha sido borrada por su dueño y ya no está disponible.", "inactiveError": "Esta nota ha sido eliminada por inactividad. Presione Esc para crear una nueva nota.", "chainpadError": "Ha ocurrido un error crítico al actualizar su contenido. Esta página esta en modo de sólo lectura, para asegurarse que no perderá su trabajo.
HitEscpara continuar y ver esta nota, o recargar para editar nuevamente.", "invalidHashError": "El documento que has solicitado tiene una URL invalida.", - "errorCopy": " Aún puedes copiar el contenido a otra ubicación apretando Esc.
Una vez que dejes esta página desaparecerá para siempre!", + "errorCopy": " Aún puedes acceder al contenido presionando Esc.
Una vez que cierres esta ventana no te será posible acceder a ella nuevamente.", "errorRedirectToHome": "PresionaEscpara 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 offline.", "deletedFromServer": "Nota borrada desde el servidor", @@ -472,7 +472,7 @@ "printBackgroundRemove": "Eliminar este fondo de pantalla", "tags_title": "Etiquetas (sólo para tí)", "tags_add": "Actualizar las etiquetas de esta página", - "tags_searchHint": "Comenzar una búsqueda con # en tú CryptDrive para encontrar las notas etiquetadas", + "tags_searchHint": "Comenzar una búsqueda con # en tú CryptDrive para encontrar las notas etiquetadas.", "tags_notShared": "Tus etiquetas no están compartidas con otros usuarios", "tags_duplicate": "Duplicar etiquetas:{0}", "tags_noentry": "No puedes etiquetar una nota eliminada!", @@ -504,7 +504,7 @@ "viewEmbedTag": "Para insertar esta nota, incluya este iframe en su página donde usted quiera. Puede darle estilo usando CSS o atributos HTML.", "fileEmbedTitle": "Insertar el archivo en una pagina externa", "fileEmbedScript": "Para insertar este archivo, incluya este código una vez en su página para cargar el Etiqueta de Media:", - "fileEmbedTag": "Luego ponga esta Etiqueta de Media donde quiera que sea incorporada en su página: ", + "fileEmbedTag": "Luego ponga esta Etiqueta de Media donde quiera que sea incorporada en su página:", "pad_mediatagTitle": "Opciones de Etiquetas de Media", "poll_bookmark_col": "Agregue esta columna a sus marcadores así estará siempre desbloqueada y se le mostrará al comienzo", "poll_bookmarked_col": "Esta es su columna de bookmarks. Siempre será desbloqueada y mostrada al comienzo para usted.", @@ -524,7 +524,7 @@ "contacts_warning": "Todo lo que escribas acá es persistente y estará disponible para todo los usuarios de esta nota. Sea precavido con la información sensible e importante!", "contacts_padTitle": "Chat", "contacts_fetchHistory": "Recuperar la historial antigua", - "contacts_friends": "Amigos", + "contacts_friends": "Contactos", "contacts_rooms": "Sala de chat", "contacts_leaveRoom": "Deja esta sala", "contacts_online": "Otro usuario de esta sala está online", @@ -539,7 +539,7 @@ "fm_removePermanentlyNote": "Sus notas serán removidas del servidor si continua.", "fm_deleteOwnedPad": "Está seguro que quiere remover esta nota del servidor de manera permanente?", "fm_deleteOwnedPads": "Está seguro que quiere remover estas notas del servidor de manera permanente?", - "fm_info_recent": "Lista de notas recientemente abiertas o modificadas.", + "fm_info_recent": "Estas notas han sido abiertas o modificadas recientemente por ti o por tus colaboradores.", "fm_info_sharedFolder": "Esta es una carpeta compartida. Usted no ha ingresado a su cuenta por lo que solo tiene acceso en modo solo lectura.
ingresar o ingresar para poder importarla a su Cryptdrive y modificarla.", "fm_info_owned": "Usted es el dueño de las notas que se presentan. Esto significa que puede removerlas de manera permanente del servidor cuando lo desee. Si lo hace, los otros usuarios no podrán acceder a ellas nunca más.", "fm_renamedPad": "Ha definido un nombre personalizado para esta nota. El título que se comparte es: br>{0}", @@ -554,7 +554,7 @@ "fm_tags_used": "Número de usos", "fm_restoreDrive": "Su drive se está reseteando a un estado anterior. Para mejores resultados evite hacer cambios a su drive hasta que el proceso se haya completado.", "fm_moveNestedSF": "No puedes poner una carpeta compartida dentro de otra. La carpeta {0} no se movió.", - "fm_passwordProtected": "Este documento está protegido por una contraseña", + "fm_passwordProtected": "Protegido por una contraseña", "fc_newsharedfolder": "Nueva carpeta compartida", "fc_delete_owned": "Eliminar desde el servidor", "fc_remove_sharedfolder": "Eliminar", @@ -613,8 +613,8 @@ "settings_padSpellcheckTitle": "Corrector ortográfico", "settings_creationSkipTrue": "Omitir", "settings_creationSkipFalse": "Monitor", - "settings_ownDriveTitle": "Habilitar las últimas características de la cuenta", - "settings_ownDriveHint": "Por razones técnicas, las cuentas más antiguas no tienen acceso a todas nuestras funciones más recientes. Una actualización gratuita a una nueva cuenta preparará su CryptDrive para las próximas funciones sin interrumpir sus actividades habituales.", + "settings_ownDriveTitle": "Actualizar Cuenta", + "settings_ownDriveHint": "Las cuentas más antiguas no tienen acceso a las funcionalidades más recientes. Una actualización gratuita habilitará las funcionalidades actuales y prepará su CryptDrive para las próximas actualizaciones.", "settings_ownDriveButton": "Actualiza tu cuenta", "padNotPinnedVariable": "Este pad caducará después de {4} días de inactividad, {0} inicie sesión {1} o {2} registre {3} para preservarlo.", "register_emailWarning0": "Parece que envió su correo electrónico como su nombre de usuario.", @@ -729,7 +729,7 @@ "features_f_social": "Aplicaciones sociales", "features_f_social_note": "Crear un perfil, usar un avatar, hablar con contactos", "features_f_file1": "Subir y compartir archivos", - "features_f_file1_note": "Compartir archivos con tus amigos o incrustarlo en tus Pads", + "features_f_file1_note": "Compartir archivos con tus contactos o incrustarlo en tus notas", "features_f_storage1": "Almacenamiento permanente (50 MB)", "features_f_storage1_note": "Los Pads almacenados en su CryptDrive nunca se eliminan por inactividad", "features_f_register": "Registrate gratis", @@ -821,8 +821,8 @@ "a": "CryptPad se basa en dos bibliotecas de criptografía de código abierto: tweetnacl.js y scrypt-async.js .

Scrypt es un algoritmo de derivación de clave basado en contraseña < / em>. Lo usamos para convertir su nombre de usuario y contraseña en un llavero único que asegura el acceso a su CryptDrive de modo que solo usted pueda acceder a su lista de almohadillas.

Utilizamos xsalsa20-poly1305 y x25519-xsalsa20-poly1305 cifrados proporcionados por tweetnacl para cifrar los pads y el historial de chat, respectivamente." }, "pad_password": { - "q": "¿Qué sucede cuando protejo un pad/carpeta con una contraseña?", - "a": "Puede proteger cualquier bloc o carpeta compartida con una contraseña al crearla. También puede utilizar el menú de propiedades para establecer/cambiar/eliminar una contraseña en cualquier momento.

Las contraseñas del pad y de la carpeta compartida están pensadas para proteger el enlace cuando lo comparta a través de canales potencialmente inseguros como el correo electrónico o los mensajes de texto. Si alguien intercepta su enlace pero no tiene la contraseña, no podrá leer su documento.

Al compartir dentro de CryptPad con sus contactos o equipos, las comunicaciones se cifran y suponemos que desea que accedan a su documento. Por lo tanto, la contraseña se recuerda y se envía con el pad cuando lo comparte. Al destinatario, o a usted mismo, se le pide not cuando abre el documento." + "q": "¿Qué pasa cuando protejo un Pad o carpeta con contraseña?", + "a": "Puedes proteger cualquier Pad o carpeta compartida con contraseña al crearlo. También puedes usar el menú de propiedades para establecer, cambiar o eliminar una contraseña en cualquier momento.

Las contraseñas de Pads y carpetas compartidas están pensadas para proteger el enlace cuando lo compartas por canales potencialmente inseguros, como un correo electrónico o un mensaje de texto. Si alguien intercepta el enlace pero no conoce la contraseña, no podrá leer el documento.

Al compartir en CryptPad con tus contactos o equipos, las comunicaciones se cifran y se asume que quieres que accedan al documento. Por tanto, la contraseña se guarda y se envía con el Pad. No se le pregunta ni al recipiente ni a ti mismo/a al abrirlo." } }, "usability": { @@ -832,7 +832,7 @@ "a": "Los usuarios registrados tienen acceso a una serie de funciones que no están disponibles para usuarios no registrados. Hay un gráfico aquí ." }, "share": { - "q": "¿Cómo puedo compartir pads cifrados con mis amigos?", + "q": "¿Cómo puedo compartir mis notas cifradas con mis contactos?", "a": "CryptPad coloca la clave de cifrado secreta en su teclado después del carácter # en la URL. Cualquier cosa después de este carácter no se envía al servidor, por lo que nunca tenemos acceso a sus claves de cifrado. Al compartir el enlace a un bloc, comparte la capacidad de leerlo y acceder a él." }, "remove": { @@ -913,7 +913,7 @@ "markdown": "Escriba diapositivas en Reducción y sepárelas con una línea que contenga --- ", "present": "Comenzar la presentación usando el botón", "colors": "Cambia el texto y el color de fondo usando el y botones", - "settings": "Cambiar los ajustes de las diapositivas (fondo, transiciones, números de página, etc.) con el botón en el submenú " + "settings": "Configura las diapositivas (fondo, transiciones, números de página, etc.) con el botón en el submenú " }, "poll": { "decisions": "Crea decisiones en privado entre verdaderos amigos", @@ -932,9 +932,9 @@ "color": "Cambie los colores haciendo clic en la parte coloreada junto a los títulos de los tableros" } }, - "storageStatus": "Almacenamiento:
{0} utilizado de {1}", - "settings_cursorColorTitle": "Color del cursor", - "mdToolbar_button": "Mostrar u ocultar la barra de herramientas de rebajas", + "storageStatus": "Almacenamiento:
{0} usado de {1}", + "settings_cursorColorTitle": "Color de puntero", + "mdToolbar_button": "Mostrar u ocultar la barra de herramientas de Markdown", "creation_404": "Esta almohadilla ya no existe. Utilice el siguiente formulario para crear un nuevo pad.", "creation_ownedTitle": "Tipo de pad", "creation_owned1": "Un pad propio puede ser eliminado del servidor cuando el propietario lo desee. Al eliminar un pad propio se elimina de los CryptDrives de otros usuarios.", diff --git a/www/common/translations/messages.it.json b/www/common/translations/messages.it.json index bb38a3dbe..d022c91b5 100644 --- a/www/common/translations/messages.it.json +++ b/www/common/translations/messages.it.json @@ -422,7 +422,7 @@ "register_mustRememberPass": "Non possiamo ripristinare la tua password se la dimentichi. È estremamente importante che tu la ricordi! Per favore, spunta la checkbox per confermare.", "register_whyRegister": "Perché registrarsi?", "register_header": "Benvenuto su CryptPad", - "fm_alert_anonymous": "", + "fm_alert_anonymous": "Buongiorno! Stai attualmente utilizzando CryptPad in modalità anonima, non presenta problemi ma i tuoi pad potrebbero essere cancellati dopo un periodo di inattività. Abbiamo disabilitato alcune funzioni avanzate di CryptDrive per gli utenti anonimi, per chiarire che non è un luogo sicuro per la conservazione di documenti. Puoi leggere di più sul perchè lo stiamo facendo e perchè dovresti veramente registrarti e connetterti.", "register_writtenPassword": "Ho annotato il mio nome utente e la mia password, procedi", "register_cancel": "Torna indietro", "register_warning": "Zero Knowledge significa che non possiamo recuperare i tuoi dati se perdi la tua password.", @@ -460,19 +460,19 @@ "settings_resetNewTitle": "Pulisci CryptDrive", "settings_resetButton": "Rimuovi", "settings_reset": "Rimuovi tutti i file e le cartelle dal tuo CryptDrive", - "settings_resetPrompt": "", + "settings_resetPrompt": "Questa azione eliminerà tutti i pad del tuo drive.
Sei sicuro di vole continuare?
Digita “I love CryptPad” per confermare.", "settings_resetDone": "Il tuo drive è vuoto adesso!", - "settings_resetError": "", - "settings_resetTipsAction": "", - "settings_resetTips": "", - "settings_resetTipsButton": "", - "settings_resetTipsDone": "", - "settings_thumbnails": "", - "settings_disableThumbnailsAction": "", - "settings_disableThumbnailsDescription": "", - "settings_resetThumbnailsAction": "", - "settings_resetThumbnailsDescription": "", - "settings_resetThumbnailsDone": "", + "settings_resetError": "Testo di verifica errato. Il tuo CryptDrive non è stato modificato.", + "settings_resetTipsAction": "Ripristinare", + "settings_resetTips": "Suggerimenti", + "settings_resetTipsButton": "Ripristinare i suggerimenti disponibili in CryptDrive", + "settings_resetTipsDone": "Ora tutti i suggerimenti sono di nuovo visibili.", + "settings_thumbnails": "Miniature", + "settings_disableThumbnailsAction": "Disattivare la creazione di miniature nel tuo CryptDrive", + "settings_disableThumbnailsDescription": "Le miniature sono create automaticamente e conservate nel tuo browser. Puoi disattivare questa funzione qui.", + "settings_resetThumbnailsAction": "Pulire", + "settings_resetThumbnailsDescription": "Pulire tutte le miniature conservate nel browser.", + "settings_resetThumbnailsDone": "Tutte le miniature sono state cancellate.", "settings_import": "Importa", "settings_importConfirm": "Sei sicuro di voler importare i tuoi pads recenti dal browser sul tuo account CryptDrive?", "settings_autostoreMaybe": "Manuale (chiedi sempre)", @@ -520,23 +520,403 @@ "faq": { "usability": { "devices": { - "a": "nome utente" + "a": "È probabile che tu abbia registrato lo stesso nome due volte, usando password diverse. Poiché il server di CryptPad ti identifica usando la tua firma crittografica e non il tuo nome, non può impedire ad altre persone di registrarsi con lo stesso nome. Questo significa che ogni account ha una combinazione univoca di nome utente e password. Gli/le utenti registrati/e possono vedere il loro nome utente nella parte superiore della pagina delle impostazioni." }, "forget": { - "a": "nome utente" - } + "a": "Purtroppo, se fossimo in grado di aiutarti a recuperare l'accesso ai tuoi pad criptati, saremmo noi stessi/e in grado di accedere ai tuoi pad. Se non hai salvato il tuo nome utente e password da nessuna parte e non resci a ricordarli, potresti essere in grado di recuperare i tuoi pad controllando la cronologia del browser.", + "q": "Cosa succede se dimentico la mia password?" + }, + "change": { + "a": "Puoi modificare la tua password di CryptPad nella tua pagina di impostazioni dell'account.", + "q": "E se voglio modificare la mia password?" + }, + "register": { + "q": "Cosa ottengo registrandomi?" + }, + "title": "Usabilità" }, "security": { "crypto": { - "a": "nome utente" - } + "a": "nome utente", + "q": "Quale crittografia utilizzate?" + }, + "pad_password": { + "q": "Coda succede quando proteggo un pad/cartella con una password?" + }, + "compromised": { + "q": "CryptPad mi protegge se il mio dispositivo è compromesso?" + }, + "why": { + "q": "Perché dovrei usare CryptPad?" + }, + "title": "Sicurezza" }, "privacy": { "register": { "a": "nome utente" - } + }, + "policy": { + "a": "Sì! È disponibile qui." + }, + "title": "Privacy" + }, + "other": { + "jobs": { + "a": "Sì! Candidati inviando un'email a jobs@xwiki.com.", + "q": "Assumete?" + }, + "goal": { + "q": "Qual è il vostro obiettivo?" + }, + "pay": { + "q": "Perché dovrei pagare quando così tante funzionalità sono gratuite?" + }, + "title": "Altre domande" + }, + "keywords": { + "tag": { + "q": "Come utilizzo i tag?" + }, + "pad": { + "q": "Cos'è un pad?", + "a": "Pad è un termine popolare per Etherpad, un editor collaborativo in tempo reale.\nSi riferisce ad un documento che puoi modificare nel tuo browser, generalmente con le modifiche di altri utenti visibili in modo quasi istantaneo." + }, + "expiring": { + "q": "Cos'è un pad effimero?" + }, + "owned": { + "a": "Un pad di proprietà è un pad creato da un esplicito proprietario, identificato dal server dalla sua chiave di crittografia pubblica. Il proprietario di un pad può scegliere di cancellare i suoi pad dal server, rendendoli invalidi per gli altri collaboratori nel futuro, sia che essi li avessero oppure no nei loro Cryptdrive.", + "q": "Cos'è un Pad di proprietà?" + }, + "title": "Parole chiave" } }, - "whatis_zeroknowledge_p2": "Quando ti registri e accedi, il tuo nome utente e la tua password vengono computati in una chiave segreta utilizzando la funzione di derivazione scrypt. Ne questa chiave, ne il tuo nome utente o la tua password vengono inviati al server. Infatti sono usati soltanto dal lato client per decriptare il contenuto del tuo CryptDrive, che contiene le chiavi per tutti i pad a cui hai accesso.", - "faq_title": "Domande frequenti" + "whatis_zeroknowledge_p2": "Quando ti registri e accedi, il tuo nome utente e la tua password vengono computati in una chiave segreta utilizzando la funzione di derivazione scrypt. Né questa chiave, né il tuo nome utente o la tua password vengono inviati al server. Infatti sono usati soltanto dal lato client per decriptare il contenuto del tuo CryptDrive, che contiene le chiavi per tutti i pad a cui hai accesso.", + "faq_title": "Domande frequenti", + "whatis_business": "CryptPad per le aziende", + "whatis_drive_p2": "Con l'intuitiva funziona \"trascina e rilascia\" puoi spostare i tuoi pad all'interno del tuo CryptDrive e il collegamento a questi ultimi rimarrà lo stesso, in modo che le persone con le quali collabori non perdano mai l'accesso.", + "policy_howweuse": "Come usiamo i dati che raccogliamo", + "policy_whatweknow": "Cosa sappiamo di te", + "policy_title": "Informativa sulla privacy di CryptPad", + "policy_howweuse_p1": "Utilizziamo queste informazioni per migliorare le nostre decisioni in merito a come meglio pubblicizzare CryptPad, valutando quali dei nostri sforzi passati hanno avuto maggiore successo. Le informazioni sulla tua posizione ci permettono di sapere se dovremmo prendere in considerazione la possibilità di fornire un migliore supporto per lingue diverse dall'inglese.", + "policy_ads_p1": "Non mostriamo alcuna pubblicità online, anche se potremmo inserire collegamenti agli enti che finanziano la nostra ricerca.", + "policy_ads": "Pubblicità", + "policy_links_p1": "Questo sito contiene collegamenti ad altri siti, compresi quelli prodotti da altre organizzazioni. Non siamo responsabili delle pratiche relative alla privacy o dei contenuti di siti esterni. Come regola generale, i collegamenti a siti esterni vengono aperti in una nuova finestra del browser, per chiarire che si sta lasciando CryptPad.fr.", + "policy_links": "Collegamenti ad altri siti", + "policy_whatwetell_p1": "Non forniamo a terzi le informazioni che raccogliamo o che ci fornite, a meno che non siamo legalmente obbligati a farlo.", + "policy_whatwetell": "Cosa comunichiamo a terzi riguardo a te", + "policy_howweuse_p2": "Le informazioni relative al tuo browser (sia che si tratti di un sistema operativo desktop che di uno mobile) ci aiutano a prendere decisioni quando si tratta di dare priorità ai miglioramenti delle funzionalità. Il nostro gruppo di sviluppo è piccolo e cerchiamo di fare scelte che migliorino l'esperienza del maggior numero di utenti possibile.", + "faq_whatis": "Cos'è CryptPad?", + "faq_link": "FAQ", + "features_f_support": "Supporto più rapido", + "features_f_register": "Registrati gratuitamente", + "features_f_file1_note": "Condividi file con i tuoi contatti o incorporali nei tuoi pad", + "features_f_file1": "Carica e condividi file", + "features_f_social": "Applicazioni social", + "features_notes": "Note", + "features_premium": "Utente premium", + "features_registered": "Utente registrato", + "features_anon": "Utente anonimo", + "whatis_title": "Cos'è CryptPad", + "topbar_whatIsCryptpad": "Cos'è CryptPad", + "blog": "Blog", + "contact": "Contatti", + "privacy": "Privacy", + "about": "Info", + "footer_aboutUs": "Chi siamo", + "footer_contact": "Contatti", + "footer_applications": "Applicazioni", + "home_host_agpl": "CryptPad è distribuito nei termini della licenza software AGPL3", + "mdToolbar_toc": "Indice", + "mdToolbar_list": "Elenco puntato", + "mdToolbar_nlist": "Elenco ordinato", + "mdToolbar_quote": "Citazione", + "mdToolbar_link": "Link", + "mdToolbar_italic": "Corsivo", + "mdToolbar_bold": "Grassetto", + "mdToolbar_tutorial": "http://www.markdowntutorial.com/", + "mdToolbar_help": "Aiuto", + "pad_hideToolbar": "Nascondi barra degli strumenti", + "pad_showToolbar": "Mostra barra degli strumenti", + "download_step1": "Scaricamento in corso", + "download_dl": "Scarica", + "download_resourceNotAvailable": "La risorsa richiesta non è disponibile... Premi Esc per continuare.", + "download_mt_button": "Scarica", + "upload_progress": "Avanzamento", + "upload_size": "Dimensione", + "upload_name": "Nome del file", + "upload_pending": "In attesa", + "upload_choose": "Scegli un file", + "upload_tooLargeBrief": "File troppo grande", + "upload_notEnoughSpaceBrief": "Spazio insufficiente", + "upload_uploadPending": "Stai già effettuando un caricamento. Vuoi annullarlo e caricare il tuo nuovo file?", + "upload_modal_title": "Opzioni di caricamento file", + "upload_type": "Tipo", + "upload_title": "Caricamento file", + "settings_cursorShowLabel": "Mostra i cursori", + "settings_cursorShowTitle": "Mostra la posizione del cursore degli altri utenti", + "settings_cursorShareLabel": "Condividi la posizione", + "settings_cursorShareTitle": "Condividi la posizione del mio cursore", + "settings_cursorColorTitle": "Colore del cursore", + "settings_changePasswordNewPasswordSameAsOld": "La tua nuova password deve essere diversa dalla tua password attuale.", + "settings_changePasswordNewConfirm": "Conferma la nuova password", + "settings_changePasswordNew": "Nuova password", + "settings_changePasswordCurrent": "Password attuale", + "settings_changePasswordButton": "Modifica password", + "settings_changePasswordTitle": "Modifica la tua password", + "settings_ownDriveButton": "Aggiorna il tuo account", + "settings_ownDriveTitle": "Aggiorna account", + "settings_creationSkipTrue": "Salta", + "settings_driveDuplicateLabel": "Nascondi i duplicati", + "settings_logoutEverywhereTitle": "Chiudi le sessioni remote", + "settings_logoutEverywhereButton": "Uscire", + "settings_importDone": "Importazione completata", + "register_explanation": "

Puntualizziamo un paio di cose:

", + "features_f_subscribe_note": "Devi prima accedere a CryptPad", + "features_f_subscribe": "Abbonarsi a Premium", + "features_f_supporter_note": "Aiutarci a dimostrare che i software che proteggono la privacy devono essere la norma", + "features_f_supporter": "Diventare un supporter della privacy", + "features_f_support_note": "Supporto email professionale con il piano Team", + "features_f_storage2_note": "Da 5GB a 50GB in funzione del piano selezionato", + "features_f_storage2": "Spazio d'archivio supplementare", + "features_f_reg_note": "Ed aiutare lo sviluppo di CryptPad", + "features_f_reg": "Tutte le funzioni degli utenti registrati", + "features_f_register_note": "Nessuna mail o informazione personale richieste", + "features_f_storage1_note": "I pads archiviati nel tuo CryptDrive non saranno mai eliminati per inattività", + "features_f_storage1": "Archivio permanente (50MB)", + "features_f_social_note": "Crea un profilo, usa un avatar, chatta con i contatti", + "features_f_devices_note": "Accesso a CryptDrive dovunque con il tuo account utente", + "features_f_devices": "I tuoi pads su tutti i tuoi apparecchi", + "features_f_cryptdrive1_note": "Dossier, dossier condivisi, modelli, tags", + "features_f_cryptdrive1": "Completa funzionalità di CryptDrive", + "features_f_anon_note": "Con migliore ergonomia e più controllo sui tuoi pads", + "features_f_anon": "Tutte le funzioni degli utenti anonimi", + "features_f_storage0_note": "I pads creati rischiano la cancellazione dopo 3 mesi di inattività", + "features_f_storage0": "Tempo di conservazione limitato", + "features_f_cryptdrive0_note": "Conservazione nel browser dei pad visitati per ritrovarli più tardi", + "features_f_cryptdrive0": "Accesso limitato a CryptDrive", + "features_f_file0_note": "Guarda e scarica files condivisi da altri utenti", + "features_f_core_note": "Modifica, Importa & Esporta, Storia, Lista utenti, Chat", + "features_title": "Confronto delle funzioni", + "policy_choices_ads": "Se vuoi solamente bloccare la nostra piattaforma analitica puoi utilizzare uno strumento che blocca la pubblicità come Privacy Badger.", + "policy_choices_vpn": "Se vuoi utilizzare la nostra istanza ma non vuoi esporre il tuo indirizzo IP puoi proteggerlo usando il browser Tor, oppure un VPN.", + "policy_whatweknow_p2": "Utilizziamo Kibana, una piattaforma analitica open source, per conoscere meglio i nostri utenti. Kibana ci dice come hai trovato CryptPad, entrando direttamente, attraverso un motore di ricerca, o provenendo da un altro sito web come Reddit o Twitter.", + "policy_whatweknow_p1": "Come applicazione ospitata sul web, CryptPad ha accesso a metadata esposti dal protocollo HTTP. Questo include il tuo indirizzo IP e altre intestazioni HTTP che possono essere usati per identificare il tuo browser. Puoi vedere quali informazioni condivide il tuo browser visitandoWhatIsMyBrowser.com.", + "whatis_business_p2": "Si può installare CryptPad in sede e gli sviluppatori CryptPad di XWiki SAS possono offrire supporto commerciale, personalizzazione e sviluppo. Contattaci su sales@cryptpad.fr per maggiori informazioni.", + "whatis_business_p1": "La crittografia Zero Knowledge di CryptPad moltiplica l'efficacia dei protocolli di sicurezza esistenti ricreandoli in maniera crittografica. Dato che i dati sensibili possono essere decrittati solo utilizzando le credenziali di accesso dell'utente, CryptPad è meno hackerabile dei servizi cloud tradizionali. Consulta il CryptPad Whitepaper per sapere come questo possa aiutare la tua impresa.", + "whatis_drive_p1": "Quando accedi a un pad in CryptPad il pad è automaticamente aggiunto al tuo CryptoDrive nel dossier principale. In seguito potrai organizzare questi pad in dossier o cestinarli. CryptPad ti permette di fare una ricerca tra i tuoi pad e organizzarli quando e come vuoi.", + "whatis_zeroknowledge": "Zero Knowledge", + "whatis_zeroknowledge_p3": "Quando condividi il link di un documento, stai condividendo la chiave crittografica per accedere a quel documento, ma dato che la chiave è nelidentificatore di frammenti, non è mai inviata direttamente al server. Consulta il nostro post nel bloig privacy per capire a quali tipi di metadata abbiamo accesso ed a quali no.", + "features_f_core": "Funzioni comuni delle applicazioni", + "features_f_apps": "Accesso alle applicazioni principali", + "features_feature": "Funzione", + "features": "Funzioni", + "policy_choices": "Le tue scelte", + "whatis_drive": "Organizzazione con CryptDrive", + "whatis_zeroknowledge_p1": "Non vogliamo sapere cosa stai scrivendo e, grazie alla moderna crittografia, puoi essere certo che non possiamo farlo. CryptPad utilizza crittografia 100% lato clientper proteggere il contenuto che stai scrivendo da noi, che ospitiamo il server.", + "whatis_collaboration_p3": "Puoi creare dei documenti di testo con CKEditor così come documenti Markdown in tempo reale mentre scrivi. Puoi anche usare l'applicazione di sondaggio per pianificare eventi con più partecipanti.", + "whatis_collaboration_p2": "Puoi condividere l'accesso ad un documento CryptPad semplicemente condividendo il link. Puoi anche condividere un link che fornisce un accesso di sola lettura al pad, permettendoti di pubblicare i tuoi lavori collaborativi potendo ancora modificarli.", + "whatis_collaboration_p1": "Con CryptPad, puoi creare velocemente documenti collaborativi per prendere appunti e scrivere idee insieme. Quando ti registri e ti connetti ottieni la possibilità di importare files in un CryptDrive dove puoi organizzare tutti i tuoi pads. Come utente registrato hai 50 MB di spazio gratuito.", + "whatis_collaboration": "Collaborazione veloce, facile", + "terms": "Condizioni", + "main_footerText": "Con CryptPad, puoi creare velocemente documenti collaborativi per prendere appunti e scrivere idee insieme.", + "main_catch_phrase": "Il Cloud Zero Knowledge", + "main_info": "

Collabora con fiducia

Fai crescere le tue idee in gruppo tramite documenti condivisi mentre la tecnologia Zero Knowledge assicura la tua privacy; anche da noi.", + "about_contributors": "Collaboratori chiave", + "about_core": "Sviluppatori principali", + "about_intro": "CryptPad è creato all'interno del Gruppo di Ricerca presso XWiki SAS, una piccola azienda situata a Parigi, Francia e a Iasi, Romania. Ci sono 3 sviluppatori principali che lavorano su CryptPad più alcuni collaboratori sia interni che esterni a XWiki SAS.", + "home_ngi": "Vincitore del NGI Award", + "home_product": "CryptPad è un'alternativa ai comuni strumenti office e cloud rispettosa della privacy. Tutti i contenuti immagazzinati in CryptPad sono crittografati prima di essere spediti, ciò significa che nessuno può accedere ai tuoi dati a meno che tu non gli dia la chiave (nemmeno noi).", + "mdToolbar_check": "Lista dei compiti", + "mdToolbar_heading": "Titolo", + "mdToolbar_strikethrough": "Barrato", + "mdToolbar_defaultText": "Il tuo testo qui", + "mdToolbar_button": "Mostra o nascondi la barra degli strumenti Markdown", + "todo_removeTaskTitle": "Togli questo compito dalla tua lista todo", + "todo_markAsIncompleteTitle": "Segna questo compito come incompleto", + "todo_markAsCompleteTitle": "Segna questo compito come completato", + "todo_newTodoNameTitle": "Aggiungi questo compito alla tua lista todo", + "todo_newTodoNamePlaceholder": "Descrivi il tuo compito...", + "todo_title": "CryptTodo", + "download_step2": "Decodifica", + "download_button": "Decodifica & Scarica", + "upload_up": "Importa", + "upload_cancelled": "Cancellato", + "upload_tooLarge": "Questo file supera la dimensione massima di importazione autorizzata per il tuo account.", + "upload_notEnoughSpace": "Non c'è spazio sufficiente per questo file nel tuo CryptDrive.", + "upload_success": "Il tuo file ({0}) è stato caricato con successo e aggiunto al tuo drive.", + "upload_serverError": "Errore del server: attualmente impossibile importare il file.", + "uploadFolder_modal_title": "Opzione di importazione del folder", + "upload_modal_owner": "File posseduto", + "upload_modal_filename": "Nome del file (extension {0} aggiunta automaticamente)", + "settings_cursorShowHint": "Puoi decidere se vuoi vedere la posizione del tuo cursore degli altri utenti nei documenti collaborativi.", + "settings_cursorShareHint": "Puoi decidere se vuoi mostrare la posizione del tuo cursore agli altri utenti nei documenti collaborativi.", + "settings_cursorColorHint": "Cambiare il colore associato al tuo utente nei documenti collaborativi.", + "settings_changePasswordPending": "La tua password è in fase di modifica. Non chiudere o ricaricare questa pagina fino al completamento del processo.", + "settings_changePasswordError": "Errore non previsto. Se non riesci ad accedere o cambiare la tua password contatta il tuo amministratore CryptPad.", + "settings_changePasswordConfirm": "Sei sicuro di voler cambiare la tua password? Dovrai riconnetterti su tutti i tuoi apparecchi.", + "settings_changePasswordHint": "Modifica la password del tuo account. Inserisci la tua password attuale e conferma la nuova password inserendola due volte.
Non possiamo reinstallare la tua password se la dimentichi, quindi sii molto prudente!", + "settings_ownDrivePending": "Il tuo account è stato aggiornato. Non chiudere o ricaricare questa pagina prima che sia stato completato il processo.", + "settings_ownDriveConfirm": "Aggiornare il tuo account potrebbe richiedere tempo. Dovrai riconnetterti su tutti i tuoi apparecchi. Vuoi continuare?", + "settings_ownDriveHint": "Gli account più vecchi non hanno accesso alle ultime funzioni, per motivi tecnici. Un aggiornamento gratuito permetterà di attivare le funzioni attuali e preparare il tuo CryptDrive per futuri aggiornamenti.", + "settings_templateSkipHint": "Quando crei un nuovo pad vuoto, se hai dei modelli per questo tipo di pad, può apparire una finestra con la richiesta di utilizzare un modello. Qui puoi scegliere di non mostrare mai questa finestra e quindi di non utilizzare mai un modello.", + "settings_templateSkip": "Saltare la schermata di scelta di un modello", + "settings_creationSkipFalse": "Mostrare", + "settings_creationSkipHint": "La schermata di creazione di pad offre nuove opzioni per creare un pad, fornendo maggior controllo e sicurezza per i tuoi dati. Tuttavia potrebbe rallentare il lavoro aggiungendo un passaggio supplementare quindi, qui, hai la possibilità di scegliere di saltare la schermata e utilizzare i parametri di default selezionati sopra.", + "settings_creationSkip": "Salta la schermata di creazione di pad", + "settings_padSpellcheckLabel": "Attiva la verifica ortografica", + "settings_padSpellcheckHint": "Questa opzione permette di attivare la verifica ortografica nell'editor di testo. Gli errori saranno sottolineati in rosso e le correzioni saranno disponibili cliccando a destra sul mouse e premendo il tasto Ctrl o Meta.", + "settings_padSpellcheckTitle": "Verifica ortografica", + "settings_padWidthLabel": "Ridurre la larghezza dell'editor", + "settings_padWidthHint": "I pad di testo occupano di default la massima larghezza disponibile sullo schermo e la lettura può essere difficile. Potete ridurre la larghezza dell'editor qui.", + "settings_padWidth": "Massima larghezza dell'editor", + "settings_codeUseTabs": "Rientrare usando tabs (invece di spazi)", + "settings_driveDuplicateTitle": "Duplicati dei pad di cui sei proprietario", + "settings_logoutEverywhereConfirm": "Sei sicuro? Dovrai riconnetterti su tutti i tuoi apparecchi.", + "settings_logoutEverywhere": "Forzare l'uscita da tutte le altre sessioni web", + "settings_usageAmount": "I tuoi pads appuntati occupano {0}MB", + "settings_pinningError": "Qualcosa è andato storto", + "settings_pinningNotAvailable": "I pads appuntati sono disponibili solo per gli utenti registrati.", + "settings_usageTitle": "Guarda la quantità totale dei tuoi pads appuntati in MB", + "settings_usage": "Utilizzo", + "settings_publicSigningKey": "Firma digitale pubblica", + "settings_anonymous": "Non sei collegato. La configurazione è specifica per questo browser.", + "settings_deleted": "Il tuo user account è stato cancellato. Premi OK per tornare alla home page.", + "settings_deleteModal": "Condividi le seguenti informazioni con il tuo amministratore CryptPad per rimuovere i tuoi dati dal server.", + "settings_deleteConfirm": "Cliccando OK cancellerai il tuo account. Vuoi continuare?", + "settings_autostoreHint": "Automatico Tutti i pad che visiti sono conservati nel tuo CryptDrive.
Manuale (chiedi sempre) Se non hai ancora conservato alcun pad ti verrà chiesto se vuoi conservarli nel tuo CryptDrive.
Manuale (non chiedere mai) I Pads non sono conservati automaticamente nel tuo Cryptpad. L'opzione di conservarli sarà nascosta.", + "settings_autostoreNo": "Manuale (non chiedere mai)", + "settings_autostoreYes": "Automatico", + "settings_autostoreTitle": "Conservazione pad nel CryptDrive", + "settings_importTitle": "Importare i pad recenti di questo browser nel tuo CryptDrive", + "kanban_noTags": "Nessun tag", + "kanban_tags": "Filtra per tag", + "kanban_delete": "Elimina", + "kanban_color": "Colore", + "kanban_body": "Contenuto", + "kanban_title": "Titolo", + "teams": "Team", + "contacts": "Contatti", + "restrictedError": "Non sei autorizzato ad accedere a questo documento", + "access_allow": "Elenco", + "copy_title": "{0} (copia)", + "makeACopy": "Fai una copia", + "areYouSure": "Sei sicuro?", + "dontShowAgain": "Non mostrare più", + "oo_exportInProgress": "Esportazione in corso", + "oo_importInProgress": "Importazione in corso", + "oo_invalidFormat": "Questo file non può essere importato", + "team_inviteInvalidLinkError": "Il link d'invito non è valido.", + "team_links": "Link d'invito", + "team_cat_link": "Link d'invito", + "team_inviteJoin": "Unisciti al team", + "team_invitePleaseLogin": "Accedi o registrati per accettare questo invito.", + "team_inviteFromMsg": "{0} ti ha invitato ad unirti al team {1}", + "team_inviteFrom": "Da:", + "team_inviteLinkCopy": "Copia link", + "team_inviteLinkCreate": "Crea link", + "team_inviteLinkLoading": "Generazione del tuo link in corso", + "team_inviteLinkNote": "Aggiungi un messaggio personale", + "pad_wordCount": "Parole: {0}", + "teams_table_role": "Ruolo", + "teams_table_owners": "Gestisci team", + "teams_table_admins": "Gestisci membri", + "teams_table_specific": "Eccezioni", + "teams_table_generic": "Ruoli e permessi", + "teams_table": "Ruoli", + "properties_passwordSuccessFile": "La password è stata cambiata con successo.", + "drive_sfPasswordError": "Password errata", + "team_title": "Team: {0}", + "team_pendingOwner": "(in attesa)", + "team_deleteButton": "Elimina", + "team_pending": "Invitato", + "sent": "Messaggio inviato", + "team_listTitle": "I tuoi team", + "team_avatarHint": "Dimensione massima 500KB (png, jpg, jpeg, gif)", + "team_avatarTitle": "Avatar del team", + "team_nameHint": "Imposta il nome del team", + "team_nameTitle": "Nome del team", + "team_members": "Membri", + "team_leaveButton": "Lascia questo team", + "team_createName": "Nome del team", + "team_createLabel": "Crea un nuovo team", + "team_cat_chat": "Chat", + "team_cat_members": "Membri", + "team_cat_list": "Team", + "team_inviteModalButton": "Invita", + "owner_unknownUser": "sconosciuto", + "owner_removePendingText": "In attesa", + "owner_removeText": "Proprietari", + "features_emailRequired": "Indirizzo email richiesto", + "features_pricing": "Tra {0} e {2}€ al mese", + "features_noData": "Nessuna informazione personale richiesta", + "homePage": "Home page", + "requestEdit_sent": "Richiesta inviata", + "requestEdit_request": "{1} vuole modificare il pad {0}", + "later": "Decidi più tardi", + "requestEdit_viewPad": "Apri il pad in una nuova scheda", + "notifications_cat_pads": "Condivisi con me", + "notifications_cat_all": "Tutte", + "openNotificationsApp": "Apri il pannello delle notifiche", + "notificationsPage": "Notifiche", + "fc_noAction": "Nessuna azione disponibile", + "support_from": "Da: {0}", + "support_answer": "Rispondi", + "support_formMessage": "Scrivi il tuo messaggio...", + "support_formContentError": "Errore: il contenuto è vuoto", + "support_formTitleError": "Errore: il titolo è vuoto", + "support_formButton": "Invia", + "admin_supportAddError": "Chiave privata non valida", + "notifications_dismiss": "Ignora", + "share_withFriends": "Condividi", + "share_filterFriend": "Cerca per nome", + "share_deselectAll": "Deseleziona tutto", + "share_selectAll": "Seleziona tutto", + "notification_folderShared": "{0} ha condiviso una cartella con te: {1}", + "notification_fileShared": "{0} ha condiviso un pad con te: {1}", + "notification_padShared": "{0} ha condiviso un pad con te: {1}", + "isNotContact": "{0} non è uno dei tuoi contatti", + "isContact": "{0} è uno dei tuoi contatti", + "profile_friendRequestSent": "Richiesta di contatto in attesa...", + "profile_addLink": "Aggiungi un link al tuo sito web", + "profile_editDescription": "Modifica la tua descrizione", + "profile_addDescription": "Aggiungi una descrizione", + "notifications_title": "Hai delle notifiche non lette", + "notifications_empty": "Nessuna notifica disponibile", + "friendRequest_notification": "{0} ti ha inviato una richiesta di contatto", + "friendRequest_accepted": "{0} ha accettato la tua richiesta di contatto", + "friendRequest_declined": "{0} ha rifiutato la tua richiesta di contatto", + "friendRequest_decline": "Rifiuta", + "friendRequest_accept": "Accetta (Invio)", + "friendRequest_later": "Decidi più tardi", + "drive_active28Days": "Ultime 4 settimane", + "drive_active7Days": "Ultimi 7 giorni", + "drive_active1Day": "Ultime 24 ore", + "contact_email": "Email", + "contact_chat": "Chat", + "contact_dev": "Contatta gli sviluppatori", + "contact_admin": "Contatta gli amministratori", + "footer_tos": "Termini", + "footer_donate": "Dona", + "footer_team": "Il team", + "footer_product": "Prodotto", + "admin_registeredTitle": "Utenti registrati", + "admin_activePadsTitle": "Pad attivi", + "admin_activeSessionsTitle": "Connessioni attive", + "adminPage": "Amministrazione", + "admin_cat_stats": "Statistiche", + "admin_cat_general": "Generale", + "survey": "Sondaggio Cryptpad", + "crowdfunding_popup_no": "Non ora", + "crowdfunding_button": "Supporta Cryptpad", + "crowdfunding_home2": "Fai clic sul pulsante per maggiori informazioni sulla nostra campagna di crowdfunding.", + "crowdfunding_home1": "A Cryptpad serve il tuo aiuto!", + "autostore_pad": "pad", + "autostore_sf": "cartella", + "autostore_file": "file", + "sharedFolders_create_password": "Password della cartella", + "sharedFolders_create_name": "Nome della cartella", + "share_contactCategory": "Contatti", + "share_linkCopy": "Copia", + "share_linkOpen": "Anteprima" } diff --git a/www/common/translations/messages.ja.json b/www/common/translations/messages.ja.json index 0967ef424..4d71dcfc7 100644 --- a/www/common/translations/messages.ja.json +++ b/www/common/translations/messages.ja.json @@ -1 +1,26 @@ -{} +{ + "websocketError": "ウェブソケットサーバーとの接続ができません。", + "common_connectionLost": "サーバーとの接続が切断しました。\nサーバーと再接続するまで閲覧モードになります。", + "button_newsheet": "新規スプレッドシート", + "button_newkanban": "新規カンバン", + "button_newwhiteboard": "新規ホワイトボード", + "button_newslide": "新規プレゼンテーション", + "button_newpoll": "新規投票・アンケート", + "button_newcode": "新規コードファイル", + "button_newpad": "新規リッチテキスト", + "type": { + "teams": "チーム", + "contacts": "連絡先", + "todo": "やることリスト", + "media": "メディア", + "file": "ファイル", + "whiteboard": "ホワイトボード", + "drive": "ドライブ", + "slide": "プレゼン", + "kanban": "看板", + "poll": "投票・アンケート", + "code": "コード", + "pad": "リッチテキスト" + }, + "main_title": " CryptPad - それは直感的なリアルタイム同期編集エディター -" +} diff --git a/www/common/translations/messages.json b/www/common/translations/messages.json index 9fd37ff99..f10288dc1 100644 --- a/www/common/translations/messages.json +++ b/www/common/translations/messages.json @@ -599,7 +599,7 @@ "mdToolbar_button": "Show or hide the Markdown toolbar", "mdToolbar_defaultText": "Your text here", "mdToolbar_help": "Help", - "mdToolbar_tutorial": "http://www.markdowntutorial.com/", + "mdToolbar_tutorial": "https://www.markdowntutorial.com/", "mdToolbar_bold": "Bold", "mdToolbar_italic": "Italic", "mdToolbar_strikethrough": "Strikethrough", diff --git a/www/common/translations/messages.nb.json b/www/common/translations/messages.nb.json index d8dde2774..881bcc8df 100644 --- a/www/common/translations/messages.nb.json +++ b/www/common/translations/messages.nb.json @@ -279,7 +279,7 @@ "fm_fileName": "Filnavn", "fm_title": "Tittel", "fm_lastAccess": "Siste tilgang", - "fm_creation": "Skaperverk", + "fm_creation": "Opprettet", "fm_forbidden": "Ulovlig handling", "fm_originalPath": "Original filsti", "fm_openParent": "Vis i mappe", @@ -304,5 +304,6 @@ "settings_exportDescription": "Vennligst vent mens vi laster ned og dekrypterer dokumentene dine. Lukker du fanen vil du avbryte nedlastingen.", "settings_exportFailed": "Hvis paden trenger mer enn 1 minutt på nedlastingen så vil den desverre ikke inkluderes i eksporteringen. I stedet vil en linke til paden vises.", "settings_exportWarning": "NB: denne funksjonen er beta og muligens ustabil. Vi anbefaler at du holder denne fanen i fokus.", - "settings_exportCancel": "Er du sikker på at du vil avbryte eksporteringen? I så fall må du starte på nytt neste gang." + "settings_exportCancel": "Er du sikker på at du vil avbryte eksporteringen? I så fall må du starte på nytt neste gang.", + "editOpen": "Åpne redigert link i en ny fane" } diff --git a/www/common/translations/messages.nl.json b/www/common/translations/messages.nl.json index 7a73a41bf..7c18658d9 100644 --- a/www/common/translations/messages.nl.json +++ b/www/common/translations/messages.nl.json @@ -1,2 +1,206 @@ { -} \ No newline at end of file + "wrongApp": "De sessie-inhoud kan niet in uw browser worden weergegeven. Probeer om de pagina te herladen.", + "type": { + "drive": "Opslag", + "kanban": "Kanban-bord", + "poll": "Peiling", + "pad": "Opgemaakte tekst", + "teams": "Groepen", + "sheet": "Blad", + "contacts": "Contactpersonen", + "todo": "Takenlijst", + "media": "Media", + "file": "Bestand", + "whiteboard": "Whiteboard", + "slide": "Presentatie", + "code": "Code" + }, + "padNotPinned": "Deze werkomgeving verloopt als deze 3 maanden niet wordt gebruikt, {0}login{1} of {2}registreer{3} om deze te behouden.", + "onLogout": "U bent uitgelogd, {0}klik hier{1} om in te loggen
of druk op Escape om uw werkomgeving in alleen-lezen modus te bekijken.", + "typeError": "Deze werkomgeving kan niet gebruikt worden met de geselecteerde applicatie", + "websocketError": "Verbinden met de websocket server is niet mogelijk...", + "common_connectionLost": "Verbinding met server verbroken
Alleen-lezen modus is ingeschakeld tot de verbinding hersteld is.", + "button_newkanban": "Nieuw Kanban-bord", + "button_newwhiteboard": "Nieuw Whiteboard", + "button_newslide": "Nieuwe Presentatie", + "button_newpoll": "Nieuwe Peiling", + "button_newcode": "Nieuw codebestand", + "button_newpad": "Nieuw tekstbestand", + "button_newsheet": "Nieuw Blad", + "padNotPinnedVariable": "Deze werkomgeving zal na {4} dagen zonder gebruik verlopen, {0}login{1} of {2}registreer{3} om deze te behouden.", + "anonymousStoreDisabled": "De webmaster van deze CryptPad instantie heeft opslag uitgezet voor anonieme gebruikers. Je moet inloggen om deze CryptOpslag te gebruiken.", + "settings_ownDriveTitle": "Account bijwerken", + "settings_creationSkipTrue": "Sla over", + "kanban_editBoard": "Bewerk dit bord", + "expiredError": "Deze werkomgeving heeft zijn vervaldatum bereikt en is niet meer beschikbaar.", + "history_restoreTitle": "Herstel de gekozen versie van het document", + "history_closeTitle": "Geschiedenis sluiten", + "history_loadMore": "Meer geschiedenis laden", + "history_prev": "Oudere versie", + "history_next": "Nieuwere versie", + "historyButton": "Toon documentgeschiedenis", + "historyText": "Geschiedenis", + "help_button": "Hulp", + "hide_help_button": "Verberg hulp", + "show_help_button": "Toon hulp", + "cancelButton": "Annuleren (esc)", + "cancel": "Annuleren", + "okButton": "OK (enter)", + "ok": "OK", + "notifyLeft": "{0} heeft de collaboratieve sessie verlaten", + "notifyRenamed": "{0} staat nu bekend als {1}", + "notifyJoined": "{0} neemt deel aan deze collaboratieve sessie", + "fileEmbedTag": "Daarna plaatst u deze Media Tag op een lokatie naar keuze op de pagina om te integreren:", + "fileEmbedScript": "Om dit bestand te integreren sluit u dit script in op uw pagina om de Media Tag te laden:", + "fileEmbedTitle": "Integreer het bestand in een externe pagina", + "viewEmbedTag": "Om deze werkomgeving te integreren plaatst u dit iframe op uw pagina op een lokatie naar keuze. Maak gebruik van CSS of HTML attributen om de vormgeving aan te passsen.", + "fileShare": "Kopieer link", + "viewOpenTitle": "Open deze werkomgeving in alleen-lezen modus in een nieuw tabblad", + "viewOpen": "Open de alleen-lezen link in een nieuw tabblad", + "viewShareTitle": "Kopieer de alleen-lezen link naar het klembord", + "viewShare": "Alleen-lezen link", + "editOpenTitle": "Open deze werkomgeving in bewerkingsmodus in een nieuw tabblad", + "editOpen": "Open de link om te bewerken in een nieuw tabblad", + "editShareTitle": "Kopieer de link om te bewerken naar het klembord", + "editShare": "Link om te bewerken", + "themeButtonTitle": "Kies het kleurenschema voor de code- en diabewerker", + "themeButton": "Schema", + "languageButtonTitle": "Kies de taal voor syntaxisaccentuering", + "languageButton": "Taal", + "slide_invalidLess": "Ongeldige aangepaste stijl", + "slideOptionsButton": "Opslaan (enter)", + "slideOptionsTitle": "Uw dias aanpassen", + "slideOptionsText": "Opties", + "tags_noentry": "U kunt een verwijderde werkomgeving niet markeren!", + "tags_duplicate": "Gedupliceerde markering: {0}", + "tags_notShared": "Uw markeringen worden niet gedeeld met andere gebruikers", + "tags_searchHint": "Begin een zoekopdracht met # in uw CryptDrive om gemarkeerde werkomgevingen te vinden.", + "tags_add": "Werk de markeringen van deze pagina bij", + "tags_title": "Markeringen (alleen voor u)", + "or": "of", + "filePicker_filter": "Filter bestanden op naam", + "filePicker_description": "Kies een bestand van uw CryptDrive om te integreren of upload een nieuw bestand", + "filePicker_close": "Sluiten", + "filePickerButton": "Integreer een bestand opgeslagen op CryptDrive", + "printBackgroundRemove": "Verwijder deze achtergrondafbeelding", + "printBackgroundNoValue": "Geen achtergrondafbeelding weergegeven", + "printBackgroundValue": "Huidige achtergrond:{0}", + "printBackgroundButton": "Kies een afbeelding", + "printBackground": "Gerbuik een achtergrondafbeelding", + "printTransition": "Schakel overgangsanimaties in", + "printCSS": "Aangepaste stijlregels (CSS):", + "printTitle": "Toon naam van de werkomgeving", + "printDate": "Toon datum", + "printSlideNumber": "Toon dianummer", + "printOptions": "Opmaak opties", + "printButtonTitle2": "Print uw document of exporteer het als een PDF bestand", + "printButton": "Printen (enter)", + "printText": "Printen", + "propertiesButtonTitle": "Laad werkomgeving eigenschappen", + "propertiesButton": "Eigenschappen", + "colorButtonTitle": "Wijzig de tekstkleur in presentatiemodus", + "backgroundButtonTitle": "Wijzig de achtergrondkleur van de presentatie", + "presentButtonTitle": "Presentatiemodus ingaan", + "previewButtonTitle": "Markdown voorbeeldmodus weergeven of verbergen", + "useTemplateCancel": "Met leeg bestand beginnen (Esc)", + "saveTemplatePrompt": "Kies een titel voor het sjabloon", + "template_empty": "Geen sjabloon beschikbaar", + "template_import": "Importeer een sjabloon", + "useTemplateOK": "Kies een sjabloon (Enter)", + "useTemplate": "Beginnen met een sjabloon?", + "selectTemplate": "Kies een sjabloon of druk op escape", + "templateSaved": "Sjabloon opgeslagen!", + "saveTemplateButton": "Opslaan als sjabloon", + "uploadButtonTitle": "Upload een nieuw bestand naar de huidige map", + "uploadFolderButton": "Uploadmap", + "uploadButton": "Bestanden uploaden", + "newButtonTitle": "Maak een nieuwe werkomgeving aan", + "newButton": "Nieuw", + "userAccountButton": "Uw account", + "chatButton": "Chat", + "userListButton": "Gebruikerslijst", + "shareSuccess": "Link gekopieerd naar het klembord", + "shareButton": "Deel", + "movedToTrash": "Die werkomgeving was verplaatst naar de prullenbak.
Ga naar uw Drive", + "forgetPrompt": "Door op OK te drukken wordt deze werkomgeving verplaatst naar de prullenbak. Weet u dit zeker?", + "forgetButtonTitle": "Verplaats deze werkomgeving naar de prullenbak", + "forgetButton": "Verwijder", + "saveTitle": "Titel opslaan (enter)", + "clickToEdit": "Klik om te bewerken", + "user_accountName": "Accountnaam", + "user_displayName": "Weergavenaam", + "user_rename": "Wijzig weergavenaam", + "changeNamePrompt": "Wijzig uw naam (leeglaten om anoniem te zijn): ", + "exportPrompt": "Hoe zou u uw bestand willen noemen?", + "exportButtonTitle": "Exporteer een werkomgeving naar een lokaal bestand", + "exportButton": "Exporteer", + "importButtonTitle": "Importeer een werkomgeving vanuit een lokaal bestand", + "importButton": "Importeer", + "moreActions": "Meer acties", + "pinLimitDrive": "U heeft uw opslaglimiet bereikt.
U kunt geen nieuwe werkomgevingen aanmaken.", + "pinLimitNotPinned": "U heeft uw opslaglimiet bereikt.
Deze werkomgeving wordt niet opgeslagen op uw CryptDrive.", + "pinLimitReachedAlertNoAccounts": "U heeft uw opslaglimiet bereikt", + "pinLimitReachedAlert": "U heeft uw opslaglimiet bereikt. Nieuwe werkomgevingen worden niet opgeslagen in uw CryptDrive.
U kunt werkomgevingen verwijderen van uw CryptDrive of aanmelden voor een premium account om uw opslaglimiet te verhogen.", + "pinLimitReached": "U heeft uw opslaglimiet bereikt", + "redLight": "U bent de verbinding kwijt met de sessie", + "orangeLight": "Uw langzame verbinding kan gevolgen hebben voor uw ervaring", + "greenLight": "Alles werkt naar behoren", + "formattedKB": "{0} KB", + "formattedGB": "{0} GB", + "formattedMB": "{0} MB", + "supportCryptpad": "Ondersteun CryptPad", + "KB": "KB", + "GB": "GB", + "MB": "MB", + "storageStatus": "Opslag:
{0} verbruikt van {1}", + "upgradeAccount": "Upgrade account", + "upgradeTitle": "Upgrade uw account om meer opslag te krijgen", + "upgrade": "Upgrade", + "newVersion": "CryptPad is geüpdated!
Bekijk wat veranderd is in de nieuwste versie:
Release notes voor CryptPad {0}", + "comingSoon": "Komt binnenkort...", + "language": "Taal", + "userlist_offline": "U bent nu offline, de lijst van gebruikers is niet beschikbaar.", + "editors": "bewerkers", + "editor": "bewerker", + "viewers": "kijkers", + "viewer": "kijker", + "and": "En", + "users": "Gebruikers", + "anonymousUser": "anonieme bewerker", + "anonymousUsers": "anonieme bewerkers", + "yourself": "Uzelf", + "anonymous": "Anoniem", + "readonly": "Alleen lezen", + "lag": "Vertraging", + "errorState": "Kritieke fout: {0}", + "forgotten": "Verplaatst naar de prullenbak", + "initializing": "Initialiseren...", + "typing": "Aan het bewerken", + "reconnecting": "Opnieuw aan het verbinden", + "synchronizing": "Synchroniseren", + "disconnected": "Verbinding verbroken", + "realtime_unrecoverableError": "Een onherstelbare fout heeft plaatsgevonden. Druk op OK om de pagina te herladen.", + "disabledApp": "Deze applicatie is buiten werking gesteld. Neem contact op met de beheerder van deze CryptPad voor meer informatie.", + "mustLogin": "U moet ingelogd zijn om toegang te krijgen tot deze pagina", + "deletedFromServer": "Werkomgeving verwijderd van de server", + "deleted": "Verwijderd", + "synced": "Alles is opgeslagen", + "saved": "Opgeslagen", + "error": "Fout", + "loading": "Laden...", + "newVersionError": "Een nieuwe versie van CryptPad is beschikbaar.
Herlaad de pagina om de nieuwe versie te gebruiken, of druk escape om uw inhoud te bekijken in offline modus.", + "oo_isLocked": "synchroniseert wijzigingen, gelieve te wachten", + "settings_changePasswordTitle": "Wijzig uw wachtwoord", + "settings_ownDrivePending": "Uw account wordt geüpgraded. Gelieve deze pagina niet te sluiten of te herladen totdat dit voltooid is.", + "settings_ownDriveConfirm": "Uw account upgraden kan enkele minuten duren. U zult op all uw apparaten opnieuw moeten inloggen. Weet u dit zeker?", + "settings_ownDriveButton": "Upgrade uw account", + "settings_ownDriveHint": "Oude accounts hebben geen toegang tot de nieuwste functies. Een gratis update zal nieuwe functies inschakelen en jouw Drive voor toekomstige updates voorbereiden.", + "errorRedirectToHome": "Druk op Esc om door te gaan naar uw CryptDrive.", + "errorCopy": " U kunt nog steeds toegang krijgen tot de inhoud als u op Esc drukt.
Als u dit venster sluit kunt u er geen toegang meer tot krijgen.", + "invalidHashError": "Het document dat u opvroeg heeft een ongeldige URL.", + "chainpadError": "Er was een kritieke fout bij het updaten van uw inhoud. Deze pagina is nu alleen leesbaar om uw werk niet kwijt te raken.
Druk op Esc om verder te gaan met het bekijken van deze werkomgeving, of herlaad de pagina om te proberen deze werkomgeving weer aan te kunnen passen.", + "inactiveError": "Deze werkomgeving is verwijderd wegens gebrek aan activiteit. Druk op Esc om een nieuwe werkomgeving aan te maken.", + "deletedError": "Deze werkomgeving is verwijderd door de eigenaar en is niet meer beschikbaar.", + "main_title": "CryptPad: Geen Kennis, Onvertraagd Collaboratief Aanpassen" +} + diff --git a/www/common/translations/messages.pl.json b/www/common/translations/messages.pl.json index 9b4086a85..ce8b81fb5 100644 --- a/www/common/translations/messages.pl.json +++ b/www/common/translations/messages.pl.json @@ -4,7 +4,10 @@ "pad": "Pad", "code": "Kod", "poll": "Balot", - "slide": "Prezentacja" + "slide": "Prezentacja", + "contacts": "Kontakty", + "file": "Plik", + "kanban": "Kanban" }, "common_connectionLost": "Przerwano połączenie z serwerem", "disconnected": "Rozłączony", diff --git a/www/common/translations/messages.pt-br.json b/www/common/translations/messages.pt-br.json index 5eb330666..f0747694d 100644 --- a/www/common/translations/messages.pt-br.json +++ b/www/common/translations/messages.pt-br.json @@ -3,7 +3,7 @@ "type": { "pad": "Notas", "code": "Código", - "poll": "votação", + "poll": "Enquete", "slide": "Apresentação", "drive": "Drive", "whiteboard": "Whiteboard", @@ -338,8 +338,8 @@ "feedback_privacy": "We care about your privacy, and at the same time we want CryptPad to be very easy to use. We use this file to figure out which UI features matter to our users, by requesting it along with a parameter specifying which action was taken.", "feedback_optout": "If you would like to opt out, visit your user settings page, where you'll find a checkbox to enable or disable user feedback", "button_newkanban": "", - "button_newsheet": "", - "padNotPinned": "", + "button_newsheet": "Nova Planilha", + "padNotPinned": "Esse pad vai expirar depois de 3 meses de inatividade. {0}login{1} ou {2}registrar-se{3} para preservá-lo.", "anonymousStoreDisabled": "", "expiredError": "", "deletedError": "", diff --git a/www/common/translations/messages.ro.json b/www/common/translations/messages.ro.json index c4510dadb..5b744e4a7 100644 --- a/www/common/translations/messages.ro.json +++ b/www/common/translations/messages.ro.json @@ -457,7 +457,7 @@ "profile_fieldSaved": "Valoare nouă salvată: {0}", "userlist_addAsFriendTitle": "Adaugă \"{0}\" în lista de contacte", "canvas_currentBrush": "Culoarea curentă", - "profile_viewMyProfile": "Vizualizare profil", + "profile_viewMyProfile": "Vezi profilul tău", "contacts_title": "Contacte", "contacts_addError": "A apărut o eroare în timpul adăugării la lista de contacte", "contacts_added": "Invitația din partea contactului acceptată", diff --git a/www/common/translations/messages.ru.json b/www/common/translations/messages.ru.json index 77c0ff60b..865394b94 100644 --- a/www/common/translations/messages.ru.json +++ b/www/common/translations/messages.ru.json @@ -1,18 +1,19 @@ { "main_title": "CryptPad: совместное конфиденциальное редактирование в реальном времени", "type": { - "pad": "Текст с форматированием", + "pad": "Текст", "code": "Код", "poll": "Опрос", "kanban": "Канбан", "slide": "Презентация", - "drive": "Зашифрованный диск", + "drive": "Криптодиск", "whiteboard": "Рисованные заметки", "file": "Файл", "media": "Медиафайлы", "todo": "Список дел", "contacts": "Адресная книга", - "sheet": "Электронная таблица (бета-версия)" + "sheet": "Таблица", + "teams": "Команды" }, "button_newpad": "Новая документ с форматированием", "button_newcode": "Новый документ с кодом", @@ -142,7 +143,7 @@ "tags_searchHint": "Начните поиск в вашем CryptDrive при помощи # чтобы найти пэды с тегами.", "tags_notShared": "Ваши теги не разделяются с другими пользователями", "button_newsheet": "Новый Лист", - "newButtonTitle": "Создать новый документ", + "newButtonTitle": "создать новую запись", "useTemplateCancel": "Начать заново (Esc)", "previewButtonTitle": "Показать или скрыть просмотр Маркдаун разметки", "printOptions": "Настройки размещения", @@ -301,7 +302,7 @@ "markdown_toc": "Содержимое", "fm_expirablePad": "Этот блокнот истечет {0}", "fileEmbedTitle": "Встроить файл во внешнюю страницу", - "kanban_removeItemConfirm": "Вы уверенны, что хотите удалить этот пункт?", + "kanban_removeItemConfirm": "Вы уверенны, что хотите удалить этот элемент?", "settings_backup2": "Скачать мой CryptDrive", "settings_backup2Confirm": "Это позволит скачать все пэды и файлы с вашего CryptDrive. Если вы хотите продолжить, выберите имя и нажмите OK", "settings_exportTitle": "Экспортировать Ваш CryptDrive", @@ -483,7 +484,7 @@ "settings_autostoreMaybe": "Вручную (всегда спрашивать)", "settings_userFeedbackTitle": "Обратная связь", "settings_userFeedbackHint2": "Содержимое вашего документа никогда не будет передаваться на сервер.", - "fm_alert_anonymous": "Здравствуйте, в настоящее время вы используете CryptPad анонимно, это нормально, но ваши пэды могут быть удалены после периода бездействия. Мы отключили расширенные возможности хранилища для анонимных пользователей, потому что хотим быть уверенными, что это небезопасное место для хранения вещей. Вы можете 1читать далее2 о том, почему мы это делаем и почему вам стоит зарегистрироваться4 and 5Log in6.", + "fm_alert_anonymous": "Здравствуйте, в настоящее время вы используете CryptPad анонимно, это нормально, но ваши документы могут быть удалены после периода бездействия. Мы отключили расширенные возможности хранилища для анонимных пользователей, потому что хотим донести до вас, что это небезопасное место для хранения. Вы можете 1читать далее2 о том, почему мы это делаем и почему вам стоит зарегистрироваться4 and 5Log in6.", "settings_resetPrompt": "Это действие удалит все документы с диска.
Вы уверены, что хотите продолжить?
Напишите \"Я люблю CryptPad\" для подтверждения.", "settings_importTitle": "Импортируйте последние документы данного браузера в ваше хранилище", "settings_importConfirm": "Вы уверены, что хотите импортировать последние документы из этого браузера в хранилище вашего пользователя?", @@ -499,5 +500,46 @@ "settings_usage": "Использование", "settings_usageTitle": "Смотрите общий размер ваших прикрепленных документов в мегабайтах", "settings_pinningNotAvailable": "Прикрепленные документы доступны только зарегистрированным пользователям.", - "settings_pinningError": "Что-то пошло не так" + "settings_pinningError": "Что-то пошло не так", + "oo_exportInProgress": "Экспорт в процессе", + "oo_importInProgress": "Импорт в процессе", + "oo_invalidFormat": "Этот файл не может быть импортирован", + "oo_exportChrome": "Экспорт в форматы Microsoft Office в настоящее время доступен только в Google Chrome.", + "burnAfterReading_warningAccess": "Этот документ самоуничтожится. При нажатии на кнопку ниже вы увидите содержимое один раз, прежде чем оно будет окончательно удалено. Когда вы закроете это окно, вы не сможете получить к нему доступ снова. Если вы не готовы продолжить, вы можете закрыть это окно и вернуться позже.", + "burnAfterReading_generateLink": "Нажмите на кнопку ниже, чтобы создать ссылку.", + "todo_newTodoNamePlaceholder": "Опишите вашу задачу...", + "download_resourceNotAvailable": "Запрошенный ресурс был недоступен... Нажмите Esc для продолжения.", + "upload_size": "Размер", + "upload_name": "Имя файла", + "upload_pending": "Ожидают", + "upload_tooLargeBrief": "Фаил слишком большой", + "upload_notEnoughSpaceBrief": "Недостаточно места", + "upload_notEnoughSpace": "Недостаточно места для этого файла на вашем CryptDrive.", + "upload_type": "Тип", + "settings_cursorShareTitle": "Делиться позицией моего курсора", + "settings_cursorColorTitle": "Цвет курсора", + "settings_changePasswordError": "Произошла неожиданная ошибка. Если вы не можете войти или сменить пароль, свяжитесь с вашими администраторами CryptPad.", + "settings_changePasswordConfirm": "Вы действительно хотите сменить ваш пароль? Вам придётся войти по-новой на всех ваших устройствах.", + "settings_changePasswordNew": "Новый пароль", + "settings_changePasswordCurrent": "Текущий пароль", + "settings_changePasswordButton": "Поменять пароль", + "settings_changePasswordTitle": "Поменять ваш пароль", + "settings_creationSkipTrue": "Пропускать", + "settings_creationSkip": "Пропускать экран создания документа", + "settings_padSpellcheckTitle": "Проверка орфографии", + "settings_padWidthLabel": "Уменьшить ширину в редакторе", + "settings_padWidth": "Максимальная ширина в редакторе", + "settings_codeFontSize": "Размер шрифта в редакторе кода", + "settings_codeUseTabs": "Выравнивать, используя табы (вместо пробелов)", + "settings_driveDuplicateLabel": "Скрыть повторяющиеся", + "settings_logoutEverywhere": "Принудительно закрыть все остальные сессии", + "settings_logoutEverywhereTitle": "Выйти везде", + "settings_logoutEverywhereButton": "Выйти", + "settings_usageAmount": "Ваши закреплённые документы занимают {0}MB", + "settings_anonymous": "Вы не вошли в систему. Настройки будут специфичны для данного браузера.", + "fc_openInCode": "Открыть в редакторе кода", + "fm_morePads": "Ещё", + "uploadFolderButton": "Загрузить папку", + "storageStatus": "Хранилище:
{0} использовано из {1}", + "padNotPinnedVariable": "Этот документ исчезнет через {4} дней неактивности, {0}войдите{1} или {2}зарегистируйтесь{3} чтобы сохранить его." } diff --git a/www/common/translations/messages.sv.json b/www/common/translations/messages.sv.json new file mode 100644 index 000000000..f727905a1 --- /dev/null +++ b/www/common/translations/messages.sv.json @@ -0,0 +1,14 @@ +{ + "type": { + "contacts": "Kontakter", + "media": "Media", + "file": "Fil", + "whiteboard": "Whiteboard", + "drive": "CryptDrive", + "slide": "Presentation", + "poll": "Röstning", + "code": "Kod", + "todo": "Att-göra" + }, + "main_title": "CryptPad: Nollkunskap, samarbete i realtid" +} diff --git a/www/common/translations/messages.zh.json b/www/common/translations/messages.zh.json index c5099f745..898b1d5be 100644 --- a/www/common/translations/messages.zh.json +++ b/www/common/translations/messages.zh.json @@ -8,7 +8,8 @@ "drive": "磁碟", "whiteboard": "白板", "file": "檔案", - "media": "多媒體" + "media": "多媒體", + "kanban": "任务看板" }, "button_newpad": "富文件檔案", "button_newcode": "新代碼檔案",