From d31523aa08d123f421248e249e2194f7689f0b06 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 17 Apr 2015 15:58:23 +0100 Subject: [PATCH 01/74] Update hooks_server-side.md --- doc/api/hooks_server-side.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/hooks_server-side.md b/doc/api/hooks_server-side.md index c7e7a43a..717abe75 100644 --- a/doc/api/hooks_server-side.md +++ b/doc/api/hooks_server-side.md @@ -254,7 +254,7 @@ var Changeset = require("ep_etherpad-lite/static/js/Changeset"); exports.getLineHTMLForExport = function (hook, context) { var header = _analyzeLine(context.attribLine, context.apool); if (header) { - return "<" + header + ">" + context.lineContents + ""; + return "<" + header + ">" + context.lineContent + ""; } } From b8192fd0155066ebe605345de082a9d6c9f09e68 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 17 Apr 2015 17:01:15 +0100 Subject: [PATCH 02/74] first attempt at fixing dead keys, it cant be this easy can it? --- src/static/js/ace2_inner.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 1120b2c1..bcb30623 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3680,6 +3680,11 @@ function Ace2Inner(){ stopped = true; } } + else if (evt.key === "Dead"){ + // If it's a dead key we don't want to do any Etherpad behavior. + stopped = true; + return true; + } else if (type == "keydown") { outsideKeyDown(evt); From ec7b3fc787bee9ea11547d1e8e5d8e160fdfc18e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=85kre=20Solberg?= Date: Wed, 22 Apr 2015 20:29:19 +0200 Subject: [PATCH 03/74] Adding support for providing intermediate CA certificates when running etherpad-lite with ssl through Node/expressjs --- settings.json.template | 1 + src/node/hooks/express.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/settings.json.template b/settings.json.template index 39c383ed..7d9c62cc 100644 --- a/settings.json.template +++ b/settings.json.template @@ -25,6 +25,7 @@ "ssl" : { "key" : "/path-to-your/epl-server.key", "cert" : "/path-to-your/epl-server.crt" + "ca": ["/path-to-your/epl-intermediate-cert1.crt", "/path-to-your/epl-intermediate-cert2.crt"] }, */ diff --git a/src/node/hooks/express.js b/src/node/hooks/express.js index 3abe41f8..1752f5d0 100644 --- a/src/node/hooks/express.js +++ b/src/node/hooks/express.js @@ -46,6 +46,13 @@ exports.restartServer = function () { key: fs.readFileSync( settings.ssl.key ), cert: fs.readFileSync( settings.ssl.cert ) }; + if (settings.ssl.ca) { + options.ca = []; + for(var i = 0; i < settings.ssl.ca.length; i++) { + var caFileName = settings.ssl.ca[i]; + options.ca.push(fs.readFileSync(caFileName)); + } + } var https = require('https'); server = https.createServer(options, app); From b4163fc8626a6671e9b80d2f372e2a601c5ab907 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 23 Apr 2015 17:27:54 +0100 Subject: [PATCH 04/74] fix docs --- doc/api/hooks_client-side.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index f9ad9147..aa027337 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -198,7 +198,7 @@ Things in context: 1. cc - the contentcollector object 2. state - the current state of the change being made 3. tname - the tag name of this node currently being processed -4. style - the style applied to the node (probably CSS) +4. styl - the style applied to the node (probably CSS) -- Note the typo 5. cls - the HTML class string of the node This hook is called before the content of a node is collected by the usual methods. The cc object can be used to do a bunch of things that modify the content of the pad. See, for example, the heading1 plugin for etherpad original. From b349a4f226825b16620b2f9a59d300b8fb4046c1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 23 Apr 2015 17:49:08 +0100 Subject: [PATCH 05/74] probably fixes #2625 --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 1120b2c1..a32c565b 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -612,7 +612,7 @@ function Ace2Inner(){ // So this has to be set to pre-wrap ;( // We need to file a bug w/ the Chromium team. if(browser.chrome){ - $("#innerdocbody").css({"white-space":"pre-wrap"}); + $("#innerdocbody, body.doesWrap > div").css({"white-space":"pre-wrap"}); } } From a6a8c4d909a38f6b07390e12f5f2d1007fcd8350 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 24 Apr 2015 07:07:18 +0100 Subject: [PATCH 06/74] provide a script that cleans up before running to save people doing rm rf src node_modules --- bin/cleanRun.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 bin/cleanRun.sh diff --git a/bin/cleanRun.sh b/bin/cleanRun.sh new file mode 100755 index 00000000..55bcf8a7 --- /dev/null +++ b/bin/cleanRun.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +#Move to the folder where ep-lite is installed +cd `dirname $0` + +#Was this script started in the bin folder? if yes move out +if [ -d "../bin" ]; then + cd "../" +fi + +ignoreRoot=0 +for ARG in $* +do + if [ "$ARG" = "--root" ]; then + ignoreRoot=1 + fi +done + +#Stop the script if its started as root +if [ "$(id -u)" -eq 0 ] && [ $ignoreRoot -eq 0 ]; then + echo "You shouldn't start Etherpad as root!" + echo "Please type 'Etherpad rocks my socks' or supply the '--root' argument if you still want to start it as root" + read rocks + if [ ! $rocks = "Etherpad rocks my socks" ] + then + echo "Your input was incorrect" + exit 1 + fi +fi + +#Clean the current environment +rm -rf src/node_modules + +#Prepare the enviroment +bin/installDeps.sh $* || exit 1 + +#Move to the node folder and start +echo "Started Etherpad..." + +SCRIPTPATH=`pwd -P` +node $SCRIPTPATH/node_modules/ep_etherpad-lite/node/server.js $* From 254edffa9ca4deebef189c10b7846adca72024db Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 24 Apr 2015 14:17:49 +0100 Subject: [PATCH 07/74] fixes #2547 --- src/node/hooks/express.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/node/hooks/express.js b/src/node/hooks/express.js index 1752f5d0..17910e4b 100644 --- a/src/node/hooks/express.js +++ b/src/node/hooks/express.js @@ -69,6 +69,9 @@ exports.restartServer = function () { res.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains"); } + // Stop IE going into compatability mode + // https://github.com/ether/etherpad-lite/issues/2547 + res.header("X-UA-Compatible", "IE=Edge,chrome=1"); res.header("Server", serverName); next(); }); From e1406b826b41f40b55d0816868444e5abd3efe09 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 26 Apr 2015 14:42:21 +0100 Subject: [PATCH 08/74] cleaner update logic doesnt error when nothing to do --- bin/updatePlugins.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bin/updatePlugins.sh b/bin/updatePlugins.sh index d696eca7..63c447ed 100755 --- a/bin/updatePlugins.sh +++ b/bin/updatePlugins.sh @@ -8,5 +8,13 @@ if [ -d "../bin" ]; then cd "../" fi -npm outdated --depth=0 | grep -v "^Package" | awk '{print $1}' | xargs npm install $1 --save-dev - +# npm outdated --depth=0 | grep -v "^Package" | awk '{print $1}' | xargs npm install $1 --save-dev +OUTDATED=`npm outdated --depth=0 | grep -v "^Package" | awk '{print $1}'` +# echo $OUTDATED +if test -n "$OUTDATED"; then + echo "Plugins require update, doing this now..." + echo "Updating $OUTDATED" + npm install $OUTDATED --save-dev +else + echo "Plugins are all up to date" +fi From 58ab17bf9e21cd5c5266f3f7c1de80eedc1821dd Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Tue, 28 Apr 2015 05:31:07 -0700 Subject: [PATCH 09/74] Fix the way Content Collector gets the node class. Fixes #2640 --- src/static/js/contentcollector.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/static/js/contentcollector.js b/src/static/js/contentcollector.js index 857e171f..5c1e8efb 100644 --- a/src/static/js/contentcollector.js +++ b/src/static/js/contentcollector.js @@ -71,8 +71,9 @@ function makeContentCollector(collectStyles, abrowser, apool, domInterface, clas }, nodeAttr: function(n, a) { - if(n.getAttribute == null) return null; - return n.getAttribute(a); + if(n.getAttribute != null) return n.getAttribute(a); + if(n.attribs != null) return n.attribs[a]; + return null; }, optNodeInnerHTML: function(n) { @@ -516,7 +517,7 @@ function makeContentCollector(collectStyles, abrowser, apool, domInterface, clas else if (!isEmpty) { var styl = dom.nodeAttr(node, "style"); - var cls = dom.nodeProp(node, "className"); + var cls = dom.nodeAttr(node, "class"); var isPre = (tname == "pre"); if ((!isPre) && abrowser.safari) { From dbb2956d2f13cd05a8c133b0160a10c5776441ac Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 28 Apr 2015 15:48:12 +0100 Subject: [PATCH 10/74] allow chrome to use control shift 1 to send ordered list --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index a32c565b..5ec0127b 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3900,7 +3900,7 @@ function Ace2Inner(){ doInsertUnorderedList() specialHandled = true; } - if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "n" && (evt.metaKey || evt.ctrlKey) && evt.shiftKey) + if ((!specialHandled) && isTypeForCmdKey && (String.fromCharCode(which).toLowerCase() == "n" || String.fromCharCode(which) == 1) && (evt.metaKey || evt.ctrlKey) && evt.shiftKey) { // cmd-shift-N (orderedlist) fastIncorp(9); From 1f471b0f81d985416f75c5010edab6a06bd40e28 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 28 Apr 2015 23:41:55 +0100 Subject: [PATCH 11/74] show versions of plugins at startup, fixes #2642 --- src/node/server.js | 2 +- src/static/js/pluginfw/plugins.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/node/server.js b/src/node/server.js index 605ce847..2952da54 100755 --- a/src/node/server.js +++ b/src/node/server.js @@ -67,7 +67,7 @@ async.waterfall([ }, function (callback) { - console.info("Installed plugins: " + plugins.formatPlugins()); + console.info("Installed plugins: " + plugins.formatPluginsWithVersion()); console.debug("Installed parts:\n" + plugins.formatParts()); console.debug("Installed hooks:\n" + plugins.formatHooks()); diff --git a/src/static/js/pluginfw/plugins.js b/src/static/js/pluginfw/plugins.js index e02c1331..dfdf941e 100644 --- a/src/static/js/pluginfw/plugins.js +++ b/src/static/js/pluginfw/plugins.js @@ -26,6 +26,17 @@ exports.formatPlugins = function () { return _.keys(exports.plugins).join(", "); }; +exports.formatPluginsWithVersion = function () { + var plugins = []; + _.forEach(exports.plugins, function(plugin){ + if(plugin.package.name !== "ep_etherpad-lite"){ + var pluginStr = plugin.package.name + "@" + plugin.package.version; + plugins.push(pluginStr); + } + }); + return plugins.join(", "); +}; + exports.formatParts = function () { return _.map(exports.parts, function (part) { return part.full_name; }).join("\n"); }; From 74ad7a858448b461da425ed84d56e9cea892a025 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 29 Apr 2015 16:39:40 +0200 Subject: [PATCH 12/74] timeslider: Fix export links Names of the pads can contain more charaters than \w. So while transforming the export links, we simply can allow all charaters except the slash as pad names. --- src/static/js/timeslider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 75c20022..08d6f68d 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -147,7 +147,7 @@ function handleClientVars(message) // export_links is a jQuery Array, so .each is allowed. export_links.each(function() { - this.setAttribute('href', this.href.replace( /(.+?)\/\w+\/(\d+\/)?export/ , '$1/' + padId + '/' + revno + '/export')); + this.setAttribute('href', this.href.replace( /(.+?)\/[^\/]+\/(\d+\/)?export/ , '$1/' + padId + '/' + revno + '/export')); }); }); From da06ac6fd72ca42a4e2649a77a9d39b8f50d3655 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 29 Apr 2015 16:40:29 +0100 Subject: [PATCH 13/74] dont prompt twice on import fool --- src/static/js/pad_impexp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad_impexp.js b/src/static/js/pad_impexp.js index 96761570..1648f34c 100644 --- a/src/static/js/pad_impexp.js +++ b/src/static/js/pad_impexp.js @@ -235,7 +235,7 @@ var padimpexp = (function() addImportFrames(); $("#importfileinput").change(fileInputUpdated); - $('#importform').submit(fileInputSubmit); + $('#importform').unbind("submit").submit(fileInputSubmit); $('.disabledexport').click(cantExport); }, handleFrameCall: function(directDatabaseAccess, status) From 4938c7be38d69246e577cfb45e86263f7062edc0 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 29 Apr 2015 20:54:41 +0100 Subject: [PATCH 14/74] plugins always return html so use that endpoint --- src/node/handler/ImportHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index 7ad82a87..026ce020 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -228,7 +228,7 @@ exports.doImport = function(req, res, padId) function(callback) { if(!directDatabaseAccess){ var fileEnding = path.extname(srcFile).toLowerCase(); - if (abiword || fileEnding == ".htm" || fileEnding == ".html") { + if (importHandledByPlugin || abiword || fileEnding == ".htm" || fileEnding == ".html") { importHtml.setPadHTML(pad, text, function(e){ if(e) apiLogger.warn("Error importing, possibly caused by malformed HTML"); }); From 0a9c63141047beae0475747ca6e173f852f4642b Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 1 May 2015 20:44:36 +0100 Subject: [PATCH 15/74] better fix for #2625 --- src/static/css/iframe_editor.css | 6 +++++- src/static/js/ace2_inner.js | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index b7ece1e6..2824a10a 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -113,7 +113,11 @@ body.doesWrap { word-wrap: break-word; /* fix for issue #1648 - firefox not wrapping long lines (without spaces) correctly */ } -body.doesWrap > div{ +.noprewrap{ + white-space: normal; +} + +body.doesWrap:not(.noprewrap) > div{ /* Related to #1766 */ white-space: pre-wrap; } diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 5ec0127b..d3cc4fd3 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -612,7 +612,7 @@ function Ace2Inner(){ // So this has to be set to pre-wrap ;( // We need to file a bug w/ the Chromium team. if(browser.chrome){ - $("#innerdocbody, body.doesWrap > div").css({"white-space":"pre-wrap"}); + $("#innerdocbody").addClass("noprewrap"); } } From 8967c3ea4996998ef5107b21437ef9b33d264286 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 4 May 2015 10:39:03 +0200 Subject: [PATCH 16/74] Localisation updates from https://translatewiki.net. --- src/locales/ast.json | 13 ++-- src/locales/bn.json | 6 +- src/locales/br.json | 2 + src/locales/ca.json | 5 +- src/locales/de.json | 7 ++- src/locales/diq.json | 1 + src/locales/eo.json | 128 +++++++++++++++++++++++++++++++++++++++ src/locales/fa.json | 17 +++--- src/locales/fi.json | 4 +- src/locales/hsb.json | 13 ++-- src/locales/hu.json | 1 + src/locales/is.json | 126 ++++++++++++++++++++++++++++++++++++++ src/locales/it.json | 3 + src/locales/ja.json | 10 ++- src/locales/ko.json | 2 + src/locales/ksh.json | 2 +- src/locales/lb.json | 12 +++- src/locales/nl.json | 3 + src/locales/oc.json | 2 + src/locales/ps.json | 4 +- src/locales/pt-br.json | 23 +++---- src/locales/ru.json | 2 + src/locales/sl.json | 12 +++- src/locales/tr.json | 2 + src/locales/uk.json | 14 +++-- src/locales/zh-hans.json | 35 +++++------ src/locales/zh-hant.json | 8 ++- 27 files changed, 390 insertions(+), 67 deletions(-) create mode 100644 src/locales/eo.json create mode 100644 src/locales/is.json diff --git a/src/locales/ast.json b/src/locales/ast.json index 8eda58c8..47c1ccc3 100644 --- a/src/locales/ast.json +++ b/src/locales/ast.json @@ -9,14 +9,14 @@ "pad.toolbar.bold.title": "Negrina (Ctrl-B)", "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", "pad.toolbar.underline.title": "Sorrayáu (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Tacháu", - "pad.toolbar.ol.title": "Llista ordenada", - "pad.toolbar.ul.title": "Llista ensin ordenar", + "pad.toolbar.strikethrough.title": "Tacháu (Ctrl+5)", + "pad.toolbar.ol.title": "Llista ordenada (Ctrl+Mayús+N)", + "pad.toolbar.ul.title": "Llista desordenada (Ctrl+Mayús+L)", "pad.toolbar.indent.title": "Sangría (TAB)", "pad.toolbar.unindent.title": "Sangría inversa (Mayúsc+TAB)", "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autoría", + "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autoría (Ctrl+Mayús+C)", "pad.toolbar.import_export.title": "Importar/Esportar ente distintos formatos de ficheru", "pad.toolbar.timeslider.title": "Eslizador de tiempu", "pad.toolbar.savedRevision.title": "Guardar revisión", @@ -26,12 +26,14 @@ "pad.colorpicker.save": "Guardar", "pad.colorpicker.cancel": "Encaboxar", "pad.loading": "Cargando...", + "pad.noCookie": "Nun pudo alcontrase la cookie. ¡Por favor, permite les cookies nel navegador!", "pad.passwordRequired": "Necesites una contraseña pa entrar a esti bloc", "pad.permissionDenied": "Nun tienes permisu pa entrar a esti bloc", "pad.wrongPassword": "La contraseña era incorreuta", "pad.settings.padSettings": "Configuración del bloc", "pad.settings.myView": "la mio vista", "pad.settings.stickychat": "Alderique en pantalla siempres", + "pad.settings.chatandusers": "Amosar la charra y los usuarios", "pad.settings.colorcheck": "Colores d'autoría", "pad.settings.linenocheck": "Númberos de llinia", "pad.settings.rtlcheck": "¿Lleer el conteníu de drecha a izquierda?", @@ -44,6 +46,7 @@ "pad.importExport.import": "Xubir cualquier ficheru o documentu de testu", "pad.importExport.importSuccessful": "¡Correuto!", "pad.importExport.export": "Esportar el bloc actual como:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Testu simple", "pad.importExport.exportword": "Microsoft Word", @@ -104,6 +107,7 @@ "timeslider.month.december": "d'avientu", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anónimu, other: autores anónimos]}", "pad.savedrevs.marked": "Esta revisión marcose como revisión guardada", + "pad.savedrevs.timeslider": "Pues ver les revisiones guardaes visitando la llinia temporal", "pad.userlist.entername": "Escribi'l to nome", "pad.userlist.unnamed": "ensin nome", "pad.userlist.guest": "Invitáu", @@ -114,6 +118,7 @@ "pad.impexp.importing": "Importando...", "pad.impexp.confirmimport": "La importación d'un ficheru sustituirá'l testu actual del bloc. ¿Seguro que quies siguir?", "pad.impexp.convertFailed": "Nun pudimos importar esti ficheru. Por favor,usa otru formatu de ficheru diferente o copia y pega manualmente.", + "pad.impexp.padHasData": "Nun pudimos importar esti ficheru porque esti bloc yá tuvo cambios; impórtalu a un bloc nuevu", "pad.impexp.uploadFailed": "Falló la carga del ficheru, intentalo otra vuelta", "pad.impexp.importfailed": "Falló la importación", "pad.impexp.copypaste": "Por favor, copia y apega", diff --git a/src/locales/bn.json b/src/locales/bn.json index 10a804b4..e8bb7ac3 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -41,10 +41,10 @@ "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "সর্বব্যাপী দৃশ্য", "pad.settings.language": "ভাষা:", - "pad.importExport.import_export": "ইম্পোরট/এক্সপোর্ট", + "pad.importExport.import_export": "আমদানি/রপ্তানি", "pad.importExport.import": "কোন টেক্সট ফাইল বা ডকুমেন্ট আপলোড করুন", "pad.importExport.importSuccessful": "সফল!", - "pad.importExport.export": "এই প্যাডটি এক্সপোর্ট করুন", + "pad.importExport.export": "এই প্যাডটি রপ্তানি করুন:", "pad.importExport.exporthtml": "এইচটিএমএল", "pad.importExport.exportplain": "সাধারণ লেখা", "pad.importExport.exportword": "মাইক্রোসফট ওয়ার্ড", @@ -70,7 +70,7 @@ "timeslider.toolbar.authors": "লেখকগণ:", "timeslider.toolbar.authorsList": "কোনো লেখক নেই", "timeslider.toolbar.exportlink.title": "রপ্তানি", - "timeslider.exportCurrent": "বর্তমান সংস্করণটি এক্সপোর্ট করুন:", + "timeslider.exportCurrent": "বর্তমান সংস্করণটি রপ্তানি করুন:", "timeslider.version": "সংস্করণ {{version}}", "timeslider.saved": "সংরক্ষিত হয় {{month}} {{day}}, {{year}}", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", diff --git a/src/locales/br.json b/src/locales/br.json index 6bbd56d2..310c97a6 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -36,6 +36,7 @@ "pad.settings.padSettings": "Arventennoù Pad", "pad.settings.myView": "Ma diskwel", "pad.settings.stickychat": "Diskwel ar flap bepred", + "pad.settings.chatandusers": "Diskouez ar gaoz hag an implijerien", "pad.settings.colorcheck": "Livioù anaout", "pad.settings.linenocheck": "Niverennoù linennoù", "pad.settings.rtlcheck": "Lenn an danvez a-zehou da gleiz ?", @@ -109,6 +110,7 @@ "timeslider.month.december": "Kerzu", "timeslider.unnamedauthors": "{{num}} dianav {[plural(num) one: aozer, other: aozerien ]}", "pad.savedrevs.marked": "Merket eo an adweladenn-mañ evel adweladenn gwiriet", + "pad.savedrevs.timeslider": "Gallout a reot gwelet an adweladurioù enrollet en ur weladenniñ ar bignerez amzerel", "pad.userlist.entername": "Ebarzhit hoc'h anv", "pad.userlist.unnamed": "dizanv", "pad.userlist.guest": "Den pedet", diff --git a/src/locales/ca.json b/src/locales/ca.json index b7edc65b..638b645f 100644 --- a/src/locales/ca.json +++ b/src/locales/ca.json @@ -5,7 +5,8 @@ "Pginer", "Pitort", "Toniher", - "Macofe" + "Macofe", + "Joan manel" ] }, "index.newPad": "Nou pad", @@ -37,6 +38,7 @@ "pad.settings.padSettings": "Paràmetres del pad", "pad.settings.myView": "La meva vista", "pad.settings.stickychat": "Xateja sempre a la pantalla", + "pad.settings.chatandusers": "Mostra el xat i els usuaris", "pad.settings.colorcheck": "Colors d'autoria", "pad.settings.linenocheck": "Números de línia", "pad.settings.rtlcheck": "Llegir el contingut de dreta a esquerra?", @@ -110,6 +112,7 @@ "timeslider.month.december": "Desembre", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor, other: autors ]} sense nom", "pad.savedrevs.marked": "Aquesta revisió està marcada ara com a revisió desada", + "pad.savedrevs.timeslider": "Les revisions que s'han desat les podeu veure amb la línia de temps", "pad.userlist.entername": "Introduïu el vostre nom", "pad.userlist.unnamed": "sense nom", "pad.userlist.guest": "Convidat", diff --git a/src/locales/de.json b/src/locales/de.json index 4888b8e8..2fd31c12 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -4,7 +4,8 @@ "Metalhead64", "Mklehr", "Nipsky", - "Wikinaut" + "Wikinaut", + "Thargon" ] }, "index.newPad": "Neues Pad", @@ -77,7 +78,7 @@ "pad.modals.corruptPad.cause": "Dies könnte an einer falschen Serverkonfiguration oder eines anderen unerwarteten Verhaltens liegen. Bitte kontaktiere den Diensteadministrator.", "pad.modals.deleted": "Gelöscht.", "pad.modals.deleted.explanation": "Dieses Pad wurde entfernt.", - "pad.modals.disconnected": "Verbindung unterbrochen.", + "pad.modals.disconnected": "Deine Verbindung wurde getrennt.", "pad.modals.disconnected.explanation": "Die Verbindung zum Pad-Server wurde unterbrochen.", "pad.modals.disconnected.cause": "Möglicherweise ist der Pad-Server nicht erreichbar. Bitte benachrichtigen Sie den Dienstadministrator, falls dies weiterhin passiert.", "pad.share": "Dieses Pad teilen", @@ -94,7 +95,7 @@ "timeslider.toolbar.exportlink.title": "Diese Version exportieren", "timeslider.exportCurrent": "Exportiere diese Version als:", "timeslider.version": "Version {{version}}", - "timeslider.saved": "Gespeichert am {{day}}.{{month}}.{{year}}", + "timeslider.saved": "gespeichert am {{day}}. {{month}} {{year}}", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januar", "timeslider.month.february": "Februar", diff --git a/src/locales/diq.json b/src/locales/diq.json index 81a55477..c69d6244 100644 --- a/src/locales/diq.json +++ b/src/locales/diq.json @@ -38,6 +38,7 @@ "pad.settings.language": "Zıwan:", "pad.importExport.import_export": "Zeredayış/Teberdayış", "pad.importExport.importSuccessful": "Mıwafaq biye", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Metno pan", "pad.importExport.exportword": "Microsoft Word", diff --git a/src/locales/eo.json b/src/locales/eo.json new file mode 100644 index 00000000..fd7b7c1f --- /dev/null +++ b/src/locales/eo.json @@ -0,0 +1,128 @@ +{ + "@metadata": { + "authors": [ + "Eliovir", + "Mschmitt", + "Objectivesea" + ] + }, + "index.newPad": "Nova Teksto", + "index.createOpenPad": "aŭ krei/malfermi novan tekston kun la nomo:", + "pad.toolbar.bold.title": "Grasa (Ctrl+B)", + "pad.toolbar.italic.title": "Kursiva (Ctrl+I)", + "pad.toolbar.underline.title": "Substrekita (Ctrl+U)", + "pad.toolbar.strikethrough.title": "Trastrekita (Ctrl+5)", + "pad.toolbar.ol.title": "Ordigita listo (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Neordigita Listo (Ctrl+Shift+L)", + "pad.toolbar.indent.title": "Enŝovi (TAB)", + "pad.toolbar.unindent.title": "Elŝovi (Shift+TAB)", + "pad.toolbar.undo.title": "Malfari (Ctrl+Z)", + "pad.toolbar.redo.title": "Refari (Ctrl+Y)", + "pad.toolbar.clearAuthorship.title": "Forigi kolorojn de aŭtoreco (Ctrl+Shift+C)", + "pad.toolbar.import_export.title": "Enporti/elporti de/al aliaj dosierformatoj", + "pad.toolbar.timeslider.title": "Tempoŝovilo", + "pad.toolbar.savedRevision.title": "Konservi version", + "pad.toolbar.settings.title": "Agordoj", + "pad.toolbar.embed.title": "Kunhavigi kaj enigi ĉi tiun tekston", + "pad.toolbar.showusers.title": "Montri la redaktantojn sur ĉi tiu teksto", + "pad.colorpicker.save": "Konservi", + "pad.colorpicker.cancel": "Nuligi", + "pad.loading": "Ŝargante...", + "pad.noCookie": "Kuketo ne estis trovigebla. Bonvolu permesi kuketojn en via retumilo!", + "pad.passwordRequired": "Vi bezonas pasvorton por aliri ĉi tiun tekston", + "pad.permissionDenied": "Vi ne havas permeson por aliri ĉi tiun tekston", + "pad.wrongPassword": "Via pasvorto estis malĝusta", + "pad.settings.padSettings": "Redaktilaj Agordoj", + "pad.settings.myView": "Mia vido", + "pad.settings.stickychat": "Babilejo ĉiam videbla", + "pad.settings.chatandusers": "Montri babilejon kaj uzantojn", + "pad.settings.colorcheck": "Koloroj de aŭtoreco", + "pad.settings.linenocheck": "Liniaj nombroj", + "pad.settings.rtlcheck": "Legi dekstre-maldekstren?", + "pad.settings.fontType": "Tiparo:", + "pad.settings.fontType.normal": "Normala", + "pad.settings.fontType.monospaced": "Egallarĝa", + "pad.settings.globalView": "Ĉiea Vido", + "pad.settings.language": "Lingvo:", + "pad.importExport.import_export": "Enporti/Elporti", + "pad.importExport.import": "Alŝuti ajnan dosieron aŭ dokumenton", + "pad.importExport.importSuccessful": "Sukceso!", + "pad.importExport.export": "Elporti la nunan tekston kiel:", + "pad.importExport.exportetherpad": "Etherpad", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Plata teksto", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Formato “OpenDocument”)", + "pad.importExport.abiword.innerHTML": "Nur kapablas enporti de plata teksto aŭ HTML. Por pli speciala importkapablo, bonvolu instalu la programon, Abiword.", + "pad.modals.connected": "Konektita.", + "pad.modals.reconnecting": "Rekonektanta al via redaktilo..", + "pad.modals.forcereconnect": "Perforte rekonekti", + "pad.modals.userdup": "Malfermita en alia fenestro", + "pad.modals.userdup.explanation": "Ĉi tiu teksto ŝajne estas malferma en pli ol unu retumilo sur ĉi tiu komputilo.", + "pad.modals.userdup.advice": "Rekonekti por anstataŭe uzi ĉi tiun fenestron.", + "pad.modals.unauth": "Ne permesita", + "pad.modals.unauth.explanation": "Viaj permesoj ŝanĝis dum kiam vi rigardis ĉi tiun paĝon. Provu rekonekti.", + "pad.modals.looping.explanation": "Okazas problemoj dum komunikado kun la sinkronigservilo.", + "pad.modals.looping.cause": "Eble vi konektis per malkongrua fajroŝirmilo aŭ retperanto.", + "pad.modals.initsocketfail": "Servilo ne estas atingebla.", + "pad.modals.initsocketfail.explanation": "Ne kapablis konekti al la sinkronigservilo.", + "pad.modals.initsocketfail.cause": "Tio verŝajne okazas pro problemo kun via retumilo aŭ via retkonekto.", + "pad.modals.slowcommit.explanation": "La servilo ne respondas.", + "pad.modals.slowcommit.cause": "Tio eble estas pro problemoj kun retkonekto.", + "pad.modals.badChangeset.explanation": "La sinkronigservilo decidis ke redakto de vi estas malpermesita.", + "pad.modals.badChangeset.cause": "Tio eble okazis pro malĝustaj agordoj aŭ alia neatendita teniĝo sur la servilo. Se vi pensas ke estas eraro, bonvolu kontakti la servoadminstranton. Provu rekonekti por denove redakti.", + "pad.modals.corruptPad.explanation": "La teksto kiun vi provas atingi estas difekta.", + "pad.modals.corruptPad.cause": "Tio eble okazis pro malĝustaj agordoj aŭ alia neatendita teniĝo sur la servilo. Bonvolu kontakti la servoadminstranton.", + "pad.modals.deleted": "Forigita.", + "pad.modals.deleted.explanation": "Ĉi tiu teksto estis forigita.", + "pad.modals.disconnected": "Vi estas malkonektita.", + "pad.modals.disconnected.explanation": "La konekto al la servilo perdiĝis", + "pad.modals.disconnected.cause": "Eble la servilo ne estas disponebla. Bonvolu kontakti la servoadministranton se tio daŭre okazas.", + "pad.share": "Kunhavigi ĉi tiun tekston", + "pad.share.readonly": "Nur legebla", + "pad.share.link": "Ligilo", + "pad.share.emebdcode": "Enfiksi URL-on", + "pad.chat": "Babilejo", + "pad.chat.title": "Malfermi la babilejon por ĉi tiu teksto.", + "pad.chat.loadmessages": "Ŝargi pliajn mesaĝojn", + "timeslider.pageTitle": "{{appTitle}} Tempoŝovilo", + "timeslider.toolbar.returnbutton": "Reiri al teksto", + "timeslider.toolbar.authors": "Aŭtoroj:", + "timeslider.toolbar.authorsList": "Neniu aŭtoro", + "timeslider.toolbar.exportlink.title": "Elporti", + "timeslider.exportCurrent": "Elporti la nunan version kiel:", + "timeslider.version": "Versio {{version}}", + "timeslider.saved": "Konservita la {{day}}an de {{month}}, {{year}}", + "timeslider.dateformat": "{{day}}-{{month}}-{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januaro", + "timeslider.month.february": "februaro", + "timeslider.month.march": "marto", + "timeslider.month.april": "aprilo", + "timeslider.month.may": "majo", + "timeslider.month.june": "junio", + "timeslider.month.july": "julio", + "timeslider.month.august": "aŭgusto", + "timeslider.month.september": "septembro", + "timeslider.month.october": "oktobro", + "timeslider.month.november": "novembro", + "timeslider.month.december": "decembro", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: sennoma aŭtoro, other: sennomaj aŭtoroj ]}", + "pad.savedrevs.marked": "Ĉi tiu versio nun estas markita kiel konservita versio", + "pad.savedrevs.timeslider": "Vi povas rigardi konservitajn versiojn per la tempoŝovilo", + "pad.userlist.entername": "Entajpu vian nomon", + "pad.userlist.unnamed": "sennoma", + "pad.userlist.guest": "Gasto", + "pad.userlist.deny": "Malaprobi", + "pad.userlist.approve": "Aprobi", + "pad.editbar.clearcolors": "Forigi kolorojn de aŭtoreco en la tuta dokumento?", + "pad.impexp.importbutton": "Enporti Nun", + "pad.impexp.importing": "Enportanta...", + "pad.impexp.confirmimport": "Enporti dosieron superskribos la nunan tekston en la redaktilo. Ĉu vi certe volas daŭrigi?", + "pad.impexp.convertFailed": "Ni ne kapablis enporti tiun dosieron. Bonvolu uzi alian dokumentformaton aŭ permane kopii kaj alglui.", + "pad.impexp.padHasData": "Ni ne kapablis enporti tiun dosieron ĉar la teksto jam estas ŝanĝita. Bonvolu enporti en novan tekston.", + "pad.impexp.uploadFailed": "La alŝuto malsukcesis, bonvolu provi denove.", + "pad.impexp.importfailed": "Enporti malsukcesis.", + "pad.impexp.copypaste": "Bonvolu kopii kaj alglui", + "pad.impexp.exportdisabled": "Elporti en {{type}} formato estas malŝalta. Bonvolu kontakti la sistremadministranton pro pliaj informoj." +} diff --git a/src/locales/fa.json b/src/locales/fa.json index 53fb55b2..cd42c871 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -6,7 +6,8 @@ "Ebraminio", "Reza1615", "ZxxZxxZ", - "الناز" + "الناز", + "Omid.koli" ] }, "index.newPad": "دفترچه یادداشت تازه", @@ -38,6 +39,7 @@ "pad.settings.padSettings": "تنظیمات دفترچه یادداشت", "pad.settings.myView": "نمای من", "pad.settings.stickychat": "گفتگو همیشه روی صفحه نمایش باشد", + "pad.settings.chatandusers": "نمایش چت و کاربران", "pad.settings.colorcheck": "رنگ‌های نویسندگی", "pad.settings.linenocheck": "شماره‌ی خطوط", "pad.settings.rtlcheck": "خواندن محتوا از راست به چپ؟", @@ -98,19 +100,20 @@ "timeslider.saved": "{{month}} {{day}}، {{year}} ذخیره شد", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "ژانویه", - "timeslider.month.february": "فبریه", - "timeslider.month.march": "مارچ", - "timeslider.month.april": "آپریل", - "timeslider.month.may": "می", + "timeslider.month.february": "فوریه", + "timeslider.month.march": "مارس", + "timeslider.month.april": "آوریل", + "timeslider.month.may": "مه", "timeslider.month.june": "ژوئن", - "timeslider.month.july": "جولای", - "timeslider.month.august": "آگوست", + "timeslider.month.july": "ژوئیه", + "timeslider.month.august": "اوت", "timeslider.month.september": "سپتامبر", "timeslider.month.october": "اکتبر", "timeslider.month.november": "نوامبر", "timeslider.month.december": "دسامبر", "timeslider.unnamedauthors": "{{num}} نویسندهٔ بی‌نام", "pad.savedrevs.marked": "این بازنویسی هم اکنون به عنوان ذخیره شده علامت‌گذاری شد", + "pad.savedrevs.timeslider": "شما می‌توانید نسخه‌های ذخیره شده را با دیدن نوار زمان ببنید", "pad.userlist.entername": "نام خود را بنویسید", "pad.userlist.unnamed": "بدون نام", "pad.userlist.guest": "مهمان", diff --git a/src/locales/fi.json b/src/locales/fi.json index 25e4d084..67efac93 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -11,7 +11,8 @@ "Veikk0.ma", "VezonThunder", "Macofe", - "MrTapsa" + "MrTapsa", + "Silvonen" ] }, "index.newPad": "Uusi muistio", @@ -55,6 +56,7 @@ "pad.importExport.import": "Lähetä mikä tahansa tekstitiedosto tai asiakirja", "pad.importExport.importSuccessful": "Onnistui!", "pad.importExport.export": "Vie muistio muodossa:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Muotoilematon teksti", "pad.importExport.exportword": "Microsoft Word", diff --git a/src/locales/hsb.json b/src/locales/hsb.json index ddf3cc4a..d4d3ef76 100644 --- a/src/locales/hsb.json +++ b/src/locales/hsb.json @@ -9,14 +9,14 @@ "pad.toolbar.bold.title": "Tučny (Strg-B)", "pad.toolbar.italic.title": "Kursiwny (Strg-I)", "pad.toolbar.underline.title": "Podšmórnyć (Strg-U)", - "pad.toolbar.strikethrough.title": "Přešmórnyć", - "pad.toolbar.ol.title": "Čisłowana lisćina", - "pad.toolbar.ul.title": "Naličenje", + "pad.toolbar.strikethrough.title": "Přešmórnyć (Strg+5)", + "pad.toolbar.ol.title": "Čisłowana lisćina (Strg+Umsch+N)", + "pad.toolbar.ul.title": "Naličenje (Strg+Umsch+L)", "pad.toolbar.indent.title": "Zasunyć (TAB)", "pad.toolbar.unindent.title": "Wusunyć (Umsch+TAB)", "pad.toolbar.undo.title": "Cofnyć (Strg-Z)", "pad.toolbar.redo.title": "Wospjetować (Strg-Y)", - "pad.toolbar.clearAuthorship.title": "Awtorowe barby wotstronić", + "pad.toolbar.clearAuthorship.title": "Awtorowe barby wotstronić (Strg+Umsch+C)", "pad.toolbar.import_export.title": "Import/Eksport z/do druhich datajowych formatow", "pad.toolbar.timeslider.title": "Historijowa strona", "pad.toolbar.savedRevision.title": "Wersiju składować", @@ -26,12 +26,14 @@ "pad.colorpicker.save": "Składować", "pad.colorpicker.cancel": "Přetorhnyć", "pad.loading": "Začituje so...", + "pad.noCookie": "Plack njeje so namakał. Prošu dopušćće placki w swojim wobhladowaku!", "pad.passwordRequired": "Trjebaš hesło, zo by na tutón zapisnik přistup měł", "pad.permissionDenied": "Nimaće prawo za přistup na tutón zapisnik.", "pad.wrongPassword": "Twoje hesło bě wopak", "pad.settings.padSettings": "Nastajenja zapisnika", "pad.settings.myView": "Mój napohlad", "pad.settings.stickychat": "Chat přeco na wobrazowce pokazać", + "pad.settings.chatandusers": "Chat a wužiwarjow pokazać", "pad.settings.colorcheck": "Awtorowe barby", "pad.settings.linenocheck": "Linkowe čisła", "pad.settings.rtlcheck": "Wobsah wotprawa nalěwo čitać?", @@ -44,6 +46,7 @@ "pad.importExport.import": "Tekstowu dataju abo dokument nahrać", "pad.importExport.importSuccessful": "Wuspěšny!", "pad.importExport.export": "Aktualny zapisnik eksportować jako:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Luty tekst", "pad.importExport.exportword": "Microsoft Word", @@ -104,6 +107,7 @@ "timeslider.month.december": "decembra", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: awtor, two: awtoraj, few: awtorojo, other: awtorow ]} bjez mjena", "pad.savedrevs.marked": "Tuta wersija je so nětko jako składowana wersija woznamjeniła", + "pad.savedrevs.timeslider": "Móžeš sej składowane wersije wobhladować, wopytujo historiju dokumenta.", "pad.userlist.entername": "Zapodaj swoje mjeno", "pad.userlist.unnamed": "bjez mjena", "pad.userlist.guest": "Hósć", @@ -114,6 +118,7 @@ "pad.impexp.importing": "Importuje so...", "pad.impexp.confirmimport": "Importowanje dataje přepisa aktualny tekst zapisnika. Chceš woprawdźe pokročować?", "pad.impexp.convertFailed": "Njemóžachmy tutu dataju importować. Prošu wužij druhi dokumentowy format abo kopěruj manuelnje", + "pad.impexp.padHasData": "Njemóžachmy tutu dataju importować, dokelž tutón dokument hižo změny wobsahuje, prošu importuj nowy dokument.", "pad.impexp.uploadFailed": "Nahraće njeje so poradźiło, prošu spytaj hišće raz", "pad.impexp.importfailed": "Import njeje so poradźiło", "pad.impexp.copypaste": "Prošu kopěrować a zasadźić", diff --git a/src/locales/hu.json b/src/locales/hu.json index 287e7954..c4d06c27 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -37,6 +37,7 @@ "pad.settings.padSettings": "Notesz beállításai", "pad.settings.myView": "Az én nézetem", "pad.settings.stickychat": "Mindig mutasd a csevegés-dobozt", + "pad.settings.chatandusers": "Csevegés és felhasználók mutatása", "pad.settings.colorcheck": "Szerzők színei", "pad.settings.linenocheck": "Sorok számozása", "pad.settings.rtlcheck": "Tartalom olvasása balról jobbra?", diff --git a/src/locales/is.json b/src/locales/is.json new file mode 100644 index 00000000..dc3f3b33 --- /dev/null +++ b/src/locales/is.json @@ -0,0 +1,126 @@ +{ + "@metadata": { + "authors": [ + "Sveinn í Felli" + ] + }, + "index.newPad": "Ný skrifblokk", + "index.createOpenPad": "eða búa til/opna skrifblokk með heitinu:", + "pad.toolbar.bold.title": "Feitletrað (Ctrl+B)", + "pad.toolbar.italic.title": "Skáletrað (Ctrl+I)", + "pad.toolbar.underline.title": "Undirstrikað (Ctrl+U)", + "pad.toolbar.strikethrough.title": "Yfirstrikun (Ctrl+5)", + "pad.toolbar.ol.title": "Raðaður listi (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Óraðaður listi (Ctrl+Shift+L)", + "pad.toolbar.indent.title": "Inndráttur (TAB)", + "pad.toolbar.unindent.title": "Draga til baka (Shift+TAB)", + "pad.toolbar.undo.title": "Afturkalla (Ctrl+Z)", + "pad.toolbar.redo.title": "Endurtaka (Ctrl+Y)", + "pad.toolbar.clearAuthorship.title": "Hreinsa liti höfunda (Ctrl+Shift+C)", + "pad.toolbar.import_export.title": "Flytja inn/út frá/í önnur skráasnið", + "pad.toolbar.timeslider.title": "Tímalína", + "pad.toolbar.savedRevision.title": "Vista endurskoðaða útgáfu", + "pad.toolbar.settings.title": "Stillingar", + "pad.toolbar.embed.title": "Deila og ívefja þessari skrifblokk", + "pad.toolbar.showusers.title": "Sýna notendur þessarar skrifblokkar", + "pad.colorpicker.save": "Vista", + "pad.colorpicker.cancel": "Hætta við", + "pad.loading": "Hleð inn...", + "pad.noCookie": "Smákaka fannst ekki. Þú verður að leyfa smákökur í vafranum þínum!", + "pad.passwordRequired": "Þú þarft að gefa upp lykilorð til að komast á þessa skrifblokk", + "pad.permissionDenied": "Þú hefur ekki réttindi til að nota þessa skrifblokk", + "pad.wrongPassword": "Lykilorðinu þínu var hafnað", + "pad.settings.padSettings": "Stillingar skrifblokkar", + "pad.settings.myView": "Mitt yfirlit", + "pad.settings.stickychat": "Spjall alltaf á skjánum", + "pad.settings.chatandusers": "Sýna spjall og notendur", + "pad.settings.colorcheck": "Litir höfunda", + "pad.settings.linenocheck": "Línunúmer", + "pad.settings.rtlcheck": "Lesa innihaldið frá hægri til vinstri?", + "pad.settings.fontType": "Leturgerð:", + "pad.settings.fontType.normal": "Venjulegt", + "pad.settings.fontType.monospaced": "Jafnbreitt", + "pad.settings.globalView": "Yfirlitssýn", + "pad.settings.language": "Tungumál:", + "pad.importExport.import_export": "Flytja inn/út", + "pad.importExport.import": "Settu inn hverskyns texta eða skjal", + "pad.importExport.importSuccessful": "Heppnaðist!", + "pad.importExport.export": "Flytja út núverandi skrifblokk sem:", + "pad.importExport.exportetherpad": "Etherpad netskrifblokk", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Hreinn texti", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.abiword.innerHTML": "Þú getur aðeins flutt inn úr hreinum texta eða HTML sniðum. Til að geta nýtt \nfleiri þróaðri innflutningssnið settu þá upp abiword forritið.", + "pad.modals.connected": "Tengt.", + "pad.modals.reconnecting": "Endurtengist skrifblokkinni þinni...", + "pad.modals.forcereconnect": "Þvinga endurtengingu", + "pad.modals.userdup": "Opnað í öðrum glugga", + "pad.modals.userdup.explanation": "Þessi skrifblokk virðist vera opin í fleiri en einum vafraglugga á þessari tölvu.", + "pad.modals.userdup.advice": "Endurtengdu til að nota þennan glugga í staðinn.", + "pad.modals.unauth": "Ekki leyfilegt", + "pad.modals.unauth.explanation": "Heimildir þínar hafa breyst á meðan þú skoðaðir þessa síðu. Reyndu að endurtengjast.", + "pad.modals.looping.explanation": "Það eru samskiptavandamál við samstillingarmiðlarann.", + "pad.modals.looping.cause": "Hugsanlega ertu tengdur í gegnum ósamhæfðan eldvegg eða milliþjón.", + "pad.modals.initsocketfail": "Næ ekki sambandi við netþjón.", + "pad.modals.initsocketfail.explanation": "Gat ekki tengst samstillingarmiðlaranum.", + "pad.modals.initsocketfail.cause": "Þetta er líklega vegna vandamáls varðandi vafrann þinn eða internettenginguna þína.", + "pad.modals.slowcommit.explanation": "Þjónninn svarar ekki.", + "pad.modals.slowcommit.cause": "Þetta gæti verið vegna vandamála varðandi nettengingar.", + "pad.modals.badChangeset.explanation": "Breyting sem þú gerðir var flokkuð sem óleyfileg af samstillingarmiðlaranum.", + "pad.modals.badChangeset.cause": "Þetta gæti verið vegna rangrar uppsetningar á þjóninum eða annarar óvæntrar hegðunar. Hafðu samband við stjórnanda þjónustunnar ef þér sýnist þetta vera villa. Reyndu að endurtengjast til að halda áfram með breytingar.", + "pad.modals.corruptPad.explanation": "Skrifblokkin sem þú ert að reyna að tengjast er skemmd.", + "pad.modals.corruptPad.cause": "Þetta gæti verið vegna rangrar uppsetningar á þjóninum eða annarar óvæntrar hegðunar. Hafðu samband við stjórnanda þjónustunnar.", + "pad.modals.deleted": "Eytt.", + "pad.modals.deleted.explanation": "Þessi skrifblokk hefur verið fjarlægð.", + "pad.modals.disconnected": "Þú hefur verið aftengd(ur).", + "pad.modals.disconnected.explanation": "Missti tengingu við miðlara", + "pad.modals.disconnected.cause": "Miðlarinn gæti verið ekki tiltækur. Láttu kerfisstjóra vita ef þetta heldur áfram að gerast.", + "pad.share": "Deila þessari skrifblokk", + "pad.share.readonly": "Skrifvarið", + "pad.share.link": "Tengill", + "pad.share.emebdcode": "Ívefja slóð", + "pad.chat": "Spjall", + "pad.chat.title": "Opna spjallið fyrir þessa skrifblokk.", + "pad.chat.loadmessages": "Hlaða inn fleiri skeytum", + "timeslider.pageTitle": "Tímalína {{appTitle}}", + "timeslider.toolbar.returnbutton": "Fara til baka í skrifblokk", + "timeslider.toolbar.authors": "Höfundar:", + "timeslider.toolbar.authorsList": "Engir höfundar", + "timeslider.toolbar.exportlink.title": "Flytja út", + "timeslider.exportCurrent": "Flytja út núverandi útgáfu sem:", + "timeslider.version": "Útgáfa {{version}}", + "timeslider.saved": "Vistað {{day}}. {{month}}, {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Janúar", + "timeslider.month.february": "febrúar", + "timeslider.month.march": "mars", + "timeslider.month.april": "apríl", + "timeslider.month.may": "maí", + "timeslider.month.june": "júní", + "timeslider.month.july": "Júlí", + "timeslider.month.august": "ágúst", + "timeslider.month.september": "september", + "timeslider.month.october": "október", + "timeslider.month.november": "nóvember", + "timeslider.month.december": "desember", + "timeslider.unnamedauthors": "{{num}} ónefnt {[plural(num) one: höfundur, other: höfundar ]}", + "pad.savedrevs.marked": "Þessi útgáfa er núna merkt sem vistuð útgáfa", + "pad.savedrevs.timeslider": "Þú getur skoðað vistaðar útgáfur með því að fara á tímalínuna", + "pad.userlist.entername": "Settu inn nafnið þitt", + "pad.userlist.unnamed": "ónefnt", + "pad.userlist.guest": "Gestur", + "pad.userlist.deny": "Hafna", + "pad.userlist.approve": "Samþykkja", + "pad.editbar.clearcolors": "Hreinsa liti höfunda á öllu skjalinu?", + "pad.impexp.importbutton": "Flytja inn núna", + "pad.impexp.importing": "Flyt inn...", + "pad.impexp.confirmimport": "Innflutningur á skrá mun skrifa yfir þann texta sem er á skrifblokkinni núna. \nErtu viss um að þú viljir halda áfram?", + "pad.impexp.convertFailed": "Við getum ekki flutt inn þessa skrá. Notaðu annað skráasnið eða afritaðu og \nlímdu handvirkt", + "pad.impexp.padHasData": "Við getum ekki flutt inn þessa skrá því þegar er búið að breyta þessari skrifblokk, flyttu inn í nýja skrifblokk", + "pad.impexp.uploadFailed": "Sending mistókst, endilega reyndu aftur", + "pad.impexp.importfailed": "Innflutningur mistókst", + "pad.impexp.copypaste": "Afritaðu og límdu", + "pad.impexp.exportdisabled": "Útflutningur á {{type}} sniði er óvirkur. Hafðu samband við kerfisstjóra til að fá frekari aðstoð." +} diff --git a/src/locales/it.json b/src/locales/it.json index a6c30d96..082535fc 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -31,6 +31,7 @@ "pad.colorpicker.save": "Salva", "pad.colorpicker.cancel": "Annulla", "pad.loading": "Caricamento in corso…", + "pad.noCookie": "Il cookie non è stato trovato. Consenti i cookie nel tuo browser!", "pad.passwordRequired": "Per accedere a questo Pad è necessaria una password", "pad.permissionDenied": "Non si dispone dei permessi necessari per accedere a questo Pad", "pad.wrongPassword": "La password è sbagliata", @@ -111,6 +112,7 @@ "timeslider.month.december": "dicembre", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autore, other: autori ]} senza nome", "pad.savedrevs.marked": "Questa revisione è ora contrassegnata come una versione salvata", + "pad.savedrevs.timeslider": "Puoi vedere le versioni salvate visitando la cronologia", "pad.userlist.entername": "Inserisci il tuo nome", "pad.userlist.unnamed": "senza nome", "pad.userlist.guest": "Ospite", @@ -121,6 +123,7 @@ "pad.impexp.importing": "Importazione in corso...", "pad.impexp.confirmimport": "L'importazione del file sovrascriverà il testo attuale del Pad. Sei sicuro di voler procedere?", "pad.impexp.convertFailed": "Non è stato possibile importare questo file. Utilizzare un formato differente o copiare ed incollare a mano", + "pad.impexp.padHasData": "Non è possibile importare questo file poiché questo Pad ha già avuto modifiche; importalo in un nuovo Pad", "pad.impexp.uploadFailed": "Caricamento non riuscito, riprovare", "pad.impexp.importfailed": "Importazione fallita", "pad.impexp.copypaste": "Si prega di copiare e incollare", diff --git a/src/locales/ja.json b/src/locales/ja.json index 62e6dc62..b6cc4e34 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "Shirayuki" + "Shirayuki", + "Torinky" ] }, "index.newPad": "新規作成", @@ -16,7 +17,7 @@ "pad.toolbar.unindent.title": "インデント解除 (Shift+Tab)", "pad.toolbar.undo.title": "元に戻す (Ctrl+Z)", "pad.toolbar.redo.title": "やり直し (Ctrl+Y)", - "pad.toolbar.clearAuthorship.title": "作者の色分けを消去", + "pad.toolbar.clearAuthorship.title": "作者の色分けを消去(Ctrl+Shift+C)", "pad.toolbar.import_export.title": "他の形式のファイルのインポート/エクスポート", "pad.toolbar.timeslider.title": "タイムスライダー", "pad.toolbar.savedRevision.title": "版を保存", @@ -26,12 +27,14 @@ "pad.colorpicker.save": "保存", "pad.colorpicker.cancel": "キャンセル", "pad.loading": "読み込み中...", + "pad.noCookie": "クッキーが見つかりません。ブラウザの設定でクッキーの使用を許可してください。", "pad.passwordRequired": "このパッドにアクセスするにはパスワードが必要です", "pad.permissionDenied": "あなたにはこのパッドへのアクセス許可がありません", "pad.wrongPassword": "パスワードが間違っています", "pad.settings.padSettings": "パッドの設定", "pad.settings.myView": "個人設定", "pad.settings.stickychat": "画面にチャットを常に表示", + "pad.settings.chatandusers": "チャットとユーザーを表示", "pad.settings.colorcheck": "作者の色分け", "pad.settings.linenocheck": "行番号", "pad.settings.rtlcheck": "右横書きにする", @@ -44,6 +47,7 @@ "pad.importExport.import": "あらゆるテキストファイルや文書をアップロードできます", "pad.importExport.importSuccessful": "完了しました。", "pad.importExport.export": "現在のパッドをエクスポートする形式:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "プレーンテキスト", "pad.importExport.exportword": "Microsoft Word", @@ -104,6 +108,7 @@ "timeslider.month.december": "12月", "timeslider.unnamedauthors": "{{num}} 人の匿名の{[plural(num) other: 作者 ]}", "pad.savedrevs.marked": "この版を、保存済みの版としてマークしました。", + "pad.savedrevs.timeslider": "タイムスライダーで保存された版を確認できます", "pad.userlist.entername": "名前を入力", "pad.userlist.unnamed": "名前なし", "pad.userlist.guest": "ゲスト", @@ -114,6 +119,7 @@ "pad.impexp.importing": "インポート中...", "pad.impexp.confirmimport": "ファイルをインポートすると、パッドの現在のテキストが上書きされます。本当に続行しますか?", "pad.impexp.convertFailed": "このファイルをインポートできませんでした。他の文書形式を使用するか、手作業でコピー & ペーストしてください", + "pad.impexp.padHasData": "このパッドは変更されたため、ファイルからインポートできませんでした。新しいパッドにインポートしてください。", "pad.impexp.uploadFailed": "アップロードに失敗しました。もう一度お試しください", "pad.impexp.importfailed": "インポートに失敗しました", "pad.impexp.copypaste": "コピー & ペーストしてください", diff --git a/src/locales/ko.json b/src/locales/ko.json index e18c5bbd..4a71d8ee 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -28,12 +28,14 @@ "pad.colorpicker.save": "저장", "pad.colorpicker.cancel": "취소", "pad.loading": "불러오는 중...", + "pad.noCookie": "쿠키를 찾을 수 없습니다. 브라우저에서 쿠키를 허용해주세요!", "pad.passwordRequired": "이 패드에 접근하려면 비밀번호가 필요합니다", "pad.permissionDenied": "이 패드에 접근할 권한이 없습니다", "pad.wrongPassword": "비밀번호가 잘못되었습니다", "pad.settings.padSettings": "패드 설정", "pad.settings.myView": "내 보기", "pad.settings.stickychat": "화면에 항상 대화 보기", + "pad.settings.chatandusers": "채트와 사용자 보이기", "pad.settings.colorcheck": "저자 색", "pad.settings.linenocheck": "줄 번호", "pad.settings.rtlcheck": "우횡서(오른쪽에서 왼쪽으로)입니까?", diff --git a/src/locales/ksh.json b/src/locales/ksh.json index f851bbf1..5d5230d3 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -25,7 +25,7 @@ "pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije", "pad.colorpicker.save": "Faßhallde", "pad.colorpicker.cancel": "Ophüüre", - "pad.loading": "Ben aam Laade …", + "pad.loading": "Ben aam Lahde …", "pad.noCookie": "Dat Pläzje wood nit jevonge. Don dat en Dingem Brauser zohlohße!", "pad.passwordRequired": "Do bruchs e Paßwoot för heh dat Pädd.", "pad.permissionDenied": "Do häs nit dat Rääsch, op heh dat Pädd zohzejriife.", diff --git a/src/locales/lb.json b/src/locales/lb.json index 68bdb418..99bfe0b5 100644 --- a/src/locales/lb.json +++ b/src/locales/lb.json @@ -2,28 +2,38 @@ "@metadata": { "authors": [ "Robby", - "Soued031" + "Soued031", + "Gromper" ] }, "index.newPad": "Neie Pad", + "index.createOpenPad": "oder maacht ee Pad mat dësem Numm op:", + "pad.toolbar.underline.title": "Ënnerstrach (Ctrl+U)", + "pad.toolbar.strikethrough.title": "Duerchgestrach (Ctrl+5)", "pad.toolbar.ol.title": "Numeréiert Lëscht (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Net-numeréiert Lëscht (Ctrl+Shift+L)", "pad.toolbar.undo.title": "Réckgängeg (Ctrl-Z)", "pad.toolbar.redo.title": "Widderhuelen (Ctrl-Y)", "pad.toolbar.savedRevision.title": "Versioun späicheren", "pad.toolbar.settings.title": "Astellungen", + "pad.toolbar.showusers.title": "Aktuell Benotzer vun dësem Pad uweisen", "pad.colorpicker.save": "Späicheren", "pad.colorpicker.cancel": "Ofbriechen", "pad.loading": "Lueden...", "pad.noCookie": "Cookie gouf net fonnt. Erlaabt w.e.g. Cookien an Ärem Browser!", + "pad.passwordRequired": "Dir braucht ee Passwuert fir dëse Pad opzemaachen", + "pad.permissionDenied": "Dir hutt net déi néideg Rechter fir dëse Pad opzemaachen", "pad.wrongPassword": "Äert Passwuert ass falsch", + "pad.settings.myView": "Méng Usiicht", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Sprooch:", + "pad.importExport.import_export": "Import/Export", "pad.importExport.importSuccessful": "Erfollegräich", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.modals.connected": "Verbonnen.", "pad.modals.unauth": "Net autoriséiert", "pad.modals.slowcommit.explanation": "De Server äntwert net.", "pad.modals.deleted": "Geläscht.", diff --git a/src/locales/nl.json b/src/locales/nl.json index 183d0fa9..0aa63d8e 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -94,6 +94,9 @@ "timeslider.exportCurrent": "Huidige versie exporteren als:", "timeslider.version": "Versie {{version}}", "timeslider.saved": "Opgeslagen op {{day}} {{month}} {{year}}", + "timeslider.playPause": "Padinhoud afspelen of pauzeren", + "timeslider.backRevision": "Een versie teruggaan voor deze pad", + "timeslider.forwardRevision": "Een versie vooruit gaan voor deze pad", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januari", "timeslider.month.february": "februari", diff --git a/src/locales/oc.json b/src/locales/oc.json index e62d387a..62625ed7 100644 --- a/src/locales/oc.json +++ b/src/locales/oc.json @@ -33,6 +33,7 @@ "pad.settings.padSettings": "Paramètres del Pad", "pad.settings.myView": "Ma vista", "pad.settings.stickychat": "Afichar totjorn lo chat", + "pad.settings.chatandusers": "Afichar la discussion e los utilizaires", "pad.settings.colorcheck": "Colors d’identificacion", "pad.settings.linenocheck": "Numèros de linhas", "pad.settings.rtlcheck": "Lectura de drecha a esquèrra", @@ -106,6 +107,7 @@ "timeslider.month.december": "Decembre", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anonim, other: autors anonims ]}", "pad.savedrevs.marked": "Aquesta revision es ara marcada coma revision enregistrada", + "pad.savedrevs.timeslider": "Podètz veire las revisions enregistradas en visitant l’ascensor temporal", "pad.userlist.entername": "Entratz vòstre nom", "pad.userlist.unnamed": "sens nom", "pad.userlist.guest": "Convidat", diff --git a/src/locales/ps.json b/src/locales/ps.json index 1a57e76a..2c23d1c3 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -10,7 +10,7 @@ "pad.toolbar.italic.title": "رېوند (Ctrl-I)", "pad.toolbar.undo.title": "ناکړل (Ctrl-Z)", "pad.toolbar.redo.title": "بياکړل (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "د ليکوالۍ رنګونه سپينول", + "pad.toolbar.clearAuthorship.title": "د ليکوالۍ رنگونه سپينول (Ctrl+Shift+C)", "pad.toolbar.savedRevision.title": "مخکتنه خوندي کول", "pad.toolbar.settings.title": "امستنې", "pad.colorpicker.save": "خوندي کول", @@ -20,7 +20,7 @@ "pad.wrongPassword": "پټنوم مو سم نه و", "pad.settings.padSettings": "د ليکچې امستنې", "pad.settings.myView": "زما کتنه", - "pad.settings.colorcheck": "د ليکوالۍ رنګونه", + "pad.settings.colorcheck": "د ليکوالۍ رنگونه", "pad.settings.fontType": "ليکبڼې ډول:", "pad.settings.fontType.normal": "نورمال", "pad.settings.fontType.monospaced": "مونوسپېس", diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 1fd145bc..59d679c8 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -12,14 +12,15 @@ "Macofe", "Rodrigo codignoli", "Webysther", - "Fasouzafreitas" + "Fasouzafreitas", + "Lpagliari" ] }, "index.newPad": "Nova Nota", "index.createOpenPad": "ou criar-abrir uma Nota com o nome:", "pad.toolbar.bold.title": "Negrito (Ctrl-B)", "pad.toolbar.italic.title": "Itálico (Ctrl-I)", - "pad.toolbar.underline.title": "Sublinhar (Ctrl-U)", + "pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", "pad.toolbar.strikethrough.title": "Tachado (Ctrl+5)", "pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Lista não ordenada (Ctrl+Shift+L)", @@ -43,8 +44,8 @@ "pad.wrongPassword": "Senha incorreta", "pad.settings.padSettings": "Configurações da Nota", "pad.settings.myView": "Minha Visão", - "pad.settings.stickychat": "Conversa sempre visível", - "pad.settings.chatandusers": "Mostrar o chat e os usuários", + "pad.settings.stickychat": "Bate-papo sempre visível", + "pad.settings.chatandusers": "Mostrar o bate-papo e os usuários", "pad.settings.colorcheck": "Cores de autoria", "pad.settings.linenocheck": "Números de linha", "pad.settings.rtlcheck": "Ler conteúdo da direita para esquerda?", @@ -56,7 +57,7 @@ "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Enviar um arquivo texto ou documento", "pad.importExport.importSuccessful": "Completo!", - "pad.importExport.export": "Exportar a presente nota como:", + "pad.importExport.export": "Exportar a nota atual como:", "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto puro", @@ -67,21 +68,21 @@ "pad.modals.connected": "Conectado.", "pad.modals.reconnecting": "Reconectando à sua nota...", "pad.modals.forcereconnect": "Forçar reconexão", - "pad.modals.userdup": "Aberto noutra janela", + "pad.modals.userdup": "Aberto em outra janela", "pad.modals.userdup.explanation": "Esta nota parece estar aberta em mais de uma janela de navegador deste computador.", "pad.modals.userdup.advice": "Reconectar para usar esta janela.", "pad.modals.unauth": "Não autorizado", "pad.modals.unauth.explanation": "Suas permissões foram mudadas enquanto visualizava esta página. Tente reconectar.", "pad.modals.looping.explanation": "Há problemas de comunicação com o servidor de sincronização.", "pad.modals.looping.cause": "Talvez você tenha conectado por um firewall ou proxy incompatível.", - "pad.modals.initsocketfail": "Servidor é inalcançável.", + "pad.modals.initsocketfail": "Servidor está indisponível.", "pad.modals.initsocketfail.explanation": "Não foi possível conectar com o servidor de sincronização.", "pad.modals.initsocketfail.cause": "Isto provavelmente ocorreu por um problema em seu navegador ou conexão.", "pad.modals.slowcommit.explanation": "O servidor não responde.", "pad.modals.slowcommit.cause": "Isto pode ser por problemas com a conexão de rede.", "pad.modals.badChangeset.explanation": "Uma edição que você fez foi classificada como ilegal pelo servidor de sincronização.", "pad.modals.badChangeset.cause": "Isto pode ocorrer devido a uma configuração errada do servidor ou algum outro comportamento inesperado. Por favor contate o administrador, se você acredita que é um erro. Tente reconectar para continuar editando.", - "pad.modals.corruptPad.explanation": "O pad que você está tentando acessar está corrompido.", + "pad.modals.corruptPad.explanation": "A nota que você está tentando acessar está corrompida.", "pad.modals.corruptPad.cause": "Isto pode ocorrer devido a uma configuração errada do servidor ou algum outro comportamento inesperado. Por favor contate o administrador.", "pad.modals.deleted": "Excluído.", "pad.modals.deleted.explanation": "Esta nota foi removida.", @@ -118,7 +119,7 @@ "timeslider.month.december": "Dezembro", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anônimo, other: autores anônimos ]}", "pad.savedrevs.marked": "Esta revisão foi marcada como salva", - "pad.savedrevs.timeslider": "Pode consultar as revisões salvas visitando a linha do tempo", + "pad.savedrevs.timeslider": "Você pode consultar as revisões salvas visitando a linha do tempo", "pad.userlist.entername": "Insira o seu nome", "pad.userlist.unnamed": "Sem título", "pad.userlist.guest": "Convidado", @@ -127,9 +128,9 @@ "pad.editbar.clearcolors": "Deseja limpar cores de autoria em todo o documento?", "pad.impexp.importbutton": "Importar agora", "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "Importar um arquivo sobrescreverá o atual texto da nota. Tem certeza de que deseja prosseguir?", + "pad.impexp.confirmimport": "Importar um arquivo sobrescreverá o texto atual da nota. Tem certeza de que deseja prosseguir?", "pad.impexp.convertFailed": "Não foi possível importar este arquivo. Use outro formato ou copie e cole manualmente", - "pad.impexp.padHasData": "Não foi possível importar este arquivo porque este bloco de notas já tinha alterações, consulte como importar para um novo bloco de notas", + "pad.impexp.padHasData": "Não foi possível importar este arquivo porque esta nota já tinha alterações, consulte como importar para uma nova nota", "pad.impexp.uploadFailed": "O envio falhou. Tente outra vez", "pad.impexp.importfailed": "A importação falhou", "pad.impexp.copypaste": "Copie e cole", diff --git a/src/locales/ru.json b/src/locales/ru.json index bd2143a1..9a17dda7 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -30,12 +30,14 @@ "pad.colorpicker.save": "Сохранить", "pad.colorpicker.cancel": "Отмена", "pad.loading": "Загрузка...", + "pad.noCookie": "Куки не найдены. Пожалуйста, включите куки в вашем браузере!", "pad.passwordRequired": "Вам нужен пароль для доступа", "pad.permissionDenied": "У вас нет разрешения на доступ", "pad.wrongPassword": "Неправильный пароль", "pad.settings.padSettings": "Настройки документа", "pad.settings.myView": "Мой вид", "pad.settings.stickychat": "Всегда отображать чат", + "pad.settings.chatandusers": "Показать чат и пользователей", "pad.settings.colorcheck": "Цвета документа", "pad.settings.linenocheck": "Номера строк", "pad.settings.rtlcheck": "Читать содержимое справа налево?", diff --git a/src/locales/sl.json b/src/locales/sl.json index 41a6ce76..a51cb53d 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -2,16 +2,17 @@ "@metadata": { "authors": [ "Dbc334", - "Mateju" + "Mateju", + "Skalcaa" ] }, - "index.newPad": "Nov dokument", + "index.newPad": "Nova Ploščica", "index.createOpenPad": "ali pa odpri dokument z imenom:", "pad.toolbar.bold.title": "Krepko (Ctrl-B)", "pad.toolbar.italic.title": "Ležeče (Ctrl-I)", "pad.toolbar.underline.title": "Podčrtano (Ctrl-U)", "pad.toolbar.strikethrough.title": "Prečrtano (Ctrl+5)", - "pad.toolbar.ol.title": "Oštevilčen seznam (Ctrl+Shift+N)", + "pad.toolbar.ol.title": "Urejen seznam (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Neurejen seznam (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Zamik desno (TAB)", "pad.toolbar.unindent.title": "Zamik levo (Shift+TAB)", @@ -27,12 +28,14 @@ "pad.colorpicker.save": "Shrani", "pad.colorpicker.cancel": "Prekliči", "pad.loading": "Nalaganje ...", + "pad.noCookie": "Piškotka ni bilo mogoče najti. Prosimo, dovolite piškotke v vašem brskalniku!", "pad.passwordRequired": "Za dostop do dokumenta je zahtevano geslo.", "pad.permissionDenied": "Za dostop do dokumenta so zahtevana posebna dovoljenja.", "pad.wrongPassword": "Vpisano geslo je napačno.", "pad.settings.padSettings": "Nastavitve dokumenta", "pad.settings.myView": "Pogled", "pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu.", + "pad.settings.chatandusers": "Prikaži klepet in uporabnike", "pad.settings.colorcheck": "Barve avtorstva", "pad.settings.linenocheck": "Številke vrstic", "pad.settings.rtlcheck": "Ali naj se vsebina prebira od desne proti levi?", @@ -45,6 +48,7 @@ "pad.importExport.import": "Naloži katerokoli besedilno datoteko ali dokument.", "pad.importExport.importSuccessful": "Opravilo je uspešno končano!", "pad.importExport.export": "Izvozi trenutni dokument kot:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML (oblikovano besedilo)", "pad.importExport.exportplain": "TXT (neoblikovano besedilo)", "pad.importExport.exportword": "DOC (zapis Microsoft Word)", @@ -105,6 +109,7 @@ "timeslider.month.december": "December", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: neimenovan avtor, plural(num) two: neimenovana avtorja, plural(num) few: neimenovani avtorji, other: neimenovanih avtorjev ]}", "pad.savedrevs.marked": "Ta predelava je označena kot shranjena predelava.", + "pad.savedrevs.timeslider": "Shranjene revizije si lahko ogledate s pomočjo časovnega traku", "pad.userlist.entername": "Vpišite ime", "pad.userlist.unnamed": "neimenovana oseba", "pad.userlist.guest": "Gost", @@ -115,6 +120,7 @@ "pad.impexp.importing": "Poteka uvažanje ...", "pad.impexp.confirmimport": "Uvoz datoteke prepiše obstoječe besedilo dokumenta. Ali ste prepričani, da želite nadaljevati?", "pad.impexp.convertFailed": "Datoteke ni mogoče uvoziti. Uporabiti je treba enega izmed podprtih zapisov dokumentov ali pa vsebino prilepiti ročno.", + "pad.impexp.padHasData": "Nismo mogli uvoziti datoteke, ker ta Ploščica že vsebuje spremembe. Prosimo, uvozite datoteko v novo ploščico", "pad.impexp.uploadFailed": "Nalaganje je spodletelo, poskusite znova.", "pad.impexp.importfailed": "Uvoz je spodletel.", "pad.impexp.copypaste": "Vsebino kopirajte in prilepite.", diff --git a/src/locales/tr.json b/src/locales/tr.json index b0b6dbee..80927b7f 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -37,6 +37,7 @@ "pad.settings.padSettings": "Bloknot Ayarları", "pad.settings.myView": "Görünümüm", "pad.settings.stickychat": "Ekranda her zaman sohbet edin", + "pad.settings.chatandusers": "Sohbeti ve Kullanıcıları Göster", "pad.settings.colorcheck": "Yazarlık renkleri", "pad.settings.linenocheck": "Satır numaraları", "pad.settings.rtlcheck": "İçerik sağdan sola doğru okunsun mu?", @@ -110,6 +111,7 @@ "timeslider.month.december": "Aralık", "timeslider.unnamedauthors": "{{num}} adsız {[plural(num) one: yazar, other: yazar ]}", "pad.savedrevs.marked": "Bu düzenleme artık kayıtlı bir düzeltme olarak işaretlendi", + "pad.savedrevs.timeslider": "Zaman kaydırıcısını ziyaret ederek kaydedilen revizyonları görebilirsiniz", "pad.userlist.entername": "Adınızı girin", "pad.userlist.unnamed": "Adlandırılmamış", "pad.userlist.guest": "Misafir", diff --git a/src/locales/uk.json b/src/locales/uk.json index 79a39a33..9dcde98e 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -5,7 +5,8 @@ "Base", "Olvin", "Steve.rusyn", - "SteveR" + "SteveR", + "Lxlalexlxl" ] }, "index.newPad": "Створити", @@ -13,14 +14,14 @@ "pad.toolbar.bold.title": "Напівжирний (Ctrl-B)", "pad.toolbar.italic.title": "Курсив (Ctrl-I)", "pad.toolbar.underline.title": "Підкреслення (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Закреслення", - "pad.toolbar.ol.title": "Упорядкований список", - "pad.toolbar.ul.title": "Неупорядкований список", + "pad.toolbar.strikethrough.title": "Закреслення (Ctrl+5)", + "pad.toolbar.ol.title": "Упорядкований список (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Неупорядкований список (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Відступ (TAB)", "pad.toolbar.unindent.title": "Виступ (Shift+TAB)", "pad.toolbar.undo.title": "Скасувати (Ctrl-Z)", "pad.toolbar.redo.title": "Повторити (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Очистити кольори документу", + "pad.toolbar.clearAuthorship.title": "Очистити кольори документу (Ctrl+Shift+C)", "pad.toolbar.import_export.title": "Імпорт/Експорт з використанням різних форматів файлів", "pad.toolbar.timeslider.title": "Шкала часу", "pad.toolbar.savedRevision.title": "Зберегти версію", @@ -30,12 +31,14 @@ "pad.colorpicker.save": "Зберегти", "pad.colorpicker.cancel": "Скасувати", "pad.loading": "Завантаження…", + "pad.noCookie": "Реп'яшки не знайдено. Будь-ласка, увімкніть реп'яшки у вашому браузері!", "pad.passwordRequired": "Вам необхідний пароль для доступу до цього документу", "pad.permissionDenied": "Ви не має дозволу для доступу до цього документу", "pad.wrongPassword": "Неправильний пароль", "pad.settings.padSettings": "Налаштування документу", "pad.settings.myView": "Мій Вигляд", "pad.settings.stickychat": "Завжди відображувати чат", + "pad.settings.chatandusers": "Показати чат і користувачів", "pad.settings.colorcheck": "Кольори документу", "pad.settings.linenocheck": "Номери рядків", "pad.settings.rtlcheck": "Читати вміст з права на ліво?", @@ -48,6 +51,7 @@ "pad.importExport.import": "Завантажити будь-який текстовий файл або документ", "pad.importExport.importSuccessful": "Успішно!", "pad.importExport.export": "Експортувати поточний документ як:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Звичайний текст", "pad.importExport.exportword": "Microsoft Word", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index 4af3cb48..31b7f7f3 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -10,20 +10,21 @@ "Shizhao", "Yfdyh000", "乌拉跨氪", - "燃玉" + "燃玉", + "JuneAugust" ] }, "index.newPad": "新记事本", "index.createOpenPad": "或者创建/打开带名字的记事本:", "pad.toolbar.bold.title": "粗体(Ctrl-B)", - "pad.toolbar.italic.title": "斜体 (Ctrl-I)", + "pad.toolbar.italic.title": "斜体(Ctrl-I)", "pad.toolbar.underline.title": "下划线(Ctrl-U)", "pad.toolbar.strikethrough.title": "删除线(Ctrl+5)", "pad.toolbar.ol.title": "有序列表(Ctrl+Shift+N)", "pad.toolbar.ul.title": "无序列表(Ctrl+Shift+L)", "pad.toolbar.indent.title": "增加缩进(TAB)", "pad.toolbar.unindent.title": "减少缩进(Shift+TAB)", - "pad.toolbar.undo.title": "撤消 (Ctrl-Z)", + "pad.toolbar.undo.title": "撤消(Ctrl-Z)", "pad.toolbar.redo.title": "重做(Ctrl+Y)", "pad.toolbar.clearAuthorship.title": "清除作者颜色(Ctrl+Shift+C)", "pad.toolbar.import_export.title": "从不同的文件格式导入/导出", @@ -79,7 +80,7 @@ "pad.modals.slowcommit.cause": "这可能是由于网络连接问题。", "pad.modals.badChangeset.explanation": "您的一个编辑被同步服务器分类为非法。", "pad.modals.badChangeset.cause": "这可能是因为服务器配置的错误或者其他未预料到的行为。如果您认为这是错误,请联系服务管理员。要继续编辑,请尝试重新连接。", - "pad.modals.corruptPad.explanation": "您试图连接的平板已损坏。", + "pad.modals.corruptPad.explanation": "您试图连接的记事本已损坏。", "pad.modals.corruptPad.cause": "这可能是因为服务器配置的错误或者其他未预料到的行为。请联系服务管理员。", "pad.modals.deleted": "已刪除。", "pad.modals.deleted.explanation": "此记事本已被移除。", @@ -101,19 +102,19 @@ "timeslider.exportCurrent": "当前版本导出为:", "timeslider.version": "版本 {{version}}", "timeslider.saved": "在{{year}}年{{month}}{{day}}日保存", - "timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}时:{{minutes}}分:{{seconds}}秒", + "timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}{{minutes}}{{seconds}}", "timeslider.month.january": "1月", "timeslider.month.february": "2月", - "timeslider.month.march": "三月", - "timeslider.month.april": "四月", - "timeslider.month.may": "五月", - "timeslider.month.june": "六月", - "timeslider.month.july": "七月", - "timeslider.month.august": "八月", - "timeslider.month.september": "九月", - "timeslider.month.october": "十月", - "timeslider.month.november": "十一月", - "timeslider.month.december": "十二月", + "timeslider.month.march": "3月", + "timeslider.month.april": "4月", + "timeslider.month.may": "5月", + "timeslider.month.june": "6月", + "timeslider.month.july": "7月", + "timeslider.month.august": "8月", + "timeslider.month.september": "9月", + "timeslider.month.october": "10月", + "timeslider.month.november": "11月", + "timeslider.month.december": "12月", "timeslider.unnamedauthors": "{{num}}个匿名作者", "pad.savedrevs.marked": "这一修订现在被标记为已保存的修订版本", "pad.savedrevs.timeslider": "您可以使用时间滑块查阅已保存的版本", @@ -126,8 +127,8 @@ "pad.impexp.importbutton": "现在导入", "pad.impexp.importing": "正在导入...", "pad.impexp.confirmimport": "导入的文件将覆盖记事本的当前文本。你确定要继续吗?", - "pad.impexp.convertFailed": "我们无法导入此文档。请使用他文档格式或手动复制贴上。", - "pad.impexp.padHasData": "我们无法导入此文件,因为此记事本已经变更,请导入到一个新的记事本", + "pad.impexp.convertFailed": "我们无法导入此文档。请使用其他文档格式或手动复制贴上。", + "pad.impexp.padHasData": "我们无法导入此文件,因为此记事本已经变更,请导入到一个新的记事本中", "pad.impexp.uploadFailed": "上载失败,请重试", "pad.impexp.importfailed": "导入失败", "pad.impexp.copypaste": "请复制粘贴", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index a692d0ca..48dd577c 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -6,7 +6,8 @@ "Shangkuanlc", "Shirayuki", "Simon Shek", - "LNDDYL" + "LNDDYL", + "Wehwei" ] }, "index.newPad": "新Pad", @@ -21,7 +22,7 @@ "pad.toolbar.unindent.title": "凸排(Shift+TAB)", "pad.toolbar.undo.title": "撤銷(Ctrl-Z)", "pad.toolbar.redo.title": "重做(Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "清除協作者顏色區別", + "pad.toolbar.clearAuthorship.title": "清除協作者顏色區別 (Ctrl+Shift+C)", "pad.toolbar.import_export.title": "以其他檔案格式匯入/匯出", "pad.toolbar.timeslider.title": "時間軸", "pad.toolbar.savedRevision.title": "儲存修訂", @@ -31,12 +32,14 @@ "pad.colorpicker.save": "儲存", "pad.colorpicker.cancel": "取消", "pad.loading": "載入中...", + "pad.noCookie": "找不到 Cookie。請讓你的瀏覽器允許 Cookie!", "pad.passwordRequired": "您需要密碼才能訪問這個pad", "pad.permissionDenied": "你沒有訪問這個pad的權限", "pad.wrongPassword": "密碼錯誤", "pad.settings.padSettings": "Pad設定", "pad.settings.myView": "我的視窗", "pad.settings.stickychat": "永遠在屏幕上顯示聊天", + "pad.settings.chatandusers": "顯示聊天及用戶", "pad.settings.colorcheck": "協作者顏色", "pad.settings.linenocheck": "行號", "pad.settings.rtlcheck": "從右至左讀取內容?", @@ -49,6 +52,7 @@ "pad.importExport.import": "上載任何文字檔或文件", "pad.importExport.importSuccessful": "完成!", "pad.importExport.export": "匯出當前pad為:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "純文字", "pad.importExport.exportword": "Microsoft Word", From 9b85b8dc98570e4a5d61cea96378d594d3a4bc4e Mon Sep 17 00:00:00 2001 From: 0ip Date: Mon, 4 May 2015 22:18:34 +0200 Subject: [PATCH 17/74] Fix popup border --- src/static/css/pad.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index ff8ab5ab..49a54fb0 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -860,6 +860,7 @@ input[type=checkbox] { padding: 10px; border-radius: 0 0 6px 6px; border: 1px solid #ccc; + border-top: none; background: #f7f7f7; background: -webkit-linear-gradient(#F7F7F7, #EEE); background: -moz-linear-gradient(#F7F7F7, #EEE); From 5e64c292a4ae2639bf068d31a208f582513149c7 Mon Sep 17 00:00:00 2001 From: Xavid Date: Tue, 5 May 2015 14:14:25 -0400 Subject: [PATCH 18/74] When using setText(), replace the entire existing text of the pad, rather than replacing all except the last letter. --- src/node/db/Pad.js | 2 +- src/static/js/Changeset.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index 53847600..e70628b7 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -290,7 +290,7 @@ Pad.prototype.setText = function setText(newText) { var oldText = this.text(); //create the changeset - var changeset = Changeset.makeSplice(oldText, 0, oldText.length-1, newText); + var changeset = Changeset.makeSplice(oldText, 0, oldText.length, newText); //append the changeset this.appendRevision(changeset); diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index df180f9c..04a05514 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -260,13 +260,13 @@ exports.checkRep = function (cs) { break; case '-': oldPos += o.chars; - exports.assert(oldPos < oldLen, oldPos, " >= ", oldLen, " in ", cs); + exports.assert(oldPos <= oldLen, oldPos, " > ", oldLen, " in ", cs); break; case '+': { calcNewLen += o.chars; numInserted += o.chars; - exports.assert(calcNewLen < newLen, calcNewLen, " >= ", newLen, " in ", cs); + exports.assert(calcNewLen <= newLen, calcNewLen, " > ", newLen, " in ", cs); break; } } @@ -1408,8 +1408,8 @@ exports.makeSplice = function (oldFullText, spliceStart, numRemoved, newText, op if (spliceStart >= oldLen) { spliceStart = oldLen - 1; } - if (numRemoved > oldFullText.length - spliceStart - 1) { - numRemoved = oldFullText.length - spliceStart - 1; + if (numRemoved > oldFullText.length - spliceStart) { + numRemoved = oldFullText.length - spliceStart; } var oldText = oldFullText.substring(spliceStart, spliceStart + numRemoved); var newLen = oldLen + newText.length - oldText.length; From 48c2b7cde192c15cb429dcee7696ba4968955959 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 5 May 2015 20:41:40 +0100 Subject: [PATCH 19/74] fixes #2570 --- src/static/js/pad.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index a2c76c08..ade49b1e 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -456,10 +456,11 @@ var pad = { }, switchToPad: function(padId) { - var options = document.location.href.split('?')[1]; - var newHref = "/p/" + padId; - if (options != null) - newHref = newHref + '?' + options; + var newHref = new RegExp(/.*\/p\/[^\/]+/).exec(document.location.pathname) || clientVars.padId; + newHref = newHref[0]; + if (options != null){ + newHref = newHref + '?' + options; + } if(window.history && window.history.pushState) { From c903cb3925be5be7c08ac5ba558d2f873cdf1116 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 6 May 2015 00:32:36 +0100 Subject: [PATCH 20/74] fix alt c and escape --- src/static/js/ace2_inner.js | 5 +++-- src/static/js/chat.js | 13 ++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index d3cc4fd3..da249c92 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3640,6 +3640,7 @@ function Ace2Inner(){ }else{ var lineHeight = myselection.focusNode.offsetHeight; // line height of blank lines } + var heightOfChatIcon = parent.parent.$('#chaticon').height(); // height of the chat icon button lineHeight = (lineHeight *2) + heightOfChatIcon; var viewport = getViewPortTopBottom(); @@ -3704,11 +3705,11 @@ function Ace2Inner(){ firstEditbarElement.focus(); evt.preventDefault(); } - if ((!specialHandled) && altKey && keyCode == 67){ + if ((!specialHandled) && altKey && keyCode == 67 && type === "keydown"){ // Alt c focuses on the Chat window $(this).blur(); parent.parent.chat.show(); - parent.parent.chat.focus(); + parent.parent.$("#chatinput").focus(); evt.preventDefault(); } if ((!specialHandled) && evt.ctrlKey && shiftKey && keyCode == 50 && type === "keydown"){ diff --git a/src/static/js/chat.js b/src/static/js/chat.js index 42cd50f4..fa087eec 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -39,8 +39,6 @@ var chat = (function() }, focus: function () { - // I'm not sure why we need a setTimeout here but without it we don't get focus... - // Animation maybe? setTimeout(function(){ $("#chatinput").focus(); },100); @@ -214,23 +212,24 @@ var chat = (function() init: function(pad) { this._pad = pad; - $("#chatinput").keyup(function(evt) - { + $("#chatinput").on("keydown", function(evt){ // If the event is Alt C or Escape & we're already in the chat menu // Send the users focus back to the pad if((evt.altKey == true && evt.which === 67) || evt.which === 27){ // If we're in chat already.. $(':focus').blur(); // required to do not try to remove! padeditor.ace.focus(); // Sends focus back to pad + evt.preventDefault(); + return false; } }); - $('body:not(#chatinput)').on("keydown", function(evt){ + $('body:not(#chatinput)').on("keypress", function(evt){ if (evt.altKey && evt.which == 67){ // Alt c focuses on the Chat window $(this).blur(); - parent.parent.chat.show(); - parent.parent.chat.focus(); + chat.show(); + $("#chatinput").focus(); evt.preventDefault(); } }); From 361807e5785b8ef999b6aa90a54f322d14cfcd64 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 6 May 2015 00:36:42 +0100 Subject: [PATCH 21/74] console msg should go to window --- src/static/js/collab_client.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index e5c0ec8b..ad493528 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -279,7 +279,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (oldRev + 1)) { - parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); + window.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -289,7 +289,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); + window.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -303,7 +303,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) { if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1)) { - parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); + window.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } @@ -313,7 +313,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); + window.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } From 9e86fb279be7511e27abb6da57d06ba073cf1e70 Mon Sep 17 00:00:00 2001 From: Xavid Date: Wed, 6 May 2015 08:45:22 -0400 Subject: [PATCH 22/74] Fix backend tests with new setText() implementation; tests depended on the old setText() behavior leaving the last character. --- src/node/utils/ImportHtml.js | 2 +- tests/backend/specs/api/pad.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/node/utils/ImportHtml.js b/src/node/utils/ImportHtml.js index 33fd91c6..d71e2720 100644 --- a/src/node/utils/ImportHtml.js +++ b/src/node/utils/ImportHtml.js @@ -89,7 +89,7 @@ function setPadHTML(pad, html, callback) // the changeset is ready! var theChangeset = builder.toString(); apiLogger.debug('The changeset: ' + theChangeset); - pad.setText(""); + pad.setText("\n"); pad.appendRevision(theChangeset); callback(null); } diff --git a/tests/backend/specs/api/pad.js b/tests/backend/specs/api/pad.js index 75e77971..a2e8cdb3 100644 --- a/tests/backend/specs/api/pad.js +++ b/tests/backend/specs/api/pad.js @@ -210,7 +210,7 @@ describe('getText', function(){ it('gets the Pad text', function(done) { api.get(endPoint('getText')+"&padID="+testPadId) .expect(function(res){ - if(res.body.data.text !== "testTextTwo\n") throw new Error("Setting Text") + if(res.body.data.text !== "testTextTwo") throw new Error("Setting Text") }) .expect('Content-Type', /json/) .expect(200, done) @@ -386,7 +386,7 @@ describe('getText', function(){ api.get(endPoint('getText')+"&padID="+testPadId) .expect(function(res){ if(res.body.code !== 0) throw new Error("Pad Get Text failed") - if(res.body.data.text !== text+"\n") throw new Error("Pad Text not set properly"); + if(res.body.data.text !== text) throw new Error("Pad Text not set properly"); }) .expect('Content-Type', /json/) .expect(200, done) @@ -419,7 +419,7 @@ describe('getText', function(){ it('Gets text on a pad Id', function(done) { api.get(endPoint('getText')+"&padID="+newPadId) .expect(function(res){ - if(res.body.data.text !== text+"\n") throw new Error("Pad Get Text failed") + if(res.body.data.text !== text) throw new Error("Pad Get Text failed") }) .expect('Content-Type', /json/) .expect(200, done) @@ -441,7 +441,7 @@ describe('getText', function(){ it('Gets text on a pad Id', function(done) { api.get(endPoint('getText')+"&padID="+testPadId) .expect(function(res){ - if(res.body.data.text !== text+"\n") throw new Error("Pad Get Text failed") + if(res.body.data.text !== text) throw new Error("Pad Get Text failed") }) .expect('Content-Type', /json/) .expect(200, done) From 250afd04512141d446259a38a7df2c0f8e303ae9 Mon Sep 17 00:00:00 2001 From: Stefan Mintert Date: Thu, 7 May 2015 16:47:14 +0200 Subject: [PATCH 23/74] Bugfix. Description of bug at https://github.com/tm-linkwerk/ep_linebreak/blob/WR-72-linebreak-cursorverhalten/static/hooks.js#L94 --- src/static/js/ace2_inner.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index da249c92..760ce7ff 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1982,7 +1982,11 @@ function Ace2Inner(){ function nodeText(n) { - return n.innerText || n.textContent || n.nodeValue || ''; + if (browser.msie) { + return n.innerText; + } else { + return n.textContent || n.nodeValue || ''; + } } function getLineAndCharForPoint(point) From 975bd99064ff2669aa4b64c7bb06754418158e70 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 7 May 2015 15:55:52 +0000 Subject: [PATCH 24/74] support for french stuff --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index bcb30623..e2e1128c 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3889,7 +3889,7 @@ function Ace2Inner(){ toggleAttributeOnSelection('underline'); specialHandled = true; } - if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "5" && (evt.metaKey || evt.ctrlKey)) + if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "5" && (evt.metaKey || evt.ctrlKey) && evt.altKey !== true) { // cmd-5 (strikethrough) fastIncorp(13); From 5a7750781b0a1848477675a90d1c2be4596ffd2e Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Thu, 7 May 2015 18:14:55 +0100 Subject: [PATCH 25/74] Use the cookie parser middleware --- src/node/hooks/express/webaccess.js | 5 ++++- src/node/padaccess.js | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index cb5a2207..2cafd271 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -6,6 +6,7 @@ var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var ueberStore = require('../../db/SessionStore'); var stats = require('ep_etherpad-lite/node/stats'); var sessionModule = require('express-session'); +var cookieParser = require('cookie-parser'); //checks for basic http auth exports.basicAuth = function (req, res, next) { @@ -76,7 +77,7 @@ exports.basicAuth = function (req, res, next) { Note that the process could stop already in step 3 with a redirect to login page. */ - + authorize(function (ok) { if (ok) return next(); authenticate(function (ok) { @@ -121,6 +122,8 @@ exports.expressConfigure = function (hook_name, args, cb) { args.app.sessionStore = exports.sessionStore; args.app.use(sessionModule({secret: exports.secret, store: args.app.sessionStore, resave: true, saveUninitialized: true, name: 'express_sid' })); + args.app.use(cookieParser(settings.sessionKey, {})); + args.app.use(exports.basicAuth); } diff --git a/src/node/padaccess.js b/src/node/padaccess.js index 97333514..1f2e8834 100644 --- a/src/node/padaccess.js +++ b/src/node/padaccess.js @@ -3,10 +3,6 @@ var securityManager = require('./db/SecurityManager'); //checks for padAccess module.exports = function (req, res, callback) { - - // FIXME: Why is this ever undefined?? - if (req.cookies === undefined) req.cookies = {}; - securityManager.checkAccess(req.params.pad, req.cookies.sessionID, req.cookies.token, req.cookies.password, function(err, accessObj) { if(ERR(err, callback)) return; From 3b91b46baa699dd50ba993b1fd7ffc33ec741abc Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 May 2015 11:46:49 +0100 Subject: [PATCH 26/74] always hide connected one second after connected --- src/static/js/pad.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index ade49b1e..e3951405 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -813,6 +813,9 @@ var pad = { pad.determineChatVisibility(isConnected && !isInitialConnect); pad.determineChatAndUsersVisibility(isConnected && !isInitialConnect); pad.determineAuthorshipColorsVisibility(); + setTimeout(function(){ + padeditbar.toggleDropDown("none"); + }, 1000); }, determineChatVisibility: function(asNowConnectedFeedback){ var chatVisCookie = padcookie.getPref('chatAlwaysVisible'); From 6bd2013c715ade1ce98ba1da92b4244e70117b8a Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Fri, 15 May 2015 11:18:58 -0300 Subject: [PATCH 27/74] Fixing documentation of collectContentPre --- doc/api/hooks_client-side.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index aa027337..fccdaf46 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -203,10 +203,10 @@ Things in context: This hook is called before the content of a node is collected by the usual methods. The cc object can be used to do a bunch of things that modify the content of the pad. See, for example, the heading1 plugin for etherpad original. -E.g. if you need to apply an attribute to newly inserted characters, +E.g. if you need to apply an attribute to newly inserted characters, call cc.doAttrib(state, "attributeName") which results in an attribute attributeName=true. -If you want to specify also a value, call cc.doAttrib(state, "attributeName:value") +If you want to specify also a value, call cc.doAttrib(state, "attributeName::value") which results in an attribute attributeName=value. @@ -257,7 +257,7 @@ This hook gets called every time the client receives a message of type `name`. T `collab_client.js` has a pretty extensive list of message types, if you want to take a look. -##aceStartLineAndCharForPoint-aceEndLineAndCharForPoint +##aceStartLineAndCharForPoint-aceEndLineAndCharForPoint Called from: src/static/js/ace2_inner.js Things in context: @@ -272,7 +272,7 @@ Things in context: This hook is provided to allow a plugin to turn DOM node selection into [line,char] selection. The return value should be an array of [line,char] -##aceKeyEvent +##aceKeyEvent Called from: src/static/js/ace2_inner.js Things in context: @@ -286,7 +286,7 @@ Things in context: This hook is provided to allow a plugin to handle key events. The return value should be true if you have handled the event. -##collectContentLineText +##collectContentLineText Called from: src/static/js/contentcollector.js Things in context: @@ -299,7 +299,7 @@ Things in context: This hook allows you to validate/manipulate the text before it's sent to the server side. The return value should be the validated/manipulated text. -##collectContentLineBreak +##collectContentLineBreak Called from: src/static/js/contentcollector.js Things in context: @@ -311,7 +311,7 @@ Things in context: This hook is provided to allow whether the br tag should induce a new magic domline or not. The return value should be either true(break the line) or false. -##disableAuthorColorsForThisLine +##disableAuthorColorsForThisLine Called from: src/static/js/linestylefilter.js Things in context: From 0c4b3f8124147bccd39105b06caf324419783b42 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 16 May 2015 18:53:23 +0200 Subject: [PATCH 28/74] Localisation updates from https://translatewiki.net. --- src/locales/be-tarask.json | 3 ++ src/locales/de.json | 3 ++ src/locales/es.json | 7 +++- src/locales/fa.json | 3 ++ src/locales/fr.json | 3 ++ src/locales/gl.json | 3 ++ src/locales/he.json | 3 ++ src/locales/ja.json | 3 ++ src/locales/ksh.json | 3 ++ src/locales/ku-latn.json | 77 +++++++++++++++++++++++++++++++++++ src/locales/mk.json | 3 ++ src/locales/ms.json | 5 +++ src/locales/nb.json | 59 +++++++++++++++------------ src/locales/ps.json | 10 +++++ src/locales/ro.json | 82 ++++++++++++++++++++++++++++++++++++++ src/locales/sv.json | 3 ++ src/locales/zh-hans.json | 3 ++ 17 files changed, 246 insertions(+), 27 deletions(-) create mode 100644 src/locales/ku-latn.json create mode 100644 src/locales/ro.json diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json index 3c789858..2d8c26e8 100644 --- a/src/locales/be-tarask.json +++ b/src/locales/be-tarask.json @@ -94,6 +94,9 @@ "timeslider.exportCurrent": "Экспартаваць актуальную вэрсію як:", "timeslider.version": "Вэрсія {{version}}", "timeslider.saved": "Захавана {{day}}.{{month}}.{{year}}", + "timeslider.playPause": "Прайграць / спыніць зьмест дакумэнту", + "timeslider.backRevision": "Вярнуць рэдагаваньне гэтага дакумэнту", + "timeslider.forwardRevision": "Перайсьці да наступнага рэдагаваньня гэтага дакумэнту", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "студзень", "timeslider.month.february": "люты", diff --git a/src/locales/de.json b/src/locales/de.json index 2fd31c12..1600fc74 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -96,6 +96,9 @@ "timeslider.exportCurrent": "Exportiere diese Version als:", "timeslider.version": "Version {{version}}", "timeslider.saved": "gespeichert am {{day}}. {{month}} {{year}}", + "timeslider.playPause": "Padinhalte abspielen/pausieren", + "timeslider.backRevision": "Eine Version in diesem Pad zurück gehen", + "timeslider.forwardRevision": "Eine Version in diesem Pad vorwärts gehen", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januar", "timeslider.month.february": "Februar", diff --git a/src/locales/es.json b/src/locales/es.json index 21eb60a7..98227182 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -36,7 +36,7 @@ "pad.colorpicker.save": "Guardar", "pad.colorpicker.cancel": "Cancelar", "pad.loading": "Cargando...", - "pad.noCookie": "La cookie no se pudo encontrar. ¡Por favor, habilita las cookies en tu navegador!", + "pad.noCookie": "La cookie no se pudo encontrar. ¡Habilita las cookies en tu navegador!", "pad.passwordRequired": "Necesitas una contraseña para acceder a este pad", "pad.permissionDenied": "No tienes permiso para acceder a este pad", "pad.wrongPassword": "La contraseña era incorrecta", @@ -102,6 +102,9 @@ "timeslider.exportCurrent": "Exportar la versión actual como:", "timeslider.version": "Versión {{version}}", "timeslider.saved": "Guardado el {{day}} de {{month}} de {{year}}", + "timeslider.playPause": "Reproducir/pausar los contenidos del pad", + "timeslider.backRevision": "Ir a la revisión anterior en este pad", + "timeslider.forwardRevision": "Ir a la revisión posterior en este pad", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "enero", "timeslider.month.february": "febrero", @@ -128,7 +131,7 @@ "pad.impexp.importing": "Importando...", "pad.impexp.confirmimport": "Al importar un archivo se borrará el contenido actual del pad. ¿Estás seguro de que quieres continuar?", "pad.impexp.convertFailed": "No pudimos importar este archivo. Inténtalo con un formato diferente o copia y pega manualmente.", - "pad.impexp.padHasData": "No hemos podido importar este archivo porque esta almohadilla ya ha tenido cambios, por favor, importa a una nueva almohadilla", + "pad.impexp.padHasData": "No hemos podido importar este archivo porque este pad ya ha tenido cambios. Importa a un nuevo pad.", "pad.impexp.uploadFailed": "El envío falló. Intentalo de nuevo.", "pad.impexp.importfailed": "Fallo al importar", "pad.impexp.copypaste": "Intenta copiar y pegar", diff --git a/src/locales/fa.json b/src/locales/fa.json index cd42c871..0bdb4c56 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -98,6 +98,9 @@ "timeslider.exportCurrent": "برون‌ریزی نگارش کنونی به عنوان:", "timeslider.version": "نگارش {{version}}", "timeslider.saved": "{{month}} {{day}}، {{year}} ذخیره شد", + "timeslider.playPause": "اجرای مجدد/متوقف کردن پخش", + "timeslider.backRevision": "رفتن به نسخهٔ پیشین در این دفترچه", + "timeslider.forwardRevision": "رفتن به نسخهٔ بعدی در این دفترچه", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "ژانویه", "timeslider.month.february": "فوریه", diff --git a/src/locales/fr.json b/src/locales/fr.json index ba289e3b..166bd3bf 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -109,6 +109,9 @@ "timeslider.exportCurrent": "Exporter la version actuelle sous :", "timeslider.version": "Version {{version}}", "timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}", + "timeslider.playPause": "Lecture / Pause des contenus du bloc", + "timeslider.backRevision": "Reculer d’une révision dans ce bloc", + "timeslider.forwardRevision": "Avancer d’une révision dans ce bloc", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "janvier", "timeslider.month.february": "février", diff --git a/src/locales/gl.json b/src/locales/gl.json index 381296aa..ff1e9305 100644 --- a/src/locales/gl.json +++ b/src/locales/gl.json @@ -93,6 +93,9 @@ "timeslider.exportCurrent": "Exportar a versión actual en formato:", "timeslider.version": "Versión {{version}}", "timeslider.saved": "Gardado o {{day}} de {{month}} de {{year}}", + "timeslider.playPause": "Reproducir/pausar os contidos do pad", + "timeslider.backRevision": "Ir á revisión anterior neste pad", + "timeslider.forwardRevision": "Ir á revisión posterior neste pad", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "xaneiro", "timeslider.month.february": "febreiro", diff --git a/src/locales/he.json b/src/locales/he.json index 4222e153..3a6672b2 100644 --- a/src/locales/he.json +++ b/src/locales/he.json @@ -95,6 +95,9 @@ "timeslider.exportCurrent": "ייצוא הגרסה הנוכחית בתור:", "timeslider.version": "גרסה {{version}}", "timeslider.saved": "נשמרה ב־{{day}} ב{{month}} {{year}}", + "timeslider.playPause": "לנגן / לעצור את תוכן הפנקס", + "timeslider.backRevision": "לחזור לגרסה של הפנקס הזה", + "timeslider.forwardRevision": "ללכת לגרסה חדשה יותר בפנקס הזה", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "ינואר", "timeslider.month.february": "פברואר", diff --git a/src/locales/ja.json b/src/locales/ja.json index b6cc4e34..f223a8c4 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -93,6 +93,9 @@ "timeslider.exportCurrent": "現在の版をエクスポートする形式:", "timeslider.version": "バージョン {{version}}", "timeslider.saved": "| {{year}}年{{month}}{{day}}日に保存", + "timeslider.playPause": "パッドの過去の内容を再生/一時停止", + "timeslider.backRevision": "前の版に戻る", + "timeslider.forwardRevision": "次の版に進む", "timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "1月", "timeslider.month.february": "2月", diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 5d5230d3..5ed5b410 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -92,6 +92,9 @@ "timeslider.exportCurrent": "Donn de neußte Väsjohn äxpotteere alß:", "timeslider.version": "Väsjohn {{version}}", "timeslider.saved": "Faßjehallde aam {{day}}. {{month}} {{year}}", + "timeslider.playPause": "Donn der Enhalld vum Päd afschpelle udder aanhallde", + "timeslider.backRevision": "Jangk ein Väsjohn retuhr en dämm Pahdt", + "timeslider.forwardRevision": "Jangg en Väsjohn vörwääz en heh däm Pahdt.", "timeslider.dateformat": "aam {{day}}. {{month}} {{year}} öm {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Jannewaa", "timeslider.month.february": "Fääbrowaa", diff --git a/src/locales/ku-latn.json b/src/locales/ku-latn.json new file mode 100644 index 00000000..16fc1538 --- /dev/null +++ b/src/locales/ku-latn.json @@ -0,0 +1,77 @@ +{ + "@metadata": { + "authors": [ + "Bikarhêner", + "Dilyaramude", + "George Animal", + "Gomada" + ] + }, + "index.newPad": "Bloknota nû", + "index.createOpenPad": "Yan Padekê li gel navê biafirîne/veke:", + "pad.toolbar.bold.title": "Stûr (Ctrl-B)", + "pad.toolbar.italic.title": "Xwar (Ctrl-I)", + "pad.toolbar.underline.title": "Binxet (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Serxêzkirî (Ctrl+5)", + "pad.toolbar.ol.title": "Lîsteya rêzkirî (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Lîsteya tevlîhev (Ctrl+Shift+L)", + "pad.toolbar.undo.title": "Vegerîne (Ctrl-Z)", + "pad.toolbar.redo.title": "Dîsa bike (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Rengên nivîskariyê jê bibe (Ctrl+Shift+C)", + "pad.toolbar.savedRevision.title": "Sererastkirinê tomar bike", + "pad.toolbar.settings.title": "Eyar", + "pad.colorpicker.save": "Tomar bike", + "pad.colorpicker.cancel": "Beta bike", + "pad.loading": "Tê barkirin...", + "pad.settings.padSettings": "Eyarên bloknotê", + "pad.settings.myView": "Dîmena min", + "pad.settings.stickychat": "Di ekranê de hertim çet bike", + "pad.settings.chatandusers": "Çeta û Bikarhênera Nîşan bide", + "pad.settings.colorcheck": "Rengên nivîskarîye", + "pad.settings.linenocheck": "Hejmarên rêze", + "pad.settings.rtlcheck": "Bila naverok ji raste ber bi çepe be xwendin?", + "pad.settings.fontType": "Tîpa nivîsê:", + "pad.settings.language": "Ziman:", + "pad.importExport.importSuccessful": "Biserketî!", + "pad.importExport.exportetherpad": "Etherpad", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.modals.connected": "Hate girêdan.", + "pad.modals.reconnecting": "Ji bloknota te re dîsa tê girêdan...", + "pad.modals.userdup": "Di pencereyek din de vebû", + "pad.modals.userdup.advice": "Ji bo di vê pencereye de bikarbînîy dîsa giredanek çeke.", + "pad.modals.unauth": "Desthilatdar nîne", + "pad.modals.deleted": "Hate jêbirin.", + "pad.modals.deleted.explanation": "Ev bloknot hatiye rakirin.", + "pad.modals.disconnected": "Pêwendîya te qut bû.", + "pad.modals.disconnected.explanation": "Pêwendîya rajeker qut bû", + "pad.share": "Vê bloknotê parve bike", + "pad.share.link": "Girêdan", + "pad.chat": "Çet", + "pad.chat.title": "Ji bo vê bloknotê çet veke.", + "pad.chat.loadmessages": "Peyamên bêhtir barbike", + "timeslider.toolbar.returnbutton": "Vegere bloknotê", + "timeslider.toolbar.authors": "Nivîser:", + "timeslider.toolbar.authorsList": "Nivîser Tine", + "timeslider.version": "Guhertoya {{version}}", + "timeslider.saved": "Di dîroka {{day}} {{month}} {{year}} de hate tomarkirin", + "timeslider.month.january": "rêbendan", + "timeslider.month.february": "reşemî", + "timeslider.month.march": "adar", + "timeslider.month.april": "avrêl", + "timeslider.month.may": "gulan", + "timeslider.month.june": "pûşper", + "timeslider.month.july": "tîrmeh", + "timeslider.month.august": "gelawêj", + "timeslider.month.september": "rezber", + "timeslider.month.october": "kewçêr", + "timeslider.month.november": "sermawez", + "timeslider.month.december": "berfanbar", + "pad.userlist.entername": "Navê xwe têkeve", + "pad.userlist.unnamed": "nenavkirî", + "pad.userlist.guest": "Mêvan", + "pad.userlist.deny": "Red bike", + "pad.userlist.approve": "Bipejirîne", + "pad.impexp.copypaste": "Ji kerema xwe re jê bigre û pê ve deyne (Ctrl+c, Ctrl+v)" +} diff --git a/src/locales/mk.json b/src/locales/mk.json index a924875a..e00d47d8 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -93,6 +93,9 @@ "timeslider.exportCurrent": "Извези ја тековната верзија како:", "timeslider.version": "Верзија {{version}}", "timeslider.saved": "Зачувано на {{day}} {{month}} {{year}} г.", + "timeslider.playPause": "Пушти/запри содржина на тетратката", + "timeslider.backRevision": "Назад за една преработка на тетратката", + "timeslider.forwardRevision": "Напред за една преработка на тетратката", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "јануари", "timeslider.month.february": "февруари", diff --git a/src/locales/ms.json b/src/locales/ms.json index d099de06..93b421fa 100644 --- a/src/locales/ms.json +++ b/src/locales/ms.json @@ -33,6 +33,7 @@ "pad.settings.padSettings": "Tetapan Pad", "pad.settings.myView": "Paparan Saya", "pad.settings.stickychat": "Sentiasa bersembang pada skrin", + "pad.settings.chatandusers": "Paparkan Ruang Sembang dan Pengguna-Pengguna", "pad.settings.colorcheck": "Warna pengarang", "pad.settings.linenocheck": "Nombor baris", "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", @@ -91,6 +92,9 @@ "timeslider.exportCurrent": "Eksport versi semasa sebagai:", "timeslider.version": "Versi {{version}}", "timeslider.saved": "Disimpan pada {{day}} {{month}} {{year}}", + "timeslider.playPause": "Mainkan / Pausekan Kandungan Pad", + "timeslider.backRevision": "Undur satu semakan di Pad ini", + "timeslider.forwardRevision": "Maju satu semakan dalam Pad ini", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januari", "timeslider.month.february": "Februari", @@ -106,6 +110,7 @@ "timeslider.month.december": "Disember", "timeslider.unnamedauthors": "{{num}} orang {[plural(num) other: pengarang]} awanama", "pad.savedrevs.marked": "Semakan ini telah ditandai sebagai semakan tersimpan", + "pad.savedrevs.timeslider": "Anda boleh melihat semakan yang tersimpan dengan melawat gelangsar masa", "pad.userlist.entername": "Taipkan nama anda", "pad.userlist.unnamed": "tanpa nama", "pad.userlist.guest": "Tetamu", diff --git a/src/locales/nb.json b/src/locales/nb.json index a1b3a5ca..48c96521 100644 --- a/src/locales/nb.json +++ b/src/locales/nb.json @@ -2,37 +2,40 @@ "@metadata": { "authors": [ "Laaknor", - "Cocu" + "Cocu", + "Chameleon222" ] }, - "index.newPad": "Ny Pad", - "index.createOpenPad": "eller opprette/åpne en ny Pad med dette navnet:", - "pad.toolbar.bold.title": "Fet (Ctrl-B)", - "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", - "pad.toolbar.underline.title": "Understreking (Ctrl-U)", + "index.newPad": "Ny blokk", + "index.createOpenPad": "eller opprette/åpne en ny blokk med dette navnet:", + "pad.toolbar.bold.title": "Fet (Ctrl+B)", + "pad.toolbar.italic.title": "Kursiv (Ctrl+I)", + "pad.toolbar.underline.title": "Understreking (Ctrl+U)", "pad.toolbar.strikethrough.title": "Gjennomstreking (Ctrl+5)", "pad.toolbar.ol.title": "Nummerert liste (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Punktliste (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Innrykk (TAB)", "pad.toolbar.unindent.title": "Rykk ut (Shift+TAB)", - "pad.toolbar.undo.title": "Angre (Ctrl-Z)", - "pad.toolbar.redo.title": "Gjør omigjen (Ctrl-Y)", + "pad.toolbar.undo.title": "Angre (Ctrl+Z)", + "pad.toolbar.redo.title": "Gjør omigjen (Ctrl+Y)", "pad.toolbar.clearAuthorship.title": "Fjern forfatterfarger (Ctrl+Shift+C)", "pad.toolbar.import_export.title": "Importer/eksporter fra/til forskjellige filformater", "pad.toolbar.timeslider.title": "Tidslinje", "pad.toolbar.savedRevision.title": "Lagre revisjoner", "pad.toolbar.settings.title": "Innstillinger", - "pad.toolbar.embed.title": "Bygg inn denne padden", - "pad.toolbar.showusers.title": "Vis brukerne av denne padden", + "pad.toolbar.embed.title": "Del og sett inn denne blokken", + "pad.toolbar.showusers.title": "Vis brukerne av denne blokken", "pad.colorpicker.save": "Lagre", "pad.colorpicker.cancel": "Avbryt", - "pad.loading": "Laster inn...", - "pad.passwordRequired": "Du trenger et passord for å få tilgang til denne padden", - "pad.permissionDenied": "Du har ikke tilgang til denne padden", + "pad.loading": "Laster...", + "pad.noCookie": "Kunne ikke finne informasjonskapselen. Vennligst tillat informasjonskapsler (cookies) i din webleser!", + "pad.passwordRequired": "Du trenger et passord for å få tilgang til denne blokken", + "pad.permissionDenied": "Du har ikke tilgang til denne blokken", "pad.wrongPassword": "Feil passord", - "pad.settings.padSettings": "Padinnstillinger", + "pad.settings.padSettings": "Blokkinnstillinger", "pad.settings.myView": "Min visning", "pad.settings.stickychat": "Chat alltid synlig", + "pad.settings.chatandusers": "Vis chat og brukere", "pad.settings.colorcheck": "Forfatterfarger", "pad.settings.linenocheck": "Linjenummer", "pad.settings.rtlcheck": "Les innhold fra høyre til venstre?", @@ -44,7 +47,8 @@ "pad.importExport.import_export": "Importer/eksporter", "pad.importExport.import": "Last opp tekstfil eller dokument", "pad.importExport.importSuccessful": "Vellykket!", - "pad.importExport.export": "Eksporter padden som:", + "pad.importExport.export": "Eksporter blokken som:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Ren tekst", "pad.importExport.exportword": "Microsoft Word", @@ -52,10 +56,10 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.abiword.innerHTML": "Du kan bare importere fra ren tekst eller HTML-formater. For mer avanserte importfunksjoner, installer abiword.", "pad.modals.connected": "Tilkoblet.", - "pad.modals.reconnecting": "Kobler til din pad på nytt...", + "pad.modals.reconnecting": "Kobler til din blokk på nytt...", "pad.modals.forcereconnect": "Tving gjenoppkobling", "pad.modals.userdup": "Åpnet i nytt vindu", - "pad.modals.userdup.explanation": "Denne padden ser ut til å være åpnet i mer enn et nettleservindu på denne maskinen.", + "pad.modals.userdup.explanation": "Denne blokken ser ut til å være åpnet i mer enn et nettleservindu på denne maskinen.", "pad.modals.userdup.advice": "Koble til igjen for å bruke dette vinduet i stedenfor.", "pad.modals.unauth": "Ikke tillatt", "pad.modals.unauth.explanation": "Dine rettigheter har blitt endret mens du så på denne siden. Prøv å koble til på nytt", @@ -71,26 +75,29 @@ "pad.modals.corruptPad.explanation": "Blokken du forsøker å få tilgang til er skadet.", "pad.modals.corruptPad.cause": "Dette kan komme av feil serverkonfigurasjon eller en annen uventet adferd. Vennligst kontakt serviceadministratoren hvis du anser dette å være feil.", "pad.modals.deleted": "Slettet.", - "pad.modals.deleted.explanation": "Denne padden har blitt fjernet", + "pad.modals.deleted.explanation": "Denne blokken har blitt fjernet", "pad.modals.disconnected": "Du har blitt frakoblet.", "pad.modals.disconnected.explanation": "Mistet tilkobling til serveren.", - "pad.modals.disconnected.cause": "Serveren kan være utilgjengelig. Vennligst si i fra til oss hvis dette fortsetter å skje", - "pad.share": "Del denne padden", + "pad.modals.disconnected.cause": "Serveren kan være utilgjengelig. Vennligst si i fra til oss hvis dette fortsetter å skje.", + "pad.share": "Del denne blokken", "pad.share.readonly": "Skrivebeskyttet", "pad.share.link": "Lenke", "pad.share.emebdcode": "URL for innbygging", "pad.chat": "Chat", - "pad.chat.title": "Åpne chatten for denne padden.", + "pad.chat.title": "Åpne chatten for denne blokken.", "pad.chat.loadmessages": "Last flere beskjeder", "timeslider.pageTitle": "{{appTitle}} Tidslinje", - "timeslider.toolbar.returnbutton": "Gå tilbake til pad", + "timeslider.toolbar.returnbutton": "Gå tilbake til blokk", "timeslider.toolbar.authors": "Forfattere:", "timeslider.toolbar.authorsList": "Ingen forfattere", "timeslider.toolbar.exportlink.title": "Eksporter", "timeslider.exportCurrent": "Eksporter nåværende versjon som:", "timeslider.version": "Versjon {{version}}", - "timeslider.saved": "Lagret {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.saved": "Lagret {{day}}. {{month}} {{year}}", + "timeslider.playPause": "Spill av/Pause blokkinnholdet", + "timeslider.backRevision": "Gå tilbake en revisjon i denne blokken", + "timeslider.forwardRevision": "Gå fremover en revisjon i denne blokken", + "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januar", "timeslider.month.february": "februar", "timeslider.month.march": "mars", @@ -105,6 +112,7 @@ "timeslider.month.december": "desember", "timeslider.unnamedauthors": "{{num}} navnløse {[plural(num) one: forfatter, other: forfattere ]}", "pad.savedrevs.marked": "Denne revisjonen er nå markert som en lagret revisjon", + "pad.savedrevs.timeslider": "Du kan se lagrede revisjoner med tidslinjen", "pad.userlist.entername": "Skriv inn ditt navn", "pad.userlist.unnamed": "navnløs", "pad.userlist.guest": "Gjest", @@ -113,8 +121,9 @@ "pad.editbar.clearcolors": "Fjern forfatterfarger på hele dokumentet?", "pad.impexp.importbutton": "Importer nå", "pad.impexp.importing": "Importerer...", - "pad.impexp.confirmimport": "Importering av en fil vil overskrive den nåværende teksten på padden. Er du sikker på at du vil fortsette?", + "pad.impexp.confirmimport": "Importering av en fil vil overskrive den nåværende teksten på blokken. Er du sikker på at du vil fortsette?", "pad.impexp.convertFailed": "Vi greide ikke å importere denne filen. Bruk et annet dokumentformat eller kopier og lim inn teksten manuelt", + "pad.impexp.padHasData": "Vi kunne ikke importere denne filen fordi blokken allerede hadde endringer. Importer til en ny blokk.", "pad.impexp.uploadFailed": "Opplastning feilet. Prøv igjen", "pad.impexp.importfailed": "Import feilet", "pad.impexp.copypaste": "Vennligst kopier og lim inn", diff --git a/src/locales/ps.json b/src/locales/ps.json index 2c23d1c3..1a877128 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -8,6 +8,10 @@ "index.createOpenPad": "يا په همدې نوم يوه نوې ليکچه جوړول/پرانيستل:", "pad.toolbar.bold.title": "زغرد (Ctrl-B)", "pad.toolbar.italic.title": "رېوند (Ctrl-I)", + "pad.toolbar.underline.title": "لرکرښن (Ctrl+U)", + "pad.toolbar.strikethrough.title": "کرښکاږلی (Ctrl+5)", + "pad.toolbar.ol.title": "ترتيب شوی لړليک (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "ناترتيب شوی لړليک (Ctrl+Shift+L)", "pad.toolbar.undo.title": "ناکړل (Ctrl-Z)", "pad.toolbar.redo.title": "بياکړل (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "د ليکوالۍ رنگونه سپينول (Ctrl+Shift+C)", @@ -20,13 +24,17 @@ "pad.wrongPassword": "پټنوم مو سم نه و", "pad.settings.padSettings": "د ليکچې امستنې", "pad.settings.myView": "زما کتنه", + "pad.settings.stickychat": "تل په پردې بانډار کول", + "pad.settings.chatandusers": "کارنان او بانډار ښکاره کول", "pad.settings.colorcheck": "د ليکوالۍ رنگونه", + "pad.settings.linenocheck": "د کرښو شمېرې", "pad.settings.fontType": "ليکبڼې ډول:", "pad.settings.fontType.normal": "نورمال", "pad.settings.fontType.monospaced": "مونوسپېس", "pad.settings.globalView": "نړېواله ښکارېدنه", "pad.settings.language": "ژبه:", "pad.importExport.importSuccessful": "بريالی شو!", + "pad.importExport.exportetherpad": "اېترپډ", "pad.importExport.exporthtml": "اچ ټي ام اېل", "pad.importExport.exportplain": "ساده متن", "pad.importExport.exportword": "مايکروسافټ ورډ", @@ -66,5 +74,7 @@ "pad.userlist.guest": "مېلمه", "pad.userlist.deny": "ردول", "pad.userlist.approve": "منل", + "pad.impexp.importbutton": "اوس واردول", + "pad.impexp.importing": "په واردولو کې دی...", "pad.impexp.copypaste": "لطفاً لمېسل لېښل ترسره کړئ" } diff --git a/src/locales/ro.json b/src/locales/ro.json new file mode 100644 index 00000000..85436dd0 --- /dev/null +++ b/src/locales/ro.json @@ -0,0 +1,82 @@ +{ + "@metadata": { + "authors": [ + "Hedwig", + "ImGelu", + "Minisarm" + ] + }, + "index.newPad": "Pad nou", + "index.createOpenPad": "sau creează/deschide un Pad cu numele:", + "pad.toolbar.bold.title": "Aldin (Ctrl + B)", + "pad.toolbar.italic.title": "Cursiv (Ctrl + I)", + "pad.toolbar.underline.title": "Subliniază (Ctrl+U)", + "pad.toolbar.strikethrough.title": "Taie (Ctrl+5)", + "pad.toolbar.ol.title": "Listă ordonată (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Listă neordonată (Ctrl+Shift+L)", + "pad.toolbar.undo.title": "Anulează (Ctrl+Z)", + "pad.toolbar.savedRevision.title": "Salvează revizia", + "pad.toolbar.settings.title": "Setări", + "pad.colorpicker.save": "Salvează", + "pad.colorpicker.cancel": "Anulează", + "pad.loading": "Se încarcă...", + "pad.passwordRequired": "Ai nevoie de o parolă pentru a accesa acest pad", + "pad.permissionDenied": "Nu ai permisiunea să accesezi acest pad", + "pad.wrongPassword": "Parola ta este greșită", + "pad.settings.padSettings": "Setări pentru Pad", + "pad.settings.stickychat": "Chat-ul întotdeauna pe ecran", + "pad.settings.chatandusers": "Afișează Chat-ul și Utilizatorii", + "pad.settings.fontType": "Tipul fontului:", + "pad.settings.globalView": "Vedere generală", + "pad.settings.language": "Limbă:", + "pad.importExport.import": "Încarcă orice fișier text sau document", + "pad.importExport.importSuccessful": "Succes!", + "pad.importExport.export": "Exportă pad-ul curent ca:", + "pad.importExport.exportetherpad": "Etherpad", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Text brut", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.modals.connected": "Conectat.", + "pad.modals.reconnecting": "Se reconectează la pad-ul tău..", + "pad.modals.forcereconnect": "Forțează reconectarea", + "pad.modals.userdup.advice": "Reconectează pentru a folosi această fereastră în schimb", + "pad.modals.unauth": "Nu ești autorizat", + "pad.modals.initsocketfail": "Serverul nu este disponibil.", + "pad.modals.initsocketfail.explanation": "Nu s-a putut conecta la serverul de sincronizare.", + "pad.modals.slowcommit.explanation": "Serverul nu răspunde.", + "pad.modals.slowcommit.cause": "Aceasta poate fi cauzată de probleme cu conexiunea la rețea.", + "pad.modals.deleted": "Șters.", + "pad.modals.deleted.explanation": "Acest pad a fost șters.", + "pad.modals.disconnected": "Ai fost deconectat.", + "pad.share": "Distribuie acest pad", + "pad.share.readonly": "Doar în citire", + "pad.share.link": "Legătură", + "pad.share.emebdcode": "Încorporează URL-ul", + "pad.chat": "Chat", + "pad.chat.title": "Deschide chat-ul pentru acest pad.", + "pad.chat.loadmessages": "Încarcă mai multe mesaje", + "timeslider.toolbar.returnbutton": "Înapoi la pad", + "timeslider.toolbar.authors": "Aurori:", + "timeslider.toolbar.authorsList": "Niciun autor", + "timeslider.toolbar.exportlink.title": "Exportă", + "timeslider.exportCurrent": "Exportă versiunea curentă ca:", + "timeslider.version": "Versiunea {{version}}", + "timeslider.saved": "Salvat pe {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "ianuarie", + "timeslider.month.february": "februarie", + "timeslider.month.march": "martie", + "timeslider.month.april": "aprilie", + "timeslider.month.may": "mai", + "timeslider.month.june": "iunie", + "timeslider.month.july": "iulie", + "timeslider.month.august": "august", + "timeslider.month.september": "septembrie", + "timeslider.month.october": "octombrie", + "timeslider.month.november": "noiembrie", + "timeslider.month.december": "decembrie", + "pad.userlist.entername": "Introdu numele tău", + "pad.userlist.unnamed": "fără nume" +} diff --git a/src/locales/sv.json b/src/locales/sv.json index ae9b1f9a..44df4506 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -94,6 +94,9 @@ "timeslider.exportCurrent": "Exportera aktuell version som:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Sparades den {{day}} {{month}} {{year}}", + "timeslider.playPause": "Spela upp/pausa blockets innehåll", + "timeslider.backRevision": "Gå tillbaka en version av detta block", + "timeslider.forwardRevision": "Gå framåt en version av detta block", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januari", "timeslider.month.february": "februari", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index 31b7f7f3..eaa03520 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -102,6 +102,9 @@ "timeslider.exportCurrent": "当前版本导出为:", "timeslider.version": "版本 {{version}}", "timeslider.saved": "在{{year}}年{{month}}{{day}}日保存", + "timeslider.playPause": "回放 / 暂停Pad内容", + "timeslider.backRevision": "返回此Pad的一次修订", + "timeslider.forwardRevision": "前往此Pad的一次修订", "timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}{{minutes}}{{seconds}}", "timeslider.month.january": "1月", "timeslider.month.february": "2月", From 786b43efc893ceb3fcf3d1d6acb9f46fc4b5426f Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Mon, 18 May 2015 16:24:41 +0100 Subject: [PATCH 29/74] Tidy HTML before trying to convert it with abiword --- settings.json.template | 42 +++++++++++++++++-------------- src/node/handler/ExportHandler.js | 36 +++++++++++++++----------- src/node/utils/Settings.js | 9 +++++-- src/node/utils/TidyHtml.js | 35 ++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 35 deletions(-) create mode 100644 src/node/utils/TidyHtml.js diff --git a/settings.json.template b/settings.json.template index 7d9c62cc..310e0791 100644 --- a/settings.json.template +++ b/settings.json.template @@ -10,12 +10,12 @@ // favicon default name // alternatively, set up a fully specified Url to your own favicon "favicon": "favicon.ico", - + //IP and port which etherpad should bind at "ip": "0.0.0.0", "port" : 9001, - /* + /* // Node native SSL support // this is disabled by default // @@ -37,17 +37,17 @@ "dbSettings" : { "filename" : "var/dirty.db" }, - + /* An Example of MySQL Configuration "dbType" : "mysql", "dbSettings" : { - "user" : "root", - "host" : "localhost", - "password": "", + "user" : "root", + "host" : "localhost", + "password": "", "database": "store" }, */ - + //the default text of a pad "defaultPadText" : "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http:\/\/etherpad.org\n", @@ -65,7 +65,7 @@ "chatAndUsers": false, "lang": "en-gb" }, - + /* Shoud we suppress errors from being visible in the default Pad Text? */ "suppressErrorsInPadText" : false, @@ -77,35 +77,39 @@ /* Users, who have a valid session, automatically get granted access to password protected pads */ "sessionNoPassword" : false, - - /* if true, all css & js will be minified before sending to the client. This will improve the loading performance massivly, + + /* if true, all css & js will be minified before sending to the client. This will improve the loading performance massivly, but makes it impossible to debug the javascript/css */ "minify" : true, /* How long may clients use served javascript code (in seconds)? Without versioning this may cause problems during deployment. Set to 0 to disable caching */ "maxAge" : 21600, // 60 * 60 * 6 = 6 hours - + /* This is the path to the Abiword executable. Setting it to null, disables abiword. - Abiword is needed to advanced import/export features of pads*/ + Abiword is needed to advanced import/export features of pads*/ "abiword" : null, + /* This is the path to the Tidy executable. Setting it to null, disables Tidy. + Tidy is used to improve the quality of exported pads*/ + "tidyHtml" : null, + /* Allow import of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */ "allowUnknownFileEnds" : true, - + /* This setting is used if you require authentication of all users. Note: /admin always requires authentication. */ "requireAuthentication" : false, /* Require authorization by a module, or a user with is_admin set, see below. */ "requireAuthorization" : false, - + /*when you use NginX or another proxy/ load-balancer set this to true*/ "trustProxy" : false, - + /* Privacy: disable IP logging */ - "disableIPlogging" : false, - + "disableIPlogging" : false, + /* Users for basic authentication. is_admin = true gives access to /admin. If you do not uncomment this, /admin will not be available! */ /* @@ -126,7 +130,7 @@ // Allow Load Testing tools to hit the Etherpad Instance. Warning this will disable security on the instance. "loadTest": false, - + /* The toolbar buttons configuration. "toolbar": { "left": [ @@ -148,7 +152,7 @@ /* The log level we are using, can be: DEBUG, INFO, WARN, ERROR */ "loglevel": "INFO", - + //Logging configuration. See log4js documentation for further information // https://github.com/nomiddlename/log4js-node // You can add as many appenders as you want here: diff --git a/src/node/handler/ExportHandler.js b/src/node/handler/ExportHandler.js index f20e8715..f861c82e 100644 --- a/src/node/handler/ExportHandler.js +++ b/src/node/handler/ExportHandler.js @@ -28,6 +28,7 @@ var fs = require("fs"); var settings = require('../utils/Settings'); var os = require('os'); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); +var TidyHtml = require('../utils/TidyHtml'); //load abiword only if its enabled if(settings.abiword != null) @@ -35,28 +36,28 @@ if(settings.abiword != null) var tempDirectory = "/tmp"; -//tempDirectory changes if the operating system is windows +//tempDirectory changes if the operating system is windows if(os.type().indexOf("Windows") > -1) { tempDirectory = process.env.TEMP; } - + /** * do a requested export - */ + */ exports.doExport = function(req, res, padId, type) { var fileName = padId; // allow fileName to be overwritten by a hook, the type type is kept static for security reasons - hooks.aCallFirst("exportFileName", padId, + hooks.aCallFirst("exportFileName", padId, function(err, hookFileName){ // if fileName is set then set it to the padId, note that fileName is returned as an array. if(hookFileName.length) fileName = hookFileName; //tell the browser that this is a downloadable file res.attachment(fileName + "." + type); - + //if this is a plain text export, we can do this directly // We have to over engineer this because tabs are stored as attributes and not plain text if(type == "etherpad"){ @@ -72,7 +73,7 @@ exports.doExport = function(req, res, padId, type) var txt; var randNum; var srcFile, destFile; - + async.series([ //render the txt document function(callback) @@ -96,7 +97,7 @@ exports.doExport = function(req, res, padId, type) { //ensure html can be collected by the garbage collector txt = null; - + destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; abiword.convertFile(srcFile, destFile, type, callback); }, @@ -140,7 +141,7 @@ exports.doExport = function(req, res, padId, type) var html; var randNum; var srcFile, destFile; - + async.series([ //render the html document function(callback) @@ -150,7 +151,7 @@ exports.doExport = function(req, res, padId, type) if(ERR(err, callback)) return; html = _html; callback(); - }); + }); }, //decide what to do with the html export function(callback) @@ -162,22 +163,29 @@ exports.doExport = function(req, res, padId, type) hooks.aCallFirst("exportHTMLSend", html, function(err, newHTML){ if(newHTML.length) html = newHTML; res.send(html); - callback("stop"); + callback("stop"); }); } else //write the html export to a file { randNum = Math.floor(Math.random()*0xFFFFFFFF); srcFile = tempDirectory + "/etherpad_export_" + randNum + ".html"; - fs.writeFile(srcFile, html, callback); + fs.writeFile(srcFile, html, callback); } }, - //send the convert job to abiword + + // Tidy up the exported HTML function(callback) { //ensure html can be collected by the garbage collector html = null; - + + TidyHtml.tidy(srcFile, callback); + }, + + //send the convert job to abiword + function(callback) + { destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; abiword.convertFile(srcFile, destFile, type, callback); }, @@ -199,7 +207,7 @@ exports.doExport = function(req, res, padId, type) //100ms delay to accomidate for slow windows fs if(os.type().indexOf("Windows") > -1) { - setTimeout(function() + setTimeout(function() { fs.unlink(destFile, callback); }, 100); diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index b7d1f0bc..2cc6a926 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -152,6 +152,11 @@ exports.minify = true; */ exports.abiword = null; +/** + * The path of the tidy executable + */ +exports.tidyHtml = null; + /** * Should we support none natively supported file types on import? */ @@ -167,7 +172,7 @@ exports.loglevel = "INFO"; */ exports.disableIPlogging = false; -/** +/** * Disable Load Testing */ exports.loadTest = false; @@ -239,7 +244,7 @@ exports.reloadSettings = function reloadSettings() { } else { settingsFilename = path.resolve(path.join(exports.root, settingsFilename)); } - + var settingsStr; try{ //read the settings sync diff --git a/src/node/utils/TidyHtml.js b/src/node/utils/TidyHtml.js new file mode 100644 index 00000000..13dc2ece --- /dev/null +++ b/src/node/utils/TidyHtml.js @@ -0,0 +1,35 @@ +/** + * Tidy up the HTML in a given file + */ + +var settings = require("./Settings"); +var spawn = require('child_process').spawn; + +exports.tidy = function(srcFile, callback) { + // Don't do anything if Tidy hasn't been enabled + if (!settings.tidyHtml) { + return callback(null); + } + + var errMessage = ''; + + // Spawn a new tidy instance that cleans up the file inline + var tidy = spawn(settings.tidyHtml, ['-modify', srcFile]); + + // Keep track of any error messages + tidy.stderr.on('data', function (data) { + errMessage += data.toString(); + }); + + // Wait until Tidy is done + tidy.on('close', function(code) { + // Tidy returns a 0 when no errors occur and a 1 exit code when + // the file could be tidied but a few warnings were generated + if (code === 0 || code === 1) { + return callback(null); + } else { + console.error(errMessage); + return callback('Tidy died with exit code ' + code); + } + }); +}; From 7fe99cccad64707a46d3120d6a18f2e6d0724b90 Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Mon, 18 May 2015 17:43:46 +0100 Subject: [PATCH 30/74] Using log4js in TidyHtml --- src/node/utils/TidyHtml.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/node/utils/TidyHtml.js b/src/node/utils/TidyHtml.js index 13dc2ece..5d4e6ed7 100644 --- a/src/node/utils/TidyHtml.js +++ b/src/node/utils/TidyHtml.js @@ -2,18 +2,23 @@ * Tidy up the HTML in a given file */ -var settings = require("./Settings"); +var log4js = require('log4js'); +var settings = require('./Settings'); var spawn = require('child_process').spawn; exports.tidy = function(srcFile, callback) { + var logger = log4js.getLogger('TidyHtml'); + // Don't do anything if Tidy hasn't been enabled if (!settings.tidyHtml) { + logger.debug('tidyHtml has not been configured yet, ignoring tidy request'); return callback(null); } var errMessage = ''; // Spawn a new tidy instance that cleans up the file inline + logger.debug('Tidying ' + srcFile); var tidy = spawn(settings.tidyHtml, ['-modify', srcFile]); // Keep track of any error messages @@ -26,9 +31,10 @@ exports.tidy = function(srcFile, callback) { // Tidy returns a 0 when no errors occur and a 1 exit code when // the file could be tidied but a few warnings were generated if (code === 0 || code === 1) { + logger.debug('Tidied ' + srcFile + ' successfully'); return callback(null); } else { - console.error(errMessage); + logger.error('Failed to tidy ' + srcFile + '\n' + errMessage); return callback('Tidy died with exit code ' + code); } }); From fd9d0bc291cbfca042f818d76541464c170dc130 Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Mon, 18 May 2015 17:44:11 +0100 Subject: [PATCH 31/74] Added backend tests for TidyHtml --- tests/backend/specs/api/tidy.js | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tests/backend/specs/api/tidy.js diff --git a/tests/backend/specs/api/tidy.js b/tests/backend/specs/api/tidy.js new file mode 100644 index 00000000..47cb49f6 --- /dev/null +++ b/tests/backend/specs/api/tidy.js @@ -0,0 +1,63 @@ +var assert = require('assert') + fs = require('fs'), + path = require('path'), + TidyHtml = null, + Settings = null; + +var npm = require("../../../../src/node_modules/npm/lib/npm.js"); + +describe('tidyHtml', function() { + before(function(done) { + npm.load({}, function(err) { + assert.ok(!err); + TidyHtml = require('../../../../src/node/utils/TidyHtml'); + Settings = require('../../../../src/node/utils/Settings'); + return done() + }); + }); + + it('Tidies HTML', function(done) { + // If the user hasn't configured Tidy, we skip this tests as it's required for this test + if (!Settings.tidyHtml) { + this.skip(); + } + + // Try to tidy up a bad HTML file + var tmpDir = process.env.TEMP || "/tmp"; + var tmpFile = path.join(tmpDir, 'tmp_' + (Math.floor(Math.random() * 1000000)) + '.html') + fs.writeFileSync(tmpFile, '

a paragraph

  • List without outer UL
  • trailing closing p

    '); + TidyHtml.tidy(tmpFile, function(err){ + assert.ok(!err); + + // Read the file again + var cleanedHtml = fs.readFileSync(tmpFile).toString(); + + var expectedHtml = [ + '', + '', + '', + '

    a paragraph

    ', + '
      ', + '
    • List without outer UL
    • ', + '
    • trailing closing p
    • ', + '
    ', + '', + '', + ].join('\n'); + assert.notStrictEqual(cleanedHtml.indexOf(expectedHtml), -1); + return done(); + }); + }); + + it('can deal with errors', function(done) { + // If the user hasn't configured Tidy, we skip this tests as it's required for this test + if (!Settings.tidyHtml) { + this.skip(); + } + + TidyHtml.tidy('/some/none/existing/file.html', function(err) { + assert.ok(err); + return done(); + }); + }); +}); From b662d5c61802d42ee4214799520e7c3ed95a3ef5 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 May 2015 16:43:19 +0100 Subject: [PATCH 32/74] dont show editing buttons in R/O view --- src/node/utils/toolbar.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js index 07b86496..97eb2ffa 100644 --- a/src/node/utils/toolbar.js +++ b/src/node/utils/toolbar.js @@ -236,10 +236,32 @@ module.exports = { selectButton: function (attributes) { return new SelectButton(attributes); }, - menu: function (buttons) { + menu: function (buttons, isReadOnly) { + if(isReadOnly){ + // The best way to detect if it's the left editbar is to check for a bold button + if(buttons[0].indexOf("bold") !== -1){ + // Clear all formatting buttons + buttons = [] + }else{ + // Remove Save Revision from the right menu + buttons[0].remove("savedrevision"); + } + } + var groups = _.map(buttons, function (group) { return ButtonsGroup.fromArray(group).render(); }); return groups.join(this.separator()); } }; + +Array.prototype.remove = function() { + var what, a = arguments, L = a.length, ax; + while (L && this.length) { + what = a[--L]; + while ((ax = this.indexOf(what)) !== -1) { + this.splice(ax, 1); + } + } + return this; +}; From 818408cf4984be67e4e3955acb9b0364cb0014f9 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 May 2015 16:57:53 +0100 Subject: [PATCH 33/74] other bits required for read only --- src/node/hooks/express/specialpages.js | 9 +++++++-- src/templates/pad.html | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/node/hooks/express/specialpages.js b/src/node/hooks/express/specialpages.js index 0370c4fc..15e853db 100644 --- a/src/node/hooks/express/specialpages.js +++ b/src/node/hooks/express/specialpages.js @@ -33,13 +33,18 @@ exports.expressCreateServer = function (hook_name, args, cb) { //serve pad.html under /p args.app.get('/p/:pad', function(req, res, next) { + // The below might break for pads being rewritten + var isReadOnly = req.url.indexOf("/p/r.") === 0; + hooks.callAll("padInitToolbar", { - toolbar: toolbar + toolbar: toolbar, + isReadOnly: isReadOnly }); res.send(eejs.require("ep_etherpad-lite/templates/pad.html", { req: req, - toolbar: toolbar + toolbar: toolbar, + isReadOnly: isReadOnly })); }); diff --git a/src/templates/pad.html b/src/templates/pad.html index dd260414..5311b320 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -63,12 +63,12 @@ From fe7ab21c84557834b3e68dc93e2316879bcb59a6 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 May 2015 17:52:43 +0100 Subject: [PATCH 34/74] dont allow chat input or name input on read only pads --- src/static/js/pad.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index e3951405..b865fa64 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -322,6 +322,11 @@ function handshake() pad._afterHandshake(); initalized = true; + if(clientVars.readonly){ + $('#myusernameedit').attr("disabled", true); + $('#chatinput').attr("disabled", true); + } + $("body").addClass(clientVars.readonly ? "readonly" : "readwrite") padeditor.ace.callWithAce(function (ace) { From 3944a0e79b21802aecf10457d9e44f1fc644a278 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 20 May 2015 01:05:53 +0100 Subject: [PATCH 35/74] more read only mode fixes andadd support for handleMessageSecurity hook --- src/node/handler/PadMessageHandler.js | 11 +++++++++++ src/static/js/pad.js | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index e15af1a4..9a0d1ee7 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -190,6 +190,16 @@ exports.handleMessage = function(client, message) } var handleMessageHook = function(callback){ + // Allow plugins to bypass the readonly message blocker + hooks.aCallAll("handleMessageSecurity", { client: client, message: message }, function ( err, messages ) { + if(ERR(err, callback)) return; + _.each(messages, function(newMessage){ + if ( newMessage === true ) { + thisSession.readonly = false; + } + }); + }); + var dropMessage = false; // Call handleMessage hook. If a plugin returns null, the message will be dropped. Note that for all messages // handleMessage will be called, even if the client is not authorized @@ -204,6 +214,7 @@ exports.handleMessage = function(client, message) // If no plugins explicitly told us to drop the message, its ok to proceed if(!dropMessage){ callback() }; }); + } var finalHandler = function () { diff --git a/src/static/js/pad.js b/src/static/js/pad.js index b865fa64..bb06162a 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -325,6 +325,9 @@ function handshake() if(clientVars.readonly){ $('#myusernameedit').attr("disabled", true); $('#chatinput').attr("disabled", true); + $('#chaticon').hide(); + $('#options-chatandusers').parent().hide(); + $('#options-stickychat').parent().hide(); } $("body").addClass(clientVars.readonly ? "readonly" : "readwrite") From 48da5c1ab1e6296de11f47b80575c14c8b789404 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 20 May 2015 01:09:35 +0100 Subject: [PATCH 36/74] docs for handle message security --- doc/api/hooks_server-side.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/api/hooks_server-side.md b/doc/api/hooks_server-side.md index 717abe75..a4505e93 100644 --- a/doc/api/hooks_server-side.md +++ b/doc/api/hooks_server-side.md @@ -214,6 +214,32 @@ function handleMessage ( hook, context, callback ) { }; ``` +## handleMessageSecurity +Called from: src/node/handler/PadMessageHandler.js + +Things in context: + +1. message - the message being handled +2. client - the client object from socket.io + +This hook will be called once a message arrives. If a plugin calls `callback(true)` the message will be allowed to be processed. This is especially useful if you want read only pad visitors to update pad contents for whatever reason. + +**WARNING**: handleMessageSecurity will be called, even if the client is not authorized to send this message. It's up to the plugin to check permissions. + +Example: + +``` +function handleMessageSecurity ( hook, context, callback ) { + if ( context.message.boomerang == 'hipster' ) { + // If the message boomer is hipster, allow the request + callback(true); + }else{ + callback(); + } +}; +``` + + ## clientVars Called from: src/node/handler/PadMessageHandler.js From 0eb8b800cfbfeff13931218677e5a479852fe08a Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 20 May 2015 01:50:37 +0100 Subject: [PATCH 37/74] hide chat if its already open on readonly mode --- src/static/js/pad.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index bb06162a..03eff4ba 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -323,6 +323,7 @@ function handshake() initalized = true; if(clientVars.readonly){ + chat.hide(); $('#myusernameedit').attr("disabled", true); $('#chatinput').attr("disabled", true); $('#chaticon').hide(); From 757ad765d3d7fca4e94347962423cb65b1a598d4 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 22 May 2015 11:09:21 +0100 Subject: [PATCH 38/74] use removeItem instead of remove namespace --- src/node/utils/toolbar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js index 97eb2ffa..f040fb88 100644 --- a/src/node/utils/toolbar.js +++ b/src/node/utils/toolbar.js @@ -244,7 +244,7 @@ module.exports = { buttons = [] }else{ // Remove Save Revision from the right menu - buttons[0].remove("savedrevision"); + buttons[0].removeItem("savedrevision"); } } @@ -255,7 +255,7 @@ module.exports = { } }; -Array.prototype.remove = function() { +Array.prototype.removeItem = function() { var what, a = arguments, L = a.length, ax; while (L && this.length) { what = a[--L]; From 0b3216ecb6def2dd052b2c5b0f1588339b389dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Alnet?= Date: Fri, 22 May 2015 12:27:08 +0200 Subject: [PATCH 39/74] Do not extend Array.prototype --- src/node/utils/toolbar.js | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js index f040fb88..eaa1d421 100644 --- a/src/node/utils/toolbar.js +++ b/src/node/utils/toolbar.js @@ -7,7 +7,16 @@ var _ = require("underscore") , Button , ButtonsGroup , Separator - , defaultButtonAttributes; + , defaultButtonAttributes + , removeItem; + +removeItem = function(array,what) { + var ax; + while ((ax = array.indexOf(what)) !== -1) { + array.splice(ax, 1); + } + return array; +}; defaultButtonAttributes = function (name, overrides) { return { @@ -244,7 +253,7 @@ module.exports = { buttons = [] }else{ // Remove Save Revision from the right menu - buttons[0].removeItem("savedrevision"); + removeItem(buttons[0],"savedrevision"); } } @@ -254,14 +263,3 @@ module.exports = { return groups.join(this.separator()); } }; - -Array.prototype.removeItem = function() { - var what, a = arguments, L = a.length, ax; - while (L && this.length) { - what = a[--L]; - while ((ax = this.indexOf(what)) !== -1) { - this.splice(ax, 1); - } - } - return this; -}; From 92aabe12dca0b6c911d7006fc79f9fe186d2758e Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Mon, 25 May 2015 07:08:24 -0300 Subject: [PATCH 40/74] Allowing 'value' to be a localizable attribute on HTML elements. --- src/static/js/html10n.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index 44abd7a0..e2540f66 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -851,6 +851,7 @@ window.html10n = (function(window, document, undefined) { , "innerHTML": 1 , "alt": 1 , "textContent": 1 + , "value": 1 } if (index > 0 && str.id.substr(index + 1) in attrList) { // an attribute has been specified prop = str.id.substr(index + 1) From 7e38e2c2b1876a1f03b32824495f747ea16d3eb2 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 25 May 2015 13:00:34 +0200 Subject: [PATCH 41/74] Localisation updates from https://translatewiki.net. --- src/locales/cs.json | 6 +++++- src/locales/ksh.json | 4 ++-- src/locales/ku-latn.json | 1 + src/locales/ne.json | 18 +++++++++++++----- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/locales/cs.json b/src/locales/cs.json index 19552ffd..1a26e7a6 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -5,7 +5,8 @@ "Jezevec", "Juandev", "Leanes", - "Quinn" + "Quinn", + "Aktron" ] }, "index.newPad": "Založ nový Pad", @@ -96,6 +97,9 @@ "timeslider.exportCurrent": "Exportovat nynější verzi jako:", "timeslider.version": "Verze {{version}}", "timeslider.saved": "Uloženo {{day}} {{month}} {{year}}", + "timeslider.playPause": "Pustit / pozastavit obsah padu", + "timeslider.backRevision": "Jít v tomto padu o revizi zpět", + "timeslider.forwardRevision": "Jít v tomto padu o revizi vpřed", "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "leden", "timeslider.month.february": "únor", diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 5ed5b410..30137ff4 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -34,7 +34,7 @@ "pad.settings.myView": "Aanseesch", "pad.settings.stickychat": "Donn der Klaaf emmer aanzeije", "pad.settings.chatandusers": "Dunn de Metmaacher un der Klaaf aanzeije", - "pad.settings.colorcheck": "Färve för de Schriiver", + "pad.settings.colorcheck": "Färve för de Schrihver", "pad.settings.linenocheck": "Nommere för de Reije", "pad.settings.rtlcheck": "Schreff vun Rääschß noh Lenks?", "pad.settings.fontType": "Zoot Schreff", @@ -86,7 +86,7 @@ "pad.chat.loadmessages": "Mieh Nohreeschte lahde...", "timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle", "timeslider.toolbar.returnbutton": "Jangk retuur nohm Pädd", - "timeslider.toolbar.authors": "De Schriiver:", + "timeslider.toolbar.authors": "De Schrihver:", "timeslider.toolbar.authorsList": "Kein Schriivere", "timeslider.toolbar.exportlink.title": "Äxpotteere", "timeslider.exportCurrent": "Donn de neußte Väsjohn äxpotteere alß:", diff --git a/src/locales/ku-latn.json b/src/locales/ku-latn.json index 16fc1538..b1713b50 100644 --- a/src/locales/ku-latn.json +++ b/src/locales/ku-latn.json @@ -56,6 +56,7 @@ "timeslider.toolbar.authorsList": "Nivîser Tine", "timeslider.version": "Guhertoya {{version}}", "timeslider.saved": "Di dîroka {{day}} {{month}} {{year}} de hate tomarkirin", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", "timeslider.month.january": "rêbendan", "timeslider.month.february": "reşemî", "timeslider.month.march": "adar", diff --git a/src/locales/ne.json b/src/locales/ne.json index b380526e..f4da20e6 100644 --- a/src/locales/ne.json +++ b/src/locales/ne.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "सरोज कुमार ढकाल" + "सरोज कुमार ढकाल", + "Nirjal stha" ] }, "index.newPad": "नयाँ प्याड", @@ -9,14 +10,14 @@ "pad.toolbar.bold.title": "मोटो (Ctrl-B)", "pad.toolbar.italic.title": "ढल्के (Ctrl-I)", "pad.toolbar.underline.title": "निम्न रेखाङ्कन (Ctrl-U)", - "pad.toolbar.strikethrough.title": "बीचको धर्को", - "pad.toolbar.ol.title": "क्रमवद्ध सूची", - "pad.toolbar.ul.title": "अक्रमाङ्कित सूची", + "pad.toolbar.strikethrough.title": "बीचको धर्को (Ctrl+5)", + "pad.toolbar.ol.title": "क्रमवद्ध सूची (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "अक्रमाङ्कित सूची (Ctrl+Shift+L)", "pad.toolbar.indent.title": "इन्डेन्ट (TAB)", "pad.toolbar.unindent.title": "आउटडेन्ट (Shift+TAB)", "pad.toolbar.undo.title": "रद्द (Ctrl-Z)", "pad.toolbar.redo.title": "पुन:लागु (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "लेखकीय रङ्ग हटाउने", + "pad.toolbar.clearAuthorship.title": "लेखकीय रङ्ग हटाउने (Ctrl+Shift+C)", "pad.toolbar.timeslider.title": "टाइमस्लाइडर", "pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहगर्ने", "pad.toolbar.settings.title": "सेटिङ्गहरू", @@ -31,6 +32,7 @@ "pad.settings.padSettings": "प्याड सेटिङ्गहरू", "pad.settings.myView": "मेरो दृष्य", "pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने", + "pad.settings.chatandusers": "वार्ता तथा प्रयोगकर्ताहरू देखाउने", "pad.settings.colorcheck": "लेखकीय रङ्ग", "pad.settings.linenocheck": "हरफ संख्या", "pad.settings.rtlcheck": "के सामग्री दाहिने देखि देब्रे पढ्ने हो ?", @@ -43,6 +45,7 @@ "pad.importExport.import": "कुनै पनि पाठ रहेको फाइल या कागजात अपलोड गर्नुहोस्", "pad.importExport.importSuccessful": "सफल भयो!", "pad.importExport.export": "निम्न रुपमा प्याड निर्यात गर्ने :", + "pad.importExport.exportetherpad": "इथरप्याड", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "साधारण पाठ", "pad.importExport.exportword": "माइक्रोसफ्ट वर्ड", @@ -54,6 +57,7 @@ "pad.modals.userdup": "अर्को सन्झ्यालमा खोल्ने", "pad.modals.unauth": "अनुमती नदिइएको", "pad.modals.initsocketfail": "सर्भरमा पहुँच पुर्‍याउन सकिएन ।", + "pad.modals.slowcommit.explanation": "सर्भरसँग सम्पर्क हुने सकेन ।", "pad.modals.deleted": "मेटिएको ।", "pad.modals.deleted.explanation": "यो प्याड हटाइसकेको छ ।", "pad.modals.disconnected": "तपाईँको जडान अवरुद्ध भयो ।", @@ -73,6 +77,9 @@ "timeslider.exportCurrent": "हालको संस्करण निम्म रुपमा निर्यात गर्ने :", "timeslider.version": "संस्करण {{version}}", "timeslider.saved": "सङ्ग्रह गरिएको {{month}} {{day}}, {{year}}", + "timeslider.playPause": "प्याडको सामग्रीहरूलाई चालु/बन्द गर्नुहोस", + "timeslider.backRevision": "यो प्याडको एक संस्करण पहिले जानुहोस्", + "timeslider.forwardRevision": "यो प्याडको एक संस्करण पछि जानुहोस्", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "जनवरी", "timeslider.month.february": "फेब्रुअरी", @@ -95,6 +102,7 @@ "pad.userlist.approve": "स्वीकृत गर्ने", "pad.impexp.importbutton": "अहिले आयात गर्ने", "pad.impexp.importing": "आयात गर्ने...", + "pad.impexp.uploadFailed": "अपलोड असफल भयो , कृपया पुन: प्रयास गर्नुहोस् ।", "pad.impexp.importfailed": "आयात असफल भयो", "pad.impexp.copypaste": "कृपया कपी पेस्ट गर्नुहोस" } From 7ba5e97a606c893a6c95c7fce198442e3230487f Mon Sep 17 00:00:00 2001 From: Hinnerk Haardt Date: Sat, 30 May 2015 15:14:40 +0200 Subject: [PATCH 42/74] Use current mysql client API --- bin/convert.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/convert.js b/bin/convert.js index 202ef04e..88af1ad5 100644 --- a/bin/convert.js +++ b/bin/convert.js @@ -34,13 +34,13 @@ var sql = "SET CHARACTER SET UTF8;\n" + fs.writeSync(sqlOutput, sql); log("done"); -//set setings for ep db -var etherpadDB= new mysql.Client(); -etherpadDB.host = settings.etherpadDB.host; -etherpadDB.port = settings.etherpadDB.port; -etherpadDB.database = settings.etherpadDB.database; -etherpadDB.user = settings.etherpadDB.user; -etherpadDB.password = settings.etherpadDB.password; +var etherpadDB = mysql.createConnection({ + host : settings.etherpadDB.host, + user : settings.etherpadDB.user, + password : settings.etherpadDB.password, + database : settings.etherpadDB.database, + port : settings.etherpadDB.port +}); //get the timestamp once var timestamp = new Date().getTime(); From beae99415c62683fb0829696cb8ccdcf3312cc2b Mon Sep 17 00:00:00 2001 From: Zihua Li Date: Wed, 3 Jun 2015 19:45:08 +0800 Subject: [PATCH 43/74] Change "Javascript" to "JavaScript" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 12ea3998..5ad3587c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # About Etherpad is a really-real time collaborative editor maintained by the Etherpad Community. -Etherpad is written in Javascript(99.9%) on both the server and client so it's easy for developers to maintain and add new features. Because of this Etherpad has tons of customizations that you can leverage. +Etherpad is written in JavaScript(99.9%) on both the server and client so it's easy for developers to maintain and add new features. Because of this Etherpad has tons of customizations that you can leverage. Etherpad is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API. From 2fa2dc8a0310c7d5c24fab7fd522ee6aac9b7d1e Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 8 Jun 2015 16:09:38 +0200 Subject: [PATCH 44/74] Localisation updates from https://translatewiki.net. --- src/locales/dty.json | 53 ++++++++++++++++++++++++++++++++++++++++++ src/locales/en-gb.json | 3 +++ src/locales/eu.json | 5 ++-- src/locales/fi.json | 9 ++++++- src/locales/fr.json | 33 +++++++++++++------------- src/locales/ksh.json | 12 +++++----- src/locales/nap.json | 2 +- src/locales/tr.json | 4 ++++ 8 files changed, 95 insertions(+), 26 deletions(-) create mode 100644 src/locales/dty.json diff --git a/src/locales/dty.json b/src/locales/dty.json new file mode 100644 index 00000000..997ca1b6 --- /dev/null +++ b/src/locales/dty.json @@ -0,0 +1,53 @@ +{ + "@metadata": { + "authors": [ + "रमेश सिंह बोहरा" + ] + }, + "index.newPad": "नयाँ प्याड", + "index.createOpenPad": "नाम सहितको नयाँ प्याड सिर्जना गद्य्या / खोल्या :", + "pad.toolbar.bold.title": "मोटो (Ctrl-B)", + "pad.toolbar.italic.title": "ढल्के (Ctrl-I)", + "pad.toolbar.underline.title": "इसो रेखाङ्कन (Ctrl-U)", + "pad.toolbar.strikethrough.title": "बीचको धड्को (Ctrl+5)", + "pad.toolbar.ol.title": "एकनासको सूची (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "अक्रमाङ्कित सूची (Ctrl+Shift+L)", + "pad.toolbar.indent.title": "इन्डेन्ट (TAB)", + "pad.toolbar.unindent.title": "आउटडेन्ट (Shift+TAB)", + "pad.toolbar.undo.title": "खारेजी (Ctrl-Z)", + "pad.toolbar.redo.title": "दोसर्या:लागु (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "लेखकीय रङ्ग हटाउन्या (Ctrl+Shift+C)", + "pad.toolbar.timeslider.title": "टाइमस्लाइडर", + "pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहा गद्य्य", + "pad.toolbar.settings.title": "सेटिङ्गहरू", + "pad.toolbar.embed.title": "यै प्याडलाई बाड्न्या यात इम्बेड गद्य्या", + "pad.toolbar.showusers.title": "यै प्याडमि रयाका प्रयोगकर्ता देखाउन्या", + "pad.colorpicker.save": "संग्रह गद्य्या", + "pad.colorpicker.cancel": "खारेजी", + "pad.loading": "लोड हुन्नाछ....", + "pad.passwordRequired": "यो प्यड खोल्लाकी पासवर्ड चाहिन्छ", + "pad.permissionDenied": "तमलाईँ यै प्याड खोल्लाकी अनुमति नाइथिन", + "pad.wrongPassword": "तमरो पासवर्ड गलत थ्यो", + "pad.settings.padSettings": "प्याड सेटिङ्गहरू", + "pad.settings.myView": "मेरि हेराइ", + "pad.settings.stickychat": "पर्दामा जबलई कुरडी गद्य्या", + "pad.settings.chatandusers": "वार्ता और प्रयोगकर्ताहरू देखाउन्या", + "pad.settings.colorcheck": "लेखकीय रङ्ग", + "pad.settings.linenocheck": "हरफ संख्या", + "pad.settings.rtlcheck": "के सामग्री दाहिना बठे देब्रे पढ्न्या हो ?", + "pad.settings.fontType": "फन्ट प्रकार:", + "pad.settings.globalView": "विश्वव्यापी दृष्य", + "pad.settings.language": "भाषा: $1", + "pad.importExport.import_export": "आउन्या/झान्या", + "pad.importExport.import": "कोइलै पाठ रयाको फाइल और कागजात अपलोड गरिदिय", + "pad.importExport.importSuccessful": "सफल भयो!", + "pad.importExport.export": "निम्न रुपमि प्याड पठौन्या :", + "pad.importExport.exportetherpad": "इथरप्याड", + "pad.importExport.exporthtml": "हटमेल", + "pad.importExport.exportplain": "सानतिनो पाठ", + "pad.importExport.exportword": "माइक्रोसफ्ट वर्ड", + "pad.importExport.exportpdf": "पिडिएफ", + "pad.importExport.exportopen": "ओडिएफ(खुल्ला कागजात ढाँचा)", + "pad.modals.connected": "जोडीयाको", + "pad.modals.reconnecting": "तमरो प्याडमि आजि: जडान हुन्नाछ" +} diff --git a/src/locales/en-gb.json b/src/locales/en-gb.json index 258b4331..0cae66e2 100644 --- a/src/locales/en-gb.json +++ b/src/locales/en-gb.json @@ -93,6 +93,9 @@ "timeslider.exportCurrent": "Export current version as:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Saved {{month}} {{day}}, {{year}}", + "timeslider.playPause": "Playback/Pause Pad Contents", + "timeslider.backRevision": "Go back a revision in this Pad", + "timeslider.forwardRevision": "Go forward a revision in this Pad", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "January", "timeslider.month.february": "February", diff --git a/src/locales/eu.json b/src/locales/eu.json index 9cd06076..e31d7d20 100644 --- a/src/locales/eu.json +++ b/src/locales/eu.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "Theklan", - "Subi" + "Subi", + "Xabier Armendaritz" ] }, "index.newPad": "Pad berria", @@ -87,7 +88,7 @@ "timeslider.exportCurrent": "Gorde bertsio hau honela:", "timeslider.version": "Bertsioa {{version}}", "timeslider.saved": "{{year}}ko {{month}}ren {{day}}an gordeta", - "timeslider.dateformat": "{{year}}/{{month}}/{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Urtarrila", "timeslider.month.february": "Otsaila", "timeslider.month.march": "Martxoa", diff --git a/src/locales/fi.json b/src/locales/fi.json index 67efac93..8f4f583e 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -12,7 +12,8 @@ "VezonThunder", "Macofe", "MrTapsa", - "Silvonen" + "Silvonen", + "Espeox" ] }, "index.newPad": "Uusi muistio", @@ -44,6 +45,7 @@ "pad.settings.padSettings": "Muistion asetukset", "pad.settings.myView": "Oma näkymä", "pad.settings.stickychat": "Keskustelu aina näkyvissä", + "pad.settings.chatandusers": "Näytä keskustelu ja käyttäjät", "pad.settings.colorcheck": "Kirjoittajavärit", "pad.settings.linenocheck": "Rivinumerot", "pad.settings.rtlcheck": "Luetaanko sisältö oikealta vasemmalle?", @@ -102,6 +104,9 @@ "timeslider.exportCurrent": "Vie nykyinen versio muodossa:", "timeslider.version": "Versio {{version}}", "timeslider.saved": "Tallennettu {{day}}. {{month}}ta {{year}}", + "timeslider.playPause": "Toista / pysäytä muistion sisältö", + "timeslider.backRevision": "Palaa edelliseen muutokseen taaksepäin tässä muistiossa", + "timeslider.forwardRevision": "Siirry seuraavaan muutokseen tässä muistiossa", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "tammikuu", "timeslider.month.february": "helmikuu", @@ -117,6 +122,7 @@ "timeslider.month.december": "joulukuu", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: nimetön tekijä, other: nimetöntä tekijää ]}", "pad.savedrevs.marked": "Tämä versio on nyt merkitty tallennetuksi versioksi", + "pad.savedrevs.timeslider": "Voit tarkastella tallennettuja versioita avaamalla aikajanan", "pad.userlist.entername": "Kirjoita nimesi", "pad.userlist.unnamed": "nimetön", "pad.userlist.guest": "Vieras", @@ -127,6 +133,7 @@ "pad.impexp.importing": "Tuodaan...", "pad.impexp.confirmimport": "Tiedoston tuonti korvaa kaiken muistiossa olevan tekstin. Haluatko varmasti jatkaa?", "pad.impexp.convertFailed": "TIedoston tuonti epäonnistui. Käytä eri tiedostomuotoa tai kopioi ja liitä käsin.", + "pad.impexp.padHasData": "Tiedostoa ei voitu lisätä lehtiöön, koska lehtiötä on jo muokattu – ole hyvä ja lisää tiedosto uuteen lehtiöön", "pad.impexp.uploadFailed": "Lähetys epäonnistui. Yritä uudelleen.", "pad.impexp.importfailed": "Tuonti epäonnistui", "pad.impexp.copypaste": "Kopioi ja liitä", diff --git a/src/locales/fr.json b/src/locales/fr.json index 166bd3bf..11f7c1b3 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -18,7 +18,8 @@ "Tux-tn", "Maxim21", "Boniface", - "Macofe" + "Macofe", + "Framafan" ] }, "index.newPad": "Nouveau pad", @@ -45,7 +46,7 @@ "pad.loading": "Chargement…", "pad.noCookie": "Le cookie n’a pas pu être trouvé. Veuillez autoriser les cookies dans votre navigateur !", "pad.passwordRequired": "Vous avez besoin d'un mot de passe pour accéder à ce pad", - "pad.permissionDenied": "Il ne vous est pas permis d’accéder à ce pad", + "pad.permissionDenied": "Vous n'avez pas la permission d’accéder à ce pad", "pad.wrongPassword": "Votre mot de passe est incorrect", "pad.settings.padSettings": "Paramètres du pad", "pad.settings.myView": "Ma vue", @@ -69,12 +70,12 @@ "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalités d'importation plus évoluées, veuillez installer abiword.", + "pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalités d'importation plus évoluées, veuillez installer Abiword.", "pad.modals.connected": "Connecté.", "pad.modals.reconnecting": "Reconnexion vers votre pad...", "pad.modals.forcereconnect": "Forcer la reconnexion", "pad.modals.userdup": "Ouvert dans une autre fenêtre", - "pad.modals.userdup.explanation": "Ce pad semble être ouvert dans plus d'une fenêtre de navigateur sur cet ordinateur.", + "pad.modals.userdup.explanation": "Ce pad semble être ouvert dans plusieurs fenêtres de navigateur sur cet ordinateur.", "pad.modals.userdup.advice": "Se reconnecter en utilisant cette fenêtre.", "pad.modals.unauth": "Non autorisé", "pad.modals.unauth.explanation": "Vos permissions ont été changées lors de l'affichage de cette page. Essayez de vous reconnecter.", @@ -85,8 +86,8 @@ "pad.modals.initsocketfail.cause": "Ceci est probablement dû à un problème avec votre navigateur ou votre connexion internet.", "pad.modals.slowcommit.explanation": "Le serveur ne répond pas.", "pad.modals.slowcommit.cause": "Ce problème peut venir d'une mauvaise connectivité au réseau.", - "pad.modals.badChangeset.explanation": "Une modification que vous avez effectuée a été classée comme illégale par le serveur de synchronisation.", - "pad.modals.badChangeset.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service, si vous pensez que c’est une erreur. Essayez de vous reconnecter pour continuer à modifier.", + "pad.modals.badChangeset.explanation": "Une modification que vous avez effectuée a été classée comme impossible par le serveur de synchronisation.", + "pad.modals.badChangeset.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service si vous pensez que c’est une erreur. Essayez de vous reconnecter pour continuer à modifier.", "pad.modals.corruptPad.explanation": "Le pad auquel vous essayez d’accéder est corrompu.", "pad.modals.corruptPad.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service.", "pad.modals.deleted": "Supprimé.", @@ -99,7 +100,7 @@ "pad.share.link": "Lien", "pad.share.emebdcode": "Incorporer un lien", "pad.chat": "Chat", - "pad.chat.title": "Ouvrir le chat associé à ce pad.", + "pad.chat.title": "Ouvrir le chat de ce pad.", "pad.chat.loadmessages": "Charger davantage de messages", "timeslider.pageTitle": "Historique dynamique de {{appTitle}}", "timeslider.toolbar.returnbutton": "Retourner au pad", @@ -109,10 +110,10 @@ "timeslider.exportCurrent": "Exporter la version actuelle sous :", "timeslider.version": "Version {{version}}", "timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}", - "timeslider.playPause": "Lecture / Pause des contenus du bloc", - "timeslider.backRevision": "Reculer d’une révision dans ce bloc", - "timeslider.forwardRevision": "Avancer d’une révision dans ce bloc", - "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.playPause": "Lecture / Pause des contenus du pad", + "timeslider.backRevision": "Reculer d’une révision dans ce pad", + "timeslider.forwardRevision": "Avancer d’une révision dans ce pad", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{seconds}}:{{minutes}}:{{hours}}", "timeslider.month.january": "janvier", "timeslider.month.february": "février", "timeslider.month.march": "mars", @@ -127,18 +128,18 @@ "timeslider.month.december": "décembre", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: auteur anonyme, other: auteurs anonymes ]}", "pad.savedrevs.marked": "Cette révision est maintenant marquée comme révision enregistrée", - "pad.savedrevs.timeslider": "Vous pouvez voir les révisions enregistrées en visitant l’ascenseur temporel", + "pad.savedrevs.timeslider": "Vous pouvez voir les révisions enregistrées en ouvrant l'historique", "pad.userlist.entername": "Entrez votre nom", "pad.userlist.unnamed": "anonyme", "pad.userlist.guest": "Invité", "pad.userlist.deny": "Refuser", "pad.userlist.approve": "Approuver", - "pad.editbar.clearcolors": "Effacer les couleurs de paternité dans tout le document ?", + "pad.editbar.clearcolors": "Effacer les couleurs de paternité des auteurs dans tout le document ?", "pad.impexp.importbutton": "Importer maintenant", "pad.impexp.importing": "Import en cours...", - "pad.impexp.confirmimport": "Importer un fichier écrasera le texte actuel du pad. Êtes-vous sûr de vouloir le faire ?", - "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire un copier/coller manuel", - "pad.impexp.padHasData": "Nous n’avons pas pu importer ce fichier parce que ce bloc a déjà eu des modifications ; veuillez importer vers un nouveau bloc", + "pad.impexp.confirmimport": "Importer un fichier écrasera le contenu actuel du pad. Êtes-vous sûr de vouloir le faire ?", + "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire manuellement un copier/coller du texte brut", + "pad.impexp.padHasData": "Nous n’avons pas pu importer ce fichier parce que ce pad a déjà eu des modifications ; veuillez donc en créer un nouveau", "pad.impexp.uploadFailed": "Le téléchargement a échoué, veuillez réessayer", "pad.impexp.importfailed": "Échec de l'importation", "pad.impexp.copypaste": "Veuillez copier/coller", diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 30137ff4..955f9755 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -5,7 +5,7 @@ ] }, "index.newPad": "Neu Pädd", - "index.createOpenPad": "udder maach e Pädd op med däm Naame:", + "index.createOpenPad": "udder maach e Pädd op med däm Nahme:", "pad.toolbar.bold.title": "Fättschreff (Strg-B)", "pad.toolbar.italic.title": "Scheive Schreff (Strg-I)", "pad.toolbar.underline.title": "Ongerstresche (Strg-U)", @@ -38,7 +38,7 @@ "pad.settings.linenocheck": "Nommere för de Reije", "pad.settings.rtlcheck": "Schreff vun Rääschß noh Lenks?", "pad.settings.fontType": "Zoot Schreff", - "pad.settings.fontType.normal": "Nomaal", + "pad.settings.fontType.normal": "Nommahl", "pad.settings.fontType.monospaced": "einheidlesch brejde Zeische", "pad.settings.globalView": "Et Ußsin för Alle", "pad.settings.language": "Schprohch:", @@ -54,7 +54,7 @@ "pad.importExport.exportopen": "ODF (Offe Dokemänte-Fommaat)", "pad.importExport.abiword.innerHTML": "Mer künne bloß eijfaache Täxte udder HTML_Fommaate empoteere. Opwändejere Müjjeleschkeite fö der Empoot jon och, doför bruch mer en Enschtallazjuhn met Abiword.", "pad.modals.connected": "Verbonge.", - "pad.modals.reconnecting": "Ben wider aam Verbenge …", + "pad.modals.reconnecting": "Ben wider aam Verbenge …", "pad.modals.forcereconnect": "Wider verbenge", "pad.modals.userdup": "En enem andere Finster en Ärbeid", "pad.modals.userdup.explanation": "Heh dat Padd schingk en mieh wi einem Finster vun enem Brauser op heh däm Rääschner op ze sin.", @@ -74,7 +74,7 @@ "pad.modals.corruptPad.cause": "Dat künnt sin wääje ener verkehte Enschtällong vum ẞööver udder öhnßjät, wat mer nit äwaadt hät. Donn Desch aan däm ßööver singe Bedriever wände.", "pad.modals.deleted": "Fottjeschmeße.", "pad.modals.deleted.explanation": "Dat Pädd es fottjeschmeße woode.", - "pad.modals.disconnected": "Do bes nit mieh verbonge.", + "pad.modals.disconnected": "Do bes nit mih verbonge.", "pad.modals.disconnected.explanation": "De Verbendong mem ẞööver es fott.", "pad.modals.disconnected.cause": "Dä ẞööver künnt nit mieh loufe.\nSidd_esu jood und saad ons Bescheid, wann dadd esu bliiv.", "pad.share": "Maach heh dat Pädd öffentlesch", @@ -83,7 +83,7 @@ "pad.share.emebdcode": "Donn en URL enboue", "pad.chat": "Klaaf", "pad.chat.title": "Maach dä Klaaf för heh dat Pädd op", - "pad.chat.loadmessages": "Mieh Nohreeschte lahde...", + "pad.chat.loadmessages": "Mih Nohreeschte lahde …", "timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle", "timeslider.toolbar.returnbutton": "Jangk retuur nohm Pädd", "timeslider.toolbar.authors": "De Schrihver:", @@ -118,7 +118,7 @@ "pad.userlist.approve": "Johdheiße", "pad.editbar.clearcolors": "Sulle mer de Färve för de Schriiver uss_em janze Täx fott maache?", "pad.impexp.importbutton": "Jäz empoteere", - "pad.impexp.importing": "Ben aam Empotteere …", + "pad.impexp.importing": "Ben aam Empottehre …", "pad.impexp.confirmimport": "En Dattei ze empotteere määt der janze Täx em Pädd fott. Wells De dat verfaftesch hann?", "pad.impexp.convertFailed": "Mer kunnte di Dattei nit empoteere. Nemm en ander Dattei-Fommaat udder donn dä Täx vun Hand kopeere un ennföhje.", "pad.impexp.padHasData": "Mer kunnte di Dattei nit empottehre weil et Pädd alt Veränderonge metjemaht hät. Donn se en e neu Pädd empottehre.", diff --git a/src/locales/nap.json b/src/locales/nap.json index 6cd1651b..22a5b262 100644 --- a/src/locales/nap.json +++ b/src/locales/nap.json @@ -6,7 +6,7 @@ ] }, "index.newPad": "Novo Pad", - "index.createOpenPad": "o crià o apre nu Pad cu 'o nomme:", + "index.createOpenPad": "o crià o arape nu Pad cu 'o nomme:", "pad.toolbar.bold.title": "Grassetto (Ctrl-B)", "pad.toolbar.italic.title": "Cursivo (Ctrl-I)", "pad.toolbar.underline.title": "Sottolineato (Ctrl-U)", diff --git a/src/locales/tr.json b/src/locales/tr.json index 80927b7f..2c948ef6 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -96,6 +96,9 @@ "timeslider.exportCurrent": "Mevcut sürümü şu olarak dışa aktar:", "timeslider.version": "{{version}} sürümü", "timeslider.saved": "{{day}} {{month}} {{year}} tarihinde kaydedildi", + "timeslider.playPause": "Bloknot İçeriğini Oynat / Durdur", + "timeslider.backRevision": "Bu bloknottaki bir revizyona geri git", + "timeslider.forwardRevision": "Bu bloknatta sonraki revizyona git", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", "timeslider.month.january": "Ocak", "timeslider.month.february": "Şubat", @@ -122,6 +125,7 @@ "pad.impexp.importing": "İçe aktarıyor...", "pad.impexp.confirmimport": "Bir dosya içe aktarılırken bloknotun mevcut metninin üzerine yazdırılır. Devam etmek istediğinizden emin misiniz?", "pad.impexp.convertFailed": "Bu dosyayı içe aktarmak mümkün değil. Lütfen farklı bir belge biçimi kullanın ya da elle kopyala yapıştır yapın", + "pad.impexp.padHasData": "Biz bu dosyayı içe aktaramadık çünkü bu Bloknot zaten değiştirilmiş, lütfen yeni bir bloknot içe aktarın.", "pad.impexp.uploadFailed": "Yükleme başarısız, lütfen tekrar deneyin", "pad.impexp.importfailed": "İçe aktarım başarısız oldu", "pad.impexp.copypaste": "Lütfen kopyala yapıştır yapın", From 5a5d245c06fda5398986f15659bb1ac9e858b3e2 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Jun 2015 17:13:46 +0100 Subject: [PATCH 45/74] fix issues with redrawing focus back to input element would lose param selected name --- src/static/js/pad.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 03eff4ba..e820b76f 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -115,9 +115,9 @@ var getParameters = [ { name: "showLineNumbers", checkVal: "false", callback: function(val) { settings.LineNumbersDisabled = true; } }, { name: "useMonospaceFont", checkVal: "true", callback: function(val) { settings.useMonospaceFontGlobal = true; } }, // If the username is set as a parameter we should set a global value that we can call once we have initiated the pad. - { name: "userName", checkVal: null, callback: function(val) { settings.globalUserName = decodeURIComponent(val); } }, + { name: "userName", checkVal: null, callback: function(val) { settings.globalUserName = decodeURIComponent(val); clientVars.userName = decodeURIComponent(val); } }, // If the userColor is set as a parameter, set a global value to use once we have initiated the pad. - { name: "userColor", checkVal: null, callback: function(val) { settings.globalUserColor = decodeURIComponent(val); } }, + { name: "userColor", checkVal: null, callback: function(val) { settings.globalUserColor = decodeURIComponent(val); clientVars.userColor = decodeURIComponent(val); } }, { name: "rtl", checkVal: "true", callback: function(val) { settings.rtlIsTrue = true } }, { name: "alwaysShowChat", checkVal: "true", callback: function(val) { chat.stickToScreen(); } }, { name: "chatAndUsers", checkVal: "true", callback: function(val) { chat.chatAndUsers(); } }, From 1353c093dbad9514c50ce81fcc806ad93d25ae03 Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Wed, 10 Jun 2015 18:05:24 -0300 Subject: [PATCH 46/74] Add new icon to fontawesome subset: comment --- src/static/font/config.json | 6 ++++++ src/static/font/fontawesome-etherpad.eot | Bin 18372 -> 18520 bytes src/static/font/fontawesome-etherpad.svg | 3 ++- src/static/font/fontawesome-etherpad.ttf | Bin 18156 -> 18304 bytes src/static/font/fontawesome-etherpad.woff | Bin 10724 -> 10792 bytes 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/static/font/config.json b/src/static/font/config.json index 34231cca..f9c2c3d6 100644 --- a/src/static/font/config.json +++ b/src/static/font/config.json @@ -66,6 +66,12 @@ "code": 59393, "src": "fontawesome" }, + { + "uid": "85528017f1e6053b2253785c31047f44", + "css": "comment", + "code": 59448, + "src": "fontawesome" + }, { "uid": "dcedf50ab1ede3283d7a6c70e2fe32f3", "css": "chat", diff --git a/src/static/font/fontawesome-etherpad.eot b/src/static/font/fontawesome-etherpad.eot index fb65168629fd9d9a4bc0e32665b1055db61af150..284149e2ba866f9df6568504b66556485c8ef225 100644 GIT binary patch delta 504 zcmX@o&v;`3BU^+A14D!RL^d;)=qetgi4LplLm3zt-T-k}a&BV51y9NC3=E7eKv_0!k*UFnLt-{5} z%*4XP%)`Pf!Y(4f&L5G&7|^mOrQ=x}V_f2r1eQcK4i-ipE=DE}7G{1{J~0j%8DTA> zNg{$Mf5KW#DFh0Tf}lI4^xAgto1m>|$chXf?UUHs3PkWMnj*{KV`Tqv__;=BpTiD$6X3m>8`#zp%W{$ibeRpPQSS LSF-t_H8T$Yb3lL( delta 354 zcmcaHf$>N`Bij*o28K6o6WPpIW|p12HPK;peGmgs1c<|ua}x_Lct~z%U|@6sVz1<~ z5(S_*5LkTy5?pBo>A4*fCPXqYSOdA-1?h>!1we)XP#&b8BR!`w&G%TG6axd(1O^6! z9T};KDJ;1!pE58QdjRFlGJpc?_nA)t`3*q6N=9x;#VO7>Ad|s(36OY_lb@WJBA)+; zfx)B$$S=uFtSDf(&BG7m1H~8=@)C1XzdMwlWneIsVPIg6Eyyn}kw36u8Uuqx4balu zf}+%dyV=aG3=D1{hgCB$GIvit!D!EDKAD5bk66JXOiS26su?Udr-Fn`8qvN_yh6(ghN WWG1Vk&1F{C8JQRuHiz0U^8f&$?qcr% diff --git a/src/static/font/fontawesome-etherpad.svg b/src/static/font/fontawesome-etherpad.svg index 4033c4d1..a64ba864 100644 --- a/src/static/font/fontawesome-etherpad.svg +++ b/src/static/font/fontawesome-etherpad.svg @@ -1,7 +1,7 @@ -Copyright (C) 2014 by original authors @ fontello.com +Copyright (C) 2015 by original authors @ fontello.com @@ -62,6 +62,7 @@ + \ No newline at end of file diff --git a/src/static/font/fontawesome-etherpad.ttf b/src/static/font/fontawesome-etherpad.ttf index f2fe398ec9f8fe56f220792e119b7014e8f54bf9..f596b4fe672170314fa63ac5331415ad8eae5971 100644 GIT binary patch delta 518 zcmXAlO=uHA6vyA2*=E;d%?1pjSftdtk%}M5X4f=oq991TC|JcJYL;Z1h}mRGLrklX z9BRzLVsyQDups21y{;faZyxMAk_c3%2Qe$nAUyfTu`j3eCnCaT-T^6oRu($?o<0Gvprugq)H& z=MayO?@*RXmHAm^?|#q< zlKUw5m0H2P{i5~+MgwD2)3$z}XuT)@41iy8YI6kT1h^SmD z;uFcdraSgsJpT;MBV#otRS6SPSqKv Uy~xxjl*B^KwykQz`<~|VeFfh6Ru~%|g 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 Date: Wed, 10 Jun 2015 17:18:15 +0200 Subject: [PATCH 47/74] if variable not declared, test if null throws error --- src/static/js/pad.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index e820b76f..6ee39b6b 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -467,7 +467,7 @@ var pad = { { var newHref = new RegExp(/.*\/p\/[^\/]+/).exec(document.location.pathname) || clientVars.padId; newHref = newHref[0]; - if (options != null){ + if (typeof options != "undefined" && options != null){ newHref = newHref + '?' + options; } From ef5e62e3a1160d66aeb13e714a9c59d79155c0a8 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Thu, 18 Jun 2015 13:25:28 +0200 Subject: [PATCH 48/74] Localisation updates from https://translatewiki.net. --- src/locales/es.json | 2 +- src/locales/eu.json | 15 ++++++++------- src/locales/lt.json | 30 +++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/locales/es.json b/src/locales/es.json index 98227182..9d4265b8 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -118,7 +118,7 @@ "timeslider.month.october": "octubre", "timeslider.month.november": "noviembre", "timeslider.month.december": "diciembre", - "timeslider.unnamedauthors": "{{num}} {[ plural(num) one: autor desconocido, other: autores desconocidos]}", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor desconocido, other: autores desconocidos]}", "pad.savedrevs.marked": "Revisión guardada", "pad.savedrevs.timeslider": "Puedes ver revisiones guardadas visitando la línea de tiempo", "pad.userlist.entername": "Escribe tu nombre", diff --git a/src/locales/eu.json b/src/locales/eu.json index e31d7d20..5a392013 100644 --- a/src/locales/eu.json +++ b/src/locales/eu.json @@ -3,7 +3,8 @@ "authors": [ "Theklan", "Subi", - "Xabier Armendaritz" + "Xabier Armendaritz", + "An13sa" ] }, "index.newPad": "Pad berria", @@ -11,14 +12,14 @@ "pad.toolbar.bold.title": "Lodia (Ctrl-B)", "pad.toolbar.italic.title": "Etzana (Ctrl-I)", "pad.toolbar.underline.title": "Azpimarratua (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Ezabatua", - "pad.toolbar.ol.title": "Zerrenda ordenatua", - "pad.toolbar.ul.title": "Zerrenda ez-ordenatua", - "pad.toolbar.indent.title": "Koska", - "pad.toolbar.unindent.title": "Koska kendu", + "pad.toolbar.strikethrough.title": "Ezabatua (Ctrl+5)", + "pad.toolbar.ol.title": "Zerrenda ordenatua (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Zerrenda ez-ordenatua (Ctrl+Shift+L)", + "pad.toolbar.indent.title": "Koska (TAB)", + "pad.toolbar.unindent.title": "Koska kendu (Shift+TAB)", "pad.toolbar.undo.title": "Desegin (Ctrl-Z)", "pad.toolbar.redo.title": "Berregin (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Ezabatu Egiletza Koloreak", + "pad.toolbar.clearAuthorship.title": "Ezabatu Egiletza Koloreak (Ctrl+Shift+C)", "pad.toolbar.import_export.title": "Inportatu/Esportatu fitxategi formatu ezberdinetara/ezberdinetatik", "pad.toolbar.timeslider.title": "Denbora lerroa", "pad.toolbar.savedRevision.title": "Gorde berrikuspena", diff --git a/src/locales/lt.json b/src/locales/lt.json index 7b4e1481..524146de 100644 --- a/src/locales/lt.json +++ b/src/locales/lt.json @@ -2,20 +2,40 @@ "@metadata": { "authors": [ "Eitvys200", - "Mantak111" + "Mantak111", + "I-svetaines" ] }, "pad.toolbar.bold.title": "Paryškintasis (Ctrl-B)", "pad.toolbar.italic.title": "Pasvirasis (Ctrl-I)", "pad.toolbar.underline.title": "Pabraukimas (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Perbrauktasis (Ctrl+5)", + "pad.toolbar.ol.title": "Numeruotas sąrašas (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Nenumeruotas Sąrašas (Ctrl+Shift+L)", + "pad.toolbar.indent.title": "Įtrauka", "pad.toolbar.undo.title": "Anuliuoti (Ctrl-Z)", "pad.toolbar.redo.title": "Perdaryti (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Tvarkyti autorystės spalvas", + "pad.toolbar.import_export.title": "Importuoti/Eksportuoti iš/į įvairius failų formatus", + "pad.toolbar.timeslider.title": "Laiko slankiklis", + "pad.toolbar.savedRevision.title": "Išsaugoti peržiūrą", "pad.toolbar.settings.title": "Nustatymai", + "pad.toolbar.embed.title": "Dalintis ir įterpti šį bloknotą", + "pad.toolbar.showusers.title": "Rodyti naudotojus šiame bloknote", "pad.colorpicker.save": "Išsaugoti", "pad.colorpicker.cancel": "Atšaukti", "pad.loading": "Įkraunama...", + "pad.noCookie": "Slapuko nepavyko rasti. Prašome leisti slapukus interneto naršyklėje!", + "pad.passwordRequired": "Jums reikia slaptažodžio kad galėtumėte matyti šį bloknotą", + "pad.permissionDenied": "Jūs neturite leidimo patekti į šį bloknotą", + "pad.wrongPassword": "Jūsų slaptažodis neteisingas", + "pad.settings.padSettings": "Bloknoto nustatymai", "pad.settings.myView": "Mano Vaizdas", + "pad.settings.stickychat": "Pokalbiai visada viršuje", + "pad.settings.chatandusers": "Rodyti Pokalbius ir Vartotojus", + "pad.settings.colorcheck": "Autorystės spalvos", + "pad.settings.linenocheck": "Eilučių numeriai", + "pad.settings.rtlcheck": "Skaityti turinį iš dešinės į kairę?", "pad.settings.fontType": "Šrifto tipas:", "pad.settings.fontType.normal": "Normalus", "pad.settings.globalView": "Bendras Vaizdas", @@ -23,13 +43,21 @@ "pad.importExport.import_export": "Importuoti/Eksportuoti", "pad.importExport.import": "Įkelkite bet kokį tekstinį failą arba dokumentą", "pad.importExport.importSuccessful": "Pavyko!", + "pad.importExport.export": "Eksportuoti dabartinį bloknotą kaip:", + "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Paprastasis tekstas", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Atvirasis dokumento formatas)", "pad.modals.connected": "Prisijungta.", + "pad.modals.reconnecting": "Iš naujo prisijungiama prie Jūsų bloknoto", + "pad.modals.forcereconnect": "Priversti prisijungti iš naujo", + "pad.modals.userdup": "Atidaryta kitame lange", + "pad.modals.userdup.explanation": "Šis bloknotas, atrodo yra atidarytas daugiau nei viename šio kompiuterio naršyklės lange.", "pad.modals.unauth": "Neleidžiama", + "pad.modals.unauth.explanation": "Jūsų teiisės pasikeitė kol žiūrėjote šį puslapį. Bandykite prisijungti iš naujo.", + "pad.modals.looping.explanation": "Yra komunikacijos problemų su sinchronizacijos serveriu.", "pad.modals.initsocketfail": "Serveris yra nepasiekiamas.", "pad.modals.slowcommit.explanation": "Serveris neatsako.", "pad.modals.deleted": "Ištrintas.", From 0713553906bee57c289d13f61b192da4eceac143 Mon Sep 17 00:00:00 2001 From: Xavid Date: Fri, 19 Jun 2015 14:02:18 -0400 Subject: [PATCH 49/74] Allow a pad to only end with a single newline, rather than requiring two. --- src/node/handler/PadMessageHandler.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 9a0d1ee7..0172400b 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -773,8 +773,9 @@ function handleUserChanges(data, cb) } // Make sure the pad always ends with an empty line. - if (pad.text().lastIndexOf("\n\n") != pad.text().length-2) { - var nlChangeset = Changeset.makeSplice(pad.text(), pad.text().length-1, 0, "\n"); + if (pad.text().lastIndexOf("\n") != pad.text().length-1) { + var nlChangeset = Changeset.makeSplice(pad.text(), pad.text().length-1, + 0, "\n"); pad.appendRevision(nlChangeset); } From 778e1e4641b54f581b96202ffef244079fade194 Mon Sep 17 00:00:00 2001 From: Xavid Date: Fri, 19 Jun 2015 14:03:22 -0400 Subject: [PATCH 50/74] Allow a return keypress in a list on the last line of a pad to create a new line. --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 57907820..10dd0e4c 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3384,7 +3384,7 @@ function Ace2Inner(){ renumberList(lineNum + 1);//trigger renumbering of list that may be right after } } - else if (lineNum + 1 < rep.lines.length()) + else if (lineNum + 1 <= rep.lines.length()) { performDocumentReplaceSelection('\n'); setLineListType(lineNum + 1, type+level); From a4fe0d0dc8a80662606af17461793205d128ad22 Mon Sep 17 00:00:00 2001 From: Xavid Date: Sun, 21 Jun 2015 11:29:17 -0400 Subject: [PATCH 51/74] Add an 'author' entry to the context for the padCreate and padUpdate hooks. --- src/node/db/Pad.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index e70628b7..8978d253 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -105,9 +105,9 @@ Pad.prototype.appendRevision = function appendRevision(aChangeset, author) { authorManager.addPad(author, this.id); if (this.head == 0) { - hooks.callAll("padCreate", {'pad':this}); + hooks.callAll("padCreate", {'pad':this, 'author': author}); } else { - hooks.callAll("padUpdate", {'pad':this}); + hooks.callAll("padUpdate", {'pad':this, 'author': author}); } }; From bc78e0c68d2e662a02eb8bc1ee7ba13334c435ea Mon Sep 17 00:00:00 2001 From: Xavid Date: Sun, 21 Jun 2015 11:34:59 -0400 Subject: [PATCH 52/74] Update documentation for the updatePad and createPad hooks to include 'author' in the context. --- doc/api/hooks_server-side.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/api/hooks_server-side.md b/doc/api/hooks_server-side.md index a4505e93..79879b2f 100644 --- a/doc/api/hooks_server-side.md +++ b/doc/api/hooks_server-side.md @@ -110,6 +110,7 @@ Called from: src/node/db/Pad.js Things in context: 1. pad - the pad instance +2. author - the id of the author who created the pad This hook gets called when a new pad was created. @@ -128,6 +129,7 @@ Called from: src/node/db/Pad.js Things in context: 1. pad - the pad instance +2. author - the id of the author who updated the pad This hook gets called when an existing pad was updated. From 13fa863f4b7c5b762cb9f6b74369a9ec8ab2e2e6 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 22 Jun 2015 11:52:20 +0200 Subject: [PATCH 53/74] Localisation updates from https://translatewiki.net. --- src/locales/ast.json | 3 +++ src/locales/dty.json | 5 +++-- src/locales/ne.json | 5 +++-- src/locales/ps.json | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/locales/ast.json b/src/locales/ast.json index 47c1ccc3..e39bf6ef 100644 --- a/src/locales/ast.json +++ b/src/locales/ast.json @@ -92,6 +92,9 @@ "timeslider.exportCurrent": "Esportar la versión actual como:", "timeslider.version": "Versión {{version}}", "timeslider.saved": "Guardáu el {{day}} de {{month}} de {{year}}", + "timeslider.playPause": "Reproducir/posar el conteníu del bloc", + "timeslider.backRevision": "Dir a la revisión anterior d'esti bloc", + "timeslider.forwardRevision": "Dir a la revisión siguiente d'esti bloc", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "de xineru", "timeslider.month.february": "de febreru", diff --git a/src/locales/dty.json b/src/locales/dty.json index 997ca1b6..242b96c2 100644 --- a/src/locales/dty.json +++ b/src/locales/dty.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "रमेश सिंह बोहरा" + "रमेश सिंह बोहरा", + "राम प्रसाद जोशी" ] }, "index.newPad": "नयाँ प्याड", @@ -22,7 +23,7 @@ "pad.toolbar.settings.title": "सेटिङ्गहरू", "pad.toolbar.embed.title": "यै प्याडलाई बाड्न्या यात इम्बेड गद्य्या", "pad.toolbar.showusers.title": "यै प्याडमि रयाका प्रयोगकर्ता देखाउन्या", - "pad.colorpicker.save": "संग्रह गद्य्या", + "pad.colorpicker.save": "सङ्ग्रह गद्या", "pad.colorpicker.cancel": "खारेजी", "pad.loading": "लोड हुन्नाछ....", "pad.passwordRequired": "यो प्यड खोल्लाकी पासवर्ड चाहिन्छ", diff --git a/src/locales/ne.json b/src/locales/ne.json index f4da20e6..1179c93b 100644 --- a/src/locales/ne.json +++ b/src/locales/ne.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "सरोज कुमार ढकाल", - "Nirjal stha" + "Nirjal stha", + "राम प्रसाद जोशी" ] }, "index.newPad": "नयाँ प्याड", @@ -23,7 +24,7 @@ "pad.toolbar.settings.title": "सेटिङ्गहरू", "pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने", "pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने", - "pad.colorpicker.save": "संग्रह गर्ने", + "pad.colorpicker.save": "सङ्ग्रह गर्ने", "pad.colorpicker.cancel": "रद्द", "pad.loading": "लोड हुदैछ...", "pad.passwordRequired": "यो प्यड खोल्न पासवर्ड चाहिन्छ", diff --git a/src/locales/ps.json b/src/locales/ps.json index 1a877128..8db3a89e 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -19,7 +19,7 @@ "pad.toolbar.settings.title": "امستنې", "pad.colorpicker.save": "خوندي کول", "pad.colorpicker.cancel": "ناگارل", - "pad.loading": "برسېرېدنې کې دی...", + "pad.loading": "رابرسېرېږي...", "pad.passwordRequired": "دې ليکچې ته د لاسرسي لپاره تاسې يو پټنوم ته اړتيا لرۍ", "pad.wrongPassword": "پټنوم مو سم نه و", "pad.settings.padSettings": "د ليکچې امستنې", From 376fccfe92db84625edbf4807592c50805cf82f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Kir=C3=A1ly?= Date: Mon, 22 Jun 2015 16:11:29 +0200 Subject: [PATCH 54/74] bugfix for correct bash syntax $rocks has to be enclosed into a "string" so bash can treat is as a string. We can compare two strings with the == operator then, ... --- bin/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/run.sh b/bin/run.sh index f2162310..4d276632 100755 --- a/bin/run.sh +++ b/bin/run.sh @@ -21,7 +21,7 @@ if [ "$(id -u)" -eq 0 ] && [ $ignoreRoot -eq 0 ]; then echo "You shouldn't start Etherpad as root!" echo "Please type 'Etherpad rocks my socks' or supply the '--root' argument if you still want to start it as root" read rocks - if [ ! $rocks = "Etherpad rocks my socks" ] + if [ ! "$rocks" == "Etherpad rocks my socks" ] then echo "Your input was incorrect" exit 1 From 04d5e253050dc8bf328400a5689ed780c40d49f4 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 23 Jun 2015 23:03:56 +0100 Subject: [PATCH 55/74] Update settings.json.template --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index 310e0791..6a344cb1 100644 --- a/settings.json.template +++ b/settings.json.template @@ -24,7 +24,7 @@ "ssl" : { "key" : "/path-to-your/epl-server.key", - "cert" : "/path-to-your/epl-server.crt" + "cert" : "/path-to-your/epl-server.crt", "ca": ["/path-to-your/epl-intermediate-cert1.crt", "/path-to-your/epl-intermediate-cert2.crt"] }, From 6ed85b87875446bf81ccc7a69db9d7994ee3fdbc Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Wed, 24 Jun 2015 14:32:10 -0300 Subject: [PATCH 56/74] Fixing @font-face src path to be able to use font icons on plugins when minify is on. This is a commit similar to 56ce8e8, which did the same for 'opendyslexic'. --- src/static/css/pad.css | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 49a54fb0..a7adf261 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -189,7 +189,7 @@ a img { left:0px; right:250px; } - + .toolbar ul.menu_right { right:0px; } @@ -1029,7 +1029,7 @@ input[type=checkbox] { left:0px; right:100px; } - + .toolbar ul.menu_right { right:0px; } @@ -1091,7 +1091,7 @@ input[type=checkbox] { background: none !important } li[data-key="showusers"] > a { - + margin-top:-10px; padding-top:2px !important; line-height:20px; @@ -1248,11 +1248,11 @@ input[type=checkbox] { @font-face { font-family: "fontawesome-etherpad"; - src:url("../font/fontawesome-etherpad.eot"); - src:url("../font/fontawesome-etherpad.eot?#iefix") format("embedded-opentype"), - url("../font/fontawesome-etherpad.woff") format("woff"), - url("../font/fontawesome-etherpad.ttf") format("truetype"), - url("../font/fontawesome-etherpad.svg#fontawesome-etherpad") format("svg"); + src:url("../../static/font/fontawesome-etherpad.eot"); + src:url("../../static/font/fontawesome-etherpad.eot?#iefix") format("embedded-opentype"), + url("../../static/font/fontawesome-etherpad.woff") format("woff"), + url("../../static/font/fontawesome-etherpad.ttf") format("truetype"), + url("../../static/font/fontawesome-etherpad.svg#fontawesome-etherpad") format("svg"); font-weight: normal; font-style: normal; From 10605956760d0a83766ff8ecab2d64c452c7205a Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Thu, 21 May 2015 08:46:54 -0700 Subject: [PATCH 57/74] Check for valid session in handleUserInfoUpdate Address issue 2674 by checking that the session is valid and has a valid author and padId before using it to update the userInfo for that session. Otherwise it is possible that by the time we try to update a session with new userInfo that session has disconnected and is no longer available to be updated. Without this commit the etherpad-lite service gracefully shutsdown whenever this happens. --- src/node/handler/PadMessageHandler.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 0172400b..248dc128 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -544,14 +544,22 @@ function handleUserInfoUpdate(client, message) return; } + // Check that we have a valid session and author to update. + var session = sessioninfos[client.id]; + if(!session || !session.author || !session.padId) + { + messageLogger.warn("Dropped message, USERINFO_UPDATE Session not ready." + message.data); + return; + } + //Find out the author name of this session - var author = sessioninfos[client.id].author; + var author = session.author; //Tell the authorManager about the new attributes authorManager.setAuthorColorId(author, message.data.userInfo.colorId); authorManager.setAuthorName(author, message.data.userInfo.name); - var padId = sessioninfos[client.id].padId; + var padId = session.padId; var infoMsg = { type: "COLLABROOM", From 90575064a9367141d570e641933abee0678d1600 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 28 Jun 2015 17:14:37 +0100 Subject: [PATCH 58/74] aria-labels for everything --- src/static/js/html10n.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index e2540f66..eecbaa0a 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -862,6 +862,9 @@ window.html10n = (function(window, document, undefined) { // Apply translation if (node.children.length === 0 || prop != 'textContent') { node[prop] = str.str + node.setAttribute("aria-label", str.str); // Sets the aria-label + // The idea of the above is that we always have an aria value + // This might be a bit of an abrupt solution but let's see how it goes } else { var children = node.childNodes, found = false From 4252ef26f61017b0acfed6b981b37bac1c892006 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 29 Jun 2015 10:23:30 +0100 Subject: [PATCH 59/74] remove console logs --- tests/backend/specs/api/pad.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/backend/specs/api/pad.js b/tests/backend/specs/api/pad.js index a2e8cdb3..cbfcfe30 100644 --- a/tests/backend/specs/api/pad.js +++ b/tests/backend/specs/api/pad.js @@ -464,7 +464,6 @@ describe('setHTML', function(){ var html = "
    Hello HTML
    "; api.get(endPoint('setHTML')+"&padID="+testPadId+"&html="+html) .expect(function(res){ -console.log(res.body.code); if(res.body.code !== 1) throw new Error("Allowing crappy HTML to be imported") }) .expect('Content-Type', /json/) From d803ac128ecae61402d98bdf14f547c5fd52a1c4 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 29 Jun 2015 11:00:00 +0100 Subject: [PATCH 60/74] use settings for backend tests --- tests/backend/loadSettings.js | 17 +++++++++++++++++ tests/backend/specs/api/chat.js | 3 ++- tests/backend/specs/api/pad.js | 3 ++- tests/backend/specs/api/sessionsAndGroups.js | 3 ++- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 tests/backend/loadSettings.js diff --git a/tests/backend/loadSettings.js b/tests/backend/loadSettings.js new file mode 100644 index 00000000..f208fe3d --- /dev/null +++ b/tests/backend/loadSettings.js @@ -0,0 +1,17 @@ +var jsonminify = require(__dirname+"/../../src/node_modules/jsonminify"); + +function loadSettings(){ + var settingsStr = fs.readFileSync(__dirname+"/../../settings.json").toString(); + // try to parse the settings + var settings; + try { + if(settingsStr) { + settingsStr = jsonminify(settingsStr).replace(",]","]").replace(",}","}"); + return JSON.parse(settingsStr); + } + }catch(e){ + console.error("whoops something is bad with settings"); + } +} + +exports.loadSettings = loadSettings; diff --git a/tests/backend/specs/api/chat.js b/tests/backend/specs/api/chat.js index 59b7edc0..2bcd9783 100644 --- a/tests/backend/specs/api/chat.js +++ b/tests/backend/specs/api/chat.js @@ -1,7 +1,8 @@ var assert = require('assert') supertest = require(__dirname+'/../../../../src/node_modules/supertest'), fs = require('fs'), - api = supertest('http://localhost:9001'); + settings = require(__dirname+'/../../loadSettings').loadSettings(), + api = supertest('http://'+settings.ip+":"+settings.port), path = require('path'); var filePath = path.join(__dirname, '../../../../APIKEY.txt'); diff --git a/tests/backend/specs/api/pad.js b/tests/backend/specs/api/pad.js index cbfcfe30..1b6e883a 100644 --- a/tests/backend/specs/api/pad.js +++ b/tests/backend/specs/api/pad.js @@ -1,7 +1,8 @@ var assert = require('assert') supertest = require(__dirname+'/../../../../src/node_modules/supertest'), fs = require('fs'), - api = supertest('http://localhost:9001'); + settings = require(__dirname+'/../../loadSettings').loadSettings(), + api = supertest('http://'+settings.ip+":"+settings.port), path = require('path'), async = require(__dirname+'/../../../../src/node_modules/async'); diff --git a/tests/backend/specs/api/sessionsAndGroups.js b/tests/backend/specs/api/sessionsAndGroups.js index 4742852f..4089656a 100644 --- a/tests/backend/specs/api/sessionsAndGroups.js +++ b/tests/backend/specs/api/sessionsAndGroups.js @@ -1,7 +1,8 @@ var assert = require('assert') supertest = require(__dirname+'/../../../../src/node_modules/supertest'), fs = require('fs'), - api = supertest('http://localhost:9001'); + settings = require(__dirname+'/../../loadSettings').loadSettings(), + api = supertest('http://'+settings.ip+":"+settings.port), path = require('path'); var filePath = path.join(__dirname, '../../../../APIKEY.txt'); From ad137fa4c876f9d7dc2d8113d8bcef9b9425ce0c Mon Sep 17 00:00:00 2001 From: Xavid Date: Tue, 30 Jun 2015 04:47:55 -0400 Subject: [PATCH 61/74] Restore newline-adding to setText() if passed string does not end in '\n'. Add a test for the ending-in-'\n' case and update tests for the other case. --- src/node/db/Pad.js | 9 ++++++++- tests/backend/specs/api/pad.js | 31 +++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index 8978d253..eb6a3ed1 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -290,7 +290,14 @@ Pad.prototype.setText = function setText(newText) { var oldText = this.text(); //create the changeset - var changeset = Changeset.makeSplice(oldText, 0, oldText.length, newText); + // We want to ensure the pad still ends with a \n, but otherwise keep + // getText() and setText() consistent. + var changeset; + if (newText[newText.length - 1] == '\n') { + changeset = Changeset.makeSplice(oldText, 0, oldText.length, newText); + } else { + changeset = Changeset.makeSplice(oldText, 0, oldText.length-1, newText); + } //append the changeset this.appendRevision(changeset); diff --git a/tests/backend/specs/api/pad.js b/tests/backend/specs/api/pad.js index 1b6e883a..14e99091 100644 --- a/tests/backend/specs/api/pad.js +++ b/tests/backend/specs/api/pad.js @@ -211,7 +211,7 @@ describe('getText', function(){ it('gets the Pad text', function(done) { api.get(endPoint('getText')+"&padID="+testPadId) .expect(function(res){ - if(res.body.data.text !== "testTextTwo") throw new Error("Setting Text") + if(res.body.data.text !== "testTextTwo\n") throw new Error("Setting Text") }) .expect('Content-Type', /json/) .expect(200, done) @@ -387,7 +387,30 @@ describe('getText', function(){ api.get(endPoint('getText')+"&padID="+testPadId) .expect(function(res){ if(res.body.code !== 0) throw new Error("Pad Get Text failed") - if(res.body.data.text !== text) throw new Error("Pad Text not set properly"); + if(res.body.data.text !== text+"\n") throw new Error("Pad Text not set properly"); + }) + .expect('Content-Type', /json/) + .expect(200, done) + }); +}) + +describe('setText', function(){ + it('Sets text on a pad Id including an explicit newline', function(done) { + api.get(endPoint('setText')+"&padID="+testPadId+"&text="+text+'%0A') + .expect(function(res){ + if(res.body.code !== 0) throw new Error("Pad Set Text failed") + }) + .expect('Content-Type', /json/) + .expect(200, done) + }); +}) + +describe('getText', function(){ + it("Gets text on a pad Id and doesn't have an excess newline", function(done) { + api.get(endPoint('getText')+"&padID="+testPadId) + .expect(function(res){ + if(res.body.code !== 0) throw new Error("Pad Get Text failed") + if(res.body.data.text !== text+"\n") throw new Error("Pad Text not set properly"); }) .expect('Content-Type', /json/) .expect(200, done) @@ -420,7 +443,7 @@ describe('getText', function(){ it('Gets text on a pad Id', function(done) { api.get(endPoint('getText')+"&padID="+newPadId) .expect(function(res){ - if(res.body.data.text !== text) throw new Error("Pad Get Text failed") + if(res.body.data.text !== text+"\n") throw new Error("Pad Get Text failed") }) .expect('Content-Type', /json/) .expect(200, done) @@ -442,7 +465,7 @@ describe('getText', function(){ it('Gets text on a pad Id', function(done) { api.get(endPoint('getText')+"&padID="+testPadId) .expect(function(res){ - if(res.body.data.text !== text) throw new Error("Pad Get Text failed") + if(res.body.data.text !== text+"\n") throw new Error("Pad Get Text failed") }) .expect('Content-Type', /json/) .expect(200, done) From c0f5b92e3d771822ed2eb89563e2dac0ccffded5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerhard=20Gro=C3=9Fmann?= Date: Wed, 1 Jul 2015 10:42:33 +0200 Subject: [PATCH 62/74] Added CSS fallback fonts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I’m not sure if this is the correct and only place where to change this. I just gave the present fonts some fallbacks (when possible) but didn’t add, remove or merge fonts. --- src/static/js/pad_editor.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/static/js/pad_editor.js b/src/static/js/pad_editor.js index 2514cd12..dd1f798e 100644 --- a/src/static/js/pad_editor.js +++ b/src/static/js/pad_editor.js @@ -160,23 +160,23 @@ var padeditor = (function() font = font.replace("use",""); font = font.replace("Font",""); font = font.toLowerCase(); - if(font === "monospace") self.ace.setProperty("textface", "Courier new"); + if(font === "monospace") self.ace.setProperty("textface", "monospace"); if(font === "opendyslexic") self.ace.setProperty("textface", "OpenDyslexic"); - if(font === "comicsans") self.ace.setProperty("textface", "Comic Sans MS"); - if(font === "georgia") self.ace.setProperty("textface", "Georgia"); - if(font === "impact") self.ace.setProperty("textface", "Impact"); - if(font === "lucida") self.ace.setProperty("textface", "Lucida"); - if(font === "lucidasans") self.ace.setProperty("textface", "Lucida Sans Unicode"); - if(font === "palatino") self.ace.setProperty("textface", "Palatino Linotype"); - if(font === "tahoma") self.ace.setProperty("textface", "Tahoma"); - if(font === "timesnewroman") self.ace.setProperty("textface", "Times New Roman"); - if(font === "trebuchet") self.ace.setProperty("textface", "Trebuchet MS"); - if(font === "verdana") self.ace.setProperty("textface", "Verdana"); + if(font === "comicsans") self.ace.setProperty("textface", "'Comic Sans MS','Comic Sans',cursive"); + if(font === "georgia") self.ace.setProperty("textface", "Georgia,'Bitstream Charter',serif"); + if(font === "impact") self.ace.setProperty("textface", "Impact,Haettenschweiler,'Arial Black',sans-serif"); + if(font === "lucida") self.ace.setProperty("textface", "Lucida,'Lucida Serif','Lucida Bright',serif"); + if(font === "lucidasans") self.ace.setProperty("textface", "'Lucida Sans','Lucida Grande','Lucida Sans Unicode','Luxi Sans',sans-serif"); + if(font === "palatino") self.ace.setProperty("textface", "Palatino,'Palatino Linotype','URW Palladio L',Georgia,serif"); + if(font === "tahoma") self.ace.setProperty("textface", "Tahoma,sans-serif"); + if(font === "timesnewroman") self.ace.setProperty("textface", "'Times New Roman',Times,serif"); + if(font === "trebuchet") self.ace.setProperty("textface", "'Trebuchet MS',sans-serif"); + if(font === "verdana") self.ace.setProperty("textface", "Verdana,'DejaVu Sans',sans-serif"); if(font === "symbol") self.ace.setProperty("textface", "Symbol"); if(font === "webdings") self.ace.setProperty("textface", "Webdings"); if(font === "wingdings") self.ace.setProperty("textface", "Wingdings"); - if(font === "sansserif") self.ace.setProperty("textface", "MS Sans Serif"); - if(font === "serif") self.ace.setProperty("textface", "MS Serif"); + if(font === "sansserif") self.ace.setProperty("textface", "sans-serif"); + if(font === "serif") self.ace.setProperty("textface", "serif"); // $("#viewfontmenu").val(font); normalFont = false; From 7c0f3a6826c0b865f63e180e60eb03e2ab032071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerhard=20Gro=C3=9Fmann?= Date: Wed, 1 Jul 2015 12:13:37 +0200 Subject: [PATCH 63/74] Added Helvetica Neue to the Normal font --- src/static/js/pad_editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad_editor.js b/src/static/js/pad_editor.js index dd1f798e..6616ebe8 100644 --- a/src/static/js/pad_editor.js +++ b/src/static/js/pad_editor.js @@ -185,7 +185,7 @@ var padeditor = (function() // No font has been previously selected so use the Normal font if(normalFont){ - self.ace.setProperty("textface", "Arial, sans-serif"); + self.ace.setProperty("textface", "'Helvetica Neue',Arial, sans-serif"); // $("#viewfontmenu").val("normal"); } From b5686adf928d788279a2be7f6842dec5662368e1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 1 Jul 2015 20:23:31 +0100 Subject: [PATCH 64/74] fix font test --- tests/frontend/specs/font_type.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/frontend/specs/font_type.js b/tests/frontend/specs/font_type.js index e5c65f2e..d2c7bc63 100644 --- a/tests/frontend/specs/font_type.js +++ b/tests/frontend/specs/font_type.js @@ -24,7 +24,7 @@ describe("font select", function(){ //check if font changed to monospace var fontFamily = inner$("body").css("font-family").toLowerCase(); - var containsStr = fontFamily.indexOf("courier new"); + var containsStr = fontFamily.indexOf("monospace"); expect(containsStr).to.not.be(-1); done(); From 9ccaeb585ba5eee1c43a56ca1b042da528298a1b Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Thu, 2 Jul 2015 13:03:45 -0700 Subject: [PATCH 65/74] Fixing toolbar on top of the page for mobile devices --- src/static/css/pad.css | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index a7adf261..d3a3b488 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -1059,10 +1059,11 @@ input[type=checkbox] { #editorcontainer { margin-bottom: 33px } - .toolbar ul.menu_left { - right:0px; + /* cancel non-mobile border (will be defined on ".toolbar ul.menu_left" bellow) */ + .toolbar { + border-bottom: 0; } - .toolbar ul.menu_right { + .toolbar ul { background: #f7f7f7; background: -webkit-linear-gradient(#f7f7f7, #f1f1f1 80%); background: -moz-linear-gradient(#f7f7f7, #f1f1f1 80%); @@ -1070,8 +1071,18 @@ input[type=checkbox] { background: -ms-linear-gradient(#f7f7f7, #f1f1f1 80%); background: linear-gradient(#f7f7f7, #f1f1f1 80%); width: 100%; - right:0px !important; overflow: hidden; + } + .toolbar ul.menu_left { + right:0px; + position: fixed; + top: 0; + padding-top: 4px; + border-bottom: 1px solid #ccc; + z-index: 10; + } + .toolbar ul.menu_right { + right:0px !important; height: 32px; position: fixed; bottom: 0; From 47c4ca9c29ad3f6e723563253abac2ce1b71d863 Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Fri, 3 Jul 2015 18:38:46 -0300 Subject: [PATCH 66/74] Fixing chat on bottom of the page for mobile devices --- src/static/css/pad.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index d3a3b488..d21e84dd 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -1109,7 +1109,7 @@ input[type=checkbox] { vertical-align:top !important; } #chaticon { - position:absolute; + position:fixed; right:48px; } .popup { @@ -1138,7 +1138,7 @@ input[type=checkbox] { line-height: 24px } #chatbox{ - position:absolute; + position:fixed; bottom:33px !important; margin: 65px 0 0 0; } From 8a0a1a65b1e9594e5e3bee2a73c7690c0589a008 Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Tue, 7 Jul 2015 15:20:18 -0300 Subject: [PATCH 67/74] Adding missing code to make toolbar be fixed on top/bottom of the screen for iOS devices. This commit complements 9ccaeb5. --- src/static/css/pad.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index d21e84dd..1e43ab96 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -216,6 +216,10 @@ li[data-key=showusers] > a #online_count { right: 0px; bottom: 0px; z-index: 1; + + /* Required to fix toolbar on top/bottom of the screen on iOS: */ + overflow: scroll; + -webkit-overflow-scrolling: touch; } #editorcontainer iframe { height: 100%; From 67f4ad5887a6a7b6c8b5645331298accb30297cb Mon Sep 17 00:00:00 2001 From: Luiza Pagliari Date: Tue, 7 Jul 2015 16:55:19 -0300 Subject: [PATCH 68/74] Fix editbar height for read-only pads --- src/static/js/pad_editbar.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index e418969e..48fcaab4 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -185,9 +185,31 @@ var padeditbar = (function() this.commands[cmd] = callback; return this; }, + calculateEditbarHeight: function() { + // if we're on timeslider, there is nothing on editbar, so we just use zero + var onTimeslider = $('.menu_left').length === 0; + if (onTimeslider) return 0; + + // if editbar has both menu left and right, its height must be + // the max between the height of these two parts + var leftMenuPosition = $('.menu_left').offset().top; + var rightMenuPosition = $('.menu_right').offset().top; + var editbarHasMenuLeftAndRight = (leftMenuPosition === rightMenuPosition); + + var height; + if (editbarHasMenuLeftAndRight) { + height = Math.max($('.menu_left').height(), $('.menu_right').height()); + } + else { + height = $('.menu_left').height(); + } + + return height; + }, redrawHeight: function(){ - var editbarHeight = $('.menu_left').height() + 1 + "px"; - var containerTop = $('.menu_left').height() + 6 + "px"; + var minimunEditbarHeight = self.calculateEditbarHeight(); + var editbarHeight = minimunEditbarHeight + 1 + "px"; + var containerTop = minimunEditbarHeight + 6 + "px"; $('#editbar').css("height", editbarHeight); $('#editorcontainer').css("top", containerTop); From 20039682638214756e296ed3a3dd1b71ba05be82 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Wed, 8 Jul 2015 08:18:32 +0200 Subject: [PATCH 69/74] Localisation updates from https://translatewiki.net. --- src/locales/ar.json | 5 ++++- src/locales/br.json | 1 + src/locales/fa.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/locales/ar.json b/src/locales/ar.json index 9d29b521..153faae8 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -5,7 +5,8 @@ "Tux-tn", "Alami", "Meno25", - "Test Create account" + "Test Create account", + "محمد أحمد عبد الفتاح" ] }, "index.newPad": "باد جديد", @@ -37,6 +38,7 @@ "pad.settings.padSettings": "إعدادات الباد", "pad.settings.myView": "رؤيتي", "pad.settings.stickychat": "الدردشة دائما على الشاشة", + "pad.settings.chatandusers": "أظهر الدردشة والمستخدمين", "pad.settings.colorcheck": "ألوان التأليف", "pad.settings.linenocheck": "أرقام الأسطر", "pad.settings.rtlcheck": "قراءة المحتويات من اليمين إلى اليسار؟", @@ -110,6 +112,7 @@ "timeslider.month.december": "ديسمبر", "timeslider.unnamedauthors": "بدون اسم {{num}} {[plural(num) واحد: كاتب، آخر: مؤلف]}", "pad.savedrevs.marked": "هذا التنقيح محدد الآن كمراجعة محفوظة", + "pad.savedrevs.timeslider": "يمكنك عرض المراجعات المحفوظة بزيارة متصفح التاريخ", "pad.userlist.entername": "أدخل اسمك", "pad.userlist.unnamed": "غير مسمى", "pad.userlist.guest": "ضيف", diff --git a/src/locales/br.json b/src/locales/br.json index 310c97a6..93879844 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -95,6 +95,7 @@ "timeslider.exportCurrent": "Ezporzhiañ an doare bremañ evel :", "timeslider.version": "Stumm {{version}}", "timeslider.saved": "Enrollañ {{day}} {{month}} {{year}}", + "timeslider.playPause": "Lenn / Ehan endalc'hoù ar pad", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Genver", "timeslider.month.february": "C'hwevrer", diff --git a/src/locales/fa.json b/src/locales/fa.json index 0bdb4c56..e1e88418 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -74,7 +74,7 @@ "pad.modals.initsocketfail.cause": "شاید این به خاطر مشکلی در مرورگر یا اتصال اینترنتی شما باشد.", "pad.modals.slowcommit.explanation": "سرور پاسخ نمی‌دهد.", "pad.modals.slowcommit.cause": "این می‌تواند به خاطر مشکلاتی در اتصال به شبکه باشد.", - "pad.modals.badChangeset.explanation": "ویرایشی که شما انجام داده‌اید توسط سرور همگام‌سازی نادرست طیقه‌بندی شده‌است.", + "pad.modals.badChangeset.explanation": "ویرایشی که شما انجام داده‌اید توسط سرور همگام‌سازی نادرست طیقه‌بندی شده است.", "pad.modals.badChangeset.cause": "این می‌تواند به دلیل پیکربندی اشتباه یا سایر رفتارهای غیرمنتظره باشد. اگر فکر می‌کنید این یک خطا است لطفاً با مدیر خدمت تماس بگیرید. برای ادامهٔ ویرایش سعی کنید که دوباره متصل شوید.", "pad.modals.corruptPad.explanation": "پدی که شما سعی دارید دسترسی پیدا کنید خراب است.", "pad.modals.corruptPad.cause": "این احتمالاً به دلیل تنظیمات اشتباه کارساز یا سایر رفتارهای غیرمنتظره است. لطفاً با مدیر خدمت تماس حاصل کنید.", From a31e6cd332f1a9f059fc4a98a49b42f564b35df8 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Tue, 14 Jul 2015 16:22:35 +0200 Subject: [PATCH 70/74] Localisation updates from https://translatewiki.net. --- src/locales/br.json | 4 +++- src/locales/ia.json | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/locales/br.json b/src/locales/br.json index 93879844..6a60fa3a 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -22,7 +22,7 @@ "pad.toolbar.clearAuthorship.title": "Diverkañ al livioù oc'h anaout an aozerien (Ktrl+Pennlizherenn+C)", "pad.toolbar.import_export.title": "Enporzhiañ/Ezporzhiañ eus/war-zu ur furmad restr disheñvel", "pad.toolbar.timeslider.title": "Istor dinamek", - "pad.toolbar.savedRevision.title": "Doareoù enrollet", + "pad.toolbar.savedRevision.title": "Enrollañ an adweladenn", "pad.toolbar.settings.title": "Arventennoù", "pad.toolbar.embed.title": "Rannañ hag enframmañ ar pad-mañ", "pad.toolbar.showusers.title": "Diskwelet implijerien ar Pad", @@ -96,6 +96,8 @@ "timeslider.version": "Stumm {{version}}", "timeslider.saved": "Enrollañ {{day}} {{month}} {{year}}", "timeslider.playPause": "Lenn / Ehan endalc'hoù ar pad", + "timeslider.backRevision": "Kilit eus un adweladenn er pad-mañ", + "timeslider.forwardRevision": "Araogiñ un adweladenn er pad-mañ", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Genver", "timeslider.month.february": "C'hwevrer", diff --git a/src/locales/ia.json b/src/locales/ia.json index e7f5cc2b..64d3bf6e 100644 --- a/src/locales/ia.json +++ b/src/locales/ia.json @@ -33,6 +33,7 @@ "pad.settings.padSettings": "Configuration del pad", "pad.settings.myView": "Mi vista", "pad.settings.stickychat": "Chat sempre visibile", + "pad.settings.chatandusers": "Monstrar chat e usatores", "pad.settings.colorcheck": "Colores de autor", "pad.settings.linenocheck": "Numeros de linea", "pad.settings.rtlcheck": "Leger le contento de dextra a sinistra?", @@ -91,6 +92,9 @@ "timeslider.exportCurrent": "Exportar le version actual como:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Salveguardate le {{day}} de {{month}} {{year}}", + "timeslider.playPause": "Reproducer/pausar le contento del pad", + "timeslider.backRevision": "Recular un version in iste pad", + "timeslider.forwardRevision": "Avantiar un version in iste pad", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januario", "timeslider.month.february": "februario", @@ -106,6 +110,7 @@ "timeslider.month.december": "decembre", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor, other: autores ]} sin nomine", "pad.savedrevs.marked": "Iste version es ora marcate como version salveguardate", + "pad.savedrevs.timeslider": "Tu pote vider versiones salveguardate con le chronologia glissante.", "pad.userlist.entername": "Entra tu nomine", "pad.userlist.unnamed": "sin nomine", "pad.userlist.guest": "Invitato", From 5c531eebc5db9c7bf9af67093426df8a1e886b2f Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Thu, 23 Jul 2015 18:52:24 +0200 Subject: [PATCH 71/74] Localisation updates from https://translatewiki.net. --- src/locales/oc.json | 3 +++ src/locales/zh-hans.json | 2 +- src/locales/zh-hant.json | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/locales/oc.json b/src/locales/oc.json index 62625ed7..637c9061 100644 --- a/src/locales/oc.json +++ b/src/locales/oc.json @@ -92,6 +92,9 @@ "timeslider.exportCurrent": "Exportar la version actuala en :", "timeslider.version": "Version {{version}}", "timeslider.saved": "Enregistrat lo {{day}} {{month}} {{year}}", + "timeslider.playPause": "Lectura / Pausa dels contenguts del pad", + "timeslider.backRevision": "Recular d’una revision dins aqueste pad", + "timeslider.forwardRevision": "Avançar d’una revision dins aqueste pad", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Genièr", "timeslider.month.february": "Febrièr", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index eaa03520..080fb62d 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -84,7 +84,7 @@ "pad.modals.corruptPad.cause": "这可能是因为服务器配置的错误或者其他未预料到的行为。请联系服务管理员。", "pad.modals.deleted": "已刪除。", "pad.modals.deleted.explanation": "此记事本已被移除。", - "pad.modals.disconnected": "你已断开连接。", + "pad.modals.disconnected": "您已断开连接。", "pad.modals.disconnected.explanation": "到服务器的连接已丢失", "pad.modals.disconnected.cause": "服务器可能无法使用。若此情况持续发生,请通知服务器管理员。", "pad.share": "分享此记事本", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index 48dd577c..8bdf29dc 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -28,7 +28,7 @@ "pad.toolbar.savedRevision.title": "儲存修訂", "pad.toolbar.settings.title": "設定", "pad.toolbar.embed.title": "分享和嵌入此pad", - "pad.toolbar.showusers.title": "顯示此pad的用戶", + "pad.toolbar.showusers.title": "顯示此 pad 的使用者", "pad.colorpicker.save": "儲存", "pad.colorpicker.cancel": "取消", "pad.loading": "載入中...", @@ -39,7 +39,7 @@ "pad.settings.padSettings": "Pad設定", "pad.settings.myView": "我的視窗", "pad.settings.stickychat": "永遠在屏幕上顯示聊天", - "pad.settings.chatandusers": "顯示聊天及用戶", + "pad.settings.chatandusers": "顯示聊天與使用者", "pad.settings.colorcheck": "協作者顏色", "pad.settings.linenocheck": "行號", "pad.settings.rtlcheck": "從右至左讀取內容?", From b557927b72e6d6e263a548c4a91bb6d80ebd46ee Mon Sep 17 00:00:00 2001 From: Thomas Russell Murphy Date: Mon, 3 Aug 2015 21:53:54 -0500 Subject: [PATCH 72/74] Fix link to etherpad-lite on GitHub --- src/node/utils/Settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 2cc6a926..2c2f90bf 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -83,7 +83,7 @@ exports.dbSettings = { "filename" : path.join(exports.root, "dirty.db") }; /** * The default Text of a new pad */ -exports.defaultPadText = "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad on Github: http:\/\/j.mp/ep-lite\n"; +exports.defaultPadText = "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad on Github: https:\/\/github.com\/ether\/etherpad-lite\n"; /** * The default Pad Settings for a user (Can be overridden by changing the setting From 856fc5975b796229929a0fe4eb3692bbc71fa1b2 Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 5 Aug 2015 18:23:54 +0200 Subject: [PATCH 73/74] Fix broken switchToPad method --- src/static/js/pad.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 6ee39b6b..eb90a883 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -465,8 +465,8 @@ var pad = { }, switchToPad: function(padId) { - var newHref = new RegExp(/.*\/p\/[^\/]+/).exec(document.location.pathname) || clientVars.padId; - newHref = newHref[0]; + var options = document.location.href.split('?')[1]; + var newHref = padId; if (typeof options != "undefined" && options != null){ newHref = newHref + '?' + options; } From 93fd05ba022270e173636151a0055221d055d108 Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 5 Aug 2015 19:15:27 +0200 Subject: [PATCH 74/74] Release version 1.5.7 --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index bfd3f260..4e905429 100644 --- a/src/package.json +++ b/src/package.json @@ -55,5 +55,5 @@ "repository" : { "type" : "git", "url" : "http://github.com/ether/etherpad-lite.git" }, - "version" : "1.5.6" + "version" : "1.5.7" }