From f7229d7c0cc1d4cbd880cf6823b997ba8ec6c00b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Flores?= Date: Mon, 30 Nov 2015 22:35:32 +0100 Subject: [PATCH] Update soruces to 1.5.7. --- sources/CHANGELOG.md | 21 +++++ sources/README.md | 2 +- sources/bin/convert.js | 14 +-- sources/bin/run.sh | 2 +- sources/doc/api/hooks_client-side.md | 14 +-- sources/doc/api/hooks_server-side.md | 28 ++++++ sources/settings.json.template | 44 +++++----- sources/src/locales/ar.json | 5 +- sources/src/locales/ast.json | 3 + sources/src/locales/be-tarask.json | 3 + sources/src/locales/br.json | 5 +- sources/src/locales/cs.json | 6 +- sources/src/locales/de.json | 3 + sources/src/locales/dty.json | 54 ++++++++++++ sources/src/locales/en-gb.json | 3 + sources/src/locales/es.json | 9 +- sources/src/locales/eu.json | 18 ++-- sources/src/locales/fa.json | 5 +- sources/src/locales/fi.json | 9 +- sources/src/locales/fr.json | 30 ++++--- sources/src/locales/gl.json | 3 + sources/src/locales/he.json | 3 + sources/src/locales/ia.json | 5 ++ sources/src/locales/ja.json | 3 + sources/src/locales/ksh.json | 19 ++-- sources/src/locales/ku-latn.json | 78 +++++++++++++++++ sources/src/locales/lt.json | 30 ++++++- sources/src/locales/mk.json | 3 + sources/src/locales/ms.json | 5 ++ sources/src/locales/nap.json | 2 +- sources/src/locales/nb.json | 59 +++++++------ sources/src/locales/ne.json | 21 +++-- sources/src/locales/oc.json | 3 + sources/src/locales/ps.json | 12 ++- sources/src/locales/ro.json | 82 ++++++++++++++++++ sources/src/locales/sv.json | 3 + sources/src/locales/tr.json | 4 + sources/src/locales/zh-hans.json | 5 +- sources/src/locales/zh-hant.json | 4 +- sources/src/node/db/Pad.js | 13 ++- sources/src/node/handler/ExportHandler.js | 36 +++++--- sources/src/node/handler/PadMessageHandler.js | 28 +++++- .../src/node/hooks/express/specialpages.js | 9 +- sources/src/node/utils/Settings.js | 11 ++- sources/src/node/utils/TidyHtml.js | 41 +++++++++ sources/src/node/utils/toolbar.js | 24 ++++- sources/src/package.json | 2 +- sources/src/static/css/pad.css | 43 ++++++--- sources/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 sources/src/static/js/ace2_inner.js | 2 +- sources/src/static/js/html10n.js | 4 + sources/src/static/js/pad.js | 19 ++-- sources/src/static/js/pad_editbar.js | 26 +++++- sources/src/static/js/pad_editor.js | 28 +++--- sources/src/templates/pad.html | 4 +- sources/tests/backend/loadSettings.js | 17 ++++ sources/tests/backend/specs/api/chat.js | 3 +- sources/tests/backend/specs/api/pad.js | 35 ++++++-- .../backend/specs/api/sessionsAndGroups.js | 3 +- sources/tests/backend/specs/api/tidy.js | 63 ++++++++++++++ sources/tests/frontend/specs/font_type.js | 2 +- 65 files changed, 857 insertions(+), 187 deletions(-) create mode 100644 sources/src/locales/dty.json create mode 100644 sources/src/locales/ku-latn.json create mode 100644 sources/src/locales/ro.json create mode 100644 sources/src/node/utils/TidyHtml.js create mode 100644 sources/tests/backend/loadSettings.js create mode 100644 sources/tests/backend/specs/api/tidy.js diff --git a/sources/CHANGELOG.md b/sources/CHANGELOG.md index 84d8500..0e45373 100755 --- a/sources/CHANGELOG.md +++ b/sources/CHANGELOG.md @@ -1,3 +1,24 @@ +# 1.5.7 + * NEW: Add support for intermediate CA certificates for ssl + * NEW: Provide a script to clean up before running etherpad + * NEW: Use ctrl+shift+1 to do a ordered list + * NEW: Show versions of plugins on startup + * NEW: Add author on padCreate and padUpdate hook + * Fix: switchToPad method + * Fix: Dead keys + * Fix: Preserve new lines in copy-pasted text + * Fix: Compatibility mode on IE + * Fix: Content Collector to get the class of the DOM-node + * Fix: Timeslider export links + * Fix: Double prompt on file upload + * Fix: setText() replaces the entire pad text + * Fix: Accessibility features on embedded pads + * Fix: Tidy HTML before abiword conversion + * Fix: Remove edit buttons in read-only view + * Fix: Disable user input in read-only view + * Fix: Pads end with a single newline, rather than two newlines + * Fix: Toolbar and chat for mobile devices + # 1.5.6 * Fix: Error on windows installations diff --git a/sources/README.md b/sources/README.md index 12ea399..5ad3587 100755 --- a/sources/README.md +++ b/sources/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. diff --git a/sources/bin/convert.js b/sources/bin/convert.js index 202ef04..88af1ad 100755 --- a/sources/bin/convert.js +++ b/sources/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(); diff --git a/sources/bin/run.sh b/sources/bin/run.sh index f216231..4d27663 100755 --- a/sources/bin/run.sh +++ b/sources/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 diff --git a/sources/doc/api/hooks_client-side.md b/sources/doc/api/hooks_client-side.md index aa02733..fccdaf4 100755 --- a/sources/doc/api/hooks_client-side.md +++ b/sources/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: diff --git a/sources/doc/api/hooks_server-side.md b/sources/doc/api/hooks_server-side.md index 717abe7..79879b2 100755 --- a/sources/doc/api/hooks_server-side.md +++ b/sources/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. @@ -214,6 +216,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 diff --git a/sources/settings.json.template b/sources/settings.json.template index 7d9c62c..6a344cb 100755 --- a/sources/settings.json.template +++ b/sources/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 // @@ -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"] }, @@ -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/sources/src/locales/ar.json b/sources/src/locales/ar.json index 9d29b52..153faae 100755 --- a/sources/src/locales/ar.json +++ b/sources/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/sources/src/locales/ast.json b/sources/src/locales/ast.json index 47c1ccc..e39bf6e 100755 --- a/sources/src/locales/ast.json +++ b/sources/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/sources/src/locales/be-tarask.json b/sources/src/locales/be-tarask.json index 3c78985..2d8c26e 100755 --- a/sources/src/locales/be-tarask.json +++ b/sources/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/sources/src/locales/br.json b/sources/src/locales/br.json index 310c97a..6a60fa3 100755 --- a/sources/src/locales/br.json +++ b/sources/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", @@ -95,6 +95,9 @@ "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.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/sources/src/locales/cs.json b/sources/src/locales/cs.json index 19552ff..1a26e7a 100755 --- a/sources/src/locales/cs.json +++ b/sources/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/sources/src/locales/de.json b/sources/src/locales/de.json index 2fd31c1..1600fc7 100755 --- a/sources/src/locales/de.json +++ b/sources/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/sources/src/locales/dty.json b/sources/src/locales/dty.json new file mode 100644 index 0000000..242b96c --- /dev/null +++ b/sources/src/locales/dty.json @@ -0,0 +1,54 @@ +{ + "@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/sources/src/locales/en-gb.json b/sources/src/locales/en-gb.json index 258b433..0cae66e 100755 --- a/sources/src/locales/en-gb.json +++ b/sources/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/sources/src/locales/es.json b/sources/src/locales/es.json index 21eb60a..9d4265b 100755 --- a/sources/src/locales/es.json +++ b/sources/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", @@ -115,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", @@ -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/sources/src/locales/eu.json b/sources/src/locales/eu.json index 9cd0607..5a39201 100755 --- a/sources/src/locales/eu.json +++ b/sources/src/locales/eu.json @@ -2,7 +2,9 @@ "@metadata": { "authors": [ "Theklan", - "Subi" + "Subi", + "Xabier Armendaritz", + "An13sa" ] }, "index.newPad": "Pad berria", @@ -10,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", @@ -87,7 +89,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/sources/src/locales/fa.json b/sources/src/locales/fa.json index cd42c87..e1e8841 100755 --- a/sources/src/locales/fa.json +++ b/sources/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": "این احتمالاً به دلیل تنظیمات اشتباه کارساز یا سایر رفتارهای غیرمنتظره است. لطفاً با مدیر خدمت تماس حاصل کنید.", @@ -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/sources/src/locales/fi.json b/sources/src/locales/fi.json index 67efac9..8f4f583 100755 --- a/sources/src/locales/fi.json +++ b/sources/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/sources/src/locales/fr.json b/sources/src/locales/fr.json index ba289e3..11f7c1b 100755 --- a/sources/src/locales/fr.json +++ b/sources/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,7 +110,10 @@ "timeslider.exportCurrent": "Exporter la version actuelle sous :", "timeslider.version": "Version {{version}}", "timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}", - "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", @@ -124,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/sources/src/locales/gl.json b/sources/src/locales/gl.json index 381296a..ff1e930 100755 --- a/sources/src/locales/gl.json +++ b/sources/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/sources/src/locales/he.json b/sources/src/locales/he.json index 4222e15..3a6672b 100755 --- a/sources/src/locales/he.json +++ b/sources/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/sources/src/locales/ia.json b/sources/src/locales/ia.json index e7f5cc2..64d3bf6 100755 --- a/sources/src/locales/ia.json +++ b/sources/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", diff --git a/sources/src/locales/ja.json b/sources/src/locales/ja.json index b6cc4e3..f223a8c 100755 --- a/sources/src/locales/ja.json +++ b/sources/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/sources/src/locales/ksh.json b/sources/src/locales/ksh.json index 5d5230d..955f975 100755 --- a/sources/src/locales/ksh.json +++ b/sources/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)", @@ -34,11 +34,11 @@ "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", - "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,15 +83,18 @@ "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 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ß:", "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", @@ -115,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/sources/src/locales/ku-latn.json b/sources/src/locales/ku-latn.json new file mode 100644 index 0000000..b1713b5 --- /dev/null +++ b/sources/src/locales/ku-latn.json @@ -0,0 +1,78 @@ +{ + "@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.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", + "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/sources/src/locales/lt.json b/sources/src/locales/lt.json index 7b4e148..524146d 100755 --- a/sources/src/locales/lt.json +++ b/sources/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.", diff --git a/sources/src/locales/mk.json b/sources/src/locales/mk.json index a924875..e00d47d 100755 --- a/sources/src/locales/mk.json +++ b/sources/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/sources/src/locales/ms.json b/sources/src/locales/ms.json index d099de0..93b421f 100755 --- a/sources/src/locales/ms.json +++ b/sources/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/sources/src/locales/nap.json b/sources/src/locales/nap.json index 6cd1651..22a5b26 100755 --- a/sources/src/locales/nap.json +++ b/sources/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/sources/src/locales/nb.json b/sources/src/locales/nb.json index a1b3a5c..48c9652 100755 --- a/sources/src/locales/nb.json +++ b/sources/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/sources/src/locales/ne.json b/sources/src/locales/ne.json index b380526..1179c93 100755 --- a/sources/src/locales/ne.json +++ b/sources/src/locales/ne.json @@ -1,7 +1,9 @@ { "@metadata": { "authors": [ - "सरोज कुमार ढकाल" + "सरोज कुमार ढकाल", + "Nirjal stha", + "राम प्रसाद जोशी" ] }, "index.newPad": "नयाँ प्याड", @@ -9,20 +11,20 @@ "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": "सेटिङ्गहरू", "pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने", "pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने", - "pad.colorpicker.save": "संग्रह गर्ने", + "pad.colorpicker.save": "सङ्ग्रह गर्ने", "pad.colorpicker.cancel": "रद्द", "pad.loading": "लोड हुदैछ...", "pad.passwordRequired": "यो प्यड खोल्न पासवर्ड चाहिन्छ", @@ -31,6 +33,7 @@ "pad.settings.padSettings": "प्याड सेटिङ्गहरू", "pad.settings.myView": "मेरो दृष्य", "pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने", + "pad.settings.chatandusers": "वार्ता तथा प्रयोगकर्ताहरू देखाउने", "pad.settings.colorcheck": "लेखकीय रङ्ग", "pad.settings.linenocheck": "हरफ संख्या", "pad.settings.rtlcheck": "के सामग्री दाहिने देखि देब्रे पढ्ने हो ?", @@ -43,6 +46,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 +58,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 +78,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 +103,7 @@ "pad.userlist.approve": "स्वीकृत गर्ने", "pad.impexp.importbutton": "अहिले आयात गर्ने", "pad.impexp.importing": "आयात गर्ने...", + "pad.impexp.uploadFailed": "अपलोड असफल भयो , कृपया पुन: प्रयास गर्नुहोस् ।", "pad.impexp.importfailed": "आयात असफल भयो", "pad.impexp.copypaste": "कृपया कपी पेस्ट गर्नुहोस" } diff --git a/sources/src/locales/oc.json b/sources/src/locales/oc.json index 62625ed..637c906 100755 --- a/sources/src/locales/oc.json +++ b/sources/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/sources/src/locales/ps.json b/sources/src/locales/ps.json index 2c23d1c..8db3a89 100755 --- a/sources/src/locales/ps.json +++ b/sources/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)", @@ -15,18 +19,22 @@ "pad.toolbar.settings.title": "امستنې", "pad.colorpicker.save": "خوندي کول", "pad.colorpicker.cancel": "ناگارل", - "pad.loading": "برسېرېدنې کې دی...", + "pad.loading": "رابرسېرېږي...", "pad.passwordRequired": "دې ليکچې ته د لاسرسي لپاره تاسې يو پټنوم ته اړتيا لرۍ", "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/sources/src/locales/ro.json b/sources/src/locales/ro.json new file mode 100644 index 0000000..85436dd --- /dev/null +++ b/sources/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/sources/src/locales/sv.json b/sources/src/locales/sv.json index ae9b1f9..44df450 100755 --- a/sources/src/locales/sv.json +++ b/sources/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/sources/src/locales/tr.json b/sources/src/locales/tr.json index 80927b7..2c948ef 100755 --- a/sources/src/locales/tr.json +++ b/sources/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", diff --git a/sources/src/locales/zh-hans.json b/sources/src/locales/zh-hans.json index 31b7f7f..080fb62 100755 --- a/sources/src/locales/zh-hans.json +++ b/sources/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": "分享此记事本", @@ -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月", diff --git a/sources/src/locales/zh-hant.json b/sources/src/locales/zh-hant.json index 48dd577..8bdf29d 100755 --- a/sources/src/locales/zh-hant.json +++ b/sources/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": "從右至左讀取內容?", diff --git a/sources/src/node/db/Pad.js b/sources/src/node/db/Pad.js index e70628b..eb6a3ed 100755 --- a/sources/src/node/db/Pad.js +++ b/sources/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}); } }; @@ -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/sources/src/node/handler/ExportHandler.js b/sources/src/node/handler/ExportHandler.js index f20e871..f861c82 100755 --- a/sources/src/node/handler/ExportHandler.js +++ b/sources/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/sources/src/node/handler/PadMessageHandler.js b/sources/src/node/handler/PadMessageHandler.js index e15af1a..248dc12 100755 --- a/sources/src/node/handler/PadMessageHandler.js +++ b/sources/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 () { @@ -533,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", @@ -762,8 +781,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); } diff --git a/sources/src/node/hooks/express/specialpages.js b/sources/src/node/hooks/express/specialpages.js index 0370c4f..15e853d 100755 --- a/sources/src/node/hooks/express/specialpages.js +++ b/sources/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/sources/src/node/utils/Settings.js b/sources/src/node/utils/Settings.js index b7d1f0b..2c2f90b 100755 --- a/sources/src/node/utils/Settings.js +++ b/sources/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 @@ -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/sources/src/node/utils/TidyHtml.js b/sources/src/node/utils/TidyHtml.js new file mode 100644 index 0000000..5d4e6ed --- /dev/null +++ b/sources/src/node/utils/TidyHtml.js @@ -0,0 +1,41 @@ +/** + * Tidy up the HTML in a given file + */ + +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 + 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) { + logger.debug('Tidied ' + srcFile + ' successfully'); + return callback(null); + } else { + logger.error('Failed to tidy ' + srcFile + '\n' + errMessage); + return callback('Tidy died with exit code ' + code); + } + }); +}; diff --git a/sources/src/node/utils/toolbar.js b/sources/src/node/utils/toolbar.js index 07b8649..eaa1d42 100755 --- a/sources/src/node/utils/toolbar.js +++ b/sources/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 { @@ -236,7 +245,18 @@ 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 + removeItem(buttons[0],"savedrevision"); + } + } + var groups = _.map(buttons, function (group) { return ButtonsGroup.fromArray(group).render(); }); diff --git a/sources/src/package.json b/sources/src/package.json index bfd3f26..4e90542 100755 --- a/sources/src/package.json +++ b/sources/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" } diff --git a/sources/src/static/css/pad.css b/sources/src/static/css/pad.css index 49a54fb..1e43ab9 100755 --- a/sources/src/static/css/pad.css +++ b/sources/src/static/css/pad.css @@ -189,7 +189,7 @@ a img { left:0px; right:250px; } - + .toolbar ul.menu_right { right:0px; } @@ -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%; @@ -1029,7 +1033,7 @@ input[type=checkbox] { left:0px; right:100px; } - + .toolbar ul.menu_right { right:0px; } @@ -1059,10 +1063,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 +1075,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; @@ -1091,14 +1106,14 @@ input[type=checkbox] { background: none !important } li[data-key="showusers"] > a { - + margin-top:-10px; padding-top:2px !important; line-height:20px; vertical-align:top !important; } #chaticon { - position:absolute; + position:fixed; right:48px; } .popup { @@ -1127,7 +1142,7 @@ input[type=checkbox] { line-height: 24px } #chatbox{ - position:absolute; + position:fixed; bottom:33px !important; margin: 65px 0 0 0; } @@ -1248,11 +1263,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; diff --git a/sources/src/static/font/config.json b/sources/src/static/font/config.json index 34231cc..f9c2c3d 100755 --- a/sources/src/static/font/config.json +++ b/sources/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/sources/src/static/font/fontawesome-etherpad.eot b/sources/src/static/font/fontawesome-etherpad.eot index fb65168629fd9d9a4bc0e32665b1055db61af150..284149e2ba866f9df6568504b66556485c8ef225 100755 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/sources/src/static/font/fontawesome-etherpad.svg b/sources/src/static/font/fontawesome-etherpad.svg index 4033c4d..a64ba86 100755 --- a/sources/src/static/font/fontawesome-etherpad.svg +++ b/sources/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/sources/src/static/font/fontawesome-etherpad.ttf b/sources/src/static/font/fontawesome-etherpad.ttf index f2fe398ec9f8fe56f220792e119b7014e8f54bf9..f596b4fe672170314fa63ac5331415ad8eae5971 100755 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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 0 && str.id.substr(index + 1) in attrList) { // an attribute has been specified prop = str.id.substr(index + 1) @@ -861,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 diff --git a/sources/src/static/js/pad.js b/sources/src/static/js/pad.js index e395140..eb90a88 100755 --- a/sources/src/static/js/pad.js +++ b/sources/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(); } }, @@ -322,6 +322,15 @@ function handshake() pad._afterHandshake(); initalized = true; + if(clientVars.readonly){ + chat.hide(); + $('#myusernameedit').attr("disabled", true); + $('#chatinput').attr("disabled", true); + $('#chaticon').hide(); + $('#options-chatandusers').parent().hide(); + $('#options-stickychat').parent().hide(); + } + $("body").addClass(clientVars.readonly ? "readonly" : "readwrite") padeditor.ace.callWithAce(function (ace) { @@ -456,9 +465,9 @@ var pad = { }, switchToPad: function(padId) { - var newHref = new RegExp(/.*\/p\/[^\/]+/).exec(document.location.pathname) || clientVars.padId; - newHref = newHref[0]; - if (options != null){ + var options = document.location.href.split('?')[1]; + var newHref = padId; + if (typeof options != "undefined" && options != null){ newHref = newHref + '?' + options; } diff --git a/sources/src/static/js/pad_editbar.js b/sources/src/static/js/pad_editbar.js index e418969..48fcaab 100755 --- a/sources/src/static/js/pad_editbar.js +++ b/sources/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); diff --git a/sources/src/static/js/pad_editor.js b/sources/src/static/js/pad_editor.js index 2514cd1..6616ebe 100755 --- a/sources/src/static/js/pad_editor.js +++ b/sources/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; @@ -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"); } diff --git a/sources/src/templates/pad.html b/sources/src/templates/pad.html index dd26041..5311b32 100755 --- a/sources/src/templates/pad.html +++ b/sources/src/templates/pad.html @@ -63,12 +63,12 @@ diff --git a/sources/tests/backend/loadSettings.js b/sources/tests/backend/loadSettings.js new file mode 100644 index 0000000..f208fe3 --- /dev/null +++ b/sources/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/sources/tests/backend/specs/api/chat.js b/sources/tests/backend/specs/api/chat.js index 59b7edc..2bcd978 100755 --- a/sources/tests/backend/specs/api/chat.js +++ b/sources/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/sources/tests/backend/specs/api/pad.js b/sources/tests/backend/specs/api/pad.js index a2e8cdb..14e9909 100755 --- a/sources/tests/backend/specs/api/pad.js +++ b/sources/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'); @@ -210,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) @@ -386,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) @@ -419,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) @@ -441,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) @@ -464,7 +488,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/) diff --git a/sources/tests/backend/specs/api/sessionsAndGroups.js b/sources/tests/backend/specs/api/sessionsAndGroups.js index 4742852..4089656 100755 --- a/sources/tests/backend/specs/api/sessionsAndGroups.js +++ b/sources/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'); diff --git a/sources/tests/backend/specs/api/tidy.js b/sources/tests/backend/specs/api/tidy.js new file mode 100644 index 0000000..47cb49f --- /dev/null +++ b/sources/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(); + }); + }); +}); diff --git a/sources/tests/frontend/specs/font_type.js b/sources/tests/frontend/specs/font_type.js index e5c65f2..d2c7bc6 100755 --- a/sources/tests/frontend/specs/font_type.js +++ b/sources/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();