diff --git a/and_so_it_begins.png b/and_so_it_begins.png index 556d55a18..0295eba2e 100644 Binary files a/and_so_it_begins.png and b/and_so_it_begins.png differ diff --git a/config.example.js b/config.example.js index f8c1499ae..43438aea6 100644 --- a/config.example.js +++ b/config.example.js @@ -18,7 +18,7 @@ module.exports = { httpHeaders: { "X-XSS-Protection": "1; mode=block", "X-Content-Type-Options": "nosniff", - // 'X-Frame-Options': 'SAMEORIGIN', + 'X-Frame-Options': 'SAMEORIGIN', }, contentSecurity: [ @@ -249,7 +249,7 @@ module.exports = { /* Setting this value to anything other than true will cause file upload * attempts to be rejected outright. */ - enableUploads: false, + enableUploads: true, /* If you have enabled file upload, you have the option of restricting it * to a list of users identified by their public keys. If this value is set diff --git a/cryptofist.png b/cryptofist.png index d1fad3eef..973083a2b 100644 Binary files a/cryptofist.png and b/cryptofist.png differ diff --git a/customize.dist/application_config.js b/customize.dist/application_config.js index a3da8eb3f..a1cb37bba 100644 --- a/customize.dist/application_config.js +++ b/customize.dist/application_config.js @@ -4,7 +4,7 @@ define(function() { /* Select the buttons displayed on the main page to create new collaborative sessions * Existing types : pad, code, poll, slide */ - config.availablePadTypes = ['drive', 'pad', 'code', 'slide', 'poll', 'whiteboard', 'file', 'contacts']; + config.availablePadTypes = ['drive', 'pad', 'code', 'slide', 'poll', 'whiteboard', 'file', 'todo', 'contacts']; config.registeredOnlyTypes = ['file', 'contacts']; /* Cryptpad apps use a common API to display notifications to users @@ -49,6 +49,7 @@ define(function() { users. */ config.loginSalt = ''; + config.badStateTimeout = 30000; return config; }); diff --git a/customize.dist/images/avatar.png b/customize.dist/images/avatar.png index 5605809af..019c0e657 100644 Binary files a/customize.dist/images/avatar.png and b/customize.dist/images/avatar.png differ diff --git a/customize.dist/images/realtime_small.png b/customize.dist/images/realtime_small.png index 5a101d563..7cac495f9 100644 Binary files a/customize.dist/images/realtime_small.png and b/customize.dist/images/realtime_small.png differ diff --git a/customize.dist/images/zk.png b/customize.dist/images/zk.png index 97da83ea6..a0444d75d 100644 Binary files a/customize.dist/images/zk.png and b/customize.dist/images/zk.png differ diff --git a/customize.dist/messages.js b/customize.dist/messages.js index 216dd4bbe..2f31a516e 100644 --- a/customize.dist/messages.js +++ b/customize.dist/messages.js @@ -151,10 +151,12 @@ define(req, function($, Default, Language) { messages._applyTranslation = function () { $('[data-localization]').each(translateText); $('[data-localization-append]').each(translateAppend); - $('#pad-iframe').contents().find('[data-localization]').each(translateText); $('[data-localization-title]').each(translateTitle); $('[data-localization-placeholder]').each(translatePlaceholder); + $('#pad-iframe').contents().find('[data-localization]').each(translateText); + $('#pad-iframe').contents().find('[data-localization-append]').each(translateAppend); $('#pad-iframe').contents().find('[data-localization-title]').each(translateTitle); + $('#pad-iframe').contents().find('[data-localization-placeholder]').each(translatePlaceholder); }; messages.driveReadme = '["BODY",{"class":"cke_editable cke_editable_themed cke_contents_ltr cke_show_borders","contenteditable":"true","spellcheck":"false","style":"color: rgb(51, 51, 51);"},' + diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 02e96a6cc..e5977ff8a 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -572,5 +572,13 @@ define([ ]; }; + Pages['/todo/'] = Pages['/todo/index.html'] = function () { + return [ + h('div#toolbar'), + h('div#container'), + loadingScreen() + ]; + }; + return Pages; }); diff --git a/customize.dist/share/frame.html b/customize.dist/share/frame.html deleted file mode 100644 index 8d2d63c0d..000000000 --- a/customize.dist/share/frame.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/customize.dist/share/frame.js b/customize.dist/share/frame.js deleted file mode 100644 index 2698372fd..000000000 --- a/customize.dist/share/frame.js +++ /dev/null @@ -1,173 +0,0 @@ -(function () { - - var Frame = {}; - - var uid = function () { - return Number(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)) - .toString(32).replace(/\./g, ''); - }; - - // create an invisible iframe with a given source - // append it to a parent element - // execute a callback when it has loaded - Frame.create = function (parent, src, onload, timeout) { - var iframe = document.createElement('iframe'); - - timeout = timeout || 10000; - var to = window.setTimeout(function () { - onload('[timeoutError] could not load iframe at ' + src); - }, timeout); - - iframe.setAttribute('id', 'cors-store'); - - iframe.onload = function (e) { - onload(void 0, iframe, e); - window.clearTimeout(to); - }; - // We must pass a unique parameter here to avoid cache problems in Firefox with - // the NoScript plugin: if the iframe's content is taken from the cache, the JS - // is not executed with NoScript.... - iframe.setAttribute('src', src + '?t=' + new Date().getTime()); - - parent.appendChild(iframe); - }; - - /* given an iframe with an rpc script loaded, create a frame object - with an asynchronous 'send' method */ - Frame.open = function (e, A, timeout) { - var win = e.contentWindow; - - var frame = {}; - - var listeners = {}; - var timeouts = {}; - - timeout = timeout || 5000; - - frame.accepts = function (o) { - return A.some(function (e) { - switch (typeof(e)) { - case 'string': return e === o; - case 'object': return e.test(o); - } - }); - }; - - var changeHandlers = frame.changeHandlers = []; - - frame.change = function (f) { - if (typeof(f) !== 'function') { - throw new Error('[Frame.change] expected callback'); - } - changeHandlers.push(f); - }; - - var _listener = function (e) { - if (!frame.accepts(e.origin)) { - console.log("message from %s rejected!", e.origin); - return; - } - var message = JSON.parse(e.data); - var uid = message._uid; - var error = message.error; - var data = message.data; - - if (!uid) { - console.log("No uid!"); - return; - } - - if (uid === 'change' && changeHandlers.length) { - changeHandlers.forEach(function (f) { - f(data); - }); - return; - } - - if (timeouts[uid]) { - window.clearTimeout(timeouts[uid]); - } - if (listeners[uid]) { - listeners[uid](error, data, e); - delete listeners[uid]; - } - }; - window.addEventListener('message', _listener); - - frame.close = function () { - window.removeEventListener('message', _listener); - }; - - /* method (string): (set|get|remove) - key (string) - data (string) - cb (function) */ - var send = frame.send = function (method, key, data, cb) { - var req = { - method: method, - key: key, - data: data, - }; - - var id = req._uid = uid(); - // uid must not equal 'change' - while(id === 'change') { - id = req._uid = uid(); - } - - if (typeof(cb) === 'function') { - //console.log("setting callback!"); - listeners[id] = cb; - //console.log("setting timeout of %sms", timeout); - timeouts[id] = window.setTimeout(function () { - // when the callback is executed it will clear this timeout - cb('[TimeoutError] request timed out after ' + timeout + 'ms'); - }, timeout); - } else { - console.log(typeof(cb)); - } - - win.postMessage(JSON.stringify(req), '*'); - }; - - frame.set = function (key, val, cb) { - send('set', key, val, cb); - }; - - frame.setBatch = function (map, cb) { - send('batchset', void 0, map, cb); - }; - - frame.get = function (key, cb) { - send('get', key, void 0, cb); - }; - - frame.getBatch = function (keys, cb) { - send('batchget', void 0, keys, cb); - }; - - frame.remove = function (key, cb) { - send('remove', key, void 0, cb); - }; - - frame.removeBatch = function (keys, cb) { - send('batchremove', void 0, keys, cb); - }; - - frame.keys = function (cb) { - send('keys', void 0, void 0, cb); - }; - - return frame; - }; - - if (typeof(module) !== 'undefined' && module.exports) { - module.exports = Frame; - } else if (typeof(define) === 'function' && define.amd) { - define(['jquery'], function () { - return Frame; - }); - } else { - window.Frame = Frame; - } -}()); diff --git a/customize.dist/share/respond.js b/customize.dist/share/respond.js deleted file mode 100644 index 7001ed16e..000000000 --- a/customize.dist/share/respond.js +++ /dev/null @@ -1,93 +0,0 @@ -var validDomains = [ - /cryptpad.fr$/i, -]; - -var isValidDomain = function (o) { - return validDomains.some(function (e) { - switch (typeof(e)) { - case 'string': return e === o; - case 'object': return e.test(o); - } - }); -}; - -var isArray = function (o) { return Object.prototype.toString.call(o) === '[object Array]'; }; - -window.addEventListener('message', function(e) { - if (!isValidDomain(e.origin)) { return; } - var payload = JSON.parse(e.data); - var parent = window.parent; - var respond = function (error, data) { - var res = { - _uid: payload._uid, - error: error, - data: data, - }; - parent.postMessage(JSON.stringify(res), '*'); - }; - - //console.log(payload); - - switch(payload.method) { - case 'set': - localStorage.setItem(payload.key, JSON.stringify(payload.data)); - respond(); - break; - case 'batchset': - if (isArray(payload.data) || typeof(payload.data) !== 'object') { - respond('[batchset.TypeError] expected key-value pairs to set'); - return; - } - Object.keys(payload.data).forEach(function (k) { - localStorage.setItem(k, JSON.stringify(payload.data[k])); - }); - respond(); - break; - case 'get': - respond(void 0, JSON.parse(localStorage.getItem(payload.key))); - break; - case 'batchget': - if (!isArray(payload.data)) { - respond('[batchget.TypeError] expected array of keys to return'); - return; - } - var map = {}; - payload.data.forEach(function (k) { - map[k] = JSON.parse(localStorage.getItem(k)); - }); - respond(void 0, map); - break; - case 'remove': - //console.log("Removing %s from localStorage", payload.key); - localStorage.removeItem(payload.key); - respond(); - break; - case 'batchremove': - if (!isArray(payload.data)) { - respond('[batchremove.TypeError] expected array of keys to remove'); - return; - } - payload.data.forEach(function (k) { - localStorage.removeItem(k); - }); - respond(); - break; - case 'keys': - respond(void 0, Object.keys(localStorage)); - break; - case undefined: - respond('No method supplied'); - break; - } -}); - -window.addEventListener('storage', function (ev) { - parent.postMessage(JSON.stringify({ - _uid: 'change', - data: { - key: ev.key, - oldValue: ev.oldValue, - newValue: ev.newValue, - } - }), '*'); -}); diff --git a/customize.dist/share/test.html b/customize.dist/share/test.html deleted file mode 100644 index 8352678b6..000000000 --- a/customize.dist/share/test.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - -

This page opens up an iframe which connects to beta.cryptpad.fr

- -

the idea is that some other subdomain of cryptpad.fr should be able to use this technique to open up a connection - to beta.cryptpad.fr and read from its local storage, so that we can make a seamless transition from beta - to www. or *.cryptpad.fr.

- -
-

If this box turns green, you've configured your scripts correctly.

- -

If your scripts are not working correctly, check that: -

    -
  1. /customize/share/respond.js is configured to respond to requests from your domain (see the validDomains variable)
  2. -
  3. the script attempting to connect to this endpoint is configured to listen for responses from it (in this case main.js)
  4. -
-
- - diff --git a/customize.dist/share/test.js b/customize.dist/share/test.js deleted file mode 100644 index a236dcfab..000000000 --- a/customize.dist/share/test.js +++ /dev/null @@ -1,124 +0,0 @@ -define([ - 'jquery', - '/customize/share/frame.js' -], function ($, Frame) { - - var domain = 'https://beta.cryptpad.fr'; - - var path = '/customize/share/frame.html'; - - var acceptResponseFrom = [ - /cryptpad.fr$/ - ]; - - var lock = 0; - - var unlock = function (i) { - lock--; - console.log("Test #%s passed", i + 1); - if (!lock) { $('#status').addClass('working'); } - }; - - var runTest = function (test, i) { - lock++; - test(i); - }; - - var randInt = function () { - return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); - }; - - var handleErr = function (err) { - if (err) { - console.error(err); - return true; - } - }; - - var areNull = function (keys, data) { - return !keys.some(function (k) { return data[k] !== null; }); - }; - - Frame.create(document.body, domain + path, function (err, iframe) { - if (handleErr(err)) { return; } - console.log("Created iframe"); - - // open a channel into the frame, accept messages from (sub)domain(s) - var frame = window.Beta = Frame.open(iframe, acceptResponseFrom); - - /* Run your actual tests */ - - [function (i) { // test #1 - var pew = randInt(); - frame.set('pew', pew, function (err) { - if (handleErr(err)) { return; } - frame.get('pew', function (err, num) { - if (handleErr(err)) { return; } - if (pew === num) { - frame.remove('pew', function (err) { - if (handleErr(err)) { return; } - - frame.get('pew', function (err, data) { - if (handleErr(err)) { return; } - if (data !== null) { return; } - unlock(i); - }); - }); - } - }); - }); - }, function (i) { // test #2 - var map = { - bang: randInt(), - pow: randInt(), - lol: randInt(), - }; - - var keys = Object.keys(map); - - frame.setBatch(map, function (err) { - if (handleErr(err)) { return; } - frame.getBatch(keys, function (err) { - if (handleErr(err)) { return; } - frame.removeBatch(Object.keys(map), function (err) { - if (handleErr(err)) { return; } - - frame.getBatch(keys, function (err, data) { - if (areNull(keys, data)) { unlock(i); } - }); - }); - }); - }); - }, function (i) { // test #3 - var map = { - bang2: true, - pow2: true, - lol2: true, - }; - - var keys = Object.keys(map); - - // set some keys to arbitrary values - frame.setBatch(map, function (err) { - if (handleErr(err)) { return; } - - // remove those values - frame.removeBatch(keys, function (err) { - if (handleErr(err)) { return; } - - // check that they were actually removed - frame.getBatch(keys, function (err, data) { - if (handleErr(err)) { return; } - - // all keys should be null after you've removed them - if (areNull(keys, data)) { - unlock(i); - return; - } - console.log("Expected all keys to return null"); - }); - }); - }); - }].forEach(runTest); - }); -}); diff --git a/customize.dist/src/less/cryptpad.less b/customize.dist/src/less/cryptpad.less index b298de021..3e08d9375 100644 --- a/customize.dist/src/less/cryptpad.less +++ b/customize.dist/src/less/cryptpad.less @@ -582,7 +582,7 @@ noscript { margin-top: 20px; .cryptpad-limit-bar { display: inline-block; - max-width: 40vw; + max-width: 100%; margin: 3px; box-sizing: border-box; border: 1px solid #999; diff --git a/customize.dist/src/less/mixins.less b/customize.dist/src/less/mixins.less index cd900a60c..68cca3cb4 100644 --- a/customize.dist/src/less/mixins.less +++ b/customize.dist/src/less/mixins.less @@ -138,3 +138,75 @@ background: white; } } + +.fileIcon { + li { + display: inline-block; + margin: 10px 10px; + width: 140px; + height: 140px; + text-align: center; + vertical-align: top; + overflow: hidden; + text-overflow: ellipsis; + padding-top: 5px; + padding-bottom: 5px; + + &:not(.selected):not(.selectedTmp) { + border: 1px solid #CCC; + } + .name { + width: 100%; + height: 48px; + margin: 8px 0; + display: inline-block; + //align-items: center; + //justify-content: center; + overflow: hidden; + //text-overflow: ellipsis; + word-wrap: break-word; + } + .truncated { + display: block; + position: absolute; + bottom: 0px; + left: 0; right: 0; + text-align: center; + } + img.icon { + height: 48px; + max-height: none; + max-width: none; + margin: 8px 0; + } + .fa { + display: block; + margin: auto; + font-size: 48px; + margin: 8px 0; + text-align: center; + &.listonly { + display: none; + } + } + } +} + +.sidebarButton { + button.btn { + background-color: @button-bg; + border-color: darken(@button-bg, 10%); + color: white; + &:hover { + background-color: darken(@button-bg, 10%); + } + &.btn-danger { + background-color: @button-red-bg; + border-color: darken(@button-red-bg, 10%); + color: white; + &:hover { + background-color: darken(@button-red-bg, 10%); + } + } + } +} diff --git a/customize.dist/src/less/sidebar-layout.less b/customize.dist/src/less/sidebar-layout.less index 02126b169..d16d9c019 100644 --- a/customize.dist/src/less/sidebar-layout.less +++ b/customize.dist/src/less/sidebar-layout.less @@ -7,9 +7,6 @@ @description-color: #777; @button-width: 400px; -@button-bg: #3066e5; -@button-alt-bg: #fff; -@button-red-bg: #e54e4e; .cp { @@ -72,25 +69,10 @@ border-left: 0px; } } - button.btn { - background-color: @button-bg; - border-color: darken(@button-bg, 10%); - color: white; - &:hover { - background-color: darken(@button-bg, 10%); - } - &.btn-danger { - background-color: @button-red-bg; - border-color: darken(@button-red-bg, 10%); - color: white; - &:hover { - background-color: darken(@button-red-bg, 10%); - } - } - } &>div { margin: 10px 0; } + .sidebarButton; } } } diff --git a/customize.dist/src/less/toolbar.less b/customize.dist/src/less/toolbar.less index 247f5302b..f6ac5b1ac 100644 --- a/customize.dist/src/less/toolbar.less +++ b/customize.dist/src/less/toolbar.less @@ -29,6 +29,7 @@ .settingsColor { color: @toolbar-settings-bg; } .profileColor { color: @toolbar-settings-bg; } .defaultColor { color: @toolbar-default-bg; } +.todoColor { color:@toolbar-todo-bg; } .toolbar-container { display: flex; @@ -284,6 +285,11 @@ body { @color: @toolbar-profile-color; .addToolbarColors(@color, @bgcolor); } + &.app-todo { + @bgcolor: @toolbar-todo-bg; + @color: @toolbar-todo-color; + .addToolbarColors(@color, @bgcolor); + } } diff --git a/customize.dist/src/less/variables.less b/customize.dist/src/less/variables.less index ad7695c00..ccd1f065f 100644 --- a/customize.dist/src/less/variables.less +++ b/customize.dist/src/less/variables.less @@ -109,7 +109,8 @@ @toolbar-settings-color: @colortheme_settings-color; @toolbar-profile-bg: @colortheme_profile-bg; @toolbar-profile-color: @colortheme_profile-color; - +@toolbar-todo-bg: #7bccd1; +@toolbar-todo-color: #000; @topbar-back: #fff; @topbar-color: #000; @@ -129,6 +130,10 @@ @category-bg: #f4f4f4; +@button-bg: #3066e5; +@button-alt-bg: #fff; +@button-red-bg: #e54e4e; + .unselectable () { -webkit-touch-callout: none; -webkit-user-select: none; diff --git a/customize.dist/template.js b/customize.dist/template.js index cf5adb46d..340ec11d1 100644 --- a/customize.dist/template.js +++ b/customize.dist/template.js @@ -12,7 +12,7 @@ $(function () { var Messages = Cryptpad.Messages; var $body = $('body'); var isMainApp = function () { - return /^\/(pad|code|slide|poll|whiteboard|file|media|contacts|drive|settings|profile)\/$/.test(location.pathname); + return /^\/(pad|code|slide|poll|whiteboard|file|media|contacts|drive|settings|profile|todo)\/$/.test(location.pathname); }; var rightLink = function (ref, loc, txt) { @@ -112,7 +112,7 @@ $(function () { ]) ]) ]), - h('div.version-footer', "CryptPad v1.11.0 (Lutin)") + h('div.version-footer', "CryptPad v1.12.0 (Minotaur)") ])); var pathname = location.pathname; @@ -166,6 +166,9 @@ $(function () { } else if (/^\/profile\//.test(pathname)) { $('body').append(h('body', Pages[pathname]()).innerHTML); require([ '/profile/main.js', ], ready); + } else if (/^\/todo\//.test(pathname)) { + $('body').append(h('body', Pages[pathname]()).innerHTML); + require([ '/todo/main.js', ], ready); } }); diff --git a/customize.dist/translations/messages.de.js b/customize.dist/translations/messages.de.js index 04b57aecc..ec4d092a5 100644 --- a/customize.dist/translations/messages.de.js +++ b/customize.dist/translations/messages.de.js @@ -5,8 +5,8 @@ // the language dropdowns that are shown throughout Cryptpad's interface out._languageName = 'German'; - out.main_title = "Cryptpad: Echtzeitzusammenarbeit, ohne Vorwissen"; - out.main_slogan = "Einigkeit macht stark - Zusammenarbeit ist der Schlüssel"; // Der Slogan sollte evtl. besser englisch bleiben. + out.main_title = "Cryptpad: Echtzeitzusammenarbeit, ohne Preisgabe von Informationen"; + out.main_slogan = "Einigkeit ist Stärke - Zusammenarbeit der Schlüssel"; // Der Slogan sollte evtl. besser englisch bleiben. out.type = {}; out.type.pad = 'Pad'; @@ -44,16 +44,16 @@ out.changeNamePrompt = 'Ändere deinen Namen (oder lasse dieses Feld leer um anonym mitzuarbeiten): '; - out.clickToEdit = "Zum bearbeiten klicken"; + out.clickToEdit = "Zum Bearbeiten klicken"; - out.forgetButtonTitle = 'Entferne dieses Dokumnt von deiner Startseitenliste'; + out.forgetButtonTitle = 'Entferne dieses Dokument von deiner Startseitenliste'; out.forgetPrompt = 'Mit dem Klick auf OK wird das Dokument aus deinem lokalen Speicher gelöscht. Fortfahren?'; out.shareButton = 'Teilen'; - out.shareSuccess = 'URL wurde in die Zwischenablage kopiert'; + out.shareSuccess = 'Die URL wurde in die Zwischenablage kopiert'; out.presentButtonTitle = "Präsentationsmodus starten"; - out.presentSuccess = 'Hit ESC to exit presentation mode'; + out.presentSuccess = 'Drücke ESC um den Präsentationsmodus zu verlassen!'; out.backgroundButtonTitle = 'Die Hintergrundfarbe der Präsentation ändern'; out.colorButtonTitle = 'Die Textfarbe im Präsentationsmodus ändern'; @@ -73,36 +73,43 @@ out.tryIt = 'Probier\'s aus!'; - out.okButton = 'OK (enter)'; - out.cancelButton = 'Abbrechen (esc)'; + out.okButton = 'OK (Enter)'; + out.cancelButton = 'Abbrechen (ESC)'; // Polls - out.poll_title = "Kenntnisfreier Datumsplaner"; - out.poll_subtitle = "Kenntnisfreies, echtzeit planen"; + out.poll_title = "Datumsplaner ohne Preisgabe von Infos"; + out.poll_subtitle = "Echtzeit-planen ohne Preisgabe von Infos"; - out.poll_p_save = "Deine Einstellungen werden sofort automatisch gesichtert."; + out.poll_p_save = "Deine Einstellungen werden sofort automatisch gesichert."; out.poll_p_encryption = "Alle Eingaben sind verschlüsselt, deshalb haben nur Leute im Besitz des Links Zugriff. Selbst der Server sieht nicht was du änderst."; out.wizardLog = "Klicke auf den Button links oben um zur Umfrage zurückzukehren."; out.wizardTitle = "Nutze den Assistenten um deine Umfrage zu erstellen."; out.wizardConfirm = "Bist du wirklich bereit die angegebenen Optionen bereits zu deiner Umfrage hinzuzufügen?"; - out.poll_closeWizardButton = "Assistenten schließen"; - out.poll_closeWizardButtonTitle = "Assistenten schließen"; + + out.poll_publish_button = "Veröffentlichen"; + out.poll_admin_button = "Admin"; + out.poll_create_user = "Neuen Benutzer hinzufügen"; + out.poll_create_option = "Neue Option hinzufügen"; + out.poll_commit = "Einchecken"; + + out.poll_closeWizardButton = "Assistent schließen"; + out.poll_closeWizardButtonTitle = "Assistent schließen"; out.poll_wizardComputeButton = "Optionen übernehmen"; out.poll_wizardClearButton = "Tabelle leeren"; - out.poll_wizardDescription = "Erstellt automatisch die Optionen indem eine beliebige Anzahl von Daten und Zeiten eingegeben wird."; + out.poll_wizardDescription = "Erstelle die Optionen automatisch, indem du eine beliebige Anzahl von Daten und Zeiten eingibst."; out.poll_wizardAddDateButton = "+ Daten"; out.poll_wizardAddTimeButton = "+ Zeiten"; out.poll_optionPlaceholder = "Option"; out.poll_userPlaceholder = "Dein Name"; out.poll_removeOption = "Bist du sicher, dass du diese Option entfernen möchtest?"; - out.poll_removeUser = "Bist du sicher, dass du diese Nutzer*in entfernen möchtest?"; + out.poll_removeUser = "Bist du sicher, dass du diese(n) Nutzer*in entfernen möchtest?"; out.poll_titleHint = "Titel"; - out.poll_descriptionHint = "Beschreibung"; + out.poll_descriptionHint = "Beschreibe deine Abstimmung und publiziere sie mit dem 'Veröffentlichen'-Knopf wenn du fertig bis. Jeder mit dem Link kann die Beschreibung ändern."; // index.html @@ -112,10 +119,10 @@ out.main_about_p2 = 'Für Fragen und Kommentare kannst du uns tweeten, ein Ticket auf Github öffnen, hi auf irc sagen (irc.freenode.net), oder eine Mail zukommen lassen.'; - out.button_newpad = 'NEUES WYSIWYG-PAD ERSTELLEN'; - out.button_newcode = 'NEUES CODE-PAD ERSTELLEN'; - out.button_newpoll = 'NEUE ABSTIMMUNG ERSTELLEN'; - out.button_newslide = 'NEUE PRÄSENTATION ERSTELLEN'; + out.button_newpad = 'Neues WYSIWYG-Pad erstellen'; + out.button_newcode = 'Neues Code-Pad erstellen'; + out.button_newpoll = 'Neue Abstimmung erstellen'; + out.button_newslide = 'Neue Präsentation erstellen'; // privacy.html diff --git a/customize.dist/translations/messages.es.js b/customize.dist/translations/messages.es.js index f73731b01..10b722f4a 100644 --- a/customize.dist/translations/messages.es.js +++ b/customize.dist/translations/messages.es.js @@ -18,7 +18,7 @@ define(function () { out.synchronizing = "Sincronización"; out.reconnecting = "Reconectando..."; out.lag = "Retraso"; - out.readonly = 'Solo lectura'; + out.readonly = 'Sólo lectura'; out.anonymous = 'Anónimo'; out.yourself = "Tú mismo"; out.anonymousUsers = "usuarios anónimos"; @@ -30,8 +30,8 @@ define(function () { out.editor = "editor"; out.editors = "editores"; - out.greenLight = "Todo funciona bién"; - out.orangeLight = "La conexión es lenta y podria impactar la experiencia"; + out.greenLight = "Todo funciona bien"; + out.orangeLight = "La conexión es lenta y podría afectar la experiencia"; out.redLight = "Has sido desconectado de la sesión"; out.importButtonTitle = 'Importar un documento de tus archivos locales'; @@ -44,7 +44,7 @@ define(function () { out.clickToEdit = "Haz clic para cambiar"; out.forgetButtonTitle = 'Eliminar este documento de la lista en la pagina de inicio'; - out.forgetPrompt = 'Pulser OK eliminará este documento del almacenamiento local (localStorage), ¿estás seguro?'; + out.forgetPrompt = 'Pulsar OK eliminará este documento del almacenamiento local (localStorage), ¿estás seguro?'; out.shareButton = 'Compartir'; out.shareSuccess = 'URL copiada al portapapeles'; @@ -57,10 +57,10 @@ define(function () { out.editShare = "URL de edición compartida"; out.editShareTitle = "Copiar la URL de edición al portapapeles"; - out.viewShare = "Compartir URL de solo lectura"; - out.viewShareTitle = "Copiar la URL de solo lectura al portapapeles"; + out.viewShare = "Compartir URL de sólo lectura"; + out.viewShareTitle = "Copiar la URL de sólo lectura al portapapeles"; out.viewOpen = "Ver en pestaña nueva"; - out.viewOpenTitle = "Abrir el documento en solo lectura en una pestaña nueva"; + out.viewOpenTitle = "Abrir el documento en sólo lectura en una pestaña nueva"; out.notifyJoined = "{0} se ha unido a la sesión de colaboración"; out.notifyRenamed = "{0} ahora se conoce como {1}"; @@ -76,10 +76,10 @@ define(function () { out.poll_title = "Selector de fecha Zero Knowledge"; out.poll_subtitle = "Agenda en tiempo real Zero Knowledge"; - out.poll_p_save = "Tus configuraciones se actualizan instantaneamente, no es necesario guardar cambios."; - out.poll_p_encryption = "Todos los datos entrados son cifrados, solo las personas que poseen el enlace tienen acceso. Incluso el servidor no puede ver el contenido."; + out.poll_p_save = "Tus configuraciones se actualizan instantáneamente, no es necesario guardar cambios."; + out.poll_p_encryption = "Todos los datos entrados son cifrados, sólo las personas que poseen el enlace tienen acceso. Incluso el servidor no puede ver el contenido."; - out.wizardLog = "Presiona el boton en la parte superior izquierda para volver a la encuesta"; + out.wizardLog = "Presiona el botón en la parte superior izquierda para volver a la encuesta"; out.wizardTitle = "Utiliza el asistente para crear tu encuesta"; out.wizardConfirm = "¿Estás realmente seguro de agregar estas opciones a tu encuesta?"; @@ -87,14 +87,14 @@ define(function () { out.poll_closeWizardButtonTitle = "Cerrar el asistente"; out.poll_wizardComputeButton = "Generar opciones"; out.poll_wizardClearButton = "Limpiar tabla"; - out.poll_wizardDescription = "Automaticamente crear opciones ingresando cualquier cantidad de fechas y horas"; + out.poll_wizardDescription = "Crear opciones automáticamente ingresando cualquier cantidad de fechas y horas"; out.poll_wizardAddDateButton = "+ Fechas"; out.poll_wizardAddTimeButton = "+ Horas"; out.poll_optionPlaceholder = "Opción"; out.poll_userPlaceholder = "Tu nombre"; - out.poll_removeOption = "¿Estás seguro que quieres eliminar esta opción?"; - out.poll_removeUser = "¿Estás seguro que quieres eliminar este usuario?"; + out.poll_removeOption = "¿Estás seguro de que quieres eliminar esta opción?"; + out.poll_removeUser = "¿Estás seguro de que quieres eliminar este usuario?"; out.poll_titleHint = "Título"; out.poll_descriptionHint = "Descripción"; @@ -104,9 +104,13 @@ define(function () { out.main_p2 = 'Este proyecto utiliza el editor de texto visual CKEditor, CodeMirror, y el motor en tiempo real ChainPad.'; out.main_howitworks = '¿Cómo funciona?'; out.main_howitworks_p1 = "CryptPad utiliza una variante del algoritmo de transformación operacional (página en inglés) que es capaz de encontrar un consenso distribuido usando un Blockchain Nakamoto (página en inglés), popularizado por Bitcoin. De esta manera el algoritmo puede evitar la necesidad de un servidor central para resolver conflictos de edición de la transformación operacional y sin necesidad de resolver conflictos, el servidor puede mantenerse inconsciente del contenido que se está editando en el pad."; +<<<<<<< HEAD out.main_about_p2 = 'Si tienes preguntas o comentarios, puedes enviarnos un tweet, abrir un issue en GitHub. saludarnos en nuestro canal Matrix o en IRC (#cryptpad on irc.freenode.net), o envianos un email.'; +======= + out.main_about_p2 = 'Si tienes preguntas o comentarios, puedes enviarnos un tweet, abrir un issue en GitHub, saludarnos en nuestro canal IRC (irc.freenode.net), o envíanos un email.'; +>>>>>>> fb13e656b7b3ee611bf195a1f1ccf7475f2f1ee4 - out.button_newpad = 'Crear nuevo pad de texto enriquezido'; + out.button_newpad = 'Crear nuevo pad de texto enriquecido'; out.button_newcode = 'Crear nuevo pad de código'; out.button_newpoll = 'Crear nueva encuesta'; out.button_newslide = 'Crear nueva presentación'; @@ -115,15 +119,15 @@ define(function () { out.policy_title = 'Política de privacidad Cryptpad'; out.policy_whatweknow = 'Qué sabemos sobre tí'; - out.policy_whatweknow_p1 = 'Como cualquier aplicación que está en la red, Cryptpad tiene acceso a los metadatos expuestos por el protócolo HTTP. Esto incluye tu dirección IP, y otros headers HTTP que pueden ser utilizados para identificar a tu navegador propio. Puedes ver la información que comparte tu navegador visitando WhatIsMyBrowser.com (página en inglés).'; - out.policy_whatweknow_p2 = 'Nosotros usamos Piwik, una plataforma de analítica de datos abierta, para mejor conocer a nuestros usuarios. Piwik nos dice como encontráste Cryptpad, en entrada manual, por un motor de busquéda, or por referal de otra página como Reddit o Twitter. También aprendemos cuándo visitas, que páginas vees en nuestra web, y cuánto tiempo te quedas en cada una.'; + out.policy_whatweknow_p1 = 'Como cualquier aplicación que está en la red, Cryptpad tiene acceso a los metadatos expuestos por el protocolo HTTP. Esto incluye tu dirección IP, y otros headers HTTP que pueden ser utilizados para identificar a tu navegador propio. Puedes ver la información que comparte tu navegador visitando WhatIsMyBrowser.com (página en inglés).'; + out.policy_whatweknow_p2 = 'Nosotros usamos Piwik, una plataforma de analítica de datos abierta, para conocer mejor a nuestros usuarios. Piwik nos dice como encontraste Cryptpad, en entrada manual, por un motor de búsqueda, or por referal de otra página como Reddit o Twitter. También aprendemos cuándo visitas, qué páginas ves en nuestra web, y cuánto tiempo te quedas en cada una.'; out.policy_howweuse = 'Cómo usamos lo que aprendemos'; out.policy_howweuse_p1 = 'Usamos esta información para tomar mejores decisiones para promocionar Cryptpad, para evaluar cuáles de nuestros esfuerzos han sido exitosos. La información sobre tu ubicación nos permite saber si deberíamos considerar mejor soporte para idiomas diferentes al inglés.'; - out.policy_howweuse_p2 = "La información sobre tu navegador (en escritorio u movil) nos ayuda a saber qué caracteristicas que debemos mejorar. Nuestro equipo de desarrollo es pequeño, e intentamos tomar decisiones que beneficien a la experiencia de la mayoria de nuestros usuarios."; + out.policy_howweuse_p2 = "La información sobre tu navegador (en escritorio o móvil) nos ayuda a saber qué características que debemos mejorar. Nuestro equipo de desarrollo es pequeño, e intentamos tomar decisiones que beneficien a la experiencia de la mayoría de nuestros usuarios."; out.policy_whatwetell = 'Lo que decimos a otros sobre tí'; - out.policy_whatwetell_p1 = 'No suministramos la información que colectamos a terceros a menos de ser legalmente obligados a hacerlo.'; + out.policy_whatwetell_p1 = 'No suministramos la información que recolectamos a terceros a menos de estar legalmente obligados a hacerlo.'; out.policy_links = 'Enlaces a otras páginas'; - out.policy_links_p1 = 'Esta web contiene enlaces a otros sitios, incluyendo algunos producidos por otras organizaciones. No somos responsables por el tratamiento de la privacidad de los datos y el contenido de páginas externas. Como regla general, los enlaces externos se abren en una nueva pestaña del navegador, para clarificar que estás abandonando a Cryptpad.fr.'; + out.policy_links_p1 = 'Esta web contiene enlaces a otros sitios, incluyendo algunos producidos por otras organizaciones. No somos responsables del tratamiento de la privacidad de los datos ni el contenido de páginas externas. Como regla general, los enlaces externos se abren en una nueva pestaña del navegador, para clarificar que estás abandonando a Cryptpad.fr.'; out.policy_ads = 'Anuncios'; out.policy_ads_p1 = 'Nosotros no mostramos anuncios, pero podemos poner enlaces a las organizaciones que financian nuestro trabajo de investigación.'; out.policy_choices = 'Lo que puedes hacer'; @@ -135,8 +139,8 @@ define(function () { out.tos_title = "Condiciones de servicio Cryptpad"; out.tos_legal = "Por favor, no seas malicioso, abusivo o hagas algo ilegal."; - out.tos_availability = "Esperamos que este servicio te parezca util, pero nuestra disponibilidad o rendimiento no pueden ser garantizados. Por favor, exporta tus datos regularmente."; - out.tos_e2ee = "Los documentos Cryptpad pueden ser leidos o modificados por cualquiera que pueda adivinar o que pueda tener el enlace. Recomendamos que utilizes mensajes cifrados de punto a punto (e2ee) para compartir URLs, no asumimos ninguna responsabilidad en el evento de alguna fuga."; + out.tos_availability = "Esperamos que este servicio te parezca útil, pero nuestra disponibilidad o rendimiento no pueden ser garantizados. Por favor, exporta tus datos regularmente."; + out.tos_e2ee = "Los documentos Cryptpad pueden ser leídos o modificados por cualquiera que pueda adivinar o que pueda tener el enlace. Recomendamos que utilices mensajes cifrados de punto a punto (e2ee) para compartir URLs, no asumimos ninguna responsabilidad en el evento de alguna fuga."; out.tos_logs = "Los metadatos entregados por el navegador al servidor pueden ser almacenados para la mantenencia del servicio."; out.tos_3rdparties = "No proveemos datos individualizados a terceros a menos de ser obligados por la ley."; @@ -152,8 +156,8 @@ define(function () { out.header_logoTitle = 'Ir a la página principal'; out.websocketError = "Error al conectarse al servidor WebSocket"; - out.typeError = "Este documento no es compatible con la applicación seleccionada"; - out.onLogout = "Tu sesión está cerrada, haz clic aquí para iniciar sesión
o apreta sobre Escape para acceder al documento en modo solo lectura."; + out.typeError = "Este documento no es compatible con la aplicación seleccionada"; + out.onLogout = "Tu sesión está cerrada, haz clic aquí para iniciar sesión
o pulsa Escape para acceder al documento en modo sólo lectura."; out.loading = "Cargando..."; out.error = "Error"; out.language = "Idioma"; @@ -185,37 +189,37 @@ define(function () { out.fm_creation = "Creación"; out.fm_forbidden = "Acción prohibida"; out.fm_originalPath = "Enlace original"; - out.fm_noname = "Documento sín título"; - out.fm_emptyTrashDialog = "¿Seguro qué quieres vaciar la papelera?"; - out.fm_removeSeveralPermanentlyDialog = "¿Seguro qué quieres eliminar estos {0} elementos de la papelera para siempre?"; - out.fm_removePermanentlyDialog = "¿Seguro qué quieres eliminar este elemento para siempre?"; - out.fm_removeSeveralDialog = "¿Seguro qué quieres mover estos {0} elementos a la papelera?"; - out.fm_removeDialog = "¿Seguro qué quieres mover {0} a la papelera?"; + out.fm_noname = "Documento sin título"; + out.fm_emptyTrashDialog = "¿Seguro que quieres vaciar la papelera?"; + out.fm_removeSeveralPermanentlyDialog = "¿Seguro que quieres eliminar estos {0} elementos de la papelera para siempre?"; + out.fm_removePermanentlyDialog = "¿Seguro que quieres eliminar este elemento para siempre?"; + out.fm_removeSeveralDialog = "¿Seguro que quieres mover estos {0} elementos a la papelera?"; + out.fm_removeDialog = "¿Seguro que quieres mover {0} a la papelera?"; out.fm_restoreDialog = "¿Seguro que quieres recuperar {0}?"; out.fm_unknownFolderError = "La carpeta seleccionada ya no existe. Abriendo la carpeta anterior..."; - out.fm_contextMenuError = "No se puedo abrir el menú para este elemento. Si persiste el problema, recarga la página."; - out.fm_selectError = "No se puedo abrir el elemento. Si persiste el problema, recarga la página."; + out.fm_contextMenuError = "No se pudo abrir el menú para este elemento. Si persiste el problema, recarga la página."; + out.fm_selectError = "No se pudo abrir el elemento. Si persiste el problema, recarga la página."; out.fm_info_root = "Crea carpetas aquí para organizar tus documentos."; - out.fm_info_unsorted = "Contiene todos los documentos que has visitado que no estan organizados en \"Documentos\" o movidos a la \"Papelera\"."; + out.fm_info_unsorted = "Contiene todos los documentos que has visitado que no están organizados en \"Documentos\" o movidos a la \"Papelera\"."; out.fm_info_template = "Contiene todas las plantillas que puedes volver a usar para crear nuevos documentos."; out.fm_info_allFiles = "Contiene todos los archivos de \"Documentos\", \"Sin organizar\" y \"Papelera\". No puedes mover o eliminar archivos aquí."; - out.fm_alert_backupUrl = "Enlace de copia de seguridad para este drive. Te recomendamos muy fuertemente que lo guardes secreto.
Lo puedes usar para recuparar todos tus archivos en el caso que la memoria de tu navegador se borre.
Cualquiera con este enlace puede editar o eliminar todos los archivos en el explorador.
"; + out.fm_alert_backupUrl = "Enlace de copia de seguridad para este drive. Te recomendamos encarecidamente que lo guardes secreto.
Lo puedes usar para recuperar todos tus archivos en el caso que la memoria de tu navegador se borre.
Cualquiera con este enlace puede editar o eliminar todos los archivos en el explorador.
"; out.fm_backup_title = "Enlace de copia de seguridad"; out.fm_nameFile = "¿Cómo quieres nombrar este archivo?"; out.fc_newfolder = "Nueva carpeta"; out.fc_rename = "Cambiar nombre"; out.fc_open = "Abrir"; - out.fc_open_ro = "Abrir (solo lectura)"; + out.fc_open_ro = "Abrir (sólo lectura)"; out.fc_delete = "Eliminar"; out.fc_restore = "Recuperar"; out.fc_remove = "Eliminar para siempre"; out.fc_empty = "Vaciar la papelera"; - out.fc_prop = "Propriedades"; + out.fc_prop = "Propiedades"; out.fo_moveUnsortedError = "No puedes mover una carpeta en la lista de documentos no organizados"; out.fo_existingNameError = "Nombre ya utilizado en esta carpeta. Por favor elige otro."; out.fo_moveFolderToChildError = "No puedes mover una carpeta en una de sus subcarpetas"; - out.fo_unableToRestore = "No se pudo restaurar este archivo a la localización de orígen. Puedes intentar moverlo a otra localización."; - out.fo_unavailableName = "Un archivo o carpeta ya tiene este nombre. Cambiálo y vuelve a intentarlo."; + out.fo_unableToRestore = "No se pudo restaurar este archivo a la localización de origen. Puedes intentar moverlo a otra localización."; + out.fo_unavailableName = "Un archivo o carpeta ya tiene este nombre. Cámbialo y vuelve a intentarlo."; out.login_login = "Iniciar sesión"; out.login_makeAPad = "Crear documento anónimo"; out.login_nologin = "Ver documentos locales"; @@ -226,52 +230,52 @@ define(function () { out.login_password = "Contraseña"; out.login_confirm = "Confirmar contraseña"; out.login_remember = "Recuérdame"; - out.login_hashing = "Tratamiento de datos, esto puede tardar un poco."; + out.login_hashing = "Generando hash de tu contraseña, esto puede tardar un poco."; out.login_hello = "Hola {0},"; out.login_helloNoName = "Hola,"; out.login_accessDrive = "Acceder a tu drive"; out.login_orNoLogin = "o"; - out.login_noSuchUser = "Credenciales invalidos. Inténtalo de nuevo, o registrate"; - out.login_invalUser = "Nombre de usuario requirido"; - out.login_invalPass = "Contraseña requirida"; - out.login_unhandledError = "Un error inesperado se produjo :("; + out.login_noSuchUser = "Credenciales inválidos. Inténtalo de nuevo, o regístrate"; + out.login_invalUser = "Nombre de usuario requerido"; + out.login_invalPass = "Contraseña requerida"; + out.login_unhandledError = "Ha ocurrido un error inesperado :("; out.register_importRecent = "Importar historial (recomendado)"; - out.register_acceptTerms = "Accepto los términos de servicio"; + out.register_acceptTerms = "Acepto los términos de servicio"; out.register_passwordsDontMatch = "Las contraseñas no corresponden"; - out.register_mustAcceptTerms = "Tienes que acceptar los términos de servicio"; + out.register_mustAcceptTerms = "Tienes que aceptar los términos de servicio"; out.register_mustRememberPass = "No podemos reiniciar tu contraseña si la olvidas. ¡Es muy importante que la recuerdes! Marca la casilla para confirmarlo."; out.register_header = "Bienvenido a CryptPad"; - out.register_explanation = ["

Vamos a ver algunas cosas antes

", ""].join(''); + out.register_explanation = ["

Vamos a ver algunas cosas antes

", ""].join(''); out.settings_title = "Preferencias"; out.settings_save = "Guardar"; out.settings_backupTitle = "Copia de seguridad"; out.settings_backup = "Copia de seguridad"; - out.settings_restore = "Recuparar datos"; + out.settings_restore = "Recuperar datos"; out.settings_reset = "Quita todos los documentos de tu CryptDrive"; out.settings_resetPrompt = "Esta acción eliminará todos tus documentos.
¿Seguro que quieres continuar?
Introduce “I love CryptPad” para confirmar."; out.settings_resetDone = "¡Tu drive ahora está vacio!"; out.settings_resetTips = "Consejos en CryptDrive"; out.settings_resetTipsButton = "Restaurar consejos"; out.settings_resetTipsDone = "Todos los consejos ahora están visibles"; - out.main_info = "

Collabora en Confidencia


Cultiva ideas juntos con documentos compartidos con tecnología Zero Knowledge que protege tu privacidad."; + out.main_info = "

Colabora con Confianza


Cultiva ideas juntos con documentos compartidos con tecnología Zero Knowledge que protege tu privacidad."; out.main_zeroKnowledge = "Zero Knowledge"; - out.main_zeroKnowledge_p = "No tienes que confiar que no veremos tus documentos, con la tecnología Zero Knowledge de CryptPad no podemos. Aprende más sobre como protegemos tu Privacidad y Seguridad."; + out.main_zeroKnowledge_p = "No tienes que confiar en que no veremos tus documentos, con la tecnología Zero Knowledge de CryptPad no podemos. Aprende más sobre cómo protegemos tu Privacidad y Seguridad."; out.main_writeItDown = "Escríbelo"; - out.main_writeItDown_p = "Los mejores proyectos vienen de las más pequeñas ideas. Escribe tus momentos de inspiración y ideas inesperadas porque nunca sabrás cual será tu próximo descubrimiento."; + out.main_writeItDown_p = "Los mejores proyectos vienen de las más pequeñas ideas. Escribe tus momentos de inspiración e ideas inesperadas porque nunca sabrás cuál será tu próximo descubrimiento."; out.main_share = "Comparte el enlace, comparte el pad"; - out.main_share_p = "Cultiva ideas juntos: ten reuniones eficaces, collabora en listas y haz presentaciones rápidas en todos tus dispositivos."; - out.main_organize = "Organizate"; - out.main_organize_p = "Con CryptPad Drive, porta tu atención en lo más importante. Carpetas te permiten organizar tus proyectos y tener una visión global de donde van las cosas."; - out.main_richText = "Editor de Texto Enriquezido"; - out.main_richText_p = "Collabora en texto enriquezido con nuestro editor Zero Knowledge en tiempo real CkEditor."; + out.main_share_p = "Cultiva ideas juntos: ten reuniones eficaces, colabora en listas y haz presentaciones rápidas en todos tus dispositivos."; + out.main_organize = "Organízate"; + out.main_organize_p = "Con CryptPad Drive, mantén tu atención en lo más importante. Las carpetas te permiten organizar tus proyectos y tener una visión global de dónde van las cosas."; + out.main_richText = "Editor de Texto Enriquecido"; + out.main_richText_p = "Colabora en texto enriquecido con nuestro editor Zero Knowledge en tiempo real CkEditor."; out.main_code = "Editor de código"; out.main_code_p = "Edita código fuente para tus programas con nuestro editor Zero Knowledge en tiempo real CodeMirror."; out.main_slide = "Editor de presentación"; - out.main_slide_p = "Crea presentaciones utilizando Markdown, y visualizalos en tu navegador"; + out.main_slide_p = "Crea presentaciones utilizando Markdown, y visualízalos en tu navegador"; out.main_poll = "Encuestas"; out.main_poll_p = "Planifica tus reuniones y eventos, o vota para la mejor solución a un problema."; out.main_drive = "CryptDrive"; - out.footer_applications = "Applicaciones"; + out.footer_applications = "Aplicaciones"; out.footer_contact = "Contacto"; out.footer_aboutUs = "Acerca de nosotros"; out.about = "Acerca de nosotros"; @@ -282,49 +286,49 @@ define(function () { // 1.1.0 - Bunyip out.movedToTrash = "Este pad fue movido a la papelera.
Acceder a mi Drive"; out.fm_newFile = "Nuevo pad"; - out.fm_type = "Típo"; + out.fm_type = "Tipo"; out.fm_categoryError = "No se pudo abrir la categoría seleccionada, mostrando la raíz."; out.settings_userFeedbackHint1 = "CryptPad suministra informaciones muy básicas al servidor, para ayudarnos a mejorar vuestra experiencia."; out.settings_userFeedbackHint2 = "El contenido de tu pad nunca será compartido con el servidor."; out.settings_userFeedback = "Activar feedback"; - out.settings_anonymous = "No has iniciado sesión. Tus ajustes se aplicarán solo a este navegador."; + out.settings_anonymous = "No has iniciado sesión. Tus ajustes se aplicarán sólo a este navegador."; out.blog = "Blog"; out.initialState = [ '

', - 'Esto es CryptPad, el editor collaborativo en tiempo real Zero Knowledge. Todo está guardado cuando escribes.', + 'Esto es CryptPad, el editor colaborativo en tiempo real Zero Knowledge. Todo está guardado cuando escribes.', '
', - 'Comparte el enlace a este pad para editar con amigos o utiliza el botón  Compartir  para obtener un enlace solo lectura que permite leer pero no escribir.', + 'Comparte el enlace a este pad para editar con amigos o utiliza el botón  Compartir  para obtener un enlace sólo lectura que permite leer pero no escribir.', '

', '

', - 'Vamos, solo empezia a escribir...', + 'Vamos, empieza a escribir...', '

', '

 

' ].join(''); - out.codeInitialState = "/*\n Esto es CryptPad, el editor collaborativo en tiempo real zero knowledge.\n Lo que escribes aquí es cifrado, con lo cual solo las personas con el enlace pueden accederlo.\n Incluso el servidor no puede ver lo que escribes.\n Lo que ves aquí, lo que escuchas aquí, cuando sales, se queda aquí\n*/"; - out.slideInitialState = "# CryptSlide\n* Esto es CryptPad, el editor collaborativo en tiempo real zero knowledge.\n* Lo que escribes aquí es cifrado, con lo cual solo las personas con el enlace pueden accederlo.\n* Incluso el servidor no puede ver lo que escribes.\n* Lo que ves aquí, lo que escuchas aquí, cuando sales, se queda aquí\n\n---\n# Como utilizarlo\n1. Escribe tu contenido en Markdown\n - Puedes aprender más sobre Markdown [aquí](http://www.markdowntutorial.com/)\n2. Separa tus slides con ---\n3. Haz clic en \"Presentar\" para ver el resultado - Tus slides se actualizan en tiempo real"; + out.codeInitialState = "/*\n Esto es CryptPad, el editor colaborativo en tiempo real zero knowledge.\n Lo que escribes aquí está cifrado de manera que sólo las personas con el enlace pueden acceder a ello.\n Incluso el servidor no puede ver lo que escribes.\n Lo que ves aquí, lo que escuchas aquí, cuando sales, se queda aquí\n*/"; + out.slideInitialState = "# CryptSlide\n* Esto es CryptPad, el editor colaborativo en tiempo real zero knowledge.\n* Lo que escribes aquí está cifrado de manera que sólo las personas con el enlace pueden acceder a ello.\n* Incluso el servidor no puede ver lo que escribes.\n* Lo que ves aquí, lo que escuchas aquí, cuando sales, se queda aquí\n\n---\n# Cómo utilizarlo\n1. Escribe tu contenido en Markdown\n - Puedes aprender más sobre Markdown [aquí](http://www.markdowntutorial.com/)\n2. Separa tus diapositivas con ---\n3. Haz clic en \"Presentar\" para ver el resultado - Tus diapositivas se actualizan en tiempo real"; out.driveReadmeTitle = "¿Qué es CryptDrive?"; out.readme_welcome = "¡Bienvenido a CryptPad!"; - out.readme_p1 = "Bienvenido a CryptPad, aquí podrás tomar nota de cosas sólo u con otra gente."; - out.readme_p2 = "Este pad es un guía rapida para aprender a usar a CryptPad para tomar notas, organizarlas y trabajar con más personas."; - out.readme_cat1 = "Aprende a conocer a tu CryptDrive"; + out.readme_p1 = "Bienvenido a CryptPad, aquí podrás anotar cosas solo o con otra gente."; + out.readme_p2 = "Este pad es una guía rápida para aprender a usar a CryptPad para tomar notas, organizarlas y trabajar con más personas."; + out.readme_cat1 = "Conoce tu CryptDrive"; out.readme_cat1_l1 = "Crea un pad: En CryptDrive, haz clic en {0} y luego en {1} para crear un pad."; out.readme_cat1_l2 = "Abrir pads desde CryptDrive: haz doble clic en un icono para abrirlo."; - out.readme_cat1_l3 = "Organiza tus pads: Cuando has iniciado sesión, cada pad que accedes se quedaran en tu drive en {0}."; + out.readme_cat1_l3 = "Organiza tus pads: Cuando has iniciado sesión, cada pad al que accedes se quedará en tu drive en {0}."; out.readme_cat1_l3_l1 = "Puedes hacer clic y arrastrar archivos en carpetas desde {0}, y crear nuevas carpetas."; - out.readme_cat1_l3_l2 = "Recuerda hacer clic derecho en varios iconos, ya que hay menús addicionales."; + out.readme_cat1_l3_l2 = "Recuerda hacer clic derecho en los iconos, ya que suele haber menús adicionales."; out.readme_cat1_l4 = "Elimina tus viejos pads: Haz clic y arrastra tus pads en la {0} de la misma manera que lo harías con carpetas."; out.readme_cat2 = "Haz pads como un pro"; out.edit = "editar"; out.view = "ver"; - out.readme_cat2_l1 = "El botón {0} en tu pad te permite dar acceso a collaboradores para {1} o {2} el pad."; + out.readme_cat2_l1 = "El botón {0} en tu pad te permite dar acceso a colaboradores para {1} o {2} el pad."; out.readme_cat2_l2 = "Cambia el título del pad haciendo clic en el lápiz"; out.readme_cat3 = "Descubre las apps CryptPad"; - out.readme_cat3_l1 = "Con el editor de código CryptPad, puedes collaborar en código fuente, como por ejemplo JavaScript y Markdown"; + out.readme_cat3_l1 = "Con el editor de código CryptPad, puedes colaborar en código fuente, como por ejemplo JavaScript y Markdown"; out.readme_cat3_l2 = "Con los slides CryptPad, puedes hacer presentaciones rápidas con Markdown"; - out.readme_cat3_l3 = "Con CryptPoll puedes tomar votos rápidos, especialmente utíl para programar un horario que conviene a todo el mundo"; + out.readme_cat3_l3 = "Con CryptPoll puedes hacer una encuesta rápida, especialmente útil para programar un horario que conviene a todo el mundo"; // 1.2.0 - Chupacabra @@ -337,25 +341,25 @@ define(function () { out.printDate = "Mostrar la fecha"; out.printTitle = "Mostrar el título"; out.printCSS = "CSS personalizado:"; - out.editOpen = "Abrir enlances de edición en pestaña nueva"; + out.editOpen = "Abrir enlaces de edición en pestaña nueva"; out.editOpenTitle = "Abrir en modo edición en pestaña nueva"; out.settings_importTitle = "Importar pads recientes locales en CryptDrive"; out.settings_import = "Importar"; - out.settings_importConfirm = "¿Seguro qué quieres importar tus pads recientes a tu cuenta CryptDrive?"; + out.settings_importConfirm = "¿Seguro que quieres importar tus pads recientes a tu cuenta CryptDrive?"; out.settings_importDone = "Importación terminada"; out.tips = {}; out.tips.lag = "El icono verde en la parte superior derecha muestra la calidad de tu connexión a CryptPad."; out.tips.shortcuts = "`ctrl+b`, `ctrl+i`, y `ctrl+u` son accesos rápidos para negrita, itálica y subrayado."; - out.tips.indent = "Cuando editas listas, puedes usar tab o shift+tab para icrementar o decrementar indentación."; + out.tips.indent = "Cuando editas listas, puedes usar tab o shift+tab para incrementar o decrementar la sangría."; out.tips.title = "Puedes cambiar el título de tus pads en la parte superior de la pantalla."; - out.tips.store = "Cada vez que visitas un pad con una sesión iniciada se guardará a tu CryptDrive."; + out.tips.store = "Cada vez que visitas un pad con una sesión iniciada se guardará en tu CryptDrive."; out.tips.marker = "Puedes resaltar texto en un pad utilizando el \"marcador\" en el menú de estílo."; - out.tips.driveUpload = "Usuarios registrados pueden subir archivos cifrados arrastrandolos hacia CryptDrive."; + out.tips.driveUpload = "Los usuarios registrados pueden subir archivos cifrados arrastrándolos hacia CryptDrive."; - out.feedback_about = "Si estas leyendo esto, quizas estés curioso de saber porqué CryptPad solicita esta página cuando haces algunas acciones"; - out.feedback_privacy = "Nos importa tu privacidad, y al mismo tiempo queremos que CryptPad sea muy fácil de usar. Utilizamos esta página para conocer las funcionalidades que importan a nuestros usuarios, pidiendolo con un parametro que nos dice que accion fue realizada."; - out.feedback_optout = "Si quieres darte de baja, visita tus preferencias, donde podrás activar o desactivar feedback"; + out.feedback_about = "Si estas leyendo esto, quizás sientas curiosidad por saber por qué CryptPad solicita páginas cuando realizas algunas acciones"; + out.feedback_privacy = "Nos importa tu privacidad, y al mismo tiempo queremos que CryptPad sea muy fácil de usar. Utilizamos este archivo para conocer las funcionalidades que importan a nuestros usuarios, pidiéndolo con un parametro que nos dice qué acción fue realizada."; + out.feedback_optout = "Si quieres darte de baja, visita tus preferencias, donde podrás activar o desactivar el feedback"; out.fm_searchName = "Buscar"; out.fm_searchPlaceholder = "Buscar..."; @@ -369,12 +373,12 @@ define(function () { // 1.4.0 - Easter Bunny out.button_newwhiteboard = "Nueva Pizarra"; - out.wrongApp = "No se pudo mostrar el contenido de la sessión en tiempo real en tu navigador. Por favor, actualiza la página."; + out.wrongApp = "No se pudo mostrar el contenido de la sesión en tiempo real en tu navegador. Por favor, actualiza la página."; out.synced = "Todo está guardado."; out.saveTemplateButton = "Guardar como plantilla"; - out.saveTemplatePrompt = "Élige un título para la plantilla"; + out.saveTemplatePrompt = "Elige un título para la plantilla"; out.templateSaved = "¡Plantilla guardada!"; - out.selectTemplate = "Élige una plantilla o pulsa ESC"; + out.selectTemplate = "Elige una plantilla o pulsa ESC"; out.slideOptionsTitle = "Personaliza tus diapositivas"; out.slideOptionsButton = "Guardar (enter)"; out.canvas_clear = "Limpiar"; @@ -385,8 +389,8 @@ define(function () { out.canvas_opacity = "Opacidad"; out.settings_publicSigningKey = "Clave de Firma Pública"; out.settings_usage = "Utilización"; - out.settings_usageTitle = "Vee el uso total de tus pads en MB"; - out.settings_pinningNotAvailable = "Los pads pegados solo están disponibles para usuarios registrados."; + out.settings_usageTitle = "Ve el uso total de tus pads en MB"; + out.settings_pinningNotAvailable = "Los pads pegados sólo están disponibles para usuarios registrados."; out.settings_pinningError = "Algo salió mal"; out.settings_usageAmount = "Tus pads pegados utilizan {0}MB"; out.historyButton = "Mostrar el historial del documento"; @@ -397,9 +401,9 @@ define(function () { out.history_closeTitle = "Cerrar el historial"; out.history_restore = "Restaurar"; out.history_restoreTitle = "Restaurar la versión seleccionada del documento"; - out.history_restorePrompt = "¿Estás seguro que quieres cambiar la versión actual del documento por esta?"; + out.history_restorePrompt = "¿Estás seguro de que quieres cambiar la versión actual del documento por ésta?"; out.history_restoreDone = "Documento restaurado"; - out.fc_sizeInKilobytes = "Talla en Kilobytes"; + out.fc_sizeInKilobytes = "Tamaño en Kilobytes"; // 1.5.0/1.6.0 - Fenrir/Grootslang @@ -415,15 +419,15 @@ define(function () { out.formattedGB = "{0} GB"; out.formattedKB = "{0} KB"; - out.pinLimitReached = "Has llegado al limite de espacio"; - out.pinLimitNotPinned = "Has llegado al limite de espacio.
Este pad no estará presente en tu CryptDrive."; - out.pinLimitDrive = "Has llegado al limite de espacio.
No puedes crear nuevos pads."; + out.pinLimitReached = "Has llegado al límite de espacio"; + out.pinLimitNotPinned = "Has llegado al límite de espacio.
Este pad no estará presente en tu CryptDrive."; + out.pinLimitDrive = "Has llegado al límite de espacio.
No puedes crear nuevos pads."; out.printTransition = "Activar transiciones"; out.history_version = "Versión: "; - out.settings_logoutEverywhereTitle = "Cerrar sessión en todas partes"; - out.settings_logoutEverywhere = "Cerrar todas las otras sessiones"; - out.settings_logoutEverywhereConfirm = "¿Estás seguro? Tendrás que volver a iniciar sessión con todos tus dispositivos."; - out.upload_serverError = "Error: no pudimos subir tu archivo."; + out.settings_logoutEverywhereTitle = "Cerrar sesión en todas partes"; + out.settings_logoutEverywhere = "Cerrar todas las otras sesiones"; + out.settings_logoutEverywhereConfirm = "¿Estás seguro? Tendrás que volver a iniciar sesión con todos tus dispositivos."; + out.upload_serverError = "Error: no se pudo subir tu archivo en este momento."; out.upload_uploadPending = "Ya tienes una subida en progreso. ¿Cancelar y subir el nuevo archivo?"; out.upload_success = "Tu archivo ({0}) ha sido subido con éxito y fue añadido a tu drive."; @@ -432,11 +436,11 @@ define(function () { out.newVersion = ["CryptPad ha sido actualizado!", "Puedes ver lo que ha cambiado aquí (en inglés):", "Notas de versión para CryptPad {0}"].join("
"); - out.pinLimitReachedAlertNoAccounts = "Has llegado a tu limite de espacio"; + out.pinLimitReachedAlertNoAccounts = "Has llegado a tu límite de espacio"; out.previewButtonTitle = "Mostrar/esconder la vista previa Markdown"; - out.fm_info_anonymous = "No estás conectado, así que estos pads pueden ser borrados (¿por qué?). Registrate o Inicia sesión para asegurarlos."; - out.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 ser claros que no es un lugar seguro para almacenar cosas. Puedes leer este articulo (en inglés) sobre por qué hacemos esto y por qué deberías Registrarte e Iniciar sesión."; - out.fm_error_cantPin = "Error del servidor. Por favor, recarga la página e intentalo de nuevo."; + out.fm_info_anonymous = "No estás conectado, así que estos pads pueden ser borrados (¿por qué?). Regístrate o Inicia sesión para asegurarlos."; + out.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."; + out.fm_error_cantPin = "Error del servidor. Por favor, recarga la página e inténtalo de nuevo."; out.upload_notEnoughSpace = "No tienes suficiente espacio para este archivo en tu CryptDrive"; out.upload_tooLarge = "Este archivo supera el límite de carga."; out.upload_choose = "Escoge un archivo"; @@ -446,7 +450,7 @@ define(function () { out.upload_size = "Tamaño"; out.upload_progress = "Progreso"; out.download_button = "Descifrar y descargar"; - out.warn_notPinned = "Este pad no está en ningun CryptDrive. Expirará después de 3 meses. Acerca de..."; + out.warn_notPinned = "Este pad no está en ningún CryptDrive. Expirará después de 3 meses. Acerca de..."; out.poll_remove = "Quitar"; out.poll_edit = "Editar"; @@ -458,13 +462,13 @@ define(function () { // 1.8.0 - Idopogo - out.common_connectionLost = "Connexión perdida
El documento está ahora en modo solo lectura hasta que la conexión vuelva."; + out.common_connectionLost = "Conexión perdida
El documento está ahora en modo sólo lectura hasta que la conexión vuelva."; out.updated_0_common_connectionLost = out.common_connectionLost; out.supportCryptpad = "Ayudar a CryptPad"; - out.pinLimitReachedAlert = ["Has llegado a tu limite de espacio. Nuevos pads no serán guardados en tu CryptDrive.", + out.pinLimitReachedAlert = ["Has llegado a tu límite de espacio. Los nuevos pads no serán guardados en tu CryptDrive.", "Puedes eliminar pads de tu CryptDrive o suscribirte a una oferta premium para obtener más espacio."].join("
"); out.updated_0_pinLimitReachedAlert = out.pinLimitReachedAlert; - out.fm_info_trash = "Vacía tu papelera para liberar espaci en tu CryptDrive."; + out.fm_info_trash = "Vacía tu papelera para liberar espacio en tu CryptDrive."; out.updated_0_fm_info_trash = out.fm_info_trash; out.fs_migration = "Tu CryptDrive fue actualizado a una nueva versión.
Por favor, recarga la página."; @@ -496,14 +500,14 @@ define(function () { out.slideOptionsText = "Opciones"; out.historyText = "Historial"; out.openLinkInNewTab = "Abrir enlace en pestaña nueva"; - out.profileButton = "Perfíl"; + out.profileButton = "Perfil"; out.profile_urlPlaceholder = "URL"; - out.profile_namePlaceholder = "Nombre mostrado en su perfíl"; - out.profile_avatar = "Imágen"; - out.profile_upload = "Subir una imágen"; - out.profile_error = "Error al crear tu perfíl: {0}"; - out.profile_register = "Tienes que registrarte para crear perfíl"; - out.profile_create = "Crear perfíl"; + out.profile_namePlaceholder = "Nombre mostrado en su perfil"; + out.profile_avatar = "Imagen"; + out.profile_upload = "Subir una imagen"; + out.profile_error = "Error al crear tu perfil: {0}"; + out.profile_register = "Tienes que registrarte para crear un perfil"; + out.profile_create = "Crear perfil"; out.profile_description = "Descripción"; out.profile_fieldSaved = "Guardado: {0}"; out.download_mt_button = "Descargar"; @@ -512,23 +516,23 @@ define(function () { // 1.11.0 - Lutin - out.realtime_unrecoverableError = "El motor de tiempo real a encontrado un error. Haga clic en OK para recargar la página."; + out.realtime_unrecoverableError = "El motor de tiempo real ha encontrado un error. Haga clic en OK para recargar la página."; out.typing = "Escribiendo"; - out.profile_inviteButton = "Connectar"; + out.profile_inviteButton = "Conectar"; out.profile_inviteButtonTitle = "Crear un enlace de invitación para este usuario."; - out.profile_inviteExplanation = "Hacer clic en OK creará un enlace de mensaje seguro que sólo {0} podrá ver.

El enlace será copiado a tu portapapeles y puede ser compartido publicamente."; - out.profile_viewMyProfile = "Ver mi perfíl"; + out.profile_inviteExplanation = "Hacer clic en OK creará un enlace de mensaje seguro que sólo {0} podrá ver.

El enlace será copiado a tu portapapeles y puede ser compartido públicamente."; + out.profile_viewMyProfile = "Ver mi perfil"; out.userlist_addAsFriendTitle = 'Agregar "{0}" como contacto'; out.userlist_thisIsYou = 'Tú mismo ("{0}")'; out.contacts_title = "Contactos"; out.contacts_addError = "Error al agregar este contacto a la lista"; - out.contacts_added = "Invitación acceptada"; + out.contacts_added = "Invitación aceptada"; out.contacts_rejected = "Invitación denegada"; - out.contacts_request = "{0} quiere agregarte como contacto. Acceptar?"; + out.contacts_request = "{0} quiere agregarte como contacto. ¿Aceptar?"; out.contacts_send = "Enviar"; out.contacts_remove = "Eliminar este contacto"; - out.contacts_confirmRemove = "Estás seguro que quieres eliminar {0} de tus contactos?"; - out.contacts_info1 = "Estos son tus contactos. De aquí, puedes:"; + out.contacts_confirmRemove = "¿Estás seguro de que quieres eliminar {0} de tus contactos?"; + out.contacts_info1 = "Estos son tus contactos. Desde aquí, puedes:"; out.contacts_info2 = "Hacer clic en el icono de tu contacto para chatear"; out.contacts_info3 = "Hacer doble-clic para ver su perfil"; out.contacts_info4 = "Cualquier participante puede eliminar definitivamente el historial de chat"; @@ -539,11 +543,26 @@ define(function () { out.settings_resetButton = "Eliminar"; out.settings_resetTipsAction = "Reiniciar"; out.settings_userFeedbackTitle = "Feedback"; - out.settings_logoutEverywhereButton = "Cerar sesión"; + out.settings_logoutEverywhereButton = "Cerrar sesión"; out.upload_title = "Subir archivo"; +<<<<<<< HEAD // 1.13.0 - Naiad out.topbar_whatIsCryptpad = "Qué es CryptPad"; +======= + // 1.12.0 - Minotaur + out.userlist_pending = "Pendiente..."; + out.contacts_typeHere = "Escribe un mensaje aquí..."; + out.contacts_removeHistoryTitle = "Borrar el historial de chat"; + out.contacts_confirmRemoveHistory = "¿Estás seguro de que quieres borrar el historial de forma permanente? No se podrán recuparar los datos."; + out.contacts_removeHistoryServerError = "Hubo un error al borrar el historial. Inténtalo de nuevo más tarde."; + out.todo_title = "CryptTodo"; + out.todo_newTodoNamePlaceholder = "Describe tu tarea..."; + out.todo_newTodoNameTitle = "Añadir tarea a la lista"; + out.todo_markAsCompleteTitle = "Marcar esta tarea como completa"; + out.todo_markAsIncompleteTitle = "Marcar esta tarea como incompleta"; + out.todo_removeTaskTitle = "Borrar esta tarea de la lista"; +>>>>>>> fb13e656b7b3ee611bf195a1f1ccf7475f2f1ee4 return out; }); diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js index 71ea73314..70814a2de 100644 --- a/customize.dist/translations/messages.fr.js +++ b/customize.dist/translations/messages.fr.js @@ -13,6 +13,7 @@ define(function () { out.type.whiteboard = "Tableau Blanc"; out.type.file = "Fichier"; out.type.media = "Média"; + out.type.todo = "Todo"; out.type.contacts = "Contacts"; out.button_newpad = 'Nouveau document texte'; @@ -278,6 +279,10 @@ define(function () { out.contacts_info3 = "Double-cliquer sur son nom pour voir son profil"; out.contacts_info4 = "Chaque participant peut nettoyer définitivement l'historique d'une discussion"; + out.contacts_removeHistoryTitle = "Supprimer l'historique du chat"; + out.contacts_confirmRemoveHistory = 'Êtes-vous sûr de vouloir supprimer définitivement l\'historique de votre chat ? Les messages ne pourront pas être restaurés.'; + out.contacts_removeHistoryServerError = 'Une erreur est survenue lors de la supprimer de l\'historique du chat. Veuillez réessayer plus tard.'; + // File manager out.fm_rootName = "Documents"; @@ -465,6 +470,13 @@ define(function () { out.download_button = "Déchiffrer et télécharger"; out.download_mt_button = "Télécharger"; + out.todo_title = "CryptTodo"; + out.todo_newTodoNamePlaceholder = "Décrivez votre tâche..."; + out.todo_newTodoNameTitle = "Ajouter cette tâche à votre liste"; + out.todo_markAsCompleteTitle = "Marquer tâche comme terminée"; + out.todo_markAsIncompleteTitle = "Marquer tâche comme non incomplète"; + out.todo_removeTaskTitle = "Enlever cette tâche de votre liste"; + // general warnings out.warn_notPinned = "Ce pad n'est stocké dans aucun CryptDrive. Il va expirer après 3 mois d'inactivité. En savoir plus..."; diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js index fcb754382..5fb3a6ae1 100644 --- a/customize.dist/translations/messages.js +++ b/customize.dist/translations/messages.js @@ -13,6 +13,7 @@ define(function () { out.type.whiteboard = 'Whiteboard'; out.type.file = 'File'; out.type.media = 'Media'; + out.type.todo = "Todo"; out.type.contacts = 'Contacts'; out.button_newpad = 'New Rich Text pad'; @@ -245,6 +246,7 @@ define(function () { out.canvas_opacity = "Opacity"; out.canvas_opacityLabel = "opacity: {0}"; out.canvas_widthLabel = "Width: {0}"; + out.canvas_saveToDrive = "Save this image as a file in your CryptDrive"; // Profile out.profileButton = "Profile"; // dropdown menu @@ -282,6 +284,10 @@ define(function () { out.contacts_info3 = "Double-click their icon to view their profile"; out.contacts_info4 = "Either participant can clear permanently a chat history"; + out.contacts_removeHistoryTitle = 'Clean the chat history'; + out.contacts_confirmRemoveHistory = 'Are you sure you want to permanently remove your chat history? Data cannot be restored'; + out.contacts_removeHistoryServerError = 'There was an error while removing your chat history. Try again later'; + // File manager out.fm_rootName = "Documents"; @@ -470,6 +476,13 @@ define(function () { out.download_button = "Decrypt & Download"; out.download_mt_button = "Download"; + out.todo_title = "CryptTodo"; + out.todo_newTodoNamePlaceholder = "Describe your task..."; + out.todo_newTodoNameTitle = "Add this task to your todo list"; + out.todo_markAsCompleteTitle = "Mark this task as complete"; + out.todo_markAsIncompleteTitle = "Mark this task as incomplete"; + out.todo_removeTaskTitle = "Remove this task from your todo list"; + // general warnings out.warn_notPinned = "This pad is not in anyone's CryptDrive. It will expire after 3 months. Learn more..."; diff --git a/customize.dist/translations/messages.pt-br.js b/customize.dist/translations/messages.pt-br.js index 975b9ebd6..6ea5865d4 100644 --- a/customize.dist/translations/messages.pt-br.js +++ b/customize.dist/translations/messages.pt-br.js @@ -1,5 +1,5 @@ // Tradução para protuguês brasileiro efetuada por Gustavo Henrique Machado da Silva (www.linkedin.com/in/gustavohmsilva) -// Embora o software original possa não possuir as mesmas licenças, a tradução produzida por mim is protected under +// Embora o software original possa não possuir as mesmas licenças, a tradução produzida por mim é protegida sob termos // Creative Commons, Attribution-ShareAlike 4.0 International // Contate-me via email no endereço gustavohmsilva@member.fsf.org // Translation to brazilian portuguese done by Gustavo Henrique Machado da Silva (www.linkedin.com/in/gustavohmsilva) @@ -9,8 +9,6 @@ define(function () { var out = {}; - // translations must set this key for their language to be available in - // the language dropdowns that are shown throughout Cryptpad's interface out._languageName = 'Brazilian Portuguese'; out.main_title = "Cryptpad: Zero Knowledge, Edição Colaborativa em Tempo Real"; @@ -22,7 +20,33 @@ define(function () { out.type.poll = 'votação'; out.type.slide = 'Apresentação'; - out.common_connectionLost = 'Conexão Perdida com o servidor'; + out.type.drive = 'Drive'; + out.type.whiteboard = 'Whiteboard'; + out.type.file = 'File'; + out.type.media = 'Media'; + + out.button_newpad = 'Novo bloco RTF'; + out.button_newcode = 'Novo bloco de código'; + out.button_newpoll = 'Novo questionário'; + out.button_newslide = 'Nova apresentação'; + out.button_newwhiteboard = 'Novo quadro branco'; + + // NOTE: We want to update the 'common_connectionLost' key. + // Please do not add a new 'updated_common_connectionLostAndInfo' but change directly the value of 'common_connectionLost' + out.updated_0_common_connectionLost = "Conexão com o Servidor Perdida
Você agora está em modo somente leitura até a conexão ser restaurada."; + out.common_connectionLost = out.updated_0_common_connectionLost; + + out.websocketError = 'Incapaz de se conectar com o servidor websocket...'; + out.typeError = "Este bloco não é compatível com a aplicação selecionada"; + out.onLogout = 'você foi desconectado, clique aqui para se conectar,
ou pressione ESC para acessar seu bloco em modo somente leitura.'; + out.wrongApp = "Incapaz de mostrar o conteúdo em tempo real no seu navegador. Por favor tente recarregar a página."; + + out.loading = "Carregando..."; + out.error = "Erro"; + out.saved = "Salvo"; + out.synced = "Tudo foi salvo"; + out.deleted = "Bloco deletado do seu CryptDrive"; + out.disconnected = 'Desconectado'; out.synchronizing = 'Sincronizando'; @@ -40,45 +64,117 @@ define(function () { out.editor = "editor"; out.editors = "editores"; + out.language = "Lingua"; + + out.comingSoon = "Em breve..."; + + out.newVersion = 'O CryptPad foi atualizado!
' + + 'Cheque as novidades na última versão:
'+ + 'Notas da atualização do CryptPad {0}'; + + out.upgrade = "Upgrade"; + out.upgradeTitle = "Faça um upgrade na sua conta para aumentar o limite de armazenamento"; + out.MB = "MB"; + out.GB = "GB"; + out.KB = "KB"; + + out.formattedMB = "{0} MB"; + out.formattedGB = "{0} GB"; + out.formattedKB = "{0} KB"; + out.greenLight = "Tudo está funcionando bem"; - out.orangeLight = "Sua conexão longa pode impactar sua experiência"; + out.orangeLight = "Sua conexão lenta pode impactar sua experiência"; out.redLight = "Você está desconectado da sua sessão"; + + out.pinLimitReached = "Você alcançou o limite de armazenamento"; + out.updated_0_pinLimitReachedAlert = "Você alcançou o limite de armazenamento. Novos blocos não serão mais salvos no seu CryptDrive.
" + + 'Você pode deletar blocos do seu CryptDrive ou se inscrever como premium para aumentar o limite de espaço.'; + out.pinLimitReachedAlert = out.updated_0_pinLimitReachedAlert; + out.pinAboveLimitAlert = 'A partir desta atualização, nós estamos impondo um limite de 50MB no armazenamento gratuito. Você está atualmente usando {0}. Você irá precisar deletar alguns blocos ou se inscrever no accounts.cryptpad.fr. Sua contribuição irá nos ajudar a melhorar o CryptPad e expandir a metodologia Zero Knowledge. Por favor contacte o suporte se você possui outras dúvidas.'; + out.pinLimitNotPinned = "Você alcançou o limite de armazenamento.
"+ + "Este bloco não está armazenado no seu CryptDrive."; + out.pinLimitDrive = "Você alcançou o limite de armazenamento.
" + + "Você não pode criar novos blocos."; + out.importButtonTitle = 'Importar um documento de um arquivo local'; out.exportButtonTitle = 'Exportar esta sesão para um arquivo local'; - out.exportPrompt = 'Como deseja nomeear seu arquivo?'; + out.exportPrompt = 'Como deseja nomear seu arquivo?'; + out.changeNamePrompt = 'Mude seu nome (deixe em branco para se manter anônimo): '; + out.user_rename = "Mudar nome de exibição"; + out.user_displayName = "Nome visível"; + out.user_accountName = "Nome da Conta"; out.clickToEdit = "Clique para Editar"; out.forgetButtonTitle = 'Remova este documento da listagem da sua página'; out.forgetPrompt = 'Clicando OK você irá remover o endereço deste bloco de notas do armazenamento local, você tem certeza?'; + out.movedToTrash = 'That pad has been moved to the trash.
Access my Drive'; out.shareButton = 'Compartilhar'; out.shareSuccess = 'Endereço copiado para o clipboard'; + out.newButton = 'Novo'; + out.newButtonTitle = 'Criar um novo bloco'; + + out.saveTemplateButton = "Salvar como modelo"; + out.saveTemplatePrompt = "Escolha o nome do modelo"; + out.templateSaved = "Modelo salvo!"; + out.selectTemplate = "Selecione um modelo ou pressione ESC"; + + out.previewButtonTitle = "Mostrar ou esconder o modo de visualização markdown"; + out.presentButtonTitle = "Entrar no modo apresentação"; out.presentSuccess = 'Pressione ESC para sair do modo de apresentação'; + out.backgroundButtonTitle = 'Mudar cor do fundo da apresentação'; out.colorButtonTitle = 'Mudar a cor do texto no modo apresentação'; + out.printButton = "Imprimir (Enter)"; + out.printButtonTitle = "Imprimir seus slides ou exportá-los como PDF"; + out.printOptions = "Opções de leiaute"; + out.printSlideNumber = "Mostrar o número do slide"; + out.printDate = "Mostrar a data"; + out.printTitle = "Mostrar título do bloco"; + out.printCSS = "Custom style rules (CSS):"; + out.printTransition = "Ativar animações de transição"; + + out.slideOptionsTitle = "Personalizar seus slides"; + out.slideOptionsButton = "Salvar (Enter)"; + + out.editShare = "Compartilhar endereço editável"; out.editShareTitle = "Copiar endereço editável"; - out.viewShare = "Compartilhar endereó de visualização"; + out.editOpen = "Abrir endereço editável em nova aba"; + out.editOpenTitle = "Abrir este bloco em modo editável em nova aba"; + out.viewShare = "Compartilhar endereço de visualização"; out.viewShareTitle = "Copiar o endereço somente leitura"; - out.viewOpen = "Ver em nova aba"; - out.viewOpenTitle = "Abrir o documento em modo somente leitura em nova aba"; out.notifyJoined = "{0} entraram na sessão colaborativa"; out.notifyRenamed = "{0} agora é conhecido como {1}"; out.notifyLeft = "{0} deixou essa sessão colaborativa"; - out.tryIt = 'Experimente!'; - out.okButton = 'OK (enter)'; - out.cancelButton = 'Cancelar (esc)'; + out.okButton = 'OK (Enter)'; + + out.cancel = "Cancelar"; + out.cancelButton = 'Cancelar (ESC)'; + + out.historyButton = "Exibir histórico do documento"; + out.history_next = "Ir para próxima versão"; + out.history_prev = "Ir para versão anterior"; + out.history_goTo = "Ir para versão selecionada"; + out.history_close = "Voltar"; + out.history_closeTitle = "Fechar o histórico"; + out.history_restore = "Restaurar"; + out.history_restoreTitle = "Restaurar a versão selecionada do documento"; + out.history_restorePrompt = "Você tem certeza que deseja substituir a versão atual do documento pela que está sendo exibida agora?"; + out.history_restoreDone = "Documento restaurado"; + out.history_version = "Versão:"; + out.tryIt = 'Experimente!'; // Polls @@ -92,6 +188,12 @@ define(function () { out.wizardTitle = "Use o assistente para criar sua enquete"; out.wizardConfirm = "Você está realmente pronto para adicionar estas opções em sua enquete?"; + out.poll_publish_button = "Publicar"; + out.poll_admin_button = "Admin"; + out.poll_create_user = "Adicionar novo usuário"; + out.poll_create_option = "Adicionar nova opção"; + out.poll_commit = "Submeter"; + out.poll_closeWizardButton = "Fechar assistente"; out.poll_closeWizardButtonTitle = "Fechar assistente"; out.poll_wizardComputeButton = "Computar opções"; @@ -102,23 +204,241 @@ define(function () { out.poll_optionPlaceholder = "Alternativa"; out.poll_userPlaceholder = "Seu nome"; + + out.poll_removeOption = "Você tem certeza que deseja remover esta opção?"; + out.poll_removeUser = "Você tem certeza que quer remover este usuário?"; out.poll_titleHint = "Título"; out.poll_descriptionHint = "Descrição"; - // index.html - out.main_p2 = 'Este projeto utiliza os Editores visuais CKEditor e CodeMirror, e a engine de tempo real ChainPad.'; - out.main_howitworks = 'Como funciona'; -    out.main_howitworks_p1 = 'CryptPad usa uma variante do algorítmo de Transformação Operacional, que é capaz de encontrar consenso distribuido usando o Blockchain de Nakamoto, um constructo popularizado pela Criptomoeda Bitcoin. Desta forma o algorítmo pode evitar a necessidade de um servidor central para resolver conflitos de edição operacional sem a necessidade do servidor armazenar o conteúdo que está sendo editado pelos colaboradores.'; + // Canvas + out.canvas_clear = "Limpar"; + out.canvas_delete = "Deletar seleção"; + out.canvas_disable = "Desabilitar desenho"; + out.canvas_enable = "Habilitar desenho"; + out.canvas_width = "Largura"; + out.canvas_opacity = "Opacidade"; + + // File manager + + out.fm_rootName = "Documentos"; + out.fm_trashName = "Lixeira"; + out.fm_unsortedName = "Arquivos não organizados"; + out.fm_filesDataName = "Todos os Arquivos"; + out.fm_templateName = "Temas"; + out.fm_searchName = "Busca"; + out.fm_searchPlaceholder = "Buscar..."; + out.fm_newButton = "Novo"; + out.fm_newButtonTitle = "Criar um novo bloco ou diretório"; + out.fm_newFolder = "Novo diretório"; + out.fm_newFile = "Novo bloco"; + out.fm_folder = "Diretório"; + out.fm_folderName = "Nome do diretório"; + out.fm_numberOfFolders = "# de diretórios"; + out.fm_numberOfFiles = "# de arquivos"; + out.fm_fileName = "Nome do arquivo"; + out.fm_title = "Título"; + out.fm_type = "Tipo"; + out.fm_lastAccess = "Último acesso"; + out.fm_creation = "Criação"; + out.fm_forbidden = "Ação não permitida"; + out.fm_originalPath = "Caminho original"; + out.fm_openParent = "Exibir no diretório"; + out.fm_noname = "Documento sem título"; + out.fm_emptyTrashDialog = "Você tem certeza que deseja limpar a lixeira??"; + out.fm_removeSeveralPermanentlyDialog = "Você tem certeza que deseja deletar estes {0} elementos da lixeira permanentemente?"; + out.fm_removePermanentlyDialog = "Você tem certeza que deseja deletar este elemento da lixeira permanentemente?"; + out.fm_removeSeveralDialog = "Você tem certeza que deseja mover estes {0} elementos para a lixeira?"; + out.fm_removeDialog = "Você tem certeza que deseja mover {0} para a lixeira?"; + out.fm_restoreDialog = "Você tem certeza que deseja restaurar {0} de volta para seu diretório original?"; + out.fm_unknownFolderError = "O diretório selecionado ou visitado por último não existe mais. Abrindo diretório superior..."; + out.fm_contextMenuError = "Incapaz de abrir o menu de contextualização para este elementos. Se o problema persistir, tente recarregar a página."; + out.fm_selectError = "Incapaz de selecionar o elemento marcado. Se o problema persistir, tente recarregar a página."; + out.fm_categoryError = "Incapaz de abrir a categoria selecionada, Exibindo diretório raiz"; + out.fm_info_root = "Crie quantos diretórios aninhados aqui desejar para organizar seus arquivos.."; + out.fm_info_unsorted = "Contém todos os arquivos que você visitou e não estão ainda organizados na pasta Documentos ou foram movidos para a pasta lixeira"; // "My Documents" should match with the "out.fm_rootName" key, and "Trash" with "out.fm_trashName" out.fm_info_template = 'Contains all the pads stored as templates and that you can re-use when you create a new pad.'; + out.updated_0_fm_info_trash = 'Empty your trash to free space in your CryptDrive.'; + out.fm_info_trash = out.updated_0_fm_info_trash; + out.fm_info_allFiles = 'Contém todos os arquivos de "Documentos", "Não organizados" e "Lixeira". Não é possível mover ou remover arquivos daqui.'; // Same here + out.fm_info_anonymous = 'Você não está logado, então estes blocos podem ser deletados! (Descubra o porque). ' + + 'Cadastre-se or Entre Para deixá-los salvos.'; + out.fm_alert_backupUrl = "Link de backup desta conta.
" + + "É fortemente recomendado que você deixe para você e somente você.
" + + "Você pode usá-lo para resgatar os seus dados caso a memória do seu navegador se perca.
" + + "Qualquer um com este link pode editar ou apagar todos os arquivos no gerenciador da conta.
"; + out.fm_alert_anonymous = "Ola! Você está utilizando o CryptPad anonimamente, isto é ok, mas seus blocos podem ser apagados " + + "se ficarem muito tempo inativo. Nós desativamos as funções avançadas nas contas anônimas para que isto fique claro para você " + + 'Este não é um bom lugar apra salvar senhas! Entenda: Clicando aqui! ' + + 'Porque estamos fazendo isso e porque você deveria criar uma onta? Sign up and Clique e entenda!.'; + out.fm_backup_title = 'Link de restauração'; + out.fm_nameFile = 'Como deseja nomear este arquivo?'; + out.fm_error_cantPin = "Erro interno do servidor. Por favor recarregue a página e tente novamente."; + // File - Context menu + out.fc_newfolder = "Nova pasta"; + out.fc_rename = "Renomear"; + out.fc_open = "Abrir"; + out.fc_open_ro = "Abrir (somente leitura)"; + out.fc_delete = "Deletar"; + out.fc_restore = "Restaurar"; + out.fc_remove = "Deletar permanentemente"; + out.fc_empty = "Esvaziar lixeira"; + out.fc_prop = "Propriedades"; + out.fc_sizeInKilobytes = "tamanho em Kilobytes"; + // fileObject.js (logs) + out.fo_moveUnsortedError = "Você não pode mover uma pasta na lista de notas não organizadas"; + out.fo_existingNameError = "Nome já em uso neste diretório. Por favor escolha outro."; + out.fo_moveFolderToChildError = "Você não pode mover uma sub-diretório para dentro de um de seus sub-diretórios"; + out.fo_unableToRestore = "Fomos incapazes de restaurar este arquivo para sua posição original. Você pode tentar move-lo para o local de destino porém."; + out.fo_unavailableName = "Um arquivo ou diretório com o mesmo nome já existe no novo locao. Renomeie-o e tente novamente."; + + // login + out.login_login = "Entrar"; + out.login_makeAPad = 'Criar bloco anonimamente'; + out.login_nologin = "Navegar nos blocos locais"; + out.login_register = "Cadastro"; + out.logoutButton = "Sair"; + out.settingsButton = "Configurações"; + + out.login_username = "Usuário"; + out.login_password = "Senha"; + out.login_confirm = "Confirme sua senha"; + out.login_remember = "Memorize-me"; + + out.login_hashing = "Encriptando sua senha, isto pode tomar algum tempo."; + + out.login_hello = 'Ola {0},'; // {0} is the username + out.login_helloNoName = 'Ola,'; + out.login_accessDrive = 'Acesse seu diretório'; + out.login_orNoLogin = 'ou'; + + out.login_noSuchUser = 'Usuário ou senha inválido. Tente nocamente ou cadastre-se'; + out.login_invalUser = 'É necessário um usuário'; + out.login_invalPass = 'É necessário uma senha'; + out.login_unhandledError = 'Um erro não esperado ocorreu :('; + + out.register_importRecent = "Importar histórico de blocos (Recomendado)"; + out.register_acceptTerms = "Eu aceito os termos de serviço"; + out.register_passwordsDontMatch = "Senhas não coincidem!"; + out.register_mustAcceptTerms = "Você precisa aceitar os termos de serviço."; + out.register_mustRememberPass = "Nós não podemos restaurar sua senha caso você a esqueça. É muito importante que você lembre-se dela! Clique nesta caixa de seleção para confirmar que você compreendeu isto."; + + out.register_header = "Bem vindo ao CryptPad"; + out.register_explanation = [ + "

Lets go over a couple things first

", + "" + ].join(''); + + + out.register_writtenPassword = "I have written down my username and password, proceed"; + out.register_cancel = "Go back"; + + out.register_warning = "Zero Knowledge means that we can't recover your data if you lose your password."; + + out.register_alreadyRegistered = "This user already exists, do you want to log in?"; + + // Settings + out.settings_title = "Settings"; + out.settings_save = "Save"; + out.settings_backupTitle = "Backup or restore all your data"; + out.settings_backup = "Backup"; + out.settings_restore = "Restore"; + out.settings_resetTitle = "Clean your drive"; + out.settings_reset = "Remove all the files and folders from your CryptDrive"; + out.settings_resetPrompt = "This action will remove all the pads from your drive.
"+ + "Are you sure you want to continue?
" + + "Type “I love CryptPad” to confirm."; + out.settings_resetDone = "Your drive is now empty!"; + out.settings_resetError = "Incorrect verification text. Your CryptDrive has not been changed."; + out.settings_resetTips = "Tips in CryptDrive"; + out.settings_resetTipsButton = "Reset the available tips in CryptDrive"; + out.settings_resetTipsDone = "All the tips are now visible again."; + + out.settings_importTitle = "Import this browser's recent pads in my CryptDrive"; + out.settings_import = "Import"; + out.settings_importConfirm = "Are you sure you want to import recent pads from this browser to your user account's CryptDrive?"; + out.settings_importDone = "Import completed"; + + out.settings_userFeedbackHint1 = "CryptPad provides some very basic feedback to the server, to let us know how to improve your experience."; + out.settings_userFeedbackHint2 = "Your pad's content will never be shared with the server."; + out.settings_userFeedback = "Enable user feedback"; + + out.settings_anonymous = "You are not logged in. Settings here are specific to this browser."; + out.settings_publicSigningKey = "Public Signing Key"; + + out.settings_usage = "Usage"; + out.settings_usageTitle = "See the total size of your pinned pads in MB"; + out.settings_pinningNotAvailable = "Pinned pads are only available to registered users."; + out.settings_pinningError = "Something went wrong"; + out.settings_usageAmount = "Your pinned pads occupy {0}MB"; + + out.settings_logoutEverywhereTitle = "Log out everywhere"; + out.settings_logoutEverywhere = "Log out of all other web sessions"; + out.settings_logoutEverywhereConfirm = "Are you sure? You will need to log in with all your devices."; + + out.upload_serverError = "Server Error: unable to upload your file at this time."; + out.upload_uploadPending = "You already have an upload in progress. Cancel it and upload your new file?"; + out.upload_success = "Your file ({0}) has been successfully uploaded and added to your drive."; + out.upload_notEnoughSpace = "There is not enough space for this file in your CryptDrive."; + out.upload_tooLarge = "This file exceeds the maximum upload size."; + out.upload_choose = "Choose a file"; + out.upload_pending = "Pending"; + out.upload_cancelled = "Cancelled"; + out.upload_name = "File name"; + out.upload_size = "Size"; + out.upload_progress = "Progress"; + out.download_button = "Decrypt & Download"; + + // general warnings + out.warn_notPinned = "This pad is not in anyone's CryptDrive. It will expire after 3 months. Learn more..."; -    out.main_about_p2 = 'Se você tem alguma questão ou comentário, você pode nos mandar um tweet ou abrir uma requisição no github. Venha também nos dar um Oi no IRC (irc.freenode.net), ou até mesmo via e-mail.'; - out.button_newpad = 'NOVO BLOCO WYSIWYG'; - out.button_newcode = 'NOVO BLOCO DE NOTAS'; - out.button_newpoll = 'NOVA ENQUETE'; - out.button_newslide = 'NOVA APRESENTAÇÃO'; + // index.html + + //about.html + out.main_p2 = 'This project uses the CKEditor Visual Editor, CodeMirror, and the ChainPad realtime engine.'; + out.main_howitworks_p1 = 'CryptPad uses a variant of the Operational transformation algorithm which is able to find distributed consensus using a Nakamoto Blockchain, a construct popularized by Bitcoin. This way the algorithm can avoid the need for a central server to resolve Operational Transform Edit Conflicts and without the need for resolving conflicts, the server can be kept unaware of the content which is being edited on the pad.'; + + // contact.html + out.main_about_p2 = 'If you have any questions or comments, you can tweet us, open an issue on github, come say hi on irc (irc.freenode.net), or send us an email.'; + + out.main_info = "

Collaborate in Confidence


Grow your ideas together with shared documents while Zero Knowledge technology secures your privacy; even from us."; + + out.main_howitworks = 'How It Works'; + out.main_zeroKnowledge = 'Zero Knowledge'; + out.main_zeroKnowledge_p = "You don't have to trust that we won't look at your pads, with CryptPad's revolutionary Zero Knowledge Technology we can't. Learn more about how we protect your Privacy and Security."; + out.main_writeItDown = 'Write it down'; + out.main_writeItDown_p = "The greatest projects come from the smallest ideas. Take down the moments of inspiration and unexpected ideas because you never know which one might be a breakthrough."; + out.main_share = 'Share the link, share the pad'; + out.main_share_p = "Grow your ideas together: conduct efficient meetings, collaborate on TODO lists and make quick presentations with all your friends and all your devices."; + out.main_organize = 'Get organized'; + out.main_organize_p = "With CryptPad Drive, you can keep your sights on what's important. Folders allow you to keep track of your projects and have a global vision of where things are going."; + out.tryIt = 'Try it out!'; + out.main_richText = 'Rich Text editor'; + out.main_richText_p = 'Edit rich text pads collaboratively with our realtime Zero Knowledge CkEditor application.'; + out.main_code = 'Code editor'; + out.main_code_p = 'Edit code from your software collaboratively with our realtime Zero Knowledge CodeMirror application.'; + out.main_slide = 'Slide editor'; + out.main_slide_p = 'Create your presentations using the Markdown syntax, and display them in your browser.'; + out.main_poll = 'Polls'; + out.main_poll_p = 'Plan your meeting or your event, or vote for the best solution regarding your problem.'; + out.main_drive = 'CryptDrive'; + + out.footer_applications = "Applications"; + out.footer_contact = "Contact"; + out.footer_aboutUs = "About us"; + + out.about = "About"; + out.privacy = "Privacy"; + out.contact = "Contact"; + out.terms = "ToS"; + out.blog = "Blog"; + // privacy.html @@ -152,17 +472,89 @@ define(function () { // BottomBar.html out.bottom_france = 'Feito com na '; -    out.bottom_support = 'Um projeto do laboratório XWiki SAS com o suporte da OpenPaaS-ng'; + out.bottom_support = 'Um projeto do laboratório XWiki SAS com o suporte da OpenPaaS-ng'; // Header.html out.header_france = 'Com da France por XWiki SAS'; - - // TODO Hardcode cause YOLO - //out.header_xwiki = 'XWiki SAS'; out.header_support = ' OpenPaaS-ng'; - out.header_logoTitle = 'Ir para página principal'; + out.header_logoTitle = 'Go to the main page'; + + // Initial states + + out.initialState = [ + '

', + 'This is CryptPad, the Zero Knowledge realtime collaborative editor. Everything is saved as you type.', + '
', + 'Share the link to this pad to edit with friends or use the  Share  button to share a read-only link which allows viewing but not editing.', + '

', + + '

', + 'Go ahead, just start typing...', + '

', + '

 

' + ].join(''); + + out.codeInitialState = [ + '# CryptPad\'s Zero Knowledge collaborative code editor\n', + '\n', + '* What you type here is encrypted so only people who have the link can access it.\n', + '* You can choose the programming language to highlight and the UI color scheme in the upper right.' + ].join(''); + + out.slideInitialState = [ + '# CryptSlide\n', + '* This is a zero knowledge realtime collaborative editor.\n', + '* What you type here is encrypted so only people who have the link can access it.\n', + '* Even the server cannot see what you type.\n', + '* What you see here, what you hear here, when you leave here, let it stay here.\n', + '\n', + '---', + '\n', + '# How to use\n', + '1. Write your slides content using markdown syntax\n', + ' - Learn more about markdown syntax [here](http://www.markdowntutorial.com/)\n', + '2. Separate your slides with ---\n', + '3. Click on the "Play" button to see the result', + ' - Your slides are updated in realtime' + ].join(''); + + // Readme + + out.driveReadmeTitle = "What is CryptDrive?"; + out.readme_welcome = "Welcome to CryptPad !"; + out.readme_p1 = "Welcome to CryptPad, this is where you can take note of things alone and with friends."; + out.readme_p2 = "This pad will give you a quick walk through of how you can use CryptPad to take notes, keep them organized and work together on them."; + out.readme_cat1 = "Get to know your CryptDrive"; + out.readme_cat1_l1 = "Make a pad: In your CryptDrive, click {0} then {1} and you can make a pad."; // 0: New, 1: Rich Text + out.readme_cat1_l2 = "Open Pads from your CryptDrive: double-click on a pad icon to open it."; + out.readme_cat1_l3 = "Organize your pads: When you are logged in, every pad you access will be shown as in the {0} section of your drive."; // 0: Unsorted files + out.readme_cat1_l3_l1 = "You can click and drag files into folders in the {0} section of your drive and make new folders."; // 0: Documents + out.readme_cat1_l3_l2 = "Remember to try right clicking on icons because there are often additional menus."; + out.readme_cat1_l4 = "Put old pads in the trash: You can click and drag your pads into the {0} the same way you drag them into folders."; // 0: Trash + out.readme_cat2 = "Make pads like a pro"; + out.edit = "edit"; + out.view = "view"; + out.readme_cat2_l1 = "The {0} button in your pad allows you to give access to collaborators to either {1} or to {2} the pad."; // 0: Share, 1: edit, 2: view + out.readme_cat2_l2 = "Change the title of the pad by clicking on the pencil"; + out.readme_cat3 = "Discover CryptPad apps"; + out.readme_cat3_l1 = "With CryptPad code editor, you can collaborate on code like Javascript and markdown like HTML and Markdown"; + out.readme_cat3_l2 = "With CryptPad slide editor, you can make quick presentations using Markdown"; + out.readme_cat3_l3 = "With CryptPoll you can take quick votes, especially for scheduling meetings which fit with everybody's calendar"; + + // Tips + out.tips = {}; + out.tips.lag = "The green icon in the upper right shows the quality of your internet connection to the CryptPad server."; + out.tips.shortcuts = "`ctrl+b`, `ctrl+i` and `ctrl+u` are quick shortcuts for bold, italic and underline."; + out.tips.indent = "In numbered and bulleted lists, you can use tab or shift+tab to quickly increase or decrease indentation."; + out.tips.title = "You can set the title of your pad by clicking the top center."; + out.tips.store = "Every time you visit a pad, if you're logged in it will be saved to your CryptDrive."; + out.tips.marker = "You can highlight text in a pad using the \"marker\" item in the styles dropdown menu."; + + out.feedback_about = "If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions"; + out.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."; + out.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"; return out; }); diff --git a/package.json b/package.json index b18763526..a2b893d21 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "1.11.0", + "version": "1.12.0", "dependencies": { "chainpad-server": "^1.0.1", "express": "~4.10.1", diff --git a/readme.md b/readme.md index 220891324..ae3c9e144 100644 --- a/readme.md +++ b/readme.md @@ -1,114 +1,26 @@ -[![XWiki labs logo](https://raw.githubusercontent.com/xwiki-labs/xwiki-labs-logo/master/projects/xwikilabs/xlabs-project.png "XWiki labs")](https://labs.xwiki.com/xwiki/bin/view/Main/WebHome) +[![An XWiki Labs Project](https://raw.githubusercontent.com/xwiki-labs/xwiki-labs-logo/master/projects/xwikilabs/xlabs-project.png "XWiki labs")](https://labs.xwiki.com/xwiki/bin/view/Main/WebHome) -

- -

+![CryptPad screenshot](https://github.com/xwiki-labs/cryptpad/raw/master/screenshot.png "Pads are an easy way to collaborate") -Unity is Strength - Collaboration is Key +CryptPad is the **Zero Knowledge** realtime collaborative editor. - - -![and_so_it_begins.png](https://github.com/cjdelisle/cryptpad/raw/master/and_so_it_begins.png "We are the 99%") - -CryptPad is the **zero knowledge** realtime collaborative editor. Encryption carried out in your web browser protects the data from the server, the cloud -and the NSA. This project uses the [CKEditor] Visual Editor and the [ChainPad] realtime -engine. The secret key is stored in the URL [fragment identifier] which is never sent to -the server but is available to javascript so by sharing the URL, you give authorization -to others who want to participate. +and the NSA. It relies on the [ChainPad] realtime engine. + # Installation -Cryptpad depends on the Nodejs runtime. -We recommend installing it via [NVM](https://github.com/creationix/nvm "Node Version Manager") to ensure that you are running an up to date version. - -Once you have a recent runtime (we use v6.6.0): - -``` -git clone -cd cryptpad -npm install -npm install -g bower ## if necessary -bower install - -## copy config.example.js to config.js -cp config.example.js config.js - -node ./server.js -``` - -## Configuration - -CryptPad _should_ work with an unmodified configuration file, though there are many things which you may want to customize. -Attributes in the config should have comments indicating how they are used. - -``` -$EDITOR config.js -``` - -If you are deploying CryptPad in a production environment, we recommend that you take the time to understand and correctly customize your server's [Content Security Policy headers](https://content-security-policy.com/). -Modern browsers use these headers to allow or deny actions from malicious clients which could compromise the confidentiality of your user's data. - -These settings can be found in your configuration file in the `contentSecurity` and `padContentSecurity` sections. - -## Maintenance - -Before upgrading your CryptPad instance to the latest version, we recommend that you check what has changed since your last update. -You can do so by checking which version you have (see package.json), and comparing it against newer [release notes](https://github.com/xwiki-labs/cryptpad/releases). - -To get access to the most recent codebase: - -``` -cd /your/cryptpad/instance/location; -git pull -``` - -To update dependencies: - -``` -# clientside dependencies -bower update; +Installing CryptPad is pretty straightforward. You can read all about it in the +[installation guide](https://github.com/xwiki-labs/cryptpad/wiki/Installation-guide). -# serverside dependencies -npm update; -``` -## Deleting all data and resetting Cryptpad +It also contains information on keeping your instance of CryptPad up to date. +## Setup using Docker -To reset your instance of Cryptpad and remove all the data that is being stored: - -**WARNING: This will reset your Cryptpad instance and remove all data** -``` -# change into your cryptpad directory -cd /your/cryptpad/instance/location; - -# delete the datastore -rm -rf ./datastore -``` - -If you are using the mongodb adaptor, [drop the relevant collection](https://docs.mongodb.org/manual/reference/method/db.collection.drop/#db.collection.drop). - -If you are using the [leveldb adaptor](https://github.com/xwiki-labs/cryptpad-level-store), delete the datastore directory you have configured. - -## Testing - -To test CryptPad, go to http://your.server:3000/assert/ - -You can use WebDriver to run this test automatically by running TestSelenium.js but you will need chromedriver installed. -If you use Mac, you can `brew install chromedriver`. - -## Developing CryptPad - -CryptPad is built with a lot of small javascript libraries. -To make js files load faster, we apply an aggressive caching policy. - -If you want to add new features to CryptPad, you'll want to turn off caching. -You can do so by launching your server in _dev mode_, like so: - -`DEV=1 node server.js` +See [Cryptpad-Docker](docs/cryptpad-docker.md) -## Security +# Security CryptPad is *private*, not *anonymous*. Privacy protects your data, anonymity protects you. As such, it is possible for a collaborator on the pad to include some silly/ugly/nasty things @@ -127,11 +39,7 @@ the battery out of your computer before it spawns Agent Smith. Still there are other low-lives in the world so using CryptPad over HTTPS is probably a good idea. -## Setup using Docker - -See [Cryptpad-Docker](docs/cryptpad-docker.md) - -## Translations +# Translations We'd like to make it easy for more people to use encryption in their routine activities. As such, we've tried to make language-specific parts of CryptPad translatable. If you're @@ -139,14 +47,14 @@ able to translate CryptPad's interface, and would like to help, please contact u You can also see [our translation guide](/customize.dist/translations/README.md). -## Contacting Us +# Contacting Us -You can reach members of the CryptPad development team on [twitter](https://twitter.com/cryptpad), -via our [github issue tracker](https://github.com/xwiki-labs/cryptpad/issues/), on the -[freenode](http://webchat.freenode.net/?channels=%23cryptpad&uio=MT1mYWxzZSY5PXRydWUmMTE9Mjg3JjE1PXRydWUe7) -irc network, or by [email](mailto:research@xwiki.com). +You can reach members of the CryptPad development team on [Twitter](https://twitter.com/cryptpad), +via our [GitHub issue tracker](https://github.com/xwiki-labs/cryptpad/issues/), on our +[Matrix channel](https://riot.im/app/#/room/#cryptpad:matrix.org), or by +[e-mail](mailto:research@xwiki.com). -## Contributing +# Contributing We love Open Source and we love contribution. It is our intent to keep this project available under the AGPL license forever but in order to finance more development on this and other FOSS @@ -156,7 +64,9 @@ please read and If you have any questions or comments, or if you're interested in contributing to Cryptpad, come say hi on IRC, `#cryptpad` on Freenode. -### License +# License + +![AGPL logo](https://www.gnu.org/graphics/agplv3-155x51.png "GNU Affero General Public License") This software is and will always be available under the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) @@ -164,7 +74,4 @@ any later version. If you wish to use this technology in a proprietary product, sales@xwiki.com [ChainPad]: https://github.com/xwiki-contrib/chainpad -[CKEditor]: http://ckeditor.com/ -[fragment identifier]: https://en.wikipedia.org/wiki/Fragment_identifier [active attack]: https://en.wikipedia.org/wiki/Attack_(computing)#Types_of_attacks -[Creative Commons Attribution 2.5 License]: http://creativecommons.org/licenses/by/2.5/ diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 000000000..cbc837f58 Binary files /dev/null and b/screenshot.png differ diff --git a/www/code/code.less b/www/code/code.less index 98e69a18e..6c620fff8 100644 --- a/www/code/code.less +++ b/www/code/code.less @@ -1,5 +1,7 @@ @import "/customize/src/less/variables.less"; @import "/customize/src/less/mixins.less"; +@import "/common/markdown.less"; +@import "/common/file-dialog.less"; html, body{ height: 100%; @@ -66,15 +68,8 @@ body { max-width: 40vw; margin: auto; - table { - border-collapse: collapse; - tr { - th { - border: 3px solid black; - padding: 15px; - } - } - } + .markdown_preformatted-code; + .markdown_gfm-table(black); } @media (max-width: @media-medium-screen) { diff --git a/www/code/main.js b/www/code/main.js index 1b6cb8997..db358018d 100644 --- a/www/code/main.js +++ b/www/code/main.js @@ -147,6 +147,17 @@ define([ } }; + var mediaTagModes = [ + 'markdown', + 'html', + 'htmlembedded', + 'htmlmixed', + 'index.html', + 'php', + 'velocity', + 'xml', + ]; + var onModeChanged = function (mode) { var $codeMirror = $iframe.find('.CodeMirror'); window.clearTimeout(APP.previewTo); @@ -154,6 +165,10 @@ define([ APP.previewTo = window.setTimeout(function () { $codeMirror.removeClass('transition'); }, 500); + if (mediaTagModes.indexOf(mode) !== -1) { + APP.$mediaTagButton.show(); + } else { APP.$mediaTagButton.hide(); } + if (mode === "markdown") { APP.$previewButton.show(); Cryptpad.getPadAttribute('previewMode', function (e, data) { @@ -253,6 +268,25 @@ define([ var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb); $rightside.append($forgetPad); + var fileDialogCfg = { + $body: $iframe.find('body'), + onSelect: function (href) { + var parsed = Cryptpad.parsePadUrl(href); + var hexFileName = Cryptpad.base64ToHex(parsed.hashData.channel); + var src = '/blob/' + hexFileName.slice(0,2) + '/' + hexFileName; + var mt = ''; + editor.replaceSelection(mt); + }, + data: APP + }; + APP.$mediaTagButton = $('