From d16b15f3eb7d5753b60fbc7907e85ca996674bdb Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 17:34:34 +0000 Subject: [PATCH 001/463] begin support for better txt output --- src/node/handler/ExportHandler.js | 78 ++++- src/node/utils/ExportTxt.js | 477 ++++++++++++++++++++++++++++++ 2 files changed, 543 insertions(+), 12 deletions(-) create mode 100644 src/node/utils/ExportTxt.js diff --git a/src/node/handler/ExportHandler.js b/src/node/handler/ExportHandler.js index 1b7fcc26..8ff5bc48 100644 --- a/src/node/handler/ExportHandler.js +++ b/src/node/handler/ExportHandler.js @@ -20,6 +20,7 @@ var ERR = require("async-stacktrace"); var exporthtml = require("../utils/ExportHtml"); +var exporttxt = require("../utils/ExportTxt"); var exportdokuwiki = require("../utils/ExportDokuWiki"); var padManager = require("../db/PadManager"); var async = require("async"); @@ -48,22 +49,75 @@ exports.doExport = function(req, res, padId, type) res.attachment(padId + "." + 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 == "txt") { - padManager.getPad(padId, function(err, pad) - { - ERR(err); - if(req.params.rev){ - pad.getInternalRevisionAText(req.params.rev, function(junk, text) - { - res.send(text.text ? text.text : null); - }); - } - else + var txt; + var randNum; + var srcFile, destFile; + + async.series([ + //render the txt document + function(callback) { - res.send(pad.text()); + exporttxt.getPadTXTDocument(padId, req.params.rev, false, function(err, _txt) + { + if(ERR(err, callback)) return; + txt = _txt; + callback(); + }); + }, + //decide what to do with the txt export + function(callback) + { + //if this is a txt export, we can send this from here directly + res.send(txt); + callback("stop"); + }, + //send the convert job to abiword + function(callback) + { + //ensure html can be collected by the garbage collector + txt = null; + + destFile = tempDirectory + "/eplite_export_" + randNum + "." + type; + abiword.convertFile(srcFile, destFile, type, callback); + }, + //send the file + function(callback) + { + res.sendfile(destFile, null, callback); + }, + //clean up temporary files + function(callback) + { + async.parallel([ + function(callback) + { + fs.unlink(srcFile, callback); + }, + function(callback) + { + //100ms delay to accomidate for slow windows fs + if(os.type().indexOf("Windows") > -1) + { + setTimeout(function() + { + fs.unlink(destFile, callback); + }, 100); + } + else + { + fs.unlink(destFile, callback); + } + } + ], callback); } - }); + ], function(err) + { + if(err && err != "stop") ERR(err); + }) } else if(type == 'dokuwiki') { diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js new file mode 100644 index 00000000..99f6085e --- /dev/null +++ b/src/node/utils/ExportTxt.js @@ -0,0 +1,477 @@ +/** + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +var async = require("async"); +var Changeset = require("ep_etherpad-lite/static/js/Changeset"); +var padManager = require("../db/PadManager"); +var ERR = require("async-stacktrace"); +var Security = require('ep_etherpad-lite/static/js/security'); +var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); +function getPadPlainText(pad, revNum) +{ + var atext = ((revNum !== undefined) ? pad.getInternalRevisionAText(revNum) : pad.atext()); + var textLines = atext.text.slice(0, -1).split('\n'); + var attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); + var apool = pad.pool(); + + var pieces = []; + for (var i = 0; i < textLines.length; i++) + { + var line = _analyzeLine(textLines[i], attribLines[i], apool); + if (line.listLevel) + { + var numSpaces = line.listLevel * 2 - 1; + var bullet = '*'; + pieces.push(new Array(numSpaces + 1).join(' '), bullet, ' ', line.text, '\n'); + } + else + { + pieces.push(line.text, '\n'); + } + } + + return pieces.join(''); +} + +function getPadTXT(pad, revNum, callback) +{ + var atext = pad.atext; + var html; + async.waterfall([ + // fetch revision atext + + + function (callback) + { + if (revNum != undefined) + { + pad.getInternalRevisionAText(revNum, function (err, revisionAtext) + { + if(ERR(err, callback)) return; + atext = revisionAtext; + callback(); + }); + } + else + { + callback(null); + } + }, + + // convert atext to html + + + function (callback) + { + html = getTXTFromAtext(pad, atext); + callback(null); + }], + // run final callback + + + function (err) + { + if(ERR(err, callback)) return; + callback(null, html); + }); +} + +exports.getPadTXT = getPadTXT; +exports.getTXTFromAtext = getTXTFromAtext; + +function getTXTFromAtext(pad, atext, authorColors) +{ + var apool = pad.apool(); + var textLines = atext.text.slice(0, -1).split('\n'); + var attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); + + var tags = ['h1', 'h2', 'strong', 'em', 'u', 's']; + var props = ['heading1', 'heading2', 'bold', 'italic', 'underline', 'strikethrough']; + var anumMap = {}; + var css = ""; + + props.forEach(function (propName, i) + { + var propTrueNum = apool.putAttrib([propName, true], true); + if (propTrueNum >= 0) + { + anumMap[propTrueNum] = i; + } + }); + + function getLineTXT(text, attribs) + { + var propVals = [false, false, false]; + var ENTER = 1; + var STAY = 2; + var LEAVE = 0; + + // Use order of tags (b/i/u) as order of nesting, for simplicity + // and decent nesting. For example, + // Just bold Bold and italics Just italics + // becomes + // Just bold Bold and italics Just italics + var taker = Changeset.stringIterator(text); + var assem = Changeset.stringAssembler(); + var openTags = []; + + var urls = _findURLs(text); + + var idx = 0; + + function processNextChars(numChars) + { + if (numChars <= 0) + { + return; + } + + var iter = Changeset.opIterator(Changeset.subattribution(attribs, idx, idx + numChars)); + idx += numChars; + + while (iter.hasNext()) + { + var o = iter.next(); + var propChanged = false; + Changeset.eachAttribNumber(o.attribs, function (a) + { + if (a in anumMap) + { + var i = anumMap[a]; // i = 0 => bold, etc. + if (!propVals[i]) + { + propVals[i] = ENTER; + propChanged = true; + } + else + { + propVals[i] = STAY; + } + } + }); + for (var i = 0; i < propVals.length; i++) + { + if (propVals[i] === true) + { + propVals[i] = LEAVE; + propChanged = true; + } + else if (propVals[i] === STAY) + { + propVals[i] = true; // set it back + } + } + // now each member of propVal is in {false,LEAVE,ENTER,true} + // according to what happens at start of span + if (propChanged) + { + // leaving bold (e.g.) also leaves italics, etc. + var left = false; + for (var i = 0; i < propVals.length; i++) + { + var v = propVals[i]; + if (!left) + { + if (v === LEAVE) + { + left = true; + } + } + else + { + if (v === true) + { + propVals[i] = STAY; // tag will be closed and re-opened + } + } + } + + var tags2close = []; + + for (var i = propVals.length - 1; i >= 0; i--) + { + if (propVals[i] === LEAVE) + { + //emitCloseTag(i); + tags2close.push(i); + propVals[i] = false; + } + else if (propVals[i] === STAY) + { + //emitCloseTag(i); + tags2close.push(i); + } + } + + for (var i = 0; i < propVals.length; i++) + { + if (propVals[i] === ENTER || propVals[i] === STAY) + { + emitOpenTag(i); + propVals[i] = true; + } + } + // propVals is now all {true,false} again + } // end if (propChanged) + var chars = o.chars; + if (o.lines) + { + chars--; // exclude newline at end of line, if present + } + + var s = taker.take(chars); + + //removes the characters with the code 12. Don't know where they come + //from but they break the abiword parser and are completly useless + s = s.replace(String.fromCharCode(12), ""); + + assem.append(_encodeWhitespace(Security.escapeHTML(s))); + } // end iteration over spans in line + + var tags2close = []; + for (var i = propVals.length - 1; i >= 0; i--) + { + if (propVals[i]) + { + tags2close.push(i); + propVals[i] = false; + } + } + + } // end processNextChars + if (urls) + { + urls.forEach(function (urlData) + { + var startIndex = urlData[0]; + var url = urlData[1]; + var urlLength = url.length; + processNextChars(startIndex - idx); + console.warn(url); + // assem.append(''); + assem.append(url); + processNextChars(urlLength); + // assem.append(''); + }); + } + processNextChars(text.length - idx); + + return _processSpaces(assem.toString()); + } // end getLineHTML + var pieces = [css]; + + // Need to deal with constraints imposed on HTML lists; can + // only gain one level of nesting at once, can't change type + // mid-list, etc. + // People might use weird indenting, e.g. skip a level, + // so we want to do something reasonable there. We also + // want to deal gracefully with blank lines. + // => keeps track of the parents level of indentation + var lists = []; // e.g. [[1,'bullet'], [3,'bullet'], ...] + for (var i = 0; i < textLines.length; i++) + { + var line = _analyzeLine(textLines[i], attribLines[i], apool); + var lineContent = getLineTXT(line.text, line.aline); + if(line.listTypeName == "bullet"){ + lineContent = "* " + lineContent; // add a bullet + } + if(line.listLevel > 0){ + for (var j = line.listLevel - 1; j >= 0; j--){ + pieces.push('\t'); + } + if(line.listTypeName == "number"){ + pieces.push(line.listLevel + ". "); + // This is bad because it doesn't truly reflect what the user + // sees because browsers do magic on nested
  1. s + } + pieces.push(lineContent, '\n'); + }else{ + console.warn(line); + pieces.push(lineContent, '\n'); + } + + // I'm not too keen about using teh HTML export filters here, they could cause real pain in the future + // I'd suggest supporting getLineTXTForExport + var lineContentFromHook = hooks.callAllStr("getLineHTMLForExport", + { + line: line, + apool: apool, + attribLine: attribLines[i], + text: textLines[i] + }, " ", " ", ""); + if (lineContentFromHook) + { + pieces.push(lineContentFromHook, ''); + } + else + { + // pieces.push(lineContent, '\n'); + } + } + + return pieces.join(''); +} + +function _analyzeLine(text, aline, apool) +{ + var line = {}; + + // identify list + var lineMarker = 0; + line.listLevel = 0; + if (aline) + { + var opIter = Changeset.opIterator(aline); + if (opIter.hasNext()) + { + var listType = Changeset.opAttributeValue(opIter.next(), 'list', apool); + if (listType) + { + lineMarker = 1; + listType = /([a-z]+)([12345678])/.exec(listType); + if (listType) + { + line.listTypeName = listType[1]; + line.listLevel = Number(listType[2]); + } + } + } + } + if (lineMarker) + { + line.text = text.substring(1); + line.aline = Changeset.subattribution(aline, 1); + } + else + { + line.text = text; + line.aline = aline; + } + + return line; +} + +exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) +{ + padManager.getPad(padId, function (err, pad) + { + if(ERR(err, callback)) return; + + getPadTXT(pad, revNum, function (err, html) + { + if(ERR(err, callback)) return; + callback(null, html); + }); + }); +} + +function _encodeWhitespace(s) { + return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c) + { + return "&#" +c.charCodeAt(0) + ";" + }); +} + +// copied from ACE +function _processSpaces(s) +{ + var doesWrap = true; + if (s.indexOf("<") < 0 && !doesWrap) + { + // short-cut + return s.replace(/ /g, ' '); + } + var parts = []; + s.replace(/<[^>]*>?| |[^ <]+/g, function (m) + { + parts.push(m); + }); + if (doesWrap) + { + var endOfLine = true; + var beforeSpace = false; + // last space in a run is normal, others are nbsp, + // end of line is nbsp + for (var i = parts.length - 1; i >= 0; i--) + { + var p = parts[i]; + if (p == " ") + { + if (endOfLine || beforeSpace) parts[i] = ' '; + endOfLine = false; + beforeSpace = true; + } + else if (p.charAt(0) != "<") + { + endOfLine = false; + beforeSpace = false; + } + } + // beginning of line is nbsp + for (var i = 0; i < parts.length; i++) + { + var p = parts[i]; + if (p == " ") + { + parts[i] = ' '; + break; + } + else if (p.charAt(0) != "<") + { + break; + } + } + } + else + { + for (var i = 0; i < parts.length; i++) + { + var p = parts[i]; + if (p == " ") + { + parts[i] = ' '; + } + } + } + return parts.join(''); +} + + +// copied from ACE +var _REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; +var _REGEX_SPACE = /\s/; +var _REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#;()$]/.source + '|' + _REGEX_WORDCHAR.source + ')'); +var _REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:)/.source + _REGEX_URLCHAR.source + '*(?![:.,;])' + _REGEX_URLCHAR.source, 'g'); + +// returns null if no URLs, or [[startIndex1, url1], [startIndex2, url2], ...] + +function _findURLs(text) +{ + _REGEX_URL.lastIndex = 0; + var urls = null; + var execResult; + while ((execResult = _REGEX_URL.exec(text))) + { + urls = (urls || []); + var startIndex = execResult.index; + var url = execResult[0]; + urls.push([startIndex, url]); + } + + return urls; +} + From a378f48c00fca7b78d888e3fd5957668fbff8811 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 17:39:02 +0000 Subject: [PATCH 002/463] remove console warns --- src/node/utils/ExportTxt.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 99f6085e..d9ee708f 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -261,7 +261,6 @@ function getTXTFromAtext(pad, atext, authorColors) var url = urlData[1]; var urlLength = url.length; processNextChars(startIndex - idx); - console.warn(url); // assem.append(''); assem.append(url); processNextChars(urlLength); @@ -300,7 +299,6 @@ function getTXTFromAtext(pad, atext, authorColors) } pieces.push(lineContent, '\n'); }else{ - console.warn(line); pieces.push(lineContent, '\n'); } From a67a0950dd05bbe494ede5dfd696fcc47dcc9107 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 19:21:27 +0000 Subject: [PATCH 003/463] stop urls being encoded, not sure about other security implications here... --- src/node/utils/ExportTxt.js | 40 ++----------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index d9ee708f..462583d3 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -129,8 +129,6 @@ function getTXTFromAtext(pad, atext, authorColors) var assem = Changeset.stringAssembler(); var openTags = []; - var urls = _findURLs(text); - var idx = 0; function processNextChars(numChars) @@ -239,7 +237,8 @@ function getTXTFromAtext(pad, atext, authorColors) //from but they break the abiword parser and are completly useless s = s.replace(String.fromCharCode(12), ""); - assem.append(_encodeWhitespace(Security.escapeHTML(s))); + // assem.append(_encodeWhitespace(Security.escapeHTML(s))); + assem.append(_encodeWhitespace(s)); } // end iteration over spans in line var tags2close = []; @@ -253,20 +252,6 @@ function getTXTFromAtext(pad, atext, authorColors) } } // end processNextChars - if (urls) - { - urls.forEach(function (urlData) - { - var startIndex = urlData[0]; - var url = urlData[1]; - var urlLength = url.length; - processNextChars(startIndex - idx); - // assem.append(''); - assem.append(url); - processNextChars(urlLength); - // assem.append(''); - }); - } processNextChars(text.length - idx); return _processSpaces(assem.toString()); @@ -452,24 +437,3 @@ function _processSpaces(s) // copied from ACE var _REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; var _REGEX_SPACE = /\s/; -var _REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#;()$]/.source + '|' + _REGEX_WORDCHAR.source + ')'); -var _REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:)/.source + _REGEX_URLCHAR.source + '*(?![:.,;])' + _REGEX_URLCHAR.source, 'g'); - -// returns null if no URLs, or [[startIndex1, url1], [startIndex2, url2], ...] - -function _findURLs(text) -{ - _REGEX_URL.lastIndex = 0; - var urls = null; - var execResult; - while ((execResult = _REGEX_URL.exec(text))) - { - urls = (urls || []); - var startIndex = execResult.index; - var url = execResult[0]; - urls.push([startIndex, url]); - } - - return urls; -} - From 626ee97669767ea0f18fc41a99591211c35238ec Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 19:36:46 +0000 Subject: [PATCH 004/463] kinda brutal way of stopping plugins being able to pass *s instead of attributes --- src/node/db/PadManager.js | 4 ++-- src/node/utils/ExportTxt.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/node/db/PadManager.js b/src/node/db/PadManager.js index 5e0af464..2be9da36 100644 --- a/src/node/db/PadManager.js +++ b/src/node/db/PadManager.js @@ -146,12 +146,12 @@ exports.getPad = function(id, text, callback) else { pad = new Pad(id); - + //initalize the pad pad.init(text, function(err) { if(ERR(err, callback)) return; - + console.warn(pad); globalPads.set(id, pad); callback(null, pad); }); diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 462583d3..c236df47 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -236,6 +236,10 @@ function getTXTFromAtext(pad, atext, authorColors) //removes the characters with the code 12. Don't know where they come //from but they break the abiword parser and are completly useless s = s.replace(String.fromCharCode(12), ""); + + // remove * from s, it's just not needed on a blank line.. This stops + // plugins from being able to display * at the beginning of a line + s = s.replace("*", ""); // assem.append(_encodeWhitespace(Security.escapeHTML(s))); assem.append(_encodeWhitespace(s)); From bcf9c23b4e9b52bd86e4b7936b713d71c7cd3e93 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 19:38:16 +0000 Subject: [PATCH 005/463] dont use HTML filter hooks on txt export --- src/node/utils/ExportTxt.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index c236df47..9451fd6e 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -290,24 +290,6 @@ function getTXTFromAtext(pad, atext, authorColors) }else{ pieces.push(lineContent, '\n'); } - - // I'm not too keen about using teh HTML export filters here, they could cause real pain in the future - // I'd suggest supporting getLineTXTForExport - var lineContentFromHook = hooks.callAllStr("getLineHTMLForExport", - { - line: line, - apool: apool, - attribLine: attribLines[i], - text: textLines[i] - }, " ", " ", ""); - if (lineContentFromHook) - { - pieces.push(lineContentFromHook, ''); - } - else - { - // pieces.push(lineContent, '\n'); - } } return pieces.join(''); From 28f6d50011abd7c12b2b3948b14bd547d2ef4aee Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 22:14:05 +0000 Subject: [PATCH 006/463] remove console warn --- src/node/db/PadManager.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node/db/PadManager.js b/src/node/db/PadManager.js index 2be9da36..7d546fc7 100644 --- a/src/node/db/PadManager.js +++ b/src/node/db/PadManager.js @@ -151,7 +151,6 @@ exports.getPad = function(id, text, callback) pad.init(text, function(err) { if(ERR(err, callback)) return; - console.warn(pad); globalPads.set(id, pad); callback(null, pad); }); From 60ef5f210ae47529325abf0968966ddf8348bfa7 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 10 Feb 2013 23:41:14 +0000 Subject: [PATCH 007/463] remove duplicate code to the best of my ability right now --- src/node/utils/ExportHtml.js | 7 +- src/node/utils/ExportTxt.js | 145 +++-------------------------------- 2 files changed, 15 insertions(+), 137 deletions(-) diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 06919488..74b6546f 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -92,6 +92,7 @@ function getPadHTML(pad, revNum, callback) exports.getPadHTML = getPadHTML; exports.getHTMLFromAtext = getHTMLFromAtext; +exports.getPadPlainText = getPadPlainText; function getHTMLFromAtext(pad, atext, authorColors) { @@ -542,6 +543,8 @@ function _analyzeLine(text, aline, apool) return line; } +exports._analyzeLine = _analyzeLine; + exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) { padManager.getPad(padId, function (err, pad) @@ -584,10 +587,9 @@ function _encodeWhitespace(s) { return "&#" +c.charCodeAt(0) + ";" }); } +exports._encodeWhitespace = _encodeWhitespace; // copied from ACE - - function _processSpaces(s) { var doesWrap = true; @@ -651,6 +653,7 @@ function _processSpaces(s) return parts.join(''); } +exports._processSpaces = _processSpaces; // copied from ACE var _REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 9451fd6e..edcccfd7 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -21,32 +21,12 @@ var padManager = require("../db/PadManager"); var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); -function getPadPlainText(pad, revNum) -{ - var atext = ((revNum !== undefined) ? pad.getInternalRevisionAText(revNum) : pad.atext()); - var textLines = atext.text.slice(0, -1).split('\n'); - var attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); - var apool = pad.pool(); - - var pieces = []; - for (var i = 0; i < textLines.length; i++) - { - var line = _analyzeLine(textLines[i], attribLines[i], apool); - if (line.listLevel) - { - var numSpaces = line.listLevel * 2 - 1; - var bullet = '*'; - pieces.push(new Array(numSpaces + 1).join(' '), bullet, ' ', line.text, '\n'); - } - else - { - pieces.push(line.text, '\n'); - } - } - - return pieces.join(''); -} +var getPadPlainText = require('./ExportHtml').getPadPlainText; +var _processSpaces = require('./ExportHtml')._processSpaces; +var _analyzeLine = require('./ExportHtml')._analyzeLine; +var _encodeWhitespace = require('./ExportHtml')._encodeWhitespace; +// This is slightly different than the HTML method as it passes the output to getTXTFromAText function getPadTXT(pad, revNum, callback) { var atext = pad.atext; @@ -77,7 +57,7 @@ function getPadTXT(pad, revNum, callback) function (callback) { - html = getTXTFromAtext(pad, atext); + html = getTXTFromAtext(pad, atext); // only this line is different to the HTML function callback(null); }], // run final callback @@ -91,8 +71,10 @@ function getPadTXT(pad, revNum, callback) } exports.getPadTXT = getPadTXT; -exports.getTXTFromAtext = getTXTFromAtext; + +// This is different than the functionality provided in ExportHtml as it provides formatting +// functionality that is designed specifically for TXT exports function getTXTFromAtext(pad, atext, authorColors) { var apool = pad.apool(); @@ -294,45 +276,7 @@ function getTXTFromAtext(pad, atext, authorColors) return pieces.join(''); } - -function _analyzeLine(text, aline, apool) -{ - var line = {}; - - // identify list - var lineMarker = 0; - line.listLevel = 0; - if (aline) - { - var opIter = Changeset.opIterator(aline); - if (opIter.hasNext()) - { - var listType = Changeset.opAttributeValue(opIter.next(), 'list', apool); - if (listType) - { - lineMarker = 1; - listType = /([a-z]+)([12345678])/.exec(listType); - if (listType) - { - line.listTypeName = listType[1]; - line.listLevel = Number(listType[2]); - } - } - } - } - if (lineMarker) - { - line.text = text.substring(1); - line.aline = Changeset.subattribution(aline, 1); - } - else - { - line.text = text; - line.aline = aline; - } - - return line; -} +exports.getTXTFromAtext = getTXTFromAtext; exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) { @@ -354,72 +298,3 @@ function _encodeWhitespace(s) { return "&#" +c.charCodeAt(0) + ";" }); } - -// copied from ACE -function _processSpaces(s) -{ - var doesWrap = true; - if (s.indexOf("<") < 0 && !doesWrap) - { - // short-cut - return s.replace(/ /g, ' '); - } - var parts = []; - s.replace(/<[^>]*>?| |[^ <]+/g, function (m) - { - parts.push(m); - }); - if (doesWrap) - { - var endOfLine = true; - var beforeSpace = false; - // last space in a run is normal, others are nbsp, - // end of line is nbsp - for (var i = parts.length - 1; i >= 0; i--) - { - var p = parts[i]; - if (p == " ") - { - if (endOfLine || beforeSpace) parts[i] = ' '; - endOfLine = false; - beforeSpace = true; - } - else if (p.charAt(0) != "<") - { - endOfLine = false; - beforeSpace = false; - } - } - // beginning of line is nbsp - for (var i = 0; i < parts.length; i++) - { - var p = parts[i]; - if (p == " ") - { - parts[i] = ' '; - break; - } - else if (p.charAt(0) != "<") - { - break; - } - } - } - else - { - for (var i = 0; i < parts.length; i++) - { - var p = parts[i]; - if (p == " ") - { - parts[i] = ' '; - } - } - } - return parts.join(''); -} - - -// copied from ACE -var _REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; -var _REGEX_SPACE = /\s/; From 0b5c948549a03e858302bb9740529741c3be4e22 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Feb 2013 19:45:46 +0000 Subject: [PATCH 008/463] Move code from Html export to a Helper file --- src/node/utils/ExportHelper.js | 139 +++++++++++++++++++++++++++++++ src/node/utils/ExportHtml.js | 144 +-------------------------------- src/node/utils/ExportTxt.js | 8 +- 3 files changed, 147 insertions(+), 144 deletions(-) create mode 100644 src/node/utils/ExportHelper.js diff --git a/src/node/utils/ExportHelper.js b/src/node/utils/ExportHelper.js new file mode 100644 index 00000000..030b0dc7 --- /dev/null +++ b/src/node/utils/ExportHelper.js @@ -0,0 +1,139 @@ +/** + * Helpers for export requests + */ + +/* + * 2011 Peter 'Pita' Martischka (Primary Technology Ltd) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var async = require("async"); +var Changeset = require("ep_etherpad-lite/static/js/Changeset"); +var padManager = require("../db/PadManager"); +var ERR = require("async-stacktrace"); +var Security = require('ep_etherpad-lite/static/js/security'); +var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); + +exports.getPadPlainText = function(pad, revNum){ + var atext = ((revNum !== undefined) ? pad.getInternalRevisionAText(revNum) : pad.atext()); + var textLines = atext.text.slice(0, -1).split('\n'); + var attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); + var apool = pad.pool(); + + var pieces = []; + for (var i = 0; i < textLines.length; i++){ + var line = _analyzeLine(textLines[i], attribLines[i], apool); + if (line.listLevel){ + var numSpaces = line.listLevel * 2 - 1; + var bullet = '*'; + pieces.push(new Array(numSpaces + 1).join(' '), bullet, ' ', line.text, '\n'); + } + else{ + pieces.push(line.text, '\n'); + } + } + + return pieces.join(''); +} + +// copied from ACE +exports._processSpaces = function(s){ + var doesWrap = true; + if (s.indexOf("<") < 0 && !doesWrap){ + // short-cut + return s.replace(/ /g, ' '); + } + var parts = []; + s.replace(/<[^>]*>?| |[^ <]+/g, function (m){ + parts.push(m); + }); + if (doesWrap){ + var endOfLine = true; + var beforeSpace = false; + // last space in a run is normal, others are nbsp, + // end of line is nbsp + for (var i = parts.length - 1; i >= 0; i--){ + var p = parts[i]; + if (p == " "){ + if (endOfLine || beforeSpace) parts[i] = ' '; + endOfLine = false; + beforeSpace = true; + } + else if (p.charAt(0) != "<"){ + endOfLine = false; + beforeSpace = false; + } + } + // beginning of line is nbsp + for (var i = 0; i < parts.length; i++){ + var p = parts[i]; + if (p == " "){ + parts[i] = ' '; + break; + } + else if (p.charAt(0) != "<"){ + break; + } + } + } + else + { + for (var i = 0; i < parts.length; i++){ + var p = parts[i]; + if (p == " "){ + parts[i] = ' '; + } + } + } + return parts.join(''); +} + + +exports._analyzeLine = function(text, aline, apool){ + var line = {}; + + // identify list + var lineMarker = 0; + line.listLevel = 0; + if (aline){ + var opIter = Changeset.opIterator(aline); + if (opIter.hasNext()){ + var listType = Changeset.opAttributeValue(opIter.next(), 'list', apool); + if (listType){ + lineMarker = 1; + listType = /([a-z]+)([12345678])/.exec(listType); + if (listType){ + line.listTypeName = listType[1]; + line.listLevel = Number(listType[2]); + } + } + } + } + if (lineMarker){ + line.text = text.substring(1); + line.aline = Changeset.subattribution(aline, 1); + } + else{ + line.text = text; + line.aline = aline; + } + return line; +} + + +exports._encodeWhitespace = function(s){ + return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ + return "&#" +c.charCodeAt(0) + ";" + }); +} diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 74b6546f..a54f566c 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -21,31 +21,10 @@ var padManager = require("../db/PadManager"); var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); -function getPadPlainText(pad, revNum) -{ - var atext = ((revNum !== undefined) ? pad.getInternalRevisionAText(revNum) : pad.atext()); - var textLines = atext.text.slice(0, -1).split('\n'); - var attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); - var apool = pad.pool(); - - var pieces = []; - for (var i = 0; i < textLines.length; i++) - { - var line = _analyzeLine(textLines[i], attribLines[i], apool); - if (line.listLevel) - { - var numSpaces = line.listLevel * 2 - 1; - var bullet = '*'; - pieces.push(new Array(numSpaces + 1).join(' '), bullet, ' ', line.text, '\n'); - } - else - { - pieces.push(line.text, '\n'); - } - } - - return pieces.join(''); -} +var getPadPlainText = require('./ExportHelper').getPadPlainText +var _processSpaces = require('./ExportHelper')._processSpaces; +var _analyzeLine = require('./ExportHelper')._analyzeLine; +var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; function getPadHTML(pad, revNum, callback) { @@ -92,7 +71,6 @@ function getPadHTML(pad, revNum, callback) exports.getPadHTML = getPadHTML; exports.getHTMLFromAtext = getHTMLFromAtext; -exports.getPadPlainText = getPadPlainText; function getHTMLFromAtext(pad, atext, authorColors) { @@ -504,47 +482,6 @@ function getHTMLFromAtext(pad, atext, authorColors) return pieces.join(''); } -function _analyzeLine(text, aline, apool) -{ - var line = {}; - - // identify list - var lineMarker = 0; - line.listLevel = 0; - if (aline) - { - var opIter = Changeset.opIterator(aline); - if (opIter.hasNext()) - { - var listType = Changeset.opAttributeValue(opIter.next(), 'list', apool); - if (listType) - { - lineMarker = 1; - listType = /([a-z]+)([12345678])/.exec(listType); - if (listType) - { - line.listTypeName = listType[1]; - line.listLevel = Number(listType[2]); - } - } - } - } - if (lineMarker) - { - line.text = text.substring(1); - line.aline = Changeset.subattribution(aline, 1); - } - else - { - line.text = text; - line.aline = aline; - } - - return line; -} - -exports._analyzeLine = _analyzeLine; - exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) { padManager.getPad(padId, function (err, pad) @@ -581,79 +518,6 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) }); } -function _encodeWhitespace(s) { - return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c) - { - return "&#" +c.charCodeAt(0) + ";" - }); -} -exports._encodeWhitespace = _encodeWhitespace; - -// copied from ACE -function _processSpaces(s) -{ - var doesWrap = true; - if (s.indexOf("<") < 0 && !doesWrap) - { - // short-cut - return s.replace(/ /g, ' '); - } - var parts = []; - s.replace(/<[^>]*>?| |[^ <]+/g, function (m) - { - parts.push(m); - }); - if (doesWrap) - { - var endOfLine = true; - var beforeSpace = false; - // last space in a run is normal, others are nbsp, - // end of line is nbsp - for (var i = parts.length - 1; i >= 0; i--) - { - var p = parts[i]; - if (p == " ") - { - if (endOfLine || beforeSpace) parts[i] = ' '; - endOfLine = false; - beforeSpace = true; - } - else if (p.charAt(0) != "<") - { - endOfLine = false; - beforeSpace = false; - } - } - // beginning of line is nbsp - for (var i = 0; i < parts.length; i++) - { - var p = parts[i]; - if (p == " ") - { - parts[i] = ' '; - break; - } - else if (p.charAt(0) != "<") - { - break; - } - } - } - else - { - for (var i = 0; i < parts.length; i++) - { - var p = parts[i]; - if (p == " ") - { - parts[i] = ' '; - } - } - } - return parts.join(''); -} - -exports._processSpaces = _processSpaces; // copied from ACE var _REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index edcccfd7..0f3b1a63 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -21,10 +21,10 @@ var padManager = require("../db/PadManager"); var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); -var getPadPlainText = require('./ExportHtml').getPadPlainText; -var _processSpaces = require('./ExportHtml')._processSpaces; -var _analyzeLine = require('./ExportHtml')._analyzeLine; -var _encodeWhitespace = require('./ExportHtml')._encodeWhitespace; +var getPadPlainText = require('./ExportHelper').getPadPlainText; +var _processSpaces = require('./ExportHelper')._processSpaces; +var _analyzeLine = require('./ExportHelper')._analyzeLine; +var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; // This is slightly different than the HTML method as it passes the output to getTXTFromAText function getPadTXT(pad, revNum, callback) From da246d183daa1a5a012937f0dc0f54ca96873553 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Feb 2013 19:47:53 +0000 Subject: [PATCH 009/463] Correct license header --- src/node/utils/ExportTxt.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 0f3b1a63..30673a98 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -1,5 +1,9 @@ /** - * Copyright 2009 Google Inc. + * TXT export + */ + +/* + * 2013 John McLear * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +18,6 @@ * limitations under the License. */ - var async = require("async"); var Changeset = require("ep_etherpad-lite/static/js/Changeset"); var padManager = require("../db/PadManager"); From e855bafdf9e5d6217d929e1f4d1933e673e3acac Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Tue, 12 Feb 2013 21:47:40 +0100 Subject: [PATCH 010/463] Update src/node/hooks/express/apicalls.js --- src/node/hooks/express/apicalls.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/node/hooks/express/apicalls.js b/src/node/hooks/express/apicalls.js index e57e1d35..0971a877 100644 --- a/src/node/hooks/express/apicalls.js +++ b/src/node/hooks/express/apicalls.js @@ -57,4 +57,9 @@ exports.expressCreateServer = function (hook_name, args, cb) { res.end("OK"); }); }); + + //Provide a possibility to query the latest available API version + args.app.get('/api', function (req, res) { + res.json({"currentVersion" : apiHandler.latestApiVersion}); + }); } From 8c9ad6ee504bc1aa8d057118354a4eaacb077a50 Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Tue, 12 Feb 2013 21:50:14 +0100 Subject: [PATCH 011/463] Update src/node/handler/APIHandler.js --- src/node/handler/APIHandler.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 9f86277a..8be5b5fe 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -216,6 +216,9 @@ var version = } }; +// set the latest available API version here +exports.latestApiVersion = '1.2.7'; + /** * Handles a HTTP API call * @param functionName the name of the called function From fde10052ca5d9c80bc0837e00bdd87a2eeff4c72 Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Tue, 12 Feb 2013 21:57:01 +0100 Subject: [PATCH 012/463] Update doc/api/http_api.md Updated --- doc/api/http_api.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/api/http_api.md b/doc/api/http_api.md index 0543ef71..7e05ff86 100644 --- a/doc/api/http_api.md +++ b/doc/api/http_api.md @@ -61,7 +61,9 @@ Portal submits content into new blog post ## Usage ### API version -The latest version is `1.2` +The latest version is `1.2.7` + +The current version can be queried via /api. ### Request Format From 5c9d081391183deee1eccccea88d194ae5952341 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 01:33:22 +0000 Subject: [PATCH 013/463] Begin supporting the database but still have a problem where it generates new key on restart... --- src/node/db/SessionManager.js | 2 +- src/node/db/SessionStore.js | 82 +++++++++++++++++++++++++++++ src/node/hooks/express/webaccess.js | 13 +++-- 3 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 src/node/db/SessionStore.js diff --git a/src/node/db/SessionManager.js b/src/node/db/SessionManager.js index 5ce4f748..60e0a7ac 100644 --- a/src/node/db/SessionManager.js +++ b/src/node/db/SessionManager.js @@ -1,5 +1,5 @@ /** - * The Session Manager provides functions to manage session in the database + * The Session Manager provides functions to manage session in the database, it only provides session management for sessions created by the API */ /* diff --git a/src/node/db/SessionStore.js b/src/node/db/SessionStore.js new file mode 100644 index 00000000..09ea7333 --- /dev/null +++ b/src/node/db/SessionStore.js @@ -0,0 +1,82 @@ + /* + * Stores session data in the database + * Source; https://github.com/edy-b/SciFlowWriter/blob/develop/available_plugins/ep_sciflowwriter/db/DirtyStore.js + * This is not used for authors that are created via the API at current + */ + +var Store = require('ep_etherpad-lite/node_modules/connect/lib/middleware/session/store'), + utils = require('ep_etherpad-lite/node_modules/connect/lib/utils'), + Session = require('ep_etherpad-lite/node_modules/connect/lib/middleware/session/session'), + db = require('ep_etherpad-lite/node/db/DB').db, + log4js = require('ep_etherpad-lite/node_modules/log4js'), + messageLogger = log4js.getLogger("SessionStore"); + +var SessionStore = module.exports = function SessionStore() {}; + +SessionStore.prototype.__proto__ = Store.prototype; + +SessionStore.prototype.get = function(sid, fn){ + messageLogger.debug('GET ' + sid); + var self = this; + db.get("sessionstorage:" + sid, function (err, sess) + { + if (sess) { + sess.cookie.expires = 'string' == typeof sess.cookie.expires ? new Date(sess.cookie.expires) : sess.cookie.expires; + if (!sess.cookie.expires || new Date() < expires) { + fn(null, sess); + } else { + self.destroy(sid, fn); + } + } else { + fn(); + } + }); +}; + +SessionStore.prototype.set = function(sid, sess, fn){ + messageLogger.debug('SET ' + sid); + db.set("sessionstorage:" + sid, sess); + process.nextTick(function(){ + if(fn) fn(); + }); +}; + +SessionStore.prototype.destroy = function(sid, fn){ + messageLogger.debug('DESTROY ' + sid); + db.remove("sessionstorage:" + sid); + process.nextTick(function(){ + if(fn) fn(); + }); +}; + +SessionStore.prototype.all = function(fn){ + messageLogger.debug('ALL'); + var sessions = []; + db.forEach(function(key, value){ + if (key.substr(0,15) === "sessionstorage:") { + sessions.push(value); + } + }); + fn(null, sessions); +}; + +SessionStore.prototype.clear = function(fn){ + messageLogger.debug('CLEAR'); + db.forEach(function(key, value){ + if (key.substr(0,15) === "sessionstorage:") { + db.db.remove("session:" + key); + } + }); + if(fn) fn(); +}; + +SessionStore.prototype.length = function(fn){ + messageLogger.debug('LENGTH'); + var i = 0; + db.forEach(function(key, value){ + if (key.substr(0,15) === "sessionstorage:") { + i++; + } + }); + fn(null, i); +}; diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index 50323ef6..4a2f4664 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -4,7 +4,7 @@ var httpLogger = log4js.getLogger("http"); var settings = require('../../utils/Settings'); var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); - +var ueberStore = require('../../db/SessionStore'); //checks for basic http auth exports.basicAuth = function (req, res, next) { @@ -102,15 +102,14 @@ exports.expressConfigure = function (hook_name, args, cb) { * handling it cleaner :) */ if (!exports.sessionStore) { - exports.sessionStore = new express.session.MemoryStore(); - exports.secret = randomString(32); + exports.sessionStore = new ueberStore(); + exports.secret = randomString(32); // Isn't this being reset each time the server spawns? } - - args.app.use(express.cookieParser(exports.secret)); + args.app.use(express.cookieParser(exports.secret)); args.app.sessionStore = exports.sessionStore; - args.app.use(express.session({store: args.app.sessionStore, - key: 'express_sid' })); + args.app.use(express.session({secret: exports.secret, store: args.app.sessionStore, key: 'express_sid' })); args.app.use(exports.basicAuth); } + From a4e5adab3e42d6436d89a1155ecf303dabc2dd9d Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 02:47:24 +0000 Subject: [PATCH 014/463] Update Ueber DB to fix MySQL Bug! --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 03df87f9..5b21334d 100644 --- a/src/package.json +++ b/src/package.json @@ -16,7 +16,7 @@ "require-kernel" : "1.0.5", "resolve" : "0.2.x", "socket.io" : "0.9.x", - "ueberDB" : "0.1.91", + "ueberDB" : "0.1.92", "async" : "0.1.x", "express" : "3.x", "connect" : "2.4.x", From 500f9b8b48cb774c7ce73bf15a73c862fe0c4f11 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Wed, 13 Feb 2013 15:25:27 +0000 Subject: [PATCH 015/463] Fixed typo thats made server hang --- src/node/handler/PadMessageHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 7cd945af..eaf24b7a 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1429,7 +1429,7 @@ function composePadChangesets(padId, startNum, endNum, callback) */ exports.padUsersCount = function (padID, callback) { callback(null, { - padUsersCount: socketio.sockets.clients(padId).length + padUsersCount: socketio.sockets.clients(padID).length }); } From d3f730e2ba060b0d2b26d03b55088f266fefb1b9 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 18:01:15 +0000 Subject: [PATCH 016/463] fix various issues dont stop random *'s appearing --- src/node/utils/ExportHelper.js | 52 -------------------------------- src/node/utils/ExportHtml.js | 55 +++++++++++++++++++++++++++++++++- src/node/utils/ExportTxt.js | 19 +++++------- 3 files changed, 62 insertions(+), 64 deletions(-) diff --git a/src/node/utils/ExportHelper.js b/src/node/utils/ExportHelper.js index 030b0dc7..a939a8b6 100644 --- a/src/node/utils/ExportHelper.js +++ b/src/node/utils/ExportHelper.js @@ -47,58 +47,6 @@ exports.getPadPlainText = function(pad, revNum){ return pieces.join(''); } -// copied from ACE -exports._processSpaces = function(s){ - var doesWrap = true; - if (s.indexOf("<") < 0 && !doesWrap){ - // short-cut - return s.replace(/ /g, ' '); - } - var parts = []; - s.replace(/<[^>]*>?| |[^ <]+/g, function (m){ - parts.push(m); - }); - if (doesWrap){ - var endOfLine = true; - var beforeSpace = false; - // last space in a run is normal, others are nbsp, - // end of line is nbsp - for (var i = parts.length - 1; i >= 0; i--){ - var p = parts[i]; - if (p == " "){ - if (endOfLine || beforeSpace) parts[i] = ' '; - endOfLine = false; - beforeSpace = true; - } - else if (p.charAt(0) != "<"){ - endOfLine = false; - beforeSpace = false; - } - } - // beginning of line is nbsp - for (var i = 0; i < parts.length; i++){ - var p = parts[i]; - if (p == " "){ - parts[i] = ' '; - break; - } - else if (p.charAt(0) != "<"){ - break; - } - } - } - else - { - for (var i = 0; i < parts.length; i++){ - var p = parts[i]; - if (p == " "){ - parts[i] = ' '; - } - } - } - return parts.join(''); -} - exports._analyzeLine = function(text, aline, apool){ var line = {}; diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index a54f566c..585694d4 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -22,7 +22,6 @@ var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText -var _processSpaces = require('./ExportHelper')._processSpaces; var _analyzeLine = require('./ExportHelper')._analyzeLine; var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; @@ -543,3 +542,57 @@ function _findURLs(text) return urls; } + + +// copied from ACE +function _processSpaces(s){ + var doesWrap = true; + if (s.indexOf("<") < 0 && !doesWrap){ + // short-cut + return s.replace(/ /g, ' '); + } + var parts = []; + s.replace(/<[^>]*>?| |[^ <]+/g, function (m){ + parts.push(m); + }); + if (doesWrap){ + var endOfLine = true; + var beforeSpace = false; + // last space in a run is normal, others are nbsp, + // end of line is nbsp + for (var i = parts.length - 1; i >= 0; i--){ + var p = parts[i]; + if (p == " "){ + if (endOfLine || beforeSpace) parts[i] = ' '; + endOfLine = false; + beforeSpace = true; + } + else if (p.charAt(0) != "<"){ + endOfLine = false; + beforeSpace = false; + } + } + // beginning of line is nbsp + for (var i = 0; i < parts.length; i++){ + var p = parts[i]; + if (p == " "){ + parts[i] = ' '; + break; + } + else if (p.charAt(0) != "<"){ + break; + } + } + } + else + { + for (var i = 0; i < parts.length; i++){ + var p = parts[i]; + if (p == " "){ + parts[i] = ' '; + } + } + } + return parts.join(''); +} + diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 30673a98..05847f16 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -25,7 +25,6 @@ var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText; -var _processSpaces = require('./ExportHelper')._processSpaces; var _analyzeLine = require('./ExportHelper')._analyzeLine; var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; @@ -204,12 +203,12 @@ function getTXTFromAtext(pad, atext, authorColors) { if (propVals[i] === ENTER || propVals[i] === STAY) { - emitOpenTag(i); propVals[i] = true; } } // propVals is now all {true,false} again } // end if (propChanged) + var chars = o.chars; if (o.lines) { @@ -217,16 +216,15 @@ function getTXTFromAtext(pad, atext, authorColors) } var s = taker.take(chars); - - //removes the characters with the code 12. Don't know where they come - //from but they break the abiword parser and are completly useless - s = s.replace(String.fromCharCode(12), ""); + + // removes the characters with the code 12. Don't know where they come + // from but they break the abiword parser and are completly useless + // s = s.replace(String.fromCharCode(12), ""); // remove * from s, it's just not needed on a blank line.. This stops // plugins from being able to display * at the beginning of a line - s = s.replace("*", ""); - - // assem.append(_encodeWhitespace(Security.escapeHTML(s))); + // s = s.replace("*", ""); // Then remove it + assem.append(_encodeWhitespace(s)); } // end iteration over spans in line @@ -242,8 +240,7 @@ function getTXTFromAtext(pad, atext, authorColors) } // end processNextChars processNextChars(text.length - idx); - - return _processSpaces(assem.toString()); + return(assem.toString()); } // end getLineHTML var pieces = [css]; From be56272e66f4921f68fe12cd05cbaad8eb54894b Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 18:30:55 +0000 Subject: [PATCH 017/463] allow non ascii chars in txt export --- src/node/utils/ExportHelper.js | 6 +- src/node/utils/ExportHtml.js | 7 +- src/node/utils/ExportTxt.js | 10 +- src/node/utils/padDiffHTML.js | 554 +++++++++++++++++++++++++++++++++ 4 files changed, 562 insertions(+), 15 deletions(-) create mode 100644 src/node/utils/padDiffHTML.js diff --git a/src/node/utils/ExportHelper.js b/src/node/utils/ExportHelper.js index a939a8b6..41d440f3 100644 --- a/src/node/utils/ExportHelper.js +++ b/src/node/utils/ExportHelper.js @@ -80,8 +80,4 @@ exports._analyzeLine = function(text, aline, apool){ } -exports._encodeWhitespace = function(s){ - return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ - return "&#" +c.charCodeAt(0) + ";" - }); -} + diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 585694d4..51a4b2c3 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -23,7 +23,6 @@ var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText var _analyzeLine = require('./ExportHelper')._analyzeLine; -var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; function getPadHTML(pad, revNum, callback) { @@ -596,3 +595,9 @@ function _processSpaces(s){ return parts.join(''); } +function _encodeWhitespace(s){ + return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ + return "&#" +c.charCodeAt(0) + ";" + }); +} + diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 05847f16..4a3e458b 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -26,7 +26,6 @@ var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText; var _analyzeLine = require('./ExportHelper')._analyzeLine; -var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; // This is slightly different than the HTML method as it passes the output to getTXTFromAText function getPadTXT(pad, revNum, callback) @@ -112,7 +111,6 @@ function getTXTFromAtext(pad, atext, authorColors) var taker = Changeset.stringIterator(text); var assem = Changeset.stringAssembler(); var openTags = []; - var idx = 0; function processNextChars(numChars) @@ -225,7 +223,7 @@ function getTXTFromAtext(pad, atext, authorColors) // plugins from being able to display * at the beginning of a line // s = s.replace("*", ""); // Then remove it - assem.append(_encodeWhitespace(s)); + assem.append(s); } // end iteration over spans in line var tags2close = []; @@ -292,9 +290,3 @@ exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) }); } -function _encodeWhitespace(s) { - return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c) - { - return "&#" +c.charCodeAt(0) + ";" - }); -} diff --git a/src/node/utils/padDiffHTML.js b/src/node/utils/padDiffHTML.js new file mode 100644 index 00000000..00e96728 --- /dev/null +++ b/src/node/utils/padDiffHTML.js @@ -0,0 +1,554 @@ +var Changeset = require("../../static/js/Changeset"); +var async = require("async"); +var exportHtml = require('./ExportHtml'); + +function padDiffHTML (pad, fromRev, toRev){ + //check parameters + if(!pad || !pad.id || !pad.atext || !pad.pool) + { + throw new Error('Invalid pad'); + } + + var range = pad.getValidRevisionRange(fromRev, toRev); + if(!range) { throw new Error('Invalid revision range.' + + ' startRev: ' + fromRev + + ' endRev: ' + toRev); } + + this._pad = pad; + this._fromRev = range.startRev; + this._toRev = range.endRev; + this._html = null; + this._authors = []; +} + +padDiffHTML.prototype._isClearAuthorship = function(changeset){ + //unpack + var unpacked = Changeset.unpack(changeset); + + //check if there is nothing in the charBank + if(unpacked.charBank !== "") + return false; + + //check if oldLength == newLength + if(unpacked.oldLen !== unpacked.newLen) + return false; + + //lets iterator over the operators + var iterator = Changeset.opIterator(unpacked.ops); + + //get the first operator, this should be a clear operator + var clearOperator = iterator.next(); + + //check if there is only one operator + if(iterator.hasNext() === true) + return false; + + //check if this operator doesn't change text + if(clearOperator.opcode !== "=") + return false; + + //check that this operator applys to the complete text + //if the text ends with a new line, its exactly one character less, else it has the same length + if(clearOperator.chars !== unpacked.oldLen-1 && clearOperator.chars !== unpacked.oldLen) + return false; + + var attributes = []; + Changeset.eachAttribNumber(changeset, function(attrNum){ + attributes.push(attrNum); + }); + + //check that this changeset uses only one attribute + if(attributes.length !== 1) + return false; + + var appliedAttribute = this._pad.pool.getAttrib(attributes[0]); + + //check if the applied attribute is an anonymous author attribute + if(appliedAttribute[0] !== "author" || appliedAttribute[1] !== "") + return false; + + return true; +} + +padDiffHTML.prototype._createClearAuthorship = function(rev, callback){ + var self = this; + this._pad.getInternalRevisionAText(rev, function(err, atext){ + if(err){ + return callback(err); + } + + //build clearAuthorship changeset + var builder = Changeset.builder(atext.text.length); + builder.keepText(atext.text, [['author','']], self._pad.pool); + var changeset = builder.toString(); + + callback(null, changeset); + }); +} + +padDiffHTML.prototype._createClearStartAtext = function(rev, callback){ + var self = this; + + //get the atext of this revision + this._pad.getInternalRevisionAText(rev, function(err, atext){ + if(err){ + return callback(err); + } + + //create the clearAuthorship changeset + self._createClearAuthorship(rev, function(err, changeset){ + if(err){ + return callback(err); + } + + //apply the clearAuthorship changeset + var newAText = Changeset.applyToAText(changeset, atext, self._pad.pool); + + callback(null, newAText); + }); + }); +} + +padDiffHTML.prototype._getChangesetsInBulk = function(startRev, count, callback) { + var self = this; + + //find out which revisions we need + var revisions = []; + for(var i=startRev;i<(startRev+count) && i<=this._pad.head;i++){ + revisions.push(i); + } + + var changesets = [], authors = []; + + //get all needed revisions + async.forEach(revisions, function(rev, callback){ + self._pad.getRevision(rev, function(err, revision){ + if(err){ + return callback(err) + } + + var arrayNum = rev-startRev; + + changesets[arrayNum] = revision.changeset; + authors[arrayNum] = revision.meta.author; + + callback(); + }); + }, function(err){ + callback(err, changesets, authors); + }); +} + +padDiffHTML.prototype._addAuthors = function(authors) { + var self = this; + //add to array if not in the array + authors.forEach(function(author){ + if(self._authors.indexOf(author) == -1){ + self._authors.push(author); + } + }); +} + +padDiffHTML.prototype._createDiffAtext = function(callback) { + var self = this; + var bulkSize = 100; + + //get the cleaned startAText + self._createClearStartAtext(self._fromRev, function(err, atext){ + if(err) { return callback(err); } + + var superChangeset = null; + + var rev = self._fromRev + 1; + + //async while loop + async.whilst( + //loop condition + function () { return rev <= self._toRev; }, + + //loop body + function (callback) { + //get the bulk + self._getChangesetsInBulk(rev,bulkSize,function(err, changesets, authors){ + var addedAuthors = []; + + //run trough all changesets + for(var i=0;i= curChar) { + curLineNextOp.chars -= (curChar - indexIntoLine); + done = true; + } else { + indexIntoLine += curLineNextOp.chars; + } + } + } + + while (numChars > 0) { + if ((!curLineNextOp.chars) && (!curLineOpIter.hasNext())) { + curLine++; + curChar = 0; + curLineOpIterLine = curLine; + curLineNextOp.chars = 0; + curLineOpIter = Changeset.opIterator(alines_get(curLine)); + } + if (!curLineNextOp.chars) { + curLineOpIter.next(curLineNextOp); + } + var charsToUse = Math.min(numChars, curLineNextOp.chars); + func(charsToUse, curLineNextOp.attribs, charsToUse == curLineNextOp.chars && curLineNextOp.lines > 0); + numChars -= charsToUse; + curLineNextOp.chars -= charsToUse; + curChar += charsToUse; + } + + if ((!curLineNextOp.chars) && (!curLineOpIter.hasNext())) { + curLine++; + curChar = 0; + } + } + + function skip(N, L) { + if (L) { + curLine += L; + curChar = 0; + } else { + if (curLineOpIter && curLineOpIterLine == curLine) { + consumeAttribRuns(N, function () {}); + } else { + curChar += N; + } + } + } + + function nextText(numChars) { + var len = 0; + var assem = Changeset.stringAssembler(); + var firstString = lines_get(curLine).substring(curChar); + len += firstString.length; + assem.append(firstString); + + var lineNum = curLine + 1; + while (len < numChars) { + var nextString = lines_get(lineNum); + len += nextString.length; + assem.append(nextString); + lineNum++; + } + + return assem.toString().substring(0, numChars); + } + + function cachedStrFunc(func) { + var cache = {}; + return function (s) { + if (!cache[s]) { + cache[s] = func(s); + } + return cache[s]; + }; + } + + var attribKeys = []; + var attribValues = []; + + //iterate over all operators of this changeset + while (csIter.hasNext()) { + var csOp = csIter.next(); + + if (csOp.opcode == '=') { + var textBank = nextText(csOp.chars); + + // decide if this equal operator is an attribution change or not. We can see this by checkinf if attribs is set. + // If the text this operator applies to is only a star, than this is a false positive and should be ignored + if (csOp.attribs && textBank != "*") { + var deletedAttrib = apool.putAttrib(["removed", true]); + var authorAttrib = apool.putAttrib(["author", ""]);; + + attribKeys.length = 0; + attribValues.length = 0; + Changeset.eachAttribNumber(csOp.attribs, function (n) { + attribKeys.push(apool.getAttribKey(n)); + attribValues.push(apool.getAttribValue(n)); + + if(apool.getAttribKey(n) === "author"){ + authorAttrib = n; + }; + }); + + var undoBackToAttribs = cachedStrFunc(function (attribs) { + var backAttribs = []; + for (var i = 0; i < attribKeys.length; i++) { + var appliedKey = attribKeys[i]; + var appliedValue = attribValues[i]; + var oldValue = Changeset.attribsAttributeValue(attribs, appliedKey, apool); + if (appliedValue != oldValue) { + backAttribs.push([appliedKey, oldValue]); + } + } + return Changeset.makeAttribsString('=', backAttribs, apool); + }); + + var oldAttribsAddition = "*" + Changeset.numToString(deletedAttrib) + "*" + Changeset.numToString(authorAttrib); + + var textLeftToProcess = textBank; + + while(textLeftToProcess.length > 0){ + //process till the next line break or process only one line break + var lengthToProcess = textLeftToProcess.indexOf("\n"); + var lineBreak = false; + switch(lengthToProcess){ + case -1: + lengthToProcess=textLeftToProcess.length; + break; + case 0: + lineBreak = true; + lengthToProcess=1; + break; + } + + //get the text we want to procceed in this step + var processText = textLeftToProcess.substr(0, lengthToProcess); + textLeftToProcess = textLeftToProcess.substr(lengthToProcess); + + if(lineBreak){ + builder.keep(1, 1); //just skip linebreaks, don't do a insert + keep for a linebreak + + //consume the attributes of this linebreak + consumeAttribRuns(1, function(){}); + } else { + //add the old text via an insert, but add a deletion attribute + the author attribute of the author who deleted it + var textBankIndex = 0; + consumeAttribRuns(lengthToProcess, function (len, attribs, endsLine) { + //get the old attributes back + var attribs = (undoBackToAttribs(attribs) || "") + oldAttribsAddition; + + builder.insert(processText.substr(textBankIndex, len), attribs); + textBankIndex += len; + }); + + builder.keep(lengthToProcess, 0); + } + } + } else { + skip(csOp.chars, csOp.lines); + builder.keep(csOp.chars, csOp.lines); + } + } else if (csOp.opcode == '+') { + builder.keep(csOp.chars, csOp.lines); + } else if (csOp.opcode == '-') { + var textBank = nextText(csOp.chars); + var textBankIndex = 0; + + consumeAttribRuns(csOp.chars, function (len, attribs, endsLine) { + builder.insert(textBank.substr(textBankIndex, len), attribs + csOp.attribs); + textBankIndex += len; + }); + } + } + + return Changeset.checkRep(builder.toString()); +}; + +//export the constructor +module.exports = padDiffHTML; From dea892213e080b7637955413222384959b3b267f Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 18:41:04 +0000 Subject: [PATCH 018/463] Revert "allow non ascii chars in txt export" This reverts commit be56272e66f4921f68fe12cd05cbaad8eb54894b. --- src/node/utils/ExportHelper.js | 6 +- src/node/utils/ExportHtml.js | 7 +- src/node/utils/ExportTxt.js | 10 +- src/node/utils/padDiffHTML.js | 554 --------------------------------- 4 files changed, 15 insertions(+), 562 deletions(-) delete mode 100644 src/node/utils/padDiffHTML.js diff --git a/src/node/utils/ExportHelper.js b/src/node/utils/ExportHelper.js index 41d440f3..a939a8b6 100644 --- a/src/node/utils/ExportHelper.js +++ b/src/node/utils/ExportHelper.js @@ -80,4 +80,8 @@ exports._analyzeLine = function(text, aline, apool){ } - +exports._encodeWhitespace = function(s){ + return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ + return "&#" +c.charCodeAt(0) + ";" + }); +} diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 51a4b2c3..585694d4 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -23,6 +23,7 @@ var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText var _analyzeLine = require('./ExportHelper')._analyzeLine; +var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; function getPadHTML(pad, revNum, callback) { @@ -595,9 +596,3 @@ function _processSpaces(s){ return parts.join(''); } -function _encodeWhitespace(s){ - return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ - return "&#" +c.charCodeAt(0) + ";" - }); -} - diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 4a3e458b..05847f16 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -26,6 +26,7 @@ var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText; var _analyzeLine = require('./ExportHelper')._analyzeLine; +var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; // This is slightly different than the HTML method as it passes the output to getTXTFromAText function getPadTXT(pad, revNum, callback) @@ -111,6 +112,7 @@ function getTXTFromAtext(pad, atext, authorColors) var taker = Changeset.stringIterator(text); var assem = Changeset.stringAssembler(); var openTags = []; + var idx = 0; function processNextChars(numChars) @@ -223,7 +225,7 @@ function getTXTFromAtext(pad, atext, authorColors) // plugins from being able to display * at the beginning of a line // s = s.replace("*", ""); // Then remove it - assem.append(s); + assem.append(_encodeWhitespace(s)); } // end iteration over spans in line var tags2close = []; @@ -290,3 +292,9 @@ exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) }); } +function _encodeWhitespace(s) { + return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c) + { + return "&#" +c.charCodeAt(0) + ";" + }); +} diff --git a/src/node/utils/padDiffHTML.js b/src/node/utils/padDiffHTML.js deleted file mode 100644 index 00e96728..00000000 --- a/src/node/utils/padDiffHTML.js +++ /dev/null @@ -1,554 +0,0 @@ -var Changeset = require("../../static/js/Changeset"); -var async = require("async"); -var exportHtml = require('./ExportHtml'); - -function padDiffHTML (pad, fromRev, toRev){ - //check parameters - if(!pad || !pad.id || !pad.atext || !pad.pool) - { - throw new Error('Invalid pad'); - } - - var range = pad.getValidRevisionRange(fromRev, toRev); - if(!range) { throw new Error('Invalid revision range.' + - ' startRev: ' + fromRev + - ' endRev: ' + toRev); } - - this._pad = pad; - this._fromRev = range.startRev; - this._toRev = range.endRev; - this._html = null; - this._authors = []; -} - -padDiffHTML.prototype._isClearAuthorship = function(changeset){ - //unpack - var unpacked = Changeset.unpack(changeset); - - //check if there is nothing in the charBank - if(unpacked.charBank !== "") - return false; - - //check if oldLength == newLength - if(unpacked.oldLen !== unpacked.newLen) - return false; - - //lets iterator over the operators - var iterator = Changeset.opIterator(unpacked.ops); - - //get the first operator, this should be a clear operator - var clearOperator = iterator.next(); - - //check if there is only one operator - if(iterator.hasNext() === true) - return false; - - //check if this operator doesn't change text - if(clearOperator.opcode !== "=") - return false; - - //check that this operator applys to the complete text - //if the text ends with a new line, its exactly one character less, else it has the same length - if(clearOperator.chars !== unpacked.oldLen-1 && clearOperator.chars !== unpacked.oldLen) - return false; - - var attributes = []; - Changeset.eachAttribNumber(changeset, function(attrNum){ - attributes.push(attrNum); - }); - - //check that this changeset uses only one attribute - if(attributes.length !== 1) - return false; - - var appliedAttribute = this._pad.pool.getAttrib(attributes[0]); - - //check if the applied attribute is an anonymous author attribute - if(appliedAttribute[0] !== "author" || appliedAttribute[1] !== "") - return false; - - return true; -} - -padDiffHTML.prototype._createClearAuthorship = function(rev, callback){ - var self = this; - this._pad.getInternalRevisionAText(rev, function(err, atext){ - if(err){ - return callback(err); - } - - //build clearAuthorship changeset - var builder = Changeset.builder(atext.text.length); - builder.keepText(atext.text, [['author','']], self._pad.pool); - var changeset = builder.toString(); - - callback(null, changeset); - }); -} - -padDiffHTML.prototype._createClearStartAtext = function(rev, callback){ - var self = this; - - //get the atext of this revision - this._pad.getInternalRevisionAText(rev, function(err, atext){ - if(err){ - return callback(err); - } - - //create the clearAuthorship changeset - self._createClearAuthorship(rev, function(err, changeset){ - if(err){ - return callback(err); - } - - //apply the clearAuthorship changeset - var newAText = Changeset.applyToAText(changeset, atext, self._pad.pool); - - callback(null, newAText); - }); - }); -} - -padDiffHTML.prototype._getChangesetsInBulk = function(startRev, count, callback) { - var self = this; - - //find out which revisions we need - var revisions = []; - for(var i=startRev;i<(startRev+count) && i<=this._pad.head;i++){ - revisions.push(i); - } - - var changesets = [], authors = []; - - //get all needed revisions - async.forEach(revisions, function(rev, callback){ - self._pad.getRevision(rev, function(err, revision){ - if(err){ - return callback(err) - } - - var arrayNum = rev-startRev; - - changesets[arrayNum] = revision.changeset; - authors[arrayNum] = revision.meta.author; - - callback(); - }); - }, function(err){ - callback(err, changesets, authors); - }); -} - -padDiffHTML.prototype._addAuthors = function(authors) { - var self = this; - //add to array if not in the array - authors.forEach(function(author){ - if(self._authors.indexOf(author) == -1){ - self._authors.push(author); - } - }); -} - -padDiffHTML.prototype._createDiffAtext = function(callback) { - var self = this; - var bulkSize = 100; - - //get the cleaned startAText - self._createClearStartAtext(self._fromRev, function(err, atext){ - if(err) { return callback(err); } - - var superChangeset = null; - - var rev = self._fromRev + 1; - - //async while loop - async.whilst( - //loop condition - function () { return rev <= self._toRev; }, - - //loop body - function (callback) { - //get the bulk - self._getChangesetsInBulk(rev,bulkSize,function(err, changesets, authors){ - var addedAuthors = []; - - //run trough all changesets - for(var i=0;i= curChar) { - curLineNextOp.chars -= (curChar - indexIntoLine); - done = true; - } else { - indexIntoLine += curLineNextOp.chars; - } - } - } - - while (numChars > 0) { - if ((!curLineNextOp.chars) && (!curLineOpIter.hasNext())) { - curLine++; - curChar = 0; - curLineOpIterLine = curLine; - curLineNextOp.chars = 0; - curLineOpIter = Changeset.opIterator(alines_get(curLine)); - } - if (!curLineNextOp.chars) { - curLineOpIter.next(curLineNextOp); - } - var charsToUse = Math.min(numChars, curLineNextOp.chars); - func(charsToUse, curLineNextOp.attribs, charsToUse == curLineNextOp.chars && curLineNextOp.lines > 0); - numChars -= charsToUse; - curLineNextOp.chars -= charsToUse; - curChar += charsToUse; - } - - if ((!curLineNextOp.chars) && (!curLineOpIter.hasNext())) { - curLine++; - curChar = 0; - } - } - - function skip(N, L) { - if (L) { - curLine += L; - curChar = 0; - } else { - if (curLineOpIter && curLineOpIterLine == curLine) { - consumeAttribRuns(N, function () {}); - } else { - curChar += N; - } - } - } - - function nextText(numChars) { - var len = 0; - var assem = Changeset.stringAssembler(); - var firstString = lines_get(curLine).substring(curChar); - len += firstString.length; - assem.append(firstString); - - var lineNum = curLine + 1; - while (len < numChars) { - var nextString = lines_get(lineNum); - len += nextString.length; - assem.append(nextString); - lineNum++; - } - - return assem.toString().substring(0, numChars); - } - - function cachedStrFunc(func) { - var cache = {}; - return function (s) { - if (!cache[s]) { - cache[s] = func(s); - } - return cache[s]; - }; - } - - var attribKeys = []; - var attribValues = []; - - //iterate over all operators of this changeset - while (csIter.hasNext()) { - var csOp = csIter.next(); - - if (csOp.opcode == '=') { - var textBank = nextText(csOp.chars); - - // decide if this equal operator is an attribution change or not. We can see this by checkinf if attribs is set. - // If the text this operator applies to is only a star, than this is a false positive and should be ignored - if (csOp.attribs && textBank != "*") { - var deletedAttrib = apool.putAttrib(["removed", true]); - var authorAttrib = apool.putAttrib(["author", ""]);; - - attribKeys.length = 0; - attribValues.length = 0; - Changeset.eachAttribNumber(csOp.attribs, function (n) { - attribKeys.push(apool.getAttribKey(n)); - attribValues.push(apool.getAttribValue(n)); - - if(apool.getAttribKey(n) === "author"){ - authorAttrib = n; - }; - }); - - var undoBackToAttribs = cachedStrFunc(function (attribs) { - var backAttribs = []; - for (var i = 0; i < attribKeys.length; i++) { - var appliedKey = attribKeys[i]; - var appliedValue = attribValues[i]; - var oldValue = Changeset.attribsAttributeValue(attribs, appliedKey, apool); - if (appliedValue != oldValue) { - backAttribs.push([appliedKey, oldValue]); - } - } - return Changeset.makeAttribsString('=', backAttribs, apool); - }); - - var oldAttribsAddition = "*" + Changeset.numToString(deletedAttrib) + "*" + Changeset.numToString(authorAttrib); - - var textLeftToProcess = textBank; - - while(textLeftToProcess.length > 0){ - //process till the next line break or process only one line break - var lengthToProcess = textLeftToProcess.indexOf("\n"); - var lineBreak = false; - switch(lengthToProcess){ - case -1: - lengthToProcess=textLeftToProcess.length; - break; - case 0: - lineBreak = true; - lengthToProcess=1; - break; - } - - //get the text we want to procceed in this step - var processText = textLeftToProcess.substr(0, lengthToProcess); - textLeftToProcess = textLeftToProcess.substr(lengthToProcess); - - if(lineBreak){ - builder.keep(1, 1); //just skip linebreaks, don't do a insert + keep for a linebreak - - //consume the attributes of this linebreak - consumeAttribRuns(1, function(){}); - } else { - //add the old text via an insert, but add a deletion attribute + the author attribute of the author who deleted it - var textBankIndex = 0; - consumeAttribRuns(lengthToProcess, function (len, attribs, endsLine) { - //get the old attributes back - var attribs = (undoBackToAttribs(attribs) || "") + oldAttribsAddition; - - builder.insert(processText.substr(textBankIndex, len), attribs); - textBankIndex += len; - }); - - builder.keep(lengthToProcess, 0); - } - } - } else { - skip(csOp.chars, csOp.lines); - builder.keep(csOp.chars, csOp.lines); - } - } else if (csOp.opcode == '+') { - builder.keep(csOp.chars, csOp.lines); - } else if (csOp.opcode == '-') { - var textBank = nextText(csOp.chars); - var textBankIndex = 0; - - consumeAttribRuns(csOp.chars, function (len, attribs, endsLine) { - builder.insert(textBank.substr(textBankIndex, len), attribs + csOp.attribs); - textBankIndex += len; - }); - } - } - - return Changeset.checkRep(builder.toString()); -}; - -//export the constructor -module.exports = padDiffHTML; From aefd8d8d0dd33a93a4a930816555332f66156c47 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 18:45:45 +0000 Subject: [PATCH 019/463] nice chars n no cruft --- src/node/utils/ExportTxt.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index 05847f16..c57424f1 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -26,7 +26,6 @@ var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var getPadPlainText = require('./ExportHelper').getPadPlainText; var _analyzeLine = require('./ExportHelper')._analyzeLine; -var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; // This is slightly different than the HTML method as it passes the output to getTXTFromAText function getPadTXT(pad, revNum, callback) @@ -225,7 +224,7 @@ function getTXTFromAtext(pad, atext, authorColors) // plugins from being able to display * at the beginning of a line // s = s.replace("*", ""); // Then remove it - assem.append(_encodeWhitespace(s)); + assem.append(s); } // end iteration over spans in line var tags2close = []; @@ -292,9 +291,3 @@ exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) }); } -function _encodeWhitespace(s) { - return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c) - { - return "&#" +c.charCodeAt(0) + ";" - }); -} From 1607af87531eb8bbaf76e82ff1e79b2cdff0e6a3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 20:12:46 +0000 Subject: [PATCH 020/463] Bitcoin yo. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e254b81d..732a13d1 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,7 @@ Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and mak # Donate! * [Flattr] (http://flattr.com/thing/71378/Etherpad-Foundation) * Paypal - Press the donate button on [etherpad.org](http://etherpad.org) +* Bitcoin - (https://coinbase.com/checkouts/1e572bf8a82e4663499f7f1f66c2d15a) # License [Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html) From c3972bcb87ccd9ac5fe0129a6a0dfe724f2be9ae Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 20:14:15 +0000 Subject: [PATCH 021/463] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 732a13d1..fa0da363 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and mak # Donate! * [Flattr] (http://flattr.com/thing/71378/Etherpad-Foundation) * Paypal - Press the donate button on [etherpad.org](http://etherpad.org) -* Bitcoin - (https://coinbase.com/checkouts/1e572bf8a82e4663499f7f1f66c2d15a) +* [Bitcoin] (https://coinbase.com/checkouts/1e572bf8a82e4663499f7f1f66c2d15a) # License [Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html) From efce99c3a13c6a406c83d537d2c18b0db7d1ec2c Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 21:51:09 +0000 Subject: [PATCH 022/463] session key in settings file OR generate temp key for instance --- settings.json.template | 4 ++++ src/node/hooks/express/webaccess.js | 2 +- src/node/utils/Settings.js | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/settings.json.template b/settings.json.template index 4b18d780..28f0192e 100644 --- a/settings.json.template +++ b/settings.json.template @@ -15,6 +15,10 @@ "ip": "0.0.0.0", "port" : 9001, + // Session Key, used for reconnecting user sessions + // Set this to a secure string at least 10 characters long. Do not share this value. + "sessionKey" : "", + /* // Node native SSL support // this is disabled by default diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index 4a2f4664..c39f91da 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -103,7 +103,7 @@ exports.expressConfigure = function (hook_name, args, cb) { if (!exports.sessionStore) { exports.sessionStore = new ueberStore(); - exports.secret = randomString(32); // Isn't this being reset each time the server spawns? + exports.secret = settings.sessionKey; // Isn't this being reset each time the server spawns? } args.app.use(express.cookieParser(exports.secret)); diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 8435ab2c..67e748bb 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -26,6 +26,8 @@ var argv = require('./Cli').argv; var npm = require("npm/lib/npm.js"); var vm = require('vm'); var log4js = require("log4js"); +var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; + /* Root path of the installation */ exports.root = path.normalize(path.join(npm.dir, "..")); @@ -112,6 +114,11 @@ exports.loglevel = "INFO"; */ exports.logconfig = { appenders: [{ type: "console" }]}; +/* +* Session Key, do not sure this. +*/ +exports.sessionKey = false; + /* This setting is used if you need authentication and/or * authorization. Note: /admin always requires authentication, and * either authorization by a module, or a user with is_admin set */ @@ -132,8 +139,6 @@ exports.abiwordAvailable = function() } } - - exports.reloadSettings = function reloadSettings() { // Discover where the settings file lives var settingsFilename = argv.settings || "settings.json"; @@ -184,6 +189,11 @@ exports.reloadSettings = function reloadSettings() { log4js.setGlobalLogLevel(exports.loglevel);//set loglevel log4js.replaceConsole(); + if(!exports.sessionKey){ // If the secretKey isn't set we also create yet another unique value here + exports.sessionKey = "__bad__"+randomString(32);; + console.warn("You need to set a sessionKey value in settings.json, this will allow your users to reconnect to your Etherpad Instance if your instance restarts"); + } + if(exports.dbType === "dirty"){ console.warn("DirtyDB is used. This is fine for testing but not recommended for production.") } From 7f09ec25a27e18c45d60a3410ed568a32c15e41d Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 21:53:15 +0000 Subject: [PATCH 023/463] no need for prefix and tidy double semi --- src/node/utils/Settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 67e748bb..04404a1a 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -190,7 +190,7 @@ exports.reloadSettings = function reloadSettings() { log4js.replaceConsole(); if(!exports.sessionKey){ // If the secretKey isn't set we also create yet another unique value here - exports.sessionKey = "__bad__"+randomString(32);; + exports.sessionKey = randomString(32); console.warn("You need to set a sessionKey value in settings.json, this will allow your users to reconnect to your Etherpad Instance if your instance restarts"); } From 36814ed42b019c851356ae59065bdb7ae7975702 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Feb 2013 23:44:20 +0000 Subject: [PATCH 024/463] apply overlay and remove overlay instantly --- src/static/js/pad_connectionstatus.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/static/js/pad_connectionstatus.js b/src/static/js/pad_connectionstatus.js index c592afbd..2d9354ab 100644 --- a/src/static/js/pad_connectionstatus.js +++ b/src/static/js/pad_connectionstatus.js @@ -43,9 +43,8 @@ var padconnectionstatus = (function() status = { what: 'connected' }; - padmodals.showModal('connected'); - padmodals.hideOverlay(500); + padmodals.hideOverlay(); }, reconnecting: function() { @@ -54,7 +53,7 @@ var padconnectionstatus = (function() }; padmodals.showModal('reconnecting'); - padmodals.showOverlay(500); + padmodals.showOverlay(); }, disconnected: function(msg) { @@ -73,10 +72,11 @@ var padconnectionstatus = (function() } padmodals.showModal(k); - padmodals.showOverlay(500); + padmodals.showOverlay(); }, isFullyConnected: function() { + padmodals.hideOverlay(); return status.what == 'connected'; }, getStatus: function() From c723aefdfeb1e690282d5a5e01de7531f53a42f3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Feb 2013 01:10:47 +0000 Subject: [PATCH 025/463] when exporting HTML include html and body --- src/node/db/API.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 07141fec..9a224843 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -243,6 +243,8 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, rev, function(err, html) { if(ERR(err, callback)) return; + html = "" +html; // adds HTML head + html += ""; data = {html: html}; callback(null, data); }); @@ -253,9 +255,9 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, undefined, function (err, html) { if(ERR(err, callback)) return; - + html = "" +html; // adds HTML head + html += ""; data = {html: html}; - callback(null, data); }); } From 140ff6f1bf06c53658addc47d72c038633c8ed5e Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 15 Feb 2013 12:24:16 +0000 Subject: [PATCH 026/463] dont lose focus on key up, doesn't work yet --- src/static/js/ace2_inner.js | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 8209c9bf..d719bc08 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3539,7 +3539,6 @@ function Ace2Inner(){ { // if (DEBUG && window.DONT_INCORP) return; if (!isEditable) return; - var type = evt.type; var charCode = evt.charCode; var keyCode = evt.keyCode; @@ -3731,6 +3730,30 @@ function Ace2Inner(){ updateBrowserSelectionFromRep(); }, 200); } + + // Chrome sucks at moving the users UI to the right place when the user uses the arrow keys + // we catch these issues and fix it. + // You can replicate this bug by copy/pasting text into a pad and moving it about then using the + // arrow keys to navitgate + if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && type == 'keydown' && $.browser.chrome){ + /* Is it an event we care about? */ + var isUpArrow = evt.which === 38; + var isLeftArrow = evt.which === 38; + var newVisibleLineRange = getVisibleLineRange(); // get the current visible range + top.console.log("IM NOT UPDATING! I need a way to get the actual rep when a key is held down", rep.selStart[0]); + if(isUpArrow || isLeftArrow){ // was it an up arrow or left arrow? + var lineNum = rep.selStart[0]; // Get the current Line Number IE 84 + var caretIsVisible = (lineNum > newVisibleLineRange[0]); // Is the cursor in the visible Range IE ie 84 > 14? + if(!caretIsVisible){ // is the cursor no longer visible to the user? + // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. + top.console.log("I need to scroll thw UI to here"); + var lineHeight = textLineHeight(); // what Is the height of each line? + // Get the new Y by getting the line number and multiplying by the height of each line. + var newY = lineHeight * (lineNum -1); // -1 to go to the line above + setScrollY(newY); // set the scroll height of the browser + } + } + } } if (type == "keydown") From 025a3aa7246be46c310f2d75e0c704ce1319c036 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 16 Feb 2013 05:10:29 +0000 Subject: [PATCH 027/463] Localisation updates from http://translatewiki.net. --- src/locales/br.json | 56 ++++++++++++++++++++++++++++++++++++++++ src/locales/ja.json | 4 +-- src/locales/ksh.json | 18 ++++++++++++- src/locales/pt-br.json | 4 ++- src/locales/zh-hans.json | 2 +- src/locales/zh-hant.json | 7 ++--- 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 src/locales/br.json diff --git a/src/locales/br.json b/src/locales/br.json new file mode 100644 index 00000000..d53ce591 --- /dev/null +++ b/src/locales/br.json @@ -0,0 +1,56 @@ +{ + "index.newPad": "Pad nevez", + "index.createOpenPad": "pe kroui\u00f1\/digeri\u00f1 ur pad gant an anv :", + "pad.toolbar.bold.title": "Tev (Ctrl-B)", + "pad.toolbar.italic.title": "Italek (Ctrl-I)", + "pad.toolbar.underline.title": "Islinenna\u00f1 (Ctrl-U)", + "pad.toolbar.indent.title": "Endanta\u00f1", + "pad.toolbar.unindent.title": "Diendanta\u00f1", + "pad.toolbar.settings.title": "Arventenno\u00f9", + "pad.colorpicker.save": "Enrolla\u00f1", + "pad.colorpicker.cancel": "Nulla\u00f1", + "pad.loading": "O karga\u00f1...", + "pad.settings.myView": "Ma diskwel", + "pad.settings.fontType.normal": "Reizh", + "pad.settings.language": "Yezh :", + "pad.importExport.import_export": "Enporzhia\u00f1\/Ezporzhia\u00f1", + "pad.importExport.import": "Enkarga\u00f1 un destenn pe ur restr", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Testenn blaen", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "Kevreet.", + "pad.modals.slowcommit": "Digevreet.", + "pad.share.readonly": "Lenn hepken", + "pad.share.link": "Liamm", + "pad.chat": "Flap", + "timeslider.toolbar.authors": "Aozerien :", + "timeslider.toolbar.authorsList": "Aozer ebet", + "timeslider.toolbar.exportlink.title": "Ezporzhia\u00f1", + "timeslider.month.january": "Genver", + "timeslider.month.february": "C'hwevrer", + "timeslider.month.march": "Meurzh", + "timeslider.month.april": "Ebrel", + "timeslider.month.may": "Mae", + "timeslider.month.june": "Mezheven", + "timeslider.month.july": "Gouere", + "timeslider.month.august": "Eost", + "timeslider.month.september": "Gwengolo", + "timeslider.month.october": "Here", + "timeslider.month.november": "Du", + "timeslider.month.december": "Kerzu", + "pad.userlist.guest": "Den pedet", + "pad.userlist.deny": "Nac'h", + "pad.userlist.approve": "Aproui\u00f1", + "pad.impexp.importbutton": "Enporzhia\u00f1 brema\u00f1", + "pad.impexp.importing": "Oc'h enporzhia\u00f1...", + "pad.impexp.importfailed": "C'hwitet eo an enporzhiadenn", + "@metadata": { + "authors": [ + "Fulup", + "Y-M D" + ] + } +} \ No newline at end of file diff --git a/src/locales/ja.json b/src/locales/ja.json index c2f6da27..f7173dd4 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb", "pad.toolbar.import_export.title": "\u4ed6\u306e\u5f62\u5f0f\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", "pad.toolbar.timeslider.title": "\u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", - "pad.toolbar.savedRevision.title": "\u4fdd\u5b58\u6e08\u307f\u306e\u7248", + "pad.toolbar.savedRevision.title": "\u7248\u3092\u4fdd\u5b58", "pad.toolbar.settings.title": "\u8a2d\u5b9a", "pad.toolbar.embed.title": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u57cb\u3081\u8fbc\u3080", "pad.toolbar.showusers.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u8868\u793a", @@ -87,7 +87,7 @@ "timeslider.exportCurrent": "\u73fe\u5728\u306e\u7248\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", "timeslider.version": "\u30d0\u30fc\u30b8\u30e7\u30f3 {{version}}", "timeslider.saved": "| {{year}}\u5e74{{month}}{{day}}\u65e5\u306b\u4fdd\u5b58", - "timeslider.dateformat": "{{year}}\u5e74{{month}}{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "1\u6708", "timeslider.month.february": "2\u6708", "timeslider.month.march": "3\u6708", diff --git a/src/locales/ksh.json b/src/locales/ksh.json index e4557e85..648f9506 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -19,13 +19,16 @@ "pad.toolbar.clearAuthorship.title": "d\u00e4 Schriiver ier F\u00e4rve fottn\u00e4mme", "pad.toolbar.import_export.title": "Vun ongerscheidlijje Dattei_Fommaate empotteere udder \u00e4xpotteere", "pad.toolbar.timeslider.title": "Verjangeheid afschpelle", - "pad.toolbar.savedRevision.title": "Fa\u00dfjehallde Versione", + "pad.toolbar.savedRevision.title": "de Versjohn fa\u00dfhallde", "pad.toolbar.settings.title": "Enscht\u00e4llonge", "pad.toolbar.embed.title": "Donn dat Padd enbenge", "pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije", "pad.colorpicker.save": "Fa\u00dfhallde", "pad.colorpicker.cancel": "Oph\u00fc\u00fcre", "pad.loading": "Aam Laade …", + "pad.passwordRequired": "Do bruchs e Pa\u00dfwoot f\u00f6r heh dat P\u00e4dd.", + "pad.permissionDenied": "Do h\u00e4s nit dat R\u00e4\u00e4sch, op heh dat P\u00e4dd zohzejriife.", + "pad.wrongPassword": "Ding Pa\u00dfwoot wohr verkeht.", "pad.settings.padSettings": "Dam P\u00e4dd sin Enscht\u00e4llonge", "pad.settings.myView": "Anseesch", "pad.settings.stickychat": "Donn der Klaaf emmer aanzeije", @@ -38,6 +41,7 @@ "pad.settings.language": "Schprooch:", "pad.importExport.import_export": "Empoot\/\u00c4xpoot", "pad.importExport.import": "Donn jeede T\u00e4x udder jeede Zoot Dokem\u00e4nt huhlaade", + "pad.importExport.importSuccessful": "Jeschaff!", "pad.importExport.export": "Don dat P\u00e4dd \u00e4xpoteere al\u00df:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Eijfach T\u00e4x", @@ -45,9 +49,11 @@ "pad.importExport.exportpdf": "PDF (Poteerbaa Dokem\u00e4nte Fommaat)", "pad.importExport.exportopen": "ODF (Offe Dokem\u00e4nte-Fommaat)", "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Mer k\u00fcnne blo\u00df eijfaache T\u00e4xte udder HTML_Fommaate empoteere. Opw\u00e4ndejere M\u00fcjjeleschkeite f\u00f6 der Empoot jon och, dof\u00f6r bruch mer en Enschtallazjuhn met Abiword<\/i><\/a>.", "pad.modals.connected": "Verbonge.", "pad.modals.reconnecting": "Ben wider aam Verbenge …", "pad.modals.forcereconnect": "Wider verbenge", + "pad.modals.userdup": "En enem andere Finster en \u00c4rbeid", "pad.modals.userdup.explanation": "Heh dat Padd schingk en mieh wi einem Finster vun enem Brauser op heh d\u00e4m R\u00e4\u00e4schner op ze sin.", "pad.modals.userdup.advice": "En heh d\u00e4m Finster wider verbenge.", "pad.modals.unauth": "Nit ber\u00e4\u00e4schtesch", @@ -72,10 +78,12 @@ "pad.share.emebdcode": "URL enboue", "pad.chat": "Klaaf", "pad.chat.title": "Maach d\u00e4 Klaaf f\u00f6r heh dat P\u00e4dd op", + "pad.chat.loadmessages": "Mieh Nohresschte laade...", "timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle", "timeslider.toolbar.returnbutton": "Jangk retuur nohm P\u00e4dd", "timeslider.toolbar.authors": "Schriiver:", "timeslider.toolbar.authorsList": "Kein Schriivere", + "timeslider.toolbar.exportlink.title": "\u00c4xpoot", "timeslider.exportCurrent": "Donn de meu\u00dfte V\u00e4sjohn \u00e4xpotteere al\u00df:", "timeslider.version": "V\u00e4sjon {{version}}", "timeslider.saved": "Fa\u00dfjehallde aam {{day}}. {{month}} {{year}}", @@ -92,11 +100,19 @@ "timeslider.month.october": "Oktoober", "timeslider.month.november": "Nov\u00e4mber", "timeslider.month.december": "Dez\u00e4mber", + "timeslider.unnamedauthor": "{{num}} naameloose Schriever", + "timeslider.unnamedauthors": "{{num}} naameloose Schriever", + "pad.savedrevs.marked": "Heh di V\u00e4sjohn es j\u00e4z fa\u00dfjehallde.", "pad.userlist.entername": "Jif Dinge Naame en", "pad.userlist.unnamed": "naamelo\u00df\u00df", "pad.userlist.guest": "Ja\u00df\u00df", "pad.userlist.deny": "Aflehne", + "pad.userlist.approve": "Joodhei\u00dfe", + "pad.editbar.clearcolors": "Sulle mer de F\u00e4rve f\u00f6r de Schriiver uss_em janze T\u00e4x fott maache?", + "pad.impexp.importbutton": "J\u00e4z empoteere", "pad.impexp.importing": "Ben aam Empotteere …", + "pad.impexp.confirmimport": "En Dattei ze empotteere m\u00e4\u00e4t der janze T\u00e4x em P\u00e4dd fott. Wess De dat verfaftesch hann?", + "pad.impexp.convertFailed": "Mer kunnte di Dattei nit empoteere. Nemm en ander Dattei-Fommaat udder donn d\u00e4 T\u00e4x vun Hand kopeere un ennf\u00f6\u00f6je.", "pad.impexp.uploadFailed": "Et Huhlaade es don\u00e4vve jejange, bes esu jood un probeer et norr_ens", "pad.impexp.importfailed": "Et Empoteere es don\u00e4vve jejange", "pad.impexp.copypaste": "Bes esu jood un donn et koppeere un enf\u00f6\u00f6je", diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 6562681a..e029165d 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Limpar as cores de identifica\u00e7\u00e3o de autoria", "pad.toolbar.import_export.title": "Importar\/Exportar de\/para diferentes formatos de arquivo", "pad.toolbar.timeslider.title": "Linha do tempo", - "pad.toolbar.savedRevision.title": "Revis\u00f5es Salvas", + "pad.toolbar.savedRevision.title": "Salvar revis\u00e3o", "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", "pad.toolbar.embed.title": "Incorporar esta Nota", "pad.toolbar.showusers.title": "Mostrar os usuarios nesta Nota", @@ -100,6 +100,8 @@ "timeslider.month.october": "Outubro", "timeslider.month.november": "Novembro", "timeslider.month.december": "Dezembro", + "timeslider.unnamedauthor": "{{num}} autor desconhecido", + "timeslider.unnamedauthors": "{{num}} autores desconhecidos", "pad.savedrevs.marked": "Esta revis\u00e3o foi marcada como salva", "pad.userlist.entername": "Insira o seu nome", "pad.userlist.unnamed": "Sem t\u00edtulo", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index 7e29a3ae..a1735826 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -20,7 +20,7 @@ "pad.toolbar.redo.title": "\u91cd\u505a (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u989c\u8272", "pad.toolbar.timeslider.title": "\u65f6\u95f4\u8f74", - "pad.toolbar.savedRevision.title": "\u5df2\u4fdd\u5b58\u7684\u4fee\u8ba2", + "pad.toolbar.savedRevision.title": "\u4fdd\u5b58\u4fee\u8ba2", "pad.toolbar.settings.title": "\u8bbe\u7f6e", "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64\u8bb0\u4e8b\u672c", "pad.toolbar.showusers.title": "\u663e\u793a\u6b64\u8bb0\u4e8b\u672c\u7684\u7528\u6237", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index a5027a52..7c01860e 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": { - "1": "Simon Shek" + "0": "Shirayuki", + "2": "Simon Shek" } }, "index.newPad": "\u65b0Pad", @@ -86,8 +87,8 @@ "timeslider.toolbar.exportlink.title": "\u532f\u51fa", "timeslider.exportCurrent": "\u532f\u51fa\u7576\u524d\u7248\u672c\u70ba\uff1a", "timeslider.version": "\u7248\u672c{{version}}", - "timeslider.saved": "{{year}}{{month}}{{day}}\u4fdd\u5b58", - "timeslider.dateformat": "{{year}}{{month}}{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.saved": "{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", + "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "1\u6708", "timeslider.month.february": "2\u6708", "timeslider.month.march": "3\u6708", From 93d58b93be53fdefa62e4e3dbe4316799bbab6ba Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Feb 2013 17:13:02 +0000 Subject: [PATCH 028/463] Update src/static/css/iframe_editor.css --- src/static/css/iframe_editor.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index dd7452b2..3e19cbbe 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -177,6 +177,10 @@ p { #overlaysdiv { position: absolute; left: -1000px; top: -1000px; } +/* Stops super long lines without being spaces such as aaaaaaaaaaaaaa*100 breaking the editor + Commented out because it stops IE from being able to render the document, crazy IE bug is crazy. */ +/* .ace-line{ - overflow:hidden; /* Stops super long lines without being spaces such as aaaaaaaaaaaaaa*100 breaking the editor */ + overflow:hidden; } +*/ From 6b47fb69d077069521998470b6b8d692181a0555 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Feb 2013 18:01:25 +0000 Subject: [PATCH 029/463] seems to be working pretty well --- src/static/js/ace2_inner.js | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 8209c9bf..70b5443b 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3731,6 +3731,33 @@ function Ace2Inner(){ updateBrowserSelectionFromRep(); }, 200); } + + /* Attempt to apply some sanity to cursor handling in Chrome after a copy / paste event + We have to do this the way we do because rep. doesn't hold the value for keyheld events IE if the user + presses and holds the arrow key */ + if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && $.browser.chrome){ + var isLeftArrow = evt.which === 37; + var isUpArrow = evt.which === 38; + var isRightArrow = evt.which === 39; + var isDownArrow = evt.which === 40; + + var newVisibleLineRange = getVisibleLineRange(); // get the current visible range -- This works great. + var lineHeight = textLineHeight(); // what Is the height of each line? + var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214 + + if((isUpArrow || isLeftArrow || isRightArrow || isDownArrow) && caretOffsetTop){ // was it an up arrow or left arrow? + var lineNum = Math.round(caretOffsetTop / lineHeight) ; // Get the current Line Number IE 84 + var caretIsVisible = (lineNum > newVisibleLineRange[0] && lineNum < newVisibleLineRange[1]); // Is the cursor in the visible Range IE ie 84 > 14 and 84 < 90? + if(!caretIsVisible){ // is the cursor no longer visible to the user? + // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. + // Get the new Y by getting the line number and multiplying by the height of each line. + var newY = lineHeight * (lineNum -1); // -1 to go to the line above + setScrollY(newY); // set the scroll height of the browser + } + } + } + } if (type == "keydown") @@ -3836,7 +3863,6 @@ function Ace2Inner(){ selection.endPoint = getPointForLineAndChar(se); selection.focusAtStart = !! rep.selFocusAtStart; - setSelection(selection); } From 04f609752fa4b5c7a3bfa26ea8a2f082e0f1e184 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Feb 2013 18:05:25 +0000 Subject: [PATCH 030/463] actually works --- src/static/js/ace2_inner.js | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index d719bc08..5fc09b83 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3731,29 +3731,27 @@ function Ace2Inner(){ }, 200); } - // Chrome sucks at moving the users UI to the right place when the user uses the arrow keys - // we catch these issues and fix it. - // You can replicate this bug by copy/pasting text into a pad and moving it about then using the - // arrow keys to navitgate - if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && type == 'keydown' && $.browser.chrome){ - /* Is it an event we care about? */ - var isUpArrow = evt.which === 38; - var isLeftArrow = evt.which === 38; - var newVisibleLineRange = getVisibleLineRange(); // get the current visible range - top.console.log("IM NOT UPDATING! I need a way to get the actual rep when a key is held down", rep.selStart[0]); - if(isUpArrow || isLeftArrow){ // was it an up arrow or left arrow? - var lineNum = rep.selStart[0]; // Get the current Line Number IE 84 - var caretIsVisible = (lineNum > newVisibleLineRange[0]); // Is the cursor in the visible Range IE ie 84 > 14? + /* Attempt to apply some sanity to cursor handling in Chrome after a copy / paste event + We have to do this the way we do because rep. doesn't hold the value for keyheld events IE if the user + presses and holds the arrow key */ + if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && $.browser.chrome){ + var newVisibleLineRange = getVisibleLineRange(); // get the current visible range -- This works great. + var lineHeight = textLineHeight(); // what Is the height of each line? + var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214 + + if(caretOffsetTop){ // sometimes caretOffsetTop bugs out and returns 0, not sure why, possible Chrome bug? Either way if it does we don't wanna mess with it + var lineNum = Math.round(caretOffsetTop / lineHeight) ; // Get the current Line Number IE 84 + var caretIsVisible = (lineNum > newVisibleLineRange[0] && lineNum < newVisibleLineRange[1]); // Is the cursor in the visible Range IE ie 84 > 14 and 84 < 90? if(!caretIsVisible){ // is the cursor no longer visible to the user? // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. - top.console.log("I need to scroll thw UI to here"); - var lineHeight = textLineHeight(); // what Is the height of each line? // Get the new Y by getting the line number and multiplying by the height of each line. - var newY = lineHeight * (lineNum -1); // -1 to go to the line above + var newY = lineHeight * (lineNum -1); // -1 to go to the line above setScrollY(newY); // set the scroll height of the browser } } } + } if (type == "keydown") From 9ca22754328c96b98b7ae8d98e5f1ab0f6b9e291 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 17 Feb 2013 21:35:46 +0100 Subject: [PATCH 031/463] Fixes #1498: Two-part locale specs in lang cookie wouldn't be read correctly --- src/static/js/l10n.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/l10n.js b/src/static/js/l10n.js index a67a7c1a..c79ea706 100644 --- a/src/static/js/l10n.js +++ b/src/static/js/l10n.js @@ -1,8 +1,8 @@ (function(document) { // Set language for l10n - var language = document.cookie.match(/language=((\w{2,3})(-w+)?)/); + var language = document.cookie.match(/language=((\w{2,3})(-\w+)?)/); if(language) language = language[1]; - + html10n.bind('indexed', function() { html10n.localize([language, navigator.language, navigator.userLanguage, 'en']) }) From 7e023ce8e1093977717c930237693d0bb5b874c2 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Feb 2013 21:03:19 +0000 Subject: [PATCH 032/463] make the focus jump back to the left if it's required --- src/static/js/ace2_inner.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 8209c9bf..a4d3580a 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1622,10 +1622,19 @@ function Ace2Inner(){ lines = ccData.lines; var lineAttribs = ccData.lineAttribs; var linesWrapped = ccData.linesWrapped; + var scrollToTheLeftNeeded = false; if (linesWrapped > 0) { + if(browser.chrome){ + // chrome decides in it's infinite wisdom that its okay to put the browsers visisble window in the middle of the span + // an outcome of this is that the first chars of the string are no longer visible to the user.. Yay chrome.. + // Move the browsers visible area to the left hand side of the span + var scrollToTheLeftNeeded = true; + } // console.log("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines."); + }else{ + var scrollToTheLeftNeeded = false; } if (ss[0] >= 0) selStart = [ss[0] + a + netNumLinesChangeSoFar, ss[1]]; @@ -1692,6 +1701,10 @@ function Ace2Inner(){ //console.log("removed: "+id); }); + if(scrollToTheLeftNeeded){ // needed to stop chrome from breaking the ui when long strings without spaces are pasted + $("#innerdocbody").scrollLeft(0); + } + p.mark("findsel"); // if the nodes that define the selection weren't encountered during // content collection, figure out where those nodes are now. From 51a9ecf1f0ff9a4d3238b90f49a9e7de0809c412 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Feb 2013 21:19:15 +0000 Subject: [PATCH 033/463] better support for other browsers --- src/static/js/ace2_inner.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index a4d3580a..182e40be 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1626,15 +1626,14 @@ function Ace2Inner(){ if (linesWrapped > 0) { - if(browser.chrome){ + if(!browser.ie){ // chrome decides in it's infinite wisdom that its okay to put the browsers visisble window in the middle of the span // an outcome of this is that the first chars of the string are no longer visible to the user.. Yay chrome.. // Move the browsers visible area to the left hand side of the span + // Firefox isn't quite so bad, but it's still pretty quirky. var scrollToTheLeftNeeded = true; } // console.log("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines."); - }else{ - var scrollToTheLeftNeeded = false; } if (ss[0] >= 0) selStart = [ss[0] + a + netNumLinesChangeSoFar, ss[1]]; From 11a8295150bd08e66885cabf77e7b81f314c7dc5 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 00:29:53 +0000 Subject: [PATCH 034/463] eureka --- src/node/handler/PadMessageHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index eaf24b7a..f9944ae6 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -926,7 +926,7 @@ function handleClientReady(client, message) }) //If this is a reconnect, we don't have to send the client the ClientVars again - if(message.reconnect == true) + if(message.reconnect == "not accepting true here makes everything work fine but it also sends whole atext which is bad") { //Save the revision in sessioninfos, we take the revision from the info the client send to us sessioninfos[client.id].rev = message.client_rev; From 6e46a532884c5a15ee6e06a6d27b910ce2cad119 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 00:36:31 +0000 Subject: [PATCH 035/463] this is probably bad, please sanity check --- src/node/handler/PadMessageHandler.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index f9944ae6..167cafc7 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -926,10 +926,15 @@ function handleClientReady(client, message) }) //If this is a reconnect, we don't have to send the client the ClientVars again - if(message.reconnect == "not accepting true here makes everything work fine but it also sends whole atext which is bad") + //if(message.reconnect == "not accepting true here makes everything work fine but it also sends whole atext which is bad") + if(message.reconnect == true) { //Save the revision in sessioninfos, we take the revision from the info the client send to us sessioninfos[client.id].rev = message.client_rev; + //Join the pad and start receiving updates + client.join(padIds.padId); + //Save the current revision in sessioninfos, should be the same as in clientVars + sessioninfos[client.id].rev = pad.getHeadRevisionNumber(); // I'm not sure this is a great idea here } //This is a normal first connect else From eeeeb0484076c4b74614fc87526c649396e98000 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 00:37:47 +0000 Subject: [PATCH 036/463] remove cruft --- src/node/handler/PadMessageHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 167cafc7..f546b1c3 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -926,7 +926,6 @@ function handleClientReady(client, message) }) //If this is a reconnect, we don't have to send the client the ClientVars again - //if(message.reconnect == "not accepting true here makes everything work fine but it also sends whole atext which is bad") if(message.reconnect == true) { //Save the revision in sessioninfos, we take the revision from the info the client send to us From 48ffbde7316a2aa21d76e300d0a272651b98b389 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 01:10:54 +0000 Subject: [PATCH 037/463] allow colon to indent line --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 70b5443b..5c0af0f1 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1897,7 +1897,7 @@ function Ace2Inner(){ var prevLine = rep.lines.prev(thisLine); var prevLineText = prevLine.text; var theIndent = /^ *(?:)/.exec(prevLineText)[0]; - if (/[\[\(\{]\s*$/.exec(prevLineText)) theIndent += THE_TAB; + if (/[\[\(\:\{]\s*$/.exec(prevLineText)) theIndent += THE_TAB; var cs = Changeset.builder(rep.lines.totalWidth()).keep( rep.lines.offsetOfIndex(lineNum), lineNum).insert( theIndent, [ From 77d03d34731f1ec12d77f82fe4c260c4bb9f559a Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 01:40:34 +0000 Subject: [PATCH 038/463] Try to add some sanity to indentation --- src/static/js/ace2_inner.js | 9 +++++---- src/static/js/pad_editbar.js | 5 +---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 5c0af0f1..151a1806 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3287,7 +3287,7 @@ function Ace2Inner(){ listType = /([a-z]+)([12345678])/.exec(listType); var type = listType[1]; var level = Number(listType[2]); - + //detect empty list item; exclude indentation if(text === '*' && type !== "indent") { @@ -3317,8 +3317,10 @@ function Ace2Inner(){ function doIndentOutdent(isOut) { - if (!(rep.selStart && rep.selEnd) || - ((rep.selStart[0] == rep.selEnd[0]) && (rep.selStart[1] == rep.selEnd[1]) && rep.selEnd[1] > 1)) + if (!((rep.selStart && rep.selEnd) || + ((rep.selStart[0] == rep.selEnd[0]) && (rep.selStart[1] == rep.selEnd[1]) && rep.selEnd[1] > 1)) && + (isOut != true) + ) { return false; } @@ -3326,7 +3328,6 @@ function Ace2Inner(){ var firstLine, lastLine; firstLine = rep.selStart[0]; lastLine = Math.max(firstLine, rep.selEnd[0] - ((rep.selEnd[1] === 0) ? 1 : 0)); - var mods = []; for (var n = firstLine; n <= lastLine; n++) { diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index 91a07bf9..cc9f8758 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -156,10 +156,7 @@ var padeditbar = (function() else if (cmd == 'insertorderedlist') ace.ace_doInsertOrderedList(); else if (cmd == 'indent') { - if (!ace.ace_doIndentOutdent(false)) - { - ace.ace_doInsertUnorderedList(); - } + ace.ace_doIndentOutdent(false); } else if (cmd == 'outdent') { From b30e1de3e50e718769627b68ee3d70c9988b2f89 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 15:12:11 +0000 Subject: [PATCH 039/463] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa0da363..aae935d6 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ documented codebase makes it easier for developers to improve the code and contr Etherpad Lite 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. There is also a [jQuery plugin](https://github.com/johnyma22/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. +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. There is also a [jQuery plugin](https://github.com/etherpad/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. There's also a full-featured plugin framework, allowing you to easily add your own features. Finally, Etherpad Lite comes with translations into tons of different languages! From abadfb7b6a2cb92f3fc736231ed2344e0344f32b Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 15:12:37 +0000 Subject: [PATCH 040/463] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aae935d6..331353a3 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ documented codebase makes it easier for developers to improve the code and contr Etherpad Lite 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. There is also a [jQuery plugin](https://github.com/etherpad/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. +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. There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. There's also a full-featured plugin framework, allowing you to easily add your own features. Finally, Etherpad Lite comes with translations into tons of different languages! From 4cfac2f62452dfa80707d22d1a4575e6f8659c1d Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 08:29:25 -0800 Subject: [PATCH 041/463] fix extract and checkPad --- bin/extractPadData.js | 4 +++- src/static/js/pluginfw/hooks.js | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/bin/extractPadData.js b/bin/extractPadData.js index ea00f953..1dbab3aa 100644 --- a/bin/extractPadData.js +++ b/bin/extractPadData.js @@ -36,16 +36,18 @@ async.series([ settings = require('../src/node/utils/Settings'); db = require('../src/node/db/DB'); dirty = require("../src/node_modules/ueberDB/node_modules/dirty")(padId + ".db"); + callback(); }, //intallize the database function (callback) { +console.log("dbe init"); db.init(callback); }, //get the pad function (callback) { - padManager = require('../node/db/PadManager'); + padManager = require('../src/node/db/PadManager'); padManager.getPad(padId, function(err, _pad) { diff --git a/src/static/js/pluginfw/hooks.js b/src/static/js/pluginfw/hooks.js index d9a14d85..4d505794 100644 --- a/src/static/js/pluginfw/hooks.js +++ b/src/static/js/pluginfw/hooks.js @@ -70,10 +70,12 @@ exports.flatten = function (lst) { exports.callAll = function (hook_name, args) { if (!args) args = {}; - if (exports.plugins.hooks[hook_name] === undefined) return []; - return _.flatten(_.map(exports.plugins.hooks[hook_name], function (hook) { - return hookCallWrapper(hook, hook_name, args); - }), true); + if (exports.plugins){ + if (exports.plugins.hooks[hook_name] === undefined) return []; + return _.flatten(_.map(exports.plugins.hooks[hook_name], function (hook) { + return hookCallWrapper(hook, hook_name, args); + }), true); + } } exports.aCallAll = function (hook_name, args, cb) { From f76cfad42b89cf58feb7bb91203d6544803009e6 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 08:30:42 -0800 Subject: [PATCH 042/463] remove cruft --- bin/extractPadData.js | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/extractPadData.js b/bin/extractPadData.js index 1dbab3aa..4210e18d 100644 --- a/bin/extractPadData.js +++ b/bin/extractPadData.js @@ -41,7 +41,6 @@ async.series([ //intallize the database function (callback) { -console.log("dbe init"); db.init(callback); }, //get the pad From 3f87a32a1289738ddbfebec44865c1532e3ec6e3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 18:07:01 +0000 Subject: [PATCH 043/463] timestlider script block --- src/templates/timeslider.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index 4a8543c5..902c7191 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -40,8 +40,10 @@ <% e.end_block(); %> + <% e.begin_block("timesliderScripts"); %> + <% e.end_block(); %> <% e.begin_block("timesliderBody"); %> From 75fd27998e818b64942fd62f332082af742b4206 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 18:58:58 +0000 Subject: [PATCH 044/463] expose socket timeslider with a bad hack --- src/static/js/timeslider.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 5203e57b..0e26699b 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -63,6 +63,7 @@ function init() { //build up the socket io connection socket = io.connect(url, {resource: resource}); + window.parent.socket = socket; // Expose the socket to it's parent HACK //send the ready message once we're connected socket.on('connect', function() @@ -163,3 +164,4 @@ function handleClientVars(message) exports.baseURL = ''; exports.init = init; +exports.sendSocketMsg = sendSocketMsg; From 7fcc71710fc2491d4d439c2730b6991e98b3250e Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 18:59:53 +0000 Subject: [PATCH 045/463] dont exposrt sendSocketMs --- src/static/js/timeslider.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 0e26699b..acf1b039 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -164,4 +164,3 @@ function handleClientVars(message) exports.baseURL = ''; exports.init = init; -exports.sendSocketMsg = sendSocketMsg; From fb97920163b740097f67c00f19ec06ec8a891679 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 19:32:07 +0000 Subject: [PATCH 046/463] update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e3a5d77..107bd258 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,13 @@ * NEW: Plugins can now provide their own frontend tests * NEW: Improved server-side logging * NEW: Admin dashboard mobile device support and new hooks for Admin dashboard + * NEW: Get current API version from API + * Fix: Text Export indentation now supports multiple indentations * Fix: Bugfix getChatHistory API method + * Fix: Make colons on end of line create 4 spaces on indent + * Fix: Make indent when on middle of the line stop creating list + * Fix: Stop long strings breaking the UX by moving focus away from beginning of line + * Fix: padUsersCount no longer hangs server * Fix: Make plugin search case insensitive * Fix: Indentation and bullets on text export * Fix: Resolve various warnings on dependencies during install From c37875e09ada4b1c70a6d520bf04b1d79db02e9b Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 19:33:31 +0000 Subject: [PATCH 047/463] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 107bd258..c1b38380 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,12 @@ * NEW: Get current API version from API * Fix: Text Export indentation now supports multiple indentations * Fix: Bugfix getChatHistory API method + * Fix: Stop Chrome losing caret after paste is texted * Fix: Make colons on end of line create 4 spaces on indent * Fix: Make indent when on middle of the line stop creating list * Fix: Stop long strings breaking the UX by moving focus away from beginning of line * Fix: padUsersCount no longer hangs server + * Fix: Issue with two part locale specs not working * Fix: Make plugin search case insensitive * Fix: Indentation and bullets on text export * Fix: Resolve various warnings on dependencies during install From 5441179e78072b40bb52da8e447c176558a59d5b Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 19:38:25 +0000 Subject: [PATCH 048/463] dont jump pages --- src/static/js/ace2_inner.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 5fc09b83..0d526066 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3746,7 +3746,11 @@ function Ace2Inner(){ if(!caretIsVisible){ // is the cursor no longer visible to the user? // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. // Get the new Y by getting the line number and multiplying by the height of each line. - var newY = lineHeight * (lineNum -1); // -1 to go to the line above + if(evt.which == 37 || evt.which == 38){ // If left or up + var newY = lineHeight * (lineNum -1); // -1 to go to the line above + }else if(evt.which == 39 || evt.which == 40){ // if down or right + var newY = caretOffsetTop + lineHeight; // the offset and one additional line + } setScrollY(newY); // set the scroll height of the browser } } From ab81b5cfe979a9e1a2440df6a8931ab8a0ac11ca Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 19:46:31 +0000 Subject: [PATCH 049/463] dont jump pages --- src/static/js/ace2_inner.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 0d526066..4ae98080 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3742,6 +3742,7 @@ function Ace2Inner(){ if(caretOffsetTop){ // sometimes caretOffsetTop bugs out and returns 0, not sure why, possible Chrome bug? Either way if it does we don't wanna mess with it var lineNum = Math.round(caretOffsetTop / lineHeight) ; // Get the current Line Number IE 84 + newVisibleLineRange[1] = newVisibleLineRange[1]-1; var caretIsVisible = (lineNum > newVisibleLineRange[0] && lineNum < newVisibleLineRange[1]); // Is the cursor in the visible Range IE ie 84 > 14 and 84 < 90? if(!caretIsVisible){ // is the cursor no longer visible to the user? // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. @@ -3749,7 +3750,7 @@ function Ace2Inner(){ if(evt.which == 37 || evt.which == 38){ // If left or up var newY = lineHeight * (lineNum -1); // -1 to go to the line above }else if(evt.which == 39 || evt.which == 40){ // if down or right - var newY = caretOffsetTop + lineHeight; // the offset and one additional line + var newY = getScrollY() + (lineHeight*3); // the offset and one additional line } setScrollY(newY); // set the scroll height of the browser } From 19964498f3b66a1c98da29c92f3f3f7532fd4d9e Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 20:38:32 +0000 Subject: [PATCH 050/463] no need to parse already parsed json --- bin/extractPadData.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/extractPadData.js b/bin/extractPadData.js index 4210e18d..c18af5b0 100644 --- a/bin/extractPadData.js +++ b/bin/extractPadData.js @@ -83,7 +83,10 @@ async.series([ db.db.db.wrappedDB.get(dbkey, function(err, dbvalue) { if(err) { callback(err); return} - dbvalue=JSON.parse(dbvalue); + + if(typeof dbvalue != 'object'){ + dbvalue=JSON.parse(dbvalue); // if its not json then parse it as json + } dirty.set(dbkey, dbvalue, callback); }); From 0a195895097bff67e2c06652938d22393b91bbf6 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 20:40:34 +0000 Subject: [PATCH 051/463] fix path for windows --- bin/extractPadData.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/extractPadData.js b/bin/extractPadData.js index c18af5b0..0d1acaae 100644 --- a/bin/extractPadData.js +++ b/bin/extractPadData.js @@ -35,7 +35,7 @@ async.series([ function(callback) { settings = require('../src/node/utils/Settings'); db = require('../src/node/db/DB'); - dirty = require("../src/node_modules/ueberDB/node_modules/dirty")(padId + ".db"); + dirty = require("../node_modules/ep_etherpad-lite/node_modules/ueberDB/node_modules/dirty")(padId + ".db"); callback(); }, //intallize the database From cda3a0e78bbfb5d26d7f449260d59cfa11b04124 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 21:03:52 +0000 Subject: [PATCH 052/463] a different approach --- src/static/js/timeslider.js | 5 +++-- src/templates/timeslider.html | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index acf1b039..24e6e98d 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -30,7 +30,7 @@ var readCookie = require('./pad_utils').readCookie; var randomString = require('./pad_utils').randomString; var _ = require('./underscore'); -var socket, token, padId, export_links; +var token, padId, export_links; function init() { $(document).ready(function () @@ -63,7 +63,6 @@ function init() { //build up the socket io connection socket = io.connect(url, {resource: resource}); - window.parent.socket = socket; // Expose the socket to it's parent HACK //send the ready message once we're connected socket.on('connect', function() @@ -107,6 +106,8 @@ function init() { window.location.reload(); }); + exports.socket = socket; // make the socket available + }); } diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index 4a8543c5..5d0e357c 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -211,6 +211,8 @@ } var plugins = require('ep_etherpad-lite/static/js/pluginfw/client_plugins'); + var socket = require('ep_etherpad-lite/static/js/timeslider').socket; + plugins.baseURL = baseURL; plugins.update(function () { From 9eff8576ef1ae95edb1e176474af04c82ecb1682 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Feb 2013 22:04:58 +0000 Subject: [PATCH 053/463] timeslider init hook --- src/static/js/timeslider.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 5203e57b..240bb924 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -29,8 +29,9 @@ var createCookie = require('./pad_utils').createCookie; var readCookie = require('./pad_utils').readCookie; var randomString = require('./pad_utils').randomString; var _ = require('./underscore'); +var hooks = require('./pluginfw/hooks'); -var socket, token, padId, export_links; +var token, padId, export_links; function init() { $(document).ready(function () @@ -106,6 +107,9 @@ function init() { window.location.reload(); }); + exports.socket = socket; // make the socket available + hooks.aCallAll("postTimesliderInit"); + }); } From e52dc2b17cdbf29084cfba069c3766050385a32f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Feb 2013 02:05:51 +0000 Subject: [PATCH 054/463] dont reset head count, use the one we should :) --- src/node/handler/PadMessageHandler.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index f546b1c3..4e056dcb 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -928,12 +928,10 @@ function handleClientReady(client, message) //If this is a reconnect, we don't have to send the client the ClientVars again if(message.reconnect == true) { - //Save the revision in sessioninfos, we take the revision from the info the client send to us - sessioninfos[client.id].rev = message.client_rev; //Join the pad and start receiving updates client.join(padIds.padId); - //Save the current revision in sessioninfos, should be the same as in clientVars - sessioninfos[client.id].rev = pad.getHeadRevisionNumber(); // I'm not sure this is a great idea here + //Save the revision in sessioninfos, we take the revision from the info the client send to us + sessioninfos[client.id].rev = message.client_rev; } //This is a normal first connect else From fb3e4a6232a9e58de22bcb37aa23bb568ac1fcc3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 20 Feb 2013 16:10:27 +0000 Subject: [PATCH 055/463] only show clients on this pad resolves issue #1544 --- src/node/handler/PadMessageHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index eaf24b7a..7ffeb6e5 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1035,7 +1035,7 @@ function handleClientReady(client, message) } // notify all existing users about new user - client.broadcast.to(padIds.padIds).json.send(messageToTheOtherUsers); + client.broadcast.to(padIds.padId).json.send(messageToTheOtherUsers); //Run trough all sessions of this pad async.forEach(socketio.sockets.clients(padIds.padId), function(roomClient, callback) From 813583c9cebbf96381358c607fc57874d3321c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uli=20K=C3=B6hler?= Date: Wed, 20 Feb 2013 21:38:24 +0100 Subject: [PATCH 056/463] Update link to dev guidelines --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 331353a3..91410b87 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ You know all this and just want to know how you can help? Look at the [TODO list](https://github.com/ether/etherpad-lite/wiki/TODO) and our [Issue tracker](https://github.com/ether/etherpad-lite/issues). (Please consider using [jshint](http://www.jshint.com/about/), if you plan to contribute code.) -Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/wiki/Developer-Guidelines), really! +Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md), really! # Get in touch Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)! From 26ccb1fa3e444e755b4fe7a1cf87ce6da00b8d70 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 24 Feb 2013 16:38:27 +0000 Subject: [PATCH 057/463] Localisation updates from http://translatewiki.net. --- src/locales/bn.json | 46 ++++++++++++++++++++++- src/locales/br.json | 79 +++++++++++++++++++++++++++++++++++++--- src/locales/de.json | 2 +- src/locales/fi.json | 2 +- src/locales/nl.json | 2 +- src/locales/pl.json | 4 +- src/locales/zh-hans.json | 2 + src/locales/zh-hant.json | 2 +- 8 files changed, 126 insertions(+), 13 deletions(-) diff --git a/src/locales/bn.json b/src/locales/bn.json index dba1c215..2d12528b 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -2,26 +2,60 @@ "@metadata": { "authors": [ "Bellayet", - "Nasir8891" + "Nasir8891", + "Sankarshan" ] }, "index.newPad": "\u09a8\u09a4\u09c1\u09a8 \u09aa\u09cd\u09af\u09be\u09a1", "index.createOpenPad": "\u0985\u09a5\u09ac\u09be \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c7 \u09aa\u09cd\u09af\u09be\u09a1 \u0996\u09c1\u09b2\u09c1\u09a8\/\u09a4\u09c8\u09b0\u09c0 \u0995\u09b0\u09c1\u09a8:", "pad.toolbar.bold.title": "\u0997\u09be\u09a1\u09bc \u0995\u09b0\u09be (Ctrl-B)", "pad.toolbar.italic.title": "\u09ac\u09be\u0981\u0995\u09be \u0995\u09b0\u09be (Ctrl-I)", + "pad.toolbar.underline.title": "\u0986\u09a8\u09cd\u09a1\u09be\u09b0\u09b2\u09be\u0987\u09a8 (Ctrl-U)", + "pad.toolbar.ol.title": "\u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7 \u09a4\u09be\u09b2\u09bf\u0995\u09be", "pad.toolbar.indent.title": "\u09aa\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u09bf\u0995\u0995\u09b0\u09a3", + "pad.toolbar.unindent.title": "\u0986\u0989\u099f\u09a1\u09c7\u09a8\u09cd\u099f", + "pad.toolbar.undo.title": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u0995\u09b0\u09c1\u09a8 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u0995\u09c3\u09a4\u09bf \u09b0\u0982 \u09aa\u09b0\u09bf\u09b7\u09cd\u0995\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", + "pad.toolbar.timeslider.title": "\u099f\u09be\u0987\u09ae\u09b8\u09cd\u09b2\u09be\u0987\u09a1\u09be\u09b0", + "pad.toolbar.savedRevision.title": "\u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09c1\u09a8", "pad.toolbar.settings.title": "\u09b8\u09c7\u099f\u09bf\u0982", + "pad.toolbar.embed.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u098f\u09ae\u09cd\u09ac\u09c7\u09a1 \u0995\u09b0\u09c1\u09a8", + "pad.toolbar.showusers.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0\u09a6\u09c7\u09b0 \u09a6\u09c7\u0996\u09be\u09a8", "pad.colorpicker.save": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3", "pad.colorpicker.cancel": "\u09ac\u09be\u09a4\u09bf\u09b2", "pad.loading": "\u09b2\u09cb\u09a1\u09bf\u0982...", + "pad.passwordRequired": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u099c\u09a8\u09cd\u09af \u0986\u09aa\u09a8\u09be\u0995\u09c7 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b9\u09ac\u09c7", + "pad.permissionDenied": "\u09a6\u09c1\u0983\u0996\u09bf\u09a4, \u098f \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09c7\u0987", + "pad.wrongPassword": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09b8\u09a0\u09bf\u0995 \u09a8\u09af\u09bc", + "pad.settings.padSettings": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09cd\u09a5\u09be\u09aa\u09a8", + "pad.settings.myView": "\u0986\u09ae\u09be\u09b0 \u09a6\u09c3\u09b6\u09cd\u09af", + "pad.settings.stickychat": "\u099a\u09cd\u09af\u09be\u099f \u09b8\u0995\u09cd\u09b0\u09c0\u09a8\u09c7 \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8 \u0995\u09b0\u09be \u09b9\u09ac\u09c7", + "pad.settings.colorcheck": "\u09b2\u09c7\u0996\u0995\u09a6\u09c7\u09b0 \u09a8\u09bf\u099c\u09b8\u09cd\u09ac \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09bf\u09a4 \u09b0\u0982", + "pad.settings.linenocheck": "\u09b2\u09be\u0987\u09a8 \u09a8\u09ae\u09cd\u09ac\u09b0", + "pad.settings.fontType": "\u09ab\u09a8\u09cd\u099f-\u098f\u09b0 \u09aa\u09cd\u09b0\u0995\u09be\u09b0:", "pad.settings.fontType.normal": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "\u09b8\u09b0\u09cd\u09ac\u09ac\u09cd\u09af\u09be\u09aa\u09c0 \u09a6\u09c3\u09b6\u09cd\u09af", "pad.settings.language": "\u09ad\u09be\u09b7\u09be:", + "pad.importExport.import_export": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u099f\/\u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f", + "pad.importExport.import": "\u0995\u09cb\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09ab\u09be\u0987\u09b2 \u09ac\u09be \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09c1\u09a8", + "pad.importExport.importSuccessful": "\u09b8\u09ab\u09b2!", "pad.importExport.export": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", "pad.importExport.exporthtml": "\u098f\u0987\u099a\u099f\u09bf\u098f\u09ae\u098f\u09b2", "pad.importExport.exportplain": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3 \u09b2\u09c7\u0996\u09be", "pad.importExport.exportword": "\u09ae\u09be\u0987\u0995\u09cd\u09b0\u09cb\u09b8\u09ab\u099f \u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", "pad.importExport.exportpdf": "\u09aa\u09bf\u09a1\u09bf\u098f\u09ab", "pad.importExport.exportopen": "\u0993\u09a1\u09bf\u098f\u09ab (\u0993\u09aa\u09c7\u09a8 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u09ab\u09b0\u09ae\u09cd\u09af\u09be\u099f)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09b8\u09ab\u09b2", + "pad.modals.reconnecting": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7..", + "pad.modals.forcereconnect": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8\u09c7\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be", + "pad.modals.userdup": "\u0985\u09a8\u09cd\u09af \u0989\u0987\u09a8\u09cd\u09a1\u09cb-\u09a4\u09c7 \u0996\u09cb\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "pad.modals.unauth": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u09a8\u09c7\u0987", + "pad.modals.looping": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", + "pad.modals.initsocketfail": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0-\u098f\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u0985\u09b8\u0995\u09cd\u09b7\u09ae\u0964", + "pad.modals.slowcommit": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", "pad.modals.deleted": "\u0985\u09aa\u09b8\u09be\u09b0\u09bf\u09a4\u0964", "pad.modals.deleted.explanation": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964", "pad.modals.disconnected.explanation": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be", @@ -34,6 +68,7 @@ "timeslider.toolbar.authors": "\u09b2\u09c7\u0996\u0995\u0997\u09a3:", "timeslider.toolbar.authorsList": "\u0995\u09cb\u09a8\u09cb \u09b2\u09c7\u0996\u0995 \u09a8\u09c7\u0987", "timeslider.exportCurrent": "\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8:", + "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "\u099c\u09be\u09a8\u09c1\u09af\u09bc\u09be\u09b0\u09bf", "timeslider.month.february": "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09af\u09bc\u09be\u09b0\u09bf", "timeslider.month.march": "\u09ae\u09be\u09b0\u09cd\u099a", @@ -45,5 +80,12 @@ "timeslider.month.september": "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0", "timeslider.month.october": "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0", "timeslider.month.november": "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0", - "timeslider.month.december": "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0" + "timeslider.month.december": "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0", + "pad.userlist.entername": "\u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09be\u09ae", + "pad.userlist.unnamed": "\u0995\u09cb\u09a8 \u09a8\u09be\u09ae \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09a8\u09bf", + "pad.userlist.guest": "\u0985\u09a4\u09bf\u09a5\u09bf", + "pad.userlist.approve": "\u0985\u09a8\u09c1\u09ae\u09cb\u09a6\u09bf\u09a4", + "pad.impexp.importbutton": "\u098f\u0996\u09a8 \u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", + "pad.impexp.importing": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u099a\u09b2\u099b\u09c7...", + "pad.impexp.importfailed": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0985\u09b8\u0995\u09cd\u09b7\u09ae" } \ No newline at end of file diff --git a/src/locales/br.json b/src/locales/br.json index d53ce591..1197f0d6 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -1,34 +1,96 @@ { + "@metadata": { + "authors": [ + "Fohanno", + "Fulup", + "Gwenn-Ael", + "Y-M D" + ] + }, "index.newPad": "Pad nevez", "index.createOpenPad": "pe kroui\u00f1\/digeri\u00f1 ur pad gant an anv :", "pad.toolbar.bold.title": "Tev (Ctrl-B)", "pad.toolbar.italic.title": "Italek (Ctrl-I)", "pad.toolbar.underline.title": "Islinenna\u00f1 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Barrennet", + "pad.toolbar.ol.title": "Roll urzhiet", + "pad.toolbar.ul.title": "Roll en dizurzh", "pad.toolbar.indent.title": "Endanta\u00f1", "pad.toolbar.unindent.title": "Diendanta\u00f1", + "pad.toolbar.undo.title": "Dizober (Ktrl-Z)", + "pad.toolbar.redo.title": "Adober (Ktrl-Y)", + "pad.toolbar.clearAuthorship.title": "Diverka\u00f1 al livio\u00f9 oc'h anaout an aozerien", + "pad.toolbar.import_export.title": "Enporzhia\u00f1\/Ezporzhia\u00f1 eus\/war-zu ur furmad restr dishe\u00f1vel", + "pad.toolbar.timeslider.title": "Istor dinamek", + "pad.toolbar.savedRevision.title": "Doareo\u00f9 enrollet", "pad.toolbar.settings.title": "Arventenno\u00f9", + "pad.toolbar.embed.title": "Enframma\u00f1 ar pad-ma\u00f1", + "pad.toolbar.showusers.title": "Diskwelet implijerien ar Pad", "pad.colorpicker.save": "Enrolla\u00f1", "pad.colorpicker.cancel": "Nulla\u00f1", "pad.loading": "O karga\u00f1...", + "pad.passwordRequired": "Ezhomm ho peus ur ger-tremen evit mont d'ar Pad-se", + "pad.permissionDenied": "\nN'oc'h ket aotreet da vont d'ar pad-ma\u00f1", + "pad.wrongPassword": "Fazius e oa ho ker-tremen", + "pad.settings.padSettings": "Arventenno\u00f9 Pad", "pad.settings.myView": "Ma diskwel", + "pad.settings.stickychat": "Diskwel ar flap bepred", + "pad.settings.colorcheck": "Livio\u00f9 anaout", + "pad.settings.linenocheck": "Niverenno\u00f9 linenno\u00f9", + "pad.settings.fontType": "Seurt font :", "pad.settings.fontType.normal": "Reizh", + "pad.settings.fontType.monospaced": "Monospas", + "pad.settings.globalView": "Gwel dre vras", "pad.settings.language": "Yezh :", "pad.importExport.import_export": "Enporzhia\u00f1\/Ezporzhia\u00f1", "pad.importExport.import": "Enkarga\u00f1 un destenn pe ur restr", + "pad.importExport.importSuccessful": "Deuet eo ganeoc'h !", + "pad.importExport.export": "Ezporzhia\u00f1 ar pad brema\u00f1 evel :", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Testenn blaen", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Ne c'hallit ket emporzjia\u00f1 furmado\u00f9 testenno\u00f9 kriz pe html. Evit arc'hwelio\u00f9 enporzhia\u00f1 emdroetoc'h, staliit abiword<\/a> mar plij.", "pad.modals.connected": "Kevreet.", + "pad.modals.reconnecting": "Adkevrea\u00f1 war-zu ho pad...", + "pad.modals.forcereconnect": "Adkevrea\u00f1 dre heg", + "pad.modals.userdup": "Digor en ur prenestr all", + "pad.modals.userdup.explanation": "Digor eo ho pad, war a seblant, e meur a brenestr eus ho merdeer en urzhiataer-ma\u00f1.", + "pad.modals.userdup.advice": "Kevrea\u00f1 en ur implijout ar prenestr-ma\u00f1.", + "pad.modals.unauth": "N'eo ket aotreet", + "pad.modals.unauth.explanation": "Kemmet e vo hoc'h aotreo\u00f9 pa vo diskwelet ar bajenn.-ma\u00f1 Klaskit kevrea\u00f1 en-dro.", + "pad.modals.looping": "Digevreet.", + "pad.modals.looping.explanation": "Kudenno\u00f9 kehenti\u00f1 zo gant ar servijer sinkronelekaat.", + "pad.modals.looping.cause": "Posupl eo e vefe gwarezet ho kevreadur gant ur maltouter diembreget pe ur servijer proksi", + "pad.modals.initsocketfail": "Ne c'haller ket tizhout ar servijer.", + "pad.modals.initsocketfail.explanation": "Ne c'haller ket kevrea\u00f1 ouzh ar servijer sinkronelaat.", + "pad.modals.initsocketfail.cause": "Gallout a ra ar gudenn dont eus ho merdeer Web pe eus ho kevreadur Internet.", "pad.modals.slowcommit": "Digevreet.", + "pad.modals.slowcommit.explanation": "Ne respont ket ar serveur.", + "pad.modals.slowcommit.cause": "Gallout a ra dont diwar kudenno\u00f9 kevrea\u00f1 gant ar rouedad.", + "pad.modals.deleted": "Dilamet.", + "pad.modals.deleted.explanation": "Lamet eo bet ar pad-ma\u00f1.", + "pad.modals.disconnected": "Digevreet oc'h bet.", + "pad.modals.disconnected.explanation": "Kollet eo bet ar c'hevreadur gant ar servijer", + "pad.modals.disconnected.cause": "Dizimplijadus eo ar servijer marteze. Kelaouit ac'hanomp ma pad ar gudenn.", + "pad.share": "Ranna\u00f1 ar pad-ma\u00f1.", "pad.share.readonly": "Lenn hepken", "pad.share.link": "Liamm", + "pad.share.emebdcode": "Enframma\u00f1 an URL", "pad.chat": "Flap", + "pad.chat.title": "Digeri\u00f1 ar flap kevelet gant ar pad-ma\u00f1.", + "pad.chat.loadmessages": "Karga\u00f1 muioc'h a gemennadenno\u00f9", + "timeslider.pageTitle": "Istor dinamek eus {{appTitle}}", + "timeslider.toolbar.returnbutton": "Distrei\u00f1 d'ar pad-ma\u00f1.", "timeslider.toolbar.authors": "Aozerien :", "timeslider.toolbar.authorsList": "Aozer ebet", "timeslider.toolbar.exportlink.title": "Ezporzhia\u00f1", + "timeslider.exportCurrent": "Ezporzhia\u00f1 an doare brema\u00f1 evel :", + "timeslider.version": "Stumm {{version}}", + "timeslider.saved": "Enrolla\u00f1 {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Genver", "timeslider.month.february": "C'hwevrer", "timeslider.month.march": "Meurzh", @@ -41,16 +103,21 @@ "timeslider.month.october": "Here", "timeslider.month.november": "Du", "timeslider.month.december": "Kerzu", + "timeslider.unnamedauthor": "{{niver}} aozer dianav", + "timeslider.unnamedauthors": "Aozerien dianav", + "pad.savedrevs.marked": "Merket eo an adweladenn-ma\u00f1 evel adweladenn gwiriet", + "pad.userlist.entername": "Ebarzhit hoc'h anv", + "pad.userlist.unnamed": "dizanv", "pad.userlist.guest": "Den pedet", "pad.userlist.deny": "Nac'h", "pad.userlist.approve": "Aproui\u00f1", + "pad.editbar.clearcolors": "Diverka\u00f1 al livio\u00f9 stag ouzh an aozerien en teul a-bezh ?", "pad.impexp.importbutton": "Enporzhia\u00f1 brema\u00f1", "pad.impexp.importing": "Oc'h enporzhia\u00f1...", + "pad.impexp.confirmimport": "Ma vez enporzhiet ur restr e vo diverket ar pezh zo en teul a-vrema\u00f1. Ha sur oc'h e fell deoc'h mont betek penn ?", + "pad.impexp.convertFailed": "N'eus ket bet gallet enporzhia\u00f1 ar restr. Ober gant ur furmad teul all pe eila\u00f1\/pega\u00f1 gant an dorn.", + "pad.impexp.uploadFailed": "C'hwitet eo bet an enporzhia\u00f1. Klaskit en-dro.", "pad.impexp.importfailed": "C'hwitet eo an enporzhiadenn", - "@metadata": { - "authors": [ - "Fulup", - "Y-M D" - ] - } + "pad.impexp.copypaste": "Eilit\/pegit, mar plij", + "pad.impexp.exportdisabled": "Diweredekaet eo ezporzhia\u00f1 d'ar furmad {{type}}. Kit e darempred gant merour ar reizhiad evit gouzout hiroc'h." } \ No newline at end of file diff --git a/src/locales/de.json b/src/locales/de.json index 7c51fa91..20938422 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -22,7 +22,7 @@ "pad.toolbar.clearAuthorship.title": "Autorenfarben zur\u00fccksetzen", "pad.toolbar.import_export.title": "Import\/Export in verschiedenen Dateiformaten", "pad.toolbar.timeslider.title": "Pad-Versionsgeschichte anzeigen", - "pad.toolbar.savedRevision.title": "Diese Revision markieren", + "pad.toolbar.savedRevision.title": "Version speichern", "pad.toolbar.settings.title": "Einstellungen", "pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten", "pad.toolbar.showusers.title": "Aktuell verbundene Benutzer anzeigen", diff --git a/src/locales/fi.json b/src/locales/fi.json index 50fd444d..eeb4cb16 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -24,7 +24,7 @@ "pad.toolbar.clearAuthorship.title": "Poista kirjoittajav\u00e4rit", "pad.toolbar.import_export.title": "Tuo tai vie eri tiedostomuodoista tai -muotoihin", "pad.toolbar.timeslider.title": "Aikajana", - "pad.toolbar.savedRevision.title": "Tallennetut versiot", + "pad.toolbar.savedRevision.title": "Tallenna muutos", "pad.toolbar.settings.title": "Asetukset", "pad.toolbar.embed.title": "Upota muistio", "pad.toolbar.showusers.title": "N\u00e4yt\u00e4 muistion k\u00e4ytt\u00e4j\u00e4t", diff --git a/src/locales/nl.json b/src/locales/nl.json index 9b1c773b..4142cc33 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Kleuren auteurs wissen", "pad.toolbar.import_export.title": "Naar\/van andere opmaak exporteren\/importeren", "pad.toolbar.timeslider.title": "Tijdlijn", - "pad.toolbar.savedRevision.title": "Opgeslagen versies", + "pad.toolbar.savedRevision.title": "Versie opslaan", "pad.toolbar.settings.title": "Instellingen", "pad.toolbar.embed.title": "Pad insluiten", "pad.toolbar.showusers.title": "Gebruikers van dit pad weergeven", diff --git a/src/locales/pl.json b/src/locales/pl.json index 3481cafc..6a46dd77 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -21,7 +21,7 @@ "pad.toolbar.clearAuthorship.title": "Usu\u0144 kolory autor\u00f3w", "pad.toolbar.import_export.title": "Import\/eksport z\/do r\u00f3\u017cnych format\u00f3w plik\u00f3w", "pad.toolbar.timeslider.title": "O\u015b czasu", - "pad.toolbar.savedRevision.title": "Zapisane wersje", + "pad.toolbar.savedRevision.title": "Zapisz wersj\u0119", "pad.toolbar.settings.title": "Ustawienia", "pad.toolbar.embed.title": "Umie\u015b\u0107 ten Notatnik", "pad.toolbar.showusers.title": "Poka\u017c u\u017cytkownik\u00f3w", @@ -102,6 +102,8 @@ "timeslider.month.october": "Pa\u017adziernik", "timeslider.month.november": "Listopad", "timeslider.month.december": "Grudzie\u0144", + "timeslider.unnamedauthor": "{{num}} nienazwany autor", + "timeslider.unnamedauthors": "{{num}} autor\u00f3w bez nazw", "pad.savedrevs.marked": "Ta wersja zosta\u0142a w\u0142a\u015bnie oznaczona jako zapisana.", "pad.userlist.entername": "Wprowad\u017a swoj\u0105 nazw\u0119", "pad.userlist.unnamed": "bez nazwy", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index a1735826..a98ebfce 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -3,6 +3,7 @@ "authors": [ "Dimension", "Hydra", + "Yfdyh000", "\u4e4c\u62c9\u8de8\u6c2a", "\u71c3\u7389" ] @@ -19,6 +20,7 @@ "pad.toolbar.undo.title": "\u64a4\u6d88 (Ctrl-Z)", "pad.toolbar.redo.title": "\u91cd\u505a (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u989c\u8272", + "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6587\u4ef6\u683c\u5f0f\u5bfc\u5165\/\u5bfc\u51fa", "pad.toolbar.timeslider.title": "\u65f6\u95f4\u8f74", "pad.toolbar.savedRevision.title": "\u4fdd\u5b58\u4fee\u8ba2", "pad.toolbar.settings.title": "\u8bbe\u7f6e", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index 7c01860e..efe4da61 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -20,7 +20,7 @@ "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u984f\u8272", "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u5c0e\u5165\uff0f\u532f\u51fa", "pad.toolbar.timeslider.title": "\u6642\u9593\u8ef8", - "pad.toolbar.savedRevision.title": "\u5df2\u5132\u5b58\u7684\u4fee\u8a02", + "pad.toolbar.savedRevision.title": "\u5132\u5b58\u4fee\u8a02", "pad.toolbar.settings.title": "\u8a2d\u5b9a", "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64pad", "pad.toolbar.showusers.title": "\u986f\u793a\u6b64pad\u7684\u7528\u6236", From b7d96b1dcf4534ed7f16dabbbf67fdd4299e7394 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 26 Feb 2013 11:44:22 +0000 Subject: [PATCH 058/463] a cli tool for deleting pads --- bin/deletePad.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 bin/deletePad.js diff --git a/bin/deletePad.js b/bin/deletePad.js new file mode 100644 index 00000000..d1bde2a4 --- /dev/null +++ b/bin/deletePad.js @@ -0,0 +1,62 @@ +/* + A tool for deleting pads from the CLI, because sometimes a brick is required to fix a window. +*/ + +if(process.argv.length != 3) +{ + console.error("Use: node deletePad.js $PADID"); + process.exit(1); +} +//get the padID +var padId = process.argv[2]; + +var db, padManager, pad, settings; +var neededDBValues = ["pad:"+padId]; + +var npm = require("../src/node_modules/npm"); +var async = require("../src/node_modules/async"); + +async.series([ + // load npm + function(callback) { + npm.load({}, function(er) { + if(er) + { + console.error("Could not load NPM: " + er) + process.exit(1); + } + else + { + callback(); + } + }) + }, + // load modules + function(callback) { + settings = require('../src/node/utils/Settings'); + db = require('../src/node/db/DB'); + callback(); + }, + // intallize the database + function (callback) + { + db.init(callback); + }, + // delete the pad and it's links + function (callback) + { + padManager = require('../src/node/db/PadManager'); + + padManager.removePad(padId, function(err){ + callback(err); + }); + } +], function (err) +{ + if(err) throw err; + else + { + console.log("Finished deleting padId: "+padId); + process.exit(); + } +}); From b2eb1b381480d727f4ad7d2001ece661e4d497d1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 26 Feb 2013 13:14:17 +0000 Subject: [PATCH 059/463] post url with pad error msg --- src/static/js/pad_utils.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/js/pad_utils.js b/src/static/js/pad_utils.js index 82f7fcad..ea4157bf 100644 --- a/src/static/js/pad_utils.js +++ b/src/static/js/pad_utils.js @@ -514,18 +514,18 @@ function setupGlobalExceptionHandler() { if (!globalExceptionHandler) { globalExceptionHandler = function test (msg, url, linenumber) { + var loc = document.location; var errorId = randomString(20); if ($("#editorloadingbox").attr("display") != "none"){ //show javascript errors to the user $("#editorloadingbox").css("padding", "10px"); $("#editorloadingbox").css("padding-top", "45px"); $("#editorloadingbox").html("
    An error occured
    The error was reported with the following id: '" + errorId + "'

    Please send this error message to us:
    '" - + "ErrorId: " + errorId + "
    UserAgent: " + navigator.userAgent + "
    " + msg + " in " + url + " at line " + linenumber + "'
    "); + + "ErrorId: " + errorId + "
    URL: " + loc + "
    UserAgent: " + navigator.userAgent + "
    " + msg + " in " + url + " at line " + linenumber + "'"); } //send javascript errors to the server - var errObj = {errorInfo: JSON.stringify({errorId: errorId, msg: msg, url: url, linenumber: linenumber, userAgent: navigator.userAgent})}; - var loc = document.location; + var errObj = {errorInfo: JSON.stringify({errorId: errorId, url: loc, msg: msg, url: url, linenumber: linenumber, userAgent: navigator.userAgent})}; var url = loc.protocol + "//" + loc.hostname + ":" + loc.port + "/" + loc.pathname.substr(1, loc.pathname.indexOf("/p/")) + "jserror"; $.post(url, errObj); From ad52b40597185bf69efc82c99b0e01edbb8ec5ee Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 26 Feb 2013 13:24:24 +0000 Subject: [PATCH 060/463] post correct url, heh --- src/static/js/pad_utils.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/js/pad_utils.js b/src/static/js/pad_utils.js index ea4157bf..deee2dfd 100644 --- a/src/static/js/pad_utils.js +++ b/src/static/js/pad_utils.js @@ -514,18 +514,18 @@ function setupGlobalExceptionHandler() { if (!globalExceptionHandler) { globalExceptionHandler = function test (msg, url, linenumber) { - var loc = document.location; var errorId = randomString(20); if ($("#editorloadingbox").attr("display") != "none"){ //show javascript errors to the user $("#editorloadingbox").css("padding", "10px"); $("#editorloadingbox").css("padding-top", "45px"); $("#editorloadingbox").html("
    An error occured
    The error was reported with the following id: '" + errorId + "'

    Please send this error message to us:
    '" - + "ErrorId: " + errorId + "
    URL: " + loc + "
    UserAgent: " + navigator.userAgent + "
    " + msg + " in " + url + " at line " + linenumber + "'
    "); + + "ErrorId: " + errorId + "
    URL: " + window.location.href + "
    UserAgent: " + navigator.userAgent + "
    " + msg + " in " + url + " at line " + linenumber + "'"); } //send javascript errors to the server - var errObj = {errorInfo: JSON.stringify({errorId: errorId, url: loc, msg: msg, url: url, linenumber: linenumber, userAgent: navigator.userAgent})}; + var errObj = {errorInfo: JSON.stringify({errorId: errorId, msg: msg, url: window.location.href, linenumber: linenumber, userAgent: navigator.userAgent})}; + var loc = document.location; var url = loc.protocol + "//" + loc.hostname + ":" + loc.port + "/" + loc.pathname.substr(1, loc.pathname.indexOf("/p/")) + "jserror"; $.post(url, errObj); From 1fd99bfd4396b7f5eb8e780bbc054d65a4084461 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 26 Feb 2013 16:32:09 -0800 Subject: [PATCH 061/463] fix deletePad script by remembering not to miss a callback.. --- bin/deletePad.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/deletePad.js b/bin/deletePad.js index d1bde2a4..4ed7e2c9 100644 --- a/bin/deletePad.js +++ b/bin/deletePad.js @@ -50,6 +50,8 @@ async.series([ padManager.removePad(padId, function(err){ callback(err); }); +console.error("cool I got here"); + callback(); } ], function (err) { From ea4307ae97484ff2dded89083c3b77d08274e82f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 26 Feb 2013 16:32:34 -0800 Subject: [PATCH 062/463] remove console error --- bin/deletePad.js | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/deletePad.js b/bin/deletePad.js index 4ed7e2c9..f7a6d203 100644 --- a/bin/deletePad.js +++ b/bin/deletePad.js @@ -50,7 +50,6 @@ async.series([ padManager.removePad(padId, function(err){ callback(err); }); -console.error("cool I got here"); callback(); } ], function (err) From 2c690665917701bda8ac034f57a30fb3ed247d14 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 27 Feb 2013 02:02:18 +0000 Subject: [PATCH 063/463] remove pointless stuff --- src/node/db/API.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 9a224843..3955d495 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -243,8 +243,6 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, rev, function(err, html) { if(ERR(err, callback)) return; - html = "" +html; // adds HTML head - html += ""; data = {html: html}; callback(null, data); }); @@ -255,8 +253,6 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, undefined, function (err, html) { if(ERR(err, callback)) return; - html = "" +html; // adds HTML head - html += ""; data = {html: html}; callback(null, data); }); From 716cac9c95db489c806b578a3e988ccabd0214a8 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 27 Feb 2013 15:17:22 +0000 Subject: [PATCH 064/463] timeslider init hook docs --- doc/api/hooks_client-side.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index 55d1da00..7f376def 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -129,6 +129,11 @@ Things in context: There doesn't appear to be any example available of this particular hook being used, but it gets fired after the editor is all set up. +## postTimesliderInit +Called from: src/static/js/timeslider.js + +There doesn't appear to be any example available of this particular hook being used, but it gets fired after the timeslider is all set up. + ## userJoinOrUpdate Called from: src/static/js/pad_userlist.js From af25606ea88704a8f81d10202fe84f613a60de30 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 27 Feb 2013 16:26:22 +0100 Subject: [PATCH 065/463] Fix bin/extractPadData on windows --- bin/extractPadData.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/extractPadData.js b/bin/extractPadData.js index 0d1acaae..e3678c4e 100644 --- a/bin/extractPadData.js +++ b/bin/extractPadData.js @@ -13,8 +13,8 @@ var padId = process.argv[2]; var db, dirty, padManager, pad, settings; var neededDBValues = ["pad:"+padId]; -var npm = require("../src/node_modules/npm"); -var async = require("../src/node_modules/async"); +var npm = require("../node_modules/ep_etherpad-lite/node_modules/npm"); +var async = require("../node_modules/ep_etherpad-lite/node_modules/async"); async.series([ // load npm @@ -33,8 +33,8 @@ async.series([ }, // load modules function(callback) { - settings = require('../src/node/utils/Settings'); - db = require('../src/node/db/DB'); + settings = require('../node_modules/ep_etherpad-lite/node/utils/Settings'); + db = require('../node_modules/ep_etherpad-lite/node/db/DB'); dirty = require("../node_modules/ep_etherpad-lite/node_modules/ueberDB/node_modules/dirty")(padId + ".db"); callback(); }, @@ -46,7 +46,7 @@ async.series([ //get the pad function (callback) { - padManager = require('../src/node/db/PadManager'); + padManager = require('../node_modules/ep_etherpad-lite/node/db/PadManager'); padManager.getPad(padId, function(err, _pad) { @@ -84,7 +84,7 @@ async.series([ { if(err) { callback(err); return} - if(typeof dbvalue != 'object'){ + if(dbvalue && typeof dbvalue != 'object'){ dbvalue=JSON.parse(dbvalue); // if its not json then parse it as json } From ebd8b85072dbb795f21a31b745a024cf356ba2c9 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 27 Feb 2013 16:17:50 +0000 Subject: [PATCH 066/463] patch documented here https://github.com/ether/etherpad-lite/issues/472 adds some stability but not a perfect solution --- src/node/handler/PadMessageHandler.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 08ddde0e..15a9b8ea 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -586,7 +586,14 @@ function handleUserChanges(client, message) // client) are relative to revision r - 1. The follow function // rebases "changeset" so that it is relative to revision r // and can be applied after "c". - changeset = Changeset.follow(c, changeset, false, apool); + try + { + changeset = Changeset.follow(c, changeset, false, apool); + }catch(e){ + console.warn("Can't apply USER_CHANGES "+changeset+", possibly because of mismatched follow error"); + client.json.send({disconnect:"badChangeset"}); + return; + } if ((r - baseRev) % 200 == 0) { // don't let the stack get too deep async.nextTick(callback); From 994c4ebeed20c76127eadd7bb395624374093b46 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 27 Feb 2013 19:29:59 +0000 Subject: [PATCH 067/463] stop the client disconnecting of the server sends out a bad revision #, this is very dangerous, the server really shouldn't be sending the same rev #, we could really do with some strong tests case that cover this. Either way this commit 'resolves' #1510 --- src/static/js/collab_client.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 7df0b711..94149123 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -294,8 +294,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (oldRev + 1)) { - dmesg("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); - setChannelState("DISCONNECTED", "badmessage_newchanges"); + top.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); + // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } msgQueue.push(msg); @@ -304,8 +304,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - dmesg("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); - setChannelState("DISCONNECTED", "badmessage_newchanges"); + top.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); + // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } rev = newRev; @@ -318,8 +318,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) { if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1)) { - dmesg("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); - setChannelState("DISCONNECTED", "badmessage_acceptcommit"); + top.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); + // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } msgQueue.push(msg); @@ -328,8 +328,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - dmesg("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); - setChannelState("DISCONNECTED", "badmessage_acceptcommit"); + top.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); + // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } rev = newRev; From 176a6c36d869899b9c20f3444e8acebad0a60686 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 27 Feb 2013 20:39:38 +0100 Subject: [PATCH 068/463] Document the endless possibilities of log4js --- settings.json.template | 60 +++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/settings.json.template b/settings.json.template index 28f0192e..3865737f 100644 --- a/settings.json.template +++ b/settings.json.template @@ -51,13 +51,6 @@ }, */ - //Logging configuration. See log4js documentation for further information - // https://github.com/nomiddlename/log4js-node - "logconfig" : - { "appenders": [ - { "type": "console" } - ] }, - //the default text of a pad "defaultPadText" : "Welcome to Etherpad Lite!\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", @@ -101,9 +94,56 @@ }, */ - /* The log level we are using, can be: DEBUG, INFO, WARN, ERROR */ - "loglevel": "INFO", - // restrict socket.io transport methods "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"] + + /* 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: + "logconfig" : + { "appenders": [ + { "type": "console" + //, "category": "access"// only logs pad access + } +/* + , { "type": "file" + , "filename": "your-log-file-here.log" + , "maxLogSize": 1024 + , "backups": 3 // how many log files there're gonna be at max + //, "category": "test" // only log a specific category + }*/ +/* + , { "type": "logLevelFilter" + , "level": "warn" // filters out all log messages that have a lower level than "error" + , "appender": + { "type": "file" + , "filename": "your-log-file-here.log" + , "maxLogSize": 1024 + , "backups": 1 // how many log files there're gonna be at max + } + }*/ + /* + , { "type": "logLevelFilter" + , "level": "error" // filters out all log messages that have a lower level than "error" + , "appender": + { "type": "smtp" + , "subject": "An error occured in your EPL instance!" + , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" + , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message + , "transport": "SMTP" // More available transports are documented here: https://github.com/andris9/Nodemailer#possible-transport-methods + , "SMTP": { + "host": "smtp.gmail.com", + "secureConnection": true, + "port": 465, + "auth": { + "user": "foo@bar.com", + "pass": "bar_foo" + } + } + } + }*/ + ] }, } From c4966543eda35a9b0e704b764b4f74f932b29746 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Thu, 28 Feb 2013 16:16:26 +0100 Subject: [PATCH 069/463] Fix settings object having constructors of another vm.context This made it impossible to rely on `instanceof` to work as expected on (even parts of) the settings object Fixes #1570 --- src/node/utils/Settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 04404a1a..45f81aa5 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -157,6 +157,7 @@ exports.reloadSettings = function reloadSettings() { try { if(settingsStr) { settings = vm.runInContext('exports = '+settingsStr, vm.createContext(), "settings.json"); + settings = JSON.parse(JSON.stringify(settings)) // fix objects having constructors of other vm.context } }catch(e){ console.error('There was an error processing your settings.json file: '+e.message); From 3460159f68d91aa2a9c739f82e9b79f5e07caf7e Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 1 Mar 2013 14:04:33 +0000 Subject: [PATCH 070/463] fix a test --- tests/frontend/specs/embed_value.js | 9 ++++++--- tests/frontend/specs/font_type.js | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/frontend/specs/embed_value.js b/tests/frontend/specs/embed_value.js index 729cc666..029f0dd5 100644 --- a/tests/frontend/specs/embed_value.js +++ b/tests/frontend/specs/embed_value.js @@ -100,8 +100,8 @@ describe("embed links", function(){ //open share dropdown chrome$(".buttonicon-embed").click(); - //check read only checkbox, a bit hacky - chrome$('#readonlyinput').attr('checked','checked').click().attr('checked','checked'); + chrome$('#readonlyinput').click(); + chrome$('#readonlyinput:checkbox:not(:checked)').attr('checked', 'checked'); //get the link of the share field + the actual pad url and compare them var shareLink = chrome$("#linkinput").val(); @@ -119,7 +119,9 @@ describe("embed links", function(){ //open share dropdown chrome$(".buttonicon-embed").click(); //check read only checkbox, a bit hacky - chrome$('#readonlyinput').attr('checked','checked').click().attr('checked','checked'); + chrome$('#readonlyinput').click(); + chrome$('#readonlyinput:checkbox:not(:checked)').attr('checked', 'checked'); + //get the link of the share field + the actual pad url and compare them var embedCode = chrome$("#embedinput").val(); @@ -129,5 +131,6 @@ describe("embed links", function(){ done(); }); }); + }); }); diff --git a/tests/frontend/specs/font_type.js b/tests/frontend/specs/font_type.js index af90b865..8ef489aa 100644 --- a/tests/frontend/specs/font_type.js +++ b/tests/frontend/specs/font_type.js @@ -17,9 +17,11 @@ describe("font select", function(){ var $viewfontmenu = chrome$("#viewfontmenu"); var $monospaceoption = $viewfontmenu.find("[value=monospace]"); +console.log($monospaceoption); + //select monospace and fire change event $monospaceoption.attr('selected','selected'); - $viewfontmenu.change(); + // $viewfontmenu.change(); //check if font changed to monospace var fontFamily = inner$("body").css("font-family").toLowerCase(); From 36923313fae886792a231b5ebef6487b243c2256 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 1 Mar 2013 23:08:39 +0000 Subject: [PATCH 071/463] remove more references to lite --- settings.json.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.json.template b/settings.json.template index 28f0192e..105bfb91 100644 --- a/settings.json.template +++ b/settings.json.template @@ -5,7 +5,7 @@ */ { // Name your instance! - "title": "Etherpad Lite", + "title": "Etherpad", // favicon default name // alternatively, set up a fully specified Url to your own favicon @@ -59,7 +59,7 @@ ] }, //the default text of a pad - "defaultPadText" : "Welcome to Etherpad Lite!\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", + "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", /* Users must have a session to access pads. This effectively allows only group pads to be accessed. */ "requireSession" : false, From cadb671ae15484d6327106058309e328bd14d5b3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 1 Mar 2013 23:29:12 +0000 Subject: [PATCH 072/463] this approach seems to work better for change in latest jQ --- tests/frontend/specs/language.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/frontend/specs/language.js b/tests/frontend/specs/language.js index e7705914..86d2d740 100644 --- a/tests/frontend/specs/language.js +++ b/tests/frontend/specs/language.js @@ -56,10 +56,8 @@ describe("Language select and change", function(){ //click the language button var $language = chrome$("#languagemenu"); - var $languageoption = $language.find("[value=en]"); - - //select german - $languageoption.attr('selected','selected'); + //select english + $language.val("en"); $language.change(); //get the value of the bold button From 4e205fe0af0669588b0b6779def303c4a62b1155 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 1 Mar 2013 23:33:24 +0000 Subject: [PATCH 073/463] fix monospace text --- tests/frontend/specs/font_type.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/frontend/specs/font_type.js b/tests/frontend/specs/font_type.js index 8ef489aa..af90b865 100644 --- a/tests/frontend/specs/font_type.js +++ b/tests/frontend/specs/font_type.js @@ -17,11 +17,9 @@ describe("font select", function(){ var $viewfontmenu = chrome$("#viewfontmenu"); var $monospaceoption = $viewfontmenu.find("[value=monospace]"); -console.log($monospaceoption); - //select monospace and fire change event $monospaceoption.attr('selected','selected'); - // $viewfontmenu.change(); + $viewfontmenu.change(); //check if font changed to monospace var fontFamily = inner$("body").css("font-family").toLowerCase(); From d8154deee3ba61d34fac105f96be41fa2131d8a3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 1 Mar 2013 23:40:25 +0000 Subject: [PATCH 074/463] more fixes --- tests/frontend/specs/font_type.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/frontend/specs/font_type.js b/tests/frontend/specs/font_type.js index af90b865..25d9df05 100644 --- a/tests/frontend/specs/font_type.js +++ b/tests/frontend/specs/font_type.js @@ -19,6 +19,7 @@ describe("font select", function(){ //select monospace and fire change event $monospaceoption.attr('selected','selected'); + $viewfontmenu.val("monospace"); $viewfontmenu.change(); //check if font changed to monospace From 5c03c039d1e4e5ea95dd903107fa982c0917d311 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 3 Mar 2013 16:39:34 +0100 Subject: [PATCH 075/463] [settings.json.template] Shrink things together a bit and consistently indent comments --- settings.json.template | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/settings.json.template b/settings.json.template index 3865737f..8996fa49 100644 --- a/settings.json.template +++ b/settings.json.template @@ -108,24 +108,20 @@ { "type": "console" //, "category": "access"// only logs pad access } -/* + /* , { "type": "file" , "filename": "your-log-file-here.log" , "maxLogSize": 1024 , "backups": 3 // how many log files there're gonna be at max //, "category": "test" // only log a specific category }*/ -/* + /* , { "type": "logLevelFilter" , "level": "warn" // filters out all log messages that have a lower level than "error" , "appender": - { "type": "file" - , "filename": "your-log-file-here.log" - , "maxLogSize": 1024 - , "backups": 1 // how many log files there're gonna be at max - } + { /* Use whatever appender you want here */ } }*/ - /* + /* , { "type": "logLevelFilter" , "level": "error" // filters out all log messages that have a lower level than "error" , "appender": @@ -133,13 +129,11 @@ , "subject": "An error occured in your EPL instance!" , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message - , "transport": "SMTP" // More available transports are documented here: https://github.com/andris9/Nodemailer#possible-transport-methods - , "SMTP": { - "host": "smtp.gmail.com", + , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods + "host": "smtp.example.com", "port": 465, "secureConnection": true, - "port": 465, "auth": { - "user": "foo@bar.com", + "user": "foo@example.com", "pass": "bar_foo" } } From 44965f462b9120d373ddbe0454e279c0debed6ec Mon Sep 17 00:00:00 2001 From: yourcelf Date: Sun, 3 Mar 2013 16:25:09 -0500 Subject: [PATCH 076/463] Fix comma errors in settings.json.template --- settings.json.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.json.template b/settings.json.template index 359b1646..b3c65dc9 100644 --- a/settings.json.template +++ b/settings.json.template @@ -95,7 +95,7 @@ */ // restrict socket.io transport methods - "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"] + "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"], /* The log level we are using, can be: DEBUG, INFO, WARN, ERROR */ "loglevel": "INFO", @@ -139,5 +139,5 @@ } } }*/ - ] }, + ] } } From 6c304f04801c26b164b411a04a673c36cade3a64 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 4 Mar 2013 11:46:05 +0000 Subject: [PATCH 077/463] Localisation updates from http://translatewiki.net. --- src/locales/ca.json | 14 +++++++++++++- src/locales/os.json | 5 ++++- src/locales/te.json | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/locales/ca.json b/src/locales/ca.json index ca4d3f19..ec521eca 100644 --- a/src/locales/ca.json +++ b/src/locales/ca.json @@ -17,7 +17,7 @@ "pad.toolbar.undo.title": "Desf\u00e9s (Ctrl-Z)", "pad.toolbar.redo.title": "Ref\u00e9s (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Neteja els colors d'autoria", - "pad.toolbar.savedRevision.title": "Revisions desades", + "pad.toolbar.savedRevision.title": "Desa la revisi\u00f3", "pad.toolbar.settings.title": "Configuraci\u00f3", "pad.toolbar.showusers.title": "Mostra els usuaris d\u2019aquest pad", "pad.colorpicker.save": "Desa", @@ -25,18 +25,25 @@ "pad.loading": "S'est\u00e0 carregant...", "pad.wrongPassword": "La contrasenya \u00e9s incorrecta", "pad.settings.myView": "La meva vista", + "pad.settings.stickychat": "Xateja sempre a la pantalla", + "pad.settings.colorcheck": "Colors d'autoria", "pad.settings.linenocheck": "N\u00fameros de l\u00ednia", "pad.settings.fontType": "Tipus de lletra:", "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "D'amplada fixa", "pad.settings.globalView": "Vista global", "pad.settings.language": "Llengua:", "pad.importExport.import_export": "Importaci\u00f3\/exportaci\u00f3", "pad.importExport.import": "Puja qualsevol fitxer de text o document", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Text net", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", "pad.modals.connected": "Connectat.", "pad.modals.forcereconnect": "For\u00e7a tornar a connectar", "pad.modals.unauth": "No autoritzat", + "pad.modals.unauth.explanation": "Els vostres permisos han canviat mentre es visualitzava la p\u00e0gina. Proveu de reconnectar-vos.", "pad.modals.looping": "Desconnectat.", "pad.modals.initsocketfail": "El servidor no \u00e9s accessible.", "pad.modals.initsocketfail.explanation": "No s'ha pogut connectar amb el servidor de sincronitzaci\u00f3.", @@ -44,6 +51,7 @@ "pad.modals.slowcommit.explanation": "El servidor no respon.", "pad.modals.deleted": "Suprimit.", "pad.modals.disconnected": "Heu estat desconnectat.", + "pad.modals.disconnected.cause": "El servidor sembla que no est\u00e0 disponible. Notifiqueu-nos si continua passant.", "pad.share.readonly": "Nom\u00e9s de lectura", "pad.share.link": "Enlla\u00e7", "pad.chat": "Xat", @@ -52,6 +60,8 @@ "timeslider.toolbar.exportlink.title": "Exporta", "timeslider.exportCurrent": "Exporta la versi\u00f3 actual com a:", "timeslider.version": "Versi\u00f3 {{version}}", + "timeslider.saved": "Desat {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Gener", "timeslider.month.february": "Febrer", "timeslider.month.march": "Mar\u00e7", @@ -69,9 +79,11 @@ "pad.userlist.guest": "Convidat", "pad.userlist.deny": "Refusa", "pad.userlist.approve": "Aprova", + "pad.editbar.clearcolors": "Voleu netejar els colors d'autor del document sencer?", "pad.impexp.importbutton": "Importa ara", "pad.impexp.importing": "Important...", "pad.impexp.convertFailed": "No \u00e9s possible d'importar aquest fitxer. Si us plau, podeu provar d'utilitzar un format diferent o copiar i enganxar manualment.", + "pad.impexp.uploadFailed": "Ha fallat la c\u00e0rrega. Torneu-ho a provar", "pad.impexp.importfailed": "Ha fallat la importaci\u00f3", "pad.impexp.copypaste": "Si us plau, copieu i enganxeu" } \ No newline at end of file diff --git a/src/locales/os.json b/src/locales/os.json index 4acfad7e..64b3ea2a 100644 --- a/src/locales/os.json +++ b/src/locales/os.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5 \u0430\u0439\u0441\u044b\u043d\u04d5\u043d", "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u0439\/\u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u043c", "pad.toolbar.timeslider.title": "\u0420\u04d5\u0441\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", - "pad.toolbar.savedRevision.title": "\u04d4\u0432\u04d5\u0440\u0434 \u0444\u04d5\u043b\u0442\u04d5\u0440\u0442\u04d5", + "pad.toolbar.savedRevision.title": "\u0424\u04d5\u043b\u0442\u04d5\u0440 \u0431\u0430\u0432\u04d5\u0440\u044b\u043d\u04d5\u043d", "pad.toolbar.settings.title": "\u0423\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u04d5", "pad.toolbar.embed.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0444\u0442\u0430\u0443\u044b\u043d", "pad.toolbar.showusers.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0440\u0445\u0430\u0439\u0434\u0436\u044b\u0442\u044b \u0440\u0430\u0432\u0434\u0438\u0441\u044b\u043d", @@ -78,6 +78,7 @@ "pad.share.emebdcode": "URL \u0431\u0430\u0432\u04d5\u0440\u044b\u043d", "pad.chat": "\u041d\u044b\u0445\u0430\u0441", "pad.chat.title": "\u041e\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u043d \u0447\u0430\u0442 \u0431\u0430\u043a\u04d5\u043d.", + "pad.chat.loadmessages": "\u0424\u044b\u043b\u0434\u04d5\u0440 \u0444\u044b\u0441\u0442\u04d5\u0433 \u0440\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", "timeslider.pageTitle": "{{appTitle}}-\u044b \u0440\u04d5\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", "timeslider.toolbar.returnbutton": "\u0424\u04d5\u0441\u0442\u04d5\u043c\u04d5, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5", "timeslider.toolbar.authors": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5:", @@ -99,6 +100,8 @@ "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", + "timeslider.unnamedauthor": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0433", + "timeslider.unnamedauthors": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b", "pad.savedrevs.marked": "\u0410\u0446\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0440 \u043a\u0443\u044b\u0434 \u04d5\u0432\u04d5\u0440\u0434 \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0441\u0430\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434", "pad.userlist.entername": "\u0414\u04d5 \u043d\u043e\u043c \u0431\u0430\u0444\u044b\u0441\u0441", "pad.userlist.unnamed": "\u04d5\u043d\u04d5\u043d\u043e\u043c", diff --git a/src/locales/te.json b/src/locales/te.json index 7e18b7a4..666a40aa 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -38,6 +38,7 @@ "pad.settings.language": "\u0c2d\u0c3e\u0c37", "pad.importExport.import_export": "\u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f\/\u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f", "pad.importExport.import": "\u0c2a\u0c3e\u0c20\u0c2e\u0c41 \u0c26\u0c38\u0c4d\u0c24\u0c4d\u0c30\u0c2e\u0c41 \u0c32\u0c47\u0c26\u0c3e \u0c2a\u0c24\u0c4d\u0c30\u0c2e\u0c41\u0c28\u0c41 \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", + "pad.importExport.importSuccessful": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02!", "pad.importExport.export": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c2e\u0c41\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", "pad.importExport.exporthtml": "\u0c39\u0c46\u0c1a\u0c4d \u0c1f\u0c3f \u0c0e\u0c02 \u0c0e\u0c32\u0c4d", "pad.importExport.exportplain": "\u0c38\u0c3e\u0c26\u0c3e \u0c2a\u0c3e\u0c20\u0c4d\u0c2f\u0c02", From aa9fd7621a52a02c185de7a9faedd7e12c711b4d Mon Sep 17 00:00:00 2001 From: Victor Hooi Date: Tue, 5 Mar 2013 05:58:03 +1100 Subject: [PATCH 078/463] Remove nested /* */ from settings.json.template --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index b3c65dc9..ec0e6f83 100644 --- a/settings.json.template +++ b/settings.json.template @@ -119,7 +119,7 @@ , { "type": "logLevelFilter" , "level": "warn" // filters out all log messages that have a lower level than "error" , "appender": - { /* Use whatever appender you want here */ } + { Use whatever appender you want here } }*/ /* , { "type": "logLevelFilter" From 3dee4098b00700fbecaa1a919cc7f78192c920ec Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 5 Mar 2013 13:24:24 +0000 Subject: [PATCH 079/463] update ueberdb --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 5b21334d..44d03d80 100644 --- a/src/package.json +++ b/src/package.json @@ -16,7 +16,7 @@ "require-kernel" : "1.0.5", "resolve" : "0.2.x", "socket.io" : "0.9.x", - "ueberDB" : "0.1.92", + "ueberDB" : "0.1.94", "async" : "0.1.x", "express" : "3.x", "connect" : "2.4.x", From 7f9a51e6148097f6c406303dbcfbb1c455478ba0 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 5 Mar 2013 13:33:09 +0000 Subject: [PATCH 080/463] changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b38380..1e4857bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,22 @@ # 1.2.8 + ! IMPORTANT: New setting.json value is required to automatically reconnect clients on disconnect * NEW: Use Socket IO for rooms (allows for pads to be load balanced with sticky rooms) * NEW: Plugins can now provide their own frontend tests * NEW: Improved server-side logging * NEW: Admin dashboard mobile device support and new hooks for Admin dashboard * NEW: Get current API version from API + * NEW: CLI script to delete pads + * Fix: Automatic client reconnection on disonnect * Fix: Text Export indentation now supports multiple indentations * Fix: Bugfix getChatHistory API method * Fix: Stop Chrome losing caret after paste is texted * Fix: Make colons on end of line create 4 spaces on indent + * Fix: Stop the client disconnecting if a rev is in the wrong order + * Fix: Various server crash issues based on rev in wrong order + * Fix: Various tests * Fix: Make indent when on middle of the line stop creating list * Fix: Stop long strings breaking the UX by moving focus away from beginning of line + * Fix: Redis findKeys support * Fix: padUsersCount no longer hangs server * Fix: Issue with two part locale specs not working * Fix: Make plugin search case insensitive @@ -19,9 +26,13 @@ * Fix: Stop Opera browser inserting two new lines on enter keypress * Fix: Stop timeslider from showing NaN on pads with only one revision * Other: Allow timeslider tests to run and provide & fix various other frontend-tests + * Other: Begin dropping referene to Lite. Etherpad Lite is now named "Etherpad" * Other: Update to latest jQuery * Other: Change loading message asking user to please wait on first build * Other: Allow etherpad to use global npm installation (Safe since node 6.3) + * Other: Better documentation for log rotation and log message handling + + # 1.2.7 * NEW: notifications are now modularized and can be stacked From 38499465c30bd7edfad351ab4949839d81cde545 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 5 Mar 2013 19:01:22 +0000 Subject: [PATCH 081/463] fix chat simulation test to work in android --- tests/frontend/specs/keystroke_chat.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/frontend/specs/keystroke_chat.js b/tests/frontend/specs/keystroke_chat.js index 060c5aa2..e4908728 100644 --- a/tests/frontend/specs/keystroke_chat.js +++ b/tests/frontend/specs/keystroke_chat.js @@ -30,8 +30,9 @@ describe("send chat message", function(){ var usernameValue = username.text(); var time = $firstChatMessage.children(".time"); var timeValue = time.text(); - var expectedStringIncludingUserNameAndTime = usernameValue + timeValue + " " + "JohnMcLear"; - expect(expectedStringIncludingUserNameAndTime).to.be($firstChatMessage.text()); + var discoveredValue = $firstChatMessage.text(); + var chatMsgExists = (discoveredValue.indexOf("JohnMcLear") !== -1); + expect(chatMsgExists).to.be(true); done(); }); @@ -61,6 +62,7 @@ describe("send chat message", function(){ expect(containsMessage).to.be(true); done(); }); - }); + }); + From 67a07307100e588adf68ca075c307a293b7ac177 Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Tue, 5 Mar 2013 21:28:38 +0100 Subject: [PATCH 082/463] added nodemailer to package.json - fix #1586 --- src/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/package.json b/src/package.json index 44d03d80..38085650 100644 --- a/src/package.json +++ b/src/package.json @@ -24,6 +24,7 @@ "uglify-js" : "1.2.5", "formidable" : "1.0.9", "log4js" : "0.5.x", + "nodemailer" : "0.3.x", "jsdom-nocontextifiy" : "0.2.10", "async-stacktrace" : "0.0.2", "npm" : "1.1.x", From d8ca1b9139c95fa47e9a55220061aef7d3e29b2e Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Tue, 5 Mar 2013 21:29:44 +0100 Subject: [PATCH 083/463] Update settings.json.template --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index ec0e6f83..40b7289f 100644 --- a/settings.json.template +++ b/settings.json.template @@ -123,7 +123,7 @@ }*/ /* , { "type": "logLevelFilter" - , "level": "error" // filters out all log messages that have a lower level than "error" + , "level": "error" // filters out all log messages that have a lower or same level than "error" , "appender": { "type": "smtp" , "subject": "An error occured in your EPL instance!" From f9f8b1c0794610f08cb41bd0d06a427719701ed1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 5 Mar 2013 20:30:31 +0000 Subject: [PATCH 084/463] allow chrome to do control z type functionality, not sure why this was never in.. broken when we last updated jQ anyway --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index ddb614be..f2320926 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3580,7 +3580,7 @@ function Ace2Inner(){ var specialHandled = false; var isTypeForSpecialKey = ((browser.msie || browser.safari) ? (type == "keydown") : (type == "keypress")); - var isTypeForCmdKey = ((browser.msie || browser.safari) ? (type == "keydown") : (type == "keypress")); + var isTypeForCmdKey = ((browser.msie || browser.safari || browser.chrome) ? (type == "keydown") : (type == "keypress")); var stopped = false; From d464ea9817045dc742205a5c03aeff59e9d2ace3 Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Tue, 5 Mar 2013 22:36:51 +0100 Subject: [PATCH 085/463] Update settings.json.template --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index 40b7289f..ec0e6f83 100644 --- a/settings.json.template +++ b/settings.json.template @@ -123,7 +123,7 @@ }*/ /* , { "type": "logLevelFilter" - , "level": "error" // filters out all log messages that have a lower or same level than "error" + , "level": "error" // filters out all log messages that have a lower level than "error" , "appender": { "type": "smtp" , "subject": "An error occured in your EPL instance!" From 760e1b82c35598d7064ce8dee5421adcf2053ff7 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 5 Mar 2013 23:12:00 +0100 Subject: [PATCH 086/463] Add a setting for RTL text direction (integrating the url paramter) Fixes #1191 --- doc/api/embed_parameters.md | 6 ++++++ src/locales/en.json | 1 + src/static/js/pad.js | 2 +- src/static/js/pad_editor.js | 22 ++++++++++++++++++++-- src/templates/pad.html | 4 ++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/doc/api/embed_parameters.md b/doc/api/embed_parameters.md index 3100fff9..dcbe3e5b 100644 --- a/doc/api/embed_parameters.md +++ b/doc/api/embed_parameters.md @@ -60,3 +60,9 @@ Default: en Example: `lang=ar` (translates the interface into Arabic) +## rtl + * Boolean + +Default: true +Displays pad text from right to left. + diff --git a/src/locales/en.json b/src/locales/en.json index bef6dfd0..920a2b00 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -29,6 +29,7 @@ "pad.settings.stickychat": "Chat always on screen", "pad.settings.colorcheck": "Authorship colors", "pad.settings.linenocheck": "Line numbers", + "pad.settings.rtlcheck": "Read content from right to left?", "pad.settings.fontType": "Font type:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 6e8b2ae0..4b052620 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -313,7 +313,7 @@ function handshake() if (settings.rtlIsTrue == true) { - pad.changeViewOption('rtl', true); + pad.changeViewOption('rtlIsTrue', true); } // If the Monospacefont value is set to true then change it to monospace. diff --git a/src/static/js/pad_editor.js b/src/static/js/pad_editor.js index dd0cbbbb..b73409ff 100644 --- a/src/static/js/pad_editor.js +++ b/src/static/js/pad_editor.js @@ -62,20 +62,36 @@ var padeditor = (function() }, initViewOptions: function() { + // Line numbers padutils.bindCheckboxChange($("#options-linenoscheck"), function() { pad.changeViewOption('showLineNumbers', padutils.getCheckbox($("#options-linenoscheck"))); }); + + // Author colors padutils.bindCheckboxChange($("#options-colorscheck"), function() { padcookie.setPref('showAuthorshipColors', padutils.getCheckbox("#options-colorscheck")); pad.changeViewOption('showAuthorColors', padutils.getCheckbox("#options-colorscheck")); }); + + // Right to left + padutils.bindCheckboxChange($("#options-rtlcheck"), function() + { + pad.changeViewOption('rtlIsTrue', padutils.getCheckbox($("#options-rtlcheck"))) + }); + html10n.bind('localized', function() { + pad.changeViewOption('rtlIsTrue', ('rtl' == html10n.getDirection())); + padutils.setCheckbox($("#options-rtlcheck"), ('rtl' == html10n.getDirection())); + }) + + // font face $("#viewfontmenu").change(function() { pad.changeViewOption('useMonospaceFont', $("#viewfontmenu").val() == 'monospace'); }); + // Language html10n.bind('localized', function() { $("#languagemenu").val(html10n.getLanguage()); // translate the value of 'unnamed' and 'Enter your name' textboxes in the userlist @@ -104,12 +120,14 @@ var padeditor = (function() if (value == "false") return false; return defaultValue; } - self.ace.setProperty("rtlIsTrue", settings.rtlIsTrue); var v; - v = getOption('rtlIsTrue', false); + v = getOption('rtlIsTrue', ('rtl' == html10n.getDirection())); + // Override from parameters if true + if(settings.rtlIsTrue === true) v = true; self.ace.setProperty("rtlIsTrue", v); + padutils.setCheckbox($("#options-rtlcheck"), v); v = getOption('showLineNumbers', true); self.ace.setProperty("showslinenumbers", v); diff --git a/src/templates/pad.html b/src/templates/pad.html index 76df5133..1d8c069a 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -217,6 +217,10 @@

    +

    + + +

    <% e.end_block(); %> <% e.begin_block("mySettings.dropdowns"); %> From 1cfc8eda19176f9359a1bce6ff62d3c6680d3395 Mon Sep 17 00:00:00 2001 From: Nelson Silva Date: Wed, 13 Feb 2013 16:29:01 +0000 Subject: [PATCH 087/463] Initial work on swagger --- src/ep.json | 3 +- src/node/handler/APIHandler.js | 5 + src/node/hooks/express/swagger.js | 378 ++++++++++++++++++++++++++++++ src/package.json | 3 +- 4 files changed, 387 insertions(+), 2 deletions(-) create mode 100644 src/node/hooks/express/swagger.js diff --git a/src/ep.json b/src/ep.json index 89c8964a..eeb5c640 100644 --- a/src/ep.json +++ b/src/ep.json @@ -23,6 +23,7 @@ { "name": "adminsettings", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/adminsettings:expressCreateServer", "socketio": "ep_etherpad-lite/node/hooks/express/adminsettings:socketio" } - } + }, + { "name": "swagger", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/swagger:expressCreateServer" } } ] } diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 8be5b5fe..4b7dd951 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -219,6 +219,9 @@ var version = // set the latest available API version here exports.latestApiVersion = '1.2.7'; +// exports the versions so it can be used by the new Swagger endpoint +exports.version = version; + /** * Handles a HTTP API call * @param functionName the name of the called function @@ -266,6 +269,8 @@ exports.handle = function(apiVersion, functionName, fields, req, res) } //check the api key! + fields["apikey"] = fields["apikey"] || fields["api_key"]; + if(fields["apikey"] != apikey.trim()) { res.send({code: 4, message: "no or wrong API Key", data: null}); diff --git a/src/node/hooks/express/swagger.js b/src/node/hooks/express/swagger.js new file mode 100644 index 00000000..cd0bf8ad --- /dev/null +++ b/src/node/hooks/express/swagger.js @@ -0,0 +1,378 @@ +var log4js = require('log4js'); +var express = require('express'); +var swagger = require("swagger-node-express"); +var apiHandler = require('../../handler/APIHandler'); +var apiCaller = require('./apicalls').apiCaller; +var settings = require("../../utils/Settings"); + +var versions = Object.keys(apiHandler.version) +var version = versions[versions.length - 1]; + +var swaggerModels = { + 'models': { + 'SessionInfo' : { + "id": 'SessionInfo', + "properties": { + "id": { + "type": "string" + }, + "authorID": { + "type": "string" + }, + "groupID":{ + "type":"string" + }, + "validUntil":{ + "type":"long" + } + } + }, + 'UserInfo' : { + "id": 'UserInfo', + "properties": { + "id": { + "type": "string" + }, + "colorId": { + "type": "string" + }, + "name":{ + "type":"string" + }, + "timestamp":{ + "type":"long" + } + } + }, + 'Message' : { + "id": 'Message', + "properties": { + "text": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "userName":{ + "type":"string" + }, + "time":{ + "type":"long" + } + } + } + } +}; + +function sessionListResponseProcessor(res) { + if (res.data) { + var sessions = []; + for (var sessionId in res.data) { + var sessionInfo = res.data[sessionId]; + sessionId["id"] = sessionId; + sessions.push(sessionInfo); + } + res.data = sessions; + } + + return res; +} + +// We'll add some more info to the API methods +var API = { + + // Group + "group": { + "create" : { + "func" : "createGroup", + "description": "creates a new group", + "response": {"groupID":{"type":"string"}} + }, + "createIfNotExistsFor" : { + "func": "createGroupIfNotExistsFor", + "description": "this functions helps you to map your application group ids to etherpad lite group ids", + "response": {"groupID":{"type":"string"}} + }, + "delete" : { + "func": "deleteGroup", + "description": "deletes a group" + }, + "listPads" : { + "func": "listPads", + "description": "returns all pads of this group", + "response": {"padIDs":{"type":"List", "items":{"type":"string"}}} + }, + "createPad" : { + "func": "createGroupPad", + "description": "creates a new pad in this group" + }, + "listSessions": { + "func": "listSessionsOfGroup", + "responseProcessor": sessionListResponseProcessor, + "description": "", + "response": {"sessions":{"type":"List", "items":{"type":"SessionInfo"}}} + }, + "list": { + "func": "listAllGroups", + "description": "", + "response": {"groupIDs":{"type":"List", "items":{"type":"string"}}} + }, + }, + + // Author + "author": { + "create" : { + "func" : "createAuthor", + "description": "creates a new author", + "response": {"authorID":{"type":"string"}} + }, + "createIfNotExistsFor": { + "func": "createAuthorIfNotExistsFor", + "description": "this functions helps you to map your application author ids to etherpad lite author ids", + "response": {"authorID":{"type":"string"}} + }, + "listPads": { + "func": "listPadsOfAuthor", + "description": "returns an array of all pads this author contributed to", + "response": {"padIDs":{"type":"List", "items":{"type":"string"}}} + }, + "listSessions": { + "func": "listSessionsOfAuthor", + "responseProcessor": sessionListResponseProcessor, + "description": "returns all sessions of an author", + "response": {"sessions":{"type":"List", "items":{"type":"SessionInfo"}}} + }, + "getName" : { + "func": "getAuthorName", + "description": "Returns the Author Name of the author", + "response": {"authorName":{"type":"string"}} + }, + }, + "session": { + "create" : { + "func": "createSession", + "description": "creates a new session. validUntil is an unix timestamp in seconds", + "response": {"sessionID":{"type":"string"}} + }, + "delete" : { + "func": "deleteSession", + "description": "deletes a session" + }, + "info": { + "func": "getSessionInfo", + "description": "returns informations about a session", + "response": {"authorID":{"type":"string"}, "groupID":{"type":"string"}, "validUntil":{"type":"long"}} + }, + }, + "pad": { + "listAll" : { + "func": "listAllPads", + "description": "list all the pads", + "response": {"padIDs":{"type":"List", "items": {"type" : "string"}}} + }, + "createDiffHTML" : { + "func" : "createDiffHTML", + "description": "", + "response": {} + }, + "create" : { + "func" : "createPad", + "description": "creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad", + }, + "getText" : { + "func" : "getText", + "description": "returns the text of a pad" + }, + "setText" : { + "func" : "setText", + "description": "sets the text of a pad", + "response": {"groupID":{"type":"string"}} + }, + "getHTML": { + "func" : "getHTML", + "description": "returns the text of a pad formatted as HTML", + "response": {"html":{"type":"string"}} + }, + "setHTML": { + "func" : "setHTML", + "description": "sets the text of a pad with HTML" + }, + "getRevisionsCount": { + "func" : "getRevisionsCount", + "description": "returns the number of revisions of this pad", + "response": {"revisions":{"type":"long"}} + }, + "getLastEdited": { + "func" : "getLastEdited", + "description": "returns the timestamp of the last revision of the pad", + "response": {"lastEdited":{"type":"long"}} + }, + "delete": { + "func" : "deletePad", + "description": "deletes a pad" + }, + "getReadOnlyID": { + "func" : "getReadOnlyID", + "description": "returns the read only link of a pad", + "response": {"readOnlyID":{"type":"string"}} + }, + "setPublicStatus": { + "func": "setPublicStatus", + "description": "sets a boolean for the public status of a pad" + }, + "getPublicStatus": { + "func": "getPublicStatus", + "description": "return true of false", + "response": {"publicStatus":{"type":"bool"}} + }, + "setPassword": { + "func": "setPassword", + "description": "returns ok or a error message" + }, + "isPasswordProtected": { + "func": "isPasswordProtected", + "description": "returns true or false", + "response": {"passwordProtection":{"type":"bool"}} + }, + "authors": { + "func": "listAuthorsOfPad", + "description": "returns an array of authors who contributed to this pad", + "response": {"authorIDs":{"type":"List", "items":{"type" : "string"}}} + }, + "usersCount": { + "func": "padUsersCount", + "description": "returns the number of user that are currently editing this pad", + "response": {"padUsersCount":{"type": "long"}} + }, + "users": { + "func": "padUsers", + "description": "returns the list of users that are currently editing this pad", + "response": {"padUsers":{"type":"Lists", "items":{"type": "UserInfo"}}} + }, + "sendClientsMessage": { + "func": "sendClientsMessage", + "description": "sends a custom message of type msg to the pad" + }, + "checkToken" : { + "func": "checkToken", + "description": "returns ok when the current api token is valid" + }, + "getChatHistory": { + "func": "getChatHistory", + "description": "returns the chat history", + "response": {"messages":{"type":"List", "items": {"type" : "Message"}}} + }, + "getChatHead": { + "func": "getChatHead", + "description": "returns the chatHead (last number of the last chat-message) of the pad", + "response": {"chatHead":{"type":"long"}} + } + } +}; + +function capitalise(string){ + return string.charAt(0).toUpperCase() + string.slice(1); +} + +for (var resource in API) { + for (var func in API[resource]) { + + // Add the response model + var responseModelId = capitalise(resource) + capitalise(func) + "Response"; + + swaggerModels['models'][responseModelId] = { + "id": responseModelId, + "properties": { + "code":{ + "type":"int" + }, + "message":{ + "type":"string" + } + } + }; + + // This returns some data + if (API[resource][func]["response"]) { + // Add the data model + var dataModelId = capitalise(resource) + capitalise(func) + "Data"; + swaggerModels['models'][dataModelId] = { + "id": dataModelId, + "properties": API[resource][func]["response"] + }; + + swaggerModels['models'][responseModelId]["properties"]["data"] = { + "type": dataModelId + }; + } + + // Store the response model id + API[resource][func]["responseClass"] = responseModelId; + + // get the api function + var apiFunc = apiHandler.version[version][API[resource][func]["func"]]; + + // Add the api function parameters + API[resource][func]["params"] = apiFunc.map( function(param) { + return swagger.queryParam(param, param, "string"); + }); + } +} + +exports.expressCreateServer = function (hook_name, args, cb) { + + // Let's put this under /rest for now + var subpath = express(); + + args.app.use(express.bodyParser()); + args.app.use("/rest", subpath); + + swagger.setAppHandler(subpath); + + swagger.addModels(swaggerModels); + + for (var resource in API) { + + for (var funcName in API[resource]) { + var func = API[resource][funcName]; + + var swaggerFunc = { + 'spec': { + "description" : func["description"], + "path" : "/" + resource + "/" + funcName, + "summary" : funcName, + "nickname" : funcName, + "method": "GET", + "params" : func["params"], + "responseClass" : func["responseClass"] + }, + 'action': (function(func, responseProcessor) { + return function (req,res) { + req.params.version = version; + req.params.func = func; // call the api function + + if (responseProcessor) { + //wrap the send function so we can process the response + res.__swagger_send = res.send; + res.send = function (response) { + response = responseProcessor(response); + res.__swagger_send(response); + } + } + apiCaller(req, res, req.query); + }; + })(func["func"], func["responseProcessor"]) // must use a closure here + }; + + swagger.addGet(swaggerFunc); + } + } + + swagger.setHeaders = function setHeaders(res) { + res.header('Access-Control-Allow-Origin', "*"); + }; + + swagger.configureSwaggerPaths("", "/api" , ""); + + swagger.configure("http://" + settings.ip + ":" + settings.port + "/rest", version); +} diff --git a/src/package.json b/src/package.json index 44d03d80..f9d7a7a4 100644 --- a/src/package.json +++ b/src/package.json @@ -36,7 +36,8 @@ "tinycon" : "0.0.1", "underscore" : "1.3.1", "unorm" : "1.0.0", - "languages4translatewiki" : "0.1.3" + "languages4translatewiki" : "0.1.3", + "swagger-node-express" : "1.2.3" }, "bin": { "etherpad-lite": "./node/server.js" }, "devDependencies": { From 8f279a67100f5225d05ee58fe90cb08fb6e9f119 Mon Sep 17 00:00:00 2001 From: Nelson Silva Date: Fri, 15 Feb 2013 14:10:03 +0000 Subject: [PATCH 088/463] Added some fixes to make it work with the codegen --- src/node/hooks/express/swagger.js | 105 ++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 34 deletions(-) diff --git a/src/node/hooks/express/swagger.js b/src/node/hooks/express/swagger.js index cd0bf8ad..3e06ed29 100644 --- a/src/node/hooks/express/swagger.js +++ b/src/node/hooks/express/swagger.js @@ -142,11 +142,18 @@ var API = { "description": "returns all sessions of an author", "response": {"sessions":{"type":"List", "items":{"type":"SessionInfo"}}} }, + // We need an operation that return a UserInfo so it can be picked up by the codegen :( "getName" : { "func": "getAuthorName", - "description": "Returns the Author Name of the author", - "response": {"authorName":{"type":"string"}} - }, + "description": "Returns the Author Name of the author", + "responseProcessor": function(response) { + if (response.data) { + response["info"] = {"name": response.data.authorName}; + delete response["data"]; + } + }, + "response": {"info":{"type":"UserInfo"}} + } }, "session": { "create" : { @@ -158,10 +165,18 @@ var API = { "func": "deleteSession", "description": "deletes a session" }, + // We need an operation that returns a SessionInfo so it can be picked up by the codegen :( "info": { "func": "getSessionInfo", - "description": "returns informations about a session", - "response": {"authorID":{"type":"string"}, "groupID":{"type":"string"}, "validUntil":{"type":"long"}} + "description": "returns informations about a session", + "responseProcessor": function(response) { + // move this to info + if (response.data) { + response["info"] = response.data; + delete response["data"]; + } + }, + "response": {"info":{"type":"SessionInfo"}} }, }, "pad": { @@ -181,12 +196,12 @@ var API = { }, "getText" : { "func" : "getText", - "description": "returns the text of a pad" + "description": "returns the text of a pad", + "response": {"text":{"type":"string"}} }, "setText" : { "func" : "setText", - "description": "sets the text of a pad", - "response": {"groupID":{"type":"string"}} + "description": "sets the text of a pad" }, "getHTML": { "func" : "getHTML", @@ -223,7 +238,7 @@ var API = { "getPublicStatus": { "func": "getPublicStatus", "description": "return true of false", - "response": {"publicStatus":{"type":"bool"}} + "response": {"publicStatus":{"type":"boolean"}} }, "setPassword": { "func": "setPassword", @@ -232,7 +247,7 @@ var API = { "isPasswordProtected": { "func": "isPasswordProtected", "description": "returns true or false", - "response": {"passwordProtection":{"type":"bool"}} + "response": {"passwordProtection":{"type":"boolean"}} }, "authors": { "func": "listAuthorsOfPad", @@ -247,7 +262,7 @@ var API = { "users": { "func": "padUsers", "description": "returns the list of users that are currently editing this pad", - "response": {"padUsers":{"type":"Lists", "items":{"type": "UserInfo"}}} + "response": {"padUsers":{"type":"List", "items":{"type": "UserInfo"}}} }, "sendClientsMessage": { "func": "sendClientsMessage", @@ -262,10 +277,18 @@ var API = { "description": "returns the chat history", "response": {"messages":{"type":"List", "items": {"type" : "Message"}}} }, + // We need an operation that returns a Message so it can be picked up by the codegen :( "getChatHead": { "func": "getChatHead", - "description": "returns the chatHead (last number of the last chat-message) of the pad", - "response": {"chatHead":{"type":"long"}} + "description": "returns the chatHead (chat-message) of the pad", + "responseProcessor": function(response) { + // move this to info + if (response.data) { + response["chatHead"] = {"time": response.data["chatHead"]}; + delete response["data"]; + } + }, + "response": {"chatHead":{"type":"Message"}} } } }; @@ -277,11 +300,8 @@ function capitalise(string){ for (var resource in API) { for (var func in API[resource]) { - // Add the response model - var responseModelId = capitalise(resource) + capitalise(func) + "Response"; - - swaggerModels['models'][responseModelId] = { - "id": responseModelId, + // The base response model + var responseModel = { "properties": { "code":{ "type":"int" @@ -292,20 +312,25 @@ for (var resource in API) { } }; - // This returns some data - if (API[resource][func]["response"]) { - // Add the data model - var dataModelId = capitalise(resource) + capitalise(func) + "Data"; - swaggerModels['models'][dataModelId] = { - "id": dataModelId, - "properties": API[resource][func]["response"] - }; + var responseModelId = "Response"; - swaggerModels['models'][responseModelId]["properties"]["data"] = { - "type": dataModelId - }; + // Add the data properties (if any) to the response + if (API[resource][func]["response"]) { + // This is a specific response so let's set a new id + responseModelId = capitalise(resource) + capitalise(func) + "Response"; + + for(var prop in API[resource][func]["response"]) { + var propType = API[resource][func]["response"][prop]; + responseModel["properties"][prop] = propType; + } } + // Add the id + responseModel["id"] = responseModelId; + + // Add this to the swagger models + swaggerModels['models'][responseModelId] = responseModel; + // Store the response model id API[resource][func]["responseClass"] = responseModelId; @@ -351,14 +376,26 @@ exports.expressCreateServer = function (hook_name, args, cb) { req.params.version = version; req.params.func = func; // call the api function - if (responseProcessor) { - //wrap the send function so we can process the response - res.__swagger_send = res.send; - res.send = function (response) { + //wrap the send function so we can process the response + res.__swagger_send = res.send; + res.send = function (response) { + // ugly but we need to get this as json + response = JSON.parse(response); + // process the response if needed + if (responseProcessor) { response = responseProcessor(response); - res.__swagger_send(response); } + // Let's move everything out of "data" + if (response.data) { + for(var prop in response.data) { + response[prop] = response.data[prop]; + delete response.data; + } + } + response = JSON.stringify(response); + res.__swagger_send(response); } + apiCaller(req, res, req.query); }; })(func["func"], func["responseProcessor"]) // must use a closure here From a5987285e01413ab9f0921011ab57d2615025b63 Mon Sep 17 00:00:00 2001 From: "nelson.silva" Date: Sat, 16 Feb 2013 14:57:09 +0000 Subject: [PATCH 089/463] Multiple REST endpoints (one per version) --- src/node/hooks/express/swagger.js | 230 ++++++++++++++++-------------- 1 file changed, 123 insertions(+), 107 deletions(-) diff --git a/src/node/hooks/express/swagger.js b/src/node/hooks/express/swagger.js index 3e06ed29..f4fc5cff 100644 --- a/src/node/hooks/express/swagger.js +++ b/src/node/hooks/express/swagger.js @@ -1,13 +1,9 @@ var log4js = require('log4js'); var express = require('express'); -var swagger = require("swagger-node-express"); var apiHandler = require('../../handler/APIHandler'); var apiCaller = require('./apicalls').apiCaller; var settings = require("../../utils/Settings"); -var versions = Object.keys(apiHandler.version) -var version = versions[versions.length - 1]; - var swaggerModels = { 'models': { 'SessionInfo' : { @@ -83,14 +79,14 @@ var API = { // Group "group": { - "create" : { + "create" : { "func" : "createGroup", - "description": "creates a new group", + "description": "creates a new group", "response": {"groupID":{"type":"string"}} }, "createIfNotExistsFor" : { "func": "createGroupIfNotExistsFor", - "description": "this functions helps you to map your application group ids to etherpad lite group ids", + "description": "this functions helps you to map your application group ids to etherpad lite group ids", "response": {"groupID":{"type":"string"}} }, "delete" : { @@ -98,23 +94,23 @@ var API = { "description": "deletes a group" }, "listPads" : { - "func": "listPads", - "description": "returns all pads of this group", + "func": "listPads", + "description": "returns all pads of this group", "response": {"padIDs":{"type":"List", "items":{"type":"string"}}} }, "createPad" : { - "func": "createGroupPad", + "func": "createGroupPad", "description": "creates a new pad in this group" }, "listSessions": { "func": "listSessionsOfGroup", "responseProcessor": sessionListResponseProcessor, - "description": "", + "description": "", "response": {"sessions":{"type":"List", "items":{"type":"SessionInfo"}}} }, "list": { "func": "listAllGroups", - "description": "", + "description": "", "response": {"groupIDs":{"type":"List", "items":{"type":"string"}}} }, }, @@ -122,24 +118,24 @@ var API = { // Author "author": { "create" : { - "func" : "createAuthor", - "description": "creates a new author", + "func" : "createAuthor", + "description": "creates a new author", "response": {"authorID":{"type":"string"}} }, "createIfNotExistsFor": { "func": "createAuthorIfNotExistsFor", - "description": "this functions helps you to map your application author ids to etherpad lite author ids", + "description": "this functions helps you to map your application author ids to etherpad lite author ids", "response": {"authorID":{"type":"string"}} }, "listPads": { "func": "listPadsOfAuthor", - "description": "returns an array of all pads this author contributed to", + "description": "returns an array of all pads this author contributed to", "response": {"padIDs":{"type":"List", "items":{"type":"string"}}} }, "listSessions": { "func": "listSessionsOfAuthor", "responseProcessor": sessionListResponseProcessor, - "description": "returns all sessions of an author", + "description": "returns all sessions of an author", "response": {"sessions":{"type":"List", "items":{"type":"SessionInfo"}}} }, // We need an operation that return a UserInfo so it can be picked up by the codegen :( @@ -158,7 +154,7 @@ var API = { "session": { "create" : { "func": "createSession", - "description": "creates a new session. validUntil is an unix timestamp in seconds", + "description": "creates a new session. validUntil is an unix timestamp in seconds", "response": {"sessionID":{"type":"string"}} }, "delete" : { @@ -167,7 +163,7 @@ var API = { }, // We need an operation that returns a SessionInfo so it can be picked up by the codegen :( "info": { - "func": "getSessionInfo", + "func": "getSessionInfo", "description": "returns informations about a session", "responseProcessor": function(response) { // move this to info @@ -177,22 +173,22 @@ var API = { } }, "response": {"info":{"type":"SessionInfo"}} - }, + } }, "pad": { - "listAll" : { - "func": "listAllPads", - "description": "list all the pads", + "listAll" : { + "func": "listAllPads", + "description": "list all the pads", "response": {"padIDs":{"type":"List", "items": {"type" : "string"}}} }, "createDiffHTML" : { - "func" : "createDiffHTML", - "description": "", + "func" : "createDiffHTML", + "description": "", "response": {} }, - "create" : { + "create" : { "func" : "createPad", - "description": "creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad", + "description": "creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad" }, "getText" : { "func" : "getText", @@ -205,7 +201,7 @@ var API = { }, "getHTML": { "func" : "getHTML", - "description": "returns the text of a pad formatted as HTML", + "description": "returns the text of a pad formatted as HTML", "response": {"html":{"type":"string"}} }, "setHTML": { @@ -214,12 +210,12 @@ var API = { }, "getRevisionsCount": { "func" : "getRevisionsCount", - "description": "returns the number of revisions of this pad", + "description": "returns the number of revisions of this pad", "response": {"revisions":{"type":"long"}} }, "getLastEdited": { "func" : "getLastEdited", - "description": "returns the timestamp of the last revision of the pad", + "description": "returns the timestamp of the last revision of the pad", "response": {"lastEdited":{"type":"long"}} }, "delete": { @@ -228,16 +224,16 @@ var API = { }, "getReadOnlyID": { "func" : "getReadOnlyID", - "description": "returns the read only link of a pad", + "description": "returns the read only link of a pad", "response": {"readOnlyID":{"type":"string"}} }, "setPublicStatus": { - "func": "setPublicStatus", + "func": "setPublicStatus", "description": "sets a boolean for the public status of a pad" }, "getPublicStatus": { "func": "getPublicStatus", - "description": "return true of false", + "description": "return true of false", "response": {"publicStatus":{"type":"boolean"}} }, "setPassword": { @@ -245,27 +241,27 @@ var API = { "description": "returns ok or a error message" }, "isPasswordProtected": { - "func": "isPasswordProtected", - "description": "returns true or false", + "func": "isPasswordProtected", + "description": "returns true or false", "response": {"passwordProtection":{"type":"boolean"}} }, "authors": { - "func": "listAuthorsOfPad", - "description": "returns an array of authors who contributed to this pad", + "func": "listAuthorsOfPad", + "description": "returns an array of authors who contributed to this pad", "response": {"authorIDs":{"type":"List", "items":{"type" : "string"}}} }, "usersCount": { - "func": "padUsersCount", - "description": "returns the number of user that are currently editing this pad", + "func": "padUsersCount", + "description": "returns the number of user that are currently editing this pad", "response": {"padUsersCount":{"type": "long"}} }, "users": { - "func": "padUsers", - "description": "returns the list of users that are currently editing this pad", + "func": "padUsers", + "description": "returns the list of users that are currently editing this pad", "response": {"padUsers":{"type":"List", "items":{"type": "UserInfo"}}} }, "sendClientsMessage": { - "func": "sendClientsMessage", + "func": "sendClientsMessage", "description": "sends a custom message of type msg to the pad" }, "checkToken" : { @@ -273,13 +269,13 @@ var API = { "description": "returns ok when the current api token is valid" }, "getChatHistory": { - "func": "getChatHistory", - "description": "returns the chat history", + "func": "getChatHistory", + "description": "returns the chat history", "response": {"messages":{"type":"List", "items": {"type" : "Message"}}} }, // We need an operation that returns a Message so it can be picked up by the codegen :( "getChatHead": { - "func": "getChatHead", + "func": "getChatHead", "description": "returns the chatHead (chat-message) of the pad", "responseProcessor": function(response) { // move this to info @@ -334,82 +330,102 @@ for (var resource in API) { // Store the response model id API[resource][func]["responseClass"] = responseModelId; - // get the api function - var apiFunc = apiHandler.version[version][API[resource][func]["func"]]; - - // Add the api function parameters - API[resource][func]["params"] = apiFunc.map( function(param) { - return swagger.queryParam(param, param, "string"); - }); } } +function newSwagger() { + var swagger_module = require.resolve("swagger-node-express"); + if (require.cache[swagger_module]) { + // delete the child modules from cache + require.cache[swagger_module].children.forEach(function(m) {delete require.cache[m.id];}); + // delete the module from cache + delete require.cache[swagger_module]; + } + return require("swagger-node-express"); +} + exports.expressCreateServer = function (hook_name, args, cb) { - // Let's put this under /rest for now - var subpath = express(); + for (var version in apiHandler.version) { + + var swagger = newSwagger(); + var basePath = "/rest/" + version; - args.app.use(express.bodyParser()); - args.app.use("/rest", subpath); + // Let's put this under /rest for now + var subpath = express(); - swagger.setAppHandler(subpath); + args.app.use(express.bodyParser()); + args.app.use(basePath, subpath); - swagger.addModels(swaggerModels); + swagger.setAppHandler(subpath); - for (var resource in API) { + swagger.addModels(swaggerModels); - for (var funcName in API[resource]) { - var func = API[resource][funcName]; + for (var resource in API) { - var swaggerFunc = { - 'spec': { - "description" : func["description"], - "path" : "/" + resource + "/" + funcName, - "summary" : funcName, - "nickname" : funcName, - "method": "GET", - "params" : func["params"], - "responseClass" : func["responseClass"] - }, - 'action': (function(func, responseProcessor) { - return function (req,res) { - req.params.version = version; - req.params.func = func; // call the api function + for (var funcName in API[resource]) { + var func = API[resource][funcName]; - //wrap the send function so we can process the response - res.__swagger_send = res.send; - res.send = function (response) { - // ugly but we need to get this as json - response = JSON.parse(response); - // process the response if needed - if (responseProcessor) { - response = responseProcessor(response); - } - // Let's move everything out of "data" - if (response.data) { - for(var prop in response.data) { - response[prop] = response.data[prop]; - delete response.data; + // get the api function + var apiFunc = apiHandler.version[version][func["func"]]; + + // Skip this one if it does not exist in the version + if(!apiFunc) { + continue; + } + + var swaggerFunc = { + 'spec': { + "description" : func["description"], + "path" : "/" + resource + "/" + funcName, + "summary" : funcName, + "nickname" : funcName, + "method": "GET", + "params" : apiFunc.map( function(param) { + return swagger.queryParam(param, param, "string"); + }), + "responseClass" : func["responseClass"] + }, + 'action': (function(func, responseProcessor) { + return function (req,res) { + req.params.version = version; + req.params.func = func; // call the api function + + //wrap the send function so we can process the response + res.__swagger_send = res.send; + res.send = function (response) { + // ugly but we need to get this as json + response = JSON.parse(response); + // process the response if needed + if (responseProcessor) { + response = responseProcessor(response); } - } - response = JSON.stringify(response); - res.__swagger_send(response); - } + // Let's move everything out of "data" + if (response.data) { + for(var prop in response.data) { + response[prop] = response.data[prop]; + delete response.data; + } + } + response = JSON.stringify(response); + res.__swagger_send(response); + }; - apiCaller(req, res, req.query); - }; - })(func["func"], func["responseProcessor"]) // must use a closure here - }; + apiCaller(req, res, req.query); + }; + })(func["func"], func["responseProcessor"]) // must use a closure here + }; - swagger.addGet(swaggerFunc); + swagger.addGet(swaggerFunc); + } } + + swagger.setHeaders = function setHeaders(res) { + res.header('Access-Control-Allow-Origin', "*"); + }; + + swagger.configureSwaggerPaths("", "/api" , ""); + + swagger.configure("http://" + settings.ip + ":" + settings.port + basePath, version); } - - swagger.setHeaders = function setHeaders(res) { - res.header('Access-Control-Allow-Origin', "*"); - }; - - swagger.configureSwaggerPaths("", "/api" , ""); - - swagger.configure("http://" + settings.ip + ":" + settings.port + "/rest", version); -} +}; From 5731ef78020095b55a58e41b9f3e0cf7335e97c5 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 6 Mar 2013 15:40:02 +0100 Subject: [PATCH 090/463] Fix ace rtlIsTrue property setter --- src/static/js/ace2_inner.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index f2320926..b8b59b84 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -959,7 +959,11 @@ function Ace2Inner(){ styled: setStyled, textface: setTextFace, textsize: setTextSize, - rtlistrue: setClassPresenceNamed(root, "rtl") + rtlistrue: function(value) { + setClassPresence(root, "rtl", value) + setClassPresence(root, "ltr", !value) + document.documentElement.dir = value? 'rtl' : 'ltr' + } }; var setter = setters[key.toLowerCase()]; From 1e94eaa06c776fa61ca1489b6672f63d4be50248 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 6 Mar 2013 14:50:08 +0000 Subject: [PATCH 091/463] fix safari rtl dissapearing pad --- src/static/css/pad.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 6034b5ed..e536b925 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -179,6 +179,7 @@ a img { width: 100%; padding: 0; margin: 0; + left: 0; /* Required for safari fixes RTL */ } #editorloadingbox { padding-top: 100px; From 60df48e48508d910f72c14a576c6c2b94e093163 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 6 Mar 2013 15:02:05 +0000 Subject: [PATCH 092/463] ltr test and fix rtl test --- tests/frontend/specs/language.js | 34 +++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/tests/frontend/specs/language.js b/tests/frontend/specs/language.js index 86d2d740..ab7f2b3d 100644 --- a/tests/frontend/specs/language.js +++ b/tests/frontend/specs/language.js @@ -93,8 +93,9 @@ describe("Language select and change", function(){ //select arabic $languageoption.attr('selected','selected'); - $language.change(); - + $language.val("ar"); + $languageoption.change(); + helper.waitFor(function() { return chrome$("html")[0]["dir"] != 'ltr'; }) @@ -104,5 +105,32 @@ describe("Language select and change", function(){ done(); }); }); - + + it("changes direction when picking an ltr lang", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //click the language button + var $language = chrome$("#languagemenu"); + var $languageoption = $language.find("[value=en]"); + + //select english + //select arabic + $languageoption.attr('selected','selected'); + $language.val("en"); + $languageoption.change(); + + helper.waitFor(function() { + return chrome$("html")[0]["dir"] != 'rtl'; + }) + .done(function(){ + // check if the document's direction was changed + expect(chrome$("html")[0]["dir"]).to.be("ltr"); + done(); + }); + }); }); From 0c9214bb27ae1f2367995ffd55381f5b64d73714 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 6 Mar 2013 15:08:27 +0000 Subject: [PATCH 093/463] bump v and changelog --- CHANGELOG.md | 5 +++++ src/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e4857bd..0fac58f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 1.2.81 + * Fix: CtrlZ-Y for Undo Redo + * Fix: RTL functionality on contents & fix RTL/LTR tests and RTL in Safari + * Fix: Various other tests fixed in Android + # 1.2.8 ! IMPORTANT: New setting.json value is required to automatically reconnect clients on disconnect * NEW: Use Socket IO for rooms (allows for pads to be load balanced with sticky rooms) diff --git a/src/package.json b/src/package.json index 44d03d80..13a4de4c 100644 --- a/src/package.json +++ b/src/package.json @@ -45,5 +45,5 @@ "engines" : { "node" : ">=0.6.3", "npm" : ">=1.0" }, - "version" : "1.2.8" + "version" : "1.2.81" } From 6dfc5f2c8868ebf7d4420e09b730f1e0dd09818f Mon Sep 17 00:00:00 2001 From: CeBe Date: Wed, 6 Mar 2013 18:16:30 +0100 Subject: [PATCH 094/463] a script that allows importing old etherpad db this script allows you to import the sql file generated with convert.js into all supported dbms, not only MySQL --- bin/importSqlFile.js | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 bin/importSqlFile.js diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js new file mode 100644 index 00000000..4e9b1f3e --- /dev/null +++ b/bin/importSqlFile.js @@ -0,0 +1,45 @@ +var startTime = new Date().getTime(); +var fs = require("fs"); +var db = require("../src/node/db/DB"); +//var async = require("../src/node_modules/async"); + +var sqlFile = process.argv[2]; + +//stop if the settings file is not set +if(!sqlFile) +{ + console.error("Use: node importSqlIntoRedis.js $SQLFILE"); + process.exit(1); +} + +log("initializing db"); +db.init(function(){ + log("done"); + + log("open output file..."); + var file = fs.readFileSync(sqlFile, 'utf8'); + + var keyNo = 0; + + file.split("\n").forEach(function(l) { + if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { + var pos = l.indexOf("', '"); + var key = l.substr(28, pos - 28); + var value = l.substr(pos + 4); + value = value.substr(0, value.length - 3); + db.db.set(key, value, null); + keyNo++; + } + }); + + db.db.doShutdown(function() { + log("finished, imported " + keyNo + " keys."); + process.exit(0); + }); +}); + + +function log(str) +{ + console.log((new Date().getTime() - startTime)/1000 + "\t" + str); +} \ No newline at end of file From db0d0d1f72abb0c98093a1a2b309e73c41a00dff Mon Sep 17 00:00:00 2001 From: CeBe Date: Wed, 6 Mar 2013 22:08:14 +0100 Subject: [PATCH 095/463] fixed problem with npm --- bin/importSqlFile.js | 62 +++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index 4e9b1f3e..b1642288 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -1,44 +1,46 @@ var startTime = new Date().getTime(); -var fs = require("fs"); -var db = require("../src/node/db/DB"); -//var async = require("../src/node_modules/async"); -var sqlFile = process.argv[2]; +require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { -//stop if the settings file is not set -if(!sqlFile) -{ - console.error("Use: node importSqlIntoRedis.js $SQLFILE"); - process.exit(1); -} + var fs = require("fs"); + var db = require("ep_etherpad-lite/node/db/DB");; -log("initializing db"); -db.init(function(){ - log("done"); + var sqlFile = process.argv[2]; - log("open output file..."); - var file = fs.readFileSync(sqlFile, 'utf8'); + //stop if the settings file is not set + if(!sqlFile) + { + console.error("Use: node importSqlFile.js $SQLFILE"); + process.exit(1); + } - var keyNo = 0; + log("initializing db"); + db.init(function(){ + log("done"); - file.split("\n").forEach(function(l) { - if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { - var pos = l.indexOf("', '"); - var key = l.substr(28, pos - 28); - var value = l.substr(pos + 4); - value = value.substr(0, value.length - 3); - db.db.set(key, value, null); - keyNo++; - } - }); + log("open output file..."); + var file = fs.readFileSync(sqlFile, 'utf8'); - db.db.doShutdown(function() { - log("finished, imported " + keyNo + " keys."); - process.exit(0); + var keyNo = 0; + + file.split("\n").forEach(function(l) { + if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { + var pos = l.indexOf("', '"); + var key = l.substr(28, pos - 28); + var value = l.substr(pos + 4); + value = value.substr(0, value.length - 3); + db.db.set(key, value, null); + keyNo++; + } + }); + + db.db.doShutdown(function() { + log("finished, imported " + keyNo + " keys."); + process.exit(0); + }); }); }); - function log(str) { console.log((new Date().getTime() - startTime)/1000 + "\t" + str); From 4b7238c2cde98da86d07a4ea4529c8cb1786b9bc Mon Sep 17 00:00:00 2001 From: CeBe Date: Wed, 6 Mar 2013 22:28:00 +0100 Subject: [PATCH 096/463] improved output for importSqlFile --- bin/importSqlFile.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index b1642288..b43a0622 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -19,11 +19,12 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { log("done"); log("open output file..."); - var file = fs.readFileSync(sqlFile, 'utf8'); + var lines = fs.readFileSync(sqlFile, 'utf8').split("\n");; + var count = lines.length; var keyNo = 0; - file.split("\n").forEach(function(l) { + lines.forEach(function(l) { if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { var pos = l.indexOf("', '"); var key = l.substr(28, pos - 28); @@ -31,8 +32,13 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { value = value.substr(0, value.length - 3); db.db.set(key, value, null); keyNo++; + process.stdout.write("."); + if (keyNo % 100 == 0) { + console.log(" " + keyNo + "/" + count); + } } }); + process.stdout.write("\n"); db.db.doShutdown(function() { log("finished, imported " + keyNo + " keys."); From 76fbc2960728ee9f6b7058e03ace0064b9302644 Mon Sep 17 00:00:00 2001 From: CeBe Date: Wed, 6 Mar 2013 22:36:00 +0100 Subject: [PATCH 097/463] improved output for importSqlFile --- bin/importSqlFile.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index b43a0622..bdc2c434 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -24,6 +24,7 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { var count = lines.length; var keyNo = 0; + process.stdout.write("Start importing " + count + " keys...\n"); lines.forEach(function(l) { if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { var pos = l.indexOf("', '"); @@ -32,9 +33,8 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { value = value.substr(0, value.length - 3); db.db.set(key, value, null); keyNo++; - process.stdout.write("."); - if (keyNo % 100 == 0) { - console.log(" " + keyNo + "/" + count); + if (keyNo % 1000 == 0) { + process.stdout.write(" " + keyNo + "/" + count); } } }); From f2b173f566e6c53caa1f045a714c52753caec710 Mon Sep 17 00:00:00 2001 From: CeBe Date: Wed, 6 Mar 2013 22:38:18 +0100 Subject: [PATCH 098/463] improved output for importSqlFile --- bin/importSqlFile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index bdc2c434..faf6b1b9 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -34,7 +34,7 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { db.db.set(key, value, null); keyNo++; if (keyNo % 1000 == 0) { - process.stdout.write(" " + keyNo + "/" + count); + process.stdout.write(" " + keyNo + "/" + count + "\n"); } } }); From 4026ba18156b0551191e7ac62a077ab16d694e25 Mon Sep 17 00:00:00 2001 From: CeBe Date: Thu, 7 Mar 2013 13:15:29 +0100 Subject: [PATCH 099/463] fixed saved data to be escaped properly --- bin/importSqlFile.js | 108 ++++++++++++++++++++++++++++++++----------- 1 file changed, 82 insertions(+), 26 deletions(-) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index faf6b1b9..6463088a 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -3,7 +3,17 @@ var startTime = new Date().getTime(); require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { var fs = require("fs"); - var db = require("ep_etherpad-lite/node/db/DB");; + + var ueberDB = require("ep_etherpad-lite/node_modules/ueberDB"); + var settings = require("ep_etherpad-lite/node/utils/Settings"); + var log4js = require('ep_etherpad-lite/node_modules/log4js'); + + var dbWrapperSettings = { + cache: 0, + writeInterval: 100, + json: false // data is already json encoded + }; + var db = new ueberDB.database(settings.dbType, settings.dbSettings, dbWrapperSettings, log4js.getLogger("ueberDB")); var sqlFile = process.argv[2]; @@ -15,39 +25,85 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { } log("initializing db"); - db.init(function(){ - log("done"); + db.init(function(err) + { + //there was an error while initializing the database, output it and stop + if(err) + { + console.error("ERROR: Problem while initalizing the database"); + console.error(err.stack ? err.stack : err); + process.exit(1); + } + else + { + log("done"); - log("open output file..."); - var lines = fs.readFileSync(sqlFile, 'utf8').split("\n");; + log("open output file..."); + var lines = fs.readFileSync(sqlFile, 'utf8').split("\n"); - var count = lines.length; - var keyNo = 0; + var count = lines.length; + var keyNo = 0; - process.stdout.write("Start importing " + count + " keys...\n"); - lines.forEach(function(l) { - if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { - var pos = l.indexOf("', '"); - var key = l.substr(28, pos - 28); - var value = l.substr(pos + 4); - value = value.substr(0, value.length - 3); - db.db.set(key, value, null); - keyNo++; - if (keyNo % 1000 == 0) { - process.stdout.write(" " + keyNo + "/" + count + "\n"); + process.stdout.write("Start importing " + count + " keys...\n"); + lines.forEach(function(l) { + if (l.substr(0, 27) == "REPLACE INTO store VALUES (") { + var pos = l.indexOf("', '"); + var key = l.substr(28, pos - 28); + var value = l.substr(pos + 3); + value = value.substr(0, value.length - 2); + console.log("key: " + key + " val: " + value); + console.log("unval: " + unescape(value)); + db.set(key, unescape(value), null); + keyNo++; + if (keyNo % 1000 == 0) { + process.stdout.write(" " + keyNo + "/" + count + "\n"); + } } - } - }); - process.stdout.write("\n"); + }); + process.stdout.write("\n"); - db.db.doShutdown(function() { - log("finished, imported " + keyNo + " keys."); - process.exit(0); - }); + db.doShutdown(function() { + log("finished, imported " + keyNo + " keys."); + process.exit(0); + }); + } }); }); function log(str) { console.log((new Date().getTime() - startTime)/1000 + "\t" + str); -} \ No newline at end of file +} + +unescape = function(val) { + // value is a string + if (val.substr(0, 1) == "'") { + val = val.substr(0, val.length - 1).substr(1); + + return val.replace(/\\[0nrbtZ\\'"]/g, function(s) { + switch(s) { + case "\\0": return "\0"; + case "\\n": return "\n"; + case "\\r": return "\r"; + case "\\b": return "\b"; + case "\\t": return "\t"; + case "\\Z": return "\x1a"; + default: return s.substr(1); + } + }); + } + + // value is a boolean or NULL + if (val == 'NULL') { + return null; + } + if (val == 'true') { + return true; + } + if (val == 'false') { + return false; + } + + // value is a number + return val; +}; From 70c329957d0a488f30df138f56ab5d975b0bd54b Mon Sep 17 00:00:00 2001 From: CeBe Date: Thu, 7 Mar 2013 14:05:55 +0100 Subject: [PATCH 100/463] additional ouput for importSqlFile --- bin/importSqlFile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index 6463088a..cd1e7df3 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -61,6 +61,7 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { } }); process.stdout.write("\n"); + process.stdout.wirte("done. waiting for db to finish transaction. depended on dbms this may take some time...\n"); db.doShutdown(function() { log("finished, imported " + keyNo + " keys."); From 62c13b4c3fee68de0935648b889f509490e95caa Mon Sep 17 00:00:00 2001 From: CeBe Date: Thu, 7 Mar 2013 14:10:54 +0100 Subject: [PATCH 101/463] typo --- bin/importSqlFile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/importSqlFile.js b/bin/importSqlFile.js index cd1e7df3..6491cbea 100644 --- a/bin/importSqlFile.js +++ b/bin/importSqlFile.js @@ -61,7 +61,7 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) { } }); process.stdout.write("\n"); - process.stdout.wirte("done. waiting for db to finish transaction. depended on dbms this may take some time...\n"); + process.stdout.write("done. waiting for db to finish transaction. depended on dbms this may take some time...\n"); db.doShutdown(function() { log("finished, imported " + keyNo + " keys."); From 3cafa249829685651073004b8c255aa07a8d5bcd Mon Sep 17 00:00:00 2001 From: Jordan Hollinger Date: Thu, 7 Mar 2013 09:37:03 -0500 Subject: [PATCH 102/463] Fix variable name typo in PadMessageHandler.padUsers --- src/node/handler/PadMessageHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 15a9b8ea..c046f130 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1448,7 +1448,7 @@ exports.padUsersCount = function (padID, callback) { exports.padUsers = function (padID, callback) { var result = []; - async.forEach(socketio.sockets.clients(padId), function(roomClient, callback) { + async.forEach(socketio.sockets.clients(padID), function(roomClient, callback) { var s = sessioninfos[roomClient.id]; if(s) { authorManager.getAuthor(s.author, function(err, author) { From 26a6765b50ffdb4c2739d7c5ec3e24bdd9e7dc9f Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 8 Mar 2013 08:40:40 -0800 Subject: [PATCH 103/463] fix indent on chrome in linux --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index b8b59b84..e57bb36e 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3583,7 +3583,7 @@ function Ace2Inner(){ } var specialHandled = false; - var isTypeForSpecialKey = ((browser.msie || browser.safari) ? (type == "keydown") : (type == "keypress")); + var isTypeForSpecialKey = ((browser.msie || browser.safari || browser.chrome) ? (type == "keydown") : (type == "keypress")); var isTypeForCmdKey = ((browser.msie || browser.safari || browser.chrome) ? (type == "keydown") : (type == "keypress")); var stopped = false; From acb4b4ebafd366c85662cf5de2a9b15df7eb170b Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 11 Mar 2013 04:52:12 +0000 Subject: [PATCH 104/463] Localisation updates from http://translatewiki.net. --- src/locales/fa.json | 8 ++++++-- src/locales/ia.json | 32 ++++++++++++++++++++++++++++++-- src/locales/te.json | 1 + 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/locales/fa.json b/src/locales/fa.json index 437b8da0..bccc353c 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -2,7 +2,8 @@ "@metadata": { "authors": { "0": "BMRG14", - "2": "ZxxZxxZ" + "1": "Dalba", + "3": "ZxxZxxZ" } }, "index.newPad": "\u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062a\u0627\u0632\u0647", @@ -20,7 +21,7 @@ "pad.toolbar.clearAuthorship.title": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", "pad.toolbar.import_export.title": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc\/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0632\/\u0628\u0647 \u0642\u0627\u0644\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641", "pad.toolbar.timeslider.title": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646", - "pad.toolbar.savedRevision.title": "\u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc\u200c\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647", + "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0633\u062e\u0647", "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a", "pad.toolbar.embed.title": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", "pad.toolbar.showusers.title": "\u0646\u0645\u0627\u06cc\u0634 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", @@ -79,6 +80,7 @@ "pad.share.emebdcode": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0646\u0634\u0627\u0646\u06cc", "pad.chat": "\u06af\u0641\u062a\u06af\u0648", "pad.chat.title": "\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06af\u0641\u062a\u06af\u0648 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "pad.chat.loadmessages": "\u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631", "timeslider.pageTitle": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646 {{appTitle}}", "timeslider.toolbar.returnbutton": "\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", "timeslider.toolbar.authors": "\u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u0627\u0646:", @@ -100,6 +102,8 @@ "timeslider.month.october": "\u0627\u06a9\u062a\u0628\u0631", "timeslider.month.november": "\u0646\u0648\u0627\u0645\u0628\u0631", "timeslider.month.december": "\u062f\u0633\u0627\u0645\u0628\u0631", + "timeslider.unnamedauthor": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", + "timeslider.unnamedauthors": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", "pad.savedrevs.marked": "\u0627\u06cc\u0646 \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc \u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0639\u0644\u0627\u0645\u062a\u200c\u06af\u0630\u0627\u0631\u06cc \u0634\u062f", "pad.userlist.entername": "\u0646\u0627\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f", "pad.userlist.unnamed": "\u0628\u062f\u0648\u0646 \u0646\u0627\u0645", diff --git a/src/locales/ia.json b/src/locales/ia.json index 21b1d291..e6c5dde1 100644 --- a/src/locales/ia.json +++ b/src/locales/ia.json @@ -19,13 +19,16 @@ "pad.toolbar.clearAuthorship.title": "Rader colores de autor", "pad.toolbar.import_export.title": "Importar\/exportar in differente formatos de file", "pad.toolbar.timeslider.title": "Glissa-tempore", - "pad.toolbar.savedRevision.title": "Versiones salveguardate", + "pad.toolbar.savedRevision.title": "Version salveguardate", "pad.toolbar.settings.title": "Configuration", "pad.toolbar.embed.title": "Incorporar iste pad", "pad.toolbar.showusers.title": "Monstrar le usatores de iste pad", "pad.colorpicker.save": "Salveguardar", "pad.colorpicker.cancel": "Cancellar", "pad.loading": "Cargamento\u2026", + "pad.passwordRequired": "Un contrasigno es necessari pro acceder a iste pad", + "pad.permissionDenied": "Tu non ha le permission de acceder a iste pad", + "pad.wrongPassword": "Le contrasigno es incorrecte", "pad.settings.padSettings": "Configuration del pad", "pad.settings.myView": "Mi vista", "pad.settings.stickychat": "Chat sempre visibile", @@ -38,6 +41,7 @@ "pad.settings.language": "Lingua:", "pad.importExport.import_export": "Importar\/Exportar", "pad.importExport.import": "Incargar qualcunque file de texto o documento", + "pad.importExport.importSuccessful": "Succedite!", "pad.importExport.export": "Exportar le pad actual como:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto simple", @@ -45,9 +49,11 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Tu pote solmente importar files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, installa AbiWord<\/a>.", "pad.modals.connected": "Connectite.", "pad.modals.reconnecting": "Reconnecte a tu pad\u2026", "pad.modals.forcereconnect": "Fortiar reconnexion", + "pad.modals.userdup": "Aperte in un altere fenestra", "pad.modals.userdup.explanation": "Iste pad pare esser aperte in plus de un fenestra de navigator in iste computator.", "pad.modals.userdup.advice": "Reconnecte pro usar iste fenestra.", "pad.modals.unauth": "Non autorisate", @@ -72,11 +78,16 @@ "pad.share.emebdcode": "Codice de incorporation", "pad.chat": "Chat", "pad.chat.title": "Aperir le chat pro iste pad.", + "pad.chat.loadmessages": "Cargar plus messages", "timeslider.pageTitle": "Glissa-tempore pro {{appTitle}}", "timeslider.toolbar.returnbutton": "Retornar al pad", "timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authorsList": "Nulle autor", + "timeslider.toolbar.exportlink.title": "Exportar", "timeslider.exportCurrent": "Exportar le version actual como:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Salveguardate le {{day}} de {{month}} {{year}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januario", "timeslider.month.february": "februario", "timeslider.month.march": "martio", @@ -88,5 +99,22 @@ "timeslider.month.september": "septembre", "timeslider.month.october": "octobre", "timeslider.month.november": "novembre", - "timeslider.month.december": "decembre" + "timeslider.month.december": "decembre", + "timeslider.unnamedauthor": "{{num}} autor sin nomine", + "timeslider.unnamedauthors": "{{num}} autores sin nomine", + "pad.savedrevs.marked": "Iste version es ora marcate como version salveguardate", + "pad.userlist.entername": "Entra tu nomine", + "pad.userlist.unnamed": "sin nomine", + "pad.userlist.guest": "Invitato", + "pad.userlist.deny": "Refusar", + "pad.userlist.approve": "Approbar", + "pad.editbar.clearcolors": "Rader le colores de autor in tote le documento?", + "pad.impexp.importbutton": "Importar ora", + "pad.impexp.importing": "Importation in curso\u2026", + "pad.impexp.confirmimport": "Le importation de un file superscribera le texto actual del pad. Es tu secur de voler continuar?", + "pad.impexp.convertFailed": "Nos non ha potite importar iste file. Per favor usa un altere formato de documento o copia e colla le texto manualmente.", + "pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.", + "pad.impexp.importfailed": "Importation fallite", + "pad.impexp.copypaste": "Per favor copia e colla", + "pad.impexp.exportdisabled": "Le exportation in formato {{type}} es disactivate. Per favor contacta le administrator del systema pro detalios." } \ No newline at end of file diff --git a/src/locales/te.json b/src/locales/te.json index 666a40aa..955b263a 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -26,6 +26,7 @@ "pad.colorpicker.save": "\u0c2d\u0c26\u0c4d\u0c30\u0c2a\u0c30\u0c1a\u0c41", "pad.colorpicker.cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41\u0c1a\u0c47\u0c2f\u0c3f", "pad.loading": "\u0c32\u0c4b\u0c21\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", + "pad.wrongPassword": "\u0c2e\u0c40 \u0c30\u0c39\u0c38\u0c4d\u0c2f\u0c2a\u0c26\u0c02 \u0c24\u0c2a\u0c41", "pad.settings.padSettings": "\u0c2a\u0c32\u0c15 \u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", "pad.settings.myView": "\u0c28\u0c3e \u0c09\u0c26\u0c4d\u0c26\u0c47\u0c36\u0c4d\u0c2f\u0c2e\u0c41", "pad.settings.stickychat": "\u0c24\u0c46\u0c30\u0c2a\u0c48\u0c28\u0c47 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c0e\u0c32\u0c4d\u0c32\u0c2a\u0c41\u0c21\u0c41 \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", From 83a820b720cb6659dcd2e11ea1103459563839d8 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Mar 2013 16:59:15 +0000 Subject: [PATCH 105/463] new function for handling custom messages, allows objects to be sent, before we only allowed strings --- src/node/handler/PadMessageHandler.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index c046f130..076f31a5 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -254,6 +254,23 @@ function handleSaveRevisionMessage(client, message){ }); } +/** + * Handles a custom message, different to the function below as it handles objects not strings and you can direct the message to specific sessionID + * + * @param msg {Object} the message we're sending + * @param sessionID {string} the socketIO session to which we're sending this message + */ +exports.handleCustomObjectMessage = function (msg, sessionID, cb) { + if(sessionID){ // If a sessionID is targeted then send directly to this sessionID + io.sockets.socket(sessionID).emit(msg); // send a targeted message + }else{ + socketio.sockets.in(msg.data.padId).json.send(msg); // broadcast to all clients on this pad + } + + cb(null, {}); +} + + /** * Handles a custom message (sent via HTTP API request) * From b4ec07312b8926f29623f23548dfc0b2b6554902 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Mar 2013 15:00:04 -0300 Subject: [PATCH 106/463] add keystroke tests for relevant buttonpresses and change naming schema to something more sane --- .../{keystroke_alphabet.js => alphabet.js} | 0 .../specs/{button_bold.js => bold.js} | 37 +++++++++- tests/frontend/specs/button_italic.js | 36 ---------- .../specs/{keystroke_chat.js => chat.js} | 35 +++++++++- tests/frontend/specs/chat_always_on_screen.js | 40 ----------- ...p_colors.js => clear_authorship_colors.js} | 0 .../specs/{keystroke_delete.js => delete.js} | 0 .../specs/{keystroke_enter.js => enter.js} | 0 .../{button_indentation.js => indentation.js} | 22 +++++- tests/frontend/specs/italic.js | 67 +++++++++++++++++++ tests/frontend/specs/language.js | 3 +- ...button_ordered_list.js => ordered_list.js} | 0 .../specs/{button_redo.js => redo.js} | 35 +++++++++- ...tton_strikethrough.js => strikethrough.js} | 0 .../{button_timeslider.js => timeslider.js} | 0 .../specs/{button_undo.js => undo.js} | 32 ++++++++- ..._clickable.js => urls_become_clickable.js} | 0 17 files changed, 222 insertions(+), 85 deletions(-) rename tests/frontend/specs/{keystroke_alphabet.js => alphabet.js} (100%) rename tests/frontend/specs/{button_bold.js => bold.js} (51%) delete mode 100644 tests/frontend/specs/button_italic.js rename tests/frontend/specs/{keystroke_chat.js => chat.js} (69%) delete mode 100644 tests/frontend/specs/chat_always_on_screen.js rename tests/frontend/specs/{button_clear_authorship_colors.js => clear_authorship_colors.js} (100%) rename tests/frontend/specs/{keystroke_delete.js => delete.js} (100%) rename tests/frontend/specs/{keystroke_enter.js => enter.js} (100%) rename tests/frontend/specs/{button_indentation.js => indentation.js} (90%) create mode 100644 tests/frontend/specs/italic.js rename tests/frontend/specs/{button_ordered_list.js => ordered_list.js} (100%) rename tests/frontend/specs/{button_redo.js => redo.js} (50%) rename tests/frontend/specs/{button_strikethrough.js => strikethrough.js} (100%) rename tests/frontend/specs/{button_timeslider.js => timeslider.js} (100%) rename tests/frontend/specs/{button_undo.js => undo.js} (50%) rename tests/frontend/specs/{keystroke_urls_become_clickable.js => urls_become_clickable.js} (100%) diff --git a/tests/frontend/specs/keystroke_alphabet.js b/tests/frontend/specs/alphabet.js similarity index 100% rename from tests/frontend/specs/keystroke_alphabet.js rename to tests/frontend/specs/alphabet.js diff --git a/tests/frontend/specs/button_bold.js b/tests/frontend/specs/bold.js similarity index 51% rename from tests/frontend/specs/button_bold.js rename to tests/frontend/specs/bold.js index 1feafe61..b5d2a212 100644 --- a/tests/frontend/specs/button_bold.js +++ b/tests/frontend/specs/bold.js @@ -5,7 +5,7 @@ describe("bold button", function(){ this.timeout(60000); }); - it("makes text bold", function(done) { + it("makes text bold on click", function(done) { var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -33,4 +33,37 @@ describe("bold button", function(){ done(); }); -}); \ No newline at end of file + + it("makes text bold on keypress", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var e = inner$.Event("keydown"); + e.ctrlKey = true; // Control key + e.which = 66; // z + inner$("#innerdocbody").trigger(e); + + //ace creates a new dom element when you press a button, so just get the first text element again + var $newFirstTextElement = inner$("div").first(); + + // is there a element now? + var isBold = $newFirstTextElement.find("b").length === 1; + + //expect it to be bold + expect(isBold).to.be(true); + + //make sure the text hasn't changed + expect($newFirstTextElement.text()).to.eql($firstTextElement.text()); + + done(); + }); + + + +}); diff --git a/tests/frontend/specs/button_italic.js b/tests/frontend/specs/button_italic.js deleted file mode 100644 index fc2e15a7..00000000 --- a/tests/frontend/specs/button_italic.js +++ /dev/null @@ -1,36 +0,0 @@ -describe("italic button", function(){ - //create a new pad before each test run - beforeEach(function(cb){ - helper.newPad(cb); - this.timeout(60000); - }); - - it("makes text italic", function(done) { - var inner$ = helper.padInner$; - var chrome$ = helper.padChrome$; - - //get the first text element out of the inner iframe - var $firstTextElement = inner$("div").first(); - - //select this text element - $firstTextElement.sendkeys('{selectall}'); - - //get the bold button and click it - var $boldButton = chrome$(".buttonicon-italic"); - $boldButton.click(); - - //ace creates a new dom element when you press a button, so just get the first text element again - var $newFirstTextElement = inner$("div").first(); - - // is there a element now? - var isItalic = $newFirstTextElement.find("i").length === 1; - - //expect it to be bold - expect(isItalic).to.be(true); - - //make sure the text hasn't changed - expect($newFirstTextElement.text()).to.eql($firstTextElement.text()); - - done(); - }); -}); diff --git a/tests/frontend/specs/keystroke_chat.js b/tests/frontend/specs/chat.js similarity index 69% rename from tests/frontend/specs/keystroke_chat.js rename to tests/frontend/specs/chat.js index e4908728..a488193f 100644 --- a/tests/frontend/specs/keystroke_chat.js +++ b/tests/frontend/specs/chat.js @@ -1,4 +1,4 @@ -describe("send chat message", function(){ +describe("Chat messages and UI", function(){ //create a new pad before each test run beforeEach(function(cb){ helper.newPad(cb); @@ -64,5 +64,36 @@ describe("send chat message", function(){ }); }); -}); + it("makes chat stick to right side of the screen", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the chat selector + var $stickychatCheckbox = chrome$("#options-stickychat"); + + //select chat always on screen and fire change event + $stickychatCheckbox.attr('selected','selected'); + $stickychatCheckbox.change(); + $stickychatCheckbox.click(); + + //check if chat changed to get the stickychat Class + var $chatbox = chrome$("#chatbox"); + var hasStickyChatClass = $chatbox.hasClass("stickyChat"); + expect(hasStickyChatClass).to.be(true); + + //select chat always on screen and fire change event + $stickychatCheckbox.attr('selected','selected'); + $stickychatCheckbox.change(); + $stickychatCheckbox.click(); + + //check if chat changed to remove the stickychat Class + var hasStickyChatClass = $chatbox.hasClass("stickyChat"); + expect(hasStickyChatClass).to.be(false); + + done(); + }); +}); diff --git a/tests/frontend/specs/chat_always_on_screen.js b/tests/frontend/specs/chat_always_on_screen.js deleted file mode 100644 index 4873763f..00000000 --- a/tests/frontend/specs/chat_always_on_screen.js +++ /dev/null @@ -1,40 +0,0 @@ -describe("chat always ons creen select", function(){ - //create a new pad before each test run - beforeEach(function(cb){ - helper.newPad(cb); - this.timeout(60000); - }); - - it("makes chat stick to right side of the screen", function(done) { - var inner$ = helper.padInner$; - var chrome$ = helper.padChrome$; - - //click on the settings button to make settings visible - var $settingsButton = chrome$(".buttonicon-settings"); - $settingsButton.click(); - - //get the chat selector - var $stickychatCheckbox = chrome$("#options-stickychat"); - - //select chat always on screen and fire change event - $stickychatCheckbox.attr('selected','selected'); - $stickychatCheckbox.change(); - $stickychatCheckbox.click(); - - //check if chat changed to get the stickychat Class - var $chatbox = chrome$("#chatbox"); - var hasStickyChatClass = $chatbox.hasClass("stickyChat"); - expect(hasStickyChatClass).to.be(true); - - //select chat always on screen and fire change event - $stickychatCheckbox.attr('selected','selected'); - $stickychatCheckbox.change(); - $stickychatCheckbox.click(); - - //check if chat changed to remove the stickychat Class - var hasStickyChatClass = $chatbox.hasClass("stickyChat"); - expect(hasStickyChatClass).to.be(false); - - done(); - }); -}); diff --git a/tests/frontend/specs/button_clear_authorship_colors.js b/tests/frontend/specs/clear_authorship_colors.js similarity index 100% rename from tests/frontend/specs/button_clear_authorship_colors.js rename to tests/frontend/specs/clear_authorship_colors.js diff --git a/tests/frontend/specs/keystroke_delete.js b/tests/frontend/specs/delete.js similarity index 100% rename from tests/frontend/specs/keystroke_delete.js rename to tests/frontend/specs/delete.js diff --git a/tests/frontend/specs/keystroke_enter.js b/tests/frontend/specs/enter.js similarity index 100% rename from tests/frontend/specs/keystroke_enter.js rename to tests/frontend/specs/enter.js diff --git a/tests/frontend/specs/button_indentation.js b/tests/frontend/specs/indentation.js similarity index 90% rename from tests/frontend/specs/button_indentation.js rename to tests/frontend/specs/indentation.js index 9c8e317e..06d90aa8 100644 --- a/tests/frontend/specs/button_indentation.js +++ b/tests/frontend/specs/indentation.js @@ -5,7 +5,26 @@ describe("indentation button", function(){ this.timeout(60000); }); - it("indent text", function(done){ + it("indent text with keypress", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var e = inner$.Event("keydown"); + e.keyCode = 9; // tab :| + inner$("#innerdocbody").trigger(e); + + helper.waitFor(function(){ + return inner$("div").first().find("ul li").length === 1; + }).done(done); + }); + + it("indent text with button", function(done){ var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -176,4 +195,5 @@ describe("indentation button", function(){ expect(isLI).to.be(true); },1000); });*/ + }); diff --git a/tests/frontend/specs/italic.js b/tests/frontend/specs/italic.js new file mode 100644 index 00000000..052d2df4 --- /dev/null +++ b/tests/frontend/specs/italic.js @@ -0,0 +1,67 @@ +describe("italic some text", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("makes text italic using button", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + //get the bold button and click it + var $boldButton = chrome$(".buttonicon-italic"); + $boldButton.click(); + + //ace creates a new dom element when you press a button, so just get the first text element again + var $newFirstTextElement = inner$("div").first(); + + // is there a element now? + var isItalic = $newFirstTextElement.find("i").length === 1; + + //expect it to be bold + expect(isItalic).to.be(true); + + //make sure the text hasn't changed + expect($newFirstTextElement.text()).to.eql($firstTextElement.text()); + + done(); + }); + + it("makes text italic using keypress", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var e = inner$.Event("keydown"); + e.ctrlKey = true; // Control key + e.which = 105; // i + inner$("#innerdocbody").trigger(e); + + //ace creates a new dom element when you press a button, so just get the first text element again + var $newFirstTextElement = inner$("div").first(); + + // is there a element now? + var isItalic = $newFirstTextElement.find("i").length === 1; + + //expect it to be bold + expect(isItalic).to.be(true); + + //make sure the text hasn't changed + expect($newFirstTextElement.text()).to.eql($firstTextElement.text()); + + done(); + }); + +}); diff --git a/tests/frontend/specs/language.js b/tests/frontend/specs/language.js index ab7f2b3d..d607ff98 100644 --- a/tests/frontend/specs/language.js +++ b/tests/frontend/specs/language.js @@ -13,7 +13,6 @@ describe("Language select and change", function(){ }); // Destroy language cookies - it("makes text german", function(done) { var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -92,7 +91,7 @@ describe("Language select and change", function(){ var $languageoption = $language.find("[value=ar]"); //select arabic - $languageoption.attr('selected','selected'); + // $languageoption.attr('selected','selected'); // Breaks the test.. $language.val("ar"); $languageoption.change(); diff --git a/tests/frontend/specs/button_ordered_list.js b/tests/frontend/specs/ordered_list.js similarity index 100% rename from tests/frontend/specs/button_ordered_list.js rename to tests/frontend/specs/ordered_list.js diff --git a/tests/frontend/specs/button_redo.js b/tests/frontend/specs/redo.js similarity index 50% rename from tests/frontend/specs/button_redo.js rename to tests/frontend/specs/redo.js index 3ce69142..c1497221 100644 --- a/tests/frontend/specs/button_redo.js +++ b/tests/frontend/specs/redo.js @@ -4,7 +4,7 @@ describe("undo button then redo button", function(){ this.timeout(60000); }); - it("undo some typing", function(done){ + it("redo some typing with button", function(done){ var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -33,5 +33,38 @@ describe("undo button then redo button", function(){ done(); }); }); + + it("redo some typing with keypress", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + // get the first text element inside the editable space + var $firstTextElement = inner$("div span").first(); + var originalValue = $firstTextElement.text(); // get the original value + var newString = "Foo"; + + $firstTextElement.sendkeys(newString); // send line 1 to the pad + var modifiedValue = $firstTextElement.text(); // get the modified value + expect(modifiedValue).not.to.be(originalValue); // expect the value to change + + var e = inner$.Event("keydown"); + e.ctrlKey = true; // Control key + e.which = 90; // z + inner$("#innerdocbody").trigger(e); + + var e = inner$.Event("keydown"); + e.ctrlKey = true; // Control key + e.which = 121; // y + inner$("#innerdocbody").trigger(e); + + helper.waitFor(function(){ + console.log(inner$("div span").first().text()); + return inner$("div span").first().text() === newString; + }).done(function(){ + var finalValue = inner$("div").first().text(); + expect(finalValue).to.be(modifiedValue); // expect the value to change + done(); + }); + }); }); diff --git a/tests/frontend/specs/button_strikethrough.js b/tests/frontend/specs/strikethrough.js similarity index 100% rename from tests/frontend/specs/button_strikethrough.js rename to tests/frontend/specs/strikethrough.js diff --git a/tests/frontend/specs/button_timeslider.js b/tests/frontend/specs/timeslider.js similarity index 100% rename from tests/frontend/specs/button_timeslider.js rename to tests/frontend/specs/timeslider.js diff --git a/tests/frontend/specs/button_undo.js b/tests/frontend/specs/undo.js similarity index 50% rename from tests/frontend/specs/button_undo.js rename to tests/frontend/specs/undo.js index 412b786b..8ba752ac 100644 --- a/tests/frontend/specs/button_undo.js +++ b/tests/frontend/specs/undo.js @@ -4,7 +4,8 @@ describe("undo button", function(){ this.timeout(60000); }); - it("undo some typing", function(done){ +/* + it("undo some typing by clicking undo button", function(done){ var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -29,5 +30,34 @@ describe("undo button", function(){ done(); }); }); +*/ + + it("undo some typing using a keypress", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + // get the first text element inside the editable space + var $firstTextElement = inner$("div span").first(); + var originalValue = $firstTextElement.text(); // get the original value + + $firstTextElement.sendkeys("foo"); // send line 1 to the pad + var modifiedValue = $firstTextElement.text(); // get the modified value + expect(modifiedValue).not.to.be(originalValue); // expect the value to change + + var e = inner$.Event("keydown"); + e.ctrlKey = true; // Control key + e.which = 90; // z + inner$("#innerdocbody").trigger(e); + + helper.waitFor(function(){ + return inner$("div span").first().text() === originalValue; + }).done(function(){ + var finalValue = inner$("div span").first().text(); + expect(finalValue).to.be(originalValue); // expect the value to change + done(); + }); + }); + + }); diff --git a/tests/frontend/specs/keystroke_urls_become_clickable.js b/tests/frontend/specs/urls_become_clickable.js similarity index 100% rename from tests/frontend/specs/keystroke_urls_become_clickable.js rename to tests/frontend/specs/urls_become_clickable.js From 5690f2d01ea04806ffada6eb395750a8f2007de3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Mar 2013 15:06:08 -0300 Subject: [PATCH 107/463] not z, is b! --- tests/frontend/specs/bold.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/frontend/specs/bold.js b/tests/frontend/specs/bold.js index b5d2a212..2fb6bbfe 100644 --- a/tests/frontend/specs/bold.js +++ b/tests/frontend/specs/bold.js @@ -46,7 +46,7 @@ describe("bold button", function(){ var e = inner$.Event("keydown"); e.ctrlKey = true; // Control key - e.which = 66; // z + e.which = 66; // b inner$("#innerdocbody").trigger(e); //ace creates a new dom element when you press a button, so just get the first text element again @@ -63,7 +63,4 @@ describe("bold button", function(){ done(); }); - - - }); From b81be97f94f1b973a60021e9db7116f8d2b8b039 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 13 Mar 2013 15:08:19 -0300 Subject: [PATCH 108/463] typo --- tests/frontend/specs/enter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/frontend/specs/enter.js b/tests/frontend/specs/enter.js index e46b1d2f..baafeded 100644 --- a/tests/frontend/specs/enter.js +++ b/tests/frontend/specs/enter.js @@ -5,7 +5,7 @@ describe("enter keystroke", function(){ this.timeout(60000); }); - it("creates a enw line & puts cursor onto a new line", function(done) { + it("creates a new line & puts cursor onto a new line", function(done) { var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; From babb33d8251e93db2eb9472a4e46b3b723b0992f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Mar 2013 17:34:15 +0000 Subject: [PATCH 109/463] add authorId to chat and userlist, possibly privacy/security issue? --- src/static/js/chat.js | 2 +- src/static/js/pad_userlist.js | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/static/js/chat.js b/src/static/js/chat.js index 2dff2edf..83a487de 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -111,7 +111,7 @@ var chat = (function() var authorName = msg.userName == null ? _('pad.userlist.unnamed') : padutils.escapeHtml(msg.userName); - var html = "

    " + authorName + ":" + timeStr + " " + text + "

    "; + var html = "

    " + authorName + ":" + timeStr + " " + text + "

    "; if(isHistoryAdd) $(html).insertAfter('#chatloadmessagesbutton'); else diff --git a/src/static/js/pad_userlist.js b/src/static/js/pad_userlist.js index 962595d2..c8f8e2c9 100644 --- a/src/static/js/pad_userlist.js +++ b/src/static/js/pad_userlist.js @@ -119,9 +119,9 @@ var paduserlist = (function() return ['
    ', '', ''].join(''); } - function getRowHtml(id, innerHtml) + function getRowHtml(id, innerHtml, authorId) { - return '' + innerHtml + ''; + return '' + innerHtml + ''; } function rowNode(row) @@ -191,18 +191,20 @@ var paduserlist = (function() domId: domId, animationPower: animationPower }; + var authorId = data.id; + handleRowData(row); rowsPresent.splice(position, 0, row); var tr; if (animationPower == 0) { - tr = $(getRowHtml(domId, getUserRowHtml(getAnimationHeight(0), data))); + tr = $(getRowHtml(domId, getUserRowHtml(getAnimationHeight(0), data), authorId)); row.animationStep = 0; } else { rowsFadingIn.push(row); - tr = $(getRowHtml(domId, getEmptyRowHtml(getAnimationHeight(ANIMATION_START)))); + tr = $(getRowHtml(domId, getEmptyRowHtml(getAnimationHeight(ANIMATION_START)), authorId)); } handleRowNode(tr, data); if (position == 0) From c30b0b72b85b3adc5fb00c5d082ab05c3d2c1efc Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 13 Mar 2013 22:23:35 +0100 Subject: [PATCH 110/463] Validate all 'author' attribs of incoming changesets to be the same value as the current user's authorId --- src/node/handler/PadMessageHandler.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index c046f130..35f1ab4c 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -550,11 +550,16 @@ function handleUserChanges(client, message) throw "Attribute pool is missing attribute "+n+" for changeset "+changeset; } }); + + // Validate all 'author' attribs to be the same value as the current user + wireApool.eachAttrib(function(type, value) { + if('author' == type && value != thisSession.author) throw "Trying to submit changes as another author" + }) } catch(e) { // There is an error in this changeset, so just refuse it - console.warn("Can't apply USER_CHANGES "+changeset+", because it failed checkRep"); + console.warn("Can't apply USER_CHANGES "+changeset+", because: "+e); client.json.send({disconnect:"badChangeset"}); return; } From 5fe60e72218d6371158a29ed5cc345b37a16b27a Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Thu, 14 Mar 2013 15:59:39 +0100 Subject: [PATCH 111/463] redirect /admin to /admin/ so that the relative links work --- src/node/hooks/express/admin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/node/hooks/express/admin.js b/src/node/hooks/express/admin.js index 766370fc..70539f0c 100644 --- a/src/node/hooks/express/admin.js +++ b/src/node/hooks/express/admin.js @@ -2,6 +2,7 @@ var eejs = require('ep_etherpad-lite/node/eejs'); exports.expressCreateServer = function (hook_name, args, cb) { args.app.get('/admin', function(req, res) { + if('/' != req.path[req.path.length-1]) return res.redirect('/admin/'); res.send( eejs.require("ep_etherpad-lite/templates/admin/index.html", {}) ); }); } From 12107859bb2325c5ba7b7bf0efeaa76682b5edb7 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 13:41:49 -0300 Subject: [PATCH 112/463] fix tests in firefox as firefox fires on keypress not down --- tests/frontend/specs/bold.js | 2 +- tests/frontend/specs/indentation.js | 2 +- tests/frontend/specs/italic.js | 2 +- tests/frontend/specs/redo.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/frontend/specs/bold.js b/tests/frontend/specs/bold.js index 2fb6bbfe..010d6901 100644 --- a/tests/frontend/specs/bold.js +++ b/tests/frontend/specs/bold.js @@ -44,7 +44,7 @@ describe("bold button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keydown"); + var e = inner$.Event("keypress"); e.ctrlKey = true; // Control key e.which = 66; // b inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/indentation.js b/tests/frontend/specs/indentation.js index 06d90aa8..6b9b432d 100644 --- a/tests/frontend/specs/indentation.js +++ b/tests/frontend/specs/indentation.js @@ -15,7 +15,7 @@ describe("indentation button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keydown"); + var e = inner$.Event("keypress"); e.keyCode = 9; // tab :| inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/italic.js b/tests/frontend/specs/italic.js index 052d2df4..15976f29 100644 --- a/tests/frontend/specs/italic.js +++ b/tests/frontend/specs/italic.js @@ -44,7 +44,7 @@ describe("italic some text", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keydown"); + var e = inner$.Event("keypress"); e.ctrlKey = true; // Control key e.which = 105; // i inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/redo.js b/tests/frontend/specs/redo.js index c1497221..d72b5a09 100644 --- a/tests/frontend/specs/redo.js +++ b/tests/frontend/specs/redo.js @@ -47,7 +47,7 @@ describe("undo button then redo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - var e = inner$.Event("keydown"); + var e = inner$.Event("keypress"); e.ctrlKey = true; // Control key e.which = 90; // z inner$("#innerdocbody").trigger(e); From 34c2cf40faae53ef33980378ca7f5e704b91be07 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 13:51:23 -0300 Subject: [PATCH 113/463] This isn't ideal, basically some browsers interact with keypress/keydown in different ways so this is a workaround but it's not perma --- tests/frontend/specs/bold.js | 8 +++++++- tests/frontend/specs/indentation.js | 8 +++++++- tests/frontend/specs/italic.js | 8 +++++++- tests/frontend/specs/redo.js | 8 +++++++- tests/frontend/specs/undo.js | 8 +++++++- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/tests/frontend/specs/bold.js b/tests/frontend/specs/bold.js index 010d6901..7c04835e 100644 --- a/tests/frontend/specs/bold.js +++ b/tests/frontend/specs/bold.js @@ -44,7 +44,13 @@ describe("bold button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keypress"); + if(!inner$.browser.chrome){ + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 66; // b inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/indentation.js b/tests/frontend/specs/indentation.js index 6b9b432d..6e5b3c1a 100644 --- a/tests/frontend/specs/indentation.js +++ b/tests/frontend/specs/indentation.js @@ -15,7 +15,13 @@ describe("indentation button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keypress"); + if(!inner$.browser.chrome){ + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.keyCode = 9; // tab :| inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/italic.js b/tests/frontend/specs/italic.js index 15976f29..9bee72dc 100644 --- a/tests/frontend/specs/italic.js +++ b/tests/frontend/specs/italic.js @@ -44,7 +44,13 @@ describe("italic some text", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keypress"); + if(!inner$.browser.chrome){ + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 105; // i inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/redo.js b/tests/frontend/specs/redo.js index d72b5a09..059e9711 100644 --- a/tests/frontend/specs/redo.js +++ b/tests/frontend/specs/redo.js @@ -47,7 +47,13 @@ describe("undo button then redo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - var e = inner$.Event("keypress"); + if(!inner$.browser.chrome){ + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 90; // z inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/undo.js b/tests/frontend/specs/undo.js index 8ba752ac..4e9dd0d5 100644 --- a/tests/frontend/specs/undo.js +++ b/tests/frontend/specs/undo.js @@ -44,7 +44,13 @@ describe("undo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - var e = inner$.Event("keydown"); + if(!inner$.browser.chrome){ + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 90; // z inner$("#innerdocbody").trigger(e); From 6bac01009b6706c63a63a8b6f63af99fb2f8e60e Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 13:52:20 -0300 Subject: [PATCH 114/463] missed an evt --- tests/frontend/specs/redo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/frontend/specs/redo.js b/tests/frontend/specs/redo.js index 059e9711..14ec31f6 100644 --- a/tests/frontend/specs/redo.js +++ b/tests/frontend/specs/redo.js @@ -58,7 +58,7 @@ describe("undo button then redo button", function(){ e.which = 90; // z inner$("#innerdocbody").trigger(e); - var e = inner$.Event("keydown"); + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 121; // y inner$("#innerdocbody").trigger(e); From 1462d8e80c3a20486cee95cf10c1bc3d7724c6d1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 14:22:58 -0300 Subject: [PATCH 115/463] now IE friendly --- tests/frontend/specs/bold.js | 6 +++--- tests/frontend/specs/indentation.js | 6 +++--- tests/frontend/specs/italic.js | 6 +++--- tests/frontend/specs/redo.js | 6 +++--- tests/frontend/specs/undo.js | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/frontend/specs/bold.js b/tests/frontend/specs/bold.js index 7c04835e..0bdbbc84 100644 --- a/tests/frontend/specs/bold.js +++ b/tests/frontend/specs/bold.js @@ -44,10 +44,10 @@ describe("bold button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - if(!inner$.browser.chrome){ - var evtType = "keypress"; - }else{ + if(!inner$.browser.firefox){ var evtType = "keydown"; + }else{ + var evtType = "keypress"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/indentation.js b/tests/frontend/specs/indentation.js index 6e5b3c1a..81ffc78e 100644 --- a/tests/frontend/specs/indentation.js +++ b/tests/frontend/specs/indentation.js @@ -15,10 +15,10 @@ describe("indentation button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - if(!inner$.browser.chrome){ - var evtType = "keypress"; - }else{ + if(!inner$.browser.firefox){ var evtType = "keydown"; + }else{ + var evtType = "keypress"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/italic.js b/tests/frontend/specs/italic.js index 9bee72dc..be226d48 100644 --- a/tests/frontend/specs/italic.js +++ b/tests/frontend/specs/italic.js @@ -44,10 +44,10 @@ describe("italic some text", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - if(!inner$.browser.chrome){ - var evtType = "keypress"; - }else{ + if(!inner$.browser.firefox){ var evtType = "keydown"; + }else{ + var evtType = "keypress"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/redo.js b/tests/frontend/specs/redo.js index 14ec31f6..7595da59 100644 --- a/tests/frontend/specs/redo.js +++ b/tests/frontend/specs/redo.js @@ -47,10 +47,10 @@ describe("undo button then redo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - if(!inner$.browser.chrome){ - var evtType = "keypress"; - }else{ + if(!inner$.browser.firefox){ var evtType = "keydown"; + }else{ + var evtType = "keypress"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/undo.js b/tests/frontend/specs/undo.js index 4e9dd0d5..9152c884 100644 --- a/tests/frontend/specs/undo.js +++ b/tests/frontend/specs/undo.js @@ -44,10 +44,10 @@ describe("undo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - if(!inner$.browser.chrome){ - var evtType = "keypress"; - }else{ + if(!inner$.browser.firefox){ var evtType = "keydown"; + }else{ + var evtType = "keypress"; } var e = inner$.Event(evtType); From 24188d70076eb6368b31a41466b567e7e59186f8 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 14:36:54 -0300 Subject: [PATCH 116/463] this should pass more tests.. --- tests/frontend/specs/bold.js | 7 +++---- tests/frontend/specs/indentation.js | 6 +++--- tests/frontend/specs/italic.js | 6 +++--- tests/frontend/specs/redo.js | 6 +++--- tests/frontend/specs/undo.js | 4 ++-- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/tests/frontend/specs/bold.js b/tests/frontend/specs/bold.js index 0bdbbc84..95da7331 100644 --- a/tests/frontend/specs/bold.js +++ b/tests/frontend/specs/bold.js @@ -43,11 +43,10 @@ describe("bold button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - - if(!inner$.browser.firefox){ - var evtType = "keydown"; - }else{ + if(inner$.browser.mozilla){ // if it's a mozilla browser var evtType = "keypress"; + }else{ + var evtType = "keydown"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/indentation.js b/tests/frontend/specs/indentation.js index 81ffc78e..9692120a 100644 --- a/tests/frontend/specs/indentation.js +++ b/tests/frontend/specs/indentation.js @@ -15,10 +15,10 @@ describe("indentation button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - if(!inner$.browser.firefox){ - var evtType = "keydown"; - }else{ + if(inner$.browser.mozilla){ // if it's a mozilla browser var evtType = "keypress"; + }else{ + var evtType = "keydown"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/italic.js b/tests/frontend/specs/italic.js index be226d48..29dbae59 100644 --- a/tests/frontend/specs/italic.js +++ b/tests/frontend/specs/italic.js @@ -44,10 +44,10 @@ describe("italic some text", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - if(!inner$.browser.firefox){ - var evtType = "keydown"; - }else{ + if(inner$.browser.mozilla){ // if it's a mozilla browser var evtType = "keypress"; + }else{ + var evtType = "keydown"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/redo.js b/tests/frontend/specs/redo.js index 7595da59..c2f8a95a 100644 --- a/tests/frontend/specs/redo.js +++ b/tests/frontend/specs/redo.js @@ -47,10 +47,10 @@ describe("undo button then redo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - if(!inner$.browser.firefox){ - var evtType = "keydown"; - }else{ + if(inner$.browser.mozilla){ // if it's a mozilla browser var evtType = "keypress"; + }else{ + var evtType = "keydown"; } var e = inner$.Event(evtType); diff --git a/tests/frontend/specs/undo.js b/tests/frontend/specs/undo.js index 9152c884..6fed22e3 100644 --- a/tests/frontend/specs/undo.js +++ b/tests/frontend/specs/undo.js @@ -45,9 +45,9 @@ describe("undo button", function(){ expect(modifiedValue).not.to.be(originalValue); // expect the value to change if(!inner$.browser.firefox){ - var evtType = "keydown"; - }else{ var evtType = "keypress"; + }else{ + var evtType = "keydown"; } var e = inner$.Event(evtType); From 29c0d790b51f187d6ce74fe8603013544a9217df Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 14:48:23 -0300 Subject: [PATCH 117/463] fix undo test --- tests/frontend/specs/undo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/frontend/specs/undo.js b/tests/frontend/specs/undo.js index 6fed22e3..0c58c9b8 100644 --- a/tests/frontend/specs/undo.js +++ b/tests/frontend/specs/undo.js @@ -44,7 +44,7 @@ describe("undo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - if(!inner$.browser.firefox){ + if(inner$.browser.mozilla){ // if it's a mozilla browser var evtType = "keypress"; }else{ var evtType = "keydown"; From d72abceee7556c1337e0fde1d04b24b40a554cfb Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 18:18:14 -0300 Subject: [PATCH 118/463] escape .color --- src/static/js/pad_userlist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad_userlist.js b/src/static/js/pad_userlist.js index c8f8e2c9..77ebb190 100644 --- a/src/static/js/pad_userlist.js +++ b/src/static/js/pad_userlist.js @@ -116,7 +116,7 @@ var paduserlist = (function() nameHtml = ''; } - return ['', '', ''].join(''); + return ['', '', ''].join(''); } function getRowHtml(id, innerHtml, authorId) From 1bb9d1d6259983b1bcbdfa72f17872516f55a5c4 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 18:23:27 -0300 Subject: [PATCH 119/463] remove pointless + --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index e57bb36e..2dc6408b 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -5125,7 +5125,7 @@ function Ace2Inner(){ function initLineNumbers() { lineNumbersShown = 1; - sideDiv.innerHTML = '
     
    ', nameHtml, '', padutils.escapeHtml(data.activity), '
     
    ', nameHtml, '', padutils.escapeHtml(data.activity), '
     
    ', nameHtml, '', padutils.escapeHtml(data.activity), '
    ' + '
    1
    '; + sideDiv.innerHTML = '
    1
    '; sideDivInner = outerWin.document.getElementById("sidedivinner"); } From 383439629a46c29578fded5db4bf9a2c07d6aa2f Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 18:27:32 -0300 Subject: [PATCH 120/463] specialkey doesnt even exist afaik --- src/static/js/pad.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 4b052620..7cefc41e 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -470,14 +470,6 @@ var pad = { userAgent: pad.getDisplayUserAgent() }; - if (clientVars.specialKey) - { - pad.myUserInfo.specialKey = clientVars.specialKey; - if (clientVars.specialKeyTranslation) - { - $("#specialkeyarea").html("mode: " + String(clientVars.specialKeyTranslation).toUpperCase()); - } - } padimpexp.init(this); padsavedrevs.init(this); From 5d12be940c6ed3062637be0f940a25f92702fb71 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Mar 2013 18:28:35 -0300 Subject: [PATCH 121/463] return text instead of html --- src/static/js/pad.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 7cefc41e..60a43557 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -655,8 +655,8 @@ var pad = { { alertBar.displayMessage(function(abar) { - abar.find("#servermsgdate").html(" (" + padutils.simpleDateTime(new Date) + ")"); - abar.find("#servermsgtext").html(m.text); + abar.find("#servermsgdate").text(" (" + padutils.simpleDateTime(new Date) + ")"); + abar.find("#servermsgtext").text(m.text); }); } if (m.js) From de552df6db435717912bad3aad558d343c23d8f8 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Fri, 15 Mar 2013 18:08:51 +0100 Subject: [PATCH 122/463] Fix clearing authorship colors which was broken by #1609 Fixes #1620 --- src/node/handler/PadMessageHandler.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 35f1ab4c..4b98292e 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -551,10 +551,19 @@ function handleUserChanges(client, message) } }); - // Validate all 'author' attribs to be the same value as the current user - wireApool.eachAttrib(function(type, value) { - if('author' == type && value != thisSession.author) throw "Trying to submit changes as another author" - }) + // Validate all added 'author' attribs to be the same value as the current user + var iterator = Changeset.opIterator(Changeset.unpack(changeset).ops) + , op + while(iterator.hasNext()) { + op = iterator.next() + if(op.opcode != '+') continue; + op.attribs.split('*').forEach(function(attr) { + if(!attr) return + attr = wireApool.getAttrib(attr) + if(!attr) return + if('author' == attr[0] && attr[1] != thisSession.author) throw "Trying to submit changes as another author" + }) + } } catch(e) { From 54433db47f5083faa921da6050b4e4e4b55dfb20 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Fri, 15 Mar 2013 21:43:29 +0100 Subject: [PATCH 123/463] release v1.2.9 --- CHANGELOG.md | 12 ++++++++++++ src/package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fac58f2..642846a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# 1.2.9 + * Fix: MAJOR Security issue, where a hacker could submit content as another user + * Fix: security issue due to unescaped user input + * Fix: Admin page at /admin redirects to /admin/ now to prevent breaking relative links + * Fix: indentation in chrome on linux + * Fix: PadUsers API endpoint + * NEW: A script to import data to all dbms + * NEW: Add authorId to chat and userlist as a data attribute + * NEW Refactor and fix our frontend tests + * NEW: Localisation updates + + # 1.2.81 * Fix: CtrlZ-Y for Undo Redo * Fix: RTL functionality on contents & fix RTL/LTR tests and RTL in Safari diff --git a/src/package.json b/src/package.json index 0e418ede..a7147cf2 100644 --- a/src/package.json +++ b/src/package.json @@ -46,5 +46,5 @@ "engines" : { "node" : ">=0.6.3", "npm" : ">=1.0" }, - "version" : "1.2.81" + "version" : "1.2.9" } From 5a9393d5da5b50232fdf055c5d335e6b0ce252cc Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sat, 16 Mar 2013 09:46:35 +0100 Subject: [PATCH 124/463] Update version checks --- bin/installDeps.sh | 4 ++-- bin/installOnWindows.bat | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/installDeps.sh b/bin/installDeps.sh index 9763f41b..2f97090b 100755 --- a/bin/installDeps.sh +++ b/bin/installDeps.sh @@ -44,8 +44,8 @@ fi #check node version NODE_VERSION=$(node --version) NODE_V_MINOR=$(echo $NODE_VERSION | cut -d "." -f 1-2) -if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.6" ]; then - echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.6.x or v0.8.x" >&2 +if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.6" && [ ! $NODE_V_MINOR = "v0.10" ]; then + echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.6.x, v0.8.x or v0.10.x" >&2 exit 1 fi diff --git a/bin/installOnWindows.bat b/bin/installOnWindows.bat index f678672b..f7452982 100644 --- a/bin/installOnWindows.bat +++ b/bin/installOnWindows.bat @@ -8,7 +8,7 @@ cmd /C node -e "" || ( echo "Please install node.js ( http://nodejs.org )" && ex echo _ echo Checking node version... -set check_version="if(['6','8'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad Lite requires v0.6.x or v0.8.x'); process.exit(1) }" +set check_version="if(['6','8','10'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad Lite requires v0.6.x, v0.8.x or v0.10.x'); process.exit(1) }" cmd /C node -e %check_version% || exit /B 1 echo _ From cd9c78998e84568d85bb850d892adee5ea5710b6 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sat, 16 Mar 2013 09:47:10 +0100 Subject: [PATCH 125/463] Fix path.join in Settings.js --- src/node/utils/Settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 45f81aa5..901ac514 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -142,7 +142,7 @@ exports.abiwordAvailable = function() exports.reloadSettings = function reloadSettings() { // Discover where the settings file lives var settingsFilename = argv.settings || "settings.json"; - settingsFilename = path.resolve(path.join(root, settingsFilename)); + settingsFilename = path.resolve(path.join(exports.root, settingsFilename)); var settingsStr; try{ From 13ad46aa67cf87d2c5ee86372a101d44f4de7b65 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 16 Mar 2013 13:19:12 +0000 Subject: [PATCH 126/463] a safer approach I think but still be careful --- src/node/handler/PadMessageHandler.js | 11 ++++++----- src/static/js/collab_client.js | 4 +++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index e44ced05..b254053d 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -261,12 +261,13 @@ function handleSaveRevisionMessage(client, message){ * @param sessionID {string} the socketIO session to which we're sending this message */ exports.handleCustomObjectMessage = function (msg, sessionID, cb) { - if(sessionID){ // If a sessionID is targeted then send directly to this sessionID - io.sockets.socket(sessionID).emit(msg); // send a targeted message - }else{ - socketio.sockets.in(msg.data.padId).json.send(msg); // broadcast to all clients on this pad + if(msg.type === "CUSTOM"){ + if(sessionID){ // If a sessionID is targeted then send directly to this sessionID + io.sockets.socket(sessionID).emit(msg); // send a targeted message + }else{ + socketio.sockets.in(msg.data.padId).json.send(msg); // broadcast to all clients on this pad + } } - cb(null, {}); } diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 94149123..ff360419 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -278,8 +278,9 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (!getSocket()) return; if (!evt.data) return; var wrapper = evt; - if (wrapper.type != "COLLABROOM") return; + if (wrapper.type != "COLLABROOM" && wrapper.type != "CUSTOM") return; var msg = wrapper.data; + if (msg.type == "NEW_CHANGES") { var newRev = msg.newRev; @@ -390,6 +391,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) callbacks.onUserLeave(userInfo); } } + else if (msg.type == "DISCONNECT_REASON") { appLevelDisconnectReason = msg.reason; From f972d2a92d574648d20bd5d41c3115c3563a83d6 Mon Sep 17 00:00:00 2001 From: accolade Date: Sat, 16 Mar 2013 17:05:23 +0100 Subject: [PATCH 127/463] (( 2 typos --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a69a3b6..4e59afbf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,8 +11,8 @@ To make sure everybody is going in the same direction: * easy to install for admins and easy to use for people * easy to integrate into other apps, but also usable as standalone * using less resources on server side -* extensible, as much functionality should be extendable with plugins so changes don't have to be done in core -Also, keep it maintainable. We don't wanna end ob as the monster Etherpad was! +* extensible, as much functionality should be extendable with plugins so changes don't have to be done in core. +Also, keep it maintainable. We don't wanna end up as the monster Etherpad was! ## How to work with git? * Don't work in your master branch. @@ -62,4 +62,4 @@ The docs are in the `doc/` folder in the git repository, so people can easily fi Documentation should be kept up-to-date. This means, whenever you add a new API method, add a new hook or change the database model, pack the relevant changes to the docs in the same pull request. -You can build the docs e.g. produce html, using `make docs`. At some point in the future we will provide an online documentation. The current documentation in the github wiki should always reflect the state of `master` (!), since there are no docs in master, yet. \ No newline at end of file +You can build the docs e.g. produce html, using `make docs`. At some point in the future we will provide an online documentation. The current documentation in the github wiki should always reflect the state of `master` (!), since there are no docs in master, yet. From 69a4ab76cfb4de059d3c5bc34f3d803bac718899 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 16 Mar 2013 17:50:53 +0000 Subject: [PATCH 128/463] hide modal once reconnect is good --- src/static/js/pad_modals.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad_modals.js b/src/static/js/pad_modals.js index 0292e048..0013e899 100644 --- a/src/static/js/pad_modals.js +++ b/src/static/js/pad_modals.js @@ -49,7 +49,7 @@ var padmodals = (function() }, duration); }, hideOverlay: function(duration) { - $("#overlay").animate( + $("#overlay").hide().css( { 'opacity': 0 }, duration, function() From a1d9d27cde3bee416355222ec1988debfdc3d4c2 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 16 Mar 2013 17:57:23 +0000 Subject: [PATCH 129/463] much cleaner way of showing / hiding overlay --- src/static/js/pad_connectionstatus.js | 1 - src/static/js/pad_modals.js | 16 ++-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/static/js/pad_connectionstatus.js b/src/static/js/pad_connectionstatus.js index 2d9354ab..862d5fd1 100644 --- a/src/static/js/pad_connectionstatus.js +++ b/src/static/js/pad_connectionstatus.js @@ -76,7 +76,6 @@ var padconnectionstatus = (function() }, isFullyConnected: function() { - padmodals.hideOverlay(); return status.what == 'connected'; }, getStatus: function() diff --git a/src/static/js/pad_modals.js b/src/static/js/pad_modals.js index 0013e899..39094a7e 100644 --- a/src/static/js/pad_modals.js +++ b/src/static/js/pad_modals.js @@ -40,22 +40,10 @@ var padmodals = (function() }); }, showOverlay: function(duration) { - $("#overlay").show().css( - { - 'opacity': 0 - }).animate( - { - 'opacity': 1 - }, duration); + $("#overlay").show(); }, hideOverlay: function(duration) { - $("#overlay").hide().css( - { - 'opacity': 0 - }, duration, function() - { - $("#modaloverlay").hide(); - }); + $("#overlay").hide(); } }; return self; From 693b9b9b9449252fea4bc6f4117beb88da48b5bc Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Mar 2013 01:23:31 +0000 Subject: [PATCH 130/463] better mobile support for gritter messages, before it was awful --- src/static/css/pad.css | 39 ++++++++++++++++++++++++++++++++++++++- src/static/js/chat.js | 1 - src/static/js/gritter.js | 2 -- src/static/js/pad.js | 4 ++-- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index e536b925..320a4720 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -828,7 +828,44 @@ input[type=checkbox] { padding: 4px 1px } } -@media screen and (max-width: 400px){ +@media all and (max-width: 400px){ + #gritter-notice-wrapper{ + max-height:172px; + overflow:hidden; + width:100% !important; + background-color: #ccc; + bottom:20px; + left:0px; + right:0px; + color:#000; + } + .gritter-close { + display:block !important; + left: auto !important; + right:5px; + } + #gritter-notice-wrapper.bottom-right{ + left:0px !important; + bottom:30px !important; + right:0px !important; + } + .gritter-item p{ + color:black; + font-size:16px; + } + .gritter-title{ + text-shadow: none !important; + color:black; + } + .gritter-item{ + padding:2px 11px 8px 4px; + } + .gritter-item-wrapper{ + margin:0; + } + .gritter-item-wrapper > div{ + background: none; + } #editorcontainer { top: 68px; } diff --git a/src/static/js/chat.js b/src/static/js/chat.js index 83a487de..6ef11fa0 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -155,7 +155,6 @@ var chat = (function() title: authorName, // (string | mandatory) the text inside the notification text: text, - // (bool | optional) if you want it to fade out on its own or just sit there sticky: false, // (int | optional) the time you want it to be alive for before fading out diff --git a/src/static/js/gritter.js b/src/static/js/gritter.js index c32cc758..9778707e 100644 --- a/src/static/js/gritter.js +++ b/src/static/js/gritter.js @@ -21,8 +21,6 @@ $.gritter.options = { position: '', class_name: '', // could be set to 'gritter-light' to use white notifications - fade_in_speed: 'medium', // how fast notifications fade in - fade_out_speed: 1000, // how fast the notices fade out time: 6000 // hang on the screen for... } diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 4b052620..8b53a6fb 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -365,8 +365,7 @@ function handshake() $.extend($.gritter.options, { position: 'bottom-right', // defaults to 'top-right' but can be 'bottom-left', 'bottom-right', 'top-left', 'top-right' (added in 1.7.1) - fade_in_speed: 'medium', // how fast notifications fade in (string or int) - fade_out_speed: 2000, // how fast the notices fade out + fade: false, // dont fade, too jerky on mobile time: 6000 // hang on the screen for... }); @@ -615,6 +614,7 @@ var pad = { }, handleClientMessage: function(msg) { + console.log("as"); if (msg.type == 'suggestUserName') { if (msg.unnamedId == pad.myUserInfo.userId && msg.newName && !pad.myUserInfo.name) From 3e0a80cb7431e99b8bb3743d37e4b22ea3443224 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Mar 2013 15:17:36 +0000 Subject: [PATCH 131/463] remove console log --- src/static/js/pad.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 8b53a6fb..0a81192f 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -614,7 +614,6 @@ var pad = { }, handleClientMessage: function(msg) { - console.log("as"); if (msg.type == 'suggestUserName') { if (msg.unnamedId == pad.myUserInfo.userId && msg.newName && !pad.myUserInfo.name) From b084cf4f28bb1fe766984dfbeb73d3505eb8951e Mon Sep 17 00:00:00 2001 From: maixithn Date: Sun, 17 Mar 2013 21:57:14 +0100 Subject: [PATCH 132/463] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 91410b87..57474073 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,11 @@ Update to the latest version with `git pull origin`, then run `bin\installOnWind [Next steps](#next-steps). -## Linux +## Linux/Unix You'll need gzip, git, curl, libssl develop libraries, python and gcc. *For Debian/Ubuntu*: `apt-get install gzip git-core curl python libssl-dev pkg-config build-essential` *For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"` +*For FreeBSD*: `portinstall node node, npm and git (optional)` Additionally, you'll need [node.js](http://nodejs.org) installed, Ideally the latest stable version, be careful of installing nodejs from apt. From 81f0ef73abfb492841e83a4b87a293a2d2d71ebc Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Mar 2013 22:15:18 +0000 Subject: [PATCH 133/463] beginning of FE tests for caret tracking which is easily broken when you add weird line heights to pads --- tests/frontend/specs/caret.js | 114 ++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tests/frontend/specs/caret.js diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js new file mode 100644 index 00000000..fd479d5d --- /dev/null +++ b/tests/frontend/specs/caret.js @@ -0,0 +1,114 @@ +describe("As the caret is moved is the UI properly updated?", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + /* Tests to do + * Keystroke up (38), down (40), left (37), right (39) with and without special keys IE control / shift + * Page up (33) / down (34) with and without special keys + */ + + it("Creates N rows, changes height of rows, updates UI by caret key events", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + var numberOfRows = 50; + + //ace creates a new dom element when you press a keystroke, so just get the first text element again + var $newFirstTextElement = inner$("div").first(); + var originalDivHeight = inner$("div").first().css("height"); + + prepareDocument(numberOfRows, $newFirstTextElement); // N lines into the first div as a target + + helper.waitFor(function(){ // Wait for the DOM to register the new items + return inner$("div").first().text().length == 6; + }).done(function(){ // Once the DOM has registered the items + inner$("div").each(function(index){ // Randomize the item heights (replicates images / headings etc) + var random = Math.floor(Math.random() * (50)) + 20; + $(this).css("height", random+"px"); + }); + + var newDivHeight = inner$("div").first().css("height"); + var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height + expect(heightHasChanged).to.be(true); // expect the first line to be blank + }); + + // Is this Element now visible to the pad user? + helper.waitFor(function(){ // Wait for the DOM to register the new items + return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place + }).done(function(){ // Once the DOM has registered the items + inner$("div").each(function(index){ // Randomize the item heights (replicates images / headings etc) + var random = Math.floor(Math.random() * (80 - 20 + 1)) + 20; + $(this).css("height", random+"px"); + }); + + var newDivHeight = inner$("div").first().css("height"); + var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height + expect(heightHasChanged).to.be(true); // expect the first line to be blank + }); + + // Does scrolling back up the pad with the up arrow show the correct contents? + helper.waitFor(function(){ // Wait for the new position to be in place + return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place + }).done(function(){ // Once the DOM has registered the items + var i = 0; + while(i < numberOfRows){ // press up arrow N times + keyEvent(inner$, 38, false, false); + i++; + } + + helper.waitFor(function(){ // Wait for the new position to be in place + return isScrolledIntoView(inner$("div:nth-child(0)"), inner$); // Wait for the DOM to scroll into place + }).done(function(){ // Once we're at the top of the document + expect(true).to.be(true); + done(); + }); + }); + + }); +}); + +function prepareDocument(n, target){ // generates a random document with random content on n lines + var i = 0; + while(i < n){ // for each line + target.sendkeys(makeStr()); // generate a random string and send that to the editor + target.sendkeys('{enter}'); // generator an enter keypress + i++; // rinse n times + } +} + +function keyEvent(target, charCode, ctrl, shift){ // sends a charCode to the window + if(target.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + var e = target.Event(evtType); + if(ctrl){ + e.ctrlKey = true; // Control key + } + if(shift){ + e.shiftKey = true; // Shift Key + } + e.which = charCode; + target("#innerdocbody").trigger(e); +} + + +function makeStr(){ // from http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + for( var i=0; i < 5; i++ ) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + return text; +} + +function isScrolledIntoView(elem, $){ // from http://stackoverflow.com/questions/487073/check-if-element-is-visible-after-scrolling + var docViewTop = $(window).scrollTop(); + var docViewBottom = docViewTop + $(window).height(); + var elemTop = $(elem).offset().top; + var elemBottom = elemTop + $(elem).height(); + return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); +} From 99ac407f089e83db3b1608bb4a9c7869f438c4c4 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 17 Mar 2013 23:16:23 +0000 Subject: [PATCH 134/463] working caret position function --- tests/frontend/specs/caret.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js index fd479d5d..56964885 100644 --- a/tests/frontend/specs/caret.js +++ b/tests/frontend/specs/caret.js @@ -10,8 +10,14 @@ describe("As the caret is moved is the UI properly updated?", function(){ * Page up (33) / down (34) with and without special keys */ + /* Challenges + * How do we keep the authors focus on a line if the lines above the author are modified? We should only redraw the user to a location if they are typing and make sure shift and arrow keys aren't redrawing the UI else highlight - copy/paste would get broken + * How the fsk do I get + * + */ + it("Creates N rows, changes height of rows, updates UI by caret key events", function(done) { - var inner$ = helper.padInner$; + var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; var numberOfRows = 50; @@ -29,6 +35,7 @@ describe("As the caret is moved is the UI properly updated?", function(){ $(this).css("height", random+"px"); }); + console.log(caretPosition(inner$)); var newDivHeight = inner$("div").first().css("height"); var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height expect(heightHasChanged).to.be(true); // expect the first line to be blank @@ -112,3 +119,12 @@ function isScrolledIntoView(elem, $){ // from http://stackoverflow.com/questions var elemBottom = elemTop + $(elem).height(); return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); } + +function caretPosition($){ + var doc = $.window.document; + var pos = doc.getSelection(); + pos.y = pos.anchorNode.parentElement.offsetTop; + pos.x = pos.anchorNode.parentElement.offsetLeft; + console.log(pos); + return pos; +} From 83ed9303dacf75f870378e91b9ca165fdc3247cc Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 18 Mar 2013 00:43:57 +0000 Subject: [PATCH 135/463] Localisation updates from http://translatewiki.net. --- src/locales/ast.json | 3 +- src/locales/be-tarask.json | 61 ++++++++++++++++++++++++++++++++++++++ src/locales/br.json | 1 + src/locales/ca.json | 1 + src/locales/da.json | 12 ++++---- src/locales/de.json | 1 + src/locales/fa.json | 2 +- src/locales/fr.json | 3 +- src/locales/gl.json | 3 +- src/locales/he.json | 3 +- src/locales/ia.json | 1 + src/locales/it.json | 3 +- src/locales/ja.json | 1 + src/locales/ko.json | 3 +- src/locales/mk.json | 3 +- src/locales/ms.json | 3 +- src/locales/nl.json | 1 + src/locales/ru.json | 3 +- src/locales/sl.json | 3 +- src/locales/sv.json | 3 +- src/locales/te.json | 2 +- src/locales/zh-hant.json | 1 + 22 files changed, 99 insertions(+), 18 deletions(-) create mode 100644 src/locales/be-tarask.json diff --git a/src/locales/ast.json b/src/locales/ast.json index 7beb706a..7d471860 100644 --- a/src/locales/ast.json +++ b/src/locales/ast.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autor\u00eda", "pad.toolbar.import_export.title": "Importar\/Esportar ente distintos formatos de ficheru", "pad.toolbar.timeslider.title": "Eslizador de tiempu", - "pad.toolbar.savedRevision.title": "Revisiones guardaes", + "pad.toolbar.savedRevision.title": "Guardar revisi\u00f3n", "pad.toolbar.settings.title": "Configuraci\u00f3n", "pad.toolbar.embed.title": "Incrustar esti bloc", "pad.toolbar.showusers.title": "Amosar los usuarios d'esti bloc", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Alderique en pantalla siempres", "pad.settings.colorcheck": "Colores d'autor\u00eda", "pad.settings.linenocheck": "N\u00famberos de llinia", + "pad.settings.rtlcheck": "\u00bfLleer el conten\u00edu de drecha a izquierda?", "pad.settings.fontType": "Tipograf\u00eda:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monoespaciada", diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json new file mode 100644 index 00000000..dda41289 --- /dev/null +++ b/src/locales/be-tarask.json @@ -0,0 +1,61 @@ +{ + "index.newPad": "\u0421\u0442\u0432\u0430\u0440\u044b\u0446\u044c", + "index.createOpenPad": "\u0446\u0456 \u0442\u0432\u0430\u0440\u044b\u0446\u044c\/\u0430\u0434\u043a\u0440\u044b\u0446\u044c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u0430\u0439:", + "pad.toolbar.bold.title": "\u0422\u043e\u045e\u0441\u0442\u044b (Ctrl-B)", + "pad.toolbar.italic.title": "\u041a\u0443\u0440\u0441\u0456\u045e (Ctrl-I)", + "pad.toolbar.underline.title": "\u041f\u0430\u0434\u043a\u0440\u044d\u0441\u044c\u043b\u0456\u0432\u0430\u043d\u044c\u043d\u0435 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0417\u0430\u043a\u0440\u044d\u0441\u044c\u043b\u0456\u0432\u0430\u043d\u044c\u043d\u0435", + "pad.toolbar.ol.title": "\u0423\u043f\u0430\u0440\u0430\u0434\u043a\u0430\u0432\u0430\u043d\u044b \u0441\u044c\u043f\u0456\u0441", + "pad.toolbar.ul.title": "\u041d\u0435\u045e\u043f\u0430\u0440\u0430\u0434\u043a\u0430\u0432\u0430\u043d\u044b \u0441\u044c\u043f\u0456\u0441", + "pad.toolbar.indent.title": "\u0412\u043e\u0434\u0441\u0442\u0443\u043f", + "pad.toolbar.unindent.title": "\u0412\u044b\u0441\u0442\u0443\u043f", + "pad.toolbar.undo.title": "\u0421\u043a\u0430\u0441\u0430\u0432\u0430\u0446\u044c(Ctrl-Z)", + "pad.toolbar.redo.title": "\u0412\u044f\u0440\u043d\u0443\u0446\u044c (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u041f\u0440\u044b\u0431\u0440\u0430\u0446\u044c \u043a\u043e\u043b\u0435\u0440 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0443", + "pad.toolbar.import_export.title": "\u0406\u043c\u043f\u0430\u0440\u0442\/\u042d\u043a\u0441\u043f\u0430\u0440\u0442 \u0437 \u0432\u044b\u043a\u0430\u0440\u044b\u0441\u0442\u0430\u043d\u044c\u043d\u0435 \u0440\u043e\u0437\u043d\u044b\u0445 \u0444\u0430\u0440\u043c\u0430\u0442\u0430\u045e \u0444\u0430\u0439\u043b\u0430\u045e", + "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0447\u0430\u0441\u0443", + "pad.toolbar.savedRevision.title": "\u0417\u0430\u0445\u0430\u0432\u0430\u0446\u044c \u0432\u044d\u0440\u0441\u0456\u044e", + "pad.toolbar.settings.title": "\u041d\u0430\u043b\u0430\u0434\u044b", + "pad.toolbar.embed.title": "\u0423\u0431\u0443\u0434\u0430\u0432\u0430\u0446\u044c \u0433\u044d\u0442\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442", + "pad.toolbar.showusers.title": "\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u043b\u044c\u043d\u0456\u043a\u0430\u045e \u0443 \u0433\u044d\u0442\u044b\u043c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0446\u0435", + "pad.colorpicker.save": "\u0417\u0430\u0445\u0430\u0432\u0430\u0446\u044c", + "pad.colorpicker.cancel": "\u0421\u043a\u0430\u0441\u0430\u0432\u0430\u0446\u044c", + "pad.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...", + "pad.passwordRequired": "\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u0430 \u0433\u044d\u0442\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430 \u043f\u0430\u0442\u0440\u044d\u0431\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.permissionDenied": "\u0412\u044b \u043d\u044f \u043c\u0430\u0435\u0446\u0435 \u0434\u0430\u0437\u0432\u043e\u043b\u0443 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0430 \u0433\u044d\u0442\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430", + "pad.wrongPassword": "\u0412\u044b \u045e\u0432\u044f\u043b\u0456 \u043d\u044f\u0441\u043b\u0443\u0448\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.settings.padSettings": "\u041d\u0430\u043b\u0430\u0434\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430", + "pad.settings.myView": "\u041c\u043e\u0439 \u0432\u044b\u0433\u043b\u044f\u0434", + "pad.settings.stickychat": "\u0417\u0430\u045e\u0441\u0451\u0434\u044b \u043f\u0430\u043a\u0430\u0437\u0432\u0430\u0446\u044c \u0447\u0430\u0442", + "pad.settings.colorcheck": "\u041a\u043e\u043b\u0435\u0440\u044b \u0430\u045e\u0442\u0430\u0440\u0441\u0442\u0432\u0430", + "pad.settings.linenocheck": "\u041d\u0443\u043c\u0430\u0440\u044b \u0440\u0430\u0434\u043a\u043e\u045e", + "pad.settings.rtlcheck": "\u0422\u044d\u043a\u0441\u0442 \u0441\u043f\u0440\u0430\u0432\u0430-\u043d\u0430\u043b\u0435\u0432\u0430", + "pad.settings.fontType": "\u0422\u044b\u043f \u0448\u0440\u044b\u0444\u0442\u0443:", + "pad.settings.fontType.normal": "\u0417\u0432\u044b\u0447\u0430\u0439\u043d\u044b", + "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u0430\u0448\u044b\u0440\u044b\u043d\u043d\u044b", + "pad.settings.globalView": "\u0410\u0433\u0443\u043b\u044c\u043d\u044b \u0432\u044b\u0433\u043b\u044f\u0434", + "pad.settings.language": "\u041c\u043e\u0432\u0430:", + "pad.importExport.import_export": "\u0406\u043c\u043f\u0430\u0440\u0442\/\u042d\u043a\u0441\u043f\u0430\u0440\u0442", + "pad.importExport.import": "\u0417\u0430\u0433\u0440\u0443\u0437\u0456\u0436\u0430\u0439\u0446\u0435 \u043b\u044e\u0431\u044b\u044f \u0442\u044d\u043a\u0441\u0442\u0430\u0432\u044b\u044f \u0444\u0430\u0439\u043b\u044b \u0430\u0431\u043e \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u044b", + "pad.importExport.importSuccessful": "\u041f\u0430\u0441\u044c\u043f\u044f\u0445\u043e\u0432\u0430!", + "pad.importExport.export": "\u042d\u043a\u0441\u043f\u0430\u0440\u0442\u0430\u0432\u0430\u0446\u044c \u0431\u044f\u0433\u0443\u0447\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u044f\u043a:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u041f\u0440\u043e\u0441\u0442\u044b \u0442\u044d\u043a\u0441\u0442", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u041f\u0430\u0434\u043b\u0443\u0447\u044b\u043b\u0456\u0441\u044f.", + "pad.modals.reconnecting": "\u041f\u0435\u0440\u0430\u043f\u0430\u0434\u043b\u0443\u0447\u044d\u043d\u044c\u043d\u0435 \u0434\u0430 \u0432\u0430\u0448\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430...", + "pad.modals.forcereconnect": "\u041f\u0440\u044b\u043c\u0443\u0441\u043e\u0432\u0430\u0435 \u043f\u0435\u0440\u0430\u043f\u0430\u0434\u043b\u0443\u0447\u044d\u043d\u044c\u043d\u0435", + "pad.share": "\u041f\u0430\u0434\u0437\u044f\u043b\u0456\u0446\u0446\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430\u043c", + "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u0456 \u0434\u043b\u044f \u0447\u044b\u0442\u0430\u043d\u044c\u043d\u044f", + "pad.share.link": "\u0421\u043f\u0430\u0441\u044b\u043b\u043a\u0430", + "pad.chat": "\u0427\u0430\u0442", + "@metadata": { + "authors": [ + "Jim-by", + "Wizardist" + ] + } +} \ No newline at end of file diff --git a/src/locales/br.json b/src/locales/br.json index 1197f0d6..f844eb05 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -37,6 +37,7 @@ "pad.settings.stickychat": "Diskwel ar flap bepred", "pad.settings.colorcheck": "Livio\u00f9 anaout", "pad.settings.linenocheck": "Niverenno\u00f9 linenno\u00f9", + "pad.settings.rtlcheck": "Lenn an danvez a-zehou da gleiz ?", "pad.settings.fontType": "Seurt font :", "pad.settings.fontType.normal": "Reizh", "pad.settings.fontType.monospaced": "Monospas", diff --git a/src/locales/ca.json b/src/locales/ca.json index ec521eca..e736fd3c 100644 --- a/src/locales/ca.json +++ b/src/locales/ca.json @@ -28,6 +28,7 @@ "pad.settings.stickychat": "Xateja sempre a la pantalla", "pad.settings.colorcheck": "Colors d'autoria", "pad.settings.linenocheck": "N\u00fameros de l\u00ednia", + "pad.settings.rtlcheck": "Llegir el contingut de dreta a esquerra?", "pad.settings.fontType": "Tipus de lletra:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "D'amplada fixa", diff --git a/src/locales/da.json b/src/locales/da.json index e7cde1f5..b0aef713 100644 --- a/src/locales/da.json +++ b/src/locales/da.json @@ -1,9 +1,10 @@ { "@metadata": { - "authors": [ - "Christian List", - "Peter Alberti" - ] + "authors": { + "0": "Christian List", + "1": "Peter Alberti", + "3": "Steenth" + } }, "index.newPad": "Ny Pad", "index.createOpenPad": "eller opret\/\u00e5bn en Pad med navnet:", @@ -20,7 +21,7 @@ "pad.toolbar.clearAuthorship.title": "Fjern farver for forfatterskab", "pad.toolbar.import_export.title": "Import\/eksport fra\/til forskellige filformater", "pad.toolbar.timeslider.title": "Timeslider", - "pad.toolbar.savedRevision.title": "Gemte revisioner", + "pad.toolbar.savedRevision.title": "Gem Revision", "pad.toolbar.settings.title": "Indstillinger", "pad.toolbar.embed.title": "Integrer denne pad", "pad.toolbar.showusers.title": "Vis brugere p\u00e5 denne pad", @@ -35,6 +36,7 @@ "pad.settings.stickychat": "Chat altid p\u00e5 sk\u00e6rmen", "pad.settings.colorcheck": "Forfatterskabsfarver", "pad.settings.linenocheck": "Linjenumre", + "pad.settings.rtlcheck": "L\u00e6se indhold fra h\u00f8jre mod venstre?", "pad.settings.fontType": "Skrifttype:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Fastbredde", diff --git a/src/locales/de.json b/src/locales/de.json index 20938422..fdd01675 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -37,6 +37,7 @@ "pad.settings.stickychat": "Chat immer anzeigen", "pad.settings.colorcheck": "Autorenfarben anzeigen", "pad.settings.linenocheck": "Zeilennummern", + "pad.settings.rtlcheck": "Inhalt von rechts nach links lesen?", "pad.settings.fontType": "Schriftart:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/locales/fa.json b/src/locales/fa.json index bccc353c..8e0fd138 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -21,7 +21,7 @@ "pad.toolbar.clearAuthorship.title": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", "pad.toolbar.import_export.title": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc\/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0632\/\u0628\u0647 \u0642\u0627\u0644\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641", "pad.toolbar.timeslider.title": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646", - "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0633\u062e\u0647", + "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u06cc \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc", "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a", "pad.toolbar.embed.title": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", "pad.toolbar.showusers.title": "\u0646\u0645\u0627\u06cc\u0634 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", diff --git a/src/locales/fr.json b/src/locales/fr.json index 4131c723..6e1e79b4 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -28,7 +28,7 @@ "pad.toolbar.clearAuthorship.title": "Effacer les couleurs identifiant les auteurs", "pad.toolbar.import_export.title": "Importer\/Exporter de\/vers un format de fichier diff\u00e9rent", "pad.toolbar.timeslider.title": "Historique dynamique", - "pad.toolbar.savedRevision.title": "Versions enregistr\u00e9es", + "pad.toolbar.savedRevision.title": "Enregistrer la r\u00e9vision", "pad.toolbar.settings.title": "Param\u00e8tres", "pad.toolbar.embed.title": "Int\u00e9grer ce Pad", "pad.toolbar.showusers.title": "Afficher les utilisateurs du Pad", @@ -43,6 +43,7 @@ "pad.settings.stickychat": "Toujours afficher le chat", "pad.settings.colorcheck": "Couleurs d\u2019identification", "pad.settings.linenocheck": "Num\u00e9ros de lignes", + "pad.settings.rtlcheck": "Lire le contenu de la droite vers la gauche?", "pad.settings.fontType": "Type de police :", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/locales/gl.json b/src/locales/gl.json index 261d28ef..6b9c2b54 100644 --- a/src/locales/gl.json +++ b/src/locales/gl.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificaci\u00f3n dos autores", "pad.toolbar.import_export.title": "Importar\/Exportar desde\/a diferentes formatos de ficheiro", "pad.toolbar.timeslider.title": "Li\u00f1a do tempo", - "pad.toolbar.savedRevision.title": "Revisi\u00f3ns gardadas", + "pad.toolbar.savedRevision.title": "Gardar a revisi\u00f3n", "pad.toolbar.settings.title": "Configuraci\u00f3ns", "pad.toolbar.embed.title": "Incorporar este documento", "pad.toolbar.showusers.title": "Mostrar os usuarios deste documento", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Chat sempre visible", "pad.settings.colorcheck": "Cores de identificaci\u00f3n", "pad.settings.linenocheck": "N\u00fameros de li\u00f1a", + "pad.settings.rtlcheck": "Quere ler o contido da dereita \u00e1 esquerda?", "pad.settings.fontType": "Tipo de letra:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monoespazada", diff --git a/src/locales/he.json b/src/locales/he.json index 7e5f3b04..77e68e63 100644 --- a/src/locales/he.json +++ b/src/locales/he.json @@ -20,7 +20,7 @@ "pad.toolbar.clearAuthorship.title": "\u05e0\u05d9\u05e7\u05d5\u05d9 \u05e6\u05d1\u05e2\u05d9\u05dd", "pad.toolbar.import_export.title": "\u05d9\u05d9\u05d1\u05d5\u05d0\/\u05d9\u05d9\u05e6\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8\u05d9 \u05e7\u05d1\u05e6\u05d9\u05dd \u05e9\u05d5\u05e0\u05d9\u05dd", "pad.toolbar.timeslider.title": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df", - "pad.toolbar.savedRevision.title": "\u05d2\u05e8\u05e1\u05d0\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea", + "pad.toolbar.savedRevision.title": "\u05e9\u05de\u05d9\u05e8\u05ea \u05d2\u05e8\u05e1\u05d4", "pad.toolbar.settings.title": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", "pad.toolbar.embed.title": "\u05d4\u05d8\u05de\u05e2\u05ea \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", "pad.toolbar.showusers.title": "\u05d4\u05e6\u05d2\u05ea \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", @@ -35,6 +35,7 @@ "pad.settings.stickychat": "\u05d4\u05e9\u05d9\u05d7\u05d4 \u05ea\u05de\u05d9\u05d3 \u05e2\u05dc \u05d4\u05de\u05e1\u05da", "pad.settings.colorcheck": "\u05e6\u05d1\u05d9\u05e2\u05d4 \u05dc\u05e4\u05d9 \u05de\u05d7\u05d1\u05e8", "pad.settings.linenocheck": "\u05de\u05e1\u05e4\u05e8\u05d9 \u05e9\u05d5\u05e8\u05d5\u05ea", + "pad.settings.rtlcheck": "\u05dc\u05e7\u05e8\u05d5\u05d0 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc?", "pad.settings.fontType": "\u05e1\u05d5\u05d2 \u05d2\u05d5\u05e4\u05df:", "pad.settings.fontType.normal": "\u05e8\u05d2\u05d9\u05dc", "pad.settings.fontType.monospaced": "\u05d1\u05e8\u05d5\u05d7\u05d1 \u05e7\u05d1\u05d5\u05e2", diff --git a/src/locales/ia.json b/src/locales/ia.json index e6c5dde1..3c57a8f0 100644 --- a/src/locales/ia.json +++ b/src/locales/ia.json @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Chat sempre visibile", "pad.settings.colorcheck": "Colores de autor", "pad.settings.linenocheck": "Numeros de linea", + "pad.settings.rtlcheck": "Leger le contento de dextra a sinistra?", "pad.settings.fontType": "Typo de litteras:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospatial", diff --git a/src/locales/it.json b/src/locales/it.json index 05569a32..c80b2a39 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -22,7 +22,7 @@ "pad.toolbar.clearAuthorship.title": "Elimina i colori che indicano gli autori", "pad.toolbar.import_export.title": "Importa\/esporta da\/a diversi formati di file", "pad.toolbar.timeslider.title": "Presentazione cronologia", - "pad.toolbar.savedRevision.title": "Revisioni salvate", + "pad.toolbar.savedRevision.title": "Versione salvata", "pad.toolbar.settings.title": "Impostazioni", "pad.toolbar.embed.title": "Incorpora questo Pad", "pad.toolbar.showusers.title": "Visualizza gli utenti su questo Pad", @@ -37,6 +37,7 @@ "pad.settings.stickychat": "Chat sempre sullo schermo", "pad.settings.colorcheck": "Colori che indicano gli autori", "pad.settings.linenocheck": "Numeri di riga", + "pad.settings.rtlcheck": "Leggere il contenuto da destra a sinistra?", "pad.settings.fontType": "Tipo di carattere:", "pad.settings.fontType.normal": "Normale", "pad.settings.fontType.monospaced": "A larghezza fissa", diff --git a/src/locales/ja.json b/src/locales/ja.json index f7173dd4..2464f02c 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -34,6 +34,7 @@ "pad.settings.stickychat": "\u753b\u9762\u306b\u30c1\u30e3\u30c3\u30c8\u3092\u5e38\u306b\u8868\u793a", "pad.settings.colorcheck": "\u4f5c\u8005\u306e\u8272\u5206\u3051", "pad.settings.linenocheck": "\u884c\u756a\u53f7", + "pad.settings.rtlcheck": "\u53f3\u6a2a\u66f8\u304d\u306b\u3059\u308b", "pad.settings.fontType": "\u30d5\u30a9\u30f3\u30c8\u306e\u7a2e\u985e:", "pad.settings.fontType.normal": "\u901a\u5e38", "pad.settings.fontType.monospaced": "\u56fa\u5b9a\u5e45", diff --git a/src/locales/ko.json b/src/locales/ko.json index ccd7705c..ac12f0b4 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "\uc800\uc790\uc758 \uc0c9 \uc9c0\uc6b0\uae30", "pad.toolbar.import_export.title": "\ub2e4\ub978 \ud30c\uc77c \ud615\uc2dd\uc73c\ub85c \uac00\uc838\uc624\uae30\/\ub0b4\ubcf4\ub0b4\uae30", "pad.toolbar.timeslider.title": "\uc2dc\uac04\uc2ac\ub77c\uc774\ub354", - "pad.toolbar.savedRevision.title": "\uc800\uc7a5\ud55c \ud310", + "pad.toolbar.savedRevision.title": "\ud310 \uc800\uc7a5", "pad.toolbar.settings.title": "\uc124\uc815", "pad.toolbar.embed.title": "\uc774 \ud328\ub4dc \ud3ec\ud568\ud558\uae30", "pad.toolbar.showusers.title": "\uc774 \ud328\ub4dc\uc5d0 \uc0ac\uc6a9\uc790 \ubcf4\uae30", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "\ud654\uba74\uc5d0 \ud56d\uc0c1 \ub300\ud654 \ubcf4\uae30", "pad.settings.colorcheck": "\uc800\uc790 \uc0c9", "pad.settings.linenocheck": "\uc904 \ubc88\ud638", + "pad.settings.rtlcheck": "\uc6b0\ud6a1\uc11c(\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c)\uc785\ub2c8\uae4c?", "pad.settings.fontType": "\uae00\uaf34 \uc885\ub958:", "pad.settings.fontType.normal": "\ubcf4\ud1b5", "pad.settings.fontType.monospaced": "\uace0\uc815 \ud3ed", diff --git a/src/locales/mk.json b/src/locales/mk.json index 94d73bd8..1ba1fb70 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -20,7 +20,7 @@ "pad.toolbar.clearAuthorship.title": "\u041f\u043e\u043d\u0438\u0448\u0442\u0438 \u0433\u0438 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438", "pad.toolbar.import_export.title": "\u0423\u0432\u043e\u0437\/\u0418\u0437\u0432\u043e\u0437 \u043e\u0434\/\u0432\u043e \u0440\u0430\u0437\u043d\u0438 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u0447\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438", "pad.toolbar.timeslider.title": "\u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", - "pad.toolbar.savedRevision.title": "\u0417\u0430\u0447\u0443\u0432\u0430\u043d\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0438", + "pad.toolbar.savedRevision.title": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430", "pad.toolbar.settings.title": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438", "pad.toolbar.embed.title": "\u0412\u043c\u0435\u0442\u043d\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", "pad.toolbar.showusers.title": "\u041f\u0440\u0438\u043a\u0430\u0436. \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", @@ -35,6 +35,7 @@ "pad.settings.stickychat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u0441\u0435\u043a\u043e\u0433\u0430\u0448 \u043d\u0430 \u0435\u043a\u0440\u0430\u043d\u043e\u0442", "pad.settings.colorcheck": "\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438 \u0431\u043e\u0438", "pad.settings.linenocheck": "\u0411\u0440\u043e\u0435\u0432\u0438 \u043d\u0430 \u0440\u0435\u0434\u043e\u0432\u0438\u0442\u0435", + "pad.settings.rtlcheck": "\u0421\u043e\u0434\u0440\u0436\u0438\u043d\u0438\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0447\u0438\u0442\u0430\u0430\u0442 \u043e\u0434 \u0434\u0435\u0441\u043d\u043e \u043d\u0430 \u043b\u0435\u0432\u043e?", "pad.settings.fontType": "\u0422\u0438\u043f \u043d\u0430 \u0444\u043e\u043d\u0442:", "pad.settings.fontType.normal": "\u041d\u043e\u0440\u043c\u0430\u043b\u0435\u043d", "pad.settings.fontType.monospaced": "\u041d\u0435\u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d", diff --git a/src/locales/ms.json b/src/locales/ms.json index 04055d26..732a7759 100644 --- a/src/locales/ms.json +++ b/src/locales/ms.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Padamkan Warna Pengarang", "pad.toolbar.import_export.title": "Import\/Eksport dari\/ke format-format fail berbeza", "pad.toolbar.timeslider.title": "Gelangsar masa", - "pad.toolbar.savedRevision.title": "Semakan Tersimpan", + "pad.toolbar.savedRevision.title": "Simpan Semakan", "pad.toolbar.settings.title": "Tetapan", "pad.toolbar.embed.title": "Benamkan pad ini", "pad.toolbar.showusers.title": "Tunjukkan pengguna pada pad ini", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Sentiasa bersembang pada skrin", "pad.settings.colorcheck": "Warna pengarang", "pad.settings.linenocheck": "Nombor baris", + "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", "pad.settings.fontType": "Jenis fon:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/locales/nl.json b/src/locales/nl.json index 4142cc33..3f4a0cab 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Chat altijd zichtbaar", "pad.settings.colorcheck": "Kleuren auteurs", "pad.settings.linenocheck": "Regelnummers", + "pad.settings.rtlcheck": "Inhoud van rechts naar links lezen?", "pad.settings.fontType": "Lettertype:", "pad.settings.fontType.normal": "Normaal", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/locales/ru.json b/src/locales/ru.json index 4e4c4050..8cd82a5f 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -22,7 +22,7 @@ "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432", "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438", - "pad.toolbar.savedRevision.title": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438", + "pad.toolbar.savedRevision.title": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e", "pad.toolbar.settings.title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", "pad.toolbar.embed.title": "\u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435", @@ -37,6 +37,7 @@ "pad.settings.stickychat": "\u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0447\u0430\u0442", "pad.settings.colorcheck": "\u0426\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a", + "pad.settings.rtlcheck": "\u0427\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e?", "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0430:", "pad.settings.fontType.normal": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439", "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0439", diff --git a/src/locales/sl.json b/src/locales/sl.json index edfa68c0..98cd92b6 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Po\u010disti barvo avtorstva", "pad.toolbar.import_export.title": "Izvozi\/Uvozi razli\u010dne oblike zapisov", "pad.toolbar.timeslider.title": "Drsnik zgodovine", - "pad.toolbar.savedRevision.title": "Shranjene predelave", + "pad.toolbar.savedRevision.title": "Shrani predelavo", "pad.toolbar.settings.title": "Nastavitve", "pad.toolbar.embed.title": "Vstavi dokument", "pad.toolbar.showusers.title": "Poka\u017ei uporabnike dokumenta", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu.", "pad.settings.colorcheck": "Barve avtorstva", "pad.settings.linenocheck": "\u0160tevilke vrstic", + "pad.settings.rtlcheck": "Ali naj se vsebina prebira od desne proti levi?", "pad.settings.fontType": "Vrsta pisave:", "pad.settings.fontType.normal": "Obi\u010dajno", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/locales/sv.json b/src/locales/sv.json index 8c6c2d86..5e37d02a 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Rensa f\u00f6rfattarf\u00e4rger", "pad.toolbar.import_export.title": "Importera\/exportera fr\u00e5n\/till olika filformat", "pad.toolbar.timeslider.title": "Tidsreglage", - "pad.toolbar.savedRevision.title": "Sparade revisioner", + "pad.toolbar.savedRevision.title": "Spara revision", "pad.toolbar.settings.title": "Inst\u00e4llningar", "pad.toolbar.embed.title": "B\u00e4dda in detta block", "pad.toolbar.showusers.title": "Visa anv\u00e4ndarna p\u00e5 detta block", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Chatten alltid p\u00e5 sk\u00e4rmen", "pad.settings.colorcheck": "F\u00f6rfattarskapsf\u00e4rger", "pad.settings.linenocheck": "Radnummer", + "pad.settings.rtlcheck": "Vill du l\u00e4sa inneh\u00e5llet fr\u00e5n h\u00f6ger till v\u00e4nster?", "pad.settings.fontType": "Typsnitt:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Fast breddsteg", diff --git a/src/locales/te.json b/src/locales/te.json index 955b263a..898b40fd 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -26,7 +26,7 @@ "pad.colorpicker.save": "\u0c2d\u0c26\u0c4d\u0c30\u0c2a\u0c30\u0c1a\u0c41", "pad.colorpicker.cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41\u0c1a\u0c47\u0c2f\u0c3f", "pad.loading": "\u0c32\u0c4b\u0c21\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", - "pad.wrongPassword": "\u0c2e\u0c40 \u0c30\u0c39\u0c38\u0c4d\u0c2f\u0c2a\u0c26\u0c02 \u0c24\u0c2a\u0c41", + "pad.wrongPassword": "\u0c2e\u0c40 \u0c38\u0c02\u0c15\u0c47\u0c24\u0c2a\u0c26\u0c02 \u0c24\u0c2a\u0c4d\u0c2a\u0c41", "pad.settings.padSettings": "\u0c2a\u0c32\u0c15 \u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", "pad.settings.myView": "\u0c28\u0c3e \u0c09\u0c26\u0c4d\u0c26\u0c47\u0c36\u0c4d\u0c2f\u0c2e\u0c41", "pad.settings.stickychat": "\u0c24\u0c46\u0c30\u0c2a\u0c48\u0c28\u0c47 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c0e\u0c32\u0c4d\u0c32\u0c2a\u0c41\u0c21\u0c41 \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index efe4da61..7b5c725c 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -35,6 +35,7 @@ "pad.settings.stickychat": "\u6c38\u9060\u5728\u5c4f\u5e55\u4e0a\u986f\u793a\u804a\u5929", "pad.settings.colorcheck": "\u4f5c\u8005\u984f\u8272", "pad.settings.linenocheck": "\u884c\u865f", + "pad.settings.rtlcheck": "\u5f9e\u53f3\u81f3\u5de6\u8b80\u53d6\u5167\u5bb9\uff1f", "pad.settings.fontType": "\u5b57\u9ad4\u985e\u578b\uff1a", "pad.settings.fontType.normal": "\u6b63\u5e38", "pad.settings.fontType.monospaced": "\u7b49\u5bec", From 9f54a65c88176abb850e39dcbff07fda159538b6 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 17:40:18 +0000 Subject: [PATCH 136/463] refactored arrow keys now work after paste in chrome --- src/static/js/ace2_inner.js | 88 ++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 2dc6408b..905a7331 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3722,29 +3722,44 @@ function Ace2Inner(){ var isPageUp = evt.which === 33; scheduler.setTimeout(function(){ - var newVisibleLineRange = getVisibleLineRange(); - var linesCount = rep.lines.length(); + var newVisibleLineRange = getVisibleLineRange(); // the visible lines IE 1,10 + var linesCount = rep.lines.length(); // total count of lines in pad IE 10 + var numberOfLinesInViewport = newVisibleLineRange[1] - newVisibleLineRange[0]; // How many lines are in the viewport right now? + + top.console.log(rep); + top.console.log("old vis", oldVisibleLineRange); - var newCaretRow = rep.selStart[0]; if(isPageUp){ - newCaretRow = oldVisibleLineRange[0]; + if(rep.selStart[0] == oldVisibleLineRange[0]+1 || rep.selStart[0] == oldVisibleLineRange[0] || rep.selStart[0] == oldVisibleLineRange[0] -1){ // if we're at the top of the document + rep.selEnd[0] = oldVisibleLineRange[0] - numberOfLinesInViewport; + } + else if(rep.selEnd[0] < (oldVisibleLineRange[0]+1)){ // If it's mostly near the bottom of a document + rep.selEnd[0] = oldVisibleLineRange[0]; // dont go further in the page up than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content + rep.selStart[0] = oldVisibleLineRange[0]; // dont go further in the page up than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content + } } - if(isPageDown){ - newCaretRow = newVisibleLineRange[0] + topOffset; + if(isPageDown){ // if we hit page down + if(rep.selEnd[0] > oldVisibleLineRange[0]){ + // top.console.log("new bottom", oldVisibleLineRange[1]); + rep.selStart[0] = oldVisibleLineRange[1] -1; // dont go further in the page down than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content + rep.selEnd[0] = oldVisibleLineRange[1] -1; // dont go further in the page down than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content + } } //ensure min and max - if(newCaretRow < 0){ - newCaretRow = 0; + if(rep.selEnd[0] < 0){ + rep.selEnd[0] = 0; } - if(newCaretRow >= linesCount){ - newCaretRow = linesCount-1; + if(rep.selEnd[0] >= linesCount){ + rep.selEnd[0] = linesCount-1; } - - rep.selStart[0] = newCaretRow; - rep.selEnd[0] = newCaretRow; +top.console.log(rep) updateBrowserSelectionFromRep(); + var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214 + setScrollY(caretOffsetTop); // set the scrollY offset of the viewport on the document + }, 200); } @@ -3752,32 +3767,43 @@ function Ace2Inner(){ We have to do this the way we do because rep. doesn't hold the value for keyheld events IE if the user presses and holds the arrow key */ if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && $.browser.chrome){ - - var newVisibleLineRange = getVisibleLineRange(); // get the current visible range -- This works great. - var lineHeight = textLineHeight(); // what Is the height of each line? + var viewport = getViewPortTopBottom(); var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214 + var lineHeight = $(myselection.focusNode.parentNode).parent().height(); // get the line height of the caret line + var caretOffsetTopBottom = caretOffsetTop + lineHeight; + var visibleLineRange = getVisibleLineRange(); // the visible lines IE 1,10 if(caretOffsetTop){ // sometimes caretOffsetTop bugs out and returns 0, not sure why, possible Chrome bug? Either way if it does we don't wanna mess with it - var lineNum = Math.round(caretOffsetTop / lineHeight) ; // Get the current Line Number IE 84 - newVisibleLineRange[1] = newVisibleLineRange[1]-1; - var caretIsVisible = (lineNum > newVisibleLineRange[0] && lineNum < newVisibleLineRange[1]); // Is the cursor in the visible Range IE ie 84 > 14 and 84 < 90? - - if(!caretIsVisible){ // is the cursor no longer visible to the user? + var caretIsNotVisible = (caretOffsetTop <= viewport.top || caretOffsetTopBottom >= viewport.bottom); // Is the Caret Visible to the user? + if(caretIsNotVisible){ // is the cursor no longer visible to the user? // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. - // Get the new Y by getting the line number and multiplying by the height of each line. - if(evt.which == 37 || evt.which == 38){ // If left or up - var newY = lineHeight * (lineNum -1); // -1 to go to the line above - }else if(evt.which == 39 || evt.which == 40){ // if down or right - var newY = getScrollY() + (lineHeight*3); // the offset and one additional line + if(evt.which == 37 || evt.which == 38){ // If left or up arrow + var newY = caretOffsetTop; // That was easy! + } + if(evt.which == 39 || evt.which == 40){ // if down or right arrow + // only move the viewport if we're at the bottom of the viewport, if we hit down any other time the viewport shouldn't change + // NOTE: This behavior only fires if Chrome decides to break the page layout after a paste, it's annoying but nothing I can do + var selection = getSelection(); + // top.console.log("line #", rep.selStart[0]); // the line our caret is on + // top.console.log("firstvisible", visibleLineRange[0]); // the first visiblel ine + // top.console.log("lastVisible", visibleLineRange[1]); // the last visible line + + // Holding down arrow after a paste can lose the cursor -- This is the best fix I can find + if(rep.selStart[0] >= visibleLineRange[1] || rep.selStart[0] < visibleLineRange[0] ){ // if we're not at the bottom of the viewport + // top.console.log(viewport, lineHeight, myselection); + var newY = caretOffsetTop; + }else{ // we're at the bottom of the viewport so snap to a "new viewport" + // top.console.log(viewport, lineHeight, myselection); + var newY = caretOffsetTopBottom; // Allow continuous holding of down arrow to redraw the screen so we can see what we are going to highlight + } + } + if(newY){ + setScrollY(newY); // set the scrollY offset of the viewport on the document } - setScrollY(newY); // set the scroll height of the browser } - } - } - } if (type == "keydown") @@ -5109,7 +5135,7 @@ function Ace2Inner(){ setLineListType(mod[0], mod[1]); }); } - + function doInsertUnorderedList(){ doInsertList('bullet'); } From 27e9f918640aebb3771ee9f212a6e0f66a456061 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 18:03:37 +0000 Subject: [PATCH 137/463] page up, down etc all working, still no shift page up/down for highlight but that never worked anyways --- src/static/js/ace2_inner.js | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 905a7331..f8ed758d 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3712,6 +3712,9 @@ function Ace2Inner(){ specialHandled = true; } if((evt.which == 33 || evt.which == 34) && type == 'keydown'){ + + evt.preventDefault(); // This is required, browsers will try to do normal default behavior on page up / down and the default behavior SUCKS + var oldVisibleLineRange = getVisibleLineRange(); var topOffset = rep.selStart[0] - oldVisibleLineRange[0]; if(topOffset < 0 ){ @@ -3726,22 +3729,13 @@ function Ace2Inner(){ var linesCount = rep.lines.length(); // total count of lines in pad IE 10 var numberOfLinesInViewport = newVisibleLineRange[1] - newVisibleLineRange[0]; // How many lines are in the viewport right now? - top.console.log(rep); - top.console.log("old vis", oldVisibleLineRange); - if(isPageUp){ - if(rep.selStart[0] == oldVisibleLineRange[0]+1 || rep.selStart[0] == oldVisibleLineRange[0] || rep.selStart[0] == oldVisibleLineRange[0] -1){ // if we're at the top of the document - rep.selEnd[0] = oldVisibleLineRange[0] - numberOfLinesInViewport; - } - else if(rep.selEnd[0] < (oldVisibleLineRange[0]+1)){ // If it's mostly near the bottom of a document - rep.selEnd[0] = oldVisibleLineRange[0]; // dont go further in the page up than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content - rep.selStart[0] = oldVisibleLineRange[0]; // dont go further in the page up than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content - } + rep.selEnd[0] = rep.selEnd[0] - numberOfLinesInViewport; // move to the bottom line +1 in the viewport (essentially skipping over a page) + rep.selStart[0] = rep.selStart[0] - numberOfLinesInViewport; // move to the bottom line +1 in the viewport (essentially skipping over a page) } if(isPageDown){ // if we hit page down - if(rep.selEnd[0] > oldVisibleLineRange[0]){ - // top.console.log("new bottom", oldVisibleLineRange[1]); + if(rep.selEnd[0] >= oldVisibleLineRange[0]){ // If the new viewpoint position is actually further than where we are right now rep.selStart[0] = oldVisibleLineRange[1] -1; // dont go further in the page down than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content rep.selEnd[0] = oldVisibleLineRange[1] -1; // dont go further in the page down than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content } @@ -3754,10 +3748,10 @@ function Ace2Inner(){ if(rep.selEnd[0] >= linesCount){ rep.selEnd[0] = linesCount-1; } -top.console.log(rep) updateBrowserSelectionFromRep(); var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current - var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214 + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop | myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214 + // top.console.log(caretOffsetTop); setScrollY(caretOffsetTop); // set the scrollY offset of the viewport on the document }, 200); @@ -3792,6 +3786,7 @@ top.console.log(rep) // Holding down arrow after a paste can lose the cursor -- This is the best fix I can find if(rep.selStart[0] >= visibleLineRange[1] || rep.selStart[0] < visibleLineRange[0] ){ // if we're not at the bottom of the viewport // top.console.log(viewport, lineHeight, myselection); + // TODO: Make it so chrome doesnt need to redraw the page by only applying this technique if required var newY = caretOffsetTop; }else{ // we're at the bottom of the viewport so snap to a "new viewport" // top.console.log(viewport, lineHeight, myselection); From 3562672a757d4b0db85cda4113b5687183e67513 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 18:44:01 +0000 Subject: [PATCH 138/463] stop start point going negative --- src/static/js/ace2_inner.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index f8ed758d..f091dc0c 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3745,6 +3745,9 @@ function Ace2Inner(){ if(rep.selEnd[0] < 0){ rep.selEnd[0] = 0; } + if(rep.selStart[0] < 0){ + rep.selStart[0] = 0; + } if(rep.selEnd[0] >= linesCount){ rep.selEnd[0] = linesCount-1; } From fb9d46fc51a4f8f2e2d9a4b3e01fc1821a1aac03 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 20:08:58 +0000 Subject: [PATCH 139/463] document the required tests --- tests/frontend/specs/caret.js | 75 ++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js index 56964885..9622df8a 100644 --- a/tests/frontend/specs/caret.js +++ b/tests/frontend/specs/caret.js @@ -8,15 +8,18 @@ describe("As the caret is moved is the UI properly updated?", function(){ /* Tests to do * Keystroke up (38), down (40), left (37), right (39) with and without special keys IE control / shift * Page up (33) / down (34) with and without special keys + * Page up on the first line shouldn't move the viewport + * Down down on the last line shouldn't move the viewport + * Down arrow on any other line except the last lines shouldn't move the viewport + * Do all of the above tests after a copy/paste event */ /* Challenges * How do we keep the authors focus on a line if the lines above the author are modified? We should only redraw the user to a location if they are typing and make sure shift and arrow keys aren't redrawing the UI else highlight - copy/paste would get broken - * How the fsk do I get - * + * How can we simulate an edit event in the test framework? */ - it("Creates N rows, changes height of rows, updates UI by caret key events", function(done) { + it("Creates N rows, changes height of rows, updates UI by caret key events", function(done){ var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; var numberOfRows = 50; @@ -24,9 +27,9 @@ describe("As the caret is moved is the UI properly updated?", function(){ //ace creates a new dom element when you press a keystroke, so just get the first text element again var $newFirstTextElement = inner$("div").first(); var originalDivHeight = inner$("div").first().css("height"); - prepareDocument(numberOfRows, $newFirstTextElement); // N lines into the first div as a target + /* helper.waitFor(function(){ // Wait for the DOM to register the new items return inner$("div").first().text().length == 6; }).done(function(){ // Once the DOM has registered the items @@ -40,7 +43,9 @@ describe("As the caret is moved is the UI properly updated?", function(){ var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height expect(heightHasChanged).to.be(true); // expect the first line to be blank }); + */ + /* // Is this Element now visible to the pad user? helper.waitFor(function(){ // Wait for the DOM to register the new items return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place @@ -54,25 +59,64 @@ describe("As the caret is moved is the UI properly updated?", function(){ var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height expect(heightHasChanged).to.be(true); // expect the first line to be blank }); + */ +/* + var i = 0; + while(i < numberOfRows){ // press down arrow +console.log("dwn"); + keyEvent(inner$, 40, false, false); + i++; + } +*/ +/* // Does scrolling back up the pad with the up arrow show the correct contents? helper.waitFor(function(){ // Wait for the new position to be in place - return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place + try{ + return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place + }catch(e){ + return false; + } }).done(function(){ // Once the DOM has registered the items + var i = 0; - while(i < numberOfRows){ // press up arrow N times - keyEvent(inner$, 38, false, false); + while(i < numberOfRows){ // press down arrow + keyEvent(inner$, 33, false, false); // doesn't work + i++; + } + + // Does scrolling back up the pad with the up arrow show the correct contents? + helper.waitFor(function(){ // Wait for the new position to be in place + try{ + return isScrolledIntoView(inner$("div:nth-child(0)"), inner$); // Wait for the DOM to scroll into place + }catch(e){ + return false; + } + }).done(function(){ // Once the DOM has registered the items + + + + }); + }); + +*/ + + var i = 0; + while(i < numberOfRows){ // press down arrow + keyEvent(inner$, 33, false, false); // doesn't work i++; } - helper.waitFor(function(){ // Wait for the new position to be in place - return isScrolledIntoView(inner$("div:nth-child(0)"), inner$); // Wait for the DOM to scroll into place - }).done(function(){ // Once we're at the top of the document - expect(true).to.be(true); - done(); - }); + + // Does scrolling back up the pad with the up arrow show the correct contents? + helper.waitFor(function(){ // Wait for the new position to be in place + return isScrolledIntoView(inner$("div:nth-child(1)"), inner$); // Wait for the DOM to scroll into place + }).done(function(){ // Once the DOM has registered the items + expect(true).to.be(true); + done(); }); + }); }); @@ -115,8 +159,9 @@ function makeStr(){ // from http://stackoverflow.com/questions/1349404/generate- function isScrolledIntoView(elem, $){ // from http://stackoverflow.com/questions/487073/check-if-element-is-visible-after-scrolling var docViewTop = $(window).scrollTop(); var docViewBottom = docViewTop + $(window).height(); - var elemTop = $(elem).offset().top; - var elemBottom = elemTop + $(elem).height(); + var elemTop = $(elem).offset().top; // how far the element is from the top of it's container + var elemBottom = elemTop + $(elem).height(); // how far plus the height of the elem.. IE is it all in? + elemBottom = elemBottom - 16; // don't ask, sorry but this is needed.. return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); } From 2bc45de1062cd4afcb8cc53e6a89b480a05f77b6 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 18 Mar 2013 22:09:47 +0100 Subject: [PATCH 140/463] Fix #1639 by removing bodyParser middleware introduced with swagger REST API --- src/node/hooks/express/swagger.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node/hooks/express/swagger.js b/src/node/hooks/express/swagger.js index f4fc5cff..3a437a51 100644 --- a/src/node/hooks/express/swagger.js +++ b/src/node/hooks/express/swagger.js @@ -354,7 +354,6 @@ exports.expressCreateServer = function (hook_name, args, cb) { // Let's put this under /rest for now var subpath = express(); - args.app.use(express.bodyParser()); args.app.use(basePath, subpath); swagger.setAppHandler(subpath); From b3dbf1c995d16bb3c2ebbe630b00e5ef4b60dc1f Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 18 Mar 2013 22:29:42 +0100 Subject: [PATCH 141/463] Update html10n.js --- src/static/js/html10n.js | 230 +++++++++++++++++++-------------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index e1c025c4..aa53a266 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -23,27 +23,27 @@ window.html10n = (function(window, document, undefined) { // fix console - var console = window.console; + var console = window.console function interceptConsole(method){ - if (!console) return function() {}; + if (!console) return function() {} - var original = console[method]; + var original = console[method] // do sneaky stuff if (original.bind){ // Do this for normal browsers - return original.bind(console); + return original.bind(console) }else{ return function() { // Do this for IE - var message = Array.prototype.slice.apply(arguments).join(' '); - original(message); + var message = Array.prototype.slice.apply(arguments).join(' ') + original(message) } } } var consoleLog = interceptConsole('log') , consoleWarn = interceptConsole('warn') - , consoleError = interceptConsole('warn'); + , consoleError = interceptConsole('warn') // fix Array.prototype.instanceOf in, guess what, IE! <3 @@ -84,14 +84,14 @@ window.html10n = (function(window, document, undefined) { * MicroEvent - to make any js object an event emitter (server or browser) */ - var MicroEvent = function(){} + var MicroEvent = function(){} MicroEvent.prototype = { - bind : function(event, fct){ + bind : function(event, fct){ this._events = this._events || {}; this._events[event] = this._events[event] || []; this._events[event].push(fct); }, - unbind : function(event, fct){ + unbind : function(event, fct){ this._events = this._events || {}; if( event in this._events === false ) return; this._events[event].splice(this._events[event].indexOf(fct), 1); @@ -100,7 +100,7 @@ window.html10n = (function(window, document, undefined) { this._events = this._events || {}; if( event in this._events === false ) return; for(var i = 0; i < this._events[event].length; i++){ - this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); + this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)) } } }; @@ -122,50 +122,50 @@ window.html10n = (function(window, document, undefined) { * and caching all necessary resources */ function Loader(resources) { - this.resources = resources; - this.cache = {}; // file => contents - this.langs = {}; // lang => strings + this.resources = resources + this.cache = {} // file => contents + this.langs = {} // lang => strings } Loader.prototype.load = function(lang, cb) { - if(this.langs[lang]) return cb(); + if(this.langs[lang]) return cb() if (this.resources.length > 0) { var reqs = 0; for (var i=0, n=this.resources.length; i < n; i++) { this.fetch(this.resources[i], lang, function(e) { reqs++; - if(e) return setTimeout(function(){ throw e }, 0); + if(e) console.warn(e) if (reqs < n) return;// Call back once all reqs are completed - cb && cb(); + cb && cb() }) } } } Loader.prototype.fetch = function(href, lang, cb) { - var that = this; + var that = this if (this.cache[href]) { this.parse(lang, href, this.cache[href], cb) return; } - var xhr = new XMLHttpRequest(); - xhr.open('GET', href, /*async: */true); + var xhr = new XMLHttpRequest() + xhr.open('GET', href, /*async: */true) if (xhr.overrideMimeType) { xhr.overrideMimeType('application/json; charset=utf-8'); } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status === 0) { - var data = JSON.parse(xhr.responseText); - that.cache[href] = data; + var data = JSON.parse(xhr.responseText) + that.cache[href] = data // Pass on the contents for parsing - that.parse(lang, href, data, cb); + that.parse(lang, href, data, cb) } else { - cb(new Error('Failed to load '+href)); + cb(new Error('Failed to load '+href)) } } }; @@ -174,39 +174,39 @@ window.html10n = (function(window, document, undefined) { Loader.prototype.parse = function(lang, currHref, data, cb) { if ('object' != typeof data) { - cb(new Error('A file couldn\'t be parsed as json.')); - return; + cb(new Error('A file couldn\'t be parsed as json.')) + return } - if (!data[lang]) lang = lang.substr(0, lang.indexOf('-') == -1? lang.length : lang.indexOf('-')); + if (!data[lang]) lang = lang.substr(0, lang.indexOf('-') == -1? lang.length : lang.indexOf('-')) if (!data[lang]) { - cb(new Error('Couldn\'t find translations for '+lang)); - return; + cb(new Error('Couldn\'t find translations for '+lang)) + return } if ('string' == typeof data[lang]) { // Import rule // absolute path - var importUrl = data[lang]; + var importUrl = data[lang] // relative path if(data[lang].indexOf("http") != 0 && data[lang].indexOf("/") != 0) { - importUrl = currHref+"/../"+data[lang]; + importUrl = currHref+"/../"+data[lang] } - this.fetch(importUrl, lang, cb); - return; + this.fetch(importUrl, lang, cb) + return } if ('object' != typeof data[lang]) { - cb(new Error('Translations should be specified as JSON objects!')); - return; + cb(new Error('Translations should be specified as JSON objects!')) + return } - this.langs[lang] = data[lang]; + this.langs[lang] = data[lang] // TODO: Also store accompanying langs - cb(); + cb() } @@ -216,11 +216,11 @@ window.html10n = (function(window, document, undefined) { var html10n = { language : null } - MicroEvent.mixin(html10n); + MicroEvent.mixin(html10n) - html10n.macros = {}; + html10n.macros = {} - html10n.rtl = ["ar","dv","fa","ha","he","ks","ku","ps","ur","yi"]; + html10n.rtl = ["ar","dv","fa","ha","he","ks","ku","ps","ur","yi"] /** * Get rules for plural forms (shared with JetPack), see: @@ -664,14 +664,14 @@ window.html10n = (function(window, document, undefined) { * @param langs An array of lang codes defining fallbacks */ html10n.localize = function(langs) { - var that = this; + var that = this // if only one string => create an array - if ('string' == typeof langs) langs = [langs]; + if ('string' == typeof langs) langs = [langs] this.build(langs, function(er, translations) { - html10n.translations = translations; - html10n.translateElement(translations); - that.trigger('localized'); + html10n.translations = translations + html10n.translateElement(translations) + that.trigger('localized') }) } @@ -682,78 +682,78 @@ window.html10n = (function(window, document, undefined) { * @param element A DOM element, if omitted, the document element will be used */ html10n.translateElement = function(translations, element) { - element = element || document.documentElement; + element = element || document.documentElement var children = element? getTranslatableChildren(element) : document.childNodes; for (var i=0, n=children.length; i < n; i++) { - this.translateNode(translations, children[i]); + this.translateNode(translations, children[i]) } // translate element itself if necessary - this.translateNode(translations, element); + this.translateNode(translations, element) } function asyncForEach(list, iterator, cb) { var i = 0 - , n = list.length; + , n = list.length iterator(list[i], i, function each(err) { - if(err) consoleLog(err); - i++; + if(err) consoleLog(err) + i++ if (i < n) return iterator(list[i],i, each); - cb(); + cb() }) } function getTranslatableChildren(element) { if(!document.querySelectorAll) { - if (!element) return []; + if (!element) return [] var nodes = element.getElementsByTagName('*') - , l10nElements = []; + , l10nElements = [] for (var i=0, n=nodes.length; i < n; i++) { if (nodes[i].getAttribute('data-l10n-id')) l10nElements.push(nodes[i]); } - return l10nElements; + return l10nElements } - return element.querySelectorAll('*[data-l10n-id]'); + return element.querySelectorAll('*[data-l10n-id]') } html10n.get = function(id, args) { - var translations = html10n.translations; - if(!translations) return consoleWarn('No translations available (yet)'); - if(!translations[id]) return consoleWarn('Could not find string '+id); + var translations = html10n.translations + if(!translations) return consoleWarn('No translations available (yet)') + if(!translations[id]) return consoleWarn('Could not find string '+id) // apply args - var str = substArguments(translations[id], args); + var str = substArguments(translations[id], args) // apply macros - return substMacros(id, str, args); + return substMacros(id, str, args) // replace {{arguments}} with their values or the // associated translation string (based on its key) function substArguments(str, args) { var reArgs = /\{\{\s*([a-zA-Z\.]+)\s*\}\}/ - , match; + , match while (match = reArgs.exec(str)) { if (!match || match.length < 2) - return str; // argument key not found + return str // argument key not found var arg = match[1] - , sub = ''; + , sub = '' if (arg in args) { - sub = args[arg]; + sub = args[arg] } else if (arg in translations) { - sub = translations[arg]; + sub = translations[arg] } else { - consoleWarn('Could not find argument {{' + arg + '}}'); - return str; + consoleWarn('Could not find argument {{' + arg + '}}') + return str } - str = str.substring(0, match.index) + sub + str.substr(match.index + match[0].length); + str = str.substring(0, match.index) + sub + str.substr(match.index + match[0].length) } - return str; + return str } // replace {[macros]} with their values @@ -766,21 +766,21 @@ window.html10n = (function(window, document, undefined) { // a macro has been found // Note: at the moment, only one parameter is supported var macroName = reMatch[1] - , paramName = reMatch[2]; + , paramName = reMatch[2] - if (!(macroName in gMacros)) return str; + if (!(macroName in gMacros)) return str - var param; + var param if (args && paramName in args) { - param = args[paramName]; + param = args[paramName] } else if (paramName in translations) { - param = translations[paramName]; + param = translations[paramName] } // there's no macro parser yet: it has to be defined in gMacros - var macro = html10n.macros[macroName]; - str = macro(translations, key, str, param); - return str; + var macro = html10n.macros[macroName] + str = macro(translations, key, str, param) + return str } } @@ -788,26 +788,26 @@ window.html10n = (function(window, document, undefined) { * Applies translations to a DOM node (recursive) */ html10n.translateNode = function(translations, node) { - var str = {}; + var str = {} // get id - str.id = node.getAttribute('data-l10n-id'); - if (!str.id) return; + str.id = node.getAttribute('data-l10n-id') + if (!str.id) return - if(!translations[str.id]) return consoleWarn('Couldn\'t find translation key '+str.id); + if(!translations[str.id]) return consoleWarn('Couldn\'t find translation key '+str.id) // get args if(window.JSON) { - str.args = JSON.parse(node.getAttribute('data-l10n-args')); + str.args = JSON.parse(node.getAttribute('data-l10n-args')) }else{ try{ - str.args = eval(node.getAttribute('data-l10n-args')); + str.args = eval(node.getAttribute('data-l10n-args')) }catch(e) { - consoleWarn('Couldn\'t parse args for '+str.id); + consoleWarn('Couldn\'t parse args for '+str.id) } } - str.str = html10n.get(str.id, str.args); + str.str = html10n.get(str.id, str.args) // get attribute name to apply str to var prop @@ -817,31 +817,31 @@ window.html10n = (function(window, document, undefined) { , "innerHTML": 1 , "alt": 1 , "textContent": 1 - }; + } if (index > 0 && str.id.substr(index + 1) in attrList) { // an attribute has been specified - prop = str.id.substr(index + 1); + prop = str.id.substr(index + 1) } else { // no attribute: assuming text content by default - prop = document.body.textContent ? 'textContent' : 'innerText'; + prop = document.body.textContent ? 'textContent' : 'innerText' } // Apply translation if (node.children.length === 0 || prop != 'textContent') { - node[prop] = str.str; + node[prop] = str.str } else { var children = node.childNodes, - found = false; + found = false for (var i=0, n=children.length; i < n; i++) { if (children[i].nodeType === 3 && /\S/.test(children[i].textContent)) { if (!found) { - children[i].nodeValue = str.str; - found = true; + children[i].nodeValue = str.str + found = true } else { - children[i].nodeValue = ''; + children[i].nodeValue = '' } } } if (!found) { - consoleWarn('Unexpected error: could not translate element content for key '+str.id, node); + consoleWarn('Unexpected error: could not translate element content for key '+str.id, node) } } } @@ -852,32 +852,32 @@ window.html10n = (function(window, document, undefined) { */ html10n.build = function(langs, cb) { var that = this - , build = {}; + , build = {} asyncForEach(langs, function (lang, i, next) { if(!lang) return next(); - that.loader.load(lang, next); + that.loader.load(lang, next) }, function() { - var lang; - langs.reverse(); + var lang + langs.reverse() // loop through priority array... for (var i=0, n=langs.length; i < n; i++) { - lang = langs[i]; + lang = langs[i] if(!lang || !(lang in that.loader.langs)) continue; // ... and apply all strings of the current lang in the list // to our build object for (var string in that.loader.langs[lang]) { - build[string] = that.loader.langs[lang][string]; + build[string] = that.loader.langs[lang][string] } // the last applied lang will be exposed as the // lang the page was translated to - that.language = lang; + that.language = lang } - cb(null, build); + cb(null, build) }) } @@ -893,8 +893,8 @@ window.html10n = (function(window, document, undefined) { * Returns the direction of the language returned be html10n#getLanguage */ html10n.getDirection = function() { - var langCode = this.language.indexOf('-') == -1? this.language : this.language.substr(0, this.language.indexOf('-')); - return html10n.rtl.indexOf(langCode) == -1? 'ltr' : 'rtl'; + var langCode = this.language.indexOf('-') == -1? this.language : this.language.substr(0, this.language.indexOf('-')) + return html10n.rtl.indexOf(langCode) == -1? 'ltr' : 'rtl' } /** @@ -903,28 +903,28 @@ window.html10n = (function(window, document, undefined) { html10n.index = function () { // Find all s var links = document.getElementsByTagName('link') - , resources = []; + , resources = [] for (var i=0, n=links.length; i < n; i++) { if (links[i].type != 'application/l10n+json') continue; - resources.push(links[i].href); + resources.push(links[i].href) } - this.loader = new Loader(resources); - this.trigger('indexed'); + this.loader = new Loader(resources) + this.trigger('indexed') } if (document.addEventListener) // modern browsers and IE9+ document.addEventListener('DOMContentLoaded', function() { - html10n.index(); - }, false); + html10n.index() + }, false) else if (window.attachEvent) window.attachEvent('onload', function() { - html10n.index(); - }, false); + html10n.index() + }, false) // gettext-like shortcut if (window._ === undefined) window._ = html10n.get; - return html10n; -})(window, document); + return html10n +})(window, document) \ No newline at end of file From e49620ea077117179d3e5faccf9974080cdbb5b3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 21:36:50 +0000 Subject: [PATCH 142/463] update ueber for pg --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index a7147cf2..f2150b5d 100644 --- a/src/package.json +++ b/src/package.json @@ -16,7 +16,7 @@ "require-kernel" : "1.0.5", "resolve" : "0.2.x", "socket.io" : "0.9.x", - "ueberDB" : "0.1.94", + "ueberDB" : "0.1.95", "async" : "0.1.x", "express" : "3.x", "connect" : "2.4.x", From ee6a7d0b0c93232ef94de134387a2238062c7b00 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 22:09:51 +0000 Subject: [PATCH 143/463] most test pass but important ones failed --- tests/frontend/specs/caret.js | 100 +++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 13 deletions(-) diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js index 9622df8a..7432fda1 100644 --- a/tests/frontend/specs/caret.js +++ b/tests/frontend/specs/caret.js @@ -1,7 +1,9 @@ describe("As the caret is moved is the UI properly updated?", function(){ - //create a new pad before each test run - beforeEach(function(cb){ - helper.newPad(cb); + var padName; + var numberOfRows = 50; + + it("creates a pad", function(done) { + padName = helper.newPad(done); this.timeout(60000); }); @@ -19,6 +21,87 @@ describe("As the caret is moved is the UI properly updated?", function(){ * How can we simulate an edit event in the test framework? */ + // THIS DOESNT WORK AS IT DOESNT MOVE THE CURSOR! + it("down arrow", function(done){ + var inner$ = helper.padInner$; + keyEvent(inner$, 40, false, false); // arrow up + done(); + }); + + it("Creates N lines", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + var $newFirstTextElement = inner$("div").first(); + + prepareDocument(numberOfRows, $newFirstTextElement); // N lines into the first div as a target + helper.waitFor(function(){ // Wait for the DOM to register the new items + return inner$("div").first().text().length == 6; + }).done(function(){ // Once the DOM has registered the items + done(); + }); + }); + + it("Moves caret up a line", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 38, false, false); // arrow up + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + it("Moves caret down a line", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 40, false, false); // arrow down + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos > originalPos); + }).done(function(){ + expect(newCaretPos).to.be.moreThan(originalPos); + done(); + }); + }); + + it("Moves caret to top of doc", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + + var i = 0; + while(i < numberOfRows){ // press pageup key N times + keyEvent(inner$, 33, false, false); + i++; + } + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + +/* it("Creates N rows, changes height of rows, updates UI by caret key events", function(done){ var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -29,7 +112,6 @@ describe("As the caret is moved is the UI properly updated?", function(){ var originalDivHeight = inner$("div").first().css("height"); prepareDocument(numberOfRows, $newFirstTextElement); // N lines into the first div as a target - /* helper.waitFor(function(){ // Wait for the DOM to register the new items return inner$("div").first().text().length == 6; }).done(function(){ // Once the DOM has registered the items @@ -43,9 +125,7 @@ describe("As the caret is moved is the UI properly updated?", function(){ var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height expect(heightHasChanged).to.be(true); // expect the first line to be blank }); - */ - /* // Is this Element now visible to the pad user? helper.waitFor(function(){ // Wait for the DOM to register the new items return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place @@ -59,16 +139,12 @@ describe("As the caret is moved is the UI properly updated?", function(){ var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height expect(heightHasChanged).to.be(true); // expect the first line to be blank }); - */ -/* var i = 0; while(i < numberOfRows){ // press down arrow console.log("dwn"); keyEvent(inner$, 40, false, false); i++; } -*/ -/* // Does scrolling back up the pad with the up arrow show the correct contents? helper.waitFor(function(){ // Wait for the new position to be in place @@ -99,7 +175,6 @@ console.log("dwn"); }); }); -*/ var i = 0; while(i < numberOfRows){ // press down arrow @@ -115,9 +190,8 @@ console.log("dwn"); expect(true).to.be(true); done(); }); +*/ - - }); }); function prepareDocument(n, target){ // generates a random document with random content on n lines From 13ee96dce0adc1a479d1237e7b5aeee406937200 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 18 Mar 2013 22:14:41 +0000 Subject: [PATCH 144/463] more tests but still fundamental flaw with arrow keys --- tests/frontend/specs/caret.js | 79 +++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js index 7432fda1..9d9da460 100644 --- a/tests/frontend/specs/caret.js +++ b/tests/frontend/specs/caret.js @@ -100,6 +100,85 @@ describe("As the caret is moved is the UI properly updated?", function(){ }); }); + it("Moves caret right a position", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.x; + var newCaretPos; + keyEvent(inner$, 39, false, false); // arrow right + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.x; + return (newCaretPos > originalPos); + }).done(function(){ + expect(newCaretPos).to.be.moreThan(originalPos); + done(); + }); + }); + + it("Moves caret left a position", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.x; + var newCaretPos; + keyEvent(inner$, 33, false, false); // arrow left + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.x; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + it("Moves caret to the next line using right arrow", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos > originalPos); + }).done(function(){ + expect(newCaretPos).to.be.moreThan(originalPos); + done(); + }); + }); + + it("Moves caret to the previous line using left arrow", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 33, false, false); // arrow left + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + /* it("Creates N rows, changes height of rows, updates UI by caret key events", function(done){ From 7741f762e2b743116ef9d90224c3db348402a34a Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Mar 2013 02:21:53 +0000 Subject: [PATCH 145/463] hook for chat msg --- src/static/js/chat.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/static/js/chat.js b/src/static/js/chat.js index 83a487de..bba3d87e 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -17,6 +17,7 @@ var padutils = require('./pad_utils').padutils; var padcookie = require('./pad_cookie').padcookie; var Tinycon = require('tinycon/tinycon'); +var hooks = require('./pluginfw/hooks'); var chat = (function() { @@ -162,7 +163,18 @@ var chat = (function() time: '4000' }); Tinycon.setBubble(count); - + var msg = { + "authorName" : authorName, + "text" : text, + "sticky" : false, + "time" : timeStr + }; + hooks.aCallAll("chatNewMessage", { + "authorName" : authorName, + "text" : text, + "sticky" : false, + "time" : timeStr + }); } } } From 8406cc95ab0c050138e0cc0411fdc8d9618e7a0a Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Mar 2013 03:43:38 +0000 Subject: [PATCH 146/463] docs for hook --- doc/api/hooks_client-side.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index 7f376def..a84ccdeb 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -143,6 +143,15 @@ Things in context: This hook is called on the client side whenever a user joins or changes. This can be used to create notifications or an alternate user list. +## chatNewMessage +Called from: src/static/js/chat.js + +Things in context: + +1. msg - The message object + +This hook is called on the client side whenever a user recieves a chat message from the server. This can be used to create different notifications for chat messages. + ## collectContentPre Called from: src/static/js/contentcollector.js From 11341eb0954d319e127b80ead980d035ecbc637a Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Mar 2013 12:52:14 +0000 Subject: [PATCH 147/463] add a test to show weird behavior --- tests/frontend/specs/caret.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js index 9d9da460..b33f5168 100644 --- a/tests/frontend/specs/caret.js +++ b/tests/frontend/specs/caret.js @@ -24,10 +24,14 @@ describe("As the caret is moved is the UI properly updated?", function(){ // THIS DOESNT WORK AS IT DOESNT MOVE THE CURSOR! it("down arrow", function(done){ var inner$ = helper.padInner$; - keyEvent(inner$, 40, false, false); // arrow up + var $newFirstTextElement = inner$("div").first(); + $newFirstTextElement.focus(); + keyEvent(inner$, 37, false, false); // arrow down + keyEvent(inner$, 37, false, false); // arrow down + done(); }); - +/* it("Creates N lines", function(done){ var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -289,6 +293,7 @@ function keyEvent(target, charCode, ctrl, shift){ // sends a charCode to the win var evtType = "keydown"; } var e = target.Event(evtType); + console.log(e); if(ctrl){ e.ctrlKey = true; // Control key } @@ -296,6 +301,7 @@ function keyEvent(target, charCode, ctrl, shift){ // sends a charCode to the win e.shiftKey = true; // Shift Key } e.which = charCode; + e.keyCode = charCode; target("#innerdocbody").trigger(e); } From 2916b39c24f469c50e090b1cb1462e9a9d384e5b Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Mar 2013 16:21:04 +0000 Subject: [PATCH 148/463] make sure the sessionID target is right --- src/node/handler/PadMessageHandler.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index bcc9023d..4b7abb6b 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -156,7 +156,6 @@ exports.handleMessage = function(client, message) // handleMessage will be called, even if the client is not authorized hooks.aCallAll("handleMessage", { client: client, message: message }, function ( err, messages ) { if(ERR(err, callback)) return; - _.each(messages, function(newMessage){ if ( newMessage === null ) { dropMessage = true; @@ -193,6 +192,7 @@ exports.handleMessage = function(client, message) handleSuggestUserName(client, message); } else { messageLogger.warn("Dropped message, unknown COLLABROOM Data Type " + message.data.type); +console.warn(message); } } else { messageLogger.warn("Dropped message, unknown Message Type " + message.type); @@ -261,9 +261,12 @@ function handleSaveRevisionMessage(client, message){ * @param sessionID {string} the socketIO session to which we're sending this message */ exports.handleCustomObjectMessage = function (msg, sessionID, cb) { - if(msg.type === "CUSTOM"){ + if(msg.data.type === "CUSTOM"){ if(sessionID){ // If a sessionID is targeted then send directly to this sessionID - io.sockets.socket(sessionID).emit(msg); // send a targeted message + console.warn("Sent msg", msg); + console.warn("to sessionID", sessionID); + // socketio.clients[sessionID].send(msg); + socketio.sockets.socket(sessionID).emit(msg); // send a targeted message }else{ socketio.sockets.in(msg.data.padId).json.send(msg); // broadcast to all clients on this pad } @@ -1496,3 +1499,5 @@ exports.padUsers = function (padID, callback) { callback(null, {padUsers: result}); }); } + +exports.sessioninfos = sessioninfos; From 9bb05874475a1dfab177dc42a003e91b5724ea00 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Mar 2013 16:40:51 +0000 Subject: [PATCH 149/463] working and jsonify obj --- src/node/handler/PadMessageHandler.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 4b7abb6b..9fa9c39c 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -255,7 +255,8 @@ function handleSaveRevisionMessage(client, message){ } /** - * Handles a custom message, different to the function below as it handles objects not strings and you can direct the message to specific sessionID + * Handles a custom message, different to the function below as it handles objects not strings and you can + * direct the message to specific sessionID * * @param msg {Object} the message we're sending * @param sessionID {string} the socketIO session to which we're sending this message @@ -263,10 +264,7 @@ function handleSaveRevisionMessage(client, message){ exports.handleCustomObjectMessage = function (msg, sessionID, cb) { if(msg.data.type === "CUSTOM"){ if(sessionID){ // If a sessionID is targeted then send directly to this sessionID - console.warn("Sent msg", msg); - console.warn("to sessionID", sessionID); - // socketio.clients[sessionID].send(msg); - socketio.sockets.socket(sessionID).emit(msg); // send a targeted message + socketio.sockets.socket(sessionID).json.send(msg); // send a targeted message }else{ socketio.sockets.in(msg.data.padId).json.send(msg); // broadcast to all clients on this pad } From a9bd081a44ea4a338a025420457f55248e012b0f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 19 Mar 2013 16:55:42 +0000 Subject: [PATCH 150/463] more clean up --- src/node/handler/PadMessageHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 9fa9c39c..954c116d 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -192,7 +192,6 @@ exports.handleMessage = function(client, message) handleSuggestUserName(client, message); } else { messageLogger.warn("Dropped message, unknown COLLABROOM Data Type " + message.data.type); -console.warn(message); } } else { messageLogger.warn("Dropped message, unknown Message Type " + message.type); From a628317b555743a1de5772e0af9e5ff1b09ada67 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 19 Mar 2013 18:34:21 +0100 Subject: [PATCH 151/463] Log http on debug log level ... and additionally log the response time --- src/node/hooks/express/webaccess.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index c39f91da..944fd98f 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -94,7 +94,7 @@ exports.expressConfigure = function (hook_name, args, cb) { // If the log level specified in the config file is WARN or ERROR the application server never starts listening to requests as reported in issue #158. // Not installing the log4js connect logger when the log level has a higher severity than INFO since it would not log at that level anyway. if (!(settings.loglevel === "WARN" || settings.loglevel == "ERROR")) - args.app.use(log4js.connectLogger(httpLogger, { level: log4js.levels.INFO, format: ':status, :method :url'})); + args.app.use(log4js.connectLogger(httpLogger, { level: log4js.levels.DEBUG, format: ':status, :method :url -- :response-timems'})); /* Do not let express create the session, so that we can retain a * reference to it for socket.io to use. Also, set the key (cookie From c30697cb0771882a6077b40e4d6f62105fafbf0b Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 19 Mar 2013 18:40:39 +0100 Subject: [PATCH 152/463] Don't break the whole server if an import failed because no files were uploaded Fixes #1611 --- src/node/handler/ImportHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index ac856a60..7bb9c5db 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -60,7 +60,7 @@ exports.doImport = function(req, res, padId) form.parse(req, function(err, fields, files) { //the upload failed, stop at this point if(err || files.file === undefined) { - console.warn("Uploading Error: " + err.stack); + if(err) console.warn("Uploading Error: " + err.stack); callback("uploadFailed"); } //everything ok, continue From bcb92f25a63da45fbe328e43a4a3d0311675a2ba Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 19 Mar 2013 20:21:27 +0100 Subject: [PATCH 153/463] Refactor chat notifications and the chatNewMessage hook --- doc/api/hooks_client-side.md | 9 ++- src/static/js/chat.js | 113 +++++++++++++++-------------------- 2 files changed, 55 insertions(+), 67 deletions(-) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index a84ccdeb..91985941 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -148,9 +148,14 @@ Called from: src/static/js/chat.js Things in context: -1. msg - The message object +1. authorName - The user that wrote this message +2. author - The authorID of the user that wrote the message +2. text - the message text +3. sticky (boolean) - if you want the gritter notification bubble to fade out on its own or just sit there +3. timestamp - the timestamp of the chat message +4. timeStr - the timestamp as a formatted string -This hook is called on the client side whenever a user recieves a chat message from the server. This can be used to create different notifications for chat messages. +This hook is called on the client side whenever a chat message is received from the server. It can be used to create different notifications for chat messages. ## collectContentPre Called from: src/static/js/contentcollector.js diff --git a/src/static/js/chat.js b/src/static/js/chat.js index bba3d87e..38d6f38d 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -78,7 +78,7 @@ var chat = (function() $("#chatinput").val(""); }, addMessage: function(msg, increment, isHistoryAdd) - { + { //correct the time msg.time += this._pad.clientTimeOffset; @@ -100,85 +100,68 @@ var chat = (function() var text = padutils.escapeHtmlWithClickableLinks(msg.text, "_blank"); - /* Performs an action if your name is mentioned */ - var myName = $('#myusernameedit').val(); - myName = myName.toLowerCase(); - var chatText = text.toLowerCase(); - var wasMentioned = false; - if (chatText.indexOf(myName) !== -1 && myName != "undefined"){ - wasMentioned = true; + var authorName = msg.userName == null ? _('pad.userlist.unnamed') : padutils.escapeHtml(msg.userName); + + // the hook args + var ctx = { + "authorName" : authorName, + "author" : msg.userId, + "text" : text, + "sticky" : false, + "timestamp" : msg.time, + "timeStr" : timeStr } - /* End of new action */ - var authorName = msg.userName == null ? _('pad.userlist.unnamed') : padutils.escapeHtml(msg.userName); - - var html = "

    " + authorName + ":" + timeStr + " " + text + "

    "; - if(isHistoryAdd) - $(html).insertAfter('#chatloadmessagesbutton'); - else - $("#chattext").append(html); - - //should we increment the counter?? - if(increment && !isHistoryAdd) - { - var count = Number($("#chatcounter").text()); - count++; - - // is the users focus already in the chatbox? - var alreadyFocused = $("#chatinput").is(":focus"); - - // does the user already have the chatbox open? - var chatOpen = $("#chatbox").is(":visible"); + // is the users focus already in the chatbox? + var alreadyFocused = $("#chatinput").is(":focus"); - $("#chatcounter").text(count); - // chat throb stuff -- Just make it throw for twice as long - if(wasMentioned && !alreadyFocused && !isHistoryAdd && !chatOpen) - { // If the user was mentioned show for twice as long and flash the browser window - $.gritter.add({ - // (string | mandatory) the heading of the notification - title: authorName, - // (string | mandatory) the text inside the notification - text: text, - // (bool | optional) if you want it to fade out on its own or just sit there - sticky: true, - // (int | optional) the time you want it to be alive for before fading out - time: '2000' - }); + // does the user already have the chatbox open? + var chatOpen = $("#chatbox").is(":visible"); - chatMentions++; - Tinycon.setBubble(chatMentions); - } + // does this message contain this user's name? (is the curretn user mentioned?) + var myName = $('#myusernameedit').val(); + var wasMentioned = (text.toLowerCase().indexOf(myName.toLowerCase()) !== -1 && myName != "undefined"); + + if(wasMentioned && !alreadyFocused && !isHistoryAdd && !chatOpen) + { // If the user was mentioned show for twice as long and flash the browser window + chatMentions++; + Tinycon.setBubble(chatMentions); + ctx.sticky = true; + } + + // Call chat message hook + hooks.aCallAll("chatNewMessage", ctx, function() { + + var html = "

    " + authorName + ":" + ctx.timeStr + " " + ctx.text + "

    "; + if(isHistoryAdd) + $(html).insertAfter('#chatloadmessagesbutton'); else + $("#chattext").append(html); + + //should we increment the counter?? + if(increment && !isHistoryAdd) { - if(!chatOpen){ + // Update the counter of unread messages + var count = Number($("#chatcounter").text()); + count++; + $("#chatcounter").text(count); + + if(!chatOpen) { $.gritter.add({ // (string | mandatory) the heading of the notification - title: authorName, + title: ctx.authorName, // (string | mandatory) the text inside the notification - text: text, - + text: ctx.text, // (bool | optional) if you want it to fade out on its own or just sit there - sticky: false, + sticky: ctx.sticky, // (int | optional) the time you want it to be alive for before fading out time: '4000' }); - Tinycon.setBubble(count); - var msg = { - "authorName" : authorName, - "text" : text, - "sticky" : false, - "time" : timeStr - }; - hooks.aCallAll("chatNewMessage", { - "authorName" : authorName, - "text" : text, - "sticky" : false, - "time" : timeStr - }); } } - } - // Clear the chat mentions when the user clicks on the chat input box + }); + + // Clear the chat mentions when the user clicks on the chat input box $('#chatinput').click(function(){ chatMentions = 0; Tinycon.setBubble(0); From 2a1859cc6dd902715567d25c95e4fba66705938f Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 20 Mar 2013 01:14:04 +0000 Subject: [PATCH 154/463] mm k --- out/doc/api/api.html | 1819 ----------------------- out/doc/api/changeset_library.html | 175 --- out/doc/api/editorInfo.html | 161 -- out/doc/api/embed_parameters.html | 130 -- out/doc/api/hooks_client-side.html | 393 ----- out/doc/api/hooks_overview.html | 44 - out/doc/api/hooks_server-side.html | 329 ----- out/doc/api/http_api.html | 712 --------- out/doc/api/pluginfw.html | 51 - out/doc/assets/style.css | 44 - out/doc/custom_static.html | 41 - out/doc/database.html | 132 -- out/doc/documentation.html | 43 - out/doc/easysync/README.html | 29 - out/doc/index.html | 2202 ---------------------------- out/doc/localization.html | 130 -- out/doc/plugins.html | 169 --- 17 files changed, 6604 deletions(-) delete mode 100644 out/doc/api/api.html delete mode 100644 out/doc/api/changeset_library.html delete mode 100644 out/doc/api/editorInfo.html delete mode 100644 out/doc/api/embed_parameters.html delete mode 100644 out/doc/api/hooks_client-side.html delete mode 100644 out/doc/api/hooks_overview.html delete mode 100644 out/doc/api/hooks_server-side.html delete mode 100644 out/doc/api/http_api.html delete mode 100644 out/doc/api/pluginfw.html delete mode 100644 out/doc/assets/style.css delete mode 100644 out/doc/custom_static.html delete mode 100644 out/doc/database.html delete mode 100644 out/doc/documentation.html delete mode 100644 out/doc/easysync/README.html delete mode 100644 out/doc/index.html delete mode 100644 out/doc/localization.html delete mode 100644 out/doc/plugins.html diff --git a/out/doc/api/api.html b/out/doc/api/api.html deleted file mode 100644 index fa3490aa..00000000 --- a/out/doc/api/api.html +++ /dev/null @@ -1,1819 +0,0 @@ - - - - - Embed parameters - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    - -
    -

    Embed parameters#

    -

    You can easily embed your etherpad-lite into any webpage by using iframes. You can configure the embedded pad using embed paramters. - -

    -

    Example: - -

    -

    Cut and paste the following code into any webpage to embed a pad. The parameters below will hide the chat and the line numbers. - -

    -
    <iframe src='http://pad.test.de/p/PAD_NAME?showChat=false&showLineNumbers=false' width=600 height=400></iframe>
    -

    showLineNumbers#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    showControls#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    showChat#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    useMonospaceFont#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    userName#

    -
      -
    • String
    • -
    -

    Default: "unnamed" - -

    -

    Example: userName=Etherpad%20User - -

    -

    userColor#

    -
      -
    • String (css hex color value)
    • -
    -

    Default: randomly chosen by pad server - -

    -

    Example: userColor=%23ff9900 - -

    -

    noColors#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    alwaysShowChat#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    lang#

    -
      -
    • String
    • -
    -

    Default: en - -

    -

    Example: lang=ar (translates the interface into Arabic) - -

    -

    rtl#

    -
      -
    • Boolean
    • -
    -

    Default: true -Displays pad text from right to left. - - -

    -

    HTTP API#

    -

    What can I do with this API?#

    -

    The API gives another web application control of the pads. The basic functions are - -

    -
      -
    • create/delete pads
    • -
    • grant/forbid access to pads
    • -
    • get/set pad content
    • -
    -

    The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to etherpad lite. Means: Your web application still has to do authentication, but you can tell etherpad lite via the api, which visitors should get which permissions. This allows etherpad lite to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website. - -

    -

    Take a look at HTTP API client libraries to see if a library in your favorite language. - -

    -

    Examples#

    -

    Example 1#

    -

    A portal (such as WordPress) wants to give a user access to a new pad. Let's assume the user have the internal id 7 and his name is michael. - -

    -

    Portal maps the internal userid to an etherpad author. - -

    -
    -

    Request: http://pad.domain/api/1/createAuthorIfNotExistsFor?apikey=secret&name=Michael&authorMapper=7 - -

    -

    Response: {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal maps the internal userid to an etherpad group: - -

    -
    -

    Request: http://pad.domain/api/1/createGroupIfNotExistsFor?apikey=secret&groupMapper=7 - -

    -

    Response: {code: 0, message:"ok", data: {groupID: "g.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal creates a pad in the userGroup - -

    -
    -

    Request: http://pad.domain/api/1/createGroupPad?apikey=secret&groupID=g.s8oes9dhwrvt0zif&padName=samplePad&text=This is the first sentence in the pad - -

    -

    Response: {code: 0, message:"ok", data: null} - -

    -
    -

    Portal starts the session for the user on the group: - -

    -
    -

    Request: http://pad.domain/api/1/createSession?apikey=secret&groupID=g.s8oes9dhwrvt0zif&authorID=a.s8oes9dhwrvt0zif&validUntil=1312201246 - -

    -

    Response: {"data":{"sessionID": "s.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal places the cookie "sessionID" with the given value on the client and creates an iframe including the pad. - -

    -

    Example 2#

    -

    A portal (such as WordPress) wants to transform the contents of a pad that multiple admins edited into a blog post. - -

    -

    Portal retrieves the contents of the pad for entry into the db as a blog post: - -

    -
    -

    Request: http://pad.domain/api/1/getText?apikey=secret&padID=g.s8oes9dhwrvt0zif$123 - -

    -

    Response: {code: 0, message:"ok", data: {text:"Welcome Text"}} - -

    -
    -

    Portal submits content into new blog post - -

    -
    -

    Portal.AddNewBlog(content) - - -

    -
    -

    Usage#

    -

    API version#

    -

    The latest version is 1.2.7 - -

    -

    The current version can be queried via /api. - -

    -

    Request Format#

    -

    The API is accessible via HTTP. HTTP Requests are in the format /api/$APIVERSION/$FUNCTIONNAME. Parameters are transmitted via HTTP GET. $APIVERSION depends on the endpoints you want to use. - -

    -

    Response Format#

    -

    Responses are valid JSON in the following format: - -

    -
    {
    -  "code": number,
    -  "message": string,
    -  "data": obj
    -}
    -
      -
    • code a return code
        -
      • 0 everything ok
      • -
      • 1 wrong parameters
      • -
      • 2 internal error
      • -
      • 3 no such function
      • -
      • 4 no or wrong API Key
      • -
      -
    • -
    • message a status message. Its ok if everything is fine, else it contains an error message
    • -
    • data the payload
    • -
    -

    Overview#

    -

    API Overview - -

    -

    Data Types#

    -
      -
    • groupID a string, the unique id of a group. Format is g.16RANDOMCHARS, for example g.s8oes9dhwrvt0zif
    • -
    • sessionID a string, the unique id of a session. Format is s.16RANDOMCHARS, for example s.s8oes9dhwrvt0zif
    • -
    • authorID a string, the unique id of an author. Format is a.16RANDOMCHARS, for example a.s8oes9dhwrvt0zif
    • -
    • readOnlyID a string, the unique id of an readonly relation to a pad. Format is r.16RANDOMCHARS, for example r.s8oes9dhwrvt0zif
    • -
    • padID a string, format is GROUPID$PADNAME, for example the pad test of group g.s8oes9dhwrvt0zif has padID g.s8oes9dhwrvt0zif$test
    • -
    -

    Authentication#

    -

    Authentication works via a token that is sent with each request as a post parameter. There is a single token per Etherpad-Lite deployment. This token will be random string, generated by Etherpad-Lite at the first start. It will be saved in APIKEY.txt in the root folder of Etherpad Lite. Only Etherpad Lite and the requesting application knows this key. Token management will not be exposed through this API. - -

    -

    Node Interoperability#

    -

    All functions will also be available through a node module accessable from other node.js applications. - -

    -

    JSONP#

    -

    The API provides JSONP support to allow requests from a server in a different domain. -Simply add &jsonp=? to the API call. - -

    -

    Example usage: http://api.jquery.com/jQuery.getJSON/ - -

    -

    API Methods#

    -

    Groups#

    -

    Pads can belong to a group. The padID of grouppads is starting with a groupID like g.asdfasdfasdfasdf$test - -

    -

    createGroup()#

    -
      -
    • API >= 1
    • -
    -

    creates a new group - -

    -

    Example returns: - * {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}} - -

    -

    createGroupIfNotExistsFor(groupMapper)#

    -
      -
    • API >= 1
    • -
    -

    this functions helps you to map your application group ids to etherpad lite group ids - -

    -

    Example returns: - * {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}} - -

    -

    deleteGroup(groupID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a group - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    listPads(groupID)#

    -
      -
    • API >= 1
    • -
    -

    returns all pads of this group - -

    -

    Example returns: - {code: 0, message:"ok", data: {padIDs : ["g.s8oes9dhwrvt0zif$test", "g.s8oes9dhwrvt0zif$test2"]} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    createGroupPad(groupID, padName [, text])#

    -
      -
    • API >= 1
    • -
    -

    creates a new pad in this group - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"pad does already exist", data: null} - * {code: 1, message:"groupID does not exist", data: null} - -

    -

    listAllGroups()#

    -
      -
    • API >= 1.1
    • -
    -

    lists all existing groups - -

    -

    Example returns: - {code: 0, message:"ok", data: {groupIDs: ["g.mKjkmnAbSMtCt8eL", "g.3ADWx6sbGuAiUmCy"]}} - {code: 0, message:"ok", data: {groupIDs: []}} - -

    -

    Author#

    -

    These authors are bound to the attributes the users choose (color and name). - -

    -

    createAuthor([name])#

    -
      -
    • API >= 1
    • -
    -

    creates a new author - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -

    createAuthorIfNotExistsFor(authorMapper [, name])#

    -
      -
    • API >= 1
    • -
    -

    this functions helps you to map your application author ids to etherpad lite author ids - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -

    listPadsOfAuthor(authorID)#

    -
      -
    • API >= 1
    • -
    -

    returns an array of all pads this author contributed to - -

    -

    Example returns: - {code: 0, message:"ok", data: {padIDs: ["g.s8oes9dhwrvt0zif$test", "g.s8oejklhwrvt0zif$foo"]}} - {code: 1, message:"authorID does not exist", data: null} - -

    -

    getAuthorName(authorID)#

    -
      -
    • API >= 1.1
    • -
    -

    Returns the Author Name of the author - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorName: "John McLear"}} - -

    -

    -> can't be deleted cause this would involve scanning all the pads where this author was - -

    -

    Session#

    -

    Sessions can be created between a group and an author. This allows an author to access more than one group. The sessionID will be set as a cookie to the client and is valid until a certain date. The session cookie can also contain multiple comma-seperated sessionIDs, allowing a user to edit pads in different groups at the same time. Only users with a valid session for this group, can access group pads. You can create a session after you authenticated the user at your web application, to give them access to the pads. You should save the sessionID of this session and delete it after the user logged out. - -

    -

    createSession(groupID, authorID, validUntil)#

    -
      -
    • API >= 1
    • -
    -

    creates a new session. validUntil is an unix timestamp in seconds - -

    -

    Example returns: - {code: 0, message:"ok", data: {sessionID: "s.s8oes9dhwrvt0zif"}} - {code: 1, message:"groupID doesn't exist", data: null} - {code: 1, message:"authorID doesn't exist", data: null} - {code: 1, message:"validUntil is in the past", data: null} - -

    -

    deleteSession(sessionID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a session - -

    -

    Example returns: - {code: 1, message:"ok", data: null} - {code: 1, message:"sessionID does not exist", data: null} - -

    -

    getSessionInfo(sessionID)#

    -
      -
    • API >= 1
    • -
    -

    returns informations about a session - -

    -

    Example returns: - {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif", groupID: g.s8oes9dhwrvt0zif, validUntil: 1312201246}} - {code: 1, message:"sessionID does not exist", data: null} - -

    -

    listSessionsOfGroup(groupID)#

    -
      -
    • API >= 1
    • -
    -

    returns all sessions of a group - -

    -

    Example returns: - {"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    listSessionsOfAuthor(authorID)#

    -
      -
    • API >= 1
    • -
    -

    returns all sessions of an author - -

    -

    Example returns: - {"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}} - {code: 1, message:"authorID does not exist", data: null} - -

    -

    Pad Content#

    -

    Pad content can be updated and retrieved through the API - -

    -

    getText(padID, [rev])#

    -
      -
    • API >= 1
    • -
    -

    returns the text of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {text:"Welcome Text"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setText(padID, text)#

    -
      -
    • API >= 1
    • -
    -

    sets the text of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - * {code: 1, message:"text too long", data: null} - -

    -

    getHTML(padID, [rev])#

    -
      -
    • API >= 1
    • -
    -

    returns the text of a pad formatted as HTML - -

    -

    Example returns: - {code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    Chat#

    -

    getChatHistory(padID, [start, end])#

    -
      -
    • API >= 1.2.7
    • -
    -

    returns - -

    -
      -
    • a part of the chat history, when start and end are given
    • -
    • the whole chat histroy, when no extra parameters are given
    • -
    -

    Example returns: - -

    -
      -
    • {"code":0,"message":"ok","data":{"messages":[{"text":"foo","userId":"a.foo","time":1359199533759,"userName":"test"},{"text":"bar","userId":"a.foo","time":1359199534622,"userName":"test"}]}}
    • -
    • {code: 1, message:"start is higher or equal to the current chatHead", data: null}
    • -
    • {code: 1, message:"padID does not exist", data: null}
    • -
    -

    getChatHead(padID)#

    -
      -
    • API >= 1.2.7
    • -
    -

    returns the chatHead (last number of the last chat-message) of the pad - - -

    -

    Example returns: - -

    -
      -
    • {code: 0, message:"ok", data: {chatHead: 42}}
    • -
    • {code: 1, message:"padID does not exist", data: null}
    • -
    -

    Pad#

    -

    Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and its forbidden for normal pads to include a $ in the name. - -

    -

    createPad(padID [, text])#

    -
      -
    • API >= 1
    • -
    -

    creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad. - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"pad does already exist", data: null} - -

    -

    getRevisionsCount(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the number of revisions of this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {revisions: 56}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    padUsersCount(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the number of user that are currently editing this pad - -

    -

    Example returns: - * {code: 0, message:"ok", data: {padUsersCount: 5}} - -

    -

    padUsers(padID)#

    -
      -
    • API >= 1.1
    • -
    -

    returns the list of users that are currently editing this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {padUsers: [{colorId:"#c1a9d9","name":"username1","timestamp":1345228793126,"id":"a.n4gEeMLsvg12452n"},{"colorId":"#d9a9cd","name":"Hmmm","timestamp":1345228796042,"id":"a.n4gEeMLsvg12452n"}]}} - {code: 0, message:"ok", data: {padUsers: []}} - -

    -

    deletePad(padID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getReadOnlyID(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the read only link of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {readOnlyID: "r.s8oes9dhwrvt0zif"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setPublicStatus(padID, publicStatus)#

    -
      -
    • API >= 1
    • -
    -

    sets a boolean for the public status of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getPublicStatus(padID)#

    -
      -
    • API >= 1
    • -
    -

    return true of false - -

    -

    Example returns: - {code: 0, message:"ok", data: {publicStatus: true}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setPassword(padID, password)#

    -
      -
    • API >= 1
    • -
    -

    returns ok or a error message - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    isPasswordProtected(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns true or false - -

    -

    Example returns: - {code: 0, message:"ok", data: {passwordProtection: true}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    listAuthorsOfPad(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns an array of authors who contributed to this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {authorIDs : ["a.s8oes9dhwrvt0zif", "a.akf8finncvomlqva"]} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getLastEdited(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the timestamp of the last revision of the pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {lastEdited: 1340815946602}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    sendClientsMessage(padID, msg)#

    -
      -
    • API >= 1.1
    • -
    -

    sends a custom message of type msg to the pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    checkToken()#

    -
      -
    • API >= 1.2
    • -
    -

    returns ok when the current api token is valid - -

    -

    Example returns: - {"code":0,"message":"ok","data":null} - {"code":4,"message":"no or wrong API Key","data":null} - -

    -

    Pads#

    -

    listAllPads()#

    -
      -
    • API >= 1.2.1
    • -
    -

    lists all pads on this epl instance - -

    -

    Example returns: - * {code: 0, message:"ok", data: ["testPad", "thePadsOfTheOthers"]} - -

    -

    Hooks#

    -

    All hooks are called with two arguments: - -

    -
      -
    1. name - the name of the hook being called
    2. -
    3. context - an object with some relevant information about the context of the call
    4. -
    -

    Return values#

    -

    A hook should always return a list or undefined. Returning undefined is equivalent to returning an empty list. -All the returned lists are appended to each other, so if the return values where [1, 2], undefined, [3, 4,], undefined and [5], the value returned by callHook would be [1, 2, 3, 4, 5]. - -

    -

    This is, because it should never matter if you have one plugin or several plugins doing some work - a single plugin should be able to make callHook return the same value a set of plugins are able to return collectively. So, any plugin can return a list of values, of any length, not just one value. -

    -

    Client-side hooks#

    -

    Most of these hooks are called during or in order to set up the formatting process. - -

    -

    documentReady#

    -

    Called from: src/templates/pad.html - -

    -

    Things in context: - -

    -

    nothing - -

    -

    This hook proxies the functionality of jQuery's $(document).ready event. - -

    -

    aceDomLineProcessLineAttributes#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. domline - The current DOM line being processed
    2. -
    3. cls - The class of the current block element (useful for styling)
    4. -
    -

    This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. - -

    -

    The return value of this hook should have the following structure: - -

    -

    { preHtml: String, postHtml: String, processedMarker: Boolean } - -

    -

    The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more. - -

    -

    aceCreateDomLine#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. domline - the current DOM line being processed
    2. -
    3. cls - The class of the current element (useful for styling)
    4. -
    -

    This hook is called for any line being processed by the formatting engine, unless the aceDomLineProcessLineAttributes hook from above returned true, in which case this hook is skipped. - -

    -

    The return value of this hook should have the following structure: - -

    -

    { extraOpenTags: String, extraCloseTags: String, cls: String } - -

    -

    extraOpenTags and extraCloseTags will be added before and after the element in question, and cls will be the new class of the element going forward. - -

    -

    acePostWriteDomLineHTML#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. node - the DOM node that just got written to the page
    2. -
    -

    This hook is for right after a node has been fully formatted and written to the page. - -

    -

    aceAttribsToClasses#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. key - the current attribute being processed
    4. -
    5. value - the value of the attribute being processed
    6. -
    -

    This hook is called during the attribute processing procedure, and should be used to translate key, value pairs into valid HTML classes that can be inserted into the DOM. - -

    -

    The return value for this function should be a list of classes, which will then be parsed into a valid class string. - -

    -

    aceGetFilterStack#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. browser - an object indicating which browser is accessing the page
    4. -
    -

    This hook is called to apply custom regular expression filters to a set of styles. The one example available is the ep_linkify plugin, which adds internal links. They use it to find the telltale [[ ]] syntax that signifies internal links, and finding that syntax, they add in the internalHref attribute to be later used by the aceCreateDomLine hook (documented above). - -

    -

    aceEditorCSS#

    -

    Called from: src/static/js/ace.js - -

    -

    Things in context: None - -

    -

    This hook is provided to allow custom CSS files to be loaded. The return value should be an array of paths relative to the plugins directory. - -

    -

    aceInitInnerdocbodyHead#

    -

    Called from: src/static/js/ace.js - -

    -

    Things in context: - -

    -
      -
    1. iframeHTML - the HTML of the editor iframe up to this point, in array format
    2. -
    -

    This hook is called during the creation of the editor HTML. The array should have lines of HTML added to it, giving the plugin author a chance to add in meta, script, link, and other tags that go into the <head> element of the editor HTML document. - -

    -

    aceEditEvent#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. documentAttributeManager - information about attributes in the document (this is a mystery to me)
    8. -
    -

    This hook is made available to edit the edit events that might occur when changes are made. Currently you can change the editor information, some of the meanings of the edit, and so on. You can also make internal changes (internal to your plugin) that use the information provided by the edit event. - -

    -

    aceRegisterBlockElements#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: None - -

    -

    The return value of this hook will add elements into the "lineMarkerAttribute" category, making the aceDomLineProcessLineAttributes hook (documented below) call for those elements. - -

    -

    aceInitialized#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. editorInfo - information about the user who will be making changes through the interface, and a way to insert functions into the main ace object (see ep_headings)
    2. -
    3. rep - information about where the user's cursor is
    4. -
    5. documentAttributeManager - some kind of magic
    6. -
    -

    This hook is for inserting further information into the ace engine, for later use in formatting hooks. - -

    -

    postAceInit#

    -

    Called from: src/static/js/pad.js - -

    -

    Things in context: - -

    -
      -
    1. ace - the ace object that is applied to this editor.
    2. -
    -

    There doesn't appear to be any example available of this particular hook being used, but it gets fired after the editor is all set up. - -

    -

    postTimesliderInit#

    -

    Called from: src/static/js/timeslider.js - -

    -

    There doesn't appear to be any example available of this particular hook being used, but it gets fired after the timeslider is all set up. - -

    -

    userJoinOrUpdate#

    -

    Called from: src/static/js/pad_userlist.js - -

    -

    Things in context: - -

    -
      -
    1. info - the user information
    2. -
    -

    This hook is called on the client side whenever a user joins or changes. This can be used to create notifications or an alternate user list. - -

    -

    collectContentPre#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. style - the style applied to the node (probably CSS)
    8. -
    9. cls - the HTML class string of the node
    10. -
    -

    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. - -

    -

    collectContentPost#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. style - the style applied to the node (probably CSS)
    8. -
    9. cls - the HTML class string of the node
    10. -
    -

    This hook is called after 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. - -

    -

    handleClientMessage_name#

    -

    Called from: src/static/js/collab_client.js - -

    -

    Things in context: - -

    -
      -
    1. payload - the data that got sent with the message (use it for custom message content)
    2. -
    -

    This hook gets called every time the client receives a message of type name. This can most notably be used with the new HTTP API call, "sendClientsMessage", which sends a custom message type to all clients connected to a pad. You can also use this to handle existing types. - -

    -

    collab_client.js has a pretty extensive list of message types, if you want to take a look. - -

    -

    aceStartLineAndCharForPoint-aceEndLineAndCharForPoint#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. root - the span element of the current line
    8. -
    9. point - the starting/ending element where the cursor highlights
    10. -
    11. documentAttributeManager - information about attributes in the document
    12. -
    -

    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#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. documentAttributeManager - information about attributes in the document
    8. -
    9. evt - the fired event
    10. -
    -

    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#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. text - the text for that line
    8. -
    -

    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#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    -

    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#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. text - the line text
    4. -
    5. class - line class
    6. -
    -

    This hook is provided to allow whether a given line should be deliniated with multiple authors. -Multiple authors in one line cause the creation of magic span lines. This might not suit you and -now you can disable it and handle your own deliniation. -The return value should be either true(disable) or false. - -

    -

    Server-side hooks#

    -

    These hooks are called on server-side. - -

    -

    loadSettings#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. settings - the settings object
    2. -
    -

    Use this hook to receive the global settings in your plugin. - -

    -

    pluginUninstall#

    -

    Called from: src/static/js/pluginfw/installer.js - -

    -

    Things in context: - -

    -
      -
    1. plugin_name - self-explanatory
    2. -
    -

    If this hook returns an error, the callback to the uninstall function gets an error as well. This mostly seems useful for handling additional features added in based on the installation of other plugins, which is pretty cool! - -

    -

    pluginInstall#

    -

    Called from: src/static/js/pluginfw/installer.js - -

    -

    Things in context: - -

    -
      -
    1. plugin_name - self-explanatory
    2. -
    -

    If this hook returns an error, the callback to the install function gets an error, too. This seems useful for adding in features when a particular plugin is installed. - -

    -

    init_<plugin name>#

    -

    Called from: src/static/js/pluginfw/plugins.js - -

    -

    Things in context: None - -

    -

    This function is called after a specific plugin is initialized. This would probably be more useful than the previous two functions if you only wanted to add in features to one specific plugin. - -

    -

    expressConfigure#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. app - the main application object
    2. -
    -

    This is a helpful hook for changing the behavior and configuration of the application. It's called right after the application gets configured. - -

    -

    expressCreateServer#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. app - the main express application object (helpful for adding new paths and such)
    2. -
    3. server - the http server object
    4. -
    -

    This hook gets called after the application object has been created, but before it starts listening. This is similar to the expressConfigure hook, but it's not guaranteed that the application object will have all relevant configuration variables. - -

    -

    eejsBlock_<name>#

    -

    Called from: src/node/eejs/index.js - -

    -

    Things in context: - -

    -
      -
    1. content - the content of the block
    2. -
    -

    This hook gets called upon the rendering of an ejs template block. For any specific kind of block, you can change how that block gets rendered by modifying the content object passed in. - -

    -

    Have a look at src/templates/pad.html and src/templates/timeslider.html to see which blocks are available. - -

    -

    padCreate#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when a new pad was created. - -

    -

    padLoad#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when an pad was loaded. If a new pad was created and loaded this event will be emitted too. - -

    -

    padUpdate#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when an existing pad was updated. - -

    -

    padRemove#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. padID
    2. -
    -

    This hook gets called when an existing pad was removed/deleted. - -

    -

    socketio#

    -

    Called from: src/node/hooks/express/socketio.js - -

    -

    Things in context: - -

    -
      -
    1. app - the application object
    2. -
    3. io - the socketio object
    4. -
    5. server - the http server object
    6. -
    -

    I have no idea what this is useful for, someone else will have to add this description. - -

    -

    authorize#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    7. resource - the path being accessed
    8. -
    -

    This is useful for modifying the way authentication is done, especially for specific paths. - -

    -

    authenticate#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    7. username - the username used (optional)
    8. -
    9. password - the password used (optional)
    10. -
    -

    This is useful for modifying the way authentication is done. - -

    -

    authFailure#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    -

    This is useful for modifying the way authentication is done. - -

    -

    handleMessage#

    -

    Called from: src/node/handler/PadMessageHandler.js - -

    -

    Things in context: - -

    -
      -
    1. message - the message being handled
    2. -
    3. client - the client object from socket.io
    4. -
    -

    This hook will be called once a message arrive. If a plugin calls callback(null) the message will be dropped. However it is not possible to modify the message. - -

    -

    Plugins may also decide to implement custom behavior once a message arrives. - -

    -

    WARNING: handleMessage 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 handleMessage ( hook, context, callback ) {
    -  if ( context.message.type == 'USERINFO_UPDATE' ) {
    -    // If the message type is USERINFO_UPDATE, drop the message
    -    callback(null);
    -  }else{
    -    callback();
    -  }
    -};
    -

    clientVars#

    -

    Called from: src/node/handler/PadMessageHandler.js - -

    -

    Things in context: - -

    -
      -
    1. clientVars - the basic clientVars built by the core
    2. -
    3. pad - the pad this session is about
    4. -
    -

    This hook will be called once a client connects and the clientVars are being sent. Plugins can use this hook to give the client a initial configuriation, like the tracking-id of an external analytics-tool that is used on the client-side. You can also overwrite values from the original clientVars. - -

    -

    Example: - -

    -
    exports.clientVars = function(hook, context, callback)
    -{
    -  // tell the client which year we are in
    -  return callback({ "currentYear": new Date().getFullYear() });
    -};
    -

    This can be accessed on the client-side using clientVars.currentYear. - -

    -

    getLineHTMLForExport#

    -

    Called from: src/node/utils/ExportHtml.js - -

    -

    Things in context: - -

    -
      -
    1. apool - pool object
    2. -
    3. attribLine - line attributes
    4. -
    5. text - line text
    6. -
    -

    This hook will allow a plug-in developer to re-write each line when exporting to HTML. - - -

    -

    editorInfo#

    -

    editorInfo.ace_replaceRange(start, end, text)#

    -

    This function replaces a range (from start to end) with text. - -

    -

    editorInfo.ace_getRep()#

    -

    Returns the rep object. - -

    -

    editorInfo.ace_getAuthor()#

    -

    editorInfo.ace_inCallStack()#

    -

    editorInfo.ace_inCallStackIfNecessary(?)#

    -

    editorInfo.ace_focus(?)#

    -

    editorInfo.ace_importText(?)#

    -

    editorInfo.ace_importAText(?)#

    -

    editorInfo.ace_exportText(?)#

    -

    editorInfo.ace_editorChangedSize(?)#

    -

    editorInfo.ace_setOnKeyPress(?)#

    -

    editorInfo.ace_setOnKeyDown(?)#

    -

    editorInfo.ace_setNotifyDirty(?)#

    -

    editorInfo.ace_dispose(?)#

    -

    editorInfo.ace_getFormattedCode(?)#

    -

    editorInfo.ace_setEditable(bool)#

    -

    editorInfo.ace_execCommand(?)#

    -

    editorInfo.ace_callWithAce(fn, callStack, normalize)#

    -

    editorInfo.ace_setProperty(key, value)#

    -

    editorInfo.ace_setBaseText(txt)#

    -

    editorInfo.ace_setBaseAttributedText(atxt, apoolJsonObj)#

    -

    editorInfo.ace_applyChangesToBase(c, optAuthor, apoolJsonObj)#

    -

    editorInfo.ace_prepareUserChangeset()#

    -

    editorInfo.ace_applyPreparedChangesetToBase()#

    -

    editorInfo.ace_setUserChangeNotificationCallback(f)#

    -

    editorInfo.ace_setAuthorInfo(author, info)#

    -

    editorInfo.ace_setAuthorSelectionRange(author, start, end)#

    -

    editorInfo.ace_getUnhandledErrors()#

    -

    editorInfo.ace_getDebugProperty(prop)#

    -

    editorInfo.ace_fastIncorp(?)#

    -

    editorInfo.ace_isCaret(?)#

    -

    editorInfo.ace_getLineAndCharForPoint(?)#

    -

    editorInfo.ace_performDocumentApplyAttributesToCharRange(?)#

    -

    editorInfo.ace_setAttributeOnSelection(?)#

    -

    editorInfo.ace_toggleAttributeOnSelection(?)#

    -

    editorInfo.ace_performSelectionChange(?)#

    -

    editorInfo.ace_doIndentOutdent(?)#

    -

    editorInfo.ace_doUndoRedo(?)#

    -

    editorInfo.ace_doInsertUnorderedList(?)#

    -

    editorInfo.ace_doInsertOrderedList(?)#

    -

    editorInfo.ace_performDocumentApplyAttributesToRange()#

    -

    editorInfo.ace_getAuthorInfos()#

    -

    Returns an info object about the author. Object key = author_id and info includes author's bg color value. -Use to define your own authorship. -

    -

    editorInfo.ace_performDocumentReplaceRange(start, end, newText)#

    -

    This function replaces a range (from [x1,y1] to [x2,y2]) with newText. -

    -

    editorInfo.ace_performDocumentReplaceCharRange(startChar, endChar, newText)#

    -

    This function replaces a range (from y1 to y2) with newText. -

    -

    editorInfo.ace_renumberList(lineNum)#

    -

    If you delete a line, calling this method will fix the line numbering. -

    -

    editorInfo.ace_doReturnKey()#

    -

    Forces a return key at the current carret position. -

    -

    editorInfo.ace_isBlockElement(element)#

    -

    Returns true if your passed elment is registered as a block element -

    -

    editorInfo.ace_getLineListType(lineNum)#

    -

    Returns the line's html list type. -

    -

    editorInfo.ace_caretLine()#

    -

    Returns X position of the caret. -

    -

    editorInfo.ace_caretColumn()#

    -

    Returns Y position of the caret. -

    -

    editorInfo.ace_caretDocChar()#

    -

    Returns the Y offset starting from [x=0,y=0] -

    -

    editorInfo.ace_isWordChar(?)#

    -

    Changeset Library#

    -
    "Z:z>1|2=m=b*0|1+1$\n"
    -

    This is a Changeset. Its just a string and its very difficult to read in this form. But the Changeset Library gives us some tools to read it. - -

    -

    A changeset describes the diff between two revisions of the document. The Browser sends changesets to the server and the server sends them to the clients to update them. This Changesets gets also saved into the history of a pad. Which allows us to go back to every revision from the past. - -

    -

    Changeset.unpack(changeset)#

    -
      -
    • changeset String
    • -
    -

    This functions returns an object representaion of the changeset, similar to this: - -

    -
    { oldLen: 35, newLen: 36, ops: '|2=m=b*0|1+1', charBank: '\n' }
    -
      -
    • oldLen {Number} the original length of the document.
    • -
    • newLen {Number} the length of the document after the changeset is applied.
    • -
    • ops {String} the actual changes, introduced by this changeset.
    • -
    • charBank {String} All characters that are added by this changeset.
    • -
    -

    Changeset.opIterator(ops)#

    -
      -
    • ops String The operators, returned by Changeset.unpack()
    • -
    -

    Returns an operator iterator. This iterator allows us to iterate over all operators that are in the changeset. - -

    -

    You can iterate with an opIterator using its next() and hasNext() methods. Next returns the next() operator object and hasNext() indicates, whether there are any operators left. - -

    -

    The Operator object#

    -

    There are 3 types of operators: +,- and =. These operators describe different changes to the document, beginning with the first character of the document. A = operator doesn't change the text, but it may add or remove text attributes. A - operator removes text. And a + Operator adds text and optionally adds some attributes to it. - -

    -
      -
    • opcode {String} the operator type
    • -
    • chars {Number} the length of the text changed by this operator.
    • -
    • lines {Number} the number of lines changed by this operator.
    • -
    • attribs {attribs} attributes set on this text.
    • -
    -

    Example#

    -
    { opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '*0' }
    -

    APool#

    -
    > var AttributePoolFactory = require("./utils/AttributePoolFactory");
    -> var apool = AttributePoolFactory.createAttributePool();
    -> console.log(apool)
    -{ numToAttrib: {},
    -  attribToNum: {},
    -  nextNum: 0,
    -  putAttrib: [Function],
    -  getAttrib: [Function],
    -  getAttribKey: [Function],
    -  getAttribValue: [Function],
    -  eachAttrib: [Function],
    -  toJsonable: [Function],
    -  fromJsonable: [Function] }
    -

    This creates an empty apool. A apool saves which attributes were used during the history of a pad. There is one apool for each pad. It only saves the attributes that were really used, it doesn't save unused attributes. Lets fill this apool with some values - -

    -
    > apool.fromJsonable({"numToAttrib":{"0":["author","a.kVnWeomPADAT2pn9"],"1":["bold","true"],"2":["italic","true"]},"nextNum":3});
    -> console.log(apool)
    -{ numToAttrib: 
    -   { '0': [ 'author', 'a.kVnWeomPADAT2pn9' ],
    -     '1': [ 'bold', 'true' ],
    -     '2': [ 'italic', 'true' ] },
    -  attribToNum: 
    -   { 'author,a.kVnWeomPADAT2pn9': 0,
    -     'bold,true': 1,
    -     'italic,true': 2 },
    -  nextNum: 3,
    -  putAttrib: [Function],
    -  getAttrib: [Function],
    -  getAttribKey: [Function],
    -  getAttribValue: [Function],
    -  eachAttrib: [Function],
    -  toJsonable: [Function],
    -  fromJsonable: [Function] }
    -

    We used the fromJsonable function to fill the empty apool with values. the fromJsonable and toJsonable functions are used to serialize and deserialize an apool. You can see that it stores the relation between numbers and attributes. So for example the attribute 1 is the attribute bold and vise versa. A attribute is always a key value pair. For stuff like bold and italic its just 'italic':'true'. For authors its author:$AUTHORID. So a character can be bold and italic. But it can't belong to multiple authors - -

    -
    > apool.getAttrib(1)
    -[ 'bold', 'true' ]
    -

    Simple example of how to get the key value pair for the attribute 1 - -

    -

    AText#

    -
    > var atext = {"text":"bold text\nitalic text\nnormal text\n\n","attribs":"*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2"};
    -> console.log(atext)
    -{ text: 'bold text\nitalic text\nnormal text\n\n',
    -  attribs: '*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2' }
    -

    This is an atext. An atext has two parts: text and attribs. The text is just the text of the pad as a string. We will look closer at the attribs at the next steps - -

    -
    > var opiterator = Changeset.opIterator(atext.attribs)
    -> console.log(opiterator)
    -{ next: [Function: next],
    -  hasNext: [Function: hasNext],
    -  lastIndex: [Function: lastIndex] }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 9,
    -  lines: 0,
    -  attribs: '*0*1' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '*0' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 11,
    -  lines: 0,
    -  attribs: '*0*1*2' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 11,
    -  lines: 0,
    -  attribs: '*0' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 2,
    -  lines: 2,
    -  attribs: '' }
    -

    The attribs are again a bunch of operators like .ops in the changeset was. But these operators are only + operators. They describe which part of the text has which attributes - -

    -

    For more information see /doc/easysync/easysync-notes.txt in the source. - -

    -

    Plugin Framework#

    -

    require("ep_etherpad-lite/static/js/plugingfw/plugins") - -

    -

    plugins.update#

    -

    require("ep_etherpad-lite/static/js/plugingfw/plugins").update() will use npm to list all installed modules and read their ep.json files, registering the contained hooks. -A hook registration is a pairs of a hook name and a function reference (filename for require() plus function name) - -

    -

    hooks.callAll#

    -

    require("ep_etherpad-lite/static/js/plugingfw/hooks").callAll("hook_name", {argname:value}) will call all hook functions registered for hook_name with {argname:value}. - -

    -

    hooks.aCallAll#

    -

    ? - -

    -

    ...#

    - -
    - - - - diff --git a/out/doc/api/changeset_library.html b/out/doc/api/changeset_library.html deleted file mode 100644 index 3459ee7b..00000000 --- a/out/doc/api/changeset_library.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - Changeset Library - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Changeset Library#

    -
    "Z:z>1|2=m=b*0|1+1$\n"
    -

    This is a Changeset. Its just a string and its very difficult to read in this form. But the Changeset Library gives us some tools to read it. - -

    -

    A changeset describes the diff between two revisions of the document. The Browser sends changesets to the server and the server sends them to the clients to update them. This Changesets gets also saved into the history of a pad. Which allows us to go back to every revision from the past. - -

    -

    Changeset.unpack(changeset)#

    -
      -
    • changeset String
    • -
    -

    This functions returns an object representaion of the changeset, similar to this: - -

    -
    { oldLen: 35, newLen: 36, ops: '|2=m=b*0|1+1', charBank: '\n' }
    -
      -
    • oldLen {Number} the original length of the document.
    • -
    • newLen {Number} the length of the document after the changeset is applied.
    • -
    • ops {String} the actual changes, introduced by this changeset.
    • -
    • charBank {String} All characters that are added by this changeset.
    • -
    -

    Changeset.opIterator(ops)#

    -
      -
    • ops String The operators, returned by Changeset.unpack()
    • -
    -

    Returns an operator iterator. This iterator allows us to iterate over all operators that are in the changeset. - -

    -

    You can iterate with an opIterator using its next() and hasNext() methods. Next returns the next() operator object and hasNext() indicates, whether there are any operators left. - -

    -

    The Operator object#

    -

    There are 3 types of operators: +,- and =. These operators describe different changes to the document, beginning with the first character of the document. A = operator doesn't change the text, but it may add or remove text attributes. A - operator removes text. And a + Operator adds text and optionally adds some attributes to it. - -

    -
      -
    • opcode {String} the operator type
    • -
    • chars {Number} the length of the text changed by this operator.
    • -
    • lines {Number} the number of lines changed by this operator.
    • -
    • attribs {attribs} attributes set on this text.
    • -
    -

    Example#

    -
    { opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '*0' }
    -

    APool#

    -
    > var AttributePoolFactory = require("./utils/AttributePoolFactory");
    -> var apool = AttributePoolFactory.createAttributePool();
    -> console.log(apool)
    -{ numToAttrib: {},
    -  attribToNum: {},
    -  nextNum: 0,
    -  putAttrib: [Function],
    -  getAttrib: [Function],
    -  getAttribKey: [Function],
    -  getAttribValue: [Function],
    -  eachAttrib: [Function],
    -  toJsonable: [Function],
    -  fromJsonable: [Function] }
    -

    This creates an empty apool. A apool saves which attributes were used during the history of a pad. There is one apool for each pad. It only saves the attributes that were really used, it doesn't save unused attributes. Lets fill this apool with some values - -

    -
    > apool.fromJsonable({"numToAttrib":{"0":["author","a.kVnWeomPADAT2pn9"],"1":["bold","true"],"2":["italic","true"]},"nextNum":3});
    -> console.log(apool)
    -{ numToAttrib: 
    -   { '0': [ 'author', 'a.kVnWeomPADAT2pn9' ],
    -     '1': [ 'bold', 'true' ],
    -     '2': [ 'italic', 'true' ] },
    -  attribToNum: 
    -   { 'author,a.kVnWeomPADAT2pn9': 0,
    -     'bold,true': 1,
    -     'italic,true': 2 },
    -  nextNum: 3,
    -  putAttrib: [Function],
    -  getAttrib: [Function],
    -  getAttribKey: [Function],
    -  getAttribValue: [Function],
    -  eachAttrib: [Function],
    -  toJsonable: [Function],
    -  fromJsonable: [Function] }
    -

    We used the fromJsonable function to fill the empty apool with values. the fromJsonable and toJsonable functions are used to serialize and deserialize an apool. You can see that it stores the relation between numbers and attributes. So for example the attribute 1 is the attribute bold and vise versa. A attribute is always a key value pair. For stuff like bold and italic its just 'italic':'true'. For authors its author:$AUTHORID. So a character can be bold and italic. But it can't belong to multiple authors - -

    -
    > apool.getAttrib(1)
    -[ 'bold', 'true' ]
    -

    Simple example of how to get the key value pair for the attribute 1 - -

    -

    AText#

    -
    > var atext = {"text":"bold text\nitalic text\nnormal text\n\n","attribs":"*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2"};
    -> console.log(atext)
    -{ text: 'bold text\nitalic text\nnormal text\n\n',
    -  attribs: '*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2' }
    -

    This is an atext. An atext has two parts: text and attribs. The text is just the text of the pad as a string. We will look closer at the attribs at the next steps - -

    -
    > var opiterator = Changeset.opIterator(atext.attribs)
    -> console.log(opiterator)
    -{ next: [Function: next],
    -  hasNext: [Function: hasNext],
    -  lastIndex: [Function: lastIndex] }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 9,
    -  lines: 0,
    -  attribs: '*0*1' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '*0' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 11,
    -  lines: 0,
    -  attribs: '*0*1*2' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 11,
    -  lines: 0,
    -  attribs: '*0' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 2,
    -  lines: 2,
    -  attribs: '' }
    -

    The attribs are again a bunch of operators like .ops in the changeset was. But these operators are only + operators. They describe which part of the text has which attributes - -

    -

    For more information see /doc/easysync/easysync-notes.txt in the source. -

    - -
    - - - - diff --git a/out/doc/api/editorInfo.html b/out/doc/api/editorInfo.html deleted file mode 100644 index 864b0675..00000000 --- a/out/doc/api/editorInfo.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - editorInfo - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    editorInfo#

    -

    editorInfo.ace_replaceRange(start, end, text)#

    -

    This function replaces a range (from start to end) with text. - -

    -

    editorInfo.ace_getRep()#

    -

    Returns the rep object. - -

    -

    editorInfo.ace_getAuthor()#

    -

    editorInfo.ace_inCallStack()#

    -

    editorInfo.ace_inCallStackIfNecessary(?)#

    -

    editorInfo.ace_focus(?)#

    -

    editorInfo.ace_importText(?)#

    -

    editorInfo.ace_importAText(?)#

    -

    editorInfo.ace_exportText(?)#

    -

    editorInfo.ace_editorChangedSize(?)#

    -

    editorInfo.ace_setOnKeyPress(?)#

    -

    editorInfo.ace_setOnKeyDown(?)#

    -

    editorInfo.ace_setNotifyDirty(?)#

    -

    editorInfo.ace_dispose(?)#

    -

    editorInfo.ace_getFormattedCode(?)#

    -

    editorInfo.ace_setEditable(bool)#

    -

    editorInfo.ace_execCommand(?)#

    -

    editorInfo.ace_callWithAce(fn, callStack, normalize)#

    -

    editorInfo.ace_setProperty(key, value)#

    -

    editorInfo.ace_setBaseText(txt)#

    -

    editorInfo.ace_setBaseAttributedText(atxt, apoolJsonObj)#

    -

    editorInfo.ace_applyChangesToBase(c, optAuthor, apoolJsonObj)#

    -

    editorInfo.ace_prepareUserChangeset()#

    -

    editorInfo.ace_applyPreparedChangesetToBase()#

    -

    editorInfo.ace_setUserChangeNotificationCallback(f)#

    -

    editorInfo.ace_setAuthorInfo(author, info)#

    -

    editorInfo.ace_setAuthorSelectionRange(author, start, end)#

    -

    editorInfo.ace_getUnhandledErrors()#

    -

    editorInfo.ace_getDebugProperty(prop)#

    -

    editorInfo.ace_fastIncorp(?)#

    -

    editorInfo.ace_isCaret(?)#

    -

    editorInfo.ace_getLineAndCharForPoint(?)#

    -

    editorInfo.ace_performDocumentApplyAttributesToCharRange(?)#

    -

    editorInfo.ace_setAttributeOnSelection(?)#

    -

    editorInfo.ace_toggleAttributeOnSelection(?)#

    -

    editorInfo.ace_performSelectionChange(?)#

    -

    editorInfo.ace_doIndentOutdent(?)#

    -

    editorInfo.ace_doUndoRedo(?)#

    -

    editorInfo.ace_doInsertUnorderedList(?)#

    -

    editorInfo.ace_doInsertOrderedList(?)#

    -

    editorInfo.ace_performDocumentApplyAttributesToRange()#

    -

    editorInfo.ace_getAuthorInfos()#

    -

    Returns an info object about the author. Object key = author_id and info includes author's bg color value. -Use to define your own authorship. -

    -

    editorInfo.ace_performDocumentReplaceRange(start, end, newText)#

    -

    This function replaces a range (from [x1,y1] to [x2,y2]) with newText. -

    -

    editorInfo.ace_performDocumentReplaceCharRange(startChar, endChar, newText)#

    -

    This function replaces a range (from y1 to y2) with newText. -

    -

    editorInfo.ace_renumberList(lineNum)#

    -

    If you delete a line, calling this method will fix the line numbering. -

    -

    editorInfo.ace_doReturnKey()#

    -

    Forces a return key at the current carret position. -

    -

    editorInfo.ace_isBlockElement(element)#

    -

    Returns true if your passed elment is registered as a block element -

    -

    editorInfo.ace_getLineListType(lineNum)#

    -

    Returns the line's html list type. -

    -

    editorInfo.ace_caretLine()#

    -

    Returns X position of the caret. -

    -

    editorInfo.ace_caretColumn()#

    -

    Returns Y position of the caret. -

    -

    editorInfo.ace_caretDocChar()#

    -

    Returns the Y offset starting from [x=0,y=0] -

    -

    editorInfo.ace_isWordChar(?)#

    - -
    - - - - diff --git a/out/doc/api/embed_parameters.html b/out/doc/api/embed_parameters.html deleted file mode 100644 index da521a3d..00000000 --- a/out/doc/api/embed_parameters.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - Embed parameters - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Embed parameters#

    -

    You can easily embed your etherpad-lite into any webpage by using iframes. You can configure the embedded pad using embed paramters. - -

    -

    Example: - -

    -

    Cut and paste the following code into any webpage to embed a pad. The parameters below will hide the chat and the line numbers. - -

    -
    <iframe src='http://pad.test.de/p/PAD_NAME?showChat=false&showLineNumbers=false' width=600 height=400></iframe>
    -

    showLineNumbers#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    showControls#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    showChat#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    useMonospaceFont#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    userName#

    -
      -
    • String
    • -
    -

    Default: "unnamed" - -

    -

    Example: userName=Etherpad%20User - -

    -

    userColor#

    -
      -
    • String (css hex color value)
    • -
    -

    Default: randomly chosen by pad server - -

    -

    Example: userColor=%23ff9900 - -

    -

    noColors#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    alwaysShowChat#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    lang#

    -
      -
    • String
    • -
    -

    Default: en - -

    -

    Example: lang=ar (translates the interface into Arabic) - -

    -

    rtl#

    -
      -
    • Boolean
    • -
    -

    Default: true -Displays pad text from right to left. - -

    - -
    - - - - diff --git a/out/doc/api/hooks_client-side.html b/out/doc/api/hooks_client-side.html deleted file mode 100644 index 46b17f1e..00000000 --- a/out/doc/api/hooks_client-side.html +++ /dev/null @@ -1,393 +0,0 @@ - - - - - Client-side hooks - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Client-side hooks#

    -

    Most of these hooks are called during or in order to set up the formatting process. - -

    -

    documentReady#

    -

    Called from: src/templates/pad.html - -

    -

    Things in context: - -

    -

    nothing - -

    -

    This hook proxies the functionality of jQuery's $(document).ready event. - -

    -

    aceDomLineProcessLineAttributes#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. domline - The current DOM line being processed
    2. -
    3. cls - The class of the current block element (useful for styling)
    4. -
    -

    This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. - -

    -

    The return value of this hook should have the following structure: - -

    -

    { preHtml: String, postHtml: String, processedMarker: Boolean } - -

    -

    The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more. - -

    -

    aceCreateDomLine#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. domline - the current DOM line being processed
    2. -
    3. cls - The class of the current element (useful for styling)
    4. -
    -

    This hook is called for any line being processed by the formatting engine, unless the aceDomLineProcessLineAttributes hook from above returned true, in which case this hook is skipped. - -

    -

    The return value of this hook should have the following structure: - -

    -

    { extraOpenTags: String, extraCloseTags: String, cls: String } - -

    -

    extraOpenTags and extraCloseTags will be added before and after the element in question, and cls will be the new class of the element going forward. - -

    -

    acePostWriteDomLineHTML#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. node - the DOM node that just got written to the page
    2. -
    -

    This hook is for right after a node has been fully formatted and written to the page. - -

    -

    aceAttribsToClasses#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. key - the current attribute being processed
    4. -
    5. value - the value of the attribute being processed
    6. -
    -

    This hook is called during the attribute processing procedure, and should be used to translate key, value pairs into valid HTML classes that can be inserted into the DOM. - -

    -

    The return value for this function should be a list of classes, which will then be parsed into a valid class string. - -

    -

    aceGetFilterStack#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. browser - an object indicating which browser is accessing the page
    4. -
    -

    This hook is called to apply custom regular expression filters to a set of styles. The one example available is the ep_linkify plugin, which adds internal links. They use it to find the telltale [[ ]] syntax that signifies internal links, and finding that syntax, they add in the internalHref attribute to be later used by the aceCreateDomLine hook (documented above). - -

    -

    aceEditorCSS#

    -

    Called from: src/static/js/ace.js - -

    -

    Things in context: None - -

    -

    This hook is provided to allow custom CSS files to be loaded. The return value should be an array of paths relative to the plugins directory. - -

    -

    aceInitInnerdocbodyHead#

    -

    Called from: src/static/js/ace.js - -

    -

    Things in context: - -

    -
      -
    1. iframeHTML - the HTML of the editor iframe up to this point, in array format
    2. -
    -

    This hook is called during the creation of the editor HTML. The array should have lines of HTML added to it, giving the plugin author a chance to add in meta, script, link, and other tags that go into the <head> element of the editor HTML document. - -

    -

    aceEditEvent#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. documentAttributeManager - information about attributes in the document (this is a mystery to me)
    8. -
    -

    This hook is made available to edit the edit events that might occur when changes are made. Currently you can change the editor information, some of the meanings of the edit, and so on. You can also make internal changes (internal to your plugin) that use the information provided by the edit event. - -

    -

    aceRegisterBlockElements#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: None - -

    -

    The return value of this hook will add elements into the "lineMarkerAttribute" category, making the aceDomLineProcessLineAttributes hook (documented below) call for those elements. - -

    -

    aceInitialized#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. editorInfo - information about the user who will be making changes through the interface, and a way to insert functions into the main ace object (see ep_headings)
    2. -
    3. rep - information about where the user's cursor is
    4. -
    5. documentAttributeManager - some kind of magic
    6. -
    -

    This hook is for inserting further information into the ace engine, for later use in formatting hooks. - -

    -

    postAceInit#

    -

    Called from: src/static/js/pad.js - -

    -

    Things in context: - -

    -
      -
    1. ace - the ace object that is applied to this editor.
    2. -
    -

    There doesn't appear to be any example available of this particular hook being used, but it gets fired after the editor is all set up. - -

    -

    postTimesliderInit#

    -

    Called from: src/static/js/timeslider.js - -

    -

    There doesn't appear to be any example available of this particular hook being used, but it gets fired after the timeslider is all set up. - -

    -

    userJoinOrUpdate#

    -

    Called from: src/static/js/pad_userlist.js - -

    -

    Things in context: - -

    -
      -
    1. info - the user information
    2. -
    -

    This hook is called on the client side whenever a user joins or changes. This can be used to create notifications or an alternate user list. - -

    -

    collectContentPre#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. style - the style applied to the node (probably CSS)
    8. -
    9. cls - the HTML class string of the node
    10. -
    -

    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. - -

    -

    collectContentPost#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. style - the style applied to the node (probably CSS)
    8. -
    9. cls - the HTML class string of the node
    10. -
    -

    This hook is called after 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. - -

    -

    handleClientMessage_name#

    -

    Called from: src/static/js/collab_client.js - -

    -

    Things in context: - -

    -
      -
    1. payload - the data that got sent with the message (use it for custom message content)
    2. -
    -

    This hook gets called every time the client receives a message of type name. This can most notably be used with the new HTTP API call, "sendClientsMessage", which sends a custom message type to all clients connected to a pad. You can also use this to handle existing types. - -

    -

    collab_client.js has a pretty extensive list of message types, if you want to take a look. - -

    -

    aceStartLineAndCharForPoint-aceEndLineAndCharForPoint#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. root - the span element of the current line
    8. -
    9. point - the starting/ending element where the cursor highlights
    10. -
    11. documentAttributeManager - information about attributes in the document
    12. -
    -

    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#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. documentAttributeManager - information about attributes in the document
    8. -
    9. evt - the fired event
    10. -
    -

    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#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. text - the text for that line
    8. -
    -

    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#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    -

    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#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. text - the line text
    4. -
    5. class - line class
    6. -
    -

    This hook is provided to allow whether a given line should be deliniated with multiple authors. -Multiple authors in one line cause the creation of magic span lines. This might not suit you and -now you can disable it and handle your own deliniation. -The return value should be either true(disable) or false. -

    - -
    - - - - diff --git a/out/doc/api/hooks_overview.html b/out/doc/api/hooks_overview.html deleted file mode 100644 index de50a7f0..00000000 --- a/out/doc/api/hooks_overview.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Hooks - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    Hooks#

    -

    All hooks are called with two arguments: - -

    -
      -
    1. name - the name of the hook being called
    2. -
    3. context - an object with some relevant information about the context of the call
    4. -
    -

    Return values#

    -

    A hook should always return a list or undefined. Returning undefined is equivalent to returning an empty list. -All the returned lists are appended to each other, so if the return values where [1, 2], undefined, [3, 4,], undefined and [5], the value returned by callHook would be [1, 2, 3, 4, 5]. - -

    -

    This is, because it should never matter if you have one plugin or several plugins doing some work - a single plugin should be able to make callHook return the same value a set of plugins are able to return collectively. So, any plugin can return a list of values, of any length, not just one value.

    - -
    - - - - diff --git a/out/doc/api/hooks_server-side.html b/out/doc/api/hooks_server-side.html deleted file mode 100644 index bc19b85c..00000000 --- a/out/doc/api/hooks_server-side.html +++ /dev/null @@ -1,329 +0,0 @@ - - - - - Server-side hooks - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Server-side hooks#

    -

    These hooks are called on server-side. - -

    -

    loadSettings#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. settings - the settings object
    2. -
    -

    Use this hook to receive the global settings in your plugin. - -

    -

    pluginUninstall#

    -

    Called from: src/static/js/pluginfw/installer.js - -

    -

    Things in context: - -

    -
      -
    1. plugin_name - self-explanatory
    2. -
    -

    If this hook returns an error, the callback to the uninstall function gets an error as well. This mostly seems useful for handling additional features added in based on the installation of other plugins, which is pretty cool! - -

    -

    pluginInstall#

    -

    Called from: src/static/js/pluginfw/installer.js - -

    -

    Things in context: - -

    -
      -
    1. plugin_name - self-explanatory
    2. -
    -

    If this hook returns an error, the callback to the install function gets an error, too. This seems useful for adding in features when a particular plugin is installed. - -

    -

    init_<plugin name>#

    -

    Called from: src/static/js/pluginfw/plugins.js - -

    -

    Things in context: None - -

    -

    This function is called after a specific plugin is initialized. This would probably be more useful than the previous two functions if you only wanted to add in features to one specific plugin. - -

    -

    expressConfigure#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. app - the main application object
    2. -
    -

    This is a helpful hook for changing the behavior and configuration of the application. It's called right after the application gets configured. - -

    -

    expressCreateServer#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. app - the main express application object (helpful for adding new paths and such)
    2. -
    3. server - the http server object
    4. -
    -

    This hook gets called after the application object has been created, but before it starts listening. This is similar to the expressConfigure hook, but it's not guaranteed that the application object will have all relevant configuration variables. - -

    -

    eejsBlock_<name>#

    -

    Called from: src/node/eejs/index.js - -

    -

    Things in context: - -

    -
      -
    1. content - the content of the block
    2. -
    -

    This hook gets called upon the rendering of an ejs template block. For any specific kind of block, you can change how that block gets rendered by modifying the content object passed in. - -

    -

    Have a look at src/templates/pad.html and src/templates/timeslider.html to see which blocks are available. - -

    -

    padCreate#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when a new pad was created. - -

    -

    padLoad#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when an pad was loaded. If a new pad was created and loaded this event will be emitted too. - -

    -

    padUpdate#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when an existing pad was updated. - -

    -

    padRemove#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. padID
    2. -
    -

    This hook gets called when an existing pad was removed/deleted. - -

    -

    socketio#

    -

    Called from: src/node/hooks/express/socketio.js - -

    -

    Things in context: - -

    -
      -
    1. app - the application object
    2. -
    3. io - the socketio object
    4. -
    5. server - the http server object
    6. -
    -

    I have no idea what this is useful for, someone else will have to add this description. - -

    -

    authorize#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    7. resource - the path being accessed
    8. -
    -

    This is useful for modifying the way authentication is done, especially for specific paths. - -

    -

    authenticate#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    7. username - the username used (optional)
    8. -
    9. password - the password used (optional)
    10. -
    -

    This is useful for modifying the way authentication is done. - -

    -

    authFailure#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    -

    This is useful for modifying the way authentication is done. - -

    -

    handleMessage#

    -

    Called from: src/node/handler/PadMessageHandler.js - -

    -

    Things in context: - -

    -
      -
    1. message - the message being handled
    2. -
    3. client - the client object from socket.io
    4. -
    -

    This hook will be called once a message arrive. If a plugin calls callback(null) the message will be dropped. However it is not possible to modify the message. - -

    -

    Plugins may also decide to implement custom behavior once a message arrives. - -

    -

    WARNING: handleMessage 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 handleMessage ( hook, context, callback ) {
    -  if ( context.message.type == 'USERINFO_UPDATE' ) {
    -    // If the message type is USERINFO_UPDATE, drop the message
    -    callback(null);
    -  }else{
    -    callback();
    -  }
    -};
    -

    clientVars#

    -

    Called from: src/node/handler/PadMessageHandler.js - -

    -

    Things in context: - -

    -
      -
    1. clientVars - the basic clientVars built by the core
    2. -
    3. pad - the pad this session is about
    4. -
    -

    This hook will be called once a client connects and the clientVars are being sent. Plugins can use this hook to give the client a initial configuriation, like the tracking-id of an external analytics-tool that is used on the client-side. You can also overwrite values from the original clientVars. - -

    -

    Example: - -

    -
    exports.clientVars = function(hook, context, callback)
    -{
    -  // tell the client which year we are in
    -  return callback({ "currentYear": new Date().getFullYear() });
    -};
    -

    This can be accessed on the client-side using clientVars.currentYear. - -

    -

    getLineHTMLForExport#

    -

    Called from: src/node/utils/ExportHtml.js - -

    -

    Things in context: - -

    -
      -
    1. apool - pool object
    2. -
    3. attribLine - line attributes
    4. -
    5. text - line text
    6. -
    -

    This hook will allow a plug-in developer to re-write each line when exporting to HTML. - -

    - -
    - - - - diff --git a/out/doc/api/http_api.html b/out/doc/api/http_api.html deleted file mode 100644 index cf27680c..00000000 --- a/out/doc/api/http_api.html +++ /dev/null @@ -1,712 +0,0 @@ - - - - - HTTP API - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    HTTP API#

    -

    What can I do with this API?#

    -

    The API gives another web application control of the pads. The basic functions are - -

    -
      -
    • create/delete pads
    • -
    • grant/forbid access to pads
    • -
    • get/set pad content
    • -
    -

    The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to etherpad lite. Means: Your web application still has to do authentication, but you can tell etherpad lite via the api, which visitors should get which permissions. This allows etherpad lite to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website. - -

    -

    Take a look at HTTP API client libraries to see if a library in your favorite language. - -

    -

    Examples#

    -

    Example 1#

    -

    A portal (such as WordPress) wants to give a user access to a new pad. Let's assume the user have the internal id 7 and his name is michael. - -

    -

    Portal maps the internal userid to an etherpad author. - -

    -
    -

    Request: http://pad.domain/api/1/createAuthorIfNotExistsFor?apikey=secret&name=Michael&authorMapper=7 - -

    -

    Response: {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal maps the internal userid to an etherpad group: - -

    -
    -

    Request: http://pad.domain/api/1/createGroupIfNotExistsFor?apikey=secret&groupMapper=7 - -

    -

    Response: {code: 0, message:"ok", data: {groupID: "g.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal creates a pad in the userGroup - -

    -
    -

    Request: http://pad.domain/api/1/createGroupPad?apikey=secret&groupID=g.s8oes9dhwrvt0zif&padName=samplePad&text=This is the first sentence in the pad - -

    -

    Response: {code: 0, message:"ok", data: null} - -

    -
    -

    Portal starts the session for the user on the group: - -

    -
    -

    Request: http://pad.domain/api/1/createSession?apikey=secret&groupID=g.s8oes9dhwrvt0zif&authorID=a.s8oes9dhwrvt0zif&validUntil=1312201246 - -

    -

    Response: {"data":{"sessionID": "s.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal places the cookie "sessionID" with the given value on the client and creates an iframe including the pad. - -

    -

    Example 2#

    -

    A portal (such as WordPress) wants to transform the contents of a pad that multiple admins edited into a blog post. - -

    -

    Portal retrieves the contents of the pad for entry into the db as a blog post: - -

    -
    -

    Request: http://pad.domain/api/1/getText?apikey=secret&padID=g.s8oes9dhwrvt0zif$123 - -

    -

    Response: {code: 0, message:"ok", data: {text:"Welcome Text"}} - -

    -
    -

    Portal submits content into new blog post - -

    -
    -

    Portal.AddNewBlog(content) - - -

    -
    -

    Usage#

    -

    API version#

    -

    The latest version is 1.2.7 - -

    -

    The current version can be queried via /api. - -

    -

    Request Format#

    -

    The API is accessible via HTTP. HTTP Requests are in the format /api/$APIVERSION/$FUNCTIONNAME. Parameters are transmitted via HTTP GET. $APIVERSION depends on the endpoints you want to use. - -

    -

    Response Format#

    -

    Responses are valid JSON in the following format: - -

    -
    {
    -  "code": number,
    -  "message": string,
    -  "data": obj
    -}
    -
      -
    • code a return code
        -
      • 0 everything ok
      • -
      • 1 wrong parameters
      • -
      • 2 internal error
      • -
      • 3 no such function
      • -
      • 4 no or wrong API Key
      • -
      -
    • -
    • message a status message. Its ok if everything is fine, else it contains an error message
    • -
    • data the payload
    • -
    -

    Overview#

    -

    API Overview - -

    -

    Data Types#

    -
      -
    • groupID a string, the unique id of a group. Format is g.16RANDOMCHARS, for example g.s8oes9dhwrvt0zif
    • -
    • sessionID a string, the unique id of a session. Format is s.16RANDOMCHARS, for example s.s8oes9dhwrvt0zif
    • -
    • authorID a string, the unique id of an author. Format is a.16RANDOMCHARS, for example a.s8oes9dhwrvt0zif
    • -
    • readOnlyID a string, the unique id of an readonly relation to a pad. Format is r.16RANDOMCHARS, for example r.s8oes9dhwrvt0zif
    • -
    • padID a string, format is GROUPID$PADNAME, for example the pad test of group g.s8oes9dhwrvt0zif has padID g.s8oes9dhwrvt0zif$test
    • -
    -

    Authentication#

    -

    Authentication works via a token that is sent with each request as a post parameter. There is a single token per Etherpad-Lite deployment. This token will be random string, generated by Etherpad-Lite at the first start. It will be saved in APIKEY.txt in the root folder of Etherpad Lite. Only Etherpad Lite and the requesting application knows this key. Token management will not be exposed through this API. - -

    -

    Node Interoperability#

    -

    All functions will also be available through a node module accessable from other node.js applications. - -

    -

    JSONP#

    -

    The API provides JSONP support to allow requests from a server in a different domain. -Simply add &jsonp=? to the API call. - -

    -

    Example usage: http://api.jquery.com/jQuery.getJSON/ - -

    -

    API Methods#

    -

    Groups#

    -

    Pads can belong to a group. The padID of grouppads is starting with a groupID like g.asdfasdfasdfasdf$test - -

    -

    createGroup()#

    -
      -
    • API >= 1
    • -
    -

    creates a new group - -

    -

    Example returns: - * {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}} - -

    -

    createGroupIfNotExistsFor(groupMapper)#

    -
      -
    • API >= 1
    • -
    -

    this functions helps you to map your application group ids to etherpad lite group ids - -

    -

    Example returns: - * {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}} - -

    -

    deleteGroup(groupID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a group - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    listPads(groupID)#

    -
      -
    • API >= 1
    • -
    -

    returns all pads of this group - -

    -

    Example returns: - {code: 0, message:"ok", data: {padIDs : ["g.s8oes9dhwrvt0zif$test", "g.s8oes9dhwrvt0zif$test2"]} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    createGroupPad(groupID, padName [, text])#

    -
      -
    • API >= 1
    • -
    -

    creates a new pad in this group - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"pad does already exist", data: null} - * {code: 1, message:"groupID does not exist", data: null} - -

    -

    listAllGroups()#

    -
      -
    • API >= 1.1
    • -
    -

    lists all existing groups - -

    -

    Example returns: - {code: 0, message:"ok", data: {groupIDs: ["g.mKjkmnAbSMtCt8eL", "g.3ADWx6sbGuAiUmCy"]}} - {code: 0, message:"ok", data: {groupIDs: []}} - -

    -

    Author#

    -

    These authors are bound to the attributes the users choose (color and name). - -

    -

    createAuthor([name])#

    -
      -
    • API >= 1
    • -
    -

    creates a new author - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -

    createAuthorIfNotExistsFor(authorMapper [, name])#

    -
      -
    • API >= 1
    • -
    -

    this functions helps you to map your application author ids to etherpad lite author ids - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -

    listPadsOfAuthor(authorID)#

    -
      -
    • API >= 1
    • -
    -

    returns an array of all pads this author contributed to - -

    -

    Example returns: - {code: 0, message:"ok", data: {padIDs: ["g.s8oes9dhwrvt0zif$test", "g.s8oejklhwrvt0zif$foo"]}} - {code: 1, message:"authorID does not exist", data: null} - -

    -

    getAuthorName(authorID)#

    -
      -
    • API >= 1.1
    • -
    -

    Returns the Author Name of the author - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorName: "John McLear"}} - -

    -

    -> can't be deleted cause this would involve scanning all the pads where this author was - -

    -

    Session#

    -

    Sessions can be created between a group and an author. This allows an author to access more than one group. The sessionID will be set as a cookie to the client and is valid until a certain date. The session cookie can also contain multiple comma-seperated sessionIDs, allowing a user to edit pads in different groups at the same time. Only users with a valid session for this group, can access group pads. You can create a session after you authenticated the user at your web application, to give them access to the pads. You should save the sessionID of this session and delete it after the user logged out. - -

    -

    createSession(groupID, authorID, validUntil)#

    -
      -
    • API >= 1
    • -
    -

    creates a new session. validUntil is an unix timestamp in seconds - -

    -

    Example returns: - {code: 0, message:"ok", data: {sessionID: "s.s8oes9dhwrvt0zif"}} - {code: 1, message:"groupID doesn't exist", data: null} - {code: 1, message:"authorID doesn't exist", data: null} - {code: 1, message:"validUntil is in the past", data: null} - -

    -

    deleteSession(sessionID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a session - -

    -

    Example returns: - {code: 1, message:"ok", data: null} - {code: 1, message:"sessionID does not exist", data: null} - -

    -

    getSessionInfo(sessionID)#

    -
      -
    • API >= 1
    • -
    -

    returns informations about a session - -

    -

    Example returns: - {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif", groupID: g.s8oes9dhwrvt0zif, validUntil: 1312201246}} - {code: 1, message:"sessionID does not exist", data: null} - -

    -

    listSessionsOfGroup(groupID)#

    -
      -
    • API >= 1
    • -
    -

    returns all sessions of a group - -

    -

    Example returns: - {"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    listSessionsOfAuthor(authorID)#

    -
      -
    • API >= 1
    • -
    -

    returns all sessions of an author - -

    -

    Example returns: - {"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}} - {code: 1, message:"authorID does not exist", data: null} - -

    -

    Pad Content#

    -

    Pad content can be updated and retrieved through the API - -

    -

    getText(padID, [rev])#

    -
      -
    • API >= 1
    • -
    -

    returns the text of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {text:"Welcome Text"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setText(padID, text)#

    -
      -
    • API >= 1
    • -
    -

    sets the text of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - * {code: 1, message:"text too long", data: null} - -

    -

    getHTML(padID, [rev])#

    -
      -
    • API >= 1
    • -
    -

    returns the text of a pad formatted as HTML - -

    -

    Example returns: - {code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    Chat#

    -

    getChatHistory(padID, [start, end])#

    -
      -
    • API >= 1.2.7
    • -
    -

    returns - -

    -
      -
    • a part of the chat history, when start and end are given
    • -
    • the whole chat histroy, when no extra parameters are given
    • -
    -

    Example returns: - -

    -
      -
    • {"code":0,"message":"ok","data":{"messages":[{"text":"foo","userId":"a.foo","time":1359199533759,"userName":"test"},{"text":"bar","userId":"a.foo","time":1359199534622,"userName":"test"}]}}
    • -
    • {code: 1, message:"start is higher or equal to the current chatHead", data: null}
    • -
    • {code: 1, message:"padID does not exist", data: null}
    • -
    -

    getChatHead(padID)#

    -
      -
    • API >= 1.2.7
    • -
    -

    returns the chatHead (last number of the last chat-message) of the pad - - -

    -

    Example returns: - -

    -
      -
    • {code: 0, message:"ok", data: {chatHead: 42}}
    • -
    • {code: 1, message:"padID does not exist", data: null}
    • -
    -

    Pad#

    -

    Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and its forbidden for normal pads to include a $ in the name. - -

    -

    createPad(padID [, text])#

    -
      -
    • API >= 1
    • -
    -

    creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad. - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"pad does already exist", data: null} - -

    -

    getRevisionsCount(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the number of revisions of this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {revisions: 56}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    padUsersCount(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the number of user that are currently editing this pad - -

    -

    Example returns: - * {code: 0, message:"ok", data: {padUsersCount: 5}} - -

    -

    padUsers(padID)#

    -
      -
    • API >= 1.1
    • -
    -

    returns the list of users that are currently editing this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {padUsers: [{colorId:"#c1a9d9","name":"username1","timestamp":1345228793126,"id":"a.n4gEeMLsvg12452n"},{"colorId":"#d9a9cd","name":"Hmmm","timestamp":1345228796042,"id":"a.n4gEeMLsvg12452n"}]}} - {code: 0, message:"ok", data: {padUsers: []}} - -

    -

    deletePad(padID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getReadOnlyID(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the read only link of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {readOnlyID: "r.s8oes9dhwrvt0zif"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setPublicStatus(padID, publicStatus)#

    -
      -
    • API >= 1
    • -
    -

    sets a boolean for the public status of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getPublicStatus(padID)#

    -
      -
    • API >= 1
    • -
    -

    return true of false - -

    -

    Example returns: - {code: 0, message:"ok", data: {publicStatus: true}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setPassword(padID, password)#

    -
      -
    • API >= 1
    • -
    -

    returns ok or a error message - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    isPasswordProtected(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns true or false - -

    -

    Example returns: - {code: 0, message:"ok", data: {passwordProtection: true}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    listAuthorsOfPad(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns an array of authors who contributed to this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {authorIDs : ["a.s8oes9dhwrvt0zif", "a.akf8finncvomlqva"]} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getLastEdited(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the timestamp of the last revision of the pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {lastEdited: 1340815946602}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    sendClientsMessage(padID, msg)#

    -
      -
    • API >= 1.1
    • -
    -

    sends a custom message of type msg to the pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    checkToken()#

    -
      -
    • API >= 1.2
    • -
    -

    returns ok when the current api token is valid - -

    -

    Example returns: - {"code":0,"message":"ok","data":null} - {"code":4,"message":"no or wrong API Key","data":null} - -

    -

    Pads#

    -

    listAllPads()#

    -
      -
    • API >= 1.2.1
    • -
    -

    lists all pads on this epl instance - -

    -

    Example returns: - * {code: 0, message:"ok", data: ["testPad", "thePadsOfTheOthers"]} -

    - -
    - - - - diff --git a/out/doc/api/pluginfw.html b/out/doc/api/pluginfw.html deleted file mode 100644 index 7c0ab4ed..00000000 --- a/out/doc/api/pluginfw.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - Plugin Framework - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    Plugin Framework#

    -

    require("ep_etherpad-lite/static/js/plugingfw/plugins") - -

    -

    plugins.update#

    -

    require("ep_etherpad-lite/static/js/plugingfw/plugins").update() will use npm to list all installed modules and read their ep.json files, registering the contained hooks. -A hook registration is a pairs of a hook name and a function reference (filename for require() plus function name) - -

    -

    hooks.callAll#

    -

    require("ep_etherpad-lite/static/js/plugingfw/hooks").callAll("hook_name", {argname:value}) will call all hook functions registered for hook_name with {argname:value}. - -

    -

    hooks.aCallAll#

    -

    ? - -

    -

    ...#

    - -
    - - - - diff --git a/out/doc/assets/style.css b/out/doc/assets/style.css deleted file mode 100644 index fe1343af..00000000 --- a/out/doc/assets/style.css +++ /dev/null @@ -1,44 +0,0 @@ -body.apidoc { - width: 60%; - min-width: 10cm; - margin: 0 auto; -} - -#header { - background-color: #5a5; - padding: 10px; - color: #111; -} - -a, -a:active { - color: #272; -} -a:focus, -a:hover { - color: #050; -} - -#apicontent a.mark, -#apicontent a.mark:active { - float: right; - color: #BBB; - font-size: 0.7cm; - text-decoration: none; -} -#apicontent a.mark:focus, -#apicontent a.mark:hover { - color: #AAA; -} - -#apicontent code { - padding: 1px; - background-color: #EEE; - border-radius: 4px; - border: 1px solid #DDD; -} -#apicontent pre>code { - display: block; - overflow: auto; - padding: 5px; -} \ No newline at end of file diff --git a/out/doc/custom_static.html b/out/doc/custom_static.html deleted file mode 100644 index eb37d3bc..00000000 --- a/out/doc/custom_static.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Custom static files - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    Custom static files#

    -

    Etherpad Lite allows you to include your own static files in the browser, by modifying the files in static/custom. - -

    -
      -
    • index.js Javascript that'll be run in /
    • -
    • index.css Stylesheet affecting /
    • -
    • pad.js Javascript that'll be run in /p/:padid
    • -
    • pad.css Stylesheet affecting /p/:padid
    • -
    • timeslider.js Javascript that'll be run in /p/:padid/timeslider
    • -
    • timeslider.css Stylesheet affecting /p/:padid/timeslider
    • -
    • favicon.ico Overrides the default favicon.
    • -
    • robots.txt Overrides the default robots.txt.
    • -
    - -
    - - - - diff --git a/out/doc/database.html b/out/doc/database.html deleted file mode 100644 index 940d5b39..00000000 --- a/out/doc/database.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - Database structure - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Database structure#

    -

    Keys and their values#

    -

    groups#

    -

    A list of all existing groups (a JSON object with groupIDs as keys and 1 as values). - -

    -

    pad:$PADID#

    -

    Saves all informations about pads - -

    -
      -
    • atext - the latest attributed text
    • -
    • pool - the attribute pool
    • -
    • head - the number of the latest revision
    • -
    • chatHead - the number of the latest chat entry
    • -
    • public - flag that disables security for this pad
    • -
    • passwordHash - string that contains a bcrypt hashed password for this pad
    • -
    -

    pad:$PADID:revs:$REVNUM#

    -

    Saves a revision $REVNUM of pad $PADID - -

    -
      -
    • meta
        -
      • author - the autorID of this revision
      • -
      • timestamp - the timestamp of when this revision was created
      • -
      -
    • -
    • changeset - the changeset of this revision
    • -
    -

    pad:$PADID:chat:$CHATNUM#

    -

    Saves a chatentry with num $CHATNUM of pad $PADID - -

    -
      -
    • text - the text of this chat entry
    • -
    • userId - the autorID of this chat entry
    • -
    • time - the timestamp of this chat entry
    • -
    -

    pad2readonly:$PADID#

    -

    Translates a padID to a readonlyID -

    -

    readonly2pad:$READONLYID#

    -

    Translates a readonlyID to a padID -

    -

    token2author:$TOKENID#

    -

    Translates a token to an authorID -

    -

    globalAuthor:$AUTHORID#

    -

    Information about an author - -

    -
      -
    • name - the name of this author as shown in the pad
    • -
    • colorID - the colorID of this author as shown in the pad
    • -
    -

    mapper2group:$MAPPER#

    -

    Maps an external application identifier to an internal group -

    -

    mapper2author:$MAPPER#

    -

    Maps an external application identifier to an internal author -

    -

    group:$GROUPID#

    -

    a group of pads - -

    -
      -
    • pads - object with pad names in it, values are 1

      session:$SESSIONID#

      -a session between an author and a group
    • -
    -
      -
    • groupID - the groupID the session belongs too
    • -
    • authorID - the authorID the session belongs too
    • -
    • validUntil - the timestamp until this session is valid
    • -
    -

    author2sessions:$AUTHORID#

    -

    saves the sessions of an author - -

    -
      -
    • sessionsIDs - object with sessionIDs in it, values are 1
    • -
    -

    group2sessions:$GROUPID#

    -
      -
    • sessionsIDs - object with sessionIDs in it, values are 1
    • -
    - -
    - - - - diff --git a/out/doc/documentation.html b/out/doc/documentation.html deleted file mode 100644 index bcbf1ff0..00000000 --- a/out/doc/documentation.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - About this Documentation - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    About this Documentation#

    - - -

    The goal of this documentation is to comprehensively explain Etherpad-Lite, -both from a reference as well as a conceptual point of view. - -

    -

    Where appropriate, property types, method arguments, and the arguments -provided to event handlers are detailed in a list underneath the topic -heading. - -

    -

    Every .html file is generated based on the corresponding -.markdown file in the doc/api/ folder in the source tree. The -documentation is generated using the tools/doc/generate.js program. -The HTML template is located at doc/template.html.

    - -
    - - - - diff --git a/out/doc/easysync/README.html b/out/doc/easysync/README.html deleted file mode 100644 index ba387b43..00000000 --- a/out/doc/easysync/README.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - About this folder - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    About this folder#

    -

    We put all documentations we found about the old Etherpad together in this folder. Most of this is still valid for Etherpad Lite

    - -
    - - - - diff --git a/out/doc/index.html b/out/doc/index.html deleted file mode 100644 index 84a72334..00000000 --- a/out/doc/index.html +++ /dev/null @@ -1,2202 +0,0 @@ - - - - - About this Documentation - Etherpad Lite v1.2.81 Manual & Documentation - - - - - -
    -

    Table of Contents

    - - -
    - -
    -

    About this Documentation#

    - - -

    The goal of this documentation is to comprehensively explain Etherpad-Lite, -both from a reference as well as a conceptual point of view. - -

    -

    Where appropriate, property types, method arguments, and the arguments -provided to event handlers are detailed in a list underneath the topic -heading. - -

    -

    Every .html file is generated based on the corresponding -.markdown file in the doc/api/ folder in the source tree. The -documentation is generated using the tools/doc/generate.js program. -The HTML template is located at doc/template.html. -

    -

    Localization#

    -

    Etherpad lite provides a multi-language user interface, that's apart from your users' content, so users from different countries can collaborate on a single document, while still having the user interface displayed in their mother tongue. - - -

    -

    Translating#

    -

    We rely on http://translatewiki.net to handle the translation process for us, so if you'd like to help... - -

    -
      -
    1. sign up at http://translatewiki.net
    2. -
    3. Visit our TWN project page
    4. -
    5. Click on Translate Etherpad lite interface
    6. -
    7. Choose a target language, you'd like to translate our interface to, and hit Fetch
    8. -
    9. Start translating!
    10. -
    -

    Translations will be send back to us regularly and will eventually appear in the next release. - -

    -

    Implementation#

    -

    Server-side#

    -

    /src/locales contains files for all supported languages which contain the translated strings. Translation files are simple *.json files and look like this: - -

    -
    { "pad.modals.connected": "Connect�."
    -, "pad.modals.uderdup": "Ouvrir dans une nouvelle fen�tre."
    -, "pad.toolbar.unindent.title": "D�sindenter"
    -, "pad.toolbar.undo.title": "Annuler (Ctrl-Z)"
    -, "timeslider.pageTitle": "{{appTitle}} Curseur temporel"
    -, ...
    -}
    -

    Each translation consists of a key (the id of the string that is to be translated) and the translated string. Terms in curly braces must not be touched but left as they are, since they represent a dynamically changing part of the string like a variable. Imagine a message welcoming a user: Welcome, {{userName}}! would be translated as Ahoy, {{userName}}! in pirate. - -

    -

    Client-side#

    -

    We use a language cookie to save your language settings if you change them. If you don't, we autodetect your locale using information from your browser. Now, that we know your preferred language this information is feeded into a very nice library called html10n.js, which loads the appropriate translations and applies them to our templates, providing translation params, pluralization, include rules and even a nice javascript API along the way. - - - -

    -

    Localizing plugins#

    -

    1. Mark the strings to translate#

    -

    In the template files of your plugin, change all hardcoded messages/strings... - -

    -

    from: -

    -
    <option value="0">Heading 1</option>
    -

    to: -

    -
    <option data-l10n-id="ep_heading.h1" value="0"></option>
    -

    In the javascript files of your plugin, chaneg all hardcoded messages/strings... - -

    -

    from: -

    -
    alert ('Chat');
    -

    to: -

    -
    alert(window._('pad.chat'));
    -

    2. Create translate files in the locales directory of your plugin#

    -
      -
    • The name of the file must be the language code of the language it contains translations for (see supported lang codes; e.g. en ? English, es ? Spanish...)
    • -
    • The extension of the file must be .json
    • -
    • The default language is English, so your plugin should always provide en.json
    • -
    • In order to avoid naming conflicts, your message keys should start with the name of your plugin followed by a dot (see below)

      -
    • -
    • ep_your-plugin/locales/en.json*

      -
      <span class="type"> "ep_your-plugin.h1": "Heading 1"
      -</span>
      -
    • -
    • ep_your-plugin/locales/es.json*

      -
      <span class="type"> "ep_your-plugin.h1": "T�tulo 1"
      -</span>
      -
    • -
    -

    Everytime the http server is started, it will auto-detect your messages and merge them automatically with the core messages. - -

    -

    Overwrite core messages#

    -

    You can overwrite Etherpad Lite's core messages in your plugin's locale files. -For example, if you want to replace Chat with Notes, simply add... - -

    -

    ep_your-plugin/locales/en.json -

    -
    { "ep_your-plugin.h1": "Heading 1"
    -, "pad.chat": "Notes"
    -}
    -

    Custom static files#

    -

    Etherpad Lite allows you to include your own static files in the browser, by modifying the files in static/custom. - -

    -
      -
    • index.js Javascript that'll be run in /
    • -
    • index.css Stylesheet affecting /
    • -
    • pad.js Javascript that'll be run in /p/:padid
    • -
    • pad.css Stylesheet affecting /p/:padid
    • -
    • timeslider.js Javascript that'll be run in /p/:padid/timeslider
    • -
    • timeslider.css Stylesheet affecting /p/:padid/timeslider
    • -
    • favicon.ico Overrides the default favicon.
    • -
    • robots.txt Overrides the default robots.txt.

      Embed parameters#

      -You can easily embed your etherpad-lite into any webpage by using iframes. You can configure the embedded pad using embed paramters.
    • -
    -

    Example: - -

    -

    Cut and paste the following code into any webpage to embed a pad. The parameters below will hide the chat and the line numbers. - -

    -
    <iframe src='http://pad.test.de/p/PAD_NAME?showChat=false&showLineNumbers=false' width=600 height=400></iframe>
    -

    showLineNumbers#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    showControls#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    showChat#

    -
      -
    • Boolean
    • -
    -

    Default: true - -

    -

    useMonospaceFont#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    userName#

    -
      -
    • String
    • -
    -

    Default: "unnamed" - -

    -

    Example: userName=Etherpad%20User - -

    -

    userColor#

    -
      -
    • String (css hex color value)
    • -
    -

    Default: randomly chosen by pad server - -

    -

    Example: userColor=%23ff9900 - -

    -

    noColors#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    alwaysShowChat#

    -
      -
    • Boolean
    • -
    -

    Default: false - -

    -

    lang#

    -
      -
    • String
    • -
    -

    Default: en - -

    -

    Example: lang=ar (translates the interface into Arabic) - -

    -

    rtl#

    -
      -
    • Boolean
    • -
    -

    Default: true -Displays pad text from right to left. - - -

    -

    HTTP API#

    -

    What can I do with this API?#

    -

    The API gives another web application control of the pads. The basic functions are - -

    -
      -
    • create/delete pads
    • -
    • grant/forbid access to pads
    • -
    • get/set pad content
    • -
    -

    The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to etherpad lite. Means: Your web application still has to do authentication, but you can tell etherpad lite via the api, which visitors should get which permissions. This allows etherpad lite to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website. - -

    -

    Take a look at HTTP API client libraries to see if a library in your favorite language. - -

    -

    Examples#

    -

    Example 1#

    -

    A portal (such as WordPress) wants to give a user access to a new pad. Let's assume the user have the internal id 7 and his name is michael. - -

    -

    Portal maps the internal userid to an etherpad author. - -

    -
    -

    Request: http://pad.domain/api/1/createAuthorIfNotExistsFor?apikey=secret&name=Michael&authorMapper=7 - -

    -

    Response: {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal maps the internal userid to an etherpad group: - -

    -
    -

    Request: http://pad.domain/api/1/createGroupIfNotExistsFor?apikey=secret&groupMapper=7 - -

    -

    Response: {code: 0, message:"ok", data: {groupID: "g.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal creates a pad in the userGroup - -

    -
    -

    Request: http://pad.domain/api/1/createGroupPad?apikey=secret&groupID=g.s8oes9dhwrvt0zif&padName=samplePad&text=This is the first sentence in the pad - -

    -

    Response: {code: 0, message:"ok", data: null} - -

    -
    -

    Portal starts the session for the user on the group: - -

    -
    -

    Request: http://pad.domain/api/1/createSession?apikey=secret&groupID=g.s8oes9dhwrvt0zif&authorID=a.s8oes9dhwrvt0zif&validUntil=1312201246 - -

    -

    Response: {"data":{"sessionID": "s.s8oes9dhwrvt0zif"}} - -

    -
    -

    Portal places the cookie "sessionID" with the given value on the client and creates an iframe including the pad. - -

    -

    Example 2#

    -

    A portal (such as WordPress) wants to transform the contents of a pad that multiple admins edited into a blog post. - -

    -

    Portal retrieves the contents of the pad for entry into the db as a blog post: - -

    -
    -

    Request: http://pad.domain/api/1/getText?apikey=secret&padID=g.s8oes9dhwrvt0zif$123 - -

    -

    Response: {code: 0, message:"ok", data: {text:"Welcome Text"}} - -

    -
    -

    Portal submits content into new blog post - -

    -
    -

    Portal.AddNewBlog(content) - - -

    -
    -

    Usage#

    -

    API version#

    -

    The latest version is 1.2.7 - -

    -

    The current version can be queried via /api. - -

    -

    Request Format#

    -

    The API is accessible via HTTP. HTTP Requests are in the format /api/$APIVERSION/$FUNCTIONNAME. Parameters are transmitted via HTTP GET. $APIVERSION depends on the endpoints you want to use. - -

    -

    Response Format#

    -

    Responses are valid JSON in the following format: - -

    -
    {
    -  "code": number,
    -  "message": string,
    -  "data": obj
    -}
    -
      -
    • code a return code
        -
      • 0 everything ok
      • -
      • 1 wrong parameters
      • -
      • 2 internal error
      • -
      • 3 no such function
      • -
      • 4 no or wrong API Key
      • -
      -
    • -
    • message a status message. Its ok if everything is fine, else it contains an error message
    • -
    • data the payload
    • -
    -

    Overview#

    -

    API Overview - -

    -

    Data Types#

    -
      -
    • groupID a string, the unique id of a group. Format is g.16RANDOMCHARS, for example g.s8oes9dhwrvt0zif
    • -
    • sessionID a string, the unique id of a session. Format is s.16RANDOMCHARS, for example s.s8oes9dhwrvt0zif
    • -
    • authorID a string, the unique id of an author. Format is a.16RANDOMCHARS, for example a.s8oes9dhwrvt0zif
    • -
    • readOnlyID a string, the unique id of an readonly relation to a pad. Format is r.16RANDOMCHARS, for example r.s8oes9dhwrvt0zif
    • -
    • padID a string, format is GROUPID$PADNAME, for example the pad test of group g.s8oes9dhwrvt0zif has padID g.s8oes9dhwrvt0zif$test
    • -
    -

    Authentication#

    -

    Authentication works via a token that is sent with each request as a post parameter. There is a single token per Etherpad-Lite deployment. This token will be random string, generated by Etherpad-Lite at the first start. It will be saved in APIKEY.txt in the root folder of Etherpad Lite. Only Etherpad Lite and the requesting application knows this key. Token management will not be exposed through this API. - -

    -

    Node Interoperability#

    -

    All functions will also be available through a node module accessable from other node.js applications. - -

    -

    JSONP#

    -

    The API provides JSONP support to allow requests from a server in a different domain. -Simply add &jsonp=? to the API call. - -

    -

    Example usage: http://api.jquery.com/jQuery.getJSON/ - -

    -

    API Methods#

    -

    Groups#

    -

    Pads can belong to a group. The padID of grouppads is starting with a groupID like g.asdfasdfasdfasdf$test - -

    -

    createGroup()#

    -
      -
    • API >= 1
    • -
    -

    creates a new group - -

    -

    Example returns: - * {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}} - -

    -

    createGroupIfNotExistsFor(groupMapper)#

    -
      -
    • API >= 1
    • -
    -

    this functions helps you to map your application group ids to etherpad lite group ids - -

    -

    Example returns: - * {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}} - -

    -

    deleteGroup(groupID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a group - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    listPads(groupID)#

    -
      -
    • API >= 1
    • -
    -

    returns all pads of this group - -

    -

    Example returns: - {code: 0, message:"ok", data: {padIDs : ["g.s8oes9dhwrvt0zif$test", "g.s8oes9dhwrvt0zif$test2"]} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    createGroupPad(groupID, padName [, text])#

    -
      -
    • API >= 1
    • -
    -

    creates a new pad in this group - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"pad does already exist", data: null} - * {code: 1, message:"groupID does not exist", data: null} - -

    -

    listAllGroups()#

    -
      -
    • API >= 1.1
    • -
    -

    lists all existing groups - -

    -

    Example returns: - {code: 0, message:"ok", data: {groupIDs: ["g.mKjkmnAbSMtCt8eL", "g.3ADWx6sbGuAiUmCy"]}} - {code: 0, message:"ok", data: {groupIDs: []}} - -

    -

    Author#

    -

    These authors are bound to the attributes the users choose (color and name). - -

    -

    createAuthor([name])#

    -
      -
    • API >= 1
    • -
    -

    creates a new author - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -

    createAuthorIfNotExistsFor(authorMapper [, name])#

    -
      -
    • API >= 1
    • -
    -

    this functions helps you to map your application author ids to etherpad lite author ids - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}} - -

    -

    listPadsOfAuthor(authorID)#

    -
      -
    • API >= 1
    • -
    -

    returns an array of all pads this author contributed to - -

    -

    Example returns: - {code: 0, message:"ok", data: {padIDs: ["g.s8oes9dhwrvt0zif$test", "g.s8oejklhwrvt0zif$foo"]}} - {code: 1, message:"authorID does not exist", data: null} - -

    -

    getAuthorName(authorID)#

    -
      -
    • API >= 1.1
    • -
    -

    Returns the Author Name of the author - -

    -

    Example returns: - * {code: 0, message:"ok", data: {authorName: "John McLear"}} - -

    -

    -> can't be deleted cause this would involve scanning all the pads where this author was - -

    -

    Session#

    -

    Sessions can be created between a group and an author. This allows an author to access more than one group. The sessionID will be set as a cookie to the client and is valid until a certain date. The session cookie can also contain multiple comma-seperated sessionIDs, allowing a user to edit pads in different groups at the same time. Only users with a valid session for this group, can access group pads. You can create a session after you authenticated the user at your web application, to give them access to the pads. You should save the sessionID of this session and delete it after the user logged out. - -

    -

    createSession(groupID, authorID, validUntil)#

    -
      -
    • API >= 1
    • -
    -

    creates a new session. validUntil is an unix timestamp in seconds - -

    -

    Example returns: - {code: 0, message:"ok", data: {sessionID: "s.s8oes9dhwrvt0zif"}} - {code: 1, message:"groupID doesn't exist", data: null} - {code: 1, message:"authorID doesn't exist", data: null} - {code: 1, message:"validUntil is in the past", data: null} - -

    -

    deleteSession(sessionID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a session - -

    -

    Example returns: - {code: 1, message:"ok", data: null} - {code: 1, message:"sessionID does not exist", data: null} - -

    -

    getSessionInfo(sessionID)#

    -
      -
    • API >= 1
    • -
    -

    returns informations about a session - -

    -

    Example returns: - {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif", groupID: g.s8oes9dhwrvt0zif, validUntil: 1312201246}} - {code: 1, message:"sessionID does not exist", data: null} - -

    -

    listSessionsOfGroup(groupID)#

    -
      -
    • API >= 1
    • -
    -

    returns all sessions of a group - -

    -

    Example returns: - {"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}} - {code: 1, message:"groupID does not exist", data: null} - -

    -

    listSessionsOfAuthor(authorID)#

    -
      -
    • API >= 1
    • -
    -

    returns all sessions of an author - -

    -

    Example returns: - {"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}} - {code: 1, message:"authorID does not exist", data: null} - -

    -

    Pad Content#

    -

    Pad content can be updated and retrieved through the API - -

    -

    getText(padID, [rev])#

    -
      -
    • API >= 1
    • -
    -

    returns the text of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {text:"Welcome Text"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setText(padID, text)#

    -
      -
    • API >= 1
    • -
    -

    sets the text of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - * {code: 1, message:"text too long", data: null} - -

    -

    getHTML(padID, [rev])#

    -
      -
    • API >= 1
    • -
    -

    returns the text of a pad formatted as HTML - -

    -

    Example returns: - {code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    Chat#

    -

    getChatHistory(padID, [start, end])#

    -
      -
    • API >= 1.2.7
    • -
    -

    returns - -

    -
      -
    • a part of the chat history, when start and end are given
    • -
    • the whole chat histroy, when no extra parameters are given
    • -
    -

    Example returns: - -

    -
      -
    • {"code":0,"message":"ok","data":{"messages":[{"text":"foo","userId":"a.foo","time":1359199533759,"userName":"test"},{"text":"bar","userId":"a.foo","time":1359199534622,"userName":"test"}]}}
    • -
    • {code: 1, message:"start is higher or equal to the current chatHead", data: null}
    • -
    • {code: 1, message:"padID does not exist", data: null}
    • -
    -

    getChatHead(padID)#

    -
      -
    • API >= 1.2.7
    • -
    -

    returns the chatHead (last number of the last chat-message) of the pad - - -

    -

    Example returns: - -

    -
      -
    • {code: 0, message:"ok", data: {chatHead: 42}}
    • -
    • {code: 1, message:"padID does not exist", data: null}
    • -
    -

    Pad#

    -

    Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and its forbidden for normal pads to include a $ in the name. - -

    -

    createPad(padID [, text])#

    -
      -
    • API >= 1
    • -
    -

    creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad. - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"pad does already exist", data: null} - -

    -

    getRevisionsCount(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the number of revisions of this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {revisions: 56}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    padUsersCount(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the number of user that are currently editing this pad - -

    -

    Example returns: - * {code: 0, message:"ok", data: {padUsersCount: 5}} - -

    -

    padUsers(padID)#

    -
      -
    • API >= 1.1
    • -
    -

    returns the list of users that are currently editing this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {padUsers: [{colorId:"#c1a9d9","name":"username1","timestamp":1345228793126,"id":"a.n4gEeMLsvg12452n"},{"colorId":"#d9a9cd","name":"Hmmm","timestamp":1345228796042,"id":"a.n4gEeMLsvg12452n"}]}} - {code: 0, message:"ok", data: {padUsers: []}} - -

    -

    deletePad(padID)#

    -
      -
    • API >= 1
    • -
    -

    deletes a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getReadOnlyID(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the read only link of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {readOnlyID: "r.s8oes9dhwrvt0zif"}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setPublicStatus(padID, publicStatus)#

    -
      -
    • API >= 1
    • -
    -

    sets a boolean for the public status of a pad - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getPublicStatus(padID)#

    -
      -
    • API >= 1
    • -
    -

    return true of false - -

    -

    Example returns: - {code: 0, message:"ok", data: {publicStatus: true}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    setPassword(padID, password)#

    -
      -
    • API >= 1
    • -
    -

    returns ok or a error message - -

    -

    Example returns: - {code: 0, message:"ok", data: null} - {code: 1, message:"padID does not exist", data: null} - -

    -

    isPasswordProtected(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns true or false - -

    -

    Example returns: - {code: 0, message:"ok", data: {passwordProtection: true}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    listAuthorsOfPad(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns an array of authors who contributed to this pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {authorIDs : ["a.s8oes9dhwrvt0zif", "a.akf8finncvomlqva"]} - {code: 1, message:"padID does not exist", data: null} - -

    -

    getLastEdited(padID)#

    -
      -
    • API >= 1
    • -
    -

    returns the timestamp of the last revision of the pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {lastEdited: 1340815946602}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    sendClientsMessage(padID, msg)#

    -
      -
    • API >= 1.1
    • -
    -

    sends a custom message of type msg to the pad - -

    -

    Example returns: - {code: 0, message:"ok", data: {}} - {code: 1, message:"padID does not exist", data: null} - -

    -

    checkToken()#

    -
      -
    • API >= 1.2
    • -
    -

    returns ok when the current api token is valid - -

    -

    Example returns: - {"code":0,"message":"ok","data":null} - {"code":4,"message":"no or wrong API Key","data":null} - -

    -

    Pads#

    -

    listAllPads()#

    -
      -
    • API >= 1.2.1
    • -
    -

    lists all pads on this epl instance - -

    -

    Example returns: - * {code: 0, message:"ok", data: ["testPad", "thePadsOfTheOthers"]} - -

    -

    Hooks#

    -

    All hooks are called with two arguments: - -

    -
      -
    1. name - the name of the hook being called
    2. -
    3. context - an object with some relevant information about the context of the call
    4. -
    -

    Return values#

    -

    A hook should always return a list or undefined. Returning undefined is equivalent to returning an empty list. -All the returned lists are appended to each other, so if the return values where [1, 2], undefined, [3, 4,], undefined and [5], the value returned by callHook would be [1, 2, 3, 4, 5]. - -

    -

    This is, because it should never matter if you have one plugin or several plugins doing some work - a single plugin should be able to make callHook return the same value a set of plugins are able to return collectively. So, any plugin can return a list of values, of any length, not just one value. -

    -

    Client-side hooks#

    -

    Most of these hooks are called during or in order to set up the formatting process. - -

    -

    documentReady#

    -

    Called from: src/templates/pad.html - -

    -

    Things in context: - -

    -

    nothing - -

    -

    This hook proxies the functionality of jQuery's $(document).ready event. - -

    -

    aceDomLineProcessLineAttributes#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. domline - The current DOM line being processed
    2. -
    3. cls - The class of the current block element (useful for styling)
    4. -
    -

    This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. - -

    -

    The return value of this hook should have the following structure: - -

    -

    { preHtml: String, postHtml: String, processedMarker: Boolean } - -

    -

    The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more. - -

    -

    aceCreateDomLine#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. domline - the current DOM line being processed
    2. -
    3. cls - The class of the current element (useful for styling)
    4. -
    -

    This hook is called for any line being processed by the formatting engine, unless the aceDomLineProcessLineAttributes hook from above returned true, in which case this hook is skipped. - -

    -

    The return value of this hook should have the following structure: - -

    -

    { extraOpenTags: String, extraCloseTags: String, cls: String } - -

    -

    extraOpenTags and extraCloseTags will be added before and after the element in question, and cls will be the new class of the element going forward. - -

    -

    acePostWriteDomLineHTML#

    -

    Called from: src/static/js/domline.js - -

    -

    Things in context: - -

    -
      -
    1. node - the DOM node that just got written to the page
    2. -
    -

    This hook is for right after a node has been fully formatted and written to the page. - -

    -

    aceAttribsToClasses#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. key - the current attribute being processed
    4. -
    5. value - the value of the attribute being processed
    6. -
    -

    This hook is called during the attribute processing procedure, and should be used to translate key, value pairs into valid HTML classes that can be inserted into the DOM. - -

    -

    The return value for this function should be a list of classes, which will then be parsed into a valid class string. - -

    -

    aceGetFilterStack#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. browser - an object indicating which browser is accessing the page
    4. -
    -

    This hook is called to apply custom regular expression filters to a set of styles. The one example available is the ep_linkify plugin, which adds internal links. They use it to find the telltale [[ ]] syntax that signifies internal links, and finding that syntax, they add in the internalHref attribute to be later used by the aceCreateDomLine hook (documented above). - -

    -

    aceEditorCSS#

    -

    Called from: src/static/js/ace.js - -

    -

    Things in context: None - -

    -

    This hook is provided to allow custom CSS files to be loaded. The return value should be an array of paths relative to the plugins directory. - -

    -

    aceInitInnerdocbodyHead#

    -

    Called from: src/static/js/ace.js - -

    -

    Things in context: - -

    -
      -
    1. iframeHTML - the HTML of the editor iframe up to this point, in array format
    2. -
    -

    This hook is called during the creation of the editor HTML. The array should have lines of HTML added to it, giving the plugin author a chance to add in meta, script, link, and other tags that go into the <head> element of the editor HTML document. - -

    -

    aceEditEvent#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. documentAttributeManager - information about attributes in the document (this is a mystery to me)
    8. -
    -

    This hook is made available to edit the edit events that might occur when changes are made. Currently you can change the editor information, some of the meanings of the edit, and so on. You can also make internal changes (internal to your plugin) that use the information provided by the edit event. - -

    -

    aceRegisterBlockElements#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: None - -

    -

    The return value of this hook will add elements into the "lineMarkerAttribute" category, making the aceDomLineProcessLineAttributes hook (documented below) call for those elements. - -

    -

    aceInitialized#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. editorInfo - information about the user who will be making changes through the interface, and a way to insert functions into the main ace object (see ep_headings)
    2. -
    3. rep - information about where the user's cursor is
    4. -
    5. documentAttributeManager - some kind of magic
    6. -
    -

    This hook is for inserting further information into the ace engine, for later use in formatting hooks. - -

    -

    postAceInit#

    -

    Called from: src/static/js/pad.js - -

    -

    Things in context: - -

    -
      -
    1. ace - the ace object that is applied to this editor.
    2. -
    -

    There doesn't appear to be any example available of this particular hook being used, but it gets fired after the editor is all set up. - -

    -

    postTimesliderInit#

    -

    Called from: src/static/js/timeslider.js - -

    -

    There doesn't appear to be any example available of this particular hook being used, but it gets fired after the timeslider is all set up. - -

    -

    userJoinOrUpdate#

    -

    Called from: src/static/js/pad_userlist.js - -

    -

    Things in context: - -

    -
      -
    1. info - the user information
    2. -
    -

    This hook is called on the client side whenever a user joins or changes. This can be used to create notifications or an alternate user list. - -

    -

    collectContentPre#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. style - the style applied to the node (probably CSS)
    8. -
    9. cls - the HTML class string of the node
    10. -
    -

    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. - -

    -

    collectContentPost#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. style - the style applied to the node (probably CSS)
    8. -
    9. cls - the HTML class string of the node
    10. -
    -

    This hook is called after 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. - -

    -

    handleClientMessage_name#

    -

    Called from: src/static/js/collab_client.js - -

    -

    Things in context: - -

    -
      -
    1. payload - the data that got sent with the message (use it for custom message content)
    2. -
    -

    This hook gets called every time the client receives a message of type name. This can most notably be used with the new HTTP API call, "sendClientsMessage", which sends a custom message type to all clients connected to a pad. You can also use this to handle existing types. - -

    -

    collab_client.js has a pretty extensive list of message types, if you want to take a look. - -

    -

    aceStartLineAndCharForPoint-aceEndLineAndCharForPoint#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. root - the span element of the current line
    8. -
    9. point - the starting/ending element where the cursor highlights
    10. -
    11. documentAttributeManager - information about attributes in the document
    12. -
    -

    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#

    -

    Called from: src/static/js/ace2_inner.js - -

    -

    Things in context: - -

    -
      -
    1. callstack - a bunch of information about the current action
    2. -
    3. editorInfo - information about the user who is making the change
    4. -
    5. rep - information about where the change is being made
    6. -
    7. documentAttributeManager - information about attributes in the document
    8. -
    9. evt - the fired event
    10. -
    -

    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#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    7. text - the text for that line
    8. -
    -

    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#

    -

    Called from: src/static/js/contentcollector.js - -

    -

    Things in context: - -

    -
      -
    1. cc - the contentcollector object
    2. -
    3. state - the current state of the change being made
    4. -
    5. tname - the tag name of this node currently being processed
    6. -
    -

    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#

    -

    Called from: src/static/js/linestylefilter.js - -

    -

    Things in context: - -

    -
      -
    1. linestylefilter - the JavaScript object that's currently processing the ace attributes
    2. -
    3. text - the line text
    4. -
    5. class - line class
    6. -
    -

    This hook is provided to allow whether a given line should be deliniated with multiple authors. -Multiple authors in one line cause the creation of magic span lines. This might not suit you and -now you can disable it and handle your own deliniation. -The return value should be either true(disable) or false. - -

    -

    Server-side hooks#

    -

    These hooks are called on server-side. - -

    -

    loadSettings#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. settings - the settings object
    2. -
    -

    Use this hook to receive the global settings in your plugin. - -

    -

    pluginUninstall#

    -

    Called from: src/static/js/pluginfw/installer.js - -

    -

    Things in context: - -

    -
      -
    1. plugin_name - self-explanatory
    2. -
    -

    If this hook returns an error, the callback to the uninstall function gets an error as well. This mostly seems useful for handling additional features added in based on the installation of other plugins, which is pretty cool! - -

    -

    pluginInstall#

    -

    Called from: src/static/js/pluginfw/installer.js - -

    -

    Things in context: - -

    -
      -
    1. plugin_name - self-explanatory
    2. -
    -

    If this hook returns an error, the callback to the install function gets an error, too. This seems useful for adding in features when a particular plugin is installed. - -

    -

    init_<plugin name>#

    -

    Called from: src/static/js/pluginfw/plugins.js - -

    -

    Things in context: None - -

    -

    This function is called after a specific plugin is initialized. This would probably be more useful than the previous two functions if you only wanted to add in features to one specific plugin. - -

    -

    expressConfigure#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. app - the main application object
    2. -
    -

    This is a helpful hook for changing the behavior and configuration of the application. It's called right after the application gets configured. - -

    -

    expressCreateServer#

    -

    Called from: src/node/server.js - -

    -

    Things in context: - -

    -
      -
    1. app - the main express application object (helpful for adding new paths and such)
    2. -
    3. server - the http server object
    4. -
    -

    This hook gets called after the application object has been created, but before it starts listening. This is similar to the expressConfigure hook, but it's not guaranteed that the application object will have all relevant configuration variables. - -

    -

    eejsBlock_<name>#

    -

    Called from: src/node/eejs/index.js - -

    -

    Things in context: - -

    -
      -
    1. content - the content of the block
    2. -
    -

    This hook gets called upon the rendering of an ejs template block. For any specific kind of block, you can change how that block gets rendered by modifying the content object passed in. - -

    -

    Have a look at src/templates/pad.html and src/templates/timeslider.html to see which blocks are available. - -

    -

    padCreate#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when a new pad was created. - -

    -

    padLoad#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when an pad was loaded. If a new pad was created and loaded this event will be emitted too. - -

    -

    padUpdate#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. pad - the pad instance
    2. -
    -

    This hook gets called when an existing pad was updated. - -

    -

    padRemove#

    -

    Called from: src/node/db/Pad.js - -

    -

    Things in context: - -

    -
      -
    1. padID
    2. -
    -

    This hook gets called when an existing pad was removed/deleted. - -

    -

    socketio#

    -

    Called from: src/node/hooks/express/socketio.js - -

    -

    Things in context: - -

    -
      -
    1. app - the application object
    2. -
    3. io - the socketio object
    4. -
    5. server - the http server object
    6. -
    -

    I have no idea what this is useful for, someone else will have to add this description. - -

    -

    authorize#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    7. resource - the path being accessed
    8. -
    -

    This is useful for modifying the way authentication is done, especially for specific paths. - -

    -

    authenticate#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    7. username - the username used (optional)
    8. -
    9. password - the password used (optional)
    10. -
    -

    This is useful for modifying the way authentication is done. - -

    -

    authFailure#

    -

    Called from: src/node/hooks/express/webaccess.js - -

    -

    Things in context: - -

    -
      -
    1. req - the request object
    2. -
    3. res - the response object
    4. -
    5. next - ?
    6. -
    -

    This is useful for modifying the way authentication is done. - -

    -

    handleMessage#

    -

    Called from: src/node/handler/PadMessageHandler.js - -

    -

    Things in context: - -

    -
      -
    1. message - the message being handled
    2. -
    3. client - the client object from socket.io
    4. -
    -

    This hook will be called once a message arrive. If a plugin calls callback(null) the message will be dropped. However it is not possible to modify the message. - -

    -

    Plugins may also decide to implement custom behavior once a message arrives. - -

    -

    WARNING: handleMessage 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 handleMessage ( hook, context, callback ) {
    -  if ( context.message.type == 'USERINFO_UPDATE' ) {
    -    // If the message type is USERINFO_UPDATE, drop the message
    -    callback(null);
    -  }else{
    -    callback();
    -  }
    -};
    -

    clientVars#

    -

    Called from: src/node/handler/PadMessageHandler.js - -

    -

    Things in context: - -

    -
      -
    1. clientVars - the basic clientVars built by the core
    2. -
    3. pad - the pad this session is about
    4. -
    -

    This hook will be called once a client connects and the clientVars are being sent. Plugins can use this hook to give the client a initial configuriation, like the tracking-id of an external analytics-tool that is used on the client-side. You can also overwrite values from the original clientVars. - -

    -

    Example: - -

    -
    exports.clientVars = function(hook, context, callback)
    -{
    -  // tell the client which year we are in
    -  return callback({ "currentYear": new Date().getFullYear() });
    -};
    -

    This can be accessed on the client-side using clientVars.currentYear. - -

    -

    getLineHTMLForExport#

    -

    Called from: src/node/utils/ExportHtml.js - -

    -

    Things in context: - -

    -
      -
    1. apool - pool object
    2. -
    3. attribLine - line attributes
    4. -
    5. text - line text
    6. -
    -

    This hook will allow a plug-in developer to re-write each line when exporting to HTML. - - -

    -

    editorInfo#

    -

    editorInfo.ace_replaceRange(start, end, text)#

    -

    This function replaces a range (from start to end) with text. - -

    -

    editorInfo.ace_getRep()#

    -

    Returns the rep object. - -

    -

    editorInfo.ace_getAuthor()#

    -

    editorInfo.ace_inCallStack()#

    -

    editorInfo.ace_inCallStackIfNecessary(?)#

    -

    editorInfo.ace_focus(?)#

    -

    editorInfo.ace_importText(?)#

    -

    editorInfo.ace_importAText(?)#

    -

    editorInfo.ace_exportText(?)#

    -

    editorInfo.ace_editorChangedSize(?)#

    -

    editorInfo.ace_setOnKeyPress(?)#

    -

    editorInfo.ace_setOnKeyDown(?)#

    -

    editorInfo.ace_setNotifyDirty(?)#

    -

    editorInfo.ace_dispose(?)#

    -

    editorInfo.ace_getFormattedCode(?)#

    -

    editorInfo.ace_setEditable(bool)#

    -

    editorInfo.ace_execCommand(?)#

    -

    editorInfo.ace_callWithAce(fn, callStack, normalize)#

    -

    editorInfo.ace_setProperty(key, value)#

    -

    editorInfo.ace_setBaseText(txt)#

    -

    editorInfo.ace_setBaseAttributedText(atxt, apoolJsonObj)#

    -

    editorInfo.ace_applyChangesToBase(c, optAuthor, apoolJsonObj)#

    -

    editorInfo.ace_prepareUserChangeset()#

    -

    editorInfo.ace_applyPreparedChangesetToBase()#

    -

    editorInfo.ace_setUserChangeNotificationCallback(f)#

    -

    editorInfo.ace_setAuthorInfo(author, info)#

    -

    editorInfo.ace_setAuthorSelectionRange(author, start, end)#

    -

    editorInfo.ace_getUnhandledErrors()#

    -

    editorInfo.ace_getDebugProperty(prop)#

    -

    editorInfo.ace_fastIncorp(?)#

    -

    editorInfo.ace_isCaret(?)#

    -

    editorInfo.ace_getLineAndCharForPoint(?)#

    -

    editorInfo.ace_performDocumentApplyAttributesToCharRange(?)#

    -

    editorInfo.ace_setAttributeOnSelection(?)#

    -

    editorInfo.ace_toggleAttributeOnSelection(?)#

    -

    editorInfo.ace_performSelectionChange(?)#

    -

    editorInfo.ace_doIndentOutdent(?)#

    -

    editorInfo.ace_doUndoRedo(?)#

    -

    editorInfo.ace_doInsertUnorderedList(?)#

    -

    editorInfo.ace_doInsertOrderedList(?)#

    -

    editorInfo.ace_performDocumentApplyAttributesToRange()#

    -

    editorInfo.ace_getAuthorInfos()#

    -

    Returns an info object about the author. Object key = author_id and info includes author's bg color value. -Use to define your own authorship. -

    -

    editorInfo.ace_performDocumentReplaceRange(start, end, newText)#

    -

    This function replaces a range (from [x1,y1] to [x2,y2]) with newText. -

    -

    editorInfo.ace_performDocumentReplaceCharRange(startChar, endChar, newText)#

    -

    This function replaces a range (from y1 to y2) with newText. -

    -

    editorInfo.ace_renumberList(lineNum)#

    -

    If you delete a line, calling this method will fix the line numbering. -

    -

    editorInfo.ace_doReturnKey()#

    -

    Forces a return key at the current carret position. -

    -

    editorInfo.ace_isBlockElement(element)#

    -

    Returns true if your passed elment is registered as a block element -

    -

    editorInfo.ace_getLineListType(lineNum)#

    -

    Returns the line's html list type. -

    -

    editorInfo.ace_caretLine()#

    -

    Returns X position of the caret. -

    -

    editorInfo.ace_caretColumn()#

    -

    Returns Y position of the caret. -

    -

    editorInfo.ace_caretDocChar()#

    -

    Returns the Y offset starting from [x=0,y=0] -

    -

    editorInfo.ace_isWordChar(?)#

    -

    Changeset Library#

    -
    "Z:z>1|2=m=b*0|1+1$\n"
    -

    This is a Changeset. Its just a string and its very difficult to read in this form. But the Changeset Library gives us some tools to read it. - -

    -

    A changeset describes the diff between two revisions of the document. The Browser sends changesets to the server and the server sends them to the clients to update them. This Changesets gets also saved into the history of a pad. Which allows us to go back to every revision from the past. - -

    -

    Changeset.unpack(changeset)#

    -
      -
    • changeset String
    • -
    -

    This functions returns an object representaion of the changeset, similar to this: - -

    -
    { oldLen: 35, newLen: 36, ops: '|2=m=b*0|1+1', charBank: '\n' }
    -
      -
    • oldLen {Number} the original length of the document.
    • -
    • newLen {Number} the length of the document after the changeset is applied.
    • -
    • ops {String} the actual changes, introduced by this changeset.
    • -
    • charBank {String} All characters that are added by this changeset.
    • -
    -

    Changeset.opIterator(ops)#

    -
      -
    • ops String The operators, returned by Changeset.unpack()
    • -
    -

    Returns an operator iterator. This iterator allows us to iterate over all operators that are in the changeset. - -

    -

    You can iterate with an opIterator using its next() and hasNext() methods. Next returns the next() operator object and hasNext() indicates, whether there are any operators left. - -

    -

    The Operator object#

    -

    There are 3 types of operators: +,- and =. These operators describe different changes to the document, beginning with the first character of the document. A = operator doesn't change the text, but it may add or remove text attributes. A - operator removes text. And a + Operator adds text and optionally adds some attributes to it. - -

    -
      -
    • opcode {String} the operator type
    • -
    • chars {Number} the length of the text changed by this operator.
    • -
    • lines {Number} the number of lines changed by this operator.
    • -
    • attribs {attribs} attributes set on this text.
    • -
    -

    Example#

    -
    { opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '*0' }
    -

    APool#

    -
    > var AttributePoolFactory = require("./utils/AttributePoolFactory");
    -> var apool = AttributePoolFactory.createAttributePool();
    -> console.log(apool)
    -{ numToAttrib: {},
    -  attribToNum: {},
    -  nextNum: 0,
    -  putAttrib: [Function],
    -  getAttrib: [Function],
    -  getAttribKey: [Function],
    -  getAttribValue: [Function],
    -  eachAttrib: [Function],
    -  toJsonable: [Function],
    -  fromJsonable: [Function] }
    -

    This creates an empty apool. A apool saves which attributes were used during the history of a pad. There is one apool for each pad. It only saves the attributes that were really used, it doesn't save unused attributes. Lets fill this apool with some values - -

    -
    > apool.fromJsonable({"numToAttrib":{"0":["author","a.kVnWeomPADAT2pn9"],"1":["bold","true"],"2":["italic","true"]},"nextNum":3});
    -> console.log(apool)
    -{ numToAttrib: 
    -   { '0': [ 'author', 'a.kVnWeomPADAT2pn9' ],
    -     '1': [ 'bold', 'true' ],
    -     '2': [ 'italic', 'true' ] },
    -  attribToNum: 
    -   { 'author,a.kVnWeomPADAT2pn9': 0,
    -     'bold,true': 1,
    -     'italic,true': 2 },
    -  nextNum: 3,
    -  putAttrib: [Function],
    -  getAttrib: [Function],
    -  getAttribKey: [Function],
    -  getAttribValue: [Function],
    -  eachAttrib: [Function],
    -  toJsonable: [Function],
    -  fromJsonable: [Function] }
    -

    We used the fromJsonable function to fill the empty apool with values. the fromJsonable and toJsonable functions are used to serialize and deserialize an apool. You can see that it stores the relation between numbers and attributes. So for example the attribute 1 is the attribute bold and vise versa. A attribute is always a key value pair. For stuff like bold and italic its just 'italic':'true'. For authors its author:$AUTHORID. So a character can be bold and italic. But it can't belong to multiple authors - -

    -
    > apool.getAttrib(1)
    -[ 'bold', 'true' ]
    -

    Simple example of how to get the key value pair for the attribute 1 - -

    -

    AText#

    -
    > var atext = {"text":"bold text\nitalic text\nnormal text\n\n","attribs":"*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2"};
    -> console.log(atext)
    -{ text: 'bold text\nitalic text\nnormal text\n\n',
    -  attribs: '*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2' }
    -

    This is an atext. An atext has two parts: text and attribs. The text is just the text of the pad as a string. We will look closer at the attribs at the next steps - -

    -
    > var opiterator = Changeset.opIterator(atext.attribs)
    -> console.log(opiterator)
    -{ next: [Function: next],
    -  hasNext: [Function: hasNext],
    -  lastIndex: [Function: lastIndex] }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 9,
    -  lines: 0,
    -  attribs: '*0*1' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '*0' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 11,
    -  lines: 0,
    -  attribs: '*0*1*2' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 1,
    -  lines: 1,
    -  attribs: '' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 11,
    -  lines: 0,
    -  attribs: '*0' }
    -> opiterator.next()
    -{ opcode: '+',
    -  chars: 2,
    -  lines: 2,
    -  attribs: '' }
    -

    The attribs are again a bunch of operators like .ops in the changeset was. But these operators are only + operators. They describe which part of the text has which attributes - -

    -

    For more information see /doc/easysync/easysync-notes.txt in the source. - -

    -

    Plugin Framework#

    -

    require("ep_etherpad-lite/static/js/plugingfw/plugins") - -

    -

    plugins.update#

    -

    require("ep_etherpad-lite/static/js/plugingfw/plugins").update() will use npm to list all installed modules and read their ep.json files, registering the contained hooks. -A hook registration is a pairs of a hook name and a function reference (filename for require() plus function name) - -

    -

    hooks.callAll#

    -

    require("ep_etherpad-lite/static/js/plugingfw/hooks").callAll("hook_name", {argname:value}) will call all hook functions registered for hook_name with {argname:value}. - -

    -

    hooks.aCallAll#

    -

    ? - -

    -

    ...#

    -

    Plugins#

    -

    Etherpad-Lite allows you to extend its functionality with plugins. A plugin registers hooks (functions) for certain events (thus certain features) in Etherpad-lite to execute its own functionality based on these events. - -

    -

    Publicly available plugins can be found in the npm registry (see http://npmjs.org). Etherpad-lite's naming convention for plugins is to prefix your plugins with ep_. So, e.g. it's ep_flubberworms. Thus you can install plugins from npm, using npm install ep_flubberworm in etherpad-lite's root directory. - -

    -

    You can also browse to http://yourEtherpadInstan.ce/admin/plugins, which will list all installed plugins and those available on npm. It even provides functionality to search through all available plugins. - -

    -

    Folder structure#

    -

    A basic plugin usually has the following folder structure: -

    -
    ep_<plugin>/
    - | static/
    - | templates/
    - | locales/
    - + ep.json
    - + package.json
    -

    If your plugin includes client-side hooks, put them in static/js/. If you're adding in CSS or image files, you should put those files in static/css/ and static/image/, respectively, and templates go into templates/. Translations go into locales/ - -

    -

    A Standard directory structure like this makes it easier to navigate through your code. That said, do note, that this is not actually required to make your plugin run. If you want to make use of our i18n system, you need to put your translations into locales/, though, in order to have them intergated. (See "Localization" for more info on how to localize your plugin) - -

    -

    Plugin definition#

    -

    Your plugin definition goes into ep.json. In this file you register your hooks, indicate the parts of your plugin and the order of execution. (A documentation of all available events to hook into can be found in chapter hooks.) - -

    -

    A hook registration is a pairs of a hook name and a function reference (filename to require() + exported function name) - -

    -
    {
    -  "parts": [
    -    {
    -      "name": "nameThisPartHoweverYouWant",
    -      "hooks": {
    -        "authenticate" : "ep_<plugin>/<file>:FUNCTIONNAME1",
    -        "expressCreateServer": "ep_<plugin>/<file>:FUNCTIONNAME2"
    -      },
    -      "client_hooks": {
    -        "acePopulateDOMLine": "ep_plugin/<file>:FUNCTIONNAME3"
    -      }
    -    }
    -  ]
    -}
    -

    Etherpad-lite will expect the part of the hook definition before the colon to be a javascript file and will try to require it. The part after the colon is expected to be a valid function identifier of that module. So, you have to export your hooks, using module.exports and register it in ep.json as ep_<plugin>/path/to/<file>:FUNCTIONNAME. -You can omit the FUNCTIONNAME part, if the exported function has got the same name as the hook. So "authorize" : "ep_flubberworm/foo" will call the function exports.authorize in ep_flubberworm/foo.js - -

    -

    Client hooks and server hooks#

    -

    There are server hooks, which will be executed on the server (e.g. expressCreateServer), and there are client hooks, which are executed on the client (e.g. acePopulateDomLine). Be sure to not make assumptions about the environment your code is running in, e.g. don't try to access process, if you know your code will be run on the client, and likewise, don't try to access window on the server... - -

    -

    Parts#

    -

    As your plugins become more and more complex, you will find yourself in the need to manage dependencies between plugins. E.g. you want the hooks of a certain plugin to be executed before (or after) yours. You can also manage these dependencies in your plugin definition file ep.json: - -

    -
    {
    -  "parts": [
    -    {
    -      "name": "onepart",
    -      "pre": [],
    -      "post": ["ep_onemoreplugin/partone"]
    -      "hooks": {
    -        "storeBar": "ep_monospace/plugin:storeBar",
    -        "getFoo": "ep_monospace/plugin:getFoo",
    -      }
    -    },
    -    {
    -      "name": "otherpart",
    -      "pre": ["ep_my_example/somepart", "ep_otherplugin/main"],
    -      "post": [],
    -      "hooks": {
    -        "someEvent": "ep_my_example/otherpart:someEvent",
    -        "another": "ep_my_example/otherpart:another"
    -      }
    -    }
    -  ]
    -}
    -

    Usually a plugin will add only one functionality at a time, so it will probably only use one part definition to register its hooks. However, sometimes you have to put different (unrelated) functionalities into one plugin. For this you will want use parts, so other plugins can depend on them. - -

    -

    pre/post#

    -

    The "pre" and "post" definitions, affect the order in which parts of a plugin are executed. This ensures that plugins and their hooks are executed in the correct order. - -

    -

    "pre" lists parts that must be executed before the defining part. "post" lists parts that must be executed after the defining part. - -

    -

    You can, on a basic level, think of this as double-ended dependency listing. If you have a dependency on another plugin, you can make sure it loads before yours by putting it in "pre". If you are setting up things that might need to be used by a plugin later, you can ensure proper order by putting it in "post". - -

    -

    Note that it would be far more sane to use "pre" in almost any case, but if you want to change config variables for another plugin, or maybe modify its environment, "post" could definitely be useful. - -

    -

    Also, note that dependencies should also be listed in your package.json, so they can be npm install'd automagically when your plugin gets installed. - -

    -

    Package definition#

    -

    Your plugin must also contain a package definition file, called package.json, in the project root - this file contains various metadata relevant to your plugin, such as the name and version number, author, project hompage, contributors, a short description, etc. If you publish your plugin on npm, these metadata are used for package search etc., but it's necessary for Etherpad-lite plugins, even if you don't publish your plugin. - -

    -
    {
    -  "name": "ep_PLUGINNAME",
    -  "version": "0.0.1",
    -  "description": "DESCRIPTION",
    -  "author": "USERNAME (REAL NAME) <MAIL@EXAMPLE.COM>",
    -  "contributors": [],
    -  "dependencies": {"MODULE": "0.3.20"},
    -  "engines": { "node": ">= 0.6.0"}
    -}
    -

    Templates#

    -

    If your plugin adds or modifies the front end HTML (e.g. adding buttons or changing their functions), you should put the necessary HTML code for such operations in templates/, in files of type ".ejs", since Etherpad-Lite uses EJS for HTML templating. See the following link for more information about EJS: https://github.com/visionmedia/ejs. - -

    -

    Writing and running front-end tests for your plugin#

    -

    Etherpad allows you to easily create front-end tests for plugins. - -

    -
      -
    1. Create a new folder
      %your_plugin%/static/tests/frontend/specs
      -
    2. -
    3. Put your spec file in here (Example spec files are visible in %etherpad_root_folder%/frontend/tests/specs)

      -
    4. -
    5. Visit http://yourserver.com/frontend/tests your front-end tests will run.

      -
    6. -
    -

    Database structure#

    -

    Keys and their values#

    -

    groups#

    -

    A list of all existing groups (a JSON object with groupIDs as keys and 1 as values). - -

    -

    pad:$PADID#

    -

    Saves all informations about pads - -

    -
      -
    • atext - the latest attributed text
    • -
    • pool - the attribute pool
    • -
    • head - the number of the latest revision
    • -
    • chatHead - the number of the latest chat entry
    • -
    • public - flag that disables security for this pad
    • -
    • passwordHash - string that contains a bcrypt hashed password for this pad
    • -
    -

    pad:$PADID:revs:$REVNUM#

    -

    Saves a revision $REVNUM of pad $PADID - -

    -
      -
    • meta
        -
      • author - the autorID of this revision
      • -
      • timestamp - the timestamp of when this revision was created
      • -
      -
    • -
    • changeset - the changeset of this revision
    • -
    -

    pad:$PADID:chat:$CHATNUM#

    -

    Saves a chatentry with num $CHATNUM of pad $PADID - -

    -
      -
    • text - the text of this chat entry
    • -
    • userId - the autorID of this chat entry
    • -
    • time - the timestamp of this chat entry
    • -
    -

    pad2readonly:$PADID#

    -

    Translates a padID to a readonlyID -

    -

    readonly2pad:$READONLYID#

    -

    Translates a readonlyID to a padID -

    -

    token2author:$TOKENID#

    -

    Translates a token to an authorID -

    -

    globalAuthor:$AUTHORID#

    -

    Information about an author - -

    -
      -
    • name - the name of this author as shown in the pad
    • -
    • colorID - the colorID of this author as shown in the pad
    • -
    -

    mapper2group:$MAPPER#

    -

    Maps an external application identifier to an internal group -

    -

    mapper2author:$MAPPER#

    -

    Maps an external application identifier to an internal author -

    -

    group:$GROUPID#

    -

    a group of pads - -

    -
      -
    • pads - object with pad names in it, values are 1

      session:$SESSIONID#

      -a session between an author and a group
    • -
    -
      -
    • groupID - the groupID the session belongs too
    • -
    • authorID - the authorID the session belongs too
    • -
    • validUntil - the timestamp until this session is valid
    • -
    -

    author2sessions:$AUTHORID#

    -

    saves the sessions of an author - -

    -
      -
    • sessionsIDs - object with sessionIDs in it, values are 1
    • -
    -

    group2sessions:$GROUPID#

    -
      -
    • sessionsIDs - object with sessionIDs in it, values are 1
    • -
    - -
    - - - - diff --git a/out/doc/localization.html b/out/doc/localization.html deleted file mode 100644 index 58574984..00000000 --- a/out/doc/localization.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - Localization - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Localization#

    -

    Etherpad lite provides a multi-language user interface, that's apart from your users' content, so users from different countries can collaborate on a single document, while still having the user interface displayed in their mother tongue. - - -

    -

    Translating#

    -

    We rely on http://translatewiki.net to handle the translation process for us, so if you'd like to help... - -

    -
      -
    1. sign up at http://translatewiki.net
    2. -
    3. Visit our TWN project page
    4. -
    5. Click on Translate Etherpad lite interface
    6. -
    7. Choose a target language, you'd like to translate our interface to, and hit Fetch
    8. -
    9. Start translating!
    10. -
    -

    Translations will be send back to us regularly and will eventually appear in the next release. - -

    -

    Implementation#

    -

    Server-side#

    -

    /src/locales contains files for all supported languages which contain the translated strings. Translation files are simple *.json files and look like this: - -

    -
    { "pad.modals.connected": "Connect�."
    -, "pad.modals.uderdup": "Ouvrir dans une nouvelle fen�tre."
    -, "pad.toolbar.unindent.title": "D�sindenter"
    -, "pad.toolbar.undo.title": "Annuler (Ctrl-Z)"
    -, "timeslider.pageTitle": "{{appTitle}} Curseur temporel"
    -, ...
    -}
    -

    Each translation consists of a key (the id of the string that is to be translated) and the translated string. Terms in curly braces must not be touched but left as they are, since they represent a dynamically changing part of the string like a variable. Imagine a message welcoming a user: Welcome, {{userName}}! would be translated as Ahoy, {{userName}}! in pirate. - -

    -

    Client-side#

    -

    We use a language cookie to save your language settings if you change them. If you don't, we autodetect your locale using information from your browser. Now, that we know your preferred language this information is feeded into a very nice library called html10n.js, which loads the appropriate translations and applies them to our templates, providing translation params, pluralization, include rules and even a nice javascript API along the way. - - - -

    -

    Localizing plugins#

    -

    1. Mark the strings to translate#

    -

    In the template files of your plugin, change all hardcoded messages/strings... - -

    -

    from: -

    -
    <option value="0">Heading 1</option>
    -

    to: -

    -
    <option data-l10n-id="ep_heading.h1" value="0"></option>
    -

    In the javascript files of your plugin, chaneg all hardcoded messages/strings... - -

    -

    from: -

    -
    alert ('Chat');
    -

    to: -

    -
    alert(window._('pad.chat'));
    -

    2. Create translate files in the locales directory of your plugin#

    -
      -
    • The name of the file must be the language code of the language it contains translations for (see supported lang codes; e.g. en ? English, es ? Spanish...)
    • -
    • The extension of the file must be .json
    • -
    • The default language is English, so your plugin should always provide en.json
    • -
    • In order to avoid naming conflicts, your message keys should start with the name of your plugin followed by a dot (see below)

      -
    • -
    • ep_your-plugin/locales/en.json*

      -
      <span class="type"> "ep_your-plugin.h1": "Heading 1"
      -</span>
      -
    • -
    • ep_your-plugin/locales/es.json*

      -
      <span class="type"> "ep_your-plugin.h1": "T�tulo 1"
      -</span>
      -
    • -
    -

    Everytime the http server is started, it will auto-detect your messages and merge them automatically with the core messages. - -

    -

    Overwrite core messages#

    -

    You can overwrite Etherpad Lite's core messages in your plugin's locale files. -For example, if you want to replace Chat with Notes, simply add... - -

    -

    ep_your-plugin/locales/en.json -

    -
    { "ep_your-plugin.h1": "Heading 1"
    -, "pad.chat": "Notes"
    -}
    - -
    - - - - diff --git a/out/doc/plugins.html b/out/doc/plugins.html deleted file mode 100644 index e51e2070..00000000 --- a/out/doc/plugins.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Plugins - Etherpad Lite v1.2.81 Manual & Documentation - - - - - - - -
    -

    Plugins#

    -

    Etherpad-Lite allows you to extend its functionality with plugins. A plugin registers hooks (functions) for certain events (thus certain features) in Etherpad-lite to execute its own functionality based on these events. - -

    -

    Publicly available plugins can be found in the npm registry (see http://npmjs.org). Etherpad-lite's naming convention for plugins is to prefix your plugins with ep_. So, e.g. it's ep_flubberworms. Thus you can install plugins from npm, using npm install ep_flubberworm in etherpad-lite's root directory. - -

    -

    You can also browse to http://yourEtherpadInstan.ce/admin/plugins, which will list all installed plugins and those available on npm. It even provides functionality to search through all available plugins. - -

    -

    Folder structure#

    -

    A basic plugin usually has the following folder structure: -

    -
    ep_<plugin>/
    - | static/
    - | templates/
    - | locales/
    - + ep.json
    - + package.json
    -

    If your plugin includes client-side hooks, put them in static/js/. If you're adding in CSS or image files, you should put those files in static/css/ and static/image/, respectively, and templates go into templates/. Translations go into locales/ - -

    -

    A Standard directory structure like this makes it easier to navigate through your code. That said, do note, that this is not actually required to make your plugin run. If you want to make use of our i18n system, you need to put your translations into locales/, though, in order to have them intergated. (See "Localization" for more info on how to localize your plugin) - -

    -

    Plugin definition#

    -

    Your plugin definition goes into ep.json. In this file you register your hooks, indicate the parts of your plugin and the order of execution. (A documentation of all available events to hook into can be found in chapter hooks.) - -

    -

    A hook registration is a pairs of a hook name and a function reference (filename to require() + exported function name) - -

    -
    {
    -  "parts": [
    -    {
    -      "name": "nameThisPartHoweverYouWant",
    -      "hooks": {
    -        "authenticate" : "ep_<plugin>/<file>:FUNCTIONNAME1",
    -        "expressCreateServer": "ep_<plugin>/<file>:FUNCTIONNAME2"
    -      },
    -      "client_hooks": {
    -        "acePopulateDOMLine": "ep_plugin/<file>:FUNCTIONNAME3"
    -      }
    -    }
    -  ]
    -}
    -

    Etherpad-lite will expect the part of the hook definition before the colon to be a javascript file and will try to require it. The part after the colon is expected to be a valid function identifier of that module. So, you have to export your hooks, using module.exports and register it in ep.json as ep_<plugin>/path/to/<file>:FUNCTIONNAME. -You can omit the FUNCTIONNAME part, if the exported function has got the same name as the hook. So "authorize" : "ep_flubberworm/foo" will call the function exports.authorize in ep_flubberworm/foo.js - -

    -

    Client hooks and server hooks#

    -

    There are server hooks, which will be executed on the server (e.g. expressCreateServer), and there are client hooks, which are executed on the client (e.g. acePopulateDomLine). Be sure to not make assumptions about the environment your code is running in, e.g. don't try to access process, if you know your code will be run on the client, and likewise, don't try to access window on the server... - -

    -

    Parts#

    -

    As your plugins become more and more complex, you will find yourself in the need to manage dependencies between plugins. E.g. you want the hooks of a certain plugin to be executed before (or after) yours. You can also manage these dependencies in your plugin definition file ep.json: - -

    -
    {
    -  "parts": [
    -    {
    -      "name": "onepart",
    -      "pre": [],
    -      "post": ["ep_onemoreplugin/partone"]
    -      "hooks": {
    -        "storeBar": "ep_monospace/plugin:storeBar",
    -        "getFoo": "ep_monospace/plugin:getFoo",
    -      }
    -    },
    -    {
    -      "name": "otherpart",
    -      "pre": ["ep_my_example/somepart", "ep_otherplugin/main"],
    -      "post": [],
    -      "hooks": {
    -        "someEvent": "ep_my_example/otherpart:someEvent",
    -        "another": "ep_my_example/otherpart:another"
    -      }
    -    }
    -  ]
    -}
    -

    Usually a plugin will add only one functionality at a time, so it will probably only use one part definition to register its hooks. However, sometimes you have to put different (unrelated) functionalities into one plugin. For this you will want use parts, so other plugins can depend on them. - -

    -

    pre/post#

    -

    The "pre" and "post" definitions, affect the order in which parts of a plugin are executed. This ensures that plugins and their hooks are executed in the correct order. - -

    -

    "pre" lists parts that must be executed before the defining part. "post" lists parts that must be executed after the defining part. - -

    -

    You can, on a basic level, think of this as double-ended dependency listing. If you have a dependency on another plugin, you can make sure it loads before yours by putting it in "pre". If you are setting up things that might need to be used by a plugin later, you can ensure proper order by putting it in "post". - -

    -

    Note that it would be far more sane to use "pre" in almost any case, but if you want to change config variables for another plugin, or maybe modify its environment, "post" could definitely be useful. - -

    -

    Also, note that dependencies should also be listed in your package.json, so they can be npm install'd automagically when your plugin gets installed. - -

    -

    Package definition#

    -

    Your plugin must also contain a package definition file, called package.json, in the project root - this file contains various metadata relevant to your plugin, such as the name and version number, author, project hompage, contributors, a short description, etc. If you publish your plugin on npm, these metadata are used for package search etc., but it's necessary for Etherpad-lite plugins, even if you don't publish your plugin. - -

    -
    {
    -  "name": "ep_PLUGINNAME",
    -  "version": "0.0.1",
    -  "description": "DESCRIPTION",
    -  "author": "USERNAME (REAL NAME) <MAIL@EXAMPLE.COM>",
    -  "contributors": [],
    -  "dependencies": {"MODULE": "0.3.20"},
    -  "engines": { "node": ">= 0.6.0"}
    -}
    -

    Templates#

    -

    If your plugin adds or modifies the front end HTML (e.g. adding buttons or changing their functions), you should put the necessary HTML code for such operations in templates/, in files of type ".ejs", since Etherpad-Lite uses EJS for HTML templating. See the following link for more information about EJS: https://github.com/visionmedia/ejs. - -

    -

    Writing and running front-end tests for your plugin#

    -

    Etherpad allows you to easily create front-end tests for plugins. - -

    -
      -
    1. Create a new folder
      %your_plugin%/static/tests/frontend/specs
      -
    2. -
    3. Put your spec file in here (Example spec files are visible in %etherpad_root_folder%/frontend/tests/specs)

      -
    4. -
    5. Visit http://yourserver.com/frontend/tests your front-end tests will run.

      -
    6. -
    - -
    - - - - From 23abafb3cb61d8948a2392aa4beccff9e02e875d Mon Sep 17 00:00:00 2001 From: Sahil Amoli Date: Wed, 20 Mar 2013 15:39:10 -0700 Subject: [PATCH 155/463] Issue #1648 - Long lines without any spaces don't wrap on Firefox, the text ends up going off screen --- src/static/css/iframe_editor.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 3e19cbbe..1d9b61be 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -78,6 +78,7 @@ ul.list-indent8 { list-style-type: none; } body { margin: 0; white-space: nowrap; + word-wrap: normal; } #outerdocbody { @@ -93,6 +94,7 @@ body.grayedout { background-color: #eee !important } body.doesWrap { white-space: normal; + word-wrap: break-word; /* fix for issue #1648 - firefox not wrapping long lines (without spaces) correctly */ } #innerdocbody { From cbde18945cf3ce8b6f99d284b73b8a11285a0018 Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Fri, 22 Mar 2013 15:15:45 +0000 Subject: [PATCH 156/463] Bumped the ueberDB package version to 0.1.96 to add in Cassandra support. --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 8278734f..822676a3 100644 --- a/src/package.json +++ b/src/package.json @@ -16,7 +16,7 @@ "require-kernel" : "1.0.5", "resolve" : "0.2.x", "socket.io" : "0.9.x", - "ueberDB" : "0.1.95", + "ueberDB" : "0.1.96", "async" : "0.1.x", "express" : "3.x", "connect" : "2.4.x", From e050ad57e48916ca72a9378a5c4c641b45ec7f06 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 22 Mar 2013 17:39:22 +0000 Subject: [PATCH 157/463] fix typo --- bin/installDeps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/installDeps.sh b/bin/installDeps.sh index 2f97090b..fc3133c1 100755 --- a/bin/installDeps.sh +++ b/bin/installDeps.sh @@ -44,7 +44,7 @@ fi #check node version NODE_VERSION=$(node --version) NODE_V_MINOR=$(echo $NODE_VERSION | cut -d "." -f 1-2) -if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.6" && [ ! $NODE_V_MINOR = "v0.10" ]; then +if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.6" ] && [ ! $NODE_V_MINOR = "v0.10" ]; then echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.6.x, v0.8.x or v0.10.x" >&2 exit 1 fi From 0063933041ba7f5ac2c284e05e2520d53fd1835a Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 23 Mar 2013 02:59:12 +0000 Subject: [PATCH 158/463] fix cookies --- src/static/js/pad.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index e75d09b2..e5e6e95f 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -441,6 +441,7 @@ var pad = { //initialize the chat chat.init(this); + padcookie.init(); // initialize the cookies pad.initTime = +(new Date()); pad.padOptions = clientVars.initialOptions; From 35e489121797aebc265db6d9a56ad0545cfdf609 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 23 Mar 2013 13:26:38 +0000 Subject: [PATCH 159/463] Localisation updates from http://translatewiki.net. --- src/locales/be-tarask.json | 14 +++++++------- src/locales/el.json | 3 ++- src/locales/fa.json | 4 +++- src/locales/fi.json | 1 + src/locales/ml.json | 6 +++++- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json index dda41289..0b44115c 100644 --- a/src/locales/be-tarask.json +++ b/src/locales/be-tarask.json @@ -1,4 +1,10 @@ { + "@metadata": { + "authors": [ + "Jim-by", + "Wizardist" + ] + }, "index.newPad": "\u0421\u0442\u0432\u0430\u0440\u044b\u0446\u044c", "index.createOpenPad": "\u0446\u0456 \u0442\u0432\u0430\u0440\u044b\u0446\u044c\/\u0430\u0434\u043a\u0440\u044b\u0446\u044c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u0430\u0439:", "pad.toolbar.bold.title": "\u0422\u043e\u045e\u0441\u0442\u044b (Ctrl-B)", @@ -51,11 +57,5 @@ "pad.share": "\u041f\u0430\u0434\u0437\u044f\u043b\u0456\u0446\u0446\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430\u043c", "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u0456 \u0434\u043b\u044f \u0447\u044b\u0442\u0430\u043d\u044c\u043d\u044f", "pad.share.link": "\u0421\u043f\u0430\u0441\u044b\u043b\u043a\u0430", - "pad.chat": "\u0427\u0430\u0442", - "@metadata": { - "authors": [ - "Jim-by", - "Wizardist" - ] - } + "pad.chat": "\u0427\u0430\u0442" } \ No newline at end of file diff --git a/src/locales/el.json b/src/locales/el.json index f33865e6..52b4b7d6 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -22,7 +22,7 @@ "pad.toolbar.clearAuthorship.title": "\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03a3\u03c5\u03bd\u03c4\u03b1\u03ba\u03c4\u03ce\u03bd", "pad.toolbar.import_export.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03cc\/\u03c3\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03bf\u03cd\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c5\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd", "pad.toolbar.timeslider.title": "\u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", - "pad.toolbar.savedRevision.title": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b5\u03c2 \u0391\u03bd\u03b1\u03b8\u03b5\u03c9\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2", + "pad.toolbar.savedRevision.title": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0391\u03bd\u03b1\u03b8\u03b5\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2", "pad.toolbar.settings.title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2", "pad.toolbar.embed.title": "\u0395\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 pad", "pad.toolbar.showusers.title": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 pad", @@ -37,6 +37,7 @@ "pad.settings.stickychat": "\u0397 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03ac\u03bd\u03c4\u03b1 \u03bf\u03c1\u03b1\u03c4\u03ae", "pad.settings.colorcheck": "\u03a7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7", "pad.settings.linenocheck": "\u0391\u03c1\u03b9\u03b8\u03bc\u03bf\u03af \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2", + "pad.settings.rtlcheck": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b2\u03ac\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03b1\u03c0\u03cc \u03b4\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b1 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac;", "pad.settings.fontType": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac\u03c2:", "pad.settings.fontType.normal": "\u039a\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae", "pad.settings.fontType.monospaced": "\u039a\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c0\u03bb\u03ac\u03c4\u03bf\u03c5\u03c2", diff --git a/src/locales/fa.json b/src/locales/fa.json index 8e0fd138..6495ace5 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -3,7 +3,8 @@ "authors": { "0": "BMRG14", "1": "Dalba", - "3": "ZxxZxxZ" + "3": "ZxxZxxZ", + "4": "\u0627\u0644\u0646\u0627\u0632" } }, "index.newPad": "\u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062a\u0627\u0632\u0647", @@ -36,6 +37,7 @@ "pad.settings.stickychat": "\u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u06cc\u0634\u0647 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u0627\u0634\u062f", "pad.settings.colorcheck": "\u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", "pad.settings.linenocheck": "\u0634\u0645\u0627\u0631\u0647\u200c\u06cc \u062e\u0637\u0648\u0637", + "pad.settings.rtlcheck": "\u062e\u0648\u0627\u0646\u062f\u0646 \u0645\u062d\u062a\u0648\u0627 \u0627\u0632 \u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e\u061f", "pad.settings.fontType": "\u0646\u0648\u0639 \u0642\u0644\u0645:", "pad.settings.fontType.normal": "\u0633\u0627\u062f\u0647", "pad.settings.fontType.monospaced": "Monospace", diff --git a/src/locales/fi.json b/src/locales/fi.json index eeb4cb16..38190f14 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -39,6 +39,7 @@ "pad.settings.stickychat": "Keskustelu aina n\u00e4kyviss\u00e4", "pad.settings.colorcheck": "Kirjoittajav\u00e4rit", "pad.settings.linenocheck": "Rivinumerot", + "pad.settings.rtlcheck": "Luetaanko sis\u00e4lt\u00f6 oikealta vasemmalle?", "pad.settings.fontType": "Kirjasintyyppi:", "pad.settings.fontType.normal": "normaali", "pad.settings.fontType.monospaced": "tasalevyinen", diff --git a/src/locales/ml.json b/src/locales/ml.json index e8250434..2ffbee2f 100644 --- a/src/locales/ml.json +++ b/src/locales/ml.json @@ -21,7 +21,7 @@ "pad.toolbar.clearAuthorship.title": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d02 \u0d15\u0d33\u0d2f\u0d41\u0d15", "pad.toolbar.import_export.title": "\u0d35\u0d4d\u0d2f\u0d24\u0d4d\u0d2f\u0d38\u0d4d\u0d24 \u0d2b\u0d2f\u0d7d \u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d\/\u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f\/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", "pad.toolbar.timeslider.title": "\u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", - "pad.toolbar.savedRevision.title": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d41\u0d15\u0d7e", + "pad.toolbar.savedRevision.title": "\u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", "pad.toolbar.settings.title": "\u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", "pad.toolbar.embed.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", "pad.toolbar.showusers.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d09\u0d2a\u0d2f\u0d4b\u0d15\u0d4d\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d2a\u0d4d\u0d30\u0d26\u0d7c\u0d36\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", @@ -36,6 +36,7 @@ "pad.settings.stickychat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d02 \u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d0e\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d41\u0d02 \u0d38\u0d4d\u0d15\u0d4d\u0d30\u0d40\u0d28\u0d3f\u0d7d \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", "pad.settings.colorcheck": "\u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d3e\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e", "pad.settings.linenocheck": "\u0d35\u0d30\u0d3f\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d15\u0d4d\u0d30\u0d2e\u0d38\u0d02\u0d16\u0d4d\u0d2f", + "pad.settings.rtlcheck": "\u0d09\u0d33\u0d4d\u0d33\u0d1f\u0d15\u0d4d\u0d15\u0d02 \u0d35\u0d32\u0d24\u0d4d\u0d24\u0d41\u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d1f\u0d24\u0d4d\u0d24\u0d4b\u0d1f\u0d4d\u0d1f\u0d3e\u0d23\u0d4b \u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d47\u0d23\u0d4d\u0d1f\u0d24\u0d4d?", "pad.settings.fontType": "\u0d2b\u0d4b\u0d23\u0d4d\u0d1f\u0d4d \u0d24\u0d30\u0d02:", "pad.settings.fontType.normal": "\u0d38\u0d3e\u0d27\u0d3e\u0d30\u0d23\u0d02", "pad.settings.fontType.monospaced": "\u0d2e\u0d4b\u0d23\u0d4b\u0d38\u0d4d\u0d2a\u0d47\u0d38\u0d4d", @@ -51,6 +52,7 @@ "pad.importExport.exportpdf": "\u0d2a\u0d3f.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d.", "pad.importExport.exportopen": "\u0d12.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d. (\u0d13\u0d2a\u0d4d\u0d2a\u0d7a \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d)", "pad.importExport.exportdokuwiki": "\u0d21\u0d4b\u0d15\u0d41\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d3f", + "pad.importExport.abiword.innerHTML": "\u0d2a\u0d4d\u0d32\u0d46\u0d2f\u0d3f\u0d7b \u0d1f\u0d46\u0d15\u0d4d\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b \u0d0e\u0d1a\u0d4d\u0d1a\u0d4d.\u0d31\u0d4d\u0d31\u0d3f.\u0d0e\u0d02.\u0d0e\u0d7d. \u0d24\u0d30\u0d2e\u0d4b \u0d2e\u0d3e\u0d24\u0d4d\u0d30\u0d2e\u0d47 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d28\u0d3e\u0d35\u0d42. \u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d35\u0d3f\u0d2a\u0d41\u0d32\u0d40\u0d15\u0d43\u0d24 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d38\u0d57\u0d15\u0d30\u0d4d\u0d2f\u0d19\u0d4d\u0d19\u0d7e\u0d15\u0d4d\u0d15\u0d3e\u0d2f\u0d3f \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d05\u0d2c\u0d3f\u0d35\u0d47\u0d21\u0d4d \u0d07\u0d7b\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d7e \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15<\/a>.", "pad.modals.connected": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", "pad.modals.reconnecting": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d4d \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", "pad.modals.forcereconnect": "\u0d0e\u0d28\u0d4d\u0d24\u0d3e\u0d2f\u0d3e\u0d32\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", @@ -101,6 +103,8 @@ "timeslider.month.october": "\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c", "timeslider.month.november": "\u0d28\u0d35\u0d02\u0d2c\u0d7c", "timeslider.month.december": "\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c", + "timeslider.unnamedauthor": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d35\u0d4d", + "timeslider.unnamedauthors": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e", "pad.savedrevs.marked": "\u0d08 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d3e\u0d2f\u0d3f \u0d05\u0d1f\u0d2f\u0d3e\u0d33\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", "pad.userlist.entername": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", "pad.userlist.unnamed": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24", From ab2e805aa0143ffc04d2875672ba8ac3193c9460 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 23 Mar 2013 14:50:00 +0000 Subject: [PATCH 160/463] changelog --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 642846a6..152af7f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# 1.2.91 + * NEW: Authors can now send custom object messages to other Authors making 3 way conversations possible. This introduces WebRTC plugin support. + * NEW: Hook for Chat Messages Allows for Desktop Notification support + * NEW: FreeBSD installation docs + * Fix: Cookies inside of plugins + * Fix: Long lines in Firefox now wrap properly + * Fix: Log HTTP on DEBUG log level + * Fix: Server wont crash on import fails on 0 file import. + * Fix: Import no longer fails consistantly + * Fix: Language support for non existing languages + * Fix: Mobile support for chat notifications are now usable + * Fix: Re-Enable Editbar buttons on reconnect + * Fix: Clearing authorship colors no longer disconnects all clients + # 1.2.9 * Fix: MAJOR Security issue, where a hacker could submit content as another user * Fix: security issue due to unescaped user input @@ -6,7 +20,7 @@ * Fix: PadUsers API endpoint * NEW: A script to import data to all dbms * NEW: Add authorId to chat and userlist as a data attribute - * NEW Refactor and fix our frontend tests + * NEW: Refactor and fix our frontend tests * NEW: Localisation updates From af80e37ac752e1004752cff275db730daf6c2292 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 23 Mar 2013 15:03:56 +0000 Subject: [PATCH 161/463] missed this one.. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 152af7f7..ca5b078f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ * NEW: Hook for Chat Messages Allows for Desktop Notification support * NEW: FreeBSD installation docs * Fix: Cookies inside of plugins + * Fix: Refactor Caret navigation with Arrow and Pageup/down keys stops cursor being lost * Fix: Long lines in Firefox now wrap properly * Fix: Log HTTP on DEBUG log level * Fix: Server wont crash on import fails on 0 file import. From b3988e30d54ceccbf16a2586701e490fd037980c Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 23 Mar 2013 17:55:34 +0000 Subject: [PATCH 162/463] pump isdeprecated --- src/node/utils/caching_middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/utils/caching_middleware.js b/src/node/utils/caching_middleware.js index c6b23713..a970bfc9 100644 --- a/src/node/utils/caching_middleware.js +++ b/src/node/utils/caching_middleware.js @@ -168,7 +168,7 @@ CachingMiddleware.prototype = new function () { } else if (req.method == 'GET') { var readStream = fs.createReadStream(pathStr); res.writeHead(statusCode, headers); - util.pump(readStream, res); + readableStream.pipe(readStream, res); } else { res.writeHead(statusCode, headers); res.end(); From d515acae96dd9a74fb398412cc93d22a18329ade Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 23 Mar 2013 18:01:44 +0000 Subject: [PATCH 163/463] expires was never defined --- src/node/db/SessionStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/db/SessionStore.js b/src/node/db/SessionStore.js index 09ea7333..52a504f1 100644 --- a/src/node/db/SessionStore.js +++ b/src/node/db/SessionStore.js @@ -22,7 +22,7 @@ SessionStore.prototype.get = function(sid, fn){ { if (sess) { sess.cookie.expires = 'string' == typeof sess.cookie.expires ? new Date(sess.cookie.expires) : sess.cookie.expires; - if (!sess.cookie.expires || new Date() < expires) { + if (!sess.cookie.expires || new Date() < sess.cookie.expires) { fn(null, sess); } else { self.destroy(sid, fn); From c78aad16eaf888c47844e3f36db9a9cde4539844 Mon Sep 17 00:00:00 2001 From: disy-mk Date: Sun, 24 Mar 2013 01:18:44 +0100 Subject: [PATCH 164/463] adds missing semicolons in src/node/utils folder --- src/node/utils/Abiword.js | 6 +++--- src/node/utils/ExportDokuWiki.js | 2 +- src/node/utils/ExportHelper.js | 8 ++++---- src/node/utils/ExportHtml.js | 5 ++--- src/node/utils/ExportTxt.js | 3 +-- src/node/utils/Minify.js | 10 +++++----- src/node/utils/Settings.js | 8 ++++---- src/node/utils/caching_middleware.js | 4 ++-- src/node/utils/padDiff.js | 22 +++++++++++----------- 9 files changed, 33 insertions(+), 35 deletions(-) diff --git a/src/node/utils/Abiword.js b/src/node/utils/Abiword.js index 27138e64..92520343 100644 --- a/src/node/utils/Abiword.js +++ b/src/node/utils/Abiword.js @@ -63,7 +63,7 @@ if(os.type().indexOf("Windows") > -1) callback(); }); - } + }; exports.convertFile = function(srcFile, destFile, type, callback) { @@ -121,7 +121,7 @@ else firstPrompt = false; } }); - } + }; spawnAbiword(); doConvertTask = function(task, callback) @@ -135,7 +135,7 @@ else console.log("queue continue"); task.callback(err); }; - } + }; //Queue with the converts we have to do var queue = async.queue(doConvertTask, 1); diff --git a/src/node/utils/ExportDokuWiki.js b/src/node/utils/ExportDokuWiki.js index d2f71236..f5d2d177 100644 --- a/src/node/utils/ExportDokuWiki.js +++ b/src/node/utils/ExportDokuWiki.js @@ -316,7 +316,7 @@ exports.getPadDokuWikiDocument = function (padId, revNum, callback) getPadDokuWiki(pad, revNum, callback); }); -} +}; function _escapeDokuWiki(s) { diff --git a/src/node/utils/ExportHelper.js b/src/node/utils/ExportHelper.js index a939a8b6..136896f0 100644 --- a/src/node/utils/ExportHelper.js +++ b/src/node/utils/ExportHelper.js @@ -45,7 +45,7 @@ exports.getPadPlainText = function(pad, revNum){ } return pieces.join(''); -} +}; exports._analyzeLine = function(text, aline, apool){ @@ -77,11 +77,11 @@ exports._analyzeLine = function(text, aline, apool){ line.aline = aline; } return line; -} +}; exports._encodeWhitespace = function(s){ return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ - return "&#" +c.charCodeAt(0) + ";" + return "&#" +c.charCodeAt(0) + ";"; }); -} +}; diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 585694d4..7b94310a 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -21,7 +21,7 @@ var padManager = require("../db/PadManager"); var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); -var getPadPlainText = require('./ExportHelper').getPadPlainText +var getPadPlainText = require('./ExportHelper').getPadPlainText; var _analyzeLine = require('./ExportHelper')._analyzeLine; var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; @@ -515,7 +515,7 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) callback(null, head + html + foot); }); }); -} +}; // copied from ACE @@ -595,4 +595,3 @@ function _processSpaces(s){ } return parts.join(''); } - diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index c57424f1..f0b62743 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -289,5 +289,4 @@ exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) callback(null, html); }); }); -} - +}; diff --git a/src/node/utils/Minify.js b/src/node/utils/Minify.js index 5fc8accb..58d08b30 100644 --- a/src/node/utils/Minify.js +++ b/src/node/utils/Minify.js @@ -125,11 +125,11 @@ function requestURIs(locations, method, headers, callback) { } function completed() { - var statuss = responses.map(function (x) {return x[0]}); - var headerss = responses.map(function (x) {return x[1]}); - var contentss = responses.map(function (x) {return x[2]}); + var statuss = responses.map(function (x) {return x[0];}); + var headerss = responses.map(function (x) {return x[1];}); + var contentss = responses.map(function (x) {return x[2];}); callback(statuss, headerss, contentss); - }; + } } /** @@ -263,7 +263,7 @@ function getAceFile(callback) { var filename = item.match(/"([^"]*)"/)[1]; var request = require('request'); - var baseURI = 'http://localhost:' + settings.port + var baseURI = 'http://localhost:' + settings.port; var resourceURI = baseURI + path.normalize(path.join('/static/', filename)); resourceURI = resourceURI.replace(/\\/g, '/'); // Windows (safe generally?) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 45f81aa5..a6c71a85 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -137,7 +137,7 @@ exports.abiwordAvailable = function() { return "no"; } -} +}; exports.reloadSettings = function reloadSettings() { // Discover where the settings file lives @@ -157,7 +157,7 @@ exports.reloadSettings = function reloadSettings() { try { if(settingsStr) { settings = vm.runInContext('exports = '+settingsStr, vm.createContext(), "settings.json"); - settings = JSON.parse(JSON.stringify(settings)) // fix objects having constructors of other vm.context + settings = JSON.parse(JSON.stringify(settings)); // fix objects having constructors of other vm.context } }catch(e){ console.error('There was an error processing your settings.json file: '+e.message); @@ -196,9 +196,9 @@ exports.reloadSettings = function reloadSettings() { } if(exports.dbType === "dirty"){ - console.warn("DirtyDB is used. This is fine for testing but not recommended for production.") + console.warn("DirtyDB is used. This is fine for testing but not recommended for production."); } -} +}; // initially load settings exports.reloadSettings(); diff --git a/src/node/utils/caching_middleware.js b/src/node/utils/caching_middleware.js index c6b23713..1d103ffd 100644 --- a/src/node/utils/caching_middleware.js +++ b/src/node/utils/caching_middleware.js @@ -23,7 +23,7 @@ var util = require('util'); var settings = require('./Settings'); var semver = require('semver'); -var existsSync = (semver.satisfies(process.version, '>=0.8.0')) ? fs.existsSync : path.existsSync +var existsSync = (semver.satisfies(process.version, '>=0.8.0')) ? fs.existsSync : path.existsSync; var CACHE_DIR = path.normalize(path.join(settings.root, 'var/')); CACHE_DIR = existsSync(CACHE_DIR) ? CACHE_DIR : undefined; @@ -133,7 +133,7 @@ CachingMiddleware.prototype = new function () { old_res.write = res.write; old_res.end = res.end; res.write = function(data, encoding) {}; - res.end = function(data, encoding) { respond() }; + res.end = function(data, encoding) { respond(); }; } else { res.writeHead(status, headers); } diff --git a/src/node/utils/padDiff.js b/src/node/utils/padDiff.js index 1b3cf58f..c5354041 100644 --- a/src/node/utils/padDiff.js +++ b/src/node/utils/padDiff.js @@ -68,7 +68,7 @@ PadDiff.prototype._isClearAuthorship = function(changeset){ return false; return true; -} +}; PadDiff.prototype._createClearAuthorship = function(rev, callback){ var self = this; @@ -84,7 +84,7 @@ PadDiff.prototype._createClearAuthorship = function(rev, callback){ callback(null, changeset); }); -} +}; PadDiff.prototype._createClearStartAtext = function(rev, callback){ var self = this; @@ -107,7 +107,7 @@ PadDiff.prototype._createClearStartAtext = function(rev, callback){ callback(null, newAText); }); }); -} +}; PadDiff.prototype._getChangesetsInBulk = function(startRev, count, callback) { var self = this; @@ -124,7 +124,7 @@ PadDiff.prototype._getChangesetsInBulk = function(startRev, count, callback) { async.forEach(revisions, function(rev, callback){ self._pad.getRevision(rev, function(err, revision){ if(err){ - return callback(err) + return callback(err); } var arrayNum = rev-startRev; @@ -137,7 +137,7 @@ PadDiff.prototype._getChangesetsInBulk = function(startRev, count, callback) { }, function(err){ callback(err, changesets, authors); }); -} +}; PadDiff.prototype._addAuthors = function(authors) { var self = this; @@ -147,7 +147,7 @@ PadDiff.prototype._addAuthors = function(authors) { self._authors.push(author); } }); -} +}; PadDiff.prototype._createDiffAtext = function(callback) { var self = this; @@ -219,7 +219,7 @@ PadDiff.prototype._createDiffAtext = function(callback) { } ); }); -} +}; PadDiff.prototype.getHtml = function(callback){ //cache the html @@ -279,7 +279,7 @@ PadDiff.prototype.getAuthors = function(callback){ } else { callback(null, self._authors); } -} +}; PadDiff.prototype._extendChangesetWithAuthor = function(changeset, author, apool) { //unpack @@ -312,7 +312,7 @@ PadDiff.prototype._extendChangesetWithAuthor = function(changeset, author, apool //return the modified changeset return Changeset.pack(unpacked.oldLen, unpacked.newLen, assem.toString(), unpacked.charBank); -} +}; //this method is 80% like Changeset.inverse. I just changed so instead of reverting, it adds deletions and attribute changes to to the atext. PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { @@ -463,7 +463,7 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { // If the text this operator applies to is only a star, than this is a false positive and should be ignored if (csOp.attribs && textBank != "*") { var deletedAttrib = apool.putAttrib(["removed", true]); - var authorAttrib = apool.putAttrib(["author", ""]);; + var authorAttrib = apool.putAttrib(["author", ""]); attribKeys.length = 0; attribValues.length = 0; @@ -473,7 +473,7 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { if(apool.getAttribKey(n) === "author"){ authorAttrib = n; - }; + } }); var undoBackToAttribs = cachedStrFunc(function (attribs) { From 2e7a9796ded7c66a14639e261d54b7bf6c4496ec Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 24 Mar 2013 01:12:01 +0000 Subject: [PATCH 165/463] option to show sticky chat on screen, note i use a literal string, how am i supposed to add a l10n title? --- src/static/css/pad.css | 9 +++++++++ src/templates/pad.html | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 320a4720..dafb77ef 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -559,6 +559,15 @@ table#otheruserstable { margin: 4px 0 0 4px; position: absolute; } +#titlesticky{ + font-size: 10px; + padding-top:2px; + float: right; + text-align: right; + text-decoration: none; + cursor: pointer; + color: #555; +} #titlecross { font-size: 25px; float: right; diff --git a/src/templates/pad.html b/src/templates/pad.html index 1d8c069a..16599e17 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -369,14 +369,17 @@ <% e.end_block(); %> -
    +
    0
    - +
    + + █   +
    loading.. From ef7fb5c7f0e233268530eb8cd6eb02224751dae5 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 12:18:06 +0100 Subject: [PATCH 166/463] Update npm --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 822676a3..ff662575 100644 --- a/src/package.json +++ b/src/package.json @@ -27,7 +27,7 @@ "nodemailer" : "0.3.x", "jsdom-nocontextifiy" : "0.2.10", "async-stacktrace" : "0.0.2", - "npm" : "1.1.x", + "npm" : "1.2.x", "npm-registry-client" : "0.2.10", "ejs" : "0.6.1", "graceful-fs" : "1.1.5", From 0070eab4164ef473c706fe7f1f5c8064e7c819b9 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 12:45:23 +0100 Subject: [PATCH 167/463] Fix caching of npm search results and only make one registry request on /admin/plugins fixes #1488 --- src/node/hooks/express/adminplugins.js | 4 ++-- src/static/js/admin/plugins.js | 6 ++++-- src/static/js/pluginfw/installer.js | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 7e221cf1..85bf2108 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -36,7 +36,7 @@ exports.socketio = function (hook_name, args, cb) { socket.on("checkUpdates", function() { socket.emit("progress", {progress:0, message:'Checking for plugin updates...'}); // Check plugins for updates - installer.search({offset: 0, pattern: '', limit: 500}, /*useCache:*/true, function(data) { // hacky + installer.search({offset: 0, pattern: '', limit: 500}, /*maxCacheAge:*/60*10, function(data) { // hacky if (!data.results) return; var updatable = _(plugins.plugins).keys().filter(function(plugin) { if(!data.results[plugin]) return false; @@ -51,7 +51,7 @@ exports.socketio = function (hook_name, args, cb) { socket.on("search", function (query) { socket.emit("progress", {progress:0, message:'Fetching results...'}); - installer.search(query, true, function (progress) { + installer.search(query, /*maxCacheAge:*/60*10, function (progress) { if (progress.results) socket.emit("search-result", progress); socket.emit("progress", progress); diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index a973875c..d7f94d2c 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -163,8 +163,10 @@ $(document).ready(function () { } updateHandlers(); - socket.emit('checkUpdates'); - tasks++; + setTimeout(function() { + socket.emit('checkUpdates'); + tasks++; + }, 5000) }); socket.on('updatable', function(data) { diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 15d87940..14a3b7be 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -71,12 +71,13 @@ exports.install = function(plugin_name, cb) { }; exports.searchCache = null; +var cacheTimestamp = 0; -exports.search = function(query, cache, cb) { +exports.search = function(query, maxCacheAge, cb) { withNpm( function (cb) { var getData = function (cb) { - if (cache && exports.searchCache) { + if (maxCacheAge && exports.searchCache && Math.round(+new Date/1000)-cacheTimestamp < maxCacheAge) { cb(null, exports.searchCache); } else { registry.get( @@ -84,6 +85,7 @@ exports.search = function(query, cache, cb) { function (er, data) { if (er) return cb(er); exports.searchCache = data; + cacheTimestamp = Math.round(+new Date/1000) cb(er, data); } ); From b297784288a5c93e329509deca45a78fc81057d3 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 16:51:12 +0100 Subject: [PATCH 168/463] Make npm registry access code more sane --- src/package.json | 1 - src/static/js/pluginfw/installer.js | 139 +++++++++------------------- 2 files changed, 46 insertions(+), 94 deletions(-) diff --git a/src/package.json b/src/package.json index ff662575..24f15ca9 100644 --- a/src/package.json +++ b/src/package.json @@ -28,7 +28,6 @@ "jsdom-nocontextifiy" : "0.2.10", "async-stacktrace" : "0.0.2", "npm" : "1.2.x", - "npm-registry-client" : "0.2.10", "ejs" : "0.6.1", "graceful-fs" : "1.1.5", "slide" : "1.1.3", diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 14a3b7be..949fdae8 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -1,120 +1,73 @@ var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var npm = require("npm"); -var RegClient = require("npm-registry-client") -var registry = new RegClient( -{ registry: "http://registry.npmjs.org" -, cache: npm.cache } -); - -var withNpm = function (npmfn, final, cb) { +var withNpm = function (npmfn, cb) { npm.load({}, function (er) { - if (er) return cb({progress:1, error:er}); + if (er) return cb(er); npm.on("log", function (message) { - cb({progress: 0.5, message:message.msg + ": " + message.pref}); - }); - npmfn(function (er, data) { - if (er) { - console.error(er); - return cb({progress:1, error: er.message}); - } - if (!data) data = {}; - data.progress = 1; - data.message = "Done."; - cb(data); - final(); + console.log('npm: ',message) }); + npmfn(); }); } -// All these functions call their callback multiple times with -// {progress:[0,1], message:STRING, error:object}. They will call it -// with progress = 1 at least once, and at all times will either -// message or error be present, not both. It can be called multiple -// times for all values of propgress except for 1. - exports.uninstall = function(plugin_name, cb) { - withNpm( - function (cb) { - npm.commands.uninstall([plugin_name], function (er) { + withNpm(function () { + npm.commands.uninstall([plugin_name], function (er) { + if (er) return cb && cb(er); + hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); - hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { - if (er) return cb(er); - plugins.update(cb); - }); + plugins.update(cb); + cb && cb(); + hooks.aCallAll("restartServer", {}, function () {}); }); - }, - function () { - hooks.aCallAll("restartServer", {}, function () {}); - }, - cb - ); + }); + }); }; exports.install = function(plugin_name, cb) { - withNpm( - function (cb) { + withNpm(function () { npm.commands.install([plugin_name], function (er) { - if (er) return cb(er); + if (er) return cb && cb(er); hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); plugins.update(cb); + cb && cb(); + hooks.aCallAll("restartServer", {}, function () {}); }); }); - }, - function () { - hooks.aCallAll("restartServer", {}, function () {}); - }, - cb - ); + }); }; -exports.searchCache = null; +exports.availablePlugins = null; var cacheTimestamp = 0; -exports.search = function(query, maxCacheAge, cb) { - withNpm( - function (cb) { - var getData = function (cb) { - if (maxCacheAge && exports.searchCache && Math.round(+new Date/1000)-cacheTimestamp < maxCacheAge) { - cb(null, exports.searchCache); - } else { - registry.get( - "/-/all", 600, false, true, - function (er, data) { - if (er) return cb(er); - exports.searchCache = data; - cacheTimestamp = Math.round(+new Date/1000) - cb(er, data); - } - ); - } - } - getData( - function (er, data) { - if (er) return cb(er); - var res = {}; - var i = 0; - var pattern = query.pattern.toLowerCase(); - for (key in data) { // for every plugin in the data from npm - if ( key.indexOf(plugins.prefix) == 0 - && key.indexOf(pattern) != -1 - || key.indexOf(plugins.prefix) == 0 - && data[key].description.indexOf(pattern) != -1 - ) { // If the name contains ep_ and the search string is in the name or description - i++; - if (i > query.offset - && i <= query.offset + query.limit) { - res[key] = data[key]; - } - } - } - cb(null, {results:res, query: query, total:i}); - } - ); - }, - function () { }, - cb - ); +exports.getAvailablePlugins = function(maxCacheAge, cb) { + withNpm(function () { + if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { + return cb && cb(null, exports.availablePlugins) + } + npm.commands.search(['ep_'], function(er, results) { + if(er) return cb && cb(er); + exports.availablePlugins = results; + cacheTimestamp = Math.round(+new Date/1000); + cb && cb(null, results) + }) + }); +}; + + +exports.search = function(searchTerm, maxCacheAge, cb) { + exports.getAvailablePlugins(maxCacheAge, function(er, results) { + if(er) return cb && cb(er); + var res = {}; + searchTerm = searchTerm.toLowerCase(); + for (var pluginName in results) { // for every available plugin + if (pluginName.indexOf(plugins.prefix) != 0) continue; // TODO: Also search in keywords here! + if(pluginName.indexOf(searchTerm) < 0 && results[pluginName].description.indexOf(searchTerm) < 0) continue; + res[pluginName] = results[pluginName]; + } + cb && cb(null, res) + }) }; From 079fdf0f38160481836b6fc881c60741f90a414b Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 17:20:10 +0100 Subject: [PATCH 169/463] Revamp /admin/plugins - dry up the client-side code - use the new saner API of pluginfw/installer.js on the server - Improve UX: allow user to infinitely scroll to display their results --- src/node/hooks/express/adminplugins.js | 62 +++++--- src/static/js/admin/plugins.js | 207 ++++++++----------------- src/templates/admin/plugins.html | 5 +- 3 files changed, 105 insertions(+), 169 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 85bf2108..6b7c01e0 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -27,48 +27,66 @@ exports.socketio = function (hook_name, args, cb) { io.on('connection', function (socket) { if (!socket.handshake.session.user || !socket.handshake.session.user.is_admin) return; - socket.on("load", function (query) { + socket.on("getInstalled", function (query) { // send currently installed plugins - socket.emit("installed-results", {results: plugins.plugins}); - socket.emit("progress", {progress:1}); + var installed = Object.keys(plugins.plugins).map(function(plugin) { + return plugins.plugins[plugin].package + }) + socket.emit("results:installed", {installed: installed}); }); - socket.on("checkUpdates", function() { - socket.emit("progress", {progress:0, message:'Checking for plugin updates...'}); + socket.on("getUpdatable", function() { // Check plugins for updates - installer.search({offset: 0, pattern: '', limit: 500}, /*maxCacheAge:*/60*10, function(data) { // hacky - if (!data.results) return; + installer.getAvailable(/*maxCacheAge:*/60*10, function(er, results) { + if(er) { + console.warn(er); + socket.emit("results:updatable", {updatable: {}}); + return; + } var updatable = _(plugins.plugins).keys().filter(function(plugin) { - if(!data.results[plugin]) return false; - var latestVersion = data.results[plugin]['dist-tags'].latest + if(!results[plugin]) return false; + var latestVersion = results[plugin].version var currentVersion = plugins.plugins[plugin].package.version return semver.gt(latestVersion, currentVersion) }); - socket.emit("updatable", {updatable: updatable}); - socket.emit("progress", {progress:1}); + socket.emit("results:updatable", {updatable: updatable}); }); }) + + socket.on("getAvailable", function (query) { + installer.getAvailablePlugins(/*maxCacheAge:*/false, function (er, results) { + if(er) { + console.error(er) + results = {} + } + socket.emit("results:available", results); + }); + }); socket.on("search", function (query) { - socket.emit("progress", {progress:0, message:'Fetching results...'}); - installer.search(query, /*maxCacheAge:*/60*10, function (progress) { - if (progress.results) - socket.emit("search-result", progress); - socket.emit("progress", progress); + installer.search(query.searchTerm, /*maxCacheAge:*/60*10, function (er, results) { + if(er) { + console.error(er) + results = {} + } + var res = Object.keys(results) + .slice(query.offset, query.offset+query.length) + .map(function(pluginName) { + return results[pluginName] + }); + socket.emit("results:search", {results: res, query: query}); }); }); socket.on("install", function (plugin_name) { - socket.emit("progress", {progress:0, message:'Downloading and installing ' + plugin_name + "..."}); - installer.install(plugin_name, function (progress) { - socket.emit("progress", progress); + installer.install(plugin_name, function (er) { + socket.emit("finished:install", {error: er}); }); }); socket.on("uninstall", function (plugin_name) { - socket.emit("progress", {progress:0, message:'Uninstalling ' + plugin_name + "..."}); - installer.uninstall(plugin_name, function (progress) { - socket.emit("progress", progress); + installer.uninstall(plugin_name, function (er) { + socket.emit("finished:uninstall", {error: er}); }); }); }); diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index d7f94d2c..8aff0f68 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -12,165 +12,86 @@ $(document).ready(function () { //connect socket = io.connect(url, {resource : resource}).of("/pluginfw/installer"); - $('.search-results').data('query', { - pattern: '', - offset: 0, - limit: 12, - }); - - var doUpdate = false; - - var search = function () { - socket.emit("search", $('.search-results').data('query')); - tasks++; + function search(searchTerm) { + if(search.searchTerm != searchTerm) { + search.offset = 0 + search.results = [] + search.end = false + } + search.searchTerm = searchTerm; + socket.emit("search", {searchTerm: searchTerm, offset:search.offset, length: search.limit}); + search.offset += search.limit; } + search.offset = 0 + search.limit = 12 + search.results = [] + search.end = true// have we received all results already? - function updateHandlers() { - $("form").submit(function(){ - var query = $('.search-results').data('query'); - query.pattern = $("#search-query").val(); - query.offset = 0; - search(); - return false; - }); - - $("#search-query").unbind('keyup').keyup(function () { - var query = $('.search-results').data('query'); - query.pattern = $("#search-query").val(); - query.offset = 0; - search(); - }); - - $(".do-install, .do-update").unbind('click').click(function (e) { - var row = $(e.target).closest("tr"); - doUpdate = true; - socket.emit("install", row.find(".name").text()); - tasks++; - }); - - $(".do-uninstall").unbind('click').click(function (e) { - var row = $(e.target).closest("tr"); - doUpdate = true; - socket.emit("uninstall", row.find(".name").text()); - tasks++; - }); - - $(".do-prev-page").unbind('click').click(function (e) { - var query = $('.search-results').data('query'); - query.offset -= query.limit; - if (query.offset < 0) { - query.offset = 0; - } - search(); - }); - $(".do-next-page").unbind('click').click(function (e) { - var query = $('.search-results').data('query'); - var total = $('.search-results').data('total'); - if (query.offset + query.limit < total) { - query.offset += query.limit; - } - search(); - }); - } - - updateHandlers(); - - var tasks = 0; - socket.on('progress', function (data) { - $("#progress").show(); - $('#progress').data('progress', data.progress); - - var message = "Unknown status"; - if (data.message) { - message = data.message.toString(); - } - if (data.error) { - data.progress = 1; - } - - $("#progress .message").html(message); - - if (data.progress >= 1) { - tasks--; - if (tasks <= 0) { - // Hide the activity indicator once all tasks are done - $("#progress").hide(); - tasks = 0; - } - - if (data.error) { - alert('An error occurred: '+data.error+' -- the server log might know more...'); - }else { - if (doUpdate) { - doUpdate = false; - socket.emit("load"); - tasks++; - } - } - } - }); - - socket.on('search-result', function (data) { - var widget=$(".search-results"); - - widget.data('query', data.query); - widget.data('total', data.total); - - widget.find('.offset').html(data.query.offset); - if (data.query.offset + data.query.limit > data.total){ - widget.find('.limit').html(data.total); - }else{ - widget.find('.limit').html(data.query.offset + data.query.limit); - } - widget.find('.total').html(data.total); - - widget.find(".results *").remove(); - for (plugin_name in data.results) { - var plugin = data.results[plugin_name]; - var row = widget.find(".template tr").clone(); + function displayPluginList(plugins, container, template) { + plugins.forEach(function(plugin) { + var row = template.clone(); for (attr in plugin) { if(attr == "name"){ // Hack to rewrite URLS into name - row.find(".name").html(""+plugin[attr]+""); + row.find(".name").html(""+plugin['name']+""); }else{ row.find("." + attr).html(plugin[attr]); } } - row.find(".version").html( data.results[plugin_name]['dist-tags'].latest ); + row.find(".version").html( plugin.version ); - widget.find(".results").append(row); - } - + container.append(row); + }) updateHandlers(); + } + + function updateHandlers() { + // Search + $("#search-query").unbind('keyup').keyup(function () { + search($("#search-query").val()); + }); + + // update & install + $(".do-install, .do-update").unbind('click').click(function (e) { + var row = $(e.target).closest("tr"); + socket.emit("install", row.find(".name").text()); + }); + + // uninstall + $(".do-uninstall").unbind('click').click(function (e) { + var row = $(e.target).closest("tr"); + socket.emit("uninstall", row.find(".name").text()); + }); + + // Infinite scroll + $(window).unbind('scroll').scroll(function() { + if(search.end) return;// don't keep requesting if there are no more results + var top = $('.search-results .results > tr').last().offset().top + if($(window).scrollTop()+$(window).height() > top) search(search.searchTerm) + }) + } + + socket.on('results:search', function (data) { + console.log('got search results', data) + search.results = search.results.concat(data.results); + if(!data.results.length) search.end = true; + + var searchWidget = $(".search-results"); + searchWidget.find(".results *").remove(); + displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) }); - socket.on('installed-results', function (data) { + socket.on('results:installed', function (data) { $("#installed-plugins *").remove(); - - for (plugin_name in data.results) { - if (plugin_name == "ep_etherpad-lite") continue; // Hack... - var plugin = data.results[plugin_name]; - var row = $("#installed-plugin-template").clone(); - - for (attr in plugin.package) { - if(attr == "name"){ // Hack to rewrite URLS into name - row.find(".name").html(""+plugin.package[attr]+""); - }else{ - row.find("." + attr).html(plugin.package[attr]); - } - } - $("#installed-plugins").append(row); - } - updateHandlers(); + displayPluginList(data.installed, $("#installed-plugins"), $("#installed-plugin-template")) setTimeout(function() { socket.emit('checkUpdates'); - tasks++; }, 5000) }); - socket.on('updatable', function(data) { - $('#installed-plugins>tr').each(function(i,tr) { + socket.on('results:updatable', function(data) { + $('#installed-plugins > tr').each(function(i, tr) { var pluginName = $(tr).find('.name').text() if (data.updatable.indexOf(pluginName) >= 0) { @@ -182,8 +103,8 @@ $(document).ready(function () { updateHandlers(); }) - socket.emit("load"); - tasks++; - - search(); + // init + updateHandlers(); + socket.emit("getInstalled"); + search(''); }); diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 7c2a7abf..d6fff9f0 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -86,11 +86,8 @@ - - .. of . -
    - +
    From 1ebbcd2f30895e4e0ec54a49c2e49905ab52f626 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 17:22:51 +0100 Subject: [PATCH 170/463] Don't leak event listeners in pluginfw/installer.js fixes #921 --- src/static/js/pluginfw/installer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 949fdae8..1ef34733 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -2,9 +2,12 @@ var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var npm = require("npm"); -var withNpm = function (npmfn, cb) { +var npmIsLoaded = false; +var withNpm = function (npmfn) { + if(npmIsLoaded) return npmfn(); npm.load({}, function (er) { if (er) return cb(er); + npmIsLoaded = true; npm.on("log", function (message) { console.log('npm: ',message) }); From 773293991b2ad4877d2c360cef59ccc4cd7562f5 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 23:09:03 +0100 Subject: [PATCH 171/463] admin/plugins: Allow people to sort search results --- src/node/hooks/express/adminplugins.js | 14 +++++- src/static/css/admin.css | 13 +++++ src/static/js/admin/plugins.js | 66 +++++++++++++++++++++----- src/templates/admin/plugins.html | 6 +-- 4 files changed, 84 insertions(+), 15 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 6b7c01e0..70ace317 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -70,10 +70,11 @@ exports.socketio = function (hook_name, args, cb) { results = {} } var res = Object.keys(results) - .slice(query.offset, query.offset+query.length) .map(function(pluginName) { return results[pluginName] }); + res = sortPluginList(res, query.sortBy, query.sortDir) + .slice(query.offset, query.offset+query.limit); socket.emit("results:search", {results: res, query: query}); }); }); @@ -91,3 +92,14 @@ exports.socketio = function (hook_name, args, cb) { }); }); } + +function sortPluginList(plugins, property, /*ASC?*/dir) { + return plugins.sort(function(a, b) { + if (a[property] < b[property]) + return dir? -1 : 1; + if (a[property] > b[property]) + return dir? 1 : -1; + // a must be equal to b + return 0; + }) +} \ No newline at end of file diff --git a/src/static/css/admin.css b/src/static/css/admin.css index b6823842..8160ee98 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -102,6 +102,19 @@ input[type="text"] { max-width: 500px; } +.sort { + cursor: pointer; +} +.sort:after { + content: '▲▼' +} +.sort.up:after { + content:'▲' +} +.sort.down:after { + content:'▼' +} + table { border: 1px solid #ddd; border-radius: 3px; diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 8aff0f68..308413bb 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -12,20 +12,23 @@ $(document).ready(function () { //connect socket = io.connect(url, {resource : resource}).of("/pluginfw/installer"); - function search(searchTerm) { + function search(searchTerm, limit) { if(search.searchTerm != searchTerm) { search.offset = 0 search.results = [] search.end = false } + limit = limit? limit : search.limit search.searchTerm = searchTerm; - socket.emit("search", {searchTerm: searchTerm, offset:search.offset, length: search.limit}); - search.offset += search.limit; + socket.emit("search", {searchTerm: searchTerm, offset:search.offset, limit: limit, sortBy: search.sortBy, sortDir: search.sortDir}); + search.offset += limit; } - search.offset = 0 - search.limit = 12 - search.results = [] - search.end = true// have we received all results already? + search.offset = 0; + search.limit = 12; + search.results = []; + search.sortBy = 'name'; + search.sortDir = /*DESC?*/true; + search.end = true;// have we received all results already? function displayPluginList(plugins, container, template) { plugins.forEach(function(plugin) { @@ -44,6 +47,17 @@ $(document).ready(function () { }) updateHandlers(); } + + function sortPluginList(plugins, property, /*ASC?*/dir) { + return plugins.sort(function(a, b) { + if (a[property] < b[property]) + return dir? -1 : 1; + if (a[property] > b[property]) + return dir? 1 : -1; + // a must be equal to b + return 0; + }) + } function updateHandlers() { // Search @@ -66,24 +80,54 @@ $(document).ready(function () { // Infinite scroll $(window).unbind('scroll').scroll(function() { if(search.end) return;// don't keep requesting if there are no more results - var top = $('.search-results .results > tr').last().offset().top + var top = $('.search-results .results > tr:last').offset().top if($(window).scrollTop()+$(window).height() > top) search(search.searchTerm) }) + + // Sort + $('.sort.up').unbind('click').click(function() { + search.sortBy = $(this).text().toLowerCase(); + search.sortDir = false; + search.offset = 0; + search.results = []; + search(search.searchTerm, search.results.length); + }) + $('.sort.down, .sort.none').unbind('click').click(function() { + search.sortBy = $(this).text().toLowerCase(); + search.sortDir = true; + search.offset = 0; + search.results = []; + search(search.searchTerm); + }) } socket.on('results:search', function (data) { - console.log('got search results', data) - search.results = search.results.concat(data.results); if(!data.results.length) search.end = true; + console.log('got search results', data) + + // add to results + search.results = search.results.concat(data.results); + + // Update sorting head + $('.sort') + .removeClass('up down') + .addClass('none'); + $('.search-results thead th[data-label='+data.query.sortBy+']') + .removeClass('none') + .addClass(data.query.sortDir? 'up' : 'down'); + + // re-render search results var searchWidget = $(".search-results"); searchWidget.find(".results *").remove(); displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) }); socket.on('results:installed', function (data) { + sortPluginList(data.installed, 'name', /*ASC?*/true); + $("#installed-plugins *").remove(); - displayPluginList(data.installed, $("#installed-plugins"), $("#installed-plugin-template")) + displayPluginList(data.installed, $("#installed-plugins"), $("#installed-plugin-template")); setTimeout(function() { socket.emit('checkUpdates'); diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index d6fff9f0..5b90aeab 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -67,9 +67,9 @@ - - - + + + From b35d9c14fda2904d4a3dd1e55a6fdb6ea52f1416 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 25 Mar 2013 23:52:10 +0100 Subject: [PATCH 172/463] /admin/plugins:Hide ep_etherpad-lite in the list of installed plugins --- src/static/js/admin/plugins.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 308413bb..1c00bbfa 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -127,6 +127,9 @@ $(document).ready(function () { sortPluginList(data.installed, 'name', /*ASC?*/true); $("#installed-plugins *").remove(); + data.installed = data.installed.filter(function(plugin) { + return plugin.name != 'ep_etherpad-lite' + }) displayPluginList(data.installed, $("#installed-plugins"), $("#installed-plugin-template")); setTimeout(function() { From 6b55d13370f1057e117178c46807a59bd679de29 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 26 Mar 2013 01:54:01 +0000 Subject: [PATCH 173/463] expose ace document, reqjired for various plugins --- src/static/js/ace2_inner.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 2dc6408b..fc69d592 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1013,6 +1013,11 @@ function Ace2Inner(){ return caughtErrors.slice(); }; + editorInfo.ace_getDocument = function() + { + return doc; + }; + editorInfo.ace_getDebugProperty = function(prop) { if (prop == "debugger") From e8bae61cf5cfb568a237be4932460626409a056f Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 11:19:36 +0100 Subject: [PATCH 174/463] /admin/plugins: Add progress indicators and report errors --- src/node/hooks/express/adminplugins.js | 6 +- src/static/css/admin.css | 22 +++++-- src/static/js/admin/plugins.js | 39 ++++++++++-- src/templates/admin/plugins.html | 87 ++++++++++++++------------ 4 files changed, 101 insertions(+), 53 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 70ace317..bf796ee7 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -81,13 +81,15 @@ exports.socketio = function (hook_name, args, cb) { socket.on("install", function (plugin_name) { installer.install(plugin_name, function (er) { - socket.emit("finished:install", {error: er}); + if(er) console.warn(er) + socket.emit("finished:install", {error: er? er.message : null}); }); }); socket.on("uninstall", function (plugin_name) { installer.uninstall(plugin_name, function (er) { - socket.emit("finished:uninstall", {error: er}); + if(er) console.warn(er) + socket.emit("finished:uninstall", {error: er? er.message : null}); }); }); }); diff --git a/src/static/css/admin.css b/src/static/css/admin.css index 8160ee98..d1c86ac5 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -35,7 +35,8 @@ div.menu li:last-child { div.innerwrapper { padding: 15px; - padding-left: 265px; + margin-left: 265px; + position:relative; /* Allows us to position the loading indicator relative to this div */ } #wrapper { @@ -121,6 +122,7 @@ table { border-spacing: 0; width: 100%; margin: 20px 0; + position:relative; /* Allows us to position the loading indicator relative to the table */ } table thead tr { @@ -135,13 +137,23 @@ td, th { display: none; } -#progress { +.progress { position: absolute; - bottom: 50px; + top: 0; left: 0; bottom:0; right:0; + padding: auto; + padding-top: 20%; + + background: rgba(255,255,255,0.85); + display: none; + /*border-radius: 7px; + border: 1px solid #ddd;*/ } -#progress img { - vertical-align: top; +.progress * { + display: block; + margin: 0 auto; + text-align: center; + color: #999; } .settings { diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 1c00bbfa..b43f26bb 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -22,6 +22,7 @@ $(document).ready(function () { search.searchTerm = searchTerm; socket.emit("search", {searchTerm: searchTerm, offset:search.offset, limit: limit, sortBy: search.sortBy, sortDir: search.sortDir}); search.offset += limit; + $('#search-progress').show() } search.offset = 0; search.limit = 12; @@ -59,6 +60,18 @@ $(document).ready(function () { }) } + var progress = { + show: function(msg) { + $('#progress').show() + $('#progress .message').text(msg) + $(window).scrollTop(0) + }, + hide: function() { + $('#progress').hide() + $('#progress .message').text('') + } + } + function updateHandlers() { // Search $("#search-query").unbind('keyup').keyup(function () { @@ -67,14 +80,18 @@ $(document).ready(function () { // update & install $(".do-install, .do-update").unbind('click').click(function (e) { - var row = $(e.target).closest("tr"); - socket.emit("install", row.find(".name").text()); + var row = $(e.target).closest("tr") + , plugin = row.find(".name").text(); + socket.emit("install", plugin); + progress.show('Installing plugin '+plugin+'...') }); // uninstall $(".do-uninstall").unbind('click').click(function (e) { - var row = $(e.target).closest("tr"); - socket.emit("uninstall", row.find(".name").text()); + var row = $(e.target).closest("tr") + , plugin = row.find(".name").text(); + socket.emit("uninstall", plugin); + progress.show('Uninstalling plugin '+plugin+'...') }); // Infinite scroll @@ -121,16 +138,18 @@ $(document).ready(function () { var searchWidget = $(".search-results"); searchWidget.find(".results *").remove(); displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) + $('#search-progress').hide() }); socket.on('results:installed', function (data) { sortPluginList(data.installed, 'name', /*ASC?*/true); - $("#installed-plugins *").remove(); data.installed = data.installed.filter(function(plugin) { return plugin.name != 'ep_etherpad-lite' }) + $("#installed-plugins *").remove(); displayPluginList(data.installed, $("#installed-plugins"), $("#installed-plugin-template")); + progress.hide() setTimeout(function() { socket.emit('checkUpdates'); @@ -150,6 +169,16 @@ $(document).ready(function () { updateHandlers(); }) + socket.on('finished:install', function(data) { + if(data.error) alert('An error occured while installing the plugin. \n'+data.error) + socket.emit("getInstalled"); + }) + + socket.on('finished:uninstall', function(data) { + if(data.error) alert('An error occured while uninstalling the plugin. \n'+data.error) + socket.emit("getInstalled"); + }) + // init updateHandlers(); socket.emit("getInstalled"); diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 5b90aeab..1e798432 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -28,65 +28,70 @@
  2. Troubleshooting information
  3. <% e.end_block(); %> -
      
    -

    Installed plugins

    -
    NameDescriptionVersionNameDescriptionVersion
    - - - - - - - - - - - - - - - - - - -
    NameDescriptionVersion
    - -
    - -
    -
    - -

    Available plugins

    -
    - -
    - +

    Installed plugins

    - - - + + + - + + + - +
    NameDescriptionVersionNameDescriptionVersion
    - -
    -
    + +
    +
    + +

    Available plugins

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionVersion
    + +
    +
    +
    +
    +

    From 9109bd206ee44afd390db85ec0e7e8839ff8579a Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 11:20:12 +0100 Subject: [PATCH 175/463] Catch all errors in pluginfw/installer.js --- src/static/js/pluginfw/installer.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 1ef34733..56f18e10 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -6,7 +6,7 @@ var npmIsLoaded = false; var withNpm = function (npmfn) { if(npmIsLoaded) return npmfn(); npm.load({}, function (er) { - if (er) return cb(er); + if (er) return npmfn(er); npmIsLoaded = true; npm.on("log", function (message) { console.log('npm: ',message) @@ -16,7 +16,8 @@ var withNpm = function (npmfn) { } exports.uninstall = function(plugin_name, cb) { - withNpm(function () { + withNpm(function (er) { + if (er) return cb && cb(er); npm.commands.uninstall([plugin_name], function (er) { if (er) return cb && cb(er); hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { @@ -30,16 +31,17 @@ exports.uninstall = function(plugin_name, cb) { }; exports.install = function(plugin_name, cb) { - withNpm(function () { - npm.commands.install([plugin_name], function (er) { - if (er) return cb && cb(er); - hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { - if (er) return cb(er); - plugins.update(cb); - cb && cb(); - hooks.aCallAll("restartServer", {}, function () {}); - }); + withNpm(function (er) { + if (er) return cb && cb(er); + npm.commands.install([plugin_name], function (er) { + if (er) return cb && cb(er); + hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { + if (er) return cb(er); + plugins.update(cb); + cb && cb(); + hooks.aCallAll("restartServer", {}, function () {}); }); + }); }); }; @@ -47,7 +49,8 @@ exports.availablePlugins = null; var cacheTimestamp = 0; exports.getAvailablePlugins = function(maxCacheAge, cb) { - withNpm(function () { + withNpm(function (er) { + if (er) return cb && cb(er); if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { return cb && cb(null, exports.availablePlugins) } From 5d7a8adcb77ea53dea1109f74cf601c465909bfe Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 11:33:04 +0100 Subject: [PATCH 176/463] Silence npm when using npm.commands.search --- src/static/js/pluginfw/installer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 56f18e10..9723ec67 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -54,7 +54,7 @@ exports.getAvailablePlugins = function(maxCacheAge, cb) { if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { return cb && cb(null, exports.availablePlugins) } - npm.commands.search(['ep_'], function(er, results) { + npm.commands.search(['ep_'], /*silent?*/true, function(er, results) { if(er) return cb && cb(er); exports.availablePlugins = results; cacheTimestamp = Math.round(+new Date/1000); From 511407241a920a32746c5c1a97d1629ec99ffb01 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 11:38:51 +0100 Subject: [PATCH 177/463] /admin/plugins: Make it display the same amount of plugins after sorting --- src/static/js/admin/plugins.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index b43f26bb..8f03f3b9 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -106,15 +106,15 @@ $(document).ready(function () { search.sortBy = $(this).text().toLowerCase(); search.sortDir = false; search.offset = 0; - search.results = []; search(search.searchTerm, search.results.length); + search.results = []; }) $('.sort.down, .sort.none').unbind('click').click(function() { search.sortBy = $(this).text().toLowerCase(); search.sortDir = true; search.offset = 0; + search(search.searchTerm, search.results.length); search.results = []; - search(search.searchTerm); }) } From aca5d150e48810ccc98fb0c284c35b1cca1f2070 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 11:58:31 +0100 Subject: [PATCH 178/463] /admin/plugins: Don't list installed plugins as available --- src/node/hooks/express/adminplugins.js | 3 +++ src/static/js/admin/plugins.js | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index bf796ee7..3ef34115 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -72,6 +72,9 @@ exports.socketio = function (hook_name, args, cb) { var res = Object.keys(results) .map(function(pluginName) { return results[pluginName] + }) + .filter(function(plugin) { + return !plugins.plugins[plugin.name] }); res = sortPluginList(res, query.sortBy, query.sortDir) .slice(query.offset, query.offset+query.limit); diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 8f03f3b9..49477678 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -80,16 +80,17 @@ $(document).ready(function () { // update & install $(".do-install, .do-update").unbind('click').click(function (e) { - var row = $(e.target).closest("tr") - , plugin = row.find(".name").text(); + var $row = $(e.target).closest("tr") + , plugin = $row.find(".name").text(); socket.emit("install", plugin); progress.show('Installing plugin '+plugin+'...') }); // uninstall $(".do-uninstall").unbind('click').click(function (e) { - var row = $(e.target).closest("tr") - , plugin = row.find(".name").text(); + var $row = $(e.target).closest("tr") + , plugin = $row.find(".name").text(); + $row.remove() socket.emit("uninstall", plugin); progress.show('Uninstalling plugin '+plugin+'...') }); @@ -172,11 +173,21 @@ $(document).ready(function () { socket.on('finished:install', function(data) { if(data.error) alert('An error occured while installing the plugin. \n'+data.error) socket.emit("getInstalled"); + + // update search results + search.offset = 0; + search(search.searchTerm, search.results.length); + search.results = []; }) socket.on('finished:uninstall', function(data) { if(data.error) alert('An error occured while uninstalling the plugin. \n'+data.error) socket.emit("getInstalled"); + + // update search results + search.offset = 0; + search(search.searchTerm, search.results.length); + search.results = []; }) // init From 981a33f01ef1c1b66a03abdc971d9bd35669b412 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 14:40:19 +0100 Subject: [PATCH 179/463] pluginfw/installer.js fire callbacks only once --- src/static/js/pluginfw/installer.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 9723ec67..377be35e 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -23,7 +23,6 @@ exports.uninstall = function(plugin_name, cb) { hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); plugins.update(cb); - cb && cb(); hooks.aCallAll("restartServer", {}, function () {}); }); }); @@ -38,7 +37,6 @@ exports.install = function(plugin_name, cb) { hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); plugins.update(cb); - cb && cb(); hooks.aCallAll("restartServer", {}, function () {}); }); }); From 638cea5fd65cb0845cbb290bcaf6630ffea76a24 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 15:11:30 +0100 Subject: [PATCH 180/463] Install and uninstall plugins with style - Don't block the whole page when installing a plugin - allow people to search and install other plugins meanwhile Why? http://i.imgur.com/XoX6uYS.jpg --- src/node/hooks/express/adminplugins.js | 4 +- src/static/css/admin.css | 18 ++++-- src/static/js/admin/plugins.js | 77 ++++++++++++++++---------- src/templates/admin/plugins.html | 11 +++- 4 files changed, 70 insertions(+), 40 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 3ef34115..611a6b14 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -85,14 +85,14 @@ exports.socketio = function (hook_name, args, cb) { socket.on("install", function (plugin_name) { installer.install(plugin_name, function (er) { if(er) console.warn(er) - socket.emit("finished:install", {error: er? er.message : null}); + socket.emit("finished:install", {plugin: plugin_name, error: er? er.message : null}); }); }); socket.on("uninstall", function (plugin_name) { installer.uninstall(plugin_name, function (er) { if(er) console.warn(er) - socket.emit("finished:uninstall", {error: er? er.message : null}); + socket.emit("finished:uninstall", {plugin: plugin_name, error: er? er.message : null}); }); }); }); diff --git a/src/static/css/admin.css b/src/static/css/admin.css index d1c86ac5..c65aafd0 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -36,7 +36,6 @@ div.menu li:last-child { div.innerwrapper { padding: 15px; margin-left: 265px; - position:relative; /* Allows us to position the loading indicator relative to this div */ } #wrapper { @@ -137,23 +136,30 @@ td, th { display: none; } +#installed-plugins td>div { + position: relative;/* Allows us to position the loading indicator relative to this row */ + display: inline-block; /*make this fill the whole cell*/ +} + .progress { position: absolute; top: 0; left: 0; bottom:0; right:0; padding: auto; - padding-top: 20%; - background: rgba(255,255,255,0.85); + background: rgba(255,255,255,0.95); display: none; - /*border-radius: 7px; - border: 1px solid #ddd;*/ +} + +#search-progress.progress { + padding-top: 20%; + background: rgba(255,255,255,0.7); } .progress * { display: block; margin: 0 auto; text-align: center; - color: #999; + color: #666; } .settings { diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 49477678..ed854b7d 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -31,6 +31,20 @@ $(document).ready(function () { search.sortDir = /*DESC?*/true; search.end = true;// have we received all results already? + var installed = { + progress: { + show: function(plugin, msg) { + $('#installed-plugins .'+plugin+' .progress').show() + $('#installed-plugins .'+plugin+' .progress .message').text(msg) + }, + hide: function(plugin) { + $('#installed-plugins .'+plugin+' .progress').hide() + $('#installed-plugins .'+plugin+' .progress .message').text('') + } + }, + list: [] + } + function displayPluginList(plugins, container, template) { plugins.forEach(function(plugin) { var row = template.clone(); @@ -43,7 +57,7 @@ $(document).ready(function () { } } row.find(".version").html( plugin.version ); - + row.addClass(plugin.name) container.append(row); }) updateHandlers(); @@ -60,18 +74,6 @@ $(document).ready(function () { }) } - var progress = { - show: function(msg) { - $('#progress').show() - $('#progress .message').text(msg) - $(window).scrollTop(0) - }, - hide: function() { - $('#progress').hide() - $('#progress .message').text('') - } - } - function updateHandlers() { // Search $("#search-query").unbind('keyup').keyup(function () { @@ -82,17 +84,20 @@ $(document).ready(function () { $(".do-install, .do-update").unbind('click').click(function (e) { var $row = $(e.target).closest("tr") , plugin = $row.find(".name").text(); + $row.remove().appendTo('#installed-plugins') socket.emit("install", plugin); - progress.show('Installing plugin '+plugin+'...') + installed.progress.show(plugin, 'Installing') }); // uninstall $(".do-uninstall").unbind('click').click(function (e) { var $row = $(e.target).closest("tr") - , plugin = $row.find(".name").text(); - $row.remove() - socket.emit("uninstall", plugin); - progress.show('Uninstalling plugin '+plugin+'...') + , pluginName = $row.find(".name").text(); + socket.emit("uninstall", pluginName); + installed.progress.show(pluginName, 'Uninstalling') + installed.list = installed.list.filter(function(plugin) { + return plugin.name != pluginName + }) }); // Infinite scroll @@ -143,18 +148,19 @@ $(document).ready(function () { }); socket.on('results:installed', function (data) { - sortPluginList(data.installed, 'name', /*ASC?*/true); + installed.list = data.installed + sortPluginList(installed.list, 'name', /*ASC?*/true); - data.installed = data.installed.filter(function(plugin) { + // filter out epl + installed.list = installed.list.filter(function(plugin) { return plugin.name != 'ep_etherpad-lite' }) - $("#installed-plugins *").remove(); - displayPluginList(data.installed, $("#installed-plugins"), $("#installed-plugin-template")); - progress.hide() - setTimeout(function() { - socket.emit('checkUpdates'); - }, 5000) + // remove all installed plugins (leave all plugins that are still being installed) + installed.list.forEach(function(plugin) { + $('#installed-plugins .'+plugin.name).remove() + }) + displayPluginList(installed.list, $("#installed-plugins"), $("#installed-plugin-template")); }); socket.on('results:updatable', function(data) { @@ -171,7 +177,11 @@ $(document).ready(function () { }) socket.on('finished:install', function(data) { - if(data.error) alert('An error occured while installing the plugin. \n'+data.error) + if(data.error) { + alert('An error occured while installing '+data.plugin+' \n'+data.error) + $('#installed-plugins .'+data.plugin).remove() + } + socket.emit("getInstalled"); // update search results @@ -181,9 +191,13 @@ $(document).ready(function () { }) socket.on('finished:uninstall', function(data) { - if(data.error) alert('An error occured while uninstalling the plugin. \n'+data.error) - socket.emit("getInstalled"); + if(data.error) alert('An error occured while uninstalling the '+data.plugin+' \n'+data.error) + + // remove plugin from installed list + $('#installed-plugins .'+data.plugin).remove() + socket.emit("getInstalled"); + // update search results search.offset = 0; search(search.searchTerm, search.results.length); @@ -194,4 +208,9 @@ $(document).ready(function () { updateHandlers(); socket.emit("getInstalled"); search(''); + + // check for updates every 15mins + setInterval(function() { + socket.emit('checkUpdates'); + }, 1000*60*15) }); diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 1e798432..e9c34917 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -47,7 +47,10 @@ - +
    + +

    +
    @@ -78,7 +81,10 @@ - +
    + +

    +
    @@ -91,7 +97,6 @@ -

    From 7edfff75743a876d94411e9a1313a8f19777502c Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 16:23:47 +0100 Subject: [PATCH 181/463] /admin/plugins: Show some text if nothing is display otherwise --- src/static/css/admin.css | 9 +++++++++ src/static/js/admin/plugins.js | 21 ++++++++++++++++++--- src/templates/admin/plugins.html | 16 ++++++++++++---- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/static/css/admin.css b/src/static/css/admin.css index c65aafd0..7a2e00f4 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -141,6 +141,15 @@ td, th { display: inline-block; /*make this fill the whole cell*/ } +.messages * { + text-align: center; + display: none; +} + +.messages .fetching { + display: block; +} + .progress { position: absolute; top: 0; left: 0; bottom:0; right:0; diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index ed854b7d..f640ed83 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -87,6 +87,7 @@ $(document).ready(function () { $row.remove().appendTo('#installed-plugins') socket.emit("install", plugin); installed.progress.show(plugin, 'Installing') + $(".installed-results .nothing-installed").hide() }); // uninstall @@ -126,6 +127,8 @@ $(document).ready(function () { socket.on('results:search', function (data) { if(!data.results.length) search.end = true; + $(".search-results .nothing-found").hide() + $(".search-results .fetching").hide() console.log('got search results', data) @@ -143,11 +146,18 @@ $(document).ready(function () { // re-render search results var searchWidget = $(".search-results"); searchWidget.find(".results *").remove(); - displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) + if(search.results.length > 0) { + displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) + }else { + $(".search-results .nothing-found").show() + } $('#search-progress').hide() }); socket.on('results:installed', function (data) { + $(".installed-results .nothing-installed").hide() + $(".installed-results .fetching").hide() + installed.list = data.installed sortPluginList(installed.list, 'name', /*ASC?*/true); @@ -156,11 +166,16 @@ $(document).ready(function () { return plugin.name != 'ep_etherpad-lite' }) - // remove all installed plugins (leave all plugins that are still being installed) + // remove all installed plugins (leave plugins that are still being installed) installed.list.forEach(function(plugin) { $('#installed-plugins .'+plugin.name).remove() }) - displayPluginList(installed.list, $("#installed-plugins"), $("#installed-plugin-template")); + + if(installed.list.length > 0) { + displayPluginList(installed.list, $("#installed-plugins"), $("#installed-plugin-template")); + }else { + $(".installed-results .nothing-installed").show() + } }); socket.on('results:updatable', function(data) { diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index e9c34917..8ca24644 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -32,7 +32,7 @@

    Installed plugins

    - +
    @@ -56,6 +56,12 @@ + + +
    Name
    +

    You haven't installed any plugins yet.

    +

    Fetching installed plugins...

    +
    @@ -91,9 +97,11 @@ - -
    - + +
    +

    No plugins found.

    +

    Fetching catalogue...

    +
    From e96baf6ef1fde0e47e0a4afaf32078dc39e441ff Mon Sep 17 00:00:00 2001 From: neurolit Date: Tue, 26 Mar 2013 16:37:57 +0100 Subject: [PATCH 182/463] API documentation: listAllPads() returns {padIDs: [...]} instead of [...] --- doc/api/http_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/http_api.md b/doc/api/http_api.md index 7e05ff86..f71e0a5d 100644 --- a/doc/api/http_api.md +++ b/doc/api/http_api.md @@ -458,4 +458,4 @@ returns ok when the current api token is valid lists all pads on this epl instance *Example returns:* - * `{code: 0, message:"ok", data: ["testPad", "thePadsOfTheOthers"]}` + * `{code: 0, message:"ok", data: {padIDs: ["testPad", "thePadsOfTheOthers"]}}` From f75a839cd093480684f2a0790b67dd9bd7324197 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 18:39:46 +0100 Subject: [PATCH 183/463] Remove plugin prefix in pluin lists and make links to plugins more clear --- src/static/css/admin.css | 22 ++++++++++++++++++++-- src/static/js/admin/plugins.js | 7 ++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/static/css/admin.css b/src/static/css/admin.css index 7a2e00f4..56019129 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -155,7 +155,7 @@ td, th { top: 0; left: 0; bottom:0; right:0; padding: auto; - background: rgba(255,255,255,0.95); + background: rgb(255,255,255); display: none; } @@ -187,7 +187,25 @@ a:link, a:visited, a:hover, a:focus { } a:focus, a:hover { - border-bottom: #333333 1px solid; + text-decoration: underline; +} + +.installed-results a:link, +.search-results a:link, +.installed-results a:visited, +.search-results a:visited, +.installed-results a:hover, +.search-results a:hover, +.installed-results a:focus, +.search-results a:focus { + text-decoration: underline; +} + +.installed-results a:focus, +.search-results a:focus, +.installed-results a:hover, +.search-results a:hover { + text-decoration: none; } pre { diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index f640ed83..21edee6b 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -51,13 +51,14 @@ $(document).ready(function () { for (attr in plugin) { if(attr == "name"){ // Hack to rewrite URLS into name - row.find(".name").html(""+plugin['name']+""); + row.find(".name").html(""+plugin['name'].substr(3)+""); // remove 'ep_' }else{ row.find("." + attr).html(plugin[attr]); } } row.find(".version").html( plugin.version ); row.addClass(plugin.name) + row.data('plugin', plugin.name) container.append(row); }) updateHandlers(); @@ -83,7 +84,7 @@ $(document).ready(function () { // update & install $(".do-install, .do-update").unbind('click').click(function (e) { var $row = $(e.target).closest("tr") - , plugin = $row.find(".name").text(); + , plugin = $row.data('plugin'); $row.remove().appendTo('#installed-plugins') socket.emit("install", plugin); installed.progress.show(plugin, 'Installing') @@ -93,7 +94,7 @@ $(document).ready(function () { // uninstall $(".do-uninstall").unbind('click').click(function (e) { var $row = $(e.target).closest("tr") - , pluginName = $row.find(".name").text(); + , pluginName = $row.data('plugin'); socket.emit("uninstall", pluginName); installed.progress.show(pluginName, 'Uninstalling') installed.list = installed.list.filter(function(plugin) { From 2393dcd65259e232006ad5c956f19eeee60370e7 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 19:22:04 +0100 Subject: [PATCH 184/463] Disable search until registry is loaded and fix sorting by version ... and always display a scrollbar. --- src/static/css/admin.css | 2 +- src/static/js/admin/plugins.js | 1 + src/templates/admin/plugins.html | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/static/css/admin.css b/src/static/css/admin.css index 56019129..3108655e 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -43,7 +43,7 @@ div.innerwrapper { box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.2); margin: auto; max-width: 1150px; - min-height: 100%; + min-height: 101%;/*always display a scrollbar*/ } h1 { diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 21edee6b..53e16ff3 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -130,6 +130,7 @@ $(document).ready(function () { if(!data.results.length) search.end = true; $(".search-results .nothing-found").hide() $(".search-results .fetching").hide() + $("#search-query").removeAttr('disabled') console.log('got search results', data) diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 8ca24644..fe1f607a 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -69,7 +69,7 @@

    Available plugins

    - +
    @@ -77,7 +77,7 @@ - + From 4edb3b7ab3a7f2aeb24d510dd103b079d67c31a1 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 19:32:15 +0100 Subject: [PATCH 185/463] /admin/plugins: Fix infinite scroll for larger screens --- src/static/js/admin/plugins.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 53e16ff3..440b5879 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -75,6 +75,16 @@ $(document).ready(function () { }) } + // Infinite scroll + $(window).scroll(checkInfiniteScroll) + function checkInfiniteScroll() { + if(search.end) return;// don't keep requesting if there are no more results + try{ + var top = $('.search-results .results > tr:last').offset().top + if($(window).scrollTop()+$(window).height() > top) search(search.searchTerm) + }catch(e){} + } + function updateHandlers() { // Search $("#search-query").unbind('keyup').keyup(function () { @@ -102,13 +112,6 @@ $(document).ready(function () { }) }); - // Infinite scroll - $(window).unbind('scroll').scroll(function() { - if(search.end) return;// don't keep requesting if there are no more results - var top = $('.search-results .results > tr:last').offset().top - if($(window).scrollTop()+$(window).height() > top) search(search.searchTerm) - }) - // Sort $('.sort.up').unbind('click').click(function() { search.sortBy = $(this).text().toLowerCase(); @@ -154,6 +157,7 @@ $(document).ready(function () { $(".search-results .nothing-found").show() } $('#search-progress').hide() + checkInfiniteScroll() }); socket.on('results:installed', function (data) { From 806926d0f6013369096577e7ad9389e0579a8b98 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 19:54:23 +0100 Subject: [PATCH 186/463] /admin/plugins: If a user installs sth scroll up to the loading indicator --- src/static/js/admin/plugins.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 440b5879..2ffb55b0 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -36,6 +36,7 @@ $(document).ready(function () { show: function(plugin, msg) { $('#installed-plugins .'+plugin+' .progress').show() $('#installed-plugins .'+plugin+' .progress .message').text(msg) + $(window).scrollTop(0) }, hide: function(plugin) { $('#installed-plugins .'+plugin+' .progress').hide() From 76c879bb4705212747b9d2e0d546a5db6d97bc68 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 20:41:24 +0100 Subject: [PATCH 187/463] /admin/plugins: Fix for smaller screens --- src/static/css/admin.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/css/admin.css b/src/static/css/admin.css index 3108655e..322fe41c 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -35,7 +35,7 @@ div.menu li:last-child { div.innerwrapper { padding: 15px; - margin-left: 265px; + padding-left: 265px; } #wrapper { From d01a209cbf3377bc9c03719b00f2a3adbbb5b386 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 21:04:21 +0100 Subject: [PATCH 188/463] /admin/plugins: Dry up displaying of info messages --- src/static/css/admin.css | 4 +-- src/static/js/admin/plugins.js | 42 +++++++++++++++++++++++--------- src/templates/admin/plugins.html | 8 +++--- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/static/css/admin.css b/src/static/css/admin.css index 322fe41c..31b16b9c 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -141,9 +141,9 @@ td, th { display: inline-block; /*make this fill the whole cell*/ } -.messages * { - text-align: center; +.messages td>* { display: none; + text-align: center; } .messages .fetching { diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 2ffb55b0..3937e666 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -30,17 +30,37 @@ $(document).ready(function () { search.sortBy = 'name'; search.sortDir = /*DESC?*/true; search.end = true;// have we received all results already? + search.messages = { + show: function(msg) { + $('.search-results .messages').show() + $('.search-results .messages .'+msg+'').show() + }, + hide: function(msg) { + $('.search-results .messages').hide() + $('.search-results .messages .'+msg+'').hide() + } + } var installed = { progress: { show: function(plugin, msg) { - $('#installed-plugins .'+plugin+' .progress').show() - $('#installed-plugins .'+plugin+' .progress .message').text(msg) + $('.installed-results .'+plugin+' .progress').show() + $('.installed-results .'+plugin+' .progress .message').text(msg) $(window).scrollTop(0) }, hide: function(plugin) { - $('#installed-plugins .'+plugin+' .progress').hide() - $('#installed-plugins .'+plugin+' .progress .message').text('') + $('.installed-results .'+plugin+' .progress').hide() + $('.installed-results .'+plugin+' .progress .message').text('') + } + }, + messages: { + show: function(msg) { + $('.installed-results .messages').show() + $('.installed-results .messages .'+msg+'').show() + }, + hide: function(msg) { + $('.installed-results .messages').hide() + $('.installed-results .messages .'+msg+'').hide() } }, list: [] @@ -99,7 +119,7 @@ $(document).ready(function () { $row.remove().appendTo('#installed-plugins') socket.emit("install", plugin); installed.progress.show(plugin, 'Installing') - $(".installed-results .nothing-installed").hide() + installed.messages.hide("nothing-installed") }); // uninstall @@ -132,8 +152,8 @@ $(document).ready(function () { socket.on('results:search', function (data) { if(!data.results.length) search.end = true; - $(".search-results .nothing-found").hide() - $(".search-results .fetching").hide() + search.messages.hide('nothing-found') + search.messages.hide('fetching') $("#search-query").removeAttr('disabled') console.log('got search results', data) @@ -155,15 +175,15 @@ $(document).ready(function () { if(search.results.length > 0) { displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) }else { - $(".search-results .nothing-found").show() + search.messages.show('nothing-found') } $('#search-progress').hide() checkInfiniteScroll() }); socket.on('results:installed', function (data) { - $(".installed-results .nothing-installed").hide() - $(".installed-results .fetching").hide() + installed.messages.hide("fetching") + installed.messages.hide("nothing-installed") installed.list = data.installed sortPluginList(installed.list, 'name', /*ASC?*/true); @@ -181,7 +201,7 @@ $(document).ready(function () { if(installed.list.length > 0) { displayPluginList(installed.list, $("#installed-plugins"), $("#installed-plugin-template")); }else { - $(".installed-results .nothing-installed").show() + installed.messages.show("nothing-installed") } }); diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index fe1f607a..270fbfd7 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -56,8 +56,8 @@ - - + @@ -96,8 +96,8 @@ - - + - -
    Name DescriptionVersionVersion
    +

    You haven't installed any plugins yet.

    Fetching installed plugins...

    +

    No plugins found.

    Fetching catalogue...

    From ac0018cdfafa8b8b5de594ff9127c190d20f3f63 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Tue, 26 Mar 2013 21:19:09 +0100 Subject: [PATCH 189/463] Don't leak event listeners for process:uncaughtException --- src/node/hooks/express/errorhandling.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/node/hooks/express/errorhandling.js b/src/node/hooks/express/errorhandling.js index 3c595683..825c5f3b 100644 --- a/src/node/hooks/express/errorhandling.js +++ b/src/node/hooks/express/errorhandling.js @@ -28,6 +28,7 @@ exports.gracefulShutdown = function(err) { }, 3000); } +process.on('uncaughtException', exports.gracefulShutdown); exports.expressCreateServer = function (hook_name, args, cb) { exports.app = args.app; @@ -47,6 +48,4 @@ exports.expressCreateServer = function (hook_name, args, cb) { //https://github.com/joyent/node/issues/1553 process.on('SIGINT', exports.gracefulShutdown); } - - process.on('uncaughtException', exports.gracefulShutdown); -} +} \ No newline at end of file From c4d9a71156c39d84350230e88ef9ebab148f1a2a Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 27 Mar 2013 12:02:19 +0100 Subject: [PATCH 190/463] /admin/plugins: Fix update check --- src/node/hooks/express/adminplugins.js | 4 ++-- src/static/css/admin.css | 1 + src/static/js/admin/plugins.js | 27 +++++++++++++------------- src/templates/admin/plugins.html | 8 ++++---- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 611a6b14..d8f19bba 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -35,9 +35,9 @@ exports.socketio = function (hook_name, args, cb) { socket.emit("results:installed", {installed: installed}); }); - socket.on("getUpdatable", function() { + socket.on("checkUpdates", function() { // Check plugins for updates - installer.getAvailable(/*maxCacheAge:*/60*10, function(er, results) { + installer.getAvailablePlugins(/*maxCacheAge:*/60*10, function(er, results) { if(er) { console.warn(er); socket.emit("results:updatable", {updatable: {}}); diff --git a/src/static/css/admin.css b/src/static/css/admin.css index 31b16b9c..2260e27d 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -139,6 +139,7 @@ td, th { #installed-plugins td>div { position: relative;/* Allows us to position the loading indicator relative to this row */ display: inline-block; /*make this fill the whole cell*/ + width:100%; } .messages td>* { diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 3937e666..bc7a0208 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -46,7 +46,7 @@ $(document).ready(function () { show: function(plugin, msg) { $('.installed-results .'+plugin+' .progress').show() $('.installed-results .'+plugin+' .progress .message').text(msg) - $(window).scrollTop(0) + $(window).scrollTop($('.'+plugin).offset().top-100) }, hide: function(plugin) { $('.installed-results .'+plugin+' .progress').hide() @@ -116,9 +116,13 @@ $(document).ready(function () { $(".do-install, .do-update").unbind('click').click(function (e) { var $row = $(e.target).closest("tr") , plugin = $row.data('plugin'); - $row.remove().appendTo('#installed-plugins') + if($(this).hasClass('do-install')) { + $row.remove().appendTo('#installed-plugins') + installed.progress.show(plugin, 'Installing') + }else{ + installed.progress.show(plugin, 'Updating') + } socket.emit("install", plugin); - installed.progress.show(plugin, 'Installing') installed.messages.hide("nothing-installed") }); @@ -200,20 +204,17 @@ $(document).ready(function () { if(installed.list.length > 0) { displayPluginList(installed.list, $("#installed-plugins"), $("#installed-plugin-template")); + socket.emit('checkUpdates'); }else { installed.messages.show("nothing-installed") } }); socket.on('results:updatable', function(data) { - $('#installed-plugins > tr').each(function(i, tr) { - var pluginName = $(tr).find('.name').text() - - if (data.updatable.indexOf(pluginName) >= 0) { - var actions = $(tr).find('.actions') - actions.append('') - actions.css('width', 200) - } + data.updatable.forEach(function(pluginName) { + var $row = $('#installed-plugins > tr.'+pluginName) + , actions = $row.find('.actions') + actions.append('') }) updateHandlers(); }) @@ -251,8 +252,8 @@ $(document).ready(function () { socket.emit("getInstalled"); search(''); - // check for updates every 15mins + // check for updates every 5mins setInterval(function() { socket.emit('checkUpdates'); - }, 1000*60*15) + }, 1000*60*5) }); diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 270fbfd7..1b69549c 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -46,8 +46,8 @@
    -
    +
    +

    @@ -86,8 +86,8 @@
    -
    +
    +

    From bc8d6d4c45f443716d3334e1606cf7664b9a97ac Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 27 Mar 2013 12:20:50 +0100 Subject: [PATCH 191/463] /admin/plugins: Add a loading indicator to some messages --- src/static/js/admin/plugins.js | 2 +- src/templates/admin/plugins.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index bc7a0208..e2e07e96 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -46,7 +46,7 @@ $(document).ready(function () { show: function(plugin, msg) { $('.installed-results .'+plugin+' .progress').show() $('.installed-results .'+plugin+' .progress .message').text(msg) - $(window).scrollTop($('.'+plugin).offset().top-100) + if($(window).scrollTop() > $('.'+plugin).offset().top)$(window).scrollTop($('.'+plugin).offset().top-100) }, hide: function(plugin) { $('.installed-results .'+plugin+' .progress').hide() diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 1b69549c..44e6f7a5 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -59,7 +59,7 @@

    You haven't installed any plugins yet.

    -

    Fetching installed plugins...

    +


    Fetching installed plugins...

    @@ -100,7 +100,7 @@

    No plugins found.

    -

    Fetching catalogue...

    +


    Fetching catalogue...

    From cbee50d42d8a528c524ad5a76a54bf59e8978689 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 27 Mar 2013 12:28:54 +0100 Subject: [PATCH 192/463] /admin/plugins: Display a tooltip when hovering the plugin details link --- src/static/js/admin/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index e2e07e96..41affa74 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -72,7 +72,7 @@ $(document).ready(function () { for (attr in plugin) { if(attr == "name"){ // Hack to rewrite URLS into name - row.find(".name").html(""+plugin['name'].substr(3)+""); // remove 'ep_' + row.find(".name").html(""+plugin['name'].substr(3)+""); // remove 'ep_' }else{ row.find("." + attr).html(plugin[attr]); } From 40cbe55507fdf9eb45e092d3f9321de4f72dce22 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 27 Mar 2013 14:11:20 +0000 Subject: [PATCH 193/463] Update en.json --- src/locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 920a2b00..d08ebe65 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -16,7 +16,7 @@ "pad.toolbar.timeslider.title": "Timeslider", "pad.toolbar.savedRevision.title": "Save Revision", "pad.toolbar.settings.title": "Settings", - "pad.toolbar.embed.title": "Embed this pad", + "pad.toolbar.embed.title": "Share and Embed this pad", "pad.toolbar.showusers.title": "Show the users on this pad", "pad.colorpicker.save": "Save", "pad.colorpicker.cancel": "Cancel", @@ -113,4 +113,4 @@ "pad.impexp.importfailed": "Import failed", "pad.impexp.copypaste": "Please copy paste", "pad.impexp.exportdisabled": "Exporting as {{type}} format is disabled. Please contact your system administrator for details." -} \ No newline at end of file +} From c48917720699fb1e4b304a464978f016f1967531 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 28 Mar 2013 02:24:59 +0000 Subject: [PATCH 194/463] show light yellow for .5 secs on save revision keypress --- src/static/js/ace2_inner.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index fc69d592..e00d2ee7 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3649,6 +3649,11 @@ function Ace2Inner(){ if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "s" && (evt.metaKey || evt.ctrlKey)) /* Do a saved revision on ctrl S */ { evt.preventDefault(); + var originalBackground = parent.parent.$('#revisionlink').css("background") + parent.parent.$('#revisionlink').css({"background":"lightyellow"}); + setTimeout(function(){ + parent.parent.$('#revisionlink').css({"background":originalBackground}); + }, 500); parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ specialHandled = true; } From 59a9ff404d1be02ccb051eabdd487117e789a04b Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 28 Mar 2013 13:18:55 +0000 Subject: [PATCH 195/463] more settimeout to top window --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index e00d2ee7..1ab026ef 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3651,7 +3651,7 @@ function Ace2Inner(){ evt.preventDefault(); var originalBackground = parent.parent.$('#revisionlink').css("background") parent.parent.$('#revisionlink').css({"background":"lightyellow"}); - setTimeout(function(){ + top.setTimeout(function(){ parent.parent.$('#revisionlink').css({"background":originalBackground}); }, 500); parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ From 0ff5137da3b1b6396e1b489cee90525664b9188d Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Thu, 28 Mar 2013 16:39:33 +0100 Subject: [PATCH 196/463] Make revision button glow on ctrl-s and increase duration --- src/static/js/ace2_inner.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 1ab026ef..cbae0be9 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3650,10 +3650,10 @@ function Ace2Inner(){ { evt.preventDefault(); var originalBackground = parent.parent.$('#revisionlink').css("background") - parent.parent.$('#revisionlink').css({"background":"lightyellow"}); + parent.parent.$('#revisionlink').css({"background":"lightyellow", 'box-shadow': '0 0 50px yellow'}); top.setTimeout(function(){ - parent.parent.$('#revisionlink').css({"background":originalBackground}); - }, 500); + parent.parent.$('#revisionlink').css({"background":originalBackground, 'box-shadow': 'none'}); + }, 1000); parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ specialHandled = true; } From d73ea4e334ed3345ceaf110db4b1d71737d7db8e Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 29 Mar 2013 02:24:15 +0000 Subject: [PATCH 197/463] Loading blocks --- src/templates/pad.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/templates/pad.html b/src/templates/pad.html index 1d8c069a..ef621545 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -195,7 +195,9 @@

    Your password was wrong

    + <% e.begin_block("loading"); %>

    Loading...

    + <% e.end_block(); %>
    From c67c7ca746fda220b15d05d913a2b74a00332377 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 29 Mar 2013 03:09:10 +0000 Subject: [PATCH 198/463] remove messy bits --- src/static/js/ace2_inner.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index cbae0be9..46b308ce 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3650,9 +3650,9 @@ function Ace2Inner(){ { evt.preventDefault(); var originalBackground = parent.parent.$('#revisionlink').css("background") - parent.parent.$('#revisionlink').css({"background":"lightyellow", 'box-shadow': '0 0 50px yellow'}); + parent.parent.$('#revisionlink').css({"background":"lightyellow"}); top.setTimeout(function(){ - parent.parent.$('#revisionlink').css({"background":originalBackground, 'box-shadow': 'none'}); + parent.parent.$('#revisionlink').css({"background":originalBackground}); }, 1000); parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ specialHandled = true; From 358b07390e28338ddf6fa6e077fdbeb117431c99 Mon Sep 17 00:00:00 2001 From: Manuel Knitza Date: Sat, 30 Mar 2013 15:42:10 +0100 Subject: [PATCH 199/463] fix "util.pump() is deprecated. Use readableStream.pipe()" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix error introduced by b3988e3  --- src/node/utils/caching_middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/utils/caching_middleware.js b/src/node/utils/caching_middleware.js index a970bfc9..ab3d8edd 100644 --- a/src/node/utils/caching_middleware.js +++ b/src/node/utils/caching_middleware.js @@ -168,7 +168,7 @@ CachingMiddleware.prototype = new function () { } else if (req.method == 'GET') { var readStream = fs.createReadStream(pathStr); res.writeHead(statusCode, headers); - readableStream.pipe(readStream, res); + readStream.pipe(res); } else { res.writeHead(statusCode, headers); res.end(); From 253a8e37fd6f7a81bd0e7659919890a36dad3f23 Mon Sep 17 00:00:00 2001 From: mluto Date: Sat, 30 Mar 2013 20:28:46 +0100 Subject: [PATCH 200/463] Added debug-output to SecurityManager.checkAccess to indicate *why* an auth-try failed. --- src/node/db/SecurityManager.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 4289e39c..074728b5 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -134,12 +134,14 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //is it for this group? if(sessionInfo.groupID != groupID) { + console.debug("Auth failed: wrong group"); callback(); return; } //is validUntil still ok? if(sessionInfo.validUntil <= now){ + console.debug("Auth failed: validUntil"); callback(); return; } @@ -234,7 +236,11 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //--> grant access statusObject = {accessStatus: "grant", authorID: sessionAuthor}; //--> deny access if user isn't allowed to create the pad - if(settings.editOnly) statusObject.accessStatus = "deny"; + if(settings.editOnly) + { + console.debug("Auth failed: valid session & pad does not exist"); + statusObject.accessStatus = "deny"; + } } // there is no valid session avaiable AND pad exists else if(!validSession && padExists) @@ -266,6 +272,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //- its not public else if(!isPublic) { + console.debug("Auth failed: invalid session & pad is not public"); //--> deny access statusObject = {accessStatus: "deny"}; } @@ -277,6 +284,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) // there is no valid session avaiable AND pad doesn't exists else { + console.debug("Auth failed: invalid session & pad does not exist"); //--> deny access statusObject = {accessStatus: "deny"}; } From 7e3b288afc53e8908c0550c9d0944af6183c161a Mon Sep 17 00:00:00 2001 From: mluto Date: Sat, 30 Mar 2013 20:46:56 +0100 Subject: [PATCH 201/463] log things the log4js-way; put all the brackets on a new line --- src/node/db/SecurityManager.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 074728b5..d3a98446 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -27,6 +27,8 @@ var padManager = require("./PadManager"); var sessionManager = require("./SessionManager"); var settings = require("../utils/Settings"); var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var log4js = require('log4js'); +var authLogger = log4js.getLogger("auth"); /** * This function controlls the access to a pad, it checks if the user can access a pad. @@ -117,14 +119,17 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //get information about all sessions contained in this cookie function(callback) { - if (!sessionCookie) { + if (!sessionCookie) + { callback(); return; } var sessionIDs = sessionCookie.split(','); - async.forEach(sessionIDs, function(sessionID, callback) { - sessionManager.getSessionInfo(sessionID, function(err, sessionInfo) { + async.forEach(sessionIDs, function(sessionID, callback) + { + sessionManager.getSessionInfo(sessionID, function(err, sessionInfo) + { //skip session if it doesn't exist if(err && err.message == "sessionID does not exist") return; @@ -133,15 +138,17 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) var now = Math.floor(new Date().getTime()/1000); //is it for this group? - if(sessionInfo.groupID != groupID) { - console.debug("Auth failed: wrong group"); + if(sessionInfo.groupID != groupID) + { + authLogger.debug("Auth failed: wrong group"); callback(); return; } //is validUntil still ok? - if(sessionInfo.validUntil <= now){ - console.debug("Auth failed: validUntil"); + if(sessionInfo.validUntil <= now) + { + authLogger.debug("Auth failed: validUntil"); callback(); return; } @@ -238,7 +245,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //--> deny access if user isn't allowed to create the pad if(settings.editOnly) { - console.debug("Auth failed: valid session & pad does not exist"); + authLogger.debug("Auth failed: valid session & pad does not exist"); statusObject.accessStatus = "deny"; } } @@ -272,7 +279,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //- its not public else if(!isPublic) { - console.debug("Auth failed: invalid session & pad is not public"); + authLogger.debug("Auth failed: invalid session & pad is not public"); //--> deny access statusObject = {accessStatus: "deny"}; } @@ -284,7 +291,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) // there is no valid session avaiable AND pad doesn't exists else { - console.debug("Auth failed: invalid session & pad does not exist"); + authLogger.debug("Auth failed: invalid session & pad does not exist"); //--> deny access statusObject = {accessStatus: "deny"}; } From 30cae9097f2979048a2491b2ec032aa9548121a2 Mon Sep 17 00:00:00 2001 From: mluto Date: Sun, 31 Mar 2013 10:27:21 +0200 Subject: [PATCH 202/463] When there is just one session and this one is invalid SecurityManager.checkAccess would cause the request to hang forever because the callback is omitted for each invalid session, this fixes this issue. validSession still remains false so this does not cause issues further down. --- src/node/db/SecurityManager.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index d3a98446..410204e0 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -131,7 +131,11 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) sessionManager.getSessionInfo(sessionID, function(err, sessionInfo) { //skip session if it doesn't exist - if(err && err.message == "sessionID does not exist") return; + if(err && err.message == "sessionID does not exist") + { + callback(); + return; + } if(ERR(err, callback)) return; From 911bfb30e4d1f11ea569cc0d922085821dd23158 Mon Sep 17 00:00:00 2001 From: mluto Date: Sun, 31 Mar 2013 10:56:14 +0200 Subject: [PATCH 203/463] Log when a sessionID in checkAccess is not found --- src/node/db/SecurityManager.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 410204e0..06e58bc4 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -133,6 +133,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //skip session if it doesn't exist if(err && err.message == "sessionID does not exist") { + authLogger.debug("Auth failed: unknown session"); callback(); return; } From 1793e93ea1b831329b580c7a5aa4fb982c665417 Mon Sep 17 00:00:00 2001 From: mluto Date: Sun, 31 Mar 2013 11:30:01 +0200 Subject: [PATCH 204/463] Decode the sessionID before sending it to the server since our separator ',' gets encoded --- src/static/js/pad.js | 2 +- src/static/js/timeslider.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index e5e6e95f..5cc02d87 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -191,7 +191,7 @@ function handshake() createCookie("token", token, 60); } - var sessionID = readCookie("sessionID"); + var sessionID = decodeURIComponent(readCookie("sessionID")); var password = readCookie("password"); var msg = { diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index eb3703d9..cd98dead 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -116,7 +116,7 @@ function init() { //sends a message over the socket function sendSocketMsg(type, data) { - var sessionID = readCookie("sessionID"); + var sessionID = decodeURIComponent(readCookie("sessionID")); var password = readCookie("password"); var msg = { "component" : "pad", // FIXME: Remove this stupidity! From 98f00e293c66ff03e980dbb3b1767199f535df63 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 1 Apr 2013 13:24:22 +0200 Subject: [PATCH 205/463] Update ueberDB to add support for node 0.10.x --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index a7147cf2..7d30cc49 100644 --- a/src/package.json +++ b/src/package.json @@ -16,7 +16,7 @@ "require-kernel" : "1.0.5", "resolve" : "0.2.x", "socket.io" : "0.9.x", - "ueberDB" : "0.1.94", + "ueberDB" : "0.2.x", "async" : "0.1.x", "express" : "3.x", "connect" : "2.4.x", From 782c512e930cc4db2ed05a8c1de69ca5fe671088 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 1 Apr 2013 14:07:38 +0200 Subject: [PATCH 206/463] Drop support for node v0.6, officially --- README.md | 2 ++ bin/installDeps.sh | 4 ++-- bin/installOnWindows.bat | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 57474073..291ecaee 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**, # Installation +Etherpad works with node v0.8 and v0.10, only. (We don't suppot v0.6) + ## Windows ### Prebuilt windows package diff --git a/bin/installDeps.sh b/bin/installDeps.sh index fc3133c1..161cabcc 100755 --- a/bin/installDeps.sh +++ b/bin/installDeps.sh @@ -44,8 +44,8 @@ fi #check node version NODE_VERSION=$(node --version) NODE_V_MINOR=$(echo $NODE_VERSION | cut -d "." -f 1-2) -if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.6" ] && [ ! $NODE_V_MINOR = "v0.10" ]; then - echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.6.x, v0.8.x or v0.10.x" >&2 +if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.10" ]; then + echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.8.x or v0.10.x" >&2 exit 1 fi diff --git a/bin/installOnWindows.bat b/bin/installOnWindows.bat index f7452982..f56c7926 100644 --- a/bin/installOnWindows.bat +++ b/bin/installOnWindows.bat @@ -8,7 +8,7 @@ cmd /C node -e "" || ( echo "Please install node.js ( http://nodejs.org )" && ex echo _ echo Checking node version... -set check_version="if(['6','8','10'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad Lite requires v0.6.x, v0.8.x or v0.10.x'); process.exit(1) }" +set check_version="if(['8','10'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad Lite requires v0.8.x or v0.10.x'); process.exit(1) }" cmd /C node -e %check_version% || exit /B 1 echo _ From 8f1348b40b5d33ac02029207d3e0398fedbbf5cd Mon Sep 17 00:00:00 2001 From: Guyzmo Date: Mon, 1 Apr 2013 17:18:45 +0200 Subject: [PATCH 207/463] Added getAttributePool, getRevisionOfHead and getRevisionChangeset methods to API v1.2.8 Signed-off-by: Bernard `Guyzmo` Pratz --- src/node/db/API.js | 86 ++++++++++++++++++++++++++++++++++ src/node/handler/APIHandler.js | 42 ++++++++++++++++- 2 files changed, 127 insertions(+), 1 deletion(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 3955d495..a0a84e32 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -74,6 +74,92 @@ exports.listSessionsOfAuthor = sessionManager.listSessionsOfAuthor; /**PAD CONTENT FUNCTIONS*/ /************************/ +/** +getAttributePool(padID) returns the attribute pool of a pad + +*/ +exports.getAttributePool = function (padID, callback) +{ + getPadSafe(padID, true, function(err, pad) + { + if (ERR(err, callback)) return; + callbalk(null, {pool: pad.pool}); + }); +} + +/** +getRevisionChangeset (padID, [rev]) + +*/ +exports.getRevisionChangeset = function(padID, rev, callback) +{ + // check if rev is set + if (typeof rev === "function") + { + callback = rev; + rev = undefined; + } + + // check if rev is a number + if (rev !== undefined && typeof rev !== "number") + { + // try to parse the number + if (!isNaN(parseInt(rev)) + { + rev = parseInt(rev); + } + else + { + callback(new customError("rev is not a number", "apierror")); + return; + } + } + + // ensure this is not a negative number + if (rev !== undefined && rev < 0) + { + callback(new customError("rev is not a negative number", "apierror")); + return; + } + + // ensure this is not a float value + if (rev !== undefined && !is_int(rev)) + { + callback(new customError("rev is a float value", "apierror")); + return; + } + + // get the pad + getPadSafe(padID, true, function(err, pad) + { + if(ERR(err, callback)) return; + + //the client asked for a special revision + if(rev !== undefined) + { + //check if this is a valid revision + if(rev > pad.getHeadRevisionNumber()) + { + callback(new customError("rev is higher than the head revision of the pad","apierror")); + return; + } + + //get the changeset for this revision + pad.getRevisionChangeset(rev, function(err, changeset) + { + if(ERR(err, callback)) return; + + callback(null, changeset); + }) + } + //the client wants the latest changeset, lets return it to him + else + { + callback(null, {"changeset": pad.getRevisionChangeset(pad.getHeadRevisionNumber())}); + } + }); +} + /** getText(padID, [rev]) returns the text of a pad diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 4b7dd951..d4ea4f2c 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -180,7 +180,47 @@ var version = , "deleteGroup" : ["groupID"] , "listPads" : ["groupID"] , "listAllPads" : [] - , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createPad" : ["padID", "text"] + , "createGroupPad" : ["groupID", "padName", "text"] + , "createAuthor" : ["name"] + , "createAuthorIfNotExistsFor": ["authorMapper" , "name"] + , "listPadsOfAuthor" : ["authorID"] + , "createSession" : ["groupID", "authorID", "validUntil"] + , "deleteSession" : ["sessionID"] + , "getSessionInfo" : ["sessionID"] + , "listSessionsOfGroup" : ["groupID"] + , "listSessionsOfAuthor" : ["authorID"] + , "getText" : ["padID", "rev"] + , "setText" : ["padID", "text"] + , "getHTML" : ["padID", "rev"] + , "setHTML" : ["padID", "html"] + , "getRevisionsCount" : ["padID"] + , "getLastEdited" : ["padID"] + , "deletePad" : ["padID"] + , "getReadOnlyID" : ["padID"] + , "setPublicStatus" : ["padID", "publicStatus"] + , "getPublicStatus" : ["padID"] + , "setPassword" : ["padID", "password"] + , "isPasswordProtected" : ["padID"] + , "listAuthorsOfPad" : ["padID"] + , "padUsersCount" : ["padID"] + , "getAuthorName" : ["authorID"] + , "padUsers" : ["padID"] + , "sendClientsMessage" : ["padID", "msg"] + , "listAllGroups" : [] + , "checkToken" : [] + , "getChatHistory" : ["padID"] + , "getChatHistory" : ["padID", "start", "end"] + , "getChatHead" : ["padID"] + } +, "1.2.8": + { "createGroup" : [] + , "createGroupIfNotExistsFor" : ["groupMapper"] + , "deleteGroup" : ["groupID"] + , "listPads" : ["groupID"] + , "listAllPads" : [] + , "createDiffHTML" : ["padID", "startRev", "endRev"] , "createPad" : ["padID", "text"] , "createGroupPad" : ["groupID", "padName", "text"] , "createAuthor" : ["name"] From 56275d8de72f3ecee306c11a3b9cbe2983e952f3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 2 Apr 2013 12:20:38 -0700 Subject: [PATCH 208/463] longer timeout on reconnection --- src/static/js/pad.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 5cc02d87..01f1bbcb 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -242,7 +242,7 @@ function handshake() pad.collabClient.setChannelState("RECONNECTING"); - disconnectTimeout = setTimeout(disconnectEvent, 10000); + disconnectTimeout = setTimeout(disconnectEvent, 20000); } }); From 9e523191ea40137899c0082ffff66056ec289e52 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 2 Apr 2013 23:15:16 +0100 Subject: [PATCH 209/463] whoops padid should be in payload.. --- src/node/handler/PadMessageHandler.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 954c116d..b6e58764 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -151,19 +151,25 @@ exports.handleMessage = function(client, message) var handleMessageHook = function(callback){ var dropMessage = false; - + console.warn("messsssage", message); // 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 hooks.aCallAll("handleMessage", { client: client, message: message }, function ( err, messages ) { +console.warn("Wut", message); if(ERR(err, callback)) return; _.each(messages, function(newMessage){ +console.warn("OH NOES!", message); +console.warn("newMessage", newMessage); if ( newMessage === null ) { +console.warn("FUCK NO!"); dropMessage = true; } }); // If no plugins explicitly told us to drop the message, its ok to proceed - if(!dropMessage){ callback() }; + if(!dropMessage){ +console.warn("proceeding"); + callback() }; }); } @@ -265,7 +271,7 @@ exports.handleCustomObjectMessage = function (msg, sessionID, cb) { if(sessionID){ // If a sessionID is targeted then send directly to this sessionID socketio.sockets.socket(sessionID).json.send(msg); // send a targeted message }else{ - socketio.sockets.in(msg.data.padId).json.send(msg); // broadcast to all clients on this pad + socketio.sockets.in(msg.data.payload.padId).json.send(msg); // broadcast to all clients on this pad } } cb(null, {}); From 57a9ccbb881a487caa92d41431403f274efe1ed8 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 2 Apr 2013 23:16:28 +0100 Subject: [PATCH 210/463] whoops, comments hurt --- src/node/handler/PadMessageHandler.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index b6e58764..0b0ea369 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -151,24 +151,18 @@ exports.handleMessage = function(client, message) var handleMessageHook = function(callback){ var dropMessage = false; - console.warn("messsssage", message); // 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 hooks.aCallAll("handleMessage", { client: client, message: message }, function ( err, messages ) { -console.warn("Wut", message); if(ERR(err, callback)) return; _.each(messages, function(newMessage){ -console.warn("OH NOES!", message); -console.warn("newMessage", newMessage); if ( newMessage === null ) { -console.warn("FUCK NO!"); dropMessage = true; } }); // If no plugins explicitly told us to drop the message, its ok to proceed if(!dropMessage){ -console.warn("proceeding"); callback() }; }); } From 5855e3d5bfffa9aed9747cc54fa5922a32737be9 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 2 Apr 2013 23:17:25 +0100 Subject: [PATCH 211/463] weird styling --- src/node/handler/PadMessageHandler.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 0b0ea369..9d0fd780 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -162,8 +162,7 @@ exports.handleMessage = function(client, message) }); // If no plugins explicitly told us to drop the message, its ok to proceed - if(!dropMessage){ - callback() }; + if(!dropMessage){ callback() }; }); } From c5b4e4934dab4a90fd673bb4087575a885e02c94 Mon Sep 17 00:00:00 2001 From: mluto Date: Wed, 3 Apr 2013 11:19:26 +0200 Subject: [PATCH 212/463] Kick the user if has already successfully authenticated but his session became invalid later --- src/node/handler/PadMessageHandler.js | 26 +++++++++++++++++++------- src/static/js/pad.js | 12 ++++++++++-- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 9d0fd780..85efb008 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -203,17 +203,29 @@ exports.handleMessage = function(client, message) //check permissions function(callback) { - - // If the message has a padId we assume the client is already known to the server and needs no re-authorization - if(!message.padId) - return callback(); + // client tried to auth for the first time (first msg from the client) + if(message.type == "CLIENT_READY") { + // Remember this information since we won't + // have the cookie in further socket.io messages. + // This information will be used to check if + // the sessionId of this connection is still valid + // since it could have been deleted by the API. + sessioninfos[client.id].auth = + { + sessionID: message.sessionID, + padID: message.padId, + token : message.token, + password: message.password + }; + } // Note: message.sessionID is an entirely different kind of - // session from the sessions we use here! Beware! FIXME: Call - // our "sessions" "connections". + // session from the sessions we use here! Beware! + // FIXME: Call our "sessions" "connections". // FIXME: Use a hook instead // FIXME: Allow to override readwrite access with readonly - securityManager.checkAccess(message.padId, message.sessionID, message.token, message.password, function(err, statusObject) + var auth = sessioninfos[client.id].auth; + securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, function(err, statusObject) { if(ERR(err, callback)) return; diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 01f1bbcb..504bc21e 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -252,14 +252,22 @@ function handshake() socket.on('message', function(obj) { //the access was not granted, give the user a message - if(!receivedClientVars && obj.accessStatus) + if(obj.accessStatus) { - $('.passForm').submit(require(module.id).savePassword); + if(!receivedClientVars) + $('.passForm').submit(require(module.id).savePassword); if(obj.accessStatus == "deny") { $('#loading').hide(); $("#permissionDenied").show(); + + if(receivedClientVars) + { + // got kicked + $("#editorcontainer").hide(); + $("#editorloadingbox").show(); + } } else if(obj.accessStatus == "needPassword") { From 35d84144dbdc4986ed5b6aa6e2e27a47f5295828 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 00:59:51 +0100 Subject: [PATCH 213/463] changelog and package file --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca5b078f..15ce9684 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,17 @@ * NEW: Authors can now send custom object messages to other Authors making 3 way conversations possible. This introduces WebRTC plugin support. * NEW: Hook for Chat Messages Allows for Desktop Notification support * NEW: FreeBSD installation docs + * NEW: Ctrl S for save revision makes the Icon glow for a few sconds. + * NEW: Various hooks and expose the document ACE object + * NEW: Plugin page revamp makes finding and installing plugins more sane. + * NEW: Icon to enable sticky chat from the Chat box * Fix: Cookies inside of plugins + * Fix: Don't leak event emitters when accessing admin/plugins + * Fix: Don't allow user to send messages after they have been "kicked" from a pad * Fix: Refactor Caret navigation with Arrow and Pageup/down keys stops cursor being lost * Fix: Long lines in Firefox now wrap properly + * Fix: Session Disconnect limit is increased from 10 to 20 to support slower restarts + * Fix: Support Node 0.10 * Fix: Log HTTP on DEBUG log level * Fix: Server wont crash on import fails on 0 file import. * Fix: Import no longer fails consistantly @@ -12,6 +20,7 @@ * Fix: Mobile support for chat notifications are now usable * Fix: Re-Enable Editbar buttons on reconnect * Fix: Clearing authorship colors no longer disconnects all clients + * Other: New debug information for sessions # 1.2.9 * Fix: MAJOR Security issue, where a hacker could submit content as another user From 4f07f829db0ac9adf5d6b2c6a0707d218d176c99 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 01:20:46 +0100 Subject: [PATCH 214/463] new readme --- README.md | 47 ++++++++++++----------------------------------- 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 291ecaee..d437646f 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,13 @@ -# Making collaborative editing the standard on the web +# Really Real-Time Collaborative Editor +![alt text](http://primarypad.com/files/2012/11/PrimaryPad1.jpg "Etherpad in action on PrimaryPad") # About -Etherpad lite is a really-real time collaborative editor spawned from the Hell fire of Etherpad. -We're reusing the well tested Etherpad easysync library to make it really realtime. Etherpad Lite -is based on node.js ergo is much lighter and more stable than the original Etherpad. Our hope -is that this will encourage more users to use and install a realtime collaborative editor. A smaller, manageable and well -documented codebase makes it easier for developers to improve the code and contribute towards the project. - -**Etherpad vs Etherpad lite** - - - - - - - - - - - - - - - - -
     EtherpadEtherpad Lite
    Size of the folder (without git history)30 MB1.5 MB
    Languages used server sideJavascript (Rhino), Java, ScalaJavascript (node.js)
    Lines of server side Javascript code~101k~9k
    RAM Usage immediately after start257 MB (grows to ~1GB)16 MB (grows to ~30MB)
    - - -Etherpad Lite is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) +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 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. There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. -There's also a full-featured plugin framework, allowing you to easily add your own features. -Finally, Etherpad Lite comes with translations into tons of different languages! +There's also a full-featured plugin framework, allowing you to easily add your own features. By default your Etherpad is rather sparce and because Etherpad takes a lot of it's inspiration from Wordpress plugins are really easy to install and update. Once you have Etherpad installed you should visit the plugin page and take control. +Finally, Etherpad comes with translations into most languages! Users are automatically delivered the correct language for their local settings. **Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live** @@ -86,9 +63,9 @@ You like it? [Next steps](#next-steps). # Next Steps ## Tweak the settings -You can modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad Lite instances from the same installation.) +You can initially modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad instances from the same installation.) Once you have access to your /admin section settings can be modified through the web browser. -You should use a dedicated database such as "mysql", if you are planning on using etherpad-lite in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes. +You should use a dedicated database such as "mysql", if you are planning on using etherpad-in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes. ## Helpful resources The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages. @@ -98,11 +75,11 @@ Documentation can be found in `docs/`. # Development ## Things you should know -Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Lite Development](http://youtu.be/67-Q26YH97E). +Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Development](http://youtu.be/67-Q26YH97E). If you're new to node.js, start with Ryan Dahl's [Introduction to Node.js](http://youtu.be/jo_B4LTHi3I). -You can debug Etherpad lite using `bin/debugRun.sh`. +You can debug Etherpad using `bin/debugRun.sh`. If you want to find out how Etherpad's `Easysync` works (the library that makes it really realtime), start with this [PDF](https://github.com/ether/etherpad-lite/raw/master/doc/easysync/easysync-full-description.pdf) (complex, but worth reading). @@ -114,7 +91,7 @@ Look at the [TODO list](https://github.com/ether/etherpad-lite/wiki/TODO) and ou Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md), really! # Get in touch -Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)! +Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our busy freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)! # Modules created for this project From 2003dd832721d418d873811f3e6a675166481087 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 01:22:46 +0100 Subject: [PATCH 215/463] line breaks --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d437646f..ec04b2d8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,9 @@ # 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 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. There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. There's also a full-featured plugin framework, allowing you to easily add your own features. By default your Etherpad is rather sparce and because Etherpad takes a lot of it's inspiration from Wordpress plugins are really easy to install and update. Once you have Etherpad installed you should visit the plugin page and take control. From a677286a401758aa80004900a3b8710aaf86cd94 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 01:24:09 +0100 Subject: [PATCH 216/463] line breaks 2 --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ec04b2d8..553f7cf9 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,12 @@ Etherpad is a really-real time collaborative editor maintained by the Etherpad C 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. There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. +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. + +There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. + There's also a full-featured plugin framework, allowing you to easily add your own features. By default your Etherpad is rather sparce and because Etherpad takes a lot of it's inspiration from Wordpress plugins are really easy to install and update. Once you have Etherpad installed you should visit the plugin page and take control. + Finally, Etherpad comes with translations into most languages! Users are automatically delivered the correct language for their local settings. **Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live** From a3136d778dc96c720f613ad09061c7aba04c0a55 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 01:56:36 +0100 Subject: [PATCH 217/463] animated image prolly wont work --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 553f7cf9..868eab32 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Really Real-Time Collaborative Editor -![alt text](http://primarypad.com/files/2012/11/PrimaryPad1.jpg "Etherpad in action on PrimaryPad") +![alt text](http://i.imgur.com/zYrGkg3.gif "Etherpad in action on PrimaryPad") # About Etherpad is a really-real time collaborative editor maintained by the Etherpad Community. From 380821781f1fe5e8309ff58dde095d4add91ee1f Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 02:25:19 +0100 Subject: [PATCH 218/463] dont use top, use the scheduler --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index cfe24ccd..067b546b 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3651,7 +3651,7 @@ function Ace2Inner(){ evt.preventDefault(); var originalBackground = parent.parent.$('#revisionlink').css("background") parent.parent.$('#revisionlink').css({"background":"lightyellow"}); - top.setTimeout(function(){ + scheduler.setTimeout(function(){ parent.parent.$('#revisionlink').css({"background":originalBackground}); }, 1000); parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ From 43f877824136a8b64d0201def90d30406fd99384 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 15:35:19 +0100 Subject: [PATCH 219/463] hrm, maybe this makes sense to a wider audience --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 868eab32..6354d9b0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Really Real-Time Collaborative Editor +# A really-real time collaborative word processor for the web ![alt text](http://i.imgur.com/zYrGkg3.gif "Etherpad in action on PrimaryPad") # About From 3df3b90bd9687fae2fa9afcfcc7ed3ac40302fb7 Mon Sep 17 00:00:00 2001 From: Bernard `Guyzmo` Pratz Date: Thu, 4 Apr 2013 19:06:18 +0200 Subject: [PATCH 220/463] fixed missing API functions declaration in API ; fixed a typo in APIHandler. Signed-off-by: Bernard `Guyzmo` Pratz --- src/node/db/API.js | 2 +- src/node/handler/APIHandler.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index a0a84e32..8aa3dff7 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -104,7 +104,7 @@ exports.getRevisionChangeset = function(padID, rev, callback) if (rev !== undefined && typeof rev !== "number") { // try to parse the number - if (!isNaN(parseInt(rev)) + if (!isNaN(parseInt(rev))) { rev = parseInt(rev); } diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index d4ea4f2c..ad14efbb 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -235,7 +235,9 @@ var version = , "setText" : ["padID", "text"] , "getHTML" : ["padID", "rev"] , "setHTML" : ["padID", "html"] + , "getAttributePool" : ["padID"] , "getRevisionsCount" : ["padID"] + , "getRevisionChangeset" : ["padID", "rev"] , "getLastEdited" : ["padID"] , "deletePad" : ["padID"] , "getReadOnlyID" : ["padID"] From 0e5a89beccde6e7e78b6277934945b2dbd2a412a Mon Sep 17 00:00:00 2001 From: Bernard `Guyzmo` Pratz Date: Thu, 4 Apr 2013 19:07:11 +0200 Subject: [PATCH 221/463] added full comments to the new API functions. Signed-off-by: Bernard `Guyzmo` Pratz --- src/node/db/API.js | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 8aa3dff7..dd2053f9 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -77,19 +77,51 @@ exports.listSessionsOfAuthor = sessionManager.listSessionsOfAuthor; /** getAttributePool(padID) returns the attribute pool of a pad +Example returns: +{ + "code":0, + "message":"ok", + "data": { + "pool":{ + "numToAttrib":{ + "0":["author","a.X4m8bBWJBZJnWGSh"], + "1":["author","a.TotfBPzov54ihMdH"], + "2":["author","a.StiblqrzgeNTbK05"], + "3":["bold","true"] + }, + "attribToNum":{ + "author,a.X4m8bBWJBZJnWGSh":0, + "author,a.TotfBPzov54ihMdH":1, + "author,a.StiblqrzgeNTbK05":2, + "bold,true":3 + }, + "nextNum":4 + } + } +} + */ exports.getAttributePool = function (padID, callback) { getPadSafe(padID, true, function(err, pad) { if (ERR(err, callback)) return; - callbalk(null, {pool: pad.pool}); + callback(null, {pool: pad.pool}); }); } /** getRevisionChangeset (padID, [rev]) +get the changeset at a given revision, or last revision if 'rev' is not defined. + +Example returns: +{ + "code" : 0, + "message" : "ok", + "data" : "Z:1>6b|5+6b$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" +} + */ exports.getRevisionChangeset = function(padID, rev, callback) { From 5fb5b6c7afb9bec34162073f713b4cbdc1c421c5 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 4 Apr 2013 18:23:56 +0100 Subject: [PATCH 222/463] Linux clarity --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6354d9b0..db673468 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Update to the latest version with `git pull origin`, then run `bin\installOnWind [Next steps](#next-steps). -## Linux/Unix +## GNU/Linux and other UNIX-like systems You'll need gzip, git, curl, libssl develop libraries, python and gcc. *For Debian/Ubuntu*: `apt-get install gzip git-core curl python libssl-dev pkg-config build-essential` *For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"` From 883be3d48d3a35e41ac8cff60ad42330d24e1950 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 5 Apr 2013 02:21:56 +0100 Subject: [PATCH 223/463] begin by adding some template css --- src/static/css/iframe_editor.css | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 1d9b61be..8041d90e 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -17,6 +17,7 @@ ul, ol, li { padding: 0; margin: 0; } + ul { margin-left: 1.5em; } ul ul { margin-left: 0 !important; } ul.list-bullet1 { margin-left: 1.5em; } @@ -38,6 +39,7 @@ ul.list-bullet6 { list-style-type: square; } ul.list-bullet7 { list-style-type: disc; } ul.list-bullet8 { list-style-type: circle; } +/* ol.list-number1 { margin-left: 1.9em; } ol.list-number2 { margin-left: 3em; } ol.list-number3 { margin-left: 4.5em; } @@ -56,6 +58,7 @@ ol.list-number5 { list-style-type: lower-latin; } ol.list-number6 { list-style-type: lower-roman; } ol.list-number7 { list-style-type: decimal; } ol.list-number8 { list-style-type: lower-latin; } +*/ ul.list-indent1 { margin-left: 1.5em; } ul.list-indent2 { margin-left: 3em; } @@ -186,3 +189,39 @@ p { overflow:hidden; } */ + +ol { + display: list-item; +} + +ol > li { + display:inline; +} + +/* Set the indentation */ +ol.list-number1{ + text-indent: 20px; +} +ol.list-number2{ + text-indent: 30px; +} + +/* Add styling to the first item in a list */ +ol.list1-start{ + counter-reset: first; +} +ol.list2-start{ + counter-reset: second; +} + +/* The behavior for incrementing and the prefix */ +ol.list-number1:before { + content: counter(first) ". " ; + counter-increment: first; +} + +ol.list-number2:before { + content: counter(second) ". " ; + counter-increment: second; +} + From 6dc4ddd29e1c04e509c6140b02ad5023bb8a92a7 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 5 Apr 2013 03:38:47 +0100 Subject: [PATCH 224/463] no need for the language string on that div --- src/templates/pad.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/pad.html b/src/templates/pad.html index 71dc55a1..e632e7da 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -371,7 +371,7 @@ <% e.end_block(); %> -
    +
    0 From 402a4b7b3ec5cd04fd3d423581f12bb7f3787158 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Fri, 5 Apr 2013 14:18:46 +0200 Subject: [PATCH 225/463] html10n.js: Finally fix two-part locale specs fixes #1706 --- src/static/js/html10n.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index aa53a266..406409ad 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -177,8 +177,7 @@ window.html10n = (function(window, document, undefined) { cb(new Error('A file couldn\'t be parsed as json.')) return } - - if (!data[lang]) lang = lang.substr(0, lang.indexOf('-') == -1? lang.length : lang.indexOf('-')) + if (!data[lang]) { cb(new Error('Couldn\'t find translations for '+lang)) return @@ -667,7 +666,15 @@ window.html10n = (function(window, document, undefined) { var that = this // if only one string => create an array if ('string' == typeof langs) langs = [langs] - + + // Expand two-part locale specs + var i=0 + langs.forEach(function(lang) { + if(!lang) return + langs[i++] = lang + if(~lang.indexOf('-')) langs[i++] = lang.substr(0, lang.indexOf('-')) + }) + this.build(langs, function(er, translations) { html10n.translations = translations html10n.translateElement(translations) From cbf0535f972aaeb9d146507a3827152b56c6ecbd Mon Sep 17 00:00:00 2001 From: goldquest Date: Tue, 2 Apr 2013 16:42:50 +0200 Subject: [PATCH 226/463] browser detection was dropped in jquery 1.9, so we have to add the browser detection js file --- src/node/handler/ImportHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index 7bb9c5db..a155f5c6 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -176,7 +176,7 @@ exports.doImport = function(req, res, padId) ERR(err); //close the connection - res.send("", 200); + res.send("", 200); }); } From 7492fb18a4874dbd170611d3313c537f9d9e9d32 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 6 Apr 2013 14:29:21 +0100 Subject: [PATCH 227/463] version bump --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 2366daf3..48f7e2c7 100644 --- a/src/package.json +++ b/src/package.json @@ -46,5 +46,5 @@ "engines" : { "node" : ">=0.6.3", "npm" : ">=1.0" }, - "version" : "1.2.9" + "version" : "1.2.91" } From 5b1de1421c53a8a565474ebb6835fa39aa309afd Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 7 Apr 2013 10:36:57 +0000 Subject: [PATCH 228/463] Localisation updates from http://translatewiki.net. --- src/locales/af.json | 128 +++++++++--------- src/locales/ar.json | 150 +++++++++++----------- src/locales/ast.json | 238 +++++++++++++++++----------------- src/locales/az.json | 238 +++++++++++++++++----------------- src/locales/azb.json | 142 ++++++++++---------- src/locales/be-tarask.json | 118 ++++++++--------- src/locales/bn.json | 178 ++++++++++++------------- src/locales/br.json | 244 +++++++++++++++++------------------ src/locales/ca.json | 209 +++++++++++++++++------------- src/locales/cs.json | 194 ++++++++++++++-------------- src/locales/da.json | 242 +++++++++++++++++----------------- src/locales/de.json | 244 +++++++++++++++++------------------ src/locales/diq.json | 148 ++++++++++----------- src/locales/el.json | 244 +++++++++++++++++------------------ src/locales/es.json | 246 +++++++++++++++++------------------ src/locales/fa.json | 244 +++++++++++++++++------------------ src/locales/fi.json | 248 +++++++++++++++++------------------ src/locales/fr.json | 257 +++++++++++++++++++------------------ src/locales/gl.json | 238 +++++++++++++++++----------------- src/locales/he.json | 241 +++++++++++++++++----------------- src/locales/hu.json | 218 +++++++++++++++---------------- src/locales/ia.json | 238 +++++++++++++++++----------------- src/locales/it.json | 244 +++++++++++++++++------------------ src/locales/ja.json | 238 +++++++++++++++++----------------- src/locales/ko.json | 238 +++++++++++++++++----------------- src/locales/ksh.json | 237 +++++++++++++++++----------------- src/locales/mk.json | 240 +++++++++++++++++----------------- src/locales/ml.json | 242 +++++++++++++++++----------------- src/locales/ms.json | 238 +++++++++++++++++----------------- src/locales/nb.json | 121 +++++++++++++++++ src/locales/nl.json | 238 +++++++++++++++++----------------- src/locales/nn.json | 230 ++++++++++++++++----------------- src/locales/oc.json | 232 ++++++++++++++++----------------- src/locales/os.json | 237 +++++++++++++++++----------------- src/locales/pl.json | 241 +++++++++++++++++----------------- src/locales/ps.json | 102 +++++++-------- src/locales/pt-br.json | 238 +++++++++++++++++----------------- src/locales/pt.json | 117 +++++++++-------- src/locales/ru.json | 244 +++++++++++++++++------------------ src/locales/sl.json | 238 +++++++++++++++++----------------- src/locales/sq.json | 226 ++++++++++++++++---------------- src/locales/sv.json | 238 +++++++++++++++++----------------- src/locales/te.json | 162 +++++++++++------------ src/locales/uk.json | 241 +++++++++++++++++----------------- src/locales/zh-hans.json | 228 ++++++++++++++++---------------- src/locales/zh-hant.json | 240 +++++++++++++++++----------------- 46 files changed, 5031 insertions(+), 4866 deletions(-) create mode 100644 src/locales/nb.json diff --git a/src/locales/af.json b/src/locales/af.json index 979a823d..2c35bcff 100644 --- a/src/locales/af.json +++ b/src/locales/af.json @@ -1,66 +1,66 @@ { - "@metadata": { - "authors": [ - "Naudefj" - ] - }, - "index.newPad": "Nuwe pad", - "index.createOpenPad": "of skep\/open 'n pad met die naam:", - "pad.toolbar.bold.title": "Vet (Ctrl-B)", - "pad.toolbar.italic.title": "Kursief (Ctrl-I)", - "pad.toolbar.underline.title": "Onderstreep (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Deurgehaal", - "pad.toolbar.ol.title": "Geordende lys", - "pad.toolbar.ul.title": "Ongeordende lys", - "pad.toolbar.indent.title": "Indenteer", - "pad.toolbar.unindent.title": "Verklein indentering", - "pad.toolbar.undo.title": "Ongedaan maak (Ctrl-Z)", - "pad.toolbar.redo.title": "Herdoen (Ctrl-Y)", - "pad.toolbar.settings.title": "Voorkeure", - "pad.colorpicker.save": "Stoor", - "pad.colorpicker.cancel": "Kanselleer", - "pad.loading": "Laai...", - "pad.settings.myView": "My oorsig", - "pad.settings.fontType.normal": "Normaal", - "pad.settings.fontType.monospaced": "Monospasie", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.userdup.advice": "Maak weer 'n verbinding as u die venster wil gebruik.", - "pad.modals.unauth": "Nie toegestaan", - "pad.modals.looping": "Verbinding verbreek.", - "pad.modals.deleted": "Geskrap.", - "pad.share": "Deel die pad", - "pad.share.readonly": "Lees-alleen", - "pad.share.link": "Skakel", - "pad.share.emebdcode": "Inbed URL", - "pad.chat": "Klets", - "pad.chat.title": "Maak kletsblad vir die pad oop", - "timeslider.toolbar.returnbutton": "Terug na pad", - "timeslider.toolbar.authors": "Outeurs:", - "timeslider.toolbar.authorsList": "Geen outeurs", - "timeslider.exportCurrent": "Huidige weergawe eksporteer as:", - "timeslider.version": "Weergawe {{version}}", - "timeslider.saved": "Gestoor op {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Januarie", - "timeslider.month.february": "Februarie", - "timeslider.month.march": "Maart", - "timeslider.month.april": "April", - "timeslider.month.may": "Mei", - "timeslider.month.june": "Junie", - "timeslider.month.july": "Julie", - "timeslider.month.august": "Augustus", - "timeslider.month.september": "September", - "timeslider.month.october": "Oktober", - "timeslider.month.november": "November", - "timeslider.month.december": "Desember", - "pad.userlist.entername": "Verskaf u naam", - "pad.userlist.unnamed": "sonder naam", - "pad.userlist.guest": "Gas", - "pad.userlist.deny": "Keur af", - "pad.userlist.approve": "Keur goed", - "pad.impexp.importbutton": "Voer nou in", - "pad.impexp.importing": "Besig met invoer...", - "pad.impexp.importfailed": "Invoer het gefaal" + "@metadata": { + "authors": [ + "Naudefj" + ] + }, + "index.newPad": "Nuwe pad", + "index.createOpenPad": "of skep/open 'n pad met die naam:", + "pad.toolbar.bold.title": "Vet (Ctrl-B)", + "pad.toolbar.italic.title": "Kursief (Ctrl-I)", + "pad.toolbar.underline.title": "Onderstreep (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Deurgehaal", + "pad.toolbar.ol.title": "Geordende lys", + "pad.toolbar.ul.title": "Ongeordende lys", + "pad.toolbar.indent.title": "Indenteer", + "pad.toolbar.unindent.title": "Verklein indentering", + "pad.toolbar.undo.title": "Ongedaan maak (Ctrl-Z)", + "pad.toolbar.redo.title": "Herdoen (Ctrl-Y)", + "pad.toolbar.settings.title": "Voorkeure", + "pad.colorpicker.save": "Stoor", + "pad.colorpicker.cancel": "Kanselleer", + "pad.loading": "Laai...", + "pad.settings.myView": "My oorsig", + "pad.settings.fontType.normal": "Normaal", + "pad.settings.fontType.monospaced": "Monospasie", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.userdup.advice": "Maak weer 'n verbinding as u die venster wil gebruik.", + "pad.modals.unauth": "Nie toegestaan", + "pad.modals.looping": "Verbinding verbreek.", + "pad.modals.deleted": "Geskrap.", + "pad.share": "Deel die pad", + "pad.share.readonly": "Lees-alleen", + "pad.share.link": "Skakel", + "pad.share.emebdcode": "Inbed URL", + "pad.chat": "Klets", + "pad.chat.title": "Maak kletsblad vir die pad oop", + "timeslider.toolbar.returnbutton": "Terug na pad", + "timeslider.toolbar.authors": "Outeurs:", + "timeslider.toolbar.authorsList": "Geen outeurs", + "timeslider.exportCurrent": "Huidige weergawe eksporteer as:", + "timeslider.version": "Weergawe {{version}}", + "timeslider.saved": "Gestoor op {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januarie", + "timeslider.month.february": "Februarie", + "timeslider.month.march": "Maart", + "timeslider.month.april": "April", + "timeslider.month.may": "Mei", + "timeslider.month.june": "Junie", + "timeslider.month.july": "Julie", + "timeslider.month.august": "Augustus", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Desember", + "pad.userlist.entername": "Verskaf u naam", + "pad.userlist.unnamed": "sonder naam", + "pad.userlist.guest": "Gas", + "pad.userlist.deny": "Keur af", + "pad.userlist.approve": "Keur goed", + "pad.impexp.importbutton": "Voer nou in", + "pad.impexp.importing": "Besig met invoer...", + "pad.impexp.importfailed": "Invoer het gefaal" } \ No newline at end of file diff --git a/src/locales/ar.json b/src/locales/ar.json index be0e7457..43d3bb07 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -1,77 +1,77 @@ { - "@metadata": { - "authors": [ - "Ali1", - "Tux-tn" - ] - }, - "pad.toolbar.bold.title": "\u0633\u0645\u064a\u0643 (Ctrl-B)", - "pad.toolbar.italic.title": "\u0645\u0627\u0626\u0644 (Ctrl-I)", - "pad.toolbar.underline.title": "\u062a\u0633\u0637\u064a\u0631 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0634\u0637\u0628", - "pad.toolbar.ol.title": "\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u062a\u0628\u0629", - "pad.toolbar.ul.title": "\u0642\u0627\u0626\u0645\u0629 \u063a\u064a\u0631 \u0645\u0631\u062a\u0628\u0629", - "pad.toolbar.indent.title": "\u0625\u0632\u0627\u062d\u0629", - "pad.toolbar.unindent.title": "\u062d\u0630\u0641 \u0627\u0644\u0625\u0632\u0627\u062d\u0629", - "pad.toolbar.undo.title": "\u0641\u0643 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u062a\u0643\u0631\u0627\u0631 (Ctrl-Y)", - "pad.toolbar.import_export.title": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f\/\u062a\u0635\u062f\u064a\u0631 \u0645\u0646\/\u0625\u0644\u0649 \u062a\u0646\u0633\u064a\u0642\u0627\u062a \u0645\u0644\u0641\u0627\u062a \u0645\u062e\u062a\u0644\u0641\u0629", - "pad.toolbar.timeslider.title": "\u0645\u062a\u0635\u0641\u062d \u0627\u0644\u062a\u0627\u0631\u064a\u062e", - "pad.toolbar.savedRevision.title": "\u0627\u0644\u062a\u0646\u0642\u064a\u062d\u0627\u062a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629", - "pad.toolbar.settings.title": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a", - "pad.colorpicker.save": "\u062a\u0633\u062c\u064a\u0644", - "pad.colorpicker.cancel": "\u0625\u0644\u063a\u0627\u0621", - "pad.loading": "\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...", - "pad.settings.stickychat": "\u0627\u0644\u062f\u0631\u062f\u0634\u0629 \u062f\u0627\u0626\u0645\u0627 \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629", - "pad.settings.linenocheck": "\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0623\u0633\u0637\u0631", - "pad.settings.fontType": "\u0646\u0648\u0639 \u0627\u0644\u062e\u0637:", - "pad.settings.fontType.normal": "\u0639\u0627\u062f\u064a", - "pad.settings.fontType.monospaced": "\u062b\u0627\u0628\u062a \u0627\u0644\u0639\u0631\u0636", - "pad.settings.language": "\u0627\u0644\u0644\u063a\u0629:", - "pad.importExport.import_export": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f\/\u062a\u0635\u062f\u064a\u0631", - "pad.importExport.import": "\u062a\u062d\u0645\u064a\u0644 \u0623\u064a \u0645\u0644\u0641 \u0646\u0635\u064a \u0623\u0648 \u0648\u062b\u064a\u0642\u0629", - "pad.importExport.importSuccessful": "\u0646\u0627\u062c\u062d!", - "pad.importExport.exporthtml": "\u0625\u062a\u0634 \u062a\u064a \u0625\u0645 \u0625\u0644", - "pad.importExport.exportplain": "\u0646\u0635 \u0639\u0627\u062f\u064a", - "pad.importExport.exportword": "\u0645\u0627\u064a\u0643\u0631\u0648\u0633\u0648\u0641\u062a \u0648\u0648\u0631\u062f", - "pad.importExport.exportpdf": "\u0635\u064a\u063a\u0629 \u0627\u0644\u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u0648\u0644\u0629", - "pad.importExport.exportopen": "ODF (\u0646\u0633\u0642 \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u0645\u0641\u062a\u0648\u062d)", - "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648\u0648\u064a\u0643\u064a", - "pad.modals.connected": "\u0645\u062a\u0635\u0644.", - "pad.modals.forcereconnect": "\u0641\u0631\u0636 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644", - "pad.modals.unauth": "\u063a\u064a\u0631 \u0645\u062e\u0648\u0644", - "pad.modals.looping": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", - "pad.modals.initsocketfail": "\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645", - "pad.modals.initsocketfail.explanation": "\u062a\u0639\u0630\u0631 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u062e\u0627\u062f\u0645 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629.", - "pad.modals.slowcommit": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", - "pad.modals.slowcommit.explanation": "\u0627\u0644\u062e\u0627\u062f\u0645 \u0644\u0627 \u064a\u0633\u062a\u062c\u064a\u0628.", - "pad.modals.slowcommit.cause": "\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0647\u0630\u0627 \u0628\u0633\u0628\u0628 \u0645\u0634\u0627\u0643\u0644 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u0634\u0628\u0643\u0629.", - "pad.modals.deleted": "\u0645\u062d\u0630\u0648\u0641.", - "pad.modals.disconnected": "\u0644\u0645 \u062a\u0639\u062f \u0645\u062a\u0651\u0635\u0644.", - "pad.modals.disconnected.explanation": "\u062a\u0645 \u0641\u0642\u062f\u0627\u0646 \u0627\u0644\u0625\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645", - "pad.modals.disconnected.cause": "\u0642\u062f \u064a\u0643\u0648\u0646 \u0627\u0644\u062e\u0627\u062f\u0645 \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0644\u0627\u0645\u0646\u0627 \u0625\u0630\u0627 \u062a\u0643\u0631\u0631 \u0647\u0630\u0627.", - "pad.share.readonly": "\u0644\u0644\u0642\u0631\u0627\u0621\u0629 \u0641\u0642\u0637", - "pad.share.link": "\u0631\u0627\u0628\u0637", - "pad.chat": "\u062f\u0631\u062f\u0634\u0629", - "timeslider.toolbar.authors": "\u0627\u0644\u0645\u0624\u0644\u0641\u0648\u0646:", - "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0645\u0624\u0644\u0641\u064a\u0646", - "timeslider.exportCurrent": "\u062a\u0635\u062f\u064a\u0631 \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0643:", - "timeslider.version": "\u0625\u0635\u062f\u0627\u0631 {{version}}", - "timeslider.month.january": "\u064a\u0646\u0627\u064a\u0631", - "timeslider.month.february": "\u0641\u0628\u0631\u0627\u064a\u0631", - "timeslider.month.march": "\u0645\u0627\u0631\u0633", - "timeslider.month.april": "\u0623\u0628\u0631\u064a\u0644", - "timeslider.month.may": "\u0645\u0627\u064a\u0648", - "timeslider.month.june": "\u064a\u0648\u0646\u064a\u0648", - "timeslider.month.july": "\u064a\u0648\u0644\u064a\u0648", - "timeslider.month.august": "\u0623\u063a\u0633\u0637\u0633", - "timeslider.month.september": "\u0633\u0628\u062a\u0645\u0628\u0631", - "timeslider.month.october": "\u0623\u0643\u062a\u0648\u0628\u0631", - "timeslider.month.november": "\u0646\u0648\u0641\u0645\u0628\u0631", - "timeslider.month.december": "\u062f\u064a\u0633\u0645\u0628\u0631", - "pad.userlist.entername": "\u0625\u062f\u062e\u0644 \u0627\u0633\u0645\u0643", - "pad.userlist.unnamed": "\u063a\u064a\u0631 \u0645\u0633\u0645\u0649", - "pad.userlist.guest": "\u0636\u064a\u0641", - "pad.userlist.deny": "\u0631\u0641\u0636", - "pad.userlist.approve": "\u0645\u0648\u0627\u0641\u0642\u0629" + "@metadata": { + "authors": [ + "Ali1", + "Tux-tn" + ] + }, + "pad.toolbar.bold.title": "\u0633\u0645\u064a\u0643 (Ctrl-B)", + "pad.toolbar.italic.title": "\u0645\u0627\u0626\u0644 (Ctrl-I)", + "pad.toolbar.underline.title": "\u062a\u0633\u0637\u064a\u0631 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0634\u0637\u0628", + "pad.toolbar.ol.title": "\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u062a\u0628\u0629", + "pad.toolbar.ul.title": "\u0642\u0627\u0626\u0645\u0629 \u063a\u064a\u0631 \u0645\u0631\u062a\u0628\u0629", + "pad.toolbar.indent.title": "\u0625\u0632\u0627\u062d\u0629", + "pad.toolbar.unindent.title": "\u062d\u0630\u0641 \u0627\u0644\u0625\u0632\u0627\u062d\u0629", + "pad.toolbar.undo.title": "\u0641\u0643 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u062a\u0643\u0631\u0627\u0631 (Ctrl-Y)", + "pad.toolbar.import_export.title": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f/\u062a\u0635\u062f\u064a\u0631 \u0645\u0646/\u0625\u0644\u0649 \u062a\u0646\u0633\u064a\u0642\u0627\u062a \u0645\u0644\u0641\u0627\u062a \u0645\u062e\u062a\u0644\u0641\u0629", + "pad.toolbar.timeslider.title": "\u0645\u062a\u0635\u0641\u062d \u0627\u0644\u062a\u0627\u0631\u064a\u062e", + "pad.toolbar.savedRevision.title": "\u0627\u0644\u062a\u0646\u0642\u064a\u062d\u0627\u062a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629", + "pad.toolbar.settings.title": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a", + "pad.colorpicker.save": "\u062a\u0633\u062c\u064a\u0644", + "pad.colorpicker.cancel": "\u0625\u0644\u063a\u0627\u0621", + "pad.loading": "\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...", + "pad.settings.stickychat": "\u0627\u0644\u062f\u0631\u062f\u0634\u0629 \u062f\u0627\u0626\u0645\u0627 \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629", + "pad.settings.linenocheck": "\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0623\u0633\u0637\u0631", + "pad.settings.fontType": "\u0646\u0648\u0639 \u0627\u0644\u062e\u0637:", + "pad.settings.fontType.normal": "\u0639\u0627\u062f\u064a", + "pad.settings.fontType.monospaced": "\u062b\u0627\u0628\u062a \u0627\u0644\u0639\u0631\u0636", + "pad.settings.language": "\u0627\u0644\u0644\u063a\u0629:", + "pad.importExport.import_export": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f/\u062a\u0635\u062f\u064a\u0631", + "pad.importExport.import": "\u062a\u062d\u0645\u064a\u0644 \u0623\u064a \u0645\u0644\u0641 \u0646\u0635\u064a \u0623\u0648 \u0648\u062b\u064a\u0642\u0629", + "pad.importExport.importSuccessful": "\u0646\u0627\u062c\u062d!", + "pad.importExport.exporthtml": "\u0625\u062a\u0634 \u062a\u064a \u0625\u0645 \u0625\u0644", + "pad.importExport.exportplain": "\u0646\u0635 \u0639\u0627\u062f\u064a", + "pad.importExport.exportword": "\u0645\u0627\u064a\u0643\u0631\u0648\u0633\u0648\u0641\u062a \u0648\u0648\u0631\u062f", + "pad.importExport.exportpdf": "\u0635\u064a\u063a\u0629 \u0627\u0644\u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u0648\u0644\u0629", + "pad.importExport.exportopen": "ODF (\u0646\u0633\u0642 \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u0645\u0641\u062a\u0648\u062d)", + "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648\u0648\u064a\u0643\u064a", + "pad.modals.connected": "\u0645\u062a\u0635\u0644.", + "pad.modals.forcereconnect": "\u0641\u0631\u0636 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644", + "pad.modals.unauth": "\u063a\u064a\u0631 \u0645\u062e\u0648\u0644", + "pad.modals.looping": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", + "pad.modals.initsocketfail": "\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645", + "pad.modals.initsocketfail.explanation": "\u062a\u0639\u0630\u0631 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u062e\u0627\u062f\u0645 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629.", + "pad.modals.slowcommit": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", + "pad.modals.slowcommit.explanation": "\u0627\u0644\u062e\u0627\u062f\u0645 \u0644\u0627 \u064a\u0633\u062a\u062c\u064a\u0628.", + "pad.modals.slowcommit.cause": "\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0647\u0630\u0627 \u0628\u0633\u0628\u0628 \u0645\u0634\u0627\u0643\u0644 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u0634\u0628\u0643\u0629.", + "pad.modals.deleted": "\u0645\u062d\u0630\u0648\u0641.", + "pad.modals.disconnected": "\u0644\u0645 \u062a\u0639\u062f \u0645\u062a\u0651\u0635\u0644.", + "pad.modals.disconnected.explanation": "\u062a\u0645 \u0641\u0642\u062f\u0627\u0646 \u0627\u0644\u0625\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645", + "pad.modals.disconnected.cause": "\u0642\u062f \u064a\u0643\u0648\u0646 \u0627\u0644\u062e\u0627\u062f\u0645 \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0644\u0627\u0645\u0646\u0627 \u0625\u0630\u0627 \u062a\u0643\u0631\u0631 \u0647\u0630\u0627.", + "pad.share.readonly": "\u0644\u0644\u0642\u0631\u0627\u0621\u0629 \u0641\u0642\u0637", + "pad.share.link": "\u0631\u0627\u0628\u0637", + "pad.chat": "\u062f\u0631\u062f\u0634\u0629", + "timeslider.toolbar.authors": "\u0627\u0644\u0645\u0624\u0644\u0641\u0648\u0646:", + "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0645\u0624\u0644\u0641\u064a\u0646", + "timeslider.exportCurrent": "\u062a\u0635\u062f\u064a\u0631 \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0643:", + "timeslider.version": "\u0625\u0635\u062f\u0627\u0631 {{version}}", + "timeslider.month.january": "\u064a\u0646\u0627\u064a\u0631", + "timeslider.month.february": "\u0641\u0628\u0631\u0627\u064a\u0631", + "timeslider.month.march": "\u0645\u0627\u0631\u0633", + "timeslider.month.april": "\u0623\u0628\u0631\u064a\u0644", + "timeslider.month.may": "\u0645\u0627\u064a\u0648", + "timeslider.month.june": "\u064a\u0648\u0646\u064a\u0648", + "timeslider.month.july": "\u064a\u0648\u0644\u064a\u0648", + "timeslider.month.august": "\u0623\u063a\u0633\u0637\u0633", + "timeslider.month.september": "\u0633\u0628\u062a\u0645\u0628\u0631", + "timeslider.month.october": "\u0623\u0643\u062a\u0648\u0628\u0631", + "timeslider.month.november": "\u0646\u0648\u0641\u0645\u0628\u0631", + "timeslider.month.december": "\u062f\u064a\u0633\u0645\u0628\u0631", + "pad.userlist.entername": "\u0625\u062f\u062e\u0644 \u0627\u0633\u0645\u0643", + "pad.userlist.unnamed": "\u063a\u064a\u0631 \u0645\u0633\u0645\u0649", + "pad.userlist.guest": "\u0636\u064a\u0641", + "pad.userlist.deny": "\u0631\u0641\u0636", + "pad.userlist.approve": "\u0645\u0648\u0627\u0641\u0642\u0629" } \ No newline at end of file diff --git a/src/locales/ast.json b/src/locales/ast.json index 7d471860..61635f9e 100644 --- a/src/locales/ast.json +++ b/src/locales/ast.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": { - "1": "Xuacu" - } - }, - "index.newPad": "Nuevu bloc", - "index.createOpenPad": "o crear\/abrir un bloc col nome:", - "pad.toolbar.bold.title": "Negrina (Ctrl-B)", - "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Sorray\u00e1u (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Tach\u00e1u", - "pad.toolbar.ol.title": "Llista ordenada", - "pad.toolbar.ul.title": "Llista ensin ordenar", - "pad.toolbar.indent.title": "Sangr\u00eda", - "pad.toolbar.unindent.title": "Sangr\u00eda inversa", - "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", - "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autor\u00eda", - "pad.toolbar.import_export.title": "Importar\/Esportar ente distintos formatos de ficheru", - "pad.toolbar.timeslider.title": "Eslizador de tiempu", - "pad.toolbar.savedRevision.title": "Guardar revisi\u00f3n", - "pad.toolbar.settings.title": "Configuraci\u00f3n", - "pad.toolbar.embed.title": "Incrustar esti bloc", - "pad.toolbar.showusers.title": "Amosar los usuarios d'esti bloc", - "pad.colorpicker.save": "Guardar", - "pad.colorpicker.cancel": "Encaboxar", - "pad.loading": "Cargando...", - "pad.passwordRequired": "Necesites una contrase\u00f1a pa entrar a esti bloc", - "pad.permissionDenied": "Nun tienes permisu pa entrar a esti bloc", - "pad.wrongPassword": "La contrase\u00f1a era incorreuta", - "pad.settings.padSettings": "Configuraci\u00f3n del bloc", - "pad.settings.myView": "la mio vista", - "pad.settings.stickychat": "Alderique en pantalla siempres", - "pad.settings.colorcheck": "Colores d'autor\u00eda", - "pad.settings.linenocheck": "N\u00famberos de llinia", - "pad.settings.rtlcheck": "\u00bfLleer el conten\u00edu de drecha a izquierda?", - "pad.settings.fontType": "Tipograf\u00eda:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespaciada", - "pad.settings.globalView": "Vista global", - "pad.settings.language": "Llingua:", - "pad.importExport.import_export": "Importar\/Esportar", - "pad.importExport.import": "Xubir cualquier ficheru o documentu de testu", - "pad.importExport.importSuccessful": "\u00a1Correuto!", - "pad.importExport.export": "Esportar el bloc actual como:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Testu simple", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "S\u00f3lo se pue importar dende los formatos de testu planu o html. Pa carauter\u00edstiques d'importaci\u00f3n m\u00e1s avanzaes instala abiword<\/a>.", - "pad.modals.connected": "Coneut\u00e1u.", - "pad.modals.reconnecting": "Reconeutando col to bloc...", - "pad.modals.forcereconnect": "Forzar la reconex\u00f3n", - "pad.modals.userdup": "Abiertu n'otra ventana", - "pad.modals.userdup.explanation": "Esti bloc paez que ta abiertu en m\u00e1s d'una ventana del navegador d'esti ordenador.", - "pad.modals.userdup.advice": "Reconeutar pa usar esta ventana.", - "pad.modals.unauth": "Non autoriz\u00e1u.", - "pad.modals.unauth.explanation": "Los tos permisos camudaron mientres vies esta p\u00e1xina. Intenta volver a coneutar.", - "pad.modals.looping": "Desconeut\u00e1u.", - "pad.modals.looping.explanation": "Hai problemes de comunicaci\u00f3n col sirvidor de sincronizaci\u00f3n.", - "pad.modals.looping.cause": "Pues tar coneut\u00e1u per un torgafueos o un proxy incompatibles.", - "pad.modals.initsocketfail": "Sirvidor incalcanzable.", - "pad.modals.initsocketfail.explanation": "Nun se pudo coneutar col sirvidor de sincronizaci\u00f3n.", - "pad.modals.initsocketfail.cause": "Probablemente ye por aciu d'un problema col navegador o cola to conex\u00f3n a internet.", - "pad.modals.slowcommit": "Desconeut\u00e1u.", - "pad.modals.slowcommit.explanation": "El sirvidor nun respuende.", - "pad.modals.slowcommit.cause": "Pue ser por problemes de coneutivid\u00e1 de la rede.", - "pad.modals.deleted": "Desanici\u00e1u", - "pad.modals.deleted.explanation": "Esti bloc se desanici\u00f3.", - "pad.modals.disconnected": "Te desconeutasti.", - "pad.modals.disconnected.explanation": "Perdi\u00f3se la conex\u00f3n col sirvidor", - "pad.modals.disconnected.cause": "El sirvidor podr\u00eda nun tar disponible. Por favor, avisanos si sigue pasando esto.", - "pad.share": "Compartir esti bloc", - "pad.share.readonly": "S\u00f3lo llectura", - "pad.share.link": "Enllaz", - "pad.share.emebdcode": "Incrustar URL", - "pad.chat": "Chat", - "pad.chat.title": "Abrir el chat d'esti bloc.", - "pad.chat.loadmessages": "Cargar m\u00e1s mensaxes", - "timeslider.pageTitle": "Eslizador de tiempu de {{appTitle}}", - "timeslider.toolbar.returnbutton": "Tornar al bloc", - "timeslider.toolbar.authors": "Autores:", - "timeslider.toolbar.authorsList": "Nun hai autores", - "timeslider.toolbar.exportlink.title": "Esportar", - "timeslider.exportCurrent": "Esportar la versi\u00f3n actual como:", - "timeslider.version": "Versi\u00f3n {{version}}", - "timeslider.saved": "Guard\u00e1u el {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "de xineru", - "timeslider.month.february": "de febreru", - "timeslider.month.march": "de marzu", - "timeslider.month.april": "d'abril", - "timeslider.month.may": "de mayu", - "timeslider.month.june": "de xunu", - "timeslider.month.july": "de xunetu", - "timeslider.month.august": "d'agostu", - "timeslider.month.september": "de setiembre", - "timeslider.month.october": "d'ochobre", - "timeslider.month.november": "de payares", - "timeslider.month.december": "d'avientu", - "timeslider.unnamedauthor": "{{num}} autor an\u00f3nimu", - "timeslider.unnamedauthors": "{{num}} autores an\u00f3nimos", - "pad.savedrevs.marked": "Esta revisi\u00f3n marcose como revisi\u00f3n guardada", - "pad.userlist.entername": "Escribi'l to nome", - "pad.userlist.unnamed": "ensin nome", - "pad.userlist.guest": "Invit\u00e1u", - "pad.userlist.deny": "Refugar", - "pad.userlist.approve": "Aprobar", - "pad.editbar.clearcolors": "\u00bfLlimpiar los colores d'autor\u00eda nel documentu ensembre?", - "pad.impexp.importbutton": "Importar agora", - "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "La importaci\u00f3n d'un ficheru sustituir\u00e1'l testu actual del bloc. \u00bfSeguro que quies siguir?", - "pad.impexp.convertFailed": "Nun pudimos importar esti ficheru. Por favor,usa otru formatu de ficheru diferente o copia y pega manualmente.", - "pad.impexp.uploadFailed": "Fall\u00f3 la carga del ficheru, intentalo otra vuelta", - "pad.impexp.importfailed": "Fall\u00f3 la importaci\u00f3n", - "pad.impexp.copypaste": "Por favor, copia y apega", - "pad.impexp.exportdisabled": "La esportaci\u00f3n en formatu {{type}} ta desactivada. Por favor, comunica col alministrador del sistema pa m\u00e1s detalles." + "@metadata": { + "authors": { + "1": "Xuacu" + } + }, + "index.newPad": "Nuevu bloc", + "index.createOpenPad": "o crear/abrir un bloc col nome:", + "pad.toolbar.bold.title": "Negrina (Ctrl-B)", + "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", + "pad.toolbar.underline.title": "Sorray\u00e1u (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Tach\u00e1u", + "pad.toolbar.ol.title": "Llista ordenada", + "pad.toolbar.ul.title": "Llista ensin ordenar", + "pad.toolbar.indent.title": "Sangr\u00eda", + "pad.toolbar.unindent.title": "Sangr\u00eda inversa", + "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", + "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autor\u00eda", + "pad.toolbar.import_export.title": "Importar/Esportar ente distintos formatos de ficheru", + "pad.toolbar.timeslider.title": "Eslizador de tiempu", + "pad.toolbar.savedRevision.title": "Guardar revisi\u00f3n", + "pad.toolbar.settings.title": "Configuraci\u00f3n", + "pad.toolbar.embed.title": "Incrustar esti bloc", + "pad.toolbar.showusers.title": "Amosar los usuarios d'esti bloc", + "pad.colorpicker.save": "Guardar", + "pad.colorpicker.cancel": "Encaboxar", + "pad.loading": "Cargando...", + "pad.passwordRequired": "Necesites una contrase\u00f1a pa entrar a esti bloc", + "pad.permissionDenied": "Nun tienes permisu pa entrar a esti bloc", + "pad.wrongPassword": "La contrase\u00f1a era incorreuta", + "pad.settings.padSettings": "Configuraci\u00f3n del bloc", + "pad.settings.myView": "la mio vista", + "pad.settings.stickychat": "Alderique en pantalla siempres", + "pad.settings.colorcheck": "Colores d'autor\u00eda", + "pad.settings.linenocheck": "N\u00famberos de llinia", + "pad.settings.rtlcheck": "\u00bfLleer el conten\u00edu de drecha a izquierda?", + "pad.settings.fontType": "Tipograf\u00eda:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monoespaciada", + "pad.settings.globalView": "Vista global", + "pad.settings.language": "Llingua:", + "pad.importExport.import_export": "Importar/Esportar", + "pad.importExport.import": "Xubir cualquier ficheru o documentu de testu", + "pad.importExport.importSuccessful": "\u00a1Correuto!", + "pad.importExport.export": "Esportar el bloc actual como:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Testu simple", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "S\u00f3lo se pue importar dende los formatos de testu planu o html. Pa carauter\u00edstiques d'importaci\u00f3n m\u00e1s avanzaes \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstala abiword\u003C/a\u003E.", + "pad.modals.connected": "Coneut\u00e1u.", + "pad.modals.reconnecting": "Reconeutando col to bloc...", + "pad.modals.forcereconnect": "Forzar la reconex\u00f3n", + "pad.modals.userdup": "Abiertu n'otra ventana", + "pad.modals.userdup.explanation": "Esti bloc paez que ta abiertu en m\u00e1s d'una ventana del navegador d'esti ordenador.", + "pad.modals.userdup.advice": "Reconeutar pa usar esta ventana.", + "pad.modals.unauth": "Non autoriz\u00e1u", + "pad.modals.unauth.explanation": "Los tos permisos camudaron mientres vies esta p\u00e1xina. Intenta volver a coneutar.", + "pad.modals.looping": "Desconeut\u00e1u.", + "pad.modals.looping.explanation": "Hai problemes de comunicaci\u00f3n col sirvidor de sincronizaci\u00f3n.", + "pad.modals.looping.cause": "Pues tar coneut\u00e1u per un torgafueos o un proxy incompatibles.", + "pad.modals.initsocketfail": "Sirvidor incalcanzable.", + "pad.modals.initsocketfail.explanation": "Nun se pudo coneutar col sirvidor de sincronizaci\u00f3n.", + "pad.modals.initsocketfail.cause": "Probablemente ye por aciu d'un problema col navegador o cola to conex\u00f3n a internet.", + "pad.modals.slowcommit": "Desconeut\u00e1u.", + "pad.modals.slowcommit.explanation": "El sirvidor nun respuende.", + "pad.modals.slowcommit.cause": "Pue ser por problemes de coneutivid\u00e1 de la rede.", + "pad.modals.deleted": "Desanici\u00e1u", + "pad.modals.deleted.explanation": "Esti bloc se desanici\u00f3.", + "pad.modals.disconnected": "Te desconeutasti.", + "pad.modals.disconnected.explanation": "Perdi\u00f3se la conex\u00f3n col sirvidor", + "pad.modals.disconnected.cause": "El sirvidor podr\u00eda nun tar disponible. Por favor, avisanos si sigue pasando esto.", + "pad.share": "Compartir esti bloc", + "pad.share.readonly": "S\u00f3lo llectura", + "pad.share.link": "Enllaz", + "pad.share.emebdcode": "Incrustar URL", + "pad.chat": "Chat", + "pad.chat.title": "Abrir el chat d'esti bloc.", + "pad.chat.loadmessages": "Cargar m\u00e1s mensaxes", + "timeslider.pageTitle": "Eslizador de tiempu de {{appTitle}}", + "timeslider.toolbar.returnbutton": "Tornar al bloc", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Nun hai autores", + "timeslider.toolbar.exportlink.title": "Esportar", + "timeslider.exportCurrent": "Esportar la versi\u00f3n actual como:", + "timeslider.version": "Versi\u00f3n {{version}}", + "timeslider.saved": "Guard\u00e1u el {{day}} de {{month}} de {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "de xineru", + "timeslider.month.february": "de febreru", + "timeslider.month.march": "de marzu", + "timeslider.month.april": "d'abril", + "timeslider.month.may": "de mayu", + "timeslider.month.june": "de xunu", + "timeslider.month.july": "de xunetu", + "timeslider.month.august": "d'agostu", + "timeslider.month.september": "de setiembre", + "timeslider.month.october": "d'ochobre", + "timeslider.month.november": "de payares", + "timeslider.month.december": "d'avientu", + "timeslider.unnamedauthor": "{{num}} autor an\u00f3nimu", + "timeslider.unnamedauthors": "{{num}} autores an\u00f3nimos", + "pad.savedrevs.marked": "Esta revisi\u00f3n marcose como revisi\u00f3n guardada", + "pad.userlist.entername": "Escribi'l to nome", + "pad.userlist.unnamed": "ensin nome", + "pad.userlist.guest": "Invit\u00e1u", + "pad.userlist.deny": "Refugar", + "pad.userlist.approve": "Aprobar", + "pad.editbar.clearcolors": "\u00bfLlimpiar los colores d'autor\u00eda nel documentu ensembre?", + "pad.impexp.importbutton": "Importar agora", + "pad.impexp.importing": "Importando...", + "pad.impexp.confirmimport": "La importaci\u00f3n d'un ficheru sustituir\u00e1'l testu actual del bloc. \u00bfSeguro que quies siguir?", + "pad.impexp.convertFailed": "Nun pudimos importar esti ficheru. Por favor,usa otru formatu de ficheru diferente o copia y pega manualmente.", + "pad.impexp.uploadFailed": "Fall\u00f3 la carga del ficheru, intentalo otra vuelta", + "pad.impexp.importfailed": "Fall\u00f3 la importaci\u00f3n", + "pad.impexp.copypaste": "Por favor, copia y apega", + "pad.impexp.exportdisabled": "La esportaci\u00f3n en formatu {{type}} ta desactivada. Por favor, comunica col alministrador del sistema pa m\u00e1s detalles." } \ No newline at end of file diff --git a/src/locales/az.json b/src/locales/az.json index 95c65798..82562e79 100644 --- a/src/locales/az.json +++ b/src/locales/az.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": [ - "AZISS", - "Khan27" - ] - }, - "index.newPad": "Yeni Pad", - "index.createOpenPad": "v\u0259 ya Pad-\u0131 ad\u0131 il\u0259 yarat\/a\u00e7:", - "pad.toolbar.bold.title": "Qal\u0131n (Ctrl-B)", - "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", - "pad.toolbar.underline.title": "Alt\u0131ndan x\u0259tt \u00e7\u0259km\u0259 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Pozulma", - "pad.toolbar.ol.title": "Qaydaya sal\u0131nm\u0131\u015f siyah\u0131", - "pad.toolbar.ul.title": "Qaydaya sal\u0131nmam\u0131\u015f siyah\u0131", - "pad.toolbar.indent.title": "Abzas", - "pad.toolbar.unindent.title": "\u00c7\u0131x\u0131nt\u0131", - "pad.toolbar.undo.title": "Geri Al (Ctrl-Z)", - "pad.toolbar.redo.title": "Qaytarmaq (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "M\u00fc\u0259lliflik R\u0259ngl\u0259rini T\u0259mizl\u0259", - "pad.toolbar.import_export.title": "M\u00fcxt\u0259lif fayl formatlar\u0131n(a\/dan) idxal\/ixrac", - "pad.toolbar.timeslider.title": "Vaxt c\u0259dv\u0259li", - "pad.toolbar.savedRevision.title": "Saxlan\u0131lan D\u00fcz\u0259li\u015fl\u0259r", - "pad.toolbar.settings.title": "T\u0259nziml\u0259m\u0259l\u0259r", - "pad.toolbar.embed.title": "Bu pad-\u0131 yay\u0131mla", - "pad.toolbar.showusers.title": "Pad-da istifad\u0259\u00e7il\u0259ri g\u00f6st\u0259r", - "pad.colorpicker.save": "Saxla", - "pad.colorpicker.cancel": "\u0130mtina", - "pad.loading": "Y\u00fckl\u0259nir...", - "pad.passwordRequired": "Bu pad-a daxil olmaq \u00fc\u00e7\u00fcn parol laz\u0131md\u0131r", - "pad.permissionDenied": "Bu pad-a daxil olmaq \u00fc\u00e7\u00fcn icaz\u0259niz yoxdur", - "pad.wrongPassword": "Sizin parolunuz s\u0259hvdir", - "pad.settings.padSettings": "Pad T\u0259nziml\u0259m\u0259l\u0259ri", - "pad.settings.myView": "M\u0259nim G\u00f6r\u00fcnt\u00fcm", - "pad.settings.stickychat": "S\u00f6hb\u0259t h\u0259mi\u015f\u0259 ekranda", - "pad.settings.colorcheck": "M\u00fc\u0259lliflik r\u0259ngl\u0259ri", - "pad.settings.linenocheck": "S\u0259tir n\u00f6mr\u0259l\u0259ri", - "pad.settings.fontType": "\u015eriftin tipi:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monobo\u015fluq", - "pad.settings.globalView": "\u00dcmumi g\u00f6r\u00fcn\u00fc\u015f", - "pad.settings.language": "Dil:", - "pad.importExport.import_export": "\u0130dxal\/\u0130xrac", - "pad.importExport.import": "H\u0259r hans\u0131 bir m\u0259tn fayl\u0131 v\u0259 ya s\u0259n\u0259d y\u00fckl\u0259", - "pad.importExport.importSuccessful": "U\u011furlu!", - "pad.importExport.export": "Haz\u0131rki pad-\u0131 ixrac etm\u0259k kimi:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Adi m\u0259tn", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (A\u00e7\u0131q S\u0259n\u0259d Format\u0131)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Siz yaln\u0131z adi m\u0259tnd\u0259n v\u0259 ya HTML-d\u0259n idxal ed\u0259 bil\u0259rsiniz. \u0130dxal\u0131n daha m\u00fcr\u0259kk\u0259b funksiyalar\u0131 \u00fc\u00e7\u00fcn, z\u0259hm\u0259t olmasa, AbiWord-i qura\u015fd\u0131r\u0131n<\/a>.", - "pad.modals.connected": "Ba\u011fland\u0131.", - "pad.modals.reconnecting": "Sizin pad yenid\u0259n qo\u015fulur..", - "pad.modals.forcereconnect": "M\u0259cbur t\u0259krar\u0259n ba\u011flan", - "pad.modals.userdup": "Ba\u015fqa p\u0259nc\u0259r\u0259d\u0259 art\u0131q a\u00e7\u0131qd\u0131r", - "pad.modals.userdup.explanation": "S\u0259n\u0259d, ola bilsin ki, bu kompyuterd\u0259, brauzerin bir ne\u00e7\u0259 p\u0259nc\u0259r\u0259sind\u0259 a\u00e7\u0131lm\u0131\u015fd\u0131r.", - "pad.modals.userdup.advice": "Bu p\u0259nc\u0259r\u0259d\u0259n istifad\u0259yl\u0259 yenid\u0259n qo\u015fulun.", - "pad.modals.unauth": "\u0130caz\u0259li deyil", - "pad.modals.unauth.explanation": "Bu s\u0259hif\u0259y\u0259 baxd\u0131\u011f\u0131n\u0131z vaxt sizin icaz\u0259niz d\u0259yi\u015filib. B\u0259rpa etm\u0259k \u00fc\u015f\u00fcn yenid\u0259n c\u0259hd edin.", - "pad.modals.looping": "\u018flaq\u0259 k\u0259sildi.", - "pad.modals.looping.explanation": "Sinxronla\u015fd\u0131rma serveri il\u0259 kommunikasiya x\u0259tas\u0131 var.", - "pad.modals.looping.cause": "Ola bilsin ki, siz uy\u011fun olmayan fayrvol v\u0259 ya proksi vasit\u0259si il\u0259 qo\u015fulma\u011fa c\u0259hd g\u00f6st\u0259rirsiniz.", - "pad.modals.initsocketfail": "Server \u0259l\u00e7atmazd\u0131r.", - "pad.modals.initsocketfail.explanation": "Sinxronla\u015fd\u0131rma serverin\u0259 qo\u015fulma m\u00fcmk\u00fcns\u00fczd\u00fcr.", - "pad.modals.initsocketfail.cause": "Ehtimal ki, bu problem sizin brauzerinizl\u0259 v\u0259 ya internet-birl\u0259\u015fm\u0259nizl\u0259 \u0259laq\u0259d\u0259rdir.", - "pad.modals.slowcommit": "\u018flaq\u0259 k\u0259sildi.", - "pad.modals.slowcommit.explanation": "Server cavab vermir.", - "pad.modals.slowcommit.cause": "Bu \u015f\u0259b\u0259k\u0259 ba\u011flant\u0131s\u0131nda probleml\u0259r yarana bil\u0259r.", - "pad.modals.deleted": "Silindi.", - "pad.modals.deleted.explanation": "Bu pad silindi.", - "pad.modals.disconnected": "\u018flaq\u0259 k\u0259silib.", - "pad.modals.disconnected.explanation": "Server\u0259 qo\u015fulma itirilib", - "pad.modals.disconnected.cause": "Server istifad\u0259 olunmur. \u018fg\u0259r problem t\u0259krarlanacaqsa, biz\u0259 bildirin.", - "pad.share": "Bu pad-\u0131 yay\u0131mla", - "pad.share.readonly": "Yaln\u0131z oxuyun", - "pad.share.link": "Ke\u00e7id", - "pad.share.emebdcode": "URL-ni yay\u0131mla", - "pad.chat": "S\u00f6hb\u0259t", - "pad.chat.title": "Bu pad \u00fc\u00e7\u00fcn chat a\u00e7\u0131n.", - "pad.chat.loadmessages": "Daha \u00e7ox mesaj y\u00fckl\u0259", - "timeslider.pageTitle": "{{appTitle}} Vaxt c\u0259dv\u0259li", - "timeslider.toolbar.returnbutton": "Pad-a qay\u0131t", - "timeslider.toolbar.authors": "M\u00fc\u0259llifl\u0259r:", - "timeslider.toolbar.authorsList": "M\u00fc\u0259llif yoxdur", - "timeslider.toolbar.exportlink.title": "\u0130xrac", - "timeslider.exportCurrent": "Cari versiyan\u0131 ixrac etm\u0259k kimi:", - "timeslider.version": "Versiya {{version}}", - "timeslider.saved": "Saxlan\u0131ld\u0131 {{day}} {{month}}, {{year}}", - "timeslider.dateformat": "{{day}} {{month}}, {{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Yanvar", - "timeslider.month.february": "Fevral", - "timeslider.month.march": "Mart", - "timeslider.month.april": "Aprel", - "timeslider.month.may": "May", - "timeslider.month.june": "\u0130yun", - "timeslider.month.july": "\u0130yul", - "timeslider.month.august": "Avqust", - "timeslider.month.september": "Sentyabr", - "timeslider.month.october": "Oktyabr", - "timeslider.month.november": "Noyabr", - "timeslider.month.december": "Dekabr", - "timeslider.unnamedauthor": "{{num}} ads\u0131z m\u00fc\u0259llif", - "timeslider.unnamedauthors": "{{num}} ads\u0131z m\u00fc\u0259llifl\u0259r", - "pad.savedrevs.marked": "Bu versiya indi yadda\u015fa saxlanm\u0131\u015f kimi ni\u015fanland\u0131", - "pad.userlist.entername": "Ad\u0131n\u0131z\u0131 daxil et", - "pad.userlist.unnamed": "ads\u0131z", - "pad.userlist.guest": "Qonaq", - "pad.userlist.deny": "\u0130nkar etm\u0259k", - "pad.userlist.approve": "T\u0259sdiql\u0259m\u0259k", - "pad.editbar.clearcolors": "B\u00fct\u00fcn s\u0259n\u0259dl\u0259rd\u0259 m\u00fc\u0259lliflik r\u0259ngl\u0259rini t\u0259mizl\u0259?", - "pad.impexp.importbutton": "\u0130ndi idxal edin", - "pad.impexp.importing": "\u0130dxal...", - "pad.impexp.confirmimport": "Fayl\u0131n idxal\u0131 cari m\u0259tni yenil\u0259y\u0259c\u0259k. Siz \u0259minsinizmi ki, davam etm\u0259k ist\u0259yirsiniz?", - "pad.impexp.convertFailed": "Biz bu fayl idxal etm\u0259k m\u00fcmk\u00fcn deyil idi. Xahi\u015f olunur m\u00fcxt\u0259lif s\u0259n\u0259dd\u0259n istifad\u0259 edin v\u0259 ya kopyalay\u0131b yap\u0131\u015fd\u0131rmaq yolundan istifad\u0259 edin", - "pad.impexp.uploadFailed": "Y\u00fckl\u0259m\u0259d\u0259 s\u0259hv, xahi\u015f olunur yen\u0259 c\u0259hd edin", - "pad.impexp.importfailed": "\u0130dxal zaman\u0131 s\u0259hv", - "pad.impexp.copypaste": "Xahi\u015f edirik kopyalay\u0131b yap\u0131\u015fd\u0131r\u0131n", - "pad.impexp.exportdisabled": "{{ type}} format\u0131nda ixrac s\u00f6nd\u00fcr\u00fclm\u00fc\u015fd\u00fcr. \u018ftrafl\u0131 informasiya \u00fc\u00e7\u00fcn sistem administratoruna m\u00fcraci\u0259t ediniz." + "@metadata": { + "authors": [ + "AZISS", + "Khan27" + ] + }, + "index.newPad": "Yeni Pad", + "index.createOpenPad": "v\u0259 ya Pad-\u0131 ad\u0131 il\u0259 yarat/a\u00e7:", + "pad.toolbar.bold.title": "Qal\u0131n (Ctrl-B)", + "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", + "pad.toolbar.underline.title": "Alt\u0131ndan x\u0259tt \u00e7\u0259km\u0259 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Pozulma", + "pad.toolbar.ol.title": "Qaydaya sal\u0131nm\u0131\u015f siyah\u0131", + "pad.toolbar.ul.title": "Qaydaya sal\u0131nmam\u0131\u015f siyah\u0131", + "pad.toolbar.indent.title": "Abzas", + "pad.toolbar.unindent.title": "\u00c7\u0131x\u0131nt\u0131", + "pad.toolbar.undo.title": "Geri Al (Ctrl-Z)", + "pad.toolbar.redo.title": "Qaytarmaq (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "M\u00fc\u0259lliflik R\u0259ngl\u0259rini T\u0259mizl\u0259", + "pad.toolbar.import_export.title": "M\u00fcxt\u0259lif fayl formatlar\u0131n(a/dan) idxal/ixrac", + "pad.toolbar.timeslider.title": "Vaxt c\u0259dv\u0259li", + "pad.toolbar.savedRevision.title": "Saxlan\u0131lan D\u00fcz\u0259li\u015fl\u0259r", + "pad.toolbar.settings.title": "T\u0259nziml\u0259m\u0259l\u0259r", + "pad.toolbar.embed.title": "Bu pad-\u0131 yay\u0131mla", + "pad.toolbar.showusers.title": "Pad-da istifad\u0259\u00e7il\u0259ri g\u00f6st\u0259r", + "pad.colorpicker.save": "Saxla", + "pad.colorpicker.cancel": "\u0130mtina", + "pad.loading": "Y\u00fckl\u0259nir...", + "pad.passwordRequired": "Bu pad-a daxil olmaq \u00fc\u00e7\u00fcn parol laz\u0131md\u0131r", + "pad.permissionDenied": "Bu pad-a daxil olmaq \u00fc\u00e7\u00fcn icaz\u0259niz yoxdur", + "pad.wrongPassword": "Sizin parolunuz s\u0259hvdir", + "pad.settings.padSettings": "Pad T\u0259nziml\u0259m\u0259l\u0259ri", + "pad.settings.myView": "M\u0259nim G\u00f6r\u00fcnt\u00fcm", + "pad.settings.stickychat": "S\u00f6hb\u0259t h\u0259mi\u015f\u0259 ekranda", + "pad.settings.colorcheck": "M\u00fc\u0259lliflik r\u0259ngl\u0259ri", + "pad.settings.linenocheck": "S\u0259tir n\u00f6mr\u0259l\u0259ri", + "pad.settings.fontType": "\u015eriftin tipi:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monobo\u015fluq", + "pad.settings.globalView": "\u00dcmumi g\u00f6r\u00fcn\u00fc\u015f", + "pad.settings.language": "Dil:", + "pad.importExport.import_export": "\u0130dxal/\u0130xrac", + "pad.importExport.import": "H\u0259r hans\u0131 bir m\u0259tn fayl\u0131 v\u0259 ya s\u0259n\u0259d y\u00fckl\u0259", + "pad.importExport.importSuccessful": "U\u011furlu!", + "pad.importExport.export": "Haz\u0131rki pad-\u0131 ixrac etm\u0259k kimi:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Adi m\u0259tn", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (A\u00e7\u0131q S\u0259n\u0259d Format\u0131)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Siz yaln\u0131z adi m\u0259tnd\u0259n v\u0259 ya HTML-d\u0259n idxal ed\u0259 bil\u0259rsiniz. \u0130dxal\u0131n daha m\u00fcr\u0259kk\u0259b funksiyalar\u0131 \u00fc\u00e7\u00fcn, z\u0259hm\u0259t olmasa, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E AbiWord-i qura\u015fd\u0131r\u0131n\u003C/a\u003E.", + "pad.modals.connected": "Ba\u011fland\u0131.", + "pad.modals.reconnecting": "Sizin pad yenid\u0259n qo\u015fulur..", + "pad.modals.forcereconnect": "M\u0259cbur t\u0259krar\u0259n ba\u011flan", + "pad.modals.userdup": "Ba\u015fqa p\u0259nc\u0259r\u0259d\u0259 art\u0131q a\u00e7\u0131qd\u0131r", + "pad.modals.userdup.explanation": "S\u0259n\u0259d, ola bilsin ki, bu kompyuterd\u0259, brauzerin bir ne\u00e7\u0259 p\u0259nc\u0259r\u0259sind\u0259 a\u00e7\u0131lm\u0131\u015fd\u0131r.", + "pad.modals.userdup.advice": "Bu p\u0259nc\u0259r\u0259d\u0259n istifad\u0259yl\u0259 yenid\u0259n qo\u015fulun.", + "pad.modals.unauth": "\u0130caz\u0259li deyil", + "pad.modals.unauth.explanation": "Bu s\u0259hif\u0259y\u0259 baxd\u0131\u011f\u0131n\u0131z vaxt sizin icaz\u0259niz d\u0259yi\u015filib. B\u0259rpa etm\u0259k \u00fc\u015f\u00fcn yenid\u0259n c\u0259hd edin.", + "pad.modals.looping": "\u018flaq\u0259 k\u0259sildi.", + "pad.modals.looping.explanation": "Sinxronla\u015fd\u0131rma serveri il\u0259 kommunikasiya x\u0259tas\u0131 var.", + "pad.modals.looping.cause": "Ola bilsin ki, siz uy\u011fun olmayan fayrvol v\u0259 ya proksi vasit\u0259si il\u0259 qo\u015fulma\u011fa c\u0259hd g\u00f6st\u0259rirsiniz.", + "pad.modals.initsocketfail": "Server \u0259l\u00e7atmazd\u0131r.", + "pad.modals.initsocketfail.explanation": "Sinxronla\u015fd\u0131rma serverin\u0259 qo\u015fulma m\u00fcmk\u00fcns\u00fczd\u00fcr.", + "pad.modals.initsocketfail.cause": "Ehtimal ki, bu problem sizin brauzerinizl\u0259 v\u0259 ya internet-birl\u0259\u015fm\u0259nizl\u0259 \u0259laq\u0259d\u0259rdir.", + "pad.modals.slowcommit": "\u018flaq\u0259 k\u0259sildi.", + "pad.modals.slowcommit.explanation": "Server cavab vermir.", + "pad.modals.slowcommit.cause": "Bu \u015f\u0259b\u0259k\u0259 ba\u011flant\u0131s\u0131nda probleml\u0259r yarana bil\u0259r.", + "pad.modals.deleted": "Silindi.", + "pad.modals.deleted.explanation": "Bu pad silindi.", + "pad.modals.disconnected": "\u018flaq\u0259 k\u0259silib.", + "pad.modals.disconnected.explanation": "Server\u0259 qo\u015fulma itirilib", + "pad.modals.disconnected.cause": "Server istifad\u0259 olunmur. \u018fg\u0259r problem t\u0259krarlanacaqsa, biz\u0259 bildirin.", + "pad.share": "Bu pad-\u0131 yay\u0131mla", + "pad.share.readonly": "Yaln\u0131z oxuyun", + "pad.share.link": "Ke\u00e7id", + "pad.share.emebdcode": "URL-ni yay\u0131mla", + "pad.chat": "S\u00f6hb\u0259t", + "pad.chat.title": "Bu pad \u00fc\u00e7\u00fcn chat a\u00e7\u0131n.", + "pad.chat.loadmessages": "Daha \u00e7ox mesaj y\u00fckl\u0259", + "timeslider.pageTitle": "{{appTitle}} Vaxt c\u0259dv\u0259li", + "timeslider.toolbar.returnbutton": "Pad-a qay\u0131t", + "timeslider.toolbar.authors": "M\u00fc\u0259llifl\u0259r:", + "timeslider.toolbar.authorsList": "M\u00fc\u0259llif yoxdur", + "timeslider.toolbar.exportlink.title": "\u0130xrac", + "timeslider.exportCurrent": "Cari versiyan\u0131 ixrac etm\u0259k kimi:", + "timeslider.version": "Versiya {{version}}", + "timeslider.saved": "Saxlan\u0131ld\u0131 {{day}} {{month}}, {{year}}", + "timeslider.dateformat": "{{day}} {{month}}, {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Yanvar", + "timeslider.month.february": "Fevral", + "timeslider.month.march": "Mart", + "timeslider.month.april": "Aprel", + "timeslider.month.may": "May", + "timeslider.month.june": "\u0130yun", + "timeslider.month.july": "\u0130yul", + "timeslider.month.august": "Avqust", + "timeslider.month.september": "Sentyabr", + "timeslider.month.october": "Oktyabr", + "timeslider.month.november": "Noyabr", + "timeslider.month.december": "Dekabr", + "timeslider.unnamedauthor": "{{num}} ads\u0131z m\u00fc\u0259llif", + "timeslider.unnamedauthors": "{{num}} ads\u0131z m\u00fc\u0259llifl\u0259r", + "pad.savedrevs.marked": "Bu versiya indi yadda\u015fa saxlanm\u0131\u015f kimi ni\u015fanland\u0131", + "pad.userlist.entername": "Ad\u0131n\u0131z\u0131 daxil et", + "pad.userlist.unnamed": "ads\u0131z", + "pad.userlist.guest": "Qonaq", + "pad.userlist.deny": "\u0130nkar etm\u0259k", + "pad.userlist.approve": "T\u0259sdiql\u0259m\u0259k", + "pad.editbar.clearcolors": "B\u00fct\u00fcn s\u0259n\u0259dl\u0259rd\u0259 m\u00fc\u0259lliflik r\u0259ngl\u0259rini t\u0259mizl\u0259?", + "pad.impexp.importbutton": "\u0130ndi idxal edin", + "pad.impexp.importing": "\u0130dxal...", + "pad.impexp.confirmimport": "Fayl\u0131n idxal\u0131 cari m\u0259tni yenil\u0259y\u0259c\u0259k. Siz \u0259minsinizmi ki, davam etm\u0259k ist\u0259yirsiniz?", + "pad.impexp.convertFailed": "Biz bu fayl idxal etm\u0259k m\u00fcmk\u00fcn deyil idi. Xahi\u015f olunur m\u00fcxt\u0259lif s\u0259n\u0259dd\u0259n istifad\u0259 edin v\u0259 ya kopyalay\u0131b yap\u0131\u015fd\u0131rmaq yolundan istifad\u0259 edin", + "pad.impexp.uploadFailed": "Y\u00fckl\u0259m\u0259d\u0259 s\u0259hv, xahi\u015f olunur yen\u0259 c\u0259hd edin", + "pad.impexp.importfailed": "\u0130dxal zaman\u0131 s\u0259hv", + "pad.impexp.copypaste": "Xahi\u015f edirik kopyalay\u0131b yap\u0131\u015fd\u0131r\u0131n", + "pad.impexp.exportdisabled": "{{ type}} format\u0131nda ixrac s\u00f6nd\u00fcr\u00fclm\u00fc\u015fd\u00fcr. \u018ftrafl\u0131 informasiya \u00fc\u00e7\u00fcn sistem administratoruna m\u00fcraci\u0259t ediniz." } \ No newline at end of file diff --git a/src/locales/azb.json b/src/locales/azb.json index 5bfe448b..e3448dc8 100644 --- a/src/locales/azb.json +++ b/src/locales/azb.json @@ -1,73 +1,73 @@ { - "@metadata": { - "authors": [ - "Amir a57", - "Mousa" - ] - }, - "index.newPad": "\u06cc\u0626\u0646\u06cc \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc", - "index.createOpenPad": "\u06cc\u0627 \u062f\u0627 \u0627\u06cc\u062c\u0627\u062f \/\u0628\u06cc\u0631 \u067e\u062f \u0622\u062f\u0644\u0627 \u0628\u0631\u0627\u0628\u0631 \u0622\u0686\u0645\u0627\u0642:", - "pad.toolbar.bold.title": "\u0628\u0648\u06cc\u0648\u062a", - "pad.toolbar.italic.title": "\u0645\u0648\u0631\u0628", - "pad.toolbar.underline.title": "\u062e\u0637\u062f\u06cc\u0646 \u0622\u0644\u062a\u06cc", - "pad.toolbar.strikethrough.title": "\u062e\u0637 \u06cc\u0626\u0645\u06cc\u0634", - "pad.toolbar.ol.title": "\u062c\u0648\u062a\u062f\u0646\u0645\u06cc\u0634 \u0641\u0647\u0631\u0633\u062a", - "pad.toolbar.ul.title": "\u062c\u0648\u062a\u062f\u0646\u0645\u0645\u06cc\u0634 \u0641\u0647\u0631\u0633\u062a", - "pad.toolbar.indent.title": "\u0627\u06cc\u0686\u0631\u06cc \u0628\u0627\u062a\u062f\u06cc\u06af\u06cc", - "pad.toolbar.unindent.title": "\u0627\u0626\u0634\u06cc\u06af\u0647 \u0686\u06cc\u062e\u062f\u06cc\u06af\u06cc", - "pad.toolbar.undo.title": "\u0628\u0627\u0637\u0644 \u0627\u0626\u062a\u0645\u06a9", - "pad.toolbar.redo.title": "\u06cc\u0626\u0646\u06cc \u062f\u0646", - "pad.toolbar.clearAuthorship.title": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0631\u0646\u06af \u0644\u0631\u06cc \u067e\u0648\u0632\u0645\u0627\u0642", - "pad.toolbar.import_export.title": "\u0622\u06cc\u0631\u06cc \u0642\u0627\u0644\u06cc\u0628 \u0644\u0631\u062f\u0646 \/\u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647 \/ \u0627\u0626\u0634\u06cc\u06af\u0647 \u062a\u0648\u06a9\u0645\u0647", - "pad.toolbar.timeslider.title": "\u0632\u0645\u0627\u0646 \u0627\u0633\u0644\u0627\u06cc\u062f\u06cc", - "pad.toolbar.savedRevision.title": "\u0633\u0627\u062e\u0644\u0627\u0646\u0645\u06cc\u0634 \u0646\u0633\u062e\u0647 \u0644\u0631", - "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0644\u0631", - "pad.toolbar.embed.title": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646 \u06cc\u0626\u0631\u0644\u062a\u0645\u06a9", - "pad.toolbar.showusers.title": "\u0628\u0648 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0627 \u0627\u0648\u0644\u0627\u0646 \u06a9\u0627\u0631\u0628\u0631\u0644\u0631\u06cc \u06af\u0648\u0633\u062a\u0631", - "pad.colorpicker.save": "\u0642\u0626\u06cc\u062f \u0627\u0626\u062a", - "pad.colorpicker.cancel": "\u0644\u063a\u0648 \u0627\u0626\u062a", - "pad.loading": "\u06cc\u0648\u06a9\u0644\u0646\u06cc\u0631...", - "pad.settings.padSettings": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0644\u0631", - "pad.settings.myView": "\u0645\u0646\u06cc\u0645 \u06af\u0648\u0631\u0646\u062a\u0648\u0645", - "pad.settings.stickychat": "\u0646\u0645\u0627\u06cc\u0634 \u0635\u0641\u062d\u0647 \u0633\u06cc\u0646\u062f\u0647 \u0647\u0645\u06cc\u0634\u0647 \u0686\u062a \u0627\u0648\u0644\u0633\u0648\u0646", - "pad.settings.colorcheck": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0631\u0646\u06af \u0644\u0631\u06cc", - "pad.settings.linenocheck": "\u062e\u0637\u0648\u0637 \u0634\u0645\u0627\u0631\u0647 \u0633\u06cc", - "pad.settings.fontType": "\u0642\u0644\u0645 \u0646\u0648\u0639\u06cc", - "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", - "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648 \u0627\u0633\u067e\u0626\u06cc\u0633", - "pad.settings.globalView": "\u0633\u0631\u0627\u0633\u0631 \u06af\u0648\u0631\u0648\u0646\u062a\u0648", - "pad.settings.language": "\u062f\u06cc\u0644:", - "pad.importExport.import_export": "\u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647 \/\u0627\u0626\u0634\u06cc\u06af\u0647 \u062a\u0648\u06a9\u0645\u0647", - "pad.importExport.import": "\u0633\u0646\u062f \u06cc\u0627 \u062f\u0627 \u0645\u062a\u0646\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u06cc\u0648\u06a9\u0644\u0647", - "pad.importExport.export": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc \u0639\u0646\u0648\u0627\u0646\u0627 \u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647", - "pad.importExport.exporthtml": "\u0627\u0686 \u062a\u06cc \u0627\u0645 \u0627\u0644", - "pad.importExport.exportplain": "\u0633\u0627\u062f\u0647 \u0645\u062a\u0646", - "pad.importExport.exportword": "\u0645\u0627\u06cc\u06a9\u0631\u0648\u0633\u0627\u0641\u062a \u0648\u0648\u0631\u062f", - "pad.importExport.exportpdf": "\u067e\u06cc \u062f\u06cc \u0627\u0641", - "pad.importExport.exportopen": "\u0627\u0648 \u062f\u06cc \u0627\u0641", - "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648 \u0648\u06cc\u06a9\u06cc", - "pad.modals.connected": "\u0645\u062a\u0635\u0644 \u0627\u0648\u0644\u062f\u06cc", - "pad.modals.reconnecting": "\u0633\u06cc\u0632\u06cc\u0646 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u0647 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u062f\u06cc", - "pad.modals.forcereconnect": "\u06cc\u0626\u0646\u06cc \u0627\u062a\u0635\u0627\u0644 \u0627\u0648\u0686\u0648\u0646 \u0632\u0648\u0631\u0644\u0627\u0645\u0627", - "pad.modals.userdup.advice": "\u0628\u0648 \u067e\u0626\u0646\u062c\u0631\u0647 \u062f\u0646 \u0627\u06cc\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0626\u062a\u0645\u06a9 \u0627\u0648\u0686\u0648\u0646 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644", - "pad.modals.unauth": "\u0627\u0648\u0644\u0645\u0627\u0632", - "pad.modals.unauth.explanation": "\u0633\u06cc\u0632\u06cc\u0646 \u0627\u0644 \u0686\u062a\u0645\u0627 \u0645\u0633\u0626\u0644\u0647 \u0633\u06cc \u0628\u0648 \u0635\u0641\u062d\u0647 \u0646\u06cc\u0646 \u06af\u0648\u0631\u0648\u0646\u0648\u0634 \u0632\u0645\u0627\u0646\u06cc\u0646\u062f\u0627 \u062f\u06cc\u06cc\u0634\u06cc\u0644\u06cc\u0628 \u062f\u06cc\u0631 .\n\u0633\u0639\u06cc \u0627\u0626\u062f\u06cc\u0646 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0627\u0633\u06cc\u0646\u06cc\u0632", - "pad.modals.looping": "\u0627\u062a\u06cc\u0635\u0627\u0644 \u0642\u0637\u0639 \u0627\u0648\u0644\u062f\u06cc", - "pad.modals.looping.explanation": "\u0627\u0631\u062a\u06cc\u0628\u0627\u0637\u06cc \u0645\u0648\u0634\u06a9\u06cc\u0644 \u0628\u06cc\u0631 \u0627\u0626\u062a\u0645\u0647 \u0633\u0631\u0648\u0631 \u062f\u0647 \u0648\u0627\u0631 \u062f\u06cc\u0631", - "pad.modals.looping.cause": "\u0628\u0644\u06a9\u0647 \u0633\u06cc\u0632 \u062f\u0648\u0632 \u062f\u0626\u0645\u06cc\u06cc\u0646 \u0628\u06cc\u0631 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u06cc\u0627\u062f\u0627 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0637\u0631\u06cc\u0642\u06cc \u0627\u06cc\u0644\u0647 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0648\u0628 \u0633\u06cc\u0646\u06cc\u0632", - "pad.modals.initsocketfail": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0648\u0644\u0645\u0648\u06cc\u0627\u0646 \u0633\u0631\u0648\u0631 \u062f\u06cc\u0631", - "pad.modals.initsocketfail.explanation": "\u0628\u06cc\u0631\u0644\u0634\u062f\u06cc\u0631\u06cc\u0644\u0645\u0647 \u0633\u0631\u0648\u0631 \u0644\u0631\u06cc\u0646\u0647 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0627 \u0628\u06cc\u0644\u0645\u0647 \u062f\u06cc", - "pad.modals.deleted": "\u0633\u06cc\u0644\u06cc\u0646\u062f\u06cc.", - "pad.modals.deleted.explanation": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc \u0633\u06cc\u0644\u06cc\u0646\u06cc\u0628 \u062f\u06cc\u0631.", - "pad.modals.disconnected": "\u0633\u06cc\u0632\u06cc\u0646 \u0627\u062a\u0635\u0627\u0644\u06cc\u0646\u06cc\u0632 \u0642\u0637\u0639 \u0627\u0648\u0644\u0648\u0628 \u062f\u0648\u0631.", - "pad.modals.disconnected.explanation": "\u0633\u0631\u0648\u0631\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0627\u0648\u0644\u0648\u0628 \u062f\u0648\u0631.", - "pad.share.readonly": "\u0627\u0648\u062e\u0648\u0645\u0627\u0644\u06cc \u0641\u0642\u0637", - "pad.share.link": "\u0628\u0627\u063a\u0644\u0627\u0646\u062a\u06cc", - "pad.share.emebdcode": "\u0646\u0634\u0627\u0646\u06cc \u0646\u06cc \u06cc\u0626\u0631\u0644\u062a\u0645\u06a9", - "pad.chat": "\u0686\u062a", - "pad.chat.title": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0646\u06cc \u0686\u062a \u0627\u0648\u0686\u0648\u0646 \u0622\u0686", - "timeslider.pageTitle": "{{appTitle}}\u0632\u0645\u0627\u0646 \u0627\u0633\u0644\u0627\u06cc\u062f\u0631\u06cc", - "timeslider.toolbar.returnbutton": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u0647 \u0642\u0627\u06cc\u06cc\u062a", - "timeslider.toolbar.authors": "\u06cc\u0627\u0632\u06cc\u0686\u06cc\u0644\u0627\u0631", - "timeslider.toolbar.authorsList": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0633\u06cc\u0632" + "@metadata": { + "authors": [ + "Amir a57", + "Mousa" + ] + }, + "index.newPad": "\u06cc\u0626\u0646\u06cc \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc", + "index.createOpenPad": "\u06cc\u0627 \u062f\u0627 \u0627\u06cc\u062c\u0627\u062f /\u0628\u06cc\u0631 \u067e\u062f \u0622\u062f\u0644\u0627 \u0628\u0631\u0627\u0628\u0631 \u0622\u0686\u0645\u0627\u0642:", + "pad.toolbar.bold.title": "\u0628\u0648\u06cc\u0648\u062a", + "pad.toolbar.italic.title": "\u0645\u0648\u0631\u0628", + "pad.toolbar.underline.title": "\u062e\u0637\u062f\u06cc\u0646 \u0622\u0644\u062a\u06cc", + "pad.toolbar.strikethrough.title": "\u062e\u0637 \u06cc\u0626\u0645\u06cc\u0634", + "pad.toolbar.ol.title": "\u062c\u0648\u062a\u062f\u0646\u0645\u06cc\u0634 \u0641\u0647\u0631\u0633\u062a", + "pad.toolbar.ul.title": "\u062c\u0648\u062a\u062f\u0646\u0645\u0645\u06cc\u0634 \u0641\u0647\u0631\u0633\u062a", + "pad.toolbar.indent.title": "\u0627\u06cc\u0686\u0631\u06cc \u0628\u0627\u062a\u062f\u06cc\u06af\u06cc", + "pad.toolbar.unindent.title": "\u0627\u0626\u0634\u06cc\u06af\u0647 \u0686\u06cc\u062e\u062f\u06cc\u06af\u06cc", + "pad.toolbar.undo.title": "\u0628\u0627\u0637\u0644 \u0627\u0626\u062a\u0645\u06a9", + "pad.toolbar.redo.title": "\u06cc\u0626\u0646\u06cc \u062f\u0646", + "pad.toolbar.clearAuthorship.title": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0631\u0646\u06af \u0644\u0631\u06cc \u067e\u0648\u0632\u0645\u0627\u0642", + "pad.toolbar.import_export.title": "\u0622\u06cc\u0631\u06cc \u0642\u0627\u0644\u06cc\u0628 \u0644\u0631\u062f\u0646 /\u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647 / \u0627\u0626\u0634\u06cc\u06af\u0647 \u062a\u0648\u06a9\u0645\u0647", + "pad.toolbar.timeslider.title": "\u0632\u0645\u0627\u0646 \u0627\u0633\u0644\u0627\u06cc\u062f\u06cc", + "pad.toolbar.savedRevision.title": "\u0633\u0627\u062e\u0644\u0627\u0646\u0645\u06cc\u0634 \u0646\u0633\u062e\u0647 \u0644\u0631", + "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0644\u0631", + "pad.toolbar.embed.title": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646 \u06cc\u0626\u0631\u0644\u062a\u0645\u06a9", + "pad.toolbar.showusers.title": "\u0628\u0648 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0627 \u0627\u0648\u0644\u0627\u0646 \u06a9\u0627\u0631\u0628\u0631\u0644\u0631\u06cc \u06af\u0648\u0633\u062a\u0631", + "pad.colorpicker.save": "\u0642\u0626\u06cc\u062f \u0627\u0626\u062a", + "pad.colorpicker.cancel": "\u0644\u063a\u0648 \u0627\u0626\u062a", + "pad.loading": "\u06cc\u0648\u06a9\u0644\u0646\u06cc\u0631...", + "pad.settings.padSettings": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0644\u0631", + "pad.settings.myView": "\u0645\u0646\u06cc\u0645 \u06af\u0648\u0631\u0646\u062a\u0648\u0645", + "pad.settings.stickychat": "\u0646\u0645\u0627\u06cc\u0634 \u0635\u0641\u062d\u0647 \u0633\u06cc\u0646\u062f\u0647 \u0647\u0645\u06cc\u0634\u0647 \u0686\u062a \u0627\u0648\u0644\u0633\u0648\u0646", + "pad.settings.colorcheck": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0631\u0646\u06af \u0644\u0631\u06cc", + "pad.settings.linenocheck": "\u062e\u0637\u0648\u0637 \u0634\u0645\u0627\u0631\u0647 \u0633\u06cc", + "pad.settings.fontType": "\u0642\u0644\u0645 \u0646\u0648\u0639\u06cc", + "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", + "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648 \u0627\u0633\u067e\u0626\u06cc\u0633", + "pad.settings.globalView": "\u0633\u0631\u0627\u0633\u0631 \u06af\u0648\u0631\u0648\u0646\u062a\u0648", + "pad.settings.language": "\u062f\u06cc\u0644:", + "pad.importExport.import_export": "\u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647 /\u0627\u0626\u0634\u06cc\u06af\u0647 \u062a\u0648\u06a9\u0645\u0647", + "pad.importExport.import": "\u0633\u0646\u062f \u06cc\u0627 \u062f\u0627 \u0645\u062a\u0646\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u06cc\u0648\u06a9\u0644\u0647", + "pad.importExport.export": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc \u0639\u0646\u0648\u0627\u0646\u0627 \u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647", + "pad.importExport.exporthtml": "\u0627\u0686 \u062a\u06cc \u0627\u0645 \u0627\u0644", + "pad.importExport.exportplain": "\u0633\u0627\u062f\u0647 \u0645\u062a\u0646", + "pad.importExport.exportword": "\u0645\u0627\u06cc\u06a9\u0631\u0648\u0633\u0627\u0641\u062a \u0648\u0648\u0631\u062f", + "pad.importExport.exportpdf": "\u067e\u06cc \u062f\u06cc \u0627\u0641", + "pad.importExport.exportopen": "\u0627\u0648 \u062f\u06cc \u0627\u0641", + "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648 \u0648\u06cc\u06a9\u06cc", + "pad.modals.connected": "\u0645\u062a\u0635\u0644 \u0627\u0648\u0644\u062f\u06cc", + "pad.modals.reconnecting": "\u0633\u06cc\u0632\u06cc\u0646 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u0647 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u062f\u06cc", + "pad.modals.forcereconnect": "\u06cc\u0626\u0646\u06cc \u0627\u062a\u0635\u0627\u0644 \u0627\u0648\u0686\u0648\u0646 \u0632\u0648\u0631\u0644\u0627\u0645\u0627", + "pad.modals.userdup.advice": "\u0628\u0648 \u067e\u0626\u0646\u062c\u0631\u0647 \u062f\u0646 \u0627\u06cc\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0626\u062a\u0645\u06a9 \u0627\u0648\u0686\u0648\u0646 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644", + "pad.modals.unauth": "\u0627\u0648\u0644\u0645\u0627\u0632", + "pad.modals.unauth.explanation": "\u0633\u06cc\u0632\u06cc\u0646 \u0627\u0644 \u0686\u062a\u0645\u0627 \u0645\u0633\u0626\u0644\u0647 \u0633\u06cc \u0628\u0648 \u0635\u0641\u062d\u0647 \u0646\u06cc\u0646 \u06af\u0648\u0631\u0648\u0646\u0648\u0634 \u0632\u0645\u0627\u0646\u06cc\u0646\u062f\u0627 \u062f\u06cc\u06cc\u0634\u06cc\u0644\u06cc\u0628 \u062f\u06cc\u0631 .\n\u0633\u0639\u06cc \u0627\u0626\u062f\u06cc\u0646 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0627\u0633\u06cc\u0646\u06cc\u0632", + "pad.modals.looping": "\u0627\u062a\u06cc\u0635\u0627\u0644 \u0642\u0637\u0639 \u0627\u0648\u0644\u062f\u06cc", + "pad.modals.looping.explanation": "\u0627\u0631\u062a\u06cc\u0628\u0627\u0637\u06cc \u0645\u0648\u0634\u06a9\u06cc\u0644 \u0628\u06cc\u0631 \u0627\u0626\u062a\u0645\u0647 \u0633\u0631\u0648\u0631 \u062f\u0647 \u0648\u0627\u0631 \u062f\u06cc\u0631", + "pad.modals.looping.cause": "\u0628\u0644\u06a9\u0647 \u0633\u06cc\u0632 \u062f\u0648\u0632 \u062f\u0626\u0645\u06cc\u06cc\u0646 \u0628\u06cc\u0631 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u06cc\u0627\u062f\u0627 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0637\u0631\u06cc\u0642\u06cc \u0627\u06cc\u0644\u0647 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0648\u0628 \u0633\u06cc\u0646\u06cc\u0632", + "pad.modals.initsocketfail": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0648\u0644\u0645\u0648\u06cc\u0627\u0646 \u0633\u0631\u0648\u0631 \u062f\u06cc\u0631", + "pad.modals.initsocketfail.explanation": "\u0628\u06cc\u0631\u0644\u0634\u062f\u06cc\u0631\u06cc\u0644\u0645\u0647 \u0633\u0631\u0648\u0631 \u0644\u0631\u06cc\u0646\u0647 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0627 \u0628\u06cc\u0644\u0645\u0647 \u062f\u06cc", + "pad.modals.deleted": "\u0633\u06cc\u0644\u06cc\u0646\u062f\u06cc.", + "pad.modals.deleted.explanation": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc \u0633\u06cc\u0644\u06cc\u0646\u06cc\u0628 \u062f\u06cc\u0631.", + "pad.modals.disconnected": "\u0633\u06cc\u0632\u06cc\u0646 \u0627\u062a\u0635\u0627\u0644\u06cc\u0646\u06cc\u0632 \u0642\u0637\u0639 \u0627\u0648\u0644\u0648\u0628 \u062f\u0648\u0631.", + "pad.modals.disconnected.explanation": "\u0633\u0631\u0648\u0631\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0627\u0648\u0644\u0648\u0628 \u062f\u0648\u0631.", + "pad.share.readonly": "\u0627\u0648\u062e\u0648\u0645\u0627\u0644\u06cc \u0641\u0642\u0637", + "pad.share.link": "\u0628\u0627\u063a\u0644\u0627\u0646\u062a\u06cc", + "pad.share.emebdcode": "\u0646\u0634\u0627\u0646\u06cc \u0646\u06cc \u06cc\u0626\u0631\u0644\u062a\u0645\u06a9", + "pad.chat": "\u0686\u062a", + "pad.chat.title": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0646\u06cc \u0686\u062a \u0627\u0648\u0686\u0648\u0646 \u0622\u0686", + "timeslider.pageTitle": "{{appTitle}}\u0632\u0645\u0627\u0646 \u0627\u0633\u0644\u0627\u06cc\u062f\u0631\u06cc", + "timeslider.toolbar.returnbutton": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u0647 \u0642\u0627\u06cc\u06cc\u062a", + "timeslider.toolbar.authors": "\u06cc\u0627\u0632\u06cc\u0686\u06cc\u0644\u0627\u0631", + "timeslider.toolbar.authorsList": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0633\u06cc\u0632" } \ No newline at end of file diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json index 0b44115c..85f062f6 100644 --- a/src/locales/be-tarask.json +++ b/src/locales/be-tarask.json @@ -1,61 +1,61 @@ { - "@metadata": { - "authors": [ - "Jim-by", - "Wizardist" - ] - }, - "index.newPad": "\u0421\u0442\u0432\u0430\u0440\u044b\u0446\u044c", - "index.createOpenPad": "\u0446\u0456 \u0442\u0432\u0430\u0440\u044b\u0446\u044c\/\u0430\u0434\u043a\u0440\u044b\u0446\u044c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u0430\u0439:", - "pad.toolbar.bold.title": "\u0422\u043e\u045e\u0441\u0442\u044b (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u0443\u0440\u0441\u0456\u045e (Ctrl-I)", - "pad.toolbar.underline.title": "\u041f\u0430\u0434\u043a\u0440\u044d\u0441\u044c\u043b\u0456\u0432\u0430\u043d\u044c\u043d\u0435 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0417\u0430\u043a\u0440\u044d\u0441\u044c\u043b\u0456\u0432\u0430\u043d\u044c\u043d\u0435", - "pad.toolbar.ol.title": "\u0423\u043f\u0430\u0440\u0430\u0434\u043a\u0430\u0432\u0430\u043d\u044b \u0441\u044c\u043f\u0456\u0441", - "pad.toolbar.ul.title": "\u041d\u0435\u045e\u043f\u0430\u0440\u0430\u0434\u043a\u0430\u0432\u0430\u043d\u044b \u0441\u044c\u043f\u0456\u0441", - "pad.toolbar.indent.title": "\u0412\u043e\u0434\u0441\u0442\u0443\u043f", - "pad.toolbar.unindent.title": "\u0412\u044b\u0441\u0442\u0443\u043f", - "pad.toolbar.undo.title": "\u0421\u043a\u0430\u0441\u0430\u0432\u0430\u0446\u044c(Ctrl-Z)", - "pad.toolbar.redo.title": "\u0412\u044f\u0440\u043d\u0443\u0446\u044c (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041f\u0440\u044b\u0431\u0440\u0430\u0446\u044c \u043a\u043e\u043b\u0435\u0440 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0443", - "pad.toolbar.import_export.title": "\u0406\u043c\u043f\u0430\u0440\u0442\/\u042d\u043a\u0441\u043f\u0430\u0440\u0442 \u0437 \u0432\u044b\u043a\u0430\u0440\u044b\u0441\u0442\u0430\u043d\u044c\u043d\u0435 \u0440\u043e\u0437\u043d\u044b\u0445 \u0444\u0430\u0440\u043c\u0430\u0442\u0430\u045e \u0444\u0430\u0439\u043b\u0430\u045e", - "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0447\u0430\u0441\u0443", - "pad.toolbar.savedRevision.title": "\u0417\u0430\u0445\u0430\u0432\u0430\u0446\u044c \u0432\u044d\u0440\u0441\u0456\u044e", - "pad.toolbar.settings.title": "\u041d\u0430\u043b\u0430\u0434\u044b", - "pad.toolbar.embed.title": "\u0423\u0431\u0443\u0434\u0430\u0432\u0430\u0446\u044c \u0433\u044d\u0442\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442", - "pad.toolbar.showusers.title": "\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u043b\u044c\u043d\u0456\u043a\u0430\u045e \u0443 \u0433\u044d\u0442\u044b\u043c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0446\u0435", - "pad.colorpicker.save": "\u0417\u0430\u0445\u0430\u0432\u0430\u0446\u044c", - "pad.colorpicker.cancel": "\u0421\u043a\u0430\u0441\u0430\u0432\u0430\u0446\u044c", - "pad.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...", - "pad.passwordRequired": "\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u0430 \u0433\u044d\u0442\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430 \u043f\u0430\u0442\u0440\u044d\u0431\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.permissionDenied": "\u0412\u044b \u043d\u044f \u043c\u0430\u0435\u0446\u0435 \u0434\u0430\u0437\u0432\u043e\u043b\u0443 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0430 \u0433\u044d\u0442\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430", - "pad.wrongPassword": "\u0412\u044b \u045e\u0432\u044f\u043b\u0456 \u043d\u044f\u0441\u043b\u0443\u0448\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.settings.padSettings": "\u041d\u0430\u043b\u0430\u0434\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430", - "pad.settings.myView": "\u041c\u043e\u0439 \u0432\u044b\u0433\u043b\u044f\u0434", - "pad.settings.stickychat": "\u0417\u0430\u045e\u0441\u0451\u0434\u044b \u043f\u0430\u043a\u0430\u0437\u0432\u0430\u0446\u044c \u0447\u0430\u0442", - "pad.settings.colorcheck": "\u041a\u043e\u043b\u0435\u0440\u044b \u0430\u045e\u0442\u0430\u0440\u0441\u0442\u0432\u0430", - "pad.settings.linenocheck": "\u041d\u0443\u043c\u0430\u0440\u044b \u0440\u0430\u0434\u043a\u043e\u045e", - "pad.settings.rtlcheck": "\u0422\u044d\u043a\u0441\u0442 \u0441\u043f\u0440\u0430\u0432\u0430-\u043d\u0430\u043b\u0435\u0432\u0430", - "pad.settings.fontType": "\u0422\u044b\u043f \u0448\u0440\u044b\u0444\u0442\u0443:", - "pad.settings.fontType.normal": "\u0417\u0432\u044b\u0447\u0430\u0439\u043d\u044b", - "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u0430\u0448\u044b\u0440\u044b\u043d\u043d\u044b", - "pad.settings.globalView": "\u0410\u0433\u0443\u043b\u044c\u043d\u044b \u0432\u044b\u0433\u043b\u044f\u0434", - "pad.settings.language": "\u041c\u043e\u0432\u0430:", - "pad.importExport.import_export": "\u0406\u043c\u043f\u0430\u0440\u0442\/\u042d\u043a\u0441\u043f\u0430\u0440\u0442", - "pad.importExport.import": "\u0417\u0430\u0433\u0440\u0443\u0437\u0456\u0436\u0430\u0439\u0446\u0435 \u043b\u044e\u0431\u044b\u044f \u0442\u044d\u043a\u0441\u0442\u0430\u0432\u044b\u044f \u0444\u0430\u0439\u043b\u044b \u0430\u0431\u043e \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u044b", - "pad.importExport.importSuccessful": "\u041f\u0430\u0441\u044c\u043f\u044f\u0445\u043e\u0432\u0430!", - "pad.importExport.export": "\u042d\u043a\u0441\u043f\u0430\u0440\u0442\u0430\u0432\u0430\u0446\u044c \u0431\u044f\u0433\u0443\u0447\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u044f\u043a:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u041f\u0440\u043e\u0441\u0442\u044b \u0442\u044d\u043a\u0441\u0442", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "\u041f\u0430\u0434\u043b\u0443\u0447\u044b\u043b\u0456\u0441\u044f.", - "pad.modals.reconnecting": "\u041f\u0435\u0440\u0430\u043f\u0430\u0434\u043b\u0443\u0447\u044d\u043d\u044c\u043d\u0435 \u0434\u0430 \u0432\u0430\u0448\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430...", - "pad.modals.forcereconnect": "\u041f\u0440\u044b\u043c\u0443\u0441\u043e\u0432\u0430\u0435 \u043f\u0435\u0440\u0430\u043f\u0430\u0434\u043b\u0443\u0447\u044d\u043d\u044c\u043d\u0435", - "pad.share": "\u041f\u0430\u0434\u0437\u044f\u043b\u0456\u0446\u0446\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430\u043c", - "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u0456 \u0434\u043b\u044f \u0447\u044b\u0442\u0430\u043d\u044c\u043d\u044f", - "pad.share.link": "\u0421\u043f\u0430\u0441\u044b\u043b\u043a\u0430", - "pad.chat": "\u0427\u0430\u0442" + "@metadata": { + "authors": [ + "Jim-by", + "Wizardist" + ] + }, + "index.newPad": "\u0421\u0442\u0432\u0430\u0440\u044b\u0446\u044c", + "index.createOpenPad": "\u0446\u0456 \u0442\u0432\u0430\u0440\u044b\u0446\u044c/\u0430\u0434\u043a\u0440\u044b\u0446\u044c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u0430\u0439:", + "pad.toolbar.bold.title": "\u0422\u043e\u045e\u0441\u0442\u044b (Ctrl-B)", + "pad.toolbar.italic.title": "\u041a\u0443\u0440\u0441\u0456\u045e (Ctrl-I)", + "pad.toolbar.underline.title": "\u041f\u0430\u0434\u043a\u0440\u044d\u0441\u044c\u043b\u0456\u0432\u0430\u043d\u044c\u043d\u0435 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0417\u0430\u043a\u0440\u044d\u0441\u044c\u043b\u0456\u0432\u0430\u043d\u044c\u043d\u0435", + "pad.toolbar.ol.title": "\u0423\u043f\u0430\u0440\u0430\u0434\u043a\u0430\u0432\u0430\u043d\u044b \u0441\u044c\u043f\u0456\u0441", + "pad.toolbar.ul.title": "\u041d\u0435\u045e\u043f\u0430\u0440\u0430\u0434\u043a\u0430\u0432\u0430\u043d\u044b \u0441\u044c\u043f\u0456\u0441", + "pad.toolbar.indent.title": "\u0412\u043e\u0434\u0441\u0442\u0443\u043f", + "pad.toolbar.unindent.title": "\u0412\u044b\u0441\u0442\u0443\u043f", + "pad.toolbar.undo.title": "\u0421\u043a\u0430\u0441\u0430\u0432\u0430\u0446\u044c(Ctrl-Z)", + "pad.toolbar.redo.title": "\u0412\u044f\u0440\u043d\u0443\u0446\u044c (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u041f\u0440\u044b\u0431\u0440\u0430\u0446\u044c \u043a\u043e\u043b\u0435\u0440 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0443", + "pad.toolbar.import_export.title": "\u0406\u043c\u043f\u0430\u0440\u0442/\u042d\u043a\u0441\u043f\u0430\u0440\u0442 \u0437 \u0432\u044b\u043a\u0430\u0440\u044b\u0441\u0442\u0430\u043d\u044c\u043d\u0435 \u0440\u043e\u0437\u043d\u044b\u0445 \u0444\u0430\u0440\u043c\u0430\u0442\u0430\u045e \u0444\u0430\u0439\u043b\u0430\u045e", + "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0447\u0430\u0441\u0443", + "pad.toolbar.savedRevision.title": "\u0417\u0430\u0445\u0430\u0432\u0430\u0446\u044c \u0432\u044d\u0440\u0441\u0456\u044e", + "pad.toolbar.settings.title": "\u041d\u0430\u043b\u0430\u0434\u044b", + "pad.toolbar.embed.title": "\u0423\u0431\u0443\u0434\u0430\u0432\u0430\u0446\u044c \u0433\u044d\u0442\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442", + "pad.toolbar.showusers.title": "\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u043b\u044c\u043d\u0456\u043a\u0430\u045e \u0443 \u0433\u044d\u0442\u044b\u043c \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0446\u0435", + "pad.colorpicker.save": "\u0417\u0430\u0445\u0430\u0432\u0430\u0446\u044c", + "pad.colorpicker.cancel": "\u0421\u043a\u0430\u0441\u0430\u0432\u0430\u0446\u044c", + "pad.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...", + "pad.passwordRequired": "\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u0430 \u0433\u044d\u0442\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430 \u043f\u0430\u0442\u0440\u044d\u0431\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.permissionDenied": "\u0412\u044b \u043d\u044f \u043c\u0430\u0435\u0446\u0435 \u0434\u0430\u0437\u0432\u043e\u043b\u0443 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0430 \u0433\u044d\u0442\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430", + "pad.wrongPassword": "\u0412\u044b \u045e\u0432\u044f\u043b\u0456 \u043d\u044f\u0441\u043b\u0443\u0448\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.settings.padSettings": "\u041d\u0430\u043b\u0430\u0434\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430", + "pad.settings.myView": "\u041c\u043e\u0439 \u0432\u044b\u0433\u043b\u044f\u0434", + "pad.settings.stickychat": "\u0417\u0430\u045e\u0441\u0451\u0434\u044b \u043f\u0430\u043a\u0430\u0437\u0432\u0430\u0446\u044c \u0447\u0430\u0442", + "pad.settings.colorcheck": "\u041a\u043e\u043b\u0435\u0440\u044b \u0430\u045e\u0442\u0430\u0440\u0441\u0442\u0432\u0430", + "pad.settings.linenocheck": "\u041d\u0443\u043c\u0430\u0440\u044b \u0440\u0430\u0434\u043a\u043e\u045e", + "pad.settings.rtlcheck": "\u0422\u044d\u043a\u0441\u0442 \u0441\u043f\u0440\u0430\u0432\u0430-\u043d\u0430\u043b\u0435\u0432\u0430", + "pad.settings.fontType": "\u0422\u044b\u043f \u0448\u0440\u044b\u0444\u0442\u0443:", + "pad.settings.fontType.normal": "\u0417\u0432\u044b\u0447\u0430\u0439\u043d\u044b", + "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u0430\u0448\u044b\u0440\u044b\u043d\u043d\u044b", + "pad.settings.globalView": "\u0410\u0433\u0443\u043b\u044c\u043d\u044b \u0432\u044b\u0433\u043b\u044f\u0434", + "pad.settings.language": "\u041c\u043e\u0432\u0430:", + "pad.importExport.import_export": "\u0406\u043c\u043f\u0430\u0440\u0442/\u042d\u043a\u0441\u043f\u0430\u0440\u0442", + "pad.importExport.import": "\u0417\u0430\u0433\u0440\u0443\u0437\u0456\u0436\u0430\u0439\u0446\u0435 \u043b\u044e\u0431\u044b\u044f \u0442\u044d\u043a\u0441\u0442\u0430\u0432\u044b\u044f \u0444\u0430\u0439\u043b\u044b \u0430\u0431\u043e \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u044b", + "pad.importExport.importSuccessful": "\u041f\u0430\u0441\u044c\u043f\u044f\u0445\u043e\u0432\u0430!", + "pad.importExport.export": "\u042d\u043a\u0441\u043f\u0430\u0440\u0442\u0430\u0432\u0430\u0446\u044c \u0431\u044f\u0433\u0443\u0447\u044b \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442 \u044f\u043a:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u041f\u0440\u043e\u0441\u0442\u044b \u0442\u044d\u043a\u0441\u0442", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u041f\u0430\u0434\u043b\u0443\u0447\u044b\u043b\u0456\u0441\u044f.", + "pad.modals.reconnecting": "\u041f\u0435\u0440\u0430\u043f\u0430\u0434\u043b\u0443\u0447\u044d\u043d\u044c\u043d\u0435 \u0434\u0430 \u0432\u0430\u0448\u0430\u0433\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430...", + "pad.modals.forcereconnect": "\u041f\u0440\u044b\u043c\u0443\u0441\u043e\u0432\u0430\u0435 \u043f\u0435\u0440\u0430\u043f\u0430\u0434\u043b\u0443\u0447\u044d\u043d\u044c\u043d\u0435", + "pad.share": "\u041f\u0430\u0434\u0437\u044f\u043b\u0456\u0446\u0446\u0430 \u0434\u0430\u043a\u0443\u043c\u044d\u043d\u0442\u0430\u043c", + "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u0456 \u0434\u043b\u044f \u0447\u044b\u0442\u0430\u043d\u044c\u043d\u044f", + "pad.share.link": "\u0421\u043f\u0430\u0441\u044b\u043b\u043a\u0430", + "pad.chat": "\u0427\u0430\u0442" } \ No newline at end of file diff --git a/src/locales/bn.json b/src/locales/bn.json index 2d12528b..09ab215f 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -1,91 +1,91 @@ { - "@metadata": { - "authors": [ - "Bellayet", - "Nasir8891", - "Sankarshan" - ] - }, - "index.newPad": "\u09a8\u09a4\u09c1\u09a8 \u09aa\u09cd\u09af\u09be\u09a1", - "index.createOpenPad": "\u0985\u09a5\u09ac\u09be \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c7 \u09aa\u09cd\u09af\u09be\u09a1 \u0996\u09c1\u09b2\u09c1\u09a8\/\u09a4\u09c8\u09b0\u09c0 \u0995\u09b0\u09c1\u09a8:", - "pad.toolbar.bold.title": "\u0997\u09be\u09a1\u09bc \u0995\u09b0\u09be (Ctrl-B)", - "pad.toolbar.italic.title": "\u09ac\u09be\u0981\u0995\u09be \u0995\u09b0\u09be (Ctrl-I)", - "pad.toolbar.underline.title": "\u0986\u09a8\u09cd\u09a1\u09be\u09b0\u09b2\u09be\u0987\u09a8 (Ctrl-U)", - "pad.toolbar.ol.title": "\u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7 \u09a4\u09be\u09b2\u09bf\u0995\u09be", - "pad.toolbar.indent.title": "\u09aa\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u09bf\u0995\u0995\u09b0\u09a3", - "pad.toolbar.unindent.title": "\u0986\u0989\u099f\u09a1\u09c7\u09a8\u09cd\u099f", - "pad.toolbar.undo.title": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u0995\u09b0\u09c1\u09a8 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u0995\u09c3\u09a4\u09bf \u09b0\u0982 \u09aa\u09b0\u09bf\u09b7\u09cd\u0995\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", - "pad.toolbar.timeslider.title": "\u099f\u09be\u0987\u09ae\u09b8\u09cd\u09b2\u09be\u0987\u09a1\u09be\u09b0", - "pad.toolbar.savedRevision.title": "\u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09c1\u09a8", - "pad.toolbar.settings.title": "\u09b8\u09c7\u099f\u09bf\u0982", - "pad.toolbar.embed.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u098f\u09ae\u09cd\u09ac\u09c7\u09a1 \u0995\u09b0\u09c1\u09a8", - "pad.toolbar.showusers.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0\u09a6\u09c7\u09b0 \u09a6\u09c7\u0996\u09be\u09a8", - "pad.colorpicker.save": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3", - "pad.colorpicker.cancel": "\u09ac\u09be\u09a4\u09bf\u09b2", - "pad.loading": "\u09b2\u09cb\u09a1\u09bf\u0982...", - "pad.passwordRequired": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u099c\u09a8\u09cd\u09af \u0986\u09aa\u09a8\u09be\u0995\u09c7 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b9\u09ac\u09c7", - "pad.permissionDenied": "\u09a6\u09c1\u0983\u0996\u09bf\u09a4, \u098f \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09c7\u0987", - "pad.wrongPassword": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09b8\u09a0\u09bf\u0995 \u09a8\u09af\u09bc", - "pad.settings.padSettings": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09cd\u09a5\u09be\u09aa\u09a8", - "pad.settings.myView": "\u0986\u09ae\u09be\u09b0 \u09a6\u09c3\u09b6\u09cd\u09af", - "pad.settings.stickychat": "\u099a\u09cd\u09af\u09be\u099f \u09b8\u0995\u09cd\u09b0\u09c0\u09a8\u09c7 \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8 \u0995\u09b0\u09be \u09b9\u09ac\u09c7", - "pad.settings.colorcheck": "\u09b2\u09c7\u0996\u0995\u09a6\u09c7\u09b0 \u09a8\u09bf\u099c\u09b8\u09cd\u09ac \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09bf\u09a4 \u09b0\u0982", - "pad.settings.linenocheck": "\u09b2\u09be\u0987\u09a8 \u09a8\u09ae\u09cd\u09ac\u09b0", - "pad.settings.fontType": "\u09ab\u09a8\u09cd\u099f-\u098f\u09b0 \u09aa\u09cd\u09b0\u0995\u09be\u09b0:", - "pad.settings.fontType.normal": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "\u09b8\u09b0\u09cd\u09ac\u09ac\u09cd\u09af\u09be\u09aa\u09c0 \u09a6\u09c3\u09b6\u09cd\u09af", - "pad.settings.language": "\u09ad\u09be\u09b7\u09be:", - "pad.importExport.import_export": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u099f\/\u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f", - "pad.importExport.import": "\u0995\u09cb\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09ab\u09be\u0987\u09b2 \u09ac\u09be \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09c1\u09a8", - "pad.importExport.importSuccessful": "\u09b8\u09ab\u09b2!", - "pad.importExport.export": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", - "pad.importExport.exporthtml": "\u098f\u0987\u099a\u099f\u09bf\u098f\u09ae\u098f\u09b2", - "pad.importExport.exportplain": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3 \u09b2\u09c7\u0996\u09be", - "pad.importExport.exportword": "\u09ae\u09be\u0987\u0995\u09cd\u09b0\u09cb\u09b8\u09ab\u099f \u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", - "pad.importExport.exportpdf": "\u09aa\u09bf\u09a1\u09bf\u098f\u09ab", - "pad.importExport.exportopen": "\u0993\u09a1\u09bf\u098f\u09ab (\u0993\u09aa\u09c7\u09a8 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u09ab\u09b0\u09ae\u09cd\u09af\u09be\u099f)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09b8\u09ab\u09b2", - "pad.modals.reconnecting": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7..", - "pad.modals.forcereconnect": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8\u09c7\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be", - "pad.modals.userdup": "\u0985\u09a8\u09cd\u09af \u0989\u0987\u09a8\u09cd\u09a1\u09cb-\u09a4\u09c7 \u0996\u09cb\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", - "pad.modals.unauth": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u09a8\u09c7\u0987", - "pad.modals.looping": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", - "pad.modals.initsocketfail": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0-\u098f\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u0985\u09b8\u0995\u09cd\u09b7\u09ae\u0964", - "pad.modals.slowcommit": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", - "pad.modals.deleted": "\u0985\u09aa\u09b8\u09be\u09b0\u09bf\u09a4\u0964", - "pad.modals.deleted.explanation": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964", - "pad.modals.disconnected.explanation": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be", - "pad.share": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", - "pad.share.link": "\u09b2\u09bf\u0982\u0995", - "pad.share.emebdcode": "\u0987\u0989\u0986\u09b0\u098f\u09b2 \u09b8\u0982\u09af\u09cb\u099c\u09a8", - "pad.chat": "\u099a\u09cd\u09af\u09be\u099f", - "pad.chat.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u099a\u09cd\u09af\u09be\u099f \u099a\u09be\u09b2\u09c1 \u0995\u09b0\u09c1\u09a8\u0964", - "timeslider.toolbar.returnbutton": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7 \u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u0993", - "timeslider.toolbar.authors": "\u09b2\u09c7\u0996\u0995\u0997\u09a3:", - "timeslider.toolbar.authorsList": "\u0995\u09cb\u09a8\u09cb \u09b2\u09c7\u0996\u0995 \u09a8\u09c7\u0987", - "timeslider.exportCurrent": "\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8:", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u099c\u09be\u09a8\u09c1\u09af\u09bc\u09be\u09b0\u09bf", - "timeslider.month.february": "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09af\u09bc\u09be\u09b0\u09bf", - "timeslider.month.march": "\u09ae\u09be\u09b0\u09cd\u099a", - "timeslider.month.april": "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2", - "timeslider.month.may": "\u09ae\u09c7", - "timeslider.month.june": "\u099c\u09c1\u09a8", - "timeslider.month.july": "\u099c\u09c1\u09b2\u09be\u0987", - "timeslider.month.august": "\u0986\u0997\u09b8\u09cd\u099f", - "timeslider.month.september": "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0", - "timeslider.month.october": "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0", - "timeslider.month.november": "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0", - "timeslider.month.december": "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0", - "pad.userlist.entername": "\u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09be\u09ae", - "pad.userlist.unnamed": "\u0995\u09cb\u09a8 \u09a8\u09be\u09ae \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09a8\u09bf", - "pad.userlist.guest": "\u0985\u09a4\u09bf\u09a5\u09bf", - "pad.userlist.approve": "\u0985\u09a8\u09c1\u09ae\u09cb\u09a6\u09bf\u09a4", - "pad.impexp.importbutton": "\u098f\u0996\u09a8 \u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", - "pad.impexp.importing": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u099a\u09b2\u099b\u09c7...", - "pad.impexp.importfailed": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0985\u09b8\u0995\u09cd\u09b7\u09ae" + "@metadata": { + "authors": [ + "Bellayet", + "Nasir8891", + "Sankarshan" + ] + }, + "index.newPad": "\u09a8\u09a4\u09c1\u09a8 \u09aa\u09cd\u09af\u09be\u09a1", + "index.createOpenPad": "\u0985\u09a5\u09ac\u09be \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c7 \u09aa\u09cd\u09af\u09be\u09a1 \u0996\u09c1\u09b2\u09c1\u09a8/\u09a4\u09c8\u09b0\u09c0 \u0995\u09b0\u09c1\u09a8:", + "pad.toolbar.bold.title": "\u0997\u09be\u09a1\u09bc \u0995\u09b0\u09be (Ctrl-B)", + "pad.toolbar.italic.title": "\u09ac\u09be\u0981\u0995\u09be \u0995\u09b0\u09be (Ctrl-I)", + "pad.toolbar.underline.title": "\u0986\u09a8\u09cd\u09a1\u09be\u09b0\u09b2\u09be\u0987\u09a8 (Ctrl-U)", + "pad.toolbar.ol.title": "\u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7 \u09a4\u09be\u09b2\u09bf\u0995\u09be", + "pad.toolbar.indent.title": "\u09aa\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u09bf\u0995\u0995\u09b0\u09a3", + "pad.toolbar.unindent.title": "\u0986\u0989\u099f\u09a1\u09c7\u09a8\u09cd\u099f", + "pad.toolbar.undo.title": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u0995\u09b0\u09c1\u09a8 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u0995\u09c3\u09a4\u09bf \u09b0\u0982 \u09aa\u09b0\u09bf\u09b7\u09cd\u0995\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", + "pad.toolbar.timeslider.title": "\u099f\u09be\u0987\u09ae\u09b8\u09cd\u09b2\u09be\u0987\u09a1\u09be\u09b0", + "pad.toolbar.savedRevision.title": "\u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09c1\u09a8", + "pad.toolbar.settings.title": "\u09b8\u09c7\u099f\u09bf\u0982", + "pad.toolbar.embed.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u098f\u09ae\u09cd\u09ac\u09c7\u09a1 \u0995\u09b0\u09c1\u09a8", + "pad.toolbar.showusers.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0\u09a6\u09c7\u09b0 \u09a6\u09c7\u0996\u09be\u09a8", + "pad.colorpicker.save": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3", + "pad.colorpicker.cancel": "\u09ac\u09be\u09a4\u09bf\u09b2", + "pad.loading": "\u09b2\u09cb\u09a1\u09bf\u0982...", + "pad.passwordRequired": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u099c\u09a8\u09cd\u09af \u0986\u09aa\u09a8\u09be\u0995\u09c7 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b9\u09ac\u09c7", + "pad.permissionDenied": "\u09a6\u09c1\u0983\u0996\u09bf\u09a4, \u098f \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09c7\u0987", + "pad.wrongPassword": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09b8\u09a0\u09bf\u0995 \u09a8\u09af\u09bc", + "pad.settings.padSettings": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09cd\u09a5\u09be\u09aa\u09a8", + "pad.settings.myView": "\u0986\u09ae\u09be\u09b0 \u09a6\u09c3\u09b6\u09cd\u09af", + "pad.settings.stickychat": "\u099a\u09cd\u09af\u09be\u099f \u09b8\u0995\u09cd\u09b0\u09c0\u09a8\u09c7 \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8 \u0995\u09b0\u09be \u09b9\u09ac\u09c7", + "pad.settings.colorcheck": "\u09b2\u09c7\u0996\u0995\u09a6\u09c7\u09b0 \u09a8\u09bf\u099c\u09b8\u09cd\u09ac \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09bf\u09a4 \u09b0\u0982", + "pad.settings.linenocheck": "\u09b2\u09be\u0987\u09a8 \u09a8\u09ae\u09cd\u09ac\u09b0", + "pad.settings.fontType": "\u09ab\u09a8\u09cd\u099f-\u098f\u09b0 \u09aa\u09cd\u09b0\u0995\u09be\u09b0:", + "pad.settings.fontType.normal": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "\u09b8\u09b0\u09cd\u09ac\u09ac\u09cd\u09af\u09be\u09aa\u09c0 \u09a6\u09c3\u09b6\u09cd\u09af", + "pad.settings.language": "\u09ad\u09be\u09b7\u09be:", + "pad.importExport.import_export": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u099f/\u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f", + "pad.importExport.import": "\u0995\u09cb\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09ab\u09be\u0987\u09b2 \u09ac\u09be \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09c1\u09a8", + "pad.importExport.importSuccessful": "\u09b8\u09ab\u09b2!", + "pad.importExport.export": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", + "pad.importExport.exporthtml": "\u098f\u0987\u099a\u099f\u09bf\u098f\u09ae\u098f\u09b2", + "pad.importExport.exportplain": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3 \u09b2\u09c7\u0996\u09be", + "pad.importExport.exportword": "\u09ae\u09be\u0987\u0995\u09cd\u09b0\u09cb\u09b8\u09ab\u099f \u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", + "pad.importExport.exportpdf": "\u09aa\u09bf\u09a1\u09bf\u098f\u09ab", + "pad.importExport.exportopen": "\u0993\u09a1\u09bf\u098f\u09ab (\u0993\u09aa\u09c7\u09a8 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u09ab\u09b0\u09ae\u09cd\u09af\u09be\u099f)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09b8\u09ab\u09b2", + "pad.modals.reconnecting": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7..", + "pad.modals.forcereconnect": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8\u09c7\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be", + "pad.modals.userdup": "\u0985\u09a8\u09cd\u09af \u0989\u0987\u09a8\u09cd\u09a1\u09cb-\u09a4\u09c7 \u0996\u09cb\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "pad.modals.unauth": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u09a8\u09c7\u0987", + "pad.modals.looping": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", + "pad.modals.initsocketfail": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0-\u098f\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u0985\u09b8\u0995\u09cd\u09b7\u09ae\u0964", + "pad.modals.slowcommit": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", + "pad.modals.deleted": "\u0985\u09aa\u09b8\u09be\u09b0\u09bf\u09a4\u0964", + "pad.modals.deleted.explanation": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964", + "pad.modals.disconnected.explanation": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be", + "pad.share": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", + "pad.share.link": "\u09b2\u09bf\u0982\u0995", + "pad.share.emebdcode": "\u0987\u0989\u0986\u09b0\u098f\u09b2 \u09b8\u0982\u09af\u09cb\u099c\u09a8", + "pad.chat": "\u099a\u09cd\u09af\u09be\u099f", + "pad.chat.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u099a\u09cd\u09af\u09be\u099f \u099a\u09be\u09b2\u09c1 \u0995\u09b0\u09c1\u09a8\u0964", + "timeslider.toolbar.returnbutton": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7 \u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u0993", + "timeslider.toolbar.authors": "\u09b2\u09c7\u0996\u0995\u0997\u09a3:", + "timeslider.toolbar.authorsList": "\u0995\u09cb\u09a8\u09cb \u09b2\u09c7\u0996\u0995 \u09a8\u09c7\u0987", + "timeslider.exportCurrent": "\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8:", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u099c\u09be\u09a8\u09c1\u09af\u09bc\u09be\u09b0\u09bf", + "timeslider.month.february": "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09af\u09bc\u09be\u09b0\u09bf", + "timeslider.month.march": "\u09ae\u09be\u09b0\u09cd\u099a", + "timeslider.month.april": "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2", + "timeslider.month.may": "\u09ae\u09c7", + "timeslider.month.june": "\u099c\u09c1\u09a8", + "timeslider.month.july": "\u099c\u09c1\u09b2\u09be\u0987", + "timeslider.month.august": "\u0986\u0997\u09b8\u09cd\u099f", + "timeslider.month.september": "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0", + "timeslider.month.october": "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0", + "timeslider.month.november": "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0", + "timeslider.month.december": "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0", + "pad.userlist.entername": "\u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09be\u09ae", + "pad.userlist.unnamed": "\u0995\u09cb\u09a8 \u09a8\u09be\u09ae \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09a8\u09bf", + "pad.userlist.guest": "\u0985\u09a4\u09bf\u09a5\u09bf", + "pad.userlist.approve": "\u0985\u09a8\u09c1\u09ae\u09cb\u09a6\u09bf\u09a4", + "pad.impexp.importbutton": "\u098f\u0996\u09a8 \u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", + "pad.impexp.importing": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u099a\u09b2\u099b\u09c7...", + "pad.impexp.importfailed": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0985\u09b8\u0995\u09cd\u09b7\u09ae" } \ No newline at end of file diff --git a/src/locales/br.json b/src/locales/br.json index f844eb05..8bf30224 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -1,124 +1,124 @@ { - "@metadata": { - "authors": [ - "Fohanno", - "Fulup", - "Gwenn-Ael", - "Y-M D" - ] - }, - "index.newPad": "Pad nevez", - "index.createOpenPad": "pe kroui\u00f1\/digeri\u00f1 ur pad gant an anv :", - "pad.toolbar.bold.title": "Tev (Ctrl-B)", - "pad.toolbar.italic.title": "Italek (Ctrl-I)", - "pad.toolbar.underline.title": "Islinenna\u00f1 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Barrennet", - "pad.toolbar.ol.title": "Roll urzhiet", - "pad.toolbar.ul.title": "Roll en dizurzh", - "pad.toolbar.indent.title": "Endanta\u00f1", - "pad.toolbar.unindent.title": "Diendanta\u00f1", - "pad.toolbar.undo.title": "Dizober (Ktrl-Z)", - "pad.toolbar.redo.title": "Adober (Ktrl-Y)", - "pad.toolbar.clearAuthorship.title": "Diverka\u00f1 al livio\u00f9 oc'h anaout an aozerien", - "pad.toolbar.import_export.title": "Enporzhia\u00f1\/Ezporzhia\u00f1 eus\/war-zu ur furmad restr dishe\u00f1vel", - "pad.toolbar.timeslider.title": "Istor dinamek", - "pad.toolbar.savedRevision.title": "Doareo\u00f9 enrollet", - "pad.toolbar.settings.title": "Arventenno\u00f9", - "pad.toolbar.embed.title": "Enframma\u00f1 ar pad-ma\u00f1", - "pad.toolbar.showusers.title": "Diskwelet implijerien ar Pad", - "pad.colorpicker.save": "Enrolla\u00f1", - "pad.colorpicker.cancel": "Nulla\u00f1", - "pad.loading": "O karga\u00f1...", - "pad.passwordRequired": "Ezhomm ho peus ur ger-tremen evit mont d'ar Pad-se", - "pad.permissionDenied": "\nN'oc'h ket aotreet da vont d'ar pad-ma\u00f1", - "pad.wrongPassword": "Fazius e oa ho ker-tremen", - "pad.settings.padSettings": "Arventenno\u00f9 Pad", - "pad.settings.myView": "Ma diskwel", - "pad.settings.stickychat": "Diskwel ar flap bepred", - "pad.settings.colorcheck": "Livio\u00f9 anaout", - "pad.settings.linenocheck": "Niverenno\u00f9 linenno\u00f9", - "pad.settings.rtlcheck": "Lenn an danvez a-zehou da gleiz ?", - "pad.settings.fontType": "Seurt font :", - "pad.settings.fontType.normal": "Reizh", - "pad.settings.fontType.monospaced": "Monospas", - "pad.settings.globalView": "Gwel dre vras", - "pad.settings.language": "Yezh :", - "pad.importExport.import_export": "Enporzhia\u00f1\/Ezporzhia\u00f1", - "pad.importExport.import": "Enkarga\u00f1 un destenn pe ur restr", - "pad.importExport.importSuccessful": "Deuet eo ganeoc'h !", - "pad.importExport.export": "Ezporzhia\u00f1 ar pad brema\u00f1 evel :", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Testenn blaen", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Ne c'hallit ket emporzjia\u00f1 furmado\u00f9 testenno\u00f9 kriz pe html. Evit arc'hwelio\u00f9 enporzhia\u00f1 emdroetoc'h, staliit abiword<\/a> mar plij.", - "pad.modals.connected": "Kevreet.", - "pad.modals.reconnecting": "Adkevrea\u00f1 war-zu ho pad...", - "pad.modals.forcereconnect": "Adkevrea\u00f1 dre heg", - "pad.modals.userdup": "Digor en ur prenestr all", - "pad.modals.userdup.explanation": "Digor eo ho pad, war a seblant, e meur a brenestr eus ho merdeer en urzhiataer-ma\u00f1.", - "pad.modals.userdup.advice": "Kevrea\u00f1 en ur implijout ar prenestr-ma\u00f1.", - "pad.modals.unauth": "N'eo ket aotreet", - "pad.modals.unauth.explanation": "Kemmet e vo hoc'h aotreo\u00f9 pa vo diskwelet ar bajenn.-ma\u00f1 Klaskit kevrea\u00f1 en-dro.", - "pad.modals.looping": "Digevreet.", - "pad.modals.looping.explanation": "Kudenno\u00f9 kehenti\u00f1 zo gant ar servijer sinkronelekaat.", - "pad.modals.looping.cause": "Posupl eo e vefe gwarezet ho kevreadur gant ur maltouter diembreget pe ur servijer proksi", - "pad.modals.initsocketfail": "Ne c'haller ket tizhout ar servijer.", - "pad.modals.initsocketfail.explanation": "Ne c'haller ket kevrea\u00f1 ouzh ar servijer sinkronelaat.", - "pad.modals.initsocketfail.cause": "Gallout a ra ar gudenn dont eus ho merdeer Web pe eus ho kevreadur Internet.", - "pad.modals.slowcommit": "Digevreet.", - "pad.modals.slowcommit.explanation": "Ne respont ket ar serveur.", - "pad.modals.slowcommit.cause": "Gallout a ra dont diwar kudenno\u00f9 kevrea\u00f1 gant ar rouedad.", - "pad.modals.deleted": "Dilamet.", - "pad.modals.deleted.explanation": "Lamet eo bet ar pad-ma\u00f1.", - "pad.modals.disconnected": "Digevreet oc'h bet.", - "pad.modals.disconnected.explanation": "Kollet eo bet ar c'hevreadur gant ar servijer", - "pad.modals.disconnected.cause": "Dizimplijadus eo ar servijer marteze. Kelaouit ac'hanomp ma pad ar gudenn.", - "pad.share": "Ranna\u00f1 ar pad-ma\u00f1.", - "pad.share.readonly": "Lenn hepken", - "pad.share.link": "Liamm", - "pad.share.emebdcode": "Enframma\u00f1 an URL", - "pad.chat": "Flap", - "pad.chat.title": "Digeri\u00f1 ar flap kevelet gant ar pad-ma\u00f1.", - "pad.chat.loadmessages": "Karga\u00f1 muioc'h a gemennadenno\u00f9", - "timeslider.pageTitle": "Istor dinamek eus {{appTitle}}", - "timeslider.toolbar.returnbutton": "Distrei\u00f1 d'ar pad-ma\u00f1.", - "timeslider.toolbar.authors": "Aozerien :", - "timeslider.toolbar.authorsList": "Aozer ebet", - "timeslider.toolbar.exportlink.title": "Ezporzhia\u00f1", - "timeslider.exportCurrent": "Ezporzhia\u00f1 an doare brema\u00f1 evel :", - "timeslider.version": "Stumm {{version}}", - "timeslider.saved": "Enrolla\u00f1 {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Genver", - "timeslider.month.february": "C'hwevrer", - "timeslider.month.march": "Meurzh", - "timeslider.month.april": "Ebrel", - "timeslider.month.may": "Mae", - "timeslider.month.june": "Mezheven", - "timeslider.month.july": "Gouere", - "timeslider.month.august": "Eost", - "timeslider.month.september": "Gwengolo", - "timeslider.month.october": "Here", - "timeslider.month.november": "Du", - "timeslider.month.december": "Kerzu", - "timeslider.unnamedauthor": "{{niver}} aozer dianav", - "timeslider.unnamedauthors": "Aozerien dianav", - "pad.savedrevs.marked": "Merket eo an adweladenn-ma\u00f1 evel adweladenn gwiriet", - "pad.userlist.entername": "Ebarzhit hoc'h anv", - "pad.userlist.unnamed": "dizanv", - "pad.userlist.guest": "Den pedet", - "pad.userlist.deny": "Nac'h", - "pad.userlist.approve": "Aproui\u00f1", - "pad.editbar.clearcolors": "Diverka\u00f1 al livio\u00f9 stag ouzh an aozerien en teul a-bezh ?", - "pad.impexp.importbutton": "Enporzhia\u00f1 brema\u00f1", - "pad.impexp.importing": "Oc'h enporzhia\u00f1...", - "pad.impexp.confirmimport": "Ma vez enporzhiet ur restr e vo diverket ar pezh zo en teul a-vrema\u00f1. Ha sur oc'h e fell deoc'h mont betek penn ?", - "pad.impexp.convertFailed": "N'eus ket bet gallet enporzhia\u00f1 ar restr. Ober gant ur furmad teul all pe eila\u00f1\/pega\u00f1 gant an dorn.", - "pad.impexp.uploadFailed": "C'hwitet eo bet an enporzhia\u00f1. Klaskit en-dro.", - "pad.impexp.importfailed": "C'hwitet eo an enporzhiadenn", - "pad.impexp.copypaste": "Eilit\/pegit, mar plij", - "pad.impexp.exportdisabled": "Diweredekaet eo ezporzhia\u00f1 d'ar furmad {{type}}. Kit e darempred gant merour ar reizhiad evit gouzout hiroc'h." + "@metadata": { + "authors": [ + "Fohanno", + "Fulup", + "Gwenn-Ael", + "Y-M D" + ] + }, + "index.newPad": "Pad nevez", + "index.createOpenPad": "pe kroui\u00f1/digeri\u00f1 ur pad gant an anv :", + "pad.toolbar.bold.title": "Tev (Ctrl-B)", + "pad.toolbar.italic.title": "Italek (Ctrl-I)", + "pad.toolbar.underline.title": "Islinenna\u00f1 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Barrennet", + "pad.toolbar.ol.title": "Roll urzhiet", + "pad.toolbar.ul.title": "Roll en dizurzh", + "pad.toolbar.indent.title": "Endanta\u00f1", + "pad.toolbar.unindent.title": "Diendanta\u00f1", + "pad.toolbar.undo.title": "Dizober (Ktrl-Z)", + "pad.toolbar.redo.title": "Adober (Ktrl-Y)", + "pad.toolbar.clearAuthorship.title": "Diverka\u00f1 al livio\u00f9 oc'h anaout an aozerien", + "pad.toolbar.import_export.title": "Enporzhia\u00f1/Ezporzhia\u00f1 eus/war-zu ur furmad restr dishe\u00f1vel", + "pad.toolbar.timeslider.title": "Istor dinamek", + "pad.toolbar.savedRevision.title": "Doareo\u00f9 enrollet", + "pad.toolbar.settings.title": "Arventenno\u00f9", + "pad.toolbar.embed.title": "Enframma\u00f1 ar pad-ma\u00f1", + "pad.toolbar.showusers.title": "Diskwelet implijerien ar Pad", + "pad.colorpicker.save": "Enrolla\u00f1", + "pad.colorpicker.cancel": "Nulla\u00f1", + "pad.loading": "O karga\u00f1...", + "pad.passwordRequired": "Ezhomm ho peus ur ger-tremen evit mont d'ar Pad-se", + "pad.permissionDenied": "\nN'oc'h ket aotreet da vont d'ar pad-ma\u00f1", + "pad.wrongPassword": "Fazius e oa ho ker-tremen", + "pad.settings.padSettings": "Arventenno\u00f9 Pad", + "pad.settings.myView": "Ma diskwel", + "pad.settings.stickychat": "Diskwel ar flap bepred", + "pad.settings.colorcheck": "Livio\u00f9 anaout", + "pad.settings.linenocheck": "Niverenno\u00f9 linenno\u00f9", + "pad.settings.rtlcheck": "Lenn an danvez a-zehou da gleiz ?", + "pad.settings.fontType": "Seurt font :", + "pad.settings.fontType.normal": "Reizh", + "pad.settings.fontType.monospaced": "Monospas", + "pad.settings.globalView": "Gwel dre vras", + "pad.settings.language": "Yezh :", + "pad.importExport.import_export": "Enporzhia\u00f1/Ezporzhia\u00f1", + "pad.importExport.import": "Enkarga\u00f1 un destenn pe ur restr", + "pad.importExport.importSuccessful": "Deuet eo ganeoc'h !", + "pad.importExport.export": "Ezporzhia\u00f1 ar pad brema\u00f1 evel :", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Testenn blaen", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Ne c'hallit ket emporzjia\u00f1 furmado\u00f9 testenno\u00f9 kriz pe html. Evit arc'hwelio\u00f9 enporzhia\u00f1 emdroetoc'h, staliit \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eabiword\u003C/a\u003E mar plij.", + "pad.modals.connected": "Kevreet.", + "pad.modals.reconnecting": "Adkevrea\u00f1 war-zu ho pad...", + "pad.modals.forcereconnect": "Adkevrea\u00f1 dre heg", + "pad.modals.userdup": "Digor en ur prenestr all", + "pad.modals.userdup.explanation": "Digor eo ho pad, war a seblant, e meur a brenestr eus ho merdeer en urzhiataer-ma\u00f1.", + "pad.modals.userdup.advice": "Kevrea\u00f1 en ur implijout ar prenestr-ma\u00f1.", + "pad.modals.unauth": "N'eo ket aotreet", + "pad.modals.unauth.explanation": "Kemmet e vo hoc'h aotreo\u00f9 pa vo diskwelet ar bajenn.-ma\u00f1 Klaskit kevrea\u00f1 en-dro.", + "pad.modals.looping": "Digevreet.", + "pad.modals.looping.explanation": "Kudenno\u00f9 kehenti\u00f1 zo gant ar servijer sinkronelekaat.", + "pad.modals.looping.cause": "Posupl eo e vefe gwarezet ho kevreadur gant ur maltouter diembreget pe ur servijer proksi", + "pad.modals.initsocketfail": "Ne c'haller ket tizhout ar servijer.", + "pad.modals.initsocketfail.explanation": "Ne c'haller ket kevrea\u00f1 ouzh ar servijer sinkronelaat.", + "pad.modals.initsocketfail.cause": "Gallout a ra ar gudenn dont eus ho merdeer Web pe eus ho kevreadur Internet.", + "pad.modals.slowcommit": "Digevreet.", + "pad.modals.slowcommit.explanation": "Ne respont ket ar serveur.", + "pad.modals.slowcommit.cause": "Gallout a ra dont diwar kudenno\u00f9 kevrea\u00f1 gant ar rouedad.", + "pad.modals.deleted": "Dilamet.", + "pad.modals.deleted.explanation": "Lamet eo bet ar pad-ma\u00f1.", + "pad.modals.disconnected": "Digevreet oc'h bet.", + "pad.modals.disconnected.explanation": "Kollet eo bet ar c'hevreadur gant ar servijer", + "pad.modals.disconnected.cause": "Dizimplijadus eo ar servijer marteze. Kelaouit ac'hanomp ma pad ar gudenn.", + "pad.share": "Ranna\u00f1 ar pad-ma\u00f1.", + "pad.share.readonly": "Lenn hepken", + "pad.share.link": "Liamm", + "pad.share.emebdcode": "Enframma\u00f1 an URL", + "pad.chat": "Flap", + "pad.chat.title": "Digeri\u00f1 ar flap kevelet gant ar pad-ma\u00f1.", + "pad.chat.loadmessages": "Karga\u00f1 muioc'h a gemennadenno\u00f9", + "timeslider.pageTitle": "Istor dinamek eus {{appTitle}}", + "timeslider.toolbar.returnbutton": "Distrei\u00f1 d'ar pad-ma\u00f1.", + "timeslider.toolbar.authors": "Aozerien :", + "timeslider.toolbar.authorsList": "Aozer ebet", + "timeslider.toolbar.exportlink.title": "Ezporzhia\u00f1", + "timeslider.exportCurrent": "Ezporzhia\u00f1 an doare brema\u00f1 evel :", + "timeslider.version": "Stumm {{version}}", + "timeslider.saved": "Enrolla\u00f1 {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Genver", + "timeslider.month.february": "C'hwevrer", + "timeslider.month.march": "Meurzh", + "timeslider.month.april": "Ebrel", + "timeslider.month.may": "Mae", + "timeslider.month.june": "Mezheven", + "timeslider.month.july": "Gouere", + "timeslider.month.august": "Eost", + "timeslider.month.september": "Gwengolo", + "timeslider.month.october": "Here", + "timeslider.month.november": "Du", + "timeslider.month.december": "Kerzu", + "timeslider.unnamedauthor": "{{niver}} aozer dianav", + "timeslider.unnamedauthors": "Aozerien dianav", + "pad.savedrevs.marked": "Merket eo an adweladenn-ma\u00f1 evel adweladenn gwiriet", + "pad.userlist.entername": "Ebarzhit hoc'h anv", + "pad.userlist.unnamed": "dizanv", + "pad.userlist.guest": "Den pedet", + "pad.userlist.deny": "Nac'h", + "pad.userlist.approve": "Aproui\u00f1", + "pad.editbar.clearcolors": "Diverka\u00f1 al livio\u00f9 stag ouzh an aozerien en teul a-bezh ?", + "pad.impexp.importbutton": "Enporzhia\u00f1 brema\u00f1", + "pad.impexp.importing": "Oc'h enporzhia\u00f1...", + "pad.impexp.confirmimport": "Ma vez enporzhiet ur restr e vo diverket ar pezh zo en teul a-vrema\u00f1. Ha sur oc'h e fell deoc'h mont betek penn ?", + "pad.impexp.convertFailed": "N'eus ket bet gallet enporzhia\u00f1 ar restr. Ober gant ur furmad teul all pe eila\u00f1/pega\u00f1 gant an dorn.", + "pad.impexp.uploadFailed": "C'hwitet eo bet an enporzhia\u00f1. Klaskit en-dro.", + "pad.impexp.importfailed": "C'hwitet eo an enporzhiadenn", + "pad.impexp.copypaste": "Eilit/pegit, mar plij", + "pad.impexp.exportdisabled": "Diweredekaet eo ezporzhia\u00f1 d'ar furmad {{type}}. Kit e darempred gant merour ar reizhiad evit gouzout hiroc'h." } \ No newline at end of file diff --git a/src/locales/ca.json b/src/locales/ca.json index e736fd3c..17a02208 100644 --- a/src/locales/ca.json +++ b/src/locales/ca.json @@ -1,90 +1,123 @@ { - "@metadata": { - "authors": [ - "Pginer", - "Pitort", - "Toniher" - ] - }, - "pad.toolbar.bold.title": "Negreta (Ctrl-B)", - "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Subratllat (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Ratllat", - "pad.toolbar.ol.title": "Llista ordenada", - "pad.toolbar.ul.title": "Llista sense ordenar", - "pad.toolbar.indent.title": "Sagnat", - "pad.toolbar.unindent.title": "Sagnat invers", - "pad.toolbar.undo.title": "Desf\u00e9s (Ctrl-Z)", - "pad.toolbar.redo.title": "Ref\u00e9s (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Neteja els colors d'autoria", - "pad.toolbar.savedRevision.title": "Desa la revisi\u00f3", - "pad.toolbar.settings.title": "Configuraci\u00f3", - "pad.toolbar.showusers.title": "Mostra els usuaris d\u2019aquest pad", - "pad.colorpicker.save": "Desa", - "pad.colorpicker.cancel": "Cancel\u00b7la", - "pad.loading": "S'est\u00e0 carregant...", - "pad.wrongPassword": "La contrasenya \u00e9s incorrecta", - "pad.settings.myView": "La meva vista", - "pad.settings.stickychat": "Xateja sempre a la pantalla", - "pad.settings.colorcheck": "Colors d'autoria", - "pad.settings.linenocheck": "N\u00fameros de l\u00ednia", - "pad.settings.rtlcheck": "Llegir el contingut de dreta a esquerra?", - "pad.settings.fontType": "Tipus de lletra:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "D'amplada fixa", - "pad.settings.globalView": "Vista global", - "pad.settings.language": "Llengua:", - "pad.importExport.import_export": "Importaci\u00f3\/exportaci\u00f3", - "pad.importExport.import": "Puja qualsevol fitxer de text o document", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Text net", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "Connectat.", - "pad.modals.forcereconnect": "For\u00e7a tornar a connectar", - "pad.modals.unauth": "No autoritzat", - "pad.modals.unauth.explanation": "Els vostres permisos han canviat mentre es visualitzava la p\u00e0gina. Proveu de reconnectar-vos.", - "pad.modals.looping": "Desconnectat.", - "pad.modals.initsocketfail": "El servidor no \u00e9s accessible.", - "pad.modals.initsocketfail.explanation": "No s'ha pogut connectar amb el servidor de sincronitzaci\u00f3.", - "pad.modals.slowcommit": "Desconnectat.", - "pad.modals.slowcommit.explanation": "El servidor no respon.", - "pad.modals.deleted": "Suprimit.", - "pad.modals.disconnected": "Heu estat desconnectat.", - "pad.modals.disconnected.cause": "El servidor sembla que no est\u00e0 disponible. Notifiqueu-nos si continua passant.", - "pad.share.readonly": "Nom\u00e9s de lectura", - "pad.share.link": "Enlla\u00e7", - "pad.chat": "Xat", - "timeslider.toolbar.authors": "Autors:", - "timeslider.toolbar.authorsList": "No hi ha autors", - "timeslider.toolbar.exportlink.title": "Exporta", - "timeslider.exportCurrent": "Exporta la versi\u00f3 actual com a:", - "timeslider.version": "Versi\u00f3 {{version}}", - "timeslider.saved": "Desat {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Gener", - "timeslider.month.february": "Febrer", - "timeslider.month.march": "Mar\u00e7", - "timeslider.month.april": "Abril", - "timeslider.month.may": "Maig", - "timeslider.month.june": "Juny", - "timeslider.month.july": "Juliol", - "timeslider.month.august": "Agost", - "timeslider.month.september": "Setembre", - "timeslider.month.october": "Octubre", - "timeslider.month.november": "Novembre", - "timeslider.month.december": "Desembre", - "pad.userlist.entername": "Introdu\u00efu el vostre nom", - "pad.userlist.unnamed": "sense nom", - "pad.userlist.guest": "Convidat", - "pad.userlist.deny": "Refusa", - "pad.userlist.approve": "Aprova", - "pad.editbar.clearcolors": "Voleu netejar els colors d'autor del document sencer?", - "pad.impexp.importbutton": "Importa ara", - "pad.impexp.importing": "Important...", - "pad.impexp.convertFailed": "No \u00e9s possible d'importar aquest fitxer. Si us plau, podeu provar d'utilitzar un format diferent o copiar i enganxar manualment.", - "pad.impexp.uploadFailed": "Ha fallat la c\u00e0rrega. Torneu-ho a provar", - "pad.impexp.importfailed": "Ha fallat la importaci\u00f3", - "pad.impexp.copypaste": "Si us plau, copieu i enganxeu" + "@metadata": { + "authors": [ + "Pginer", + "Pitort", + "Toniher" + ] + }, + "index.newPad": "Nou pad", + "index.createOpenPad": "o crea/obre un pad amb el nom:", + "pad.toolbar.bold.title": "Negreta (Ctrl-B)", + "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", + "pad.toolbar.underline.title": "Subratllat (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Ratllat", + "pad.toolbar.ol.title": "Llista ordenada", + "pad.toolbar.ul.title": "Llista sense ordenar", + "pad.toolbar.indent.title": "Sagnat", + "pad.toolbar.unindent.title": "Sagnat invers", + "pad.toolbar.undo.title": "Desf\u00e9s (Ctrl-Z)", + "pad.toolbar.redo.title": "Ref\u00e9s (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Neteja els colors d'autoria", + "pad.toolbar.import_export.title": "Importa/exporta a partir de diferents formats de fitxer", + "pad.toolbar.timeslider.title": "L\u00ednia temporal", + "pad.toolbar.savedRevision.title": "Desa la revisi\u00f3", + "pad.toolbar.settings.title": "Configuraci\u00f3", + "pad.toolbar.embed.title": "Incrusta aquest pad", + "pad.toolbar.showusers.title": "Mostra els usuaris d\u2019aquest pad", + "pad.colorpicker.save": "Desa", + "pad.colorpicker.cancel": "Cancel\u00b7la", + "pad.loading": "S'est\u00e0 carregant...", + "pad.passwordRequired": "Us cal una contrasenya per a accedir a aquest pad", + "pad.permissionDenied": "No teniu permisos per a accedir a aquest pad", + "pad.wrongPassword": "La contrasenya \u00e9s incorrecta", + "pad.settings.padSettings": "Par\u00e0metres del pad", + "pad.settings.myView": "La meva vista", + "pad.settings.stickychat": "Xateja sempre a la pantalla", + "pad.settings.colorcheck": "Colors d'autoria", + "pad.settings.linenocheck": "N\u00fameros de l\u00ednia", + "pad.settings.rtlcheck": "Llegir el contingut de dreta a esquerra?", + "pad.settings.fontType": "Tipus de lletra:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "D'amplada fixa", + "pad.settings.globalView": "Vista global", + "pad.settings.language": "Llengua:", + "pad.importExport.import_export": "Importaci\u00f3/exportaci\u00f3", + "pad.importExport.import": "Puja qualsevol fitxer de text o document", + "pad.importExport.importSuccessful": "Hi ha hagut \u00e8xit!", + "pad.importExport.export": "Exporta el pad actual com a:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Text net", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Nom\u00e9s podeu importar de text net o html. Per a opcions d'importaci\u00f3 m\u00e9s avan\u00e7ades \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstal\u00b7leu l'Abiword\u003C/a\u003E.", + "pad.modals.connected": "Connectat.", + "pad.modals.reconnecting": "S'est\u00e0 tornant a connectar al vostre pad\u2026", + "pad.modals.forcereconnect": "For\u00e7a tornar a connectar", + "pad.modals.userdup": "Obert en una altra finestra", + "pad.modals.userdup.explanation": "Aquest pad sembla que est\u00e0 obert en m\u00e9s d'una finestra de navegador de l'ordinador.", + "pad.modals.userdup.advice": "Torneu a connectar-vos per a utilitzar aquesta finestra.", + "pad.modals.unauth": "No autoritzat", + "pad.modals.unauth.explanation": "Els vostres permisos han canviat mentre es visualitzava la p\u00e0gina. Proveu de reconnectar-vos.", + "pad.modals.looping": "Desconnectat.", + "pad.modals.looping.explanation": "Hi ha problemes de comunicaci\u00f3 amb el servidor de sincronitzaci\u00f3.", + "pad.modals.looping.cause": "Potser us heu connectat a trav\u00e9s d'un tallafocs o servidor intermediari incompatible.", + "pad.modals.initsocketfail": "El servidor no \u00e9s accessible.", + "pad.modals.initsocketfail.explanation": "No s'ha pogut connectar amb el servidor de sincronitzaci\u00f3.", + "pad.modals.initsocketfail.cause": "Aix\u00f2 \u00e9s probablement a causa d'un problema amb el navegador o la connexi\u00f3 a Internet.", + "pad.modals.slowcommit": "Desconnectat.", + "pad.modals.slowcommit.explanation": "El servidor no respon.", + "pad.modals.slowcommit.cause": "Aix\u00f2 podria ser a causa de problemes amb la connectivitat de la xarxa.", + "pad.modals.deleted": "Suprimit.", + "pad.modals.deleted.explanation": "S'ha suprimit el pad.", + "pad.modals.disconnected": "Heu estat desconnectat.", + "pad.modals.disconnected.explanation": "S'ha perdut la connexi\u00f3 amb el servidor", + "pad.modals.disconnected.cause": "El servidor sembla que no est\u00e0 disponible. Notifiqueu-nos si continua passant.", + "pad.share": "Comparteix el pad", + "pad.share.readonly": "Nom\u00e9s de lectura", + "pad.share.link": "Enlla\u00e7", + "pad.share.emebdcode": "Incrusta l'URL", + "pad.chat": "Xat", + "pad.chat.title": "Obre el xat d'aquest pad.", + "pad.chat.loadmessages": "Carrega m\u00e9s missatges", + "timeslider.pageTitle": "L\u00ednia temporal \u2014 {{appTitle}}", + "timeslider.toolbar.returnbutton": "Torna al pad", + "timeslider.toolbar.authors": "Autors:", + "timeslider.toolbar.authorsList": "No hi ha autors", + "timeslider.toolbar.exportlink.title": "Exporta", + "timeslider.exportCurrent": "Exporta la versi\u00f3 actual com a:", + "timeslider.version": "Versi\u00f3 {{version}}", + "timeslider.saved": "Desat {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Gener", + "timeslider.month.february": "Febrer", + "timeslider.month.march": "Mar\u00e7", + "timeslider.month.april": "Abril", + "timeslider.month.may": "Maig", + "timeslider.month.june": "Juny", + "timeslider.month.july": "Juliol", + "timeslider.month.august": "Agost", + "timeslider.month.september": "Setembre", + "timeslider.month.october": "Octubre", + "timeslider.month.november": "Novembre", + "timeslider.month.december": "Desembre", + "timeslider.unnamedauthor": "{{num}} autor sense nom", + "timeslider.unnamedauthors": "{{num}} autors sense noms", + "pad.savedrevs.marked": "Aquesta revisi\u00f3 est\u00e0 marcada ara com a revisi\u00f3 desada", + "pad.userlist.entername": "Introdu\u00efu el vostre nom", + "pad.userlist.unnamed": "sense nom", + "pad.userlist.guest": "Convidat", + "pad.userlist.deny": "Refusa", + "pad.userlist.approve": "Aprova", + "pad.editbar.clearcolors": "Voleu netejar els colors d'autor del document sencer?", + "pad.impexp.importbutton": "Importa ara", + "pad.impexp.importing": "Important...", + "pad.impexp.confirmimport": "En importar un fitxer se sobreescriur\u00e0 el text actual del pad. Esteu segur que voleu continuar?", + "pad.impexp.convertFailed": "No \u00e9s possible d'importar aquest fitxer. Si us plau, podeu provar d'utilitzar un format diferent o copiar i enganxar manualment.", + "pad.impexp.uploadFailed": "Ha fallat la c\u00e0rrega. Torneu-ho a provar", + "pad.impexp.importfailed": "Ha fallat la importaci\u00f3", + "pad.impexp.copypaste": "Si us plau, copieu i enganxeu", + "pad.impexp.exportdisabled": "Est\u00e0 inhabilitada l'exportaci\u00f3 com a {{type}}. Contacteu amb el vostre administrador de sistemes per a m\u00e9s informaci\u00f3." } \ No newline at end of file diff --git a/src/locales/cs.json b/src/locales/cs.json index bf415f23..905ccf36 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -1,99 +1,99 @@ { - "@metadata": { - "authors": [ - "Quinn" - ] - }, - "index.newPad": "Nov\u00fd Pad", - "index.createOpenPad": "nebo vytvo\u0159it\/otev\u0159\u00edt Pad jm\u00e9nem:", - "pad.toolbar.bold.title": "Tu\u010dn\u00e9 (Ctrl-B)", - "pad.toolbar.italic.title": "Kurz\u00edva (Ctrl-I)", - "pad.toolbar.underline.title": "Podtr\u017een\u00ed (Ctrl-U)", - "pad.toolbar.strikethrough.title": "P\u0159eskrtnut\u00e9", - "pad.toolbar.ol.title": "\u010c\u00edslovan\u00fd seznam", - "pad.toolbar.ul.title": "Ne\u010d\u00edslovan\u00fd seznam", - "pad.toolbar.indent.title": "Odsazen\u00ed", - "pad.toolbar.unindent.title": "P\u0159edsazen\u00ed", - "pad.toolbar.undo.title": "Zp\u011bt (Ctrl-Z)", - "pad.toolbar.redo.title": "Opakovat (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Vymazat barvy autorstv\u00ed", - "pad.toolbar.import_export.title": "Importovat\/Exportovat z\/do jin\u00fdch form\u00e1t\u016f", - "pad.toolbar.timeslider.title": "Osa \u010dasu", - "pad.toolbar.savedRevision.title": "Ulo\u017een\u00e9 revize", - "pad.toolbar.settings.title": "Nastaven\u00ed", - "pad.toolbar.embed.title": "Um\u00edstit tento Pad", - "pad.toolbar.showusers.title": "Zobrazit u\u017eivatele u tohoto Padu", - "pad.colorpicker.save": "Ulo\u017eit", - "pad.colorpicker.cancel": "Zru\u0161it", - "pad.loading": "Na\u010d\u00edt\u00e1n\u00ed...", - "pad.passwordRequired": "Pot\u0159ebuje\u0161 zadat heslo pro p\u0159\u00edstup k tomuto Padu", - "pad.permissionDenied": "Nem\u00e1\u0161 p\u0159\u00edstupov\u00e9 opr\u00e1vn\u011bn\u00ed k tomuto Padu", - "pad.wrongPassword": "Tv\u00e9 heslo je \u0161patn\u00e9", - "pad.settings.padSettings": "Nastaven\u00ed Padu", - "pad.settings.myView": "Vlastn\u00ed pohled", - "pad.settings.stickychat": "Chat v\u017edy na obrazovce", - "pad.settings.colorcheck": "Barvy autorstv\u00ed", - "pad.settings.linenocheck": "\u010c\u00edsla \u0159\u00e1dk\u016f", - "pad.settings.fontType": "Typ p\u00edsma:", - "pad.settings.fontType.normal": "Norm\u00e1ln\u00ed", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Glob\u00e1ln\u00ed pohled", - "pad.settings.language": "Jazyk:", - "pad.importExport.import_export": "Import\/Export", - "pad.importExport.import": "Nahr\u00e1t libovoln\u00fd textov\u00fd soubor nebo dokument", - "pad.importExport.export": "Exportovat st\u00e1vaj\u00edc\u00ed Pad jako:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Prost\u00fd text", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Importovat m\u016f\u017ee\u0161 pouze prost\u00fd text nebo HTML form\u00e1tov\u00e1n\u00ed. Pro pokro\u010dilej\u0161\u00ed funkce importu, pros\u00edm, nainstaluj \u201eabiword<\/a>\u201c.", - "pad.modals.connected": "P\u0159ipojeno.", - "pad.modals.reconnecting": "Znovup\u0159ipojov\u00e1n\u00ed k tv\u00e9mu Padu\u2026", - "pad.modals.forcereconnect": "Vynutit znovup\u0159ipojen\u00ed", - "pad.modals.userdup.explanation": "Zd\u00e1 se, \u017ee tento Pad je na tomto po\u010d\u00edta\u010di otev\u0159en ve v\u00edce ne\u017e jednom okn\u011b.", - "pad.modals.userdup.advice": "Pro pou\u017eit\u00ed tohoto okna se mus\u00ed\u0161 znovu p\u0159ipojit.", - "pad.modals.unauth": "Nem\u00e1te autorizaci", - "pad.modals.unauth.explanation": "Va\u0161e opr\u00e1vn\u011bn\u00ed se zm\u011bnila, zat\u00edmco jste si prohl\u00ed\u017eel\/a toto okno. Zkuste se znovu p\u0159ipojit.", - "pad.modals.looping": "Odpojeno.", - "pad.modals.looping.explanation": "Nastaly probl\u00e9my p\u0159i komunikaci se synchroniza\u010dn\u00edm serverem.", - "pad.modals.looping.cause": "Mo\u017en\u00e1 jste p\u0159ipojeni p\u0159es nekompaktn\u00ed firewall nebo proxy.", - "pad.modals.initsocketfail": "Server je nedostupn\u00fd.", - "pad.modals.initsocketfail.explanation": "Nepoda\u0159ilo se p\u0159ipojit k synchroniza\u010dn\u00edmu serveru.", - "pad.modals.initsocketfail.cause": "Toto je pravd\u011bpodobn\u011b zp\u016fsobeno va\u0161\u00edm prohl\u00ed\u017ee\u010dem nebo p\u0159ipojen\u00edm k internetu.", - "pad.modals.slowcommit": "Odpojeno.", - "pad.modals.slowcommit.explanation": "Server neodpov\u00edd\u00e1.", - "pad.modals.slowcommit.cause": "M\u016f\u017ee to b\u00fdt zp\u016fsobeno probl\u00e9my s internetov\u00fdm p\u0159ipojen\u00edm.", - "pad.modals.deleted": "Odstran\u011bno.", - "pad.modals.deleted.explanation": "Tento Pad byl odebr\u00e1n.", - "pad.modals.disconnected": "Byl jsi odpojen.", - "pad.modals.disconnected.explanation": "P\u0159ipojen\u00ed k serveru bylo p\u0159eru\u0161eno", - "pad.modals.disconnected.cause": "Server m\u016f\u017ee b\u00fdt nedostupn\u00fd. Pros\u00edm, upozorni n\u00e1s, pokud bude tento probl\u00e9m p\u0159etrv\u00e1vat.", - "pad.share": "Sd\u00edlet tento Pad", - "pad.share.readonly": "Jen pro \u010dten\u00ed", - "pad.share.link": "Odkaz", - "pad.share.emebdcode": "Vlo\u017eit URL", - "pad.chat": "Chat", - "pad.chat.title": "Otev\u0159\u00edt chat tohoto Padu.", - "timeslider.pageTitle": "Osa \u010dasu {{appTitle}}", - "timeslider.toolbar.returnbutton": "N\u00e1vrat do Padu", - "timeslider.toolbar.authors": "Auto\u0159i:", - "timeslider.toolbar.authorsList": "Bez autor\u016f", - "timeslider.exportCurrent": "Exportovat nyn\u011bj\u0161\u00ed verzi jako:", - "timeslider.version": "Verze {{version}}", - "timeslider.saved": "Ulo\u017eeno {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "leden", - "timeslider.month.february": "\u00fanor", - "timeslider.month.march": "b\u0159ezen", - "timeslider.month.april": "duben", - "timeslider.month.may": "kv\u011bten", - "timeslider.month.june": "\u010derven", - "timeslider.month.july": "\u010dervenec", - "timeslider.month.august": "srpen", - "timeslider.month.september": "z\u00e1\u0159\u00ed", - "timeslider.month.october": "\u0159\u00edjen", - "timeslider.month.november": "listopad", - "timeslider.month.december": "prosinec" + "@metadata": { + "authors": [ + "Quinn" + ] + }, + "index.newPad": "Nov\u00fd Pad", + "index.createOpenPad": "nebo vytvo\u0159it/otev\u0159\u00edt Pad jm\u00e9nem:", + "pad.toolbar.bold.title": "Tu\u010dn\u00e9 (Ctrl-B)", + "pad.toolbar.italic.title": "Kurz\u00edva (Ctrl-I)", + "pad.toolbar.underline.title": "Podtr\u017een\u00ed (Ctrl-U)", + "pad.toolbar.strikethrough.title": "P\u0159eskrtnut\u00e9", + "pad.toolbar.ol.title": "\u010c\u00edslovan\u00fd seznam", + "pad.toolbar.ul.title": "Ne\u010d\u00edslovan\u00fd seznam", + "pad.toolbar.indent.title": "Odsazen\u00ed", + "pad.toolbar.unindent.title": "P\u0159edsazen\u00ed", + "pad.toolbar.undo.title": "Zp\u011bt (Ctrl-Z)", + "pad.toolbar.redo.title": "Opakovat (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Vymazat barvy autorstv\u00ed", + "pad.toolbar.import_export.title": "Importovat/Exportovat z/do jin\u00fdch form\u00e1t\u016f", + "pad.toolbar.timeslider.title": "Osa \u010dasu", + "pad.toolbar.savedRevision.title": "Ulo\u017een\u00e9 revize", + "pad.toolbar.settings.title": "Nastaven\u00ed", + "pad.toolbar.embed.title": "Um\u00edstit tento Pad", + "pad.toolbar.showusers.title": "Zobrazit u\u017eivatele u tohoto Padu", + "pad.colorpicker.save": "Ulo\u017eit", + "pad.colorpicker.cancel": "Zru\u0161it", + "pad.loading": "Na\u010d\u00edt\u00e1n\u00ed...", + "pad.passwordRequired": "Pot\u0159ebuje\u0161 zadat heslo pro p\u0159\u00edstup k tomuto Padu", + "pad.permissionDenied": "Nem\u00e1\u0161 p\u0159\u00edstupov\u00e9 opr\u00e1vn\u011bn\u00ed k tomuto Padu", + "pad.wrongPassword": "Tv\u00e9 heslo je \u0161patn\u00e9", + "pad.settings.padSettings": "Nastaven\u00ed Padu", + "pad.settings.myView": "Vlastn\u00ed pohled", + "pad.settings.stickychat": "Chat v\u017edy na obrazovce", + "pad.settings.colorcheck": "Barvy autorstv\u00ed", + "pad.settings.linenocheck": "\u010c\u00edsla \u0159\u00e1dk\u016f", + "pad.settings.fontType": "Typ p\u00edsma:", + "pad.settings.fontType.normal": "Norm\u00e1ln\u00ed", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Glob\u00e1ln\u00ed pohled", + "pad.settings.language": "Jazyk:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Nahr\u00e1t libovoln\u00fd textov\u00fd soubor nebo dokument", + "pad.importExport.export": "Exportovat st\u00e1vaj\u00edc\u00ed Pad jako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Prost\u00fd text", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Importovat m\u016f\u017ee\u0161 pouze prost\u00fd text nebo HTML form\u00e1tov\u00e1n\u00ed. Pro pokro\u010dilej\u0161\u00ed funkce importu, pros\u00edm, nainstaluj \u201e\u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eabiword\u003C/a\u003E\u201c.", + "pad.modals.connected": "P\u0159ipojeno.", + "pad.modals.reconnecting": "Znovup\u0159ipojov\u00e1n\u00ed k tv\u00e9mu Padu\u2026", + "pad.modals.forcereconnect": "Vynutit znovup\u0159ipojen\u00ed", + "pad.modals.userdup.explanation": "Zd\u00e1 se, \u017ee tento Pad je na tomto po\u010d\u00edta\u010di otev\u0159en ve v\u00edce ne\u017e jednom okn\u011b.", + "pad.modals.userdup.advice": "Pro pou\u017eit\u00ed tohoto okna se mus\u00ed\u0161 znovu p\u0159ipojit.", + "pad.modals.unauth": "Nem\u00e1te autorizaci", + "pad.modals.unauth.explanation": "Va\u0161e opr\u00e1vn\u011bn\u00ed se zm\u011bnila, zat\u00edmco jste si prohl\u00ed\u017eel/a toto okno. Zkuste se znovu p\u0159ipojit.", + "pad.modals.looping": "Odpojeno.", + "pad.modals.looping.explanation": "Nastaly probl\u00e9my p\u0159i komunikaci se synchroniza\u010dn\u00edm serverem.", + "pad.modals.looping.cause": "Mo\u017en\u00e1 jste p\u0159ipojeni p\u0159es nekompaktn\u00ed firewall nebo proxy.", + "pad.modals.initsocketfail": "Server je nedostupn\u00fd.", + "pad.modals.initsocketfail.explanation": "Nepoda\u0159ilo se p\u0159ipojit k synchroniza\u010dn\u00edmu serveru.", + "pad.modals.initsocketfail.cause": "Toto je pravd\u011bpodobn\u011b zp\u016fsobeno va\u0161\u00edm prohl\u00ed\u017ee\u010dem nebo p\u0159ipojen\u00edm k internetu.", + "pad.modals.slowcommit": "Odpojeno.", + "pad.modals.slowcommit.explanation": "Server neodpov\u00edd\u00e1.", + "pad.modals.slowcommit.cause": "M\u016f\u017ee to b\u00fdt zp\u016fsobeno probl\u00e9my s internetov\u00fdm p\u0159ipojen\u00edm.", + "pad.modals.deleted": "Odstran\u011bno.", + "pad.modals.deleted.explanation": "Tento Pad byl odebr\u00e1n.", + "pad.modals.disconnected": "Byl jsi odpojen.", + "pad.modals.disconnected.explanation": "P\u0159ipojen\u00ed k serveru bylo p\u0159eru\u0161eno", + "pad.modals.disconnected.cause": "Server m\u016f\u017ee b\u00fdt nedostupn\u00fd. Pros\u00edm, upozorni n\u00e1s, pokud bude tento probl\u00e9m p\u0159etrv\u00e1vat.", + "pad.share": "Sd\u00edlet tento Pad", + "pad.share.readonly": "Jen pro \u010dten\u00ed", + "pad.share.link": "Odkaz", + "pad.share.emebdcode": "Vlo\u017eit URL", + "pad.chat": "Chat", + "pad.chat.title": "Otev\u0159\u00edt chat tohoto Padu.", + "timeslider.pageTitle": "Osa \u010dasu {{appTitle}}", + "timeslider.toolbar.returnbutton": "N\u00e1vrat do Padu", + "timeslider.toolbar.authors": "Auto\u0159i:", + "timeslider.toolbar.authorsList": "Bez autor\u016f", + "timeslider.exportCurrent": "Exportovat nyn\u011bj\u0161\u00ed verzi jako:", + "timeslider.version": "Verze {{version}}", + "timeslider.saved": "Ulo\u017eeno {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "leden", + "timeslider.month.february": "\u00fanor", + "timeslider.month.march": "b\u0159ezen", + "timeslider.month.april": "duben", + "timeslider.month.may": "kv\u011bten", + "timeslider.month.june": "\u010derven", + "timeslider.month.july": "\u010dervenec", + "timeslider.month.august": "srpen", + "timeslider.month.september": "z\u00e1\u0159\u00ed", + "timeslider.month.october": "\u0159\u00edjen", + "timeslider.month.november": "listopad", + "timeslider.month.december": "prosinec" } \ No newline at end of file diff --git a/src/locales/da.json b/src/locales/da.json index b0aef713..1e5c0614 100644 --- a/src/locales/da.json +++ b/src/locales/da.json @@ -1,123 +1,123 @@ { - "@metadata": { - "authors": { - "0": "Christian List", - "1": "Peter Alberti", - "3": "Steenth" - } - }, - "index.newPad": "Ny Pad", - "index.createOpenPad": "eller opret\/\u00e5bn en Pad med navnet:", - "pad.toolbar.bold.title": "Fed (Ctrl-B)", - "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", - "pad.toolbar.underline.title": "Understregning (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Gennemstregning", - "pad.toolbar.ol.title": "Sorteret liste", - "pad.toolbar.ul.title": "Usorteret liste", - "pad.toolbar.indent.title": "Indrykning", - "pad.toolbar.unindent.title": "Ryk ud", - "pad.toolbar.undo.title": "Fortryd (Ctrl-Z)", - "pad.toolbar.redo.title": "Annuller Fortryd (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Fjern farver for forfatterskab", - "pad.toolbar.import_export.title": "Import\/eksport fra\/til forskellige filformater", - "pad.toolbar.timeslider.title": "Timeslider", - "pad.toolbar.savedRevision.title": "Gem Revision", - "pad.toolbar.settings.title": "Indstillinger", - "pad.toolbar.embed.title": "Integrer denne pad", - "pad.toolbar.showusers.title": "Vis brugere p\u00e5 denne pad", - "pad.colorpicker.save": "Gem", - "pad.colorpicker.cancel": "Afbryd", - "pad.loading": "Indl\u00e6ser ...", - "pad.passwordRequired": "Du skal bruge en adgangskode for at f\u00e5 adgang til denne pad", - "pad.permissionDenied": "Du har ikke tilladelse til at f\u00e5 adgang til denne pad.", - "pad.wrongPassword": "Din adgangskode er forkert", - "pad.settings.padSettings": "Pad indstillinger", - "pad.settings.myView": "Min visning", - "pad.settings.stickychat": "Chat altid p\u00e5 sk\u00e6rmen", - "pad.settings.colorcheck": "Forfatterskabsfarver", - "pad.settings.linenocheck": "Linjenumre", - "pad.settings.rtlcheck": "L\u00e6se indhold fra h\u00f8jre mod venstre?", - "pad.settings.fontType": "Skrifttype:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Fastbredde", - "pad.settings.globalView": "Global visning", - "pad.settings.language": "Sprog:", - "pad.importExport.import_export": "Import\/Eksport", - "pad.importExport.import": "Uploade en tekstfil eller dokument", - "pad.importExport.importSuccessful": "Vellykket!", - "pad.importExport.export": "Eksporter aktuelle pad som:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Almindelig tekst", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan kun importere fra almindelig tekst eller HTML-formater. For mere avancerede importfunktioner, installer venligst abiword<\/a>.", - "pad.modals.connected": "Forbundet.", - "pad.modals.reconnecting": "Genopretter forbindelsen til din pad...", - "pad.modals.forcereconnect": "Gennemtving genoprettelse af forbindelsen", - "pad.modals.userdup": "\u00c5bnet i et andet vindue", - "pad.modals.userdup.explanation": "Denne pad synes at v\u00e6re \u00e5bnet i mere end \u00e9t browservindue p\u00e5 denne computer.", - "pad.modals.userdup.advice": "Tilslut igen for at bruge dette vindue i stedet.", - "pad.modals.unauth": "Ikke tilladt", - "pad.modals.unauth.explanation": "Dine rettigheder er \u00e6ndret mens du ser p\u00e5 denne side. Pr\u00f8v at oprette forbindelsen igen.", - "pad.modals.looping": "Forbindelse afbrudt.", - "pad.modals.looping.explanation": "Der er kommunikationsproblemer med synkroniseringsserveren.", - "pad.modals.looping.cause": "M\u00e5ske tilsluttede du via en inkompatibel firewall eller proxy.", - "pad.modals.initsocketfail": "Serveren er ikke tilg\u00e6ngelig.", - "pad.modals.initsocketfail.explanation": "Kunne ikke oprette forbindelse til synkroniseringsserveren.", - "pad.modals.initsocketfail.cause": "Det skyldes sandsynligvis et problem med din browser eller din internetforbindelse.", - "pad.modals.slowcommit": "Forbindelse afbrudt.", - "pad.modals.slowcommit.explanation": "Serveren svarer ikke.", - "pad.modals.slowcommit.cause": "Det kan skyldes problemer med netv\u00e6rksforbindelsen.", - "pad.modals.deleted": "Slettet.", - "pad.modals.deleted.explanation": "Denne pad er blevet fjernet.", - "pad.modals.disconnected": "Du har f\u00e5et afbrudt forbindelsen.", - "pad.modals.disconnected.explanation": "Forbindelsen til serveren blev afbrudt", - "pad.modals.disconnected.cause": "Serveren er muligvis ikke tilg\u00e6ngelig. G\u00f8r os venligst opm\u00e6rksom p\u00e5 hvis dette forts\u00e6tter med at ske.", - "pad.share": "Del denne pad", - "pad.share.readonly": "Skrivebeskyttet", - "pad.share.link": "Link", - "pad.share.emebdcode": "Integrerings URL", - "pad.chat": "Chat", - "pad.chat.title": "\u00c5ben chat for denne pad.", - "pad.chat.loadmessages": "Indl\u00e6s flere meddelelser", - "timeslider.pageTitle": "{{appTitle}} Timeslider", - "timeslider.toolbar.returnbutton": "Tilbage til pad", - "timeslider.toolbar.authors": "Forfattere:", - "timeslider.toolbar.authorsList": "Ingen forfattere", - "timeslider.toolbar.exportlink.title": "Eksport\u00e9r", - "timeslider.exportCurrent": "Eksporter aktuelle version som:", - "timeslider.version": "Version {{version}}", - "timeslider.saved": "Gemt den {{day}}.{{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "januar", - "timeslider.month.february": "februar", - "timeslider.month.march": "marts", - "timeslider.month.april": "april", - "timeslider.month.may": "maj", - "timeslider.month.june": "juni", - "timeslider.month.july": "juli", - "timeslider.month.august": "august", - "timeslider.month.september": "september", - "timeslider.month.october": "oktober", - "timeslider.month.november": "november", - "timeslider.month.december": "december", - "timeslider.unnamedauthor": "{{num}} unavngiven forfatter", - "timeslider.unnamedauthors": "{{num}} unavngivne forfattere", - "pad.savedrevs.marked": "Denne revision er nu markeret som en gemt revision", - "pad.userlist.entername": "Indtast dit navn", - "pad.userlist.unnamed": "ikke-navngivet", - "pad.userlist.guest": "G\u00e6st", - "pad.userlist.deny": "N\u00e6gt", - "pad.userlist.approve": "Godkend", - "pad.editbar.clearcolors": "Fjern farver for ophavsmand i hele dokumentet?", - "pad.impexp.importbutton": "Importer nu", - "pad.impexp.importing": "Importerer...", - "pad.impexp.confirmimport": "At importere en fil, vil overskrives den aktuelle pad tekst. Er du sikker p\u00e5 du vil forts\u00e6tte?", - "pad.impexp.convertFailed": "Vi var ikke i stand til at importere denne fil. Brug et andet dokument-format eller kopier og s\u00e6t ind manuelt", - "pad.impexp.uploadFailed": "Upload mislykkedes, pr\u00f8v igen", - "pad.impexp.importfailed": "Importen mislykkedes", - "pad.impexp.copypaste": "Venligst kopier og s\u00e6t ind", - "pad.impexp.exportdisabled": "Eksportere i {{type}} format er deaktiveret. Kontakt din systemadministrator for mere information." + "@metadata": { + "authors": { + "0": "Christian List", + "1": "Peter Alberti", + "3": "Steenth" + } + }, + "index.newPad": "Ny Pad", + "index.createOpenPad": "eller opret/\u00e5bn en Pad med navnet:", + "pad.toolbar.bold.title": "Fed (Ctrl-B)", + "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", + "pad.toolbar.underline.title": "Understregning (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Gennemstregning", + "pad.toolbar.ol.title": "Sorteret liste", + "pad.toolbar.ul.title": "Usorteret liste", + "pad.toolbar.indent.title": "Indrykning", + "pad.toolbar.unindent.title": "Ryk ud", + "pad.toolbar.undo.title": "Fortryd (Ctrl-Z)", + "pad.toolbar.redo.title": "Annuller Fortryd (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Fjern farver for forfatterskab", + "pad.toolbar.import_export.title": "Import/eksport fra/til forskellige filformater", + "pad.toolbar.timeslider.title": "Timeslider", + "pad.toolbar.savedRevision.title": "Gem Revision", + "pad.toolbar.settings.title": "Indstillinger", + "pad.toolbar.embed.title": "Integrer denne pad", + "pad.toolbar.showusers.title": "Vis brugere p\u00e5 denne pad", + "pad.colorpicker.save": "Gem", + "pad.colorpicker.cancel": "Afbryd", + "pad.loading": "Indl\u00e6ser ...", + "pad.passwordRequired": "Du skal bruge en adgangskode for at f\u00e5 adgang til denne pad", + "pad.permissionDenied": "Du har ikke tilladelse til at f\u00e5 adgang til denne pad.", + "pad.wrongPassword": "Din adgangskode er forkert", + "pad.settings.padSettings": "Pad indstillinger", + "pad.settings.myView": "Min visning", + "pad.settings.stickychat": "Chat altid p\u00e5 sk\u00e6rmen", + "pad.settings.colorcheck": "Forfatterskabsfarver", + "pad.settings.linenocheck": "Linjenumre", + "pad.settings.rtlcheck": "L\u00e6se indhold fra h\u00f8jre mod venstre?", + "pad.settings.fontType": "Skrifttype:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Fastbredde", + "pad.settings.globalView": "Global visning", + "pad.settings.language": "Sprog:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Uploade en tekstfil eller dokument", + "pad.importExport.importSuccessful": "Vellykket!", + "pad.importExport.export": "Eksporter aktuelle pad som:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Almindelig tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Du kan kun importere fra almindelig tekst eller HTML-formater. For mere avancerede importfunktioner, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstaller venligst abiword\u003C/a\u003E.", + "pad.modals.connected": "Forbundet.", + "pad.modals.reconnecting": "Genopretter forbindelsen til din pad...", + "pad.modals.forcereconnect": "Gennemtving genoprettelse af forbindelsen", + "pad.modals.userdup": "\u00c5bnet i et andet vindue", + "pad.modals.userdup.explanation": "Denne pad synes at v\u00e6re \u00e5bnet i mere end \u00e9t browservindue p\u00e5 denne computer.", + "pad.modals.userdup.advice": "Tilslut igen for at bruge dette vindue i stedet.", + "pad.modals.unauth": "Ikke tilladt", + "pad.modals.unauth.explanation": "Dine rettigheder er \u00e6ndret mens du ser p\u00e5 denne side. Pr\u00f8v at oprette forbindelsen igen.", + "pad.modals.looping": "Forbindelse afbrudt.", + "pad.modals.looping.explanation": "Der er kommunikationsproblemer med synkroniseringsserveren.", + "pad.modals.looping.cause": "M\u00e5ske tilsluttede du via en inkompatibel firewall eller proxy.", + "pad.modals.initsocketfail": "Serveren er ikke tilg\u00e6ngelig.", + "pad.modals.initsocketfail.explanation": "Kunne ikke oprette forbindelse til synkroniseringsserveren.", + "pad.modals.initsocketfail.cause": "Det skyldes sandsynligvis et problem med din browser eller din internetforbindelse.", + "pad.modals.slowcommit": "Forbindelse afbrudt.", + "pad.modals.slowcommit.explanation": "Serveren svarer ikke.", + "pad.modals.slowcommit.cause": "Det kan skyldes problemer med netv\u00e6rksforbindelsen.", + "pad.modals.deleted": "Slettet.", + "pad.modals.deleted.explanation": "Denne pad er blevet fjernet.", + "pad.modals.disconnected": "Du har f\u00e5et afbrudt forbindelsen.", + "pad.modals.disconnected.explanation": "Forbindelsen til serveren blev afbrudt", + "pad.modals.disconnected.cause": "Serveren er muligvis ikke tilg\u00e6ngelig. G\u00f8r os venligst opm\u00e6rksom p\u00e5 hvis dette forts\u00e6tter med at ske.", + "pad.share": "Del denne pad", + "pad.share.readonly": "Skrivebeskyttet", + "pad.share.link": "Link", + "pad.share.emebdcode": "Integrerings URL", + "pad.chat": "Chat", + "pad.chat.title": "\u00c5ben chat for denne pad.", + "pad.chat.loadmessages": "Indl\u00e6s flere meddelelser", + "timeslider.pageTitle": "{{appTitle}} Timeslider", + "timeslider.toolbar.returnbutton": "Tilbage til pad", + "timeslider.toolbar.authors": "Forfattere:", + "timeslider.toolbar.authorsList": "Ingen forfattere", + "timeslider.toolbar.exportlink.title": "Eksport\u00e9r", + "timeslider.exportCurrent": "Eksporter aktuelle version som:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Gemt den {{day}}.{{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januar", + "timeslider.month.february": "februar", + "timeslider.month.march": "marts", + "timeslider.month.april": "april", + "timeslider.month.may": "maj", + "timeslider.month.june": "juni", + "timeslider.month.july": "juli", + "timeslider.month.august": "august", + "timeslider.month.september": "september", + "timeslider.month.october": "oktober", + "timeslider.month.november": "november", + "timeslider.month.december": "december", + "timeslider.unnamedauthor": "{{num}} unavngiven forfatter", + "timeslider.unnamedauthors": "{{num}} unavngivne forfattere", + "pad.savedrevs.marked": "Denne revision er nu markeret som en gemt revision", + "pad.userlist.entername": "Indtast dit navn", + "pad.userlist.unnamed": "ikke-navngivet", + "pad.userlist.guest": "G\u00e6st", + "pad.userlist.deny": "N\u00e6gt", + "pad.userlist.approve": "Godkend", + "pad.editbar.clearcolors": "Fjern farver for ophavsmand i hele dokumentet?", + "pad.impexp.importbutton": "Importer nu", + "pad.impexp.importing": "Importerer...", + "pad.impexp.confirmimport": "At importere en fil, vil overskrives den aktuelle pad tekst. Er du sikker p\u00e5 du vil forts\u00e6tte?", + "pad.impexp.convertFailed": "Vi var ikke i stand til at importere denne fil. Brug et andet dokument-format eller kopier og s\u00e6t ind manuelt", + "pad.impexp.uploadFailed": "Upload mislykkedes, pr\u00f8v igen", + "pad.impexp.importfailed": "Importen mislykkedes", + "pad.impexp.copypaste": "Venligst kopier og s\u00e6t ind", + "pad.impexp.exportdisabled": "Eksportere i {{type}} format er deaktiveret. Kontakt din systemadministrator for mere information." } \ No newline at end of file diff --git a/src/locales/de.json b/src/locales/de.json index fdd01675..380ee625 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1,124 +1,124 @@ { - "@metadata": { - "authors": { - "0": "Metalhead64", - "1": "Mklehr", - "2": "Nipsky", - "4": "Wikinaut" - } - }, - "index.newPad": "Neues Pad", - "index.createOpenPad": "Pad mit folgendem Namen \u00f6ffnen:", - "pad.toolbar.bold.title": "Fett (Strg-B)", - "pad.toolbar.italic.title": "Kursiv (Strg-I)", - "pad.toolbar.underline.title": "Unterstrichen (Strg-U)", - "pad.toolbar.strikethrough.title": "Durchgestrichen", - "pad.toolbar.ol.title": "Nummerierte Liste", - "pad.toolbar.ul.title": "Ungeordnete Liste", - "pad.toolbar.indent.title": "Einr\u00fccken", - "pad.toolbar.unindent.title": "Ausr\u00fccken", - "pad.toolbar.undo.title": "R\u00fcckg\u00e4ngig (Strg-Z)", - "pad.toolbar.redo.title": "Wiederholen (Strg-Y)", - "pad.toolbar.clearAuthorship.title": "Autorenfarben zur\u00fccksetzen", - "pad.toolbar.import_export.title": "Import\/Export in verschiedenen Dateiformaten", - "pad.toolbar.timeslider.title": "Pad-Versionsgeschichte anzeigen", - "pad.toolbar.savedRevision.title": "Version speichern", - "pad.toolbar.settings.title": "Einstellungen", - "pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten", - "pad.toolbar.showusers.title": "Aktuell verbundene Benutzer anzeigen", - "pad.colorpicker.save": "Speichern", - "pad.colorpicker.cancel": "Abbrechen", - "pad.loading": "Laden \u2026", - "pad.passwordRequired": "Sie ben\u00f6tigen ein Passwort, um auf dieses Pad zuzugreifen", - "pad.permissionDenied": "Sie haben keine Berechtigung, um auf dieses Pad zuzugreifen", - "pad.wrongPassword": "Ihr Passwort war falsch", - "pad.settings.padSettings": "Pad Einstellungen", - "pad.settings.myView": "Eigene Ansicht", - "pad.settings.stickychat": "Chat immer anzeigen", - "pad.settings.colorcheck": "Autorenfarben anzeigen", - "pad.settings.linenocheck": "Zeilennummern", - "pad.settings.rtlcheck": "Inhalt von rechts nach links lesen?", - "pad.settings.fontType": "Schriftart:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Gemeinsame Ansicht", - "pad.settings.language": "Sprache:", - "pad.importExport.import_export": "Import\/Export", - "pad.importExport.import": "Datei oder Dokument hochladen", - "pad.importExport.importSuccessful": "Erfolgreich!", - "pad.importExport.export": "Aktuelles Pad exportieren als:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Textdatei", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Sie k\u00f6nnen nur aus Klartext oder HTML-Formaten importieren. F\u00fcr mehr erweiterte Importfunktionen installieren Sie bitte abiword<\/a>.", - "pad.modals.connected": "Verbunden.", - "pad.modals.reconnecting": "Wiederherstellen der Verbindung \u2026", - "pad.modals.forcereconnect": "Erneut Verbinden", - "pad.modals.userdup": "In einem anderen Fenster ge\u00f6ffnet", - "pad.modals.userdup.explanation": "Dieses Pad scheint in mehr als einem Browser-Fenster auf diesem Computer ge\u00f6ffnet zu sein.", - "pad.modals.userdup.advice": "Um dieses Fenster zu benutzen, verbinden Sie bitte erneut.", - "pad.modals.unauth": "Nicht authorisiert.", - "pad.modals.unauth.explanation": "Ihre Zugriffsberechtigung f\u00fcr dieses Pad hat sich zwischenzeitlich ge\u00e4ndert. Bitte versuchen Sie, das Pad erneut aufzurufen.", - "pad.modals.looping": "Verbindung unterbrochen.", - "pad.modals.looping.explanation": "Es gibt Probleme bei der Kommunikation mit dem Pad-Server.", - "pad.modals.looping.cause": "M\u00f6glicherweise sind Sie durch eine inkompatible Firewall oder \u00fcber einen inkompatiblen Proxy mit dem Padserver verbunden.", - "pad.modals.initsocketfail": "Pad-Server nicht erreichbar.", - "pad.modals.initsocketfail.explanation": "Es konnte keine Verbindung zum Pad-Server hergestellt werden.", - "pad.modals.initsocketfail.cause": "Dies k\u00f6nnte an Ihrem Browser oder Ihrer Internet-Verbindung liegen.", - "pad.modals.slowcommit": "Verbindung unterbrochen.", - "pad.modals.slowcommit.explanation": "Der Pad-Server reagiert nicht.", - "pad.modals.slowcommit.cause": "Dies k\u00f6nnte ein Netzwerkverbindungsproblem sein oder eine momentane \u00dcberlastung des Pad-Servers.", - "pad.modals.deleted": "Gel\u00f6scht.", - "pad.modals.deleted.explanation": "Dieses Pad wurde gel\u00f6scht.", - "pad.modals.disconnected": "Verbindung unterbrochen.", - "pad.modals.disconnected.explanation": "Die Verbindung zum Pad-Server wurde unterbrochen.", - "pad.modals.disconnected.cause": "M\u00f6glicherweise ist der Pad-Server nicht erreichbar. Bitte benachrichtigen Sie uns, falls dies weiterhin passiert.", - "pad.share": "Dieses Pad anderen mitteilen", - "pad.share.readonly": "Eingeschr\u00e4nkter Nur-Lese-Zugriff", - "pad.share.link": "Link", - "pad.share.emebdcode": "In Webseite einbetten", - "pad.chat": "Chat", - "pad.chat.title": "Den Chat dieses Pads \u00f6ffnen", - "pad.chat.loadmessages": "Weitere Nachrichten laden", - "timeslider.pageTitle": "{{appTitle}} Pad-Versionsgeschichte", - "timeslider.toolbar.returnbutton": "Zur\u00fcck zum Pad", - "timeslider.toolbar.authors": "Autoren:", - "timeslider.toolbar.authorsList": "keine Autoren", - "timeslider.toolbar.exportlink.title": "Export", - "timeslider.exportCurrent": "Exportiere diese Version als:", - "timeslider.version": "Version {{version}}", - "timeslider.saved": "Gespeichert am {{day}}.{{month}}.{{year}}", - "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Januar", - "timeslider.month.february": "Februar", - "timeslider.month.march": "M\u00e4rz", - "timeslider.month.april": "April", - "timeslider.month.may": "Mai", - "timeslider.month.june": "Juni", - "timeslider.month.july": "Juli", - "timeslider.month.august": "August", - "timeslider.month.september": "September", - "timeslider.month.october": "Oktober", - "timeslider.month.november": "November", - "timeslider.month.december": "Dezember", - "timeslider.unnamedauthor": "{{num}} unbenannter Autor", - "timeslider.unnamedauthors": "{{num}} unbenannte Autoren", - "pad.savedrevs.marked": "Diese Version wurde jetzt als gespeicherte Version gekennzeichnet", - "pad.userlist.entername": "Geben Sie Ihren Namen ein", - "pad.userlist.unnamed": "unbenannt", - "pad.userlist.guest": "Gast", - "pad.userlist.deny": "Verweigern", - "pad.userlist.approve": "Genehmigen", - "pad.editbar.clearcolors": "Autorenfarben im gesamten Dokument zur\u00fccksetzen?", - "pad.impexp.importbutton": "Jetzt importieren", - "pad.impexp.importing": "Importiere \u2026", - "pad.impexp.confirmimport": "Das Importieren einer Datei \u00fcberschreibt den aktuellen Text des Pads. Wollen Sie wirklich fortfahren?", - "pad.impexp.convertFailed": "Wir k\u00f6nnen diese Datei nicht importieren. Bitte verwenden Sie ein anderes Dokumentenformat oder \u00fcbertragen Sie den Text manuell.", - "pad.impexp.uploadFailed": "Der Upload ist fehlgeschlagen. Bitte versuchen Sie es erneut.", - "pad.impexp.importfailed": "Import fehlgeschlagen", - "pad.impexp.copypaste": "Bitte kopieren und einf\u00fcgen", - "pad.impexp.exportdisabled": "Der Export im {{type}}-Format ist deaktiviert. F\u00fcr Einzelheiten kontaktieren Sie bitte Ihren Systemadministrator." + "@metadata": { + "authors": { + "0": "Metalhead64", + "1": "Mklehr", + "2": "Nipsky", + "4": "Wikinaut" + } + }, + "index.newPad": "Neues Pad", + "index.createOpenPad": "Pad mit folgendem Namen \u00f6ffnen:", + "pad.toolbar.bold.title": "Fett (Strg-B)", + "pad.toolbar.italic.title": "Kursiv (Strg-I)", + "pad.toolbar.underline.title": "Unterstrichen (Strg-U)", + "pad.toolbar.strikethrough.title": "Durchgestrichen", + "pad.toolbar.ol.title": "Nummerierte Liste", + "pad.toolbar.ul.title": "Ungeordnete Liste", + "pad.toolbar.indent.title": "Einr\u00fccken", + "pad.toolbar.unindent.title": "Ausr\u00fccken", + "pad.toolbar.undo.title": "R\u00fcckg\u00e4ngig (Strg-Z)", + "pad.toolbar.redo.title": "Wiederholen (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Autorenfarben zur\u00fccksetzen", + "pad.toolbar.import_export.title": "Import/Export in verschiedenen Dateiformaten", + "pad.toolbar.timeslider.title": "Pad-Versionsgeschichte anzeigen", + "pad.toolbar.savedRevision.title": "Version speichern", + "pad.toolbar.settings.title": "Einstellungen", + "pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten", + "pad.toolbar.showusers.title": "Aktuell verbundene Benutzer anzeigen", + "pad.colorpicker.save": "Speichern", + "pad.colorpicker.cancel": "Abbrechen", + "pad.loading": "Laden \u2026", + "pad.passwordRequired": "Sie ben\u00f6tigen ein Passwort, um auf dieses Pad zuzugreifen", + "pad.permissionDenied": "Sie haben keine Berechtigung, um auf dieses Pad zuzugreifen", + "pad.wrongPassword": "Ihr Passwort war falsch", + "pad.settings.padSettings": "Pad Einstellungen", + "pad.settings.myView": "Eigene Ansicht", + "pad.settings.stickychat": "Chat immer anzeigen", + "pad.settings.colorcheck": "Autorenfarben anzeigen", + "pad.settings.linenocheck": "Zeilennummern", + "pad.settings.rtlcheck": "Inhalt von rechts nach links lesen?", + "pad.settings.fontType": "Schriftart:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Gemeinsame Ansicht", + "pad.settings.language": "Sprache:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Datei oder Dokument hochladen", + "pad.importExport.importSuccessful": "Erfolgreich!", + "pad.importExport.export": "Aktuelles Pad exportieren als:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Textdatei", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Sie k\u00f6nnen nur aus Klartext oder HTML-Formaten importieren. F\u00fcr mehr erweiterte Importfunktionen \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstallieren Sie bitte abiword\u003C/a\u003E.", + "pad.modals.connected": "Verbunden.", + "pad.modals.reconnecting": "Wiederherstellen der Verbindung \u2026", + "pad.modals.forcereconnect": "Erneut Verbinden", + "pad.modals.userdup": "In einem anderen Fenster ge\u00f6ffnet", + "pad.modals.userdup.explanation": "Dieses Pad scheint in mehr als einem Browser-Fenster auf diesem Computer ge\u00f6ffnet zu sein.", + "pad.modals.userdup.advice": "Um dieses Fenster zu benutzen, verbinden Sie bitte erneut.", + "pad.modals.unauth": "Nicht authorisiert.", + "pad.modals.unauth.explanation": "Ihre Zugriffsberechtigung f\u00fcr dieses Pad hat sich zwischenzeitlich ge\u00e4ndert. Bitte versuchen Sie, das Pad erneut aufzurufen.", + "pad.modals.looping": "Verbindung unterbrochen.", + "pad.modals.looping.explanation": "Es gibt Probleme bei der Kommunikation mit dem Pad-Server.", + "pad.modals.looping.cause": "M\u00f6glicherweise sind Sie durch eine inkompatible Firewall oder \u00fcber einen inkompatiblen Proxy mit dem Padserver verbunden.", + "pad.modals.initsocketfail": "Pad-Server nicht erreichbar.", + "pad.modals.initsocketfail.explanation": "Es konnte keine Verbindung zum Pad-Server hergestellt werden.", + "pad.modals.initsocketfail.cause": "Dies k\u00f6nnte an Ihrem Browser oder Ihrer Internet-Verbindung liegen.", + "pad.modals.slowcommit": "Verbindung unterbrochen.", + "pad.modals.slowcommit.explanation": "Der Pad-Server reagiert nicht.", + "pad.modals.slowcommit.cause": "Dies k\u00f6nnte ein Netzwerkverbindungsproblem sein oder eine momentane \u00dcberlastung des Pad-Servers.", + "pad.modals.deleted": "Gel\u00f6scht.", + "pad.modals.deleted.explanation": "Dieses Pad wurde gel\u00f6scht.", + "pad.modals.disconnected": "Verbindung unterbrochen.", + "pad.modals.disconnected.explanation": "Die Verbindung zum Pad-Server wurde unterbrochen.", + "pad.modals.disconnected.cause": "M\u00f6glicherweise ist der Pad-Server nicht erreichbar. Bitte benachrichtigen Sie uns, falls dies weiterhin passiert.", + "pad.share": "Dieses Pad anderen mitteilen", + "pad.share.readonly": "Eingeschr\u00e4nkter Nur-Lese-Zugriff", + "pad.share.link": "Link", + "pad.share.emebdcode": "In Webseite einbetten", + "pad.chat": "Chat", + "pad.chat.title": "Den Chat dieses Pads \u00f6ffnen", + "pad.chat.loadmessages": "Weitere Nachrichten laden", + "timeslider.pageTitle": "{{appTitle}} Pad-Versionsgeschichte", + "timeslider.toolbar.returnbutton": "Zur\u00fcck zum Pad", + "timeslider.toolbar.authors": "Autoren:", + "timeslider.toolbar.authorsList": "keine Autoren", + "timeslider.toolbar.exportlink.title": "Export", + "timeslider.exportCurrent": "Exportiere diese Version als:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Gespeichert am {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januar", + "timeslider.month.february": "Februar", + "timeslider.month.march": "M\u00e4rz", + "timeslider.month.april": "April", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juni", + "timeslider.month.july": "Juli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Dezember", + "timeslider.unnamedauthor": "{{num}} unbenannter Autor", + "timeslider.unnamedauthors": "{{num}} unbenannte Autoren", + "pad.savedrevs.marked": "Diese Version wurde jetzt als gespeicherte Version gekennzeichnet", + "pad.userlist.entername": "Geben Sie Ihren Namen ein", + "pad.userlist.unnamed": "unbenannt", + "pad.userlist.guest": "Gast", + "pad.userlist.deny": "Verweigern", + "pad.userlist.approve": "Genehmigen", + "pad.editbar.clearcolors": "Autorenfarben im gesamten Dokument zur\u00fccksetzen?", + "pad.impexp.importbutton": "Jetzt importieren", + "pad.impexp.importing": "Importiere \u2026", + "pad.impexp.confirmimport": "Das Importieren einer Datei \u00fcberschreibt den aktuellen Text des Pads. Wollen Sie wirklich fortfahren?", + "pad.impexp.convertFailed": "Wir k\u00f6nnen diese Datei nicht importieren. Bitte verwenden Sie ein anderes Dokumentenformat oder \u00fcbertragen Sie den Text manuell.", + "pad.impexp.uploadFailed": "Der Upload ist fehlgeschlagen. Bitte versuchen Sie es erneut.", + "pad.impexp.importfailed": "Import fehlgeschlagen", + "pad.impexp.copypaste": "Bitte kopieren und einf\u00fcgen", + "pad.impexp.exportdisabled": "Der Export im {{type}}-Format ist deaktiviert. F\u00fcr Einzelheiten kontaktieren Sie bitte Ihren Systemadministrator." } \ No newline at end of file diff --git a/src/locales/diq.json b/src/locales/diq.json index 62079d78..b2b989e5 100644 --- a/src/locales/diq.json +++ b/src/locales/diq.json @@ -1,76 +1,76 @@ { - "@metadata": { - "authors": [ - "Erdemaslancan", - "Mirzali" - ] - }, - "index.newPad": "Pedo newe", - "pad.toolbar.bold.title": "Qal\u0131n (Ctrl-B)", - "pad.toolbar.italic.title": "Nam\u0131te (Ctrl-I)", - "pad.toolbar.underline.title": "B\u0131nxet\u0131n (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Serxet\u0131n", - "pad.toolbar.ol.title": "Lista r\u00eazkerdiye", - "pad.toolbar.ul.title": "Lista r\u00eazn\u00eakerdiye", - "pad.toolbar.indent.title": "Ser\u00ea r\u00eaze", - "pad.toolbar.unindent.title": "V\u0131cente", - "pad.toolbar.undo.title": "Meke (Ctrl-Z)", - "pad.toolbar.redo.title": "F\u0131na b\u0131ke (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Reng\u00ea Nu\u015fto\u011fi\u00ea Ar\u0131stey", - "pad.toolbar.timeslider.title": "\u011e\u0131zag\u00ea zemani", - "pad.toolbar.savedRevision.title": "Rewizyon\u00ea Qeydbiyayey", - "pad.toolbar.settings.title": "Sazkerd\u0131\u015fi", - "pad.toolbar.embed.title": "Na ped degusnayiya", - "pad.colorpicker.save": "Qeyd ke", - "pad.colorpicker.cancel": "B\u0131texelne", - "pad.loading": "Bar beno...", - "pad.settings.padSettings": "Sazkerd\u0131\u015f\u00ea Pedi", - "pad.settings.myView": "Asay\u0131\u015f\u00ea m\u0131", - "pad.settings.colorcheck": "Reng\u00ea nu\u015ftekariye", - "pad.settings.linenocheck": "N\u0131mrey\u00ea xeter", - "pad.settings.fontType": "Babeta nu\u015fti:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Yewca", - "pad.settings.globalView": "Asay\u0131\u015fo Global", - "pad.settings.language": "Z\u0131wan:", - "pad.importExport.import_export": "Zereday\u0131\u015f\/Teberday\u0131\u015f", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Duz metin", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "G\u0131rediya.", - "pad.modals.unauth": "Selahiyetdar niyo", - "pad.modals.looping": "B\u00eag\u0131rey\u0131n.", - "pad.modals.initsocketfail": "N\u00earesney\u00eano ciyageyro\u011fi.", - "pad.modals.slowcommit": "B\u00eag\u0131rey\u0131n.", - "pad.modals.deleted": "Esteriya.", - "pad.modals.deleted.explanation": "Ena ped wedariye", - "pad.share": "Na ped v\u0131la ke", - "pad.share.readonly": "Tenya b\u0131wane", - "pad.share.link": "G\u0131re", - "pad.share.emebdcode": "Degusnaye URL", - "pad.chat": "M\u0131hebet", - "pad.chat.title": "Qand\u00ea ena ped m\u0131hebet ake.", - "timeslider.pageTitle": "\u011e\u0131zag\u00ea zemani {{appTitle}}", - "timeslider.toolbar.returnbutton": "Peyser \u015fo ped", - "timeslider.toolbar.authors": "Nu\u015fto\u011fi:", - "timeslider.toolbar.authorsList": "Nu\u015fto\u011fi \u00e7\u0131niy\u00ea", - "timeslider.exportCurrent": "Versiyon\u00ea enewki teber de:", - "timeslider.version": "Versiyon\u00ea {{version}}", - "timeslider.saved": "{{day}} {{month}}, {{year}} de biyo qeyd", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u00c7ele", - "timeslider.month.february": "\u015e\u0131bate", - "timeslider.month.march": "Adar", - "timeslider.month.april": "Nisane", - "timeslider.month.may": "Gulane", - "timeslider.month.june": "Heziran", - "timeslider.month.july": "Temuze", - "timeslider.month.august": "Tebaxe", - "timeslider.month.september": "Ke\u015fkelun", - "timeslider.month.october": "T\u0131\u015frino Ver\u00ean", - "timeslider.month.november": "T\u0131\u015frino Pey\u00ean", - "timeslider.month.december": "Kanun" + "@metadata": { + "authors": [ + "Erdemaslancan", + "Mirzali" + ] + }, + "index.newPad": "Pedo newe", + "pad.toolbar.bold.title": "Qal\u0131n (Ctrl-B)", + "pad.toolbar.italic.title": "Nam\u0131te (Ctrl-I)", + "pad.toolbar.underline.title": "B\u0131nxet\u0131n (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Serxet\u0131n", + "pad.toolbar.ol.title": "Lista r\u00eazkerdiye", + "pad.toolbar.ul.title": "Lista r\u00eazn\u00eakerdiye", + "pad.toolbar.indent.title": "Ser\u00ea r\u00eaze", + "pad.toolbar.unindent.title": "V\u0131cente", + "pad.toolbar.undo.title": "Meke (Ctrl-Z)", + "pad.toolbar.redo.title": "F\u0131na b\u0131ke (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Reng\u00ea Nu\u015fto\u011fi\u00ea Ar\u0131stey", + "pad.toolbar.timeslider.title": "\u011e\u0131zag\u00ea zemani", + "pad.toolbar.savedRevision.title": "Rewizyon\u00ea Qeydbiyayey", + "pad.toolbar.settings.title": "Sazkerd\u0131\u015fi", + "pad.toolbar.embed.title": "Na ped degusnayiya", + "pad.colorpicker.save": "Qeyd ke", + "pad.colorpicker.cancel": "B\u0131texelne", + "pad.loading": "Bar beno...", + "pad.settings.padSettings": "Sazkerd\u0131\u015f\u00ea Pedi", + "pad.settings.myView": "Asay\u0131\u015f\u00ea m\u0131", + "pad.settings.colorcheck": "Reng\u00ea nu\u015ftekariye", + "pad.settings.linenocheck": "N\u0131mrey\u00ea xeter", + "pad.settings.fontType": "Babeta nu\u015fti:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Yewca", + "pad.settings.globalView": "Asay\u0131\u015fo Global", + "pad.settings.language": "Z\u0131wan:", + "pad.importExport.import_export": "Zereday\u0131\u015f/Teberday\u0131\u015f", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Duz metin", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "G\u0131rediya.", + "pad.modals.unauth": "Selahiyetdar niyo", + "pad.modals.looping": "B\u00eag\u0131rey\u0131n.", + "pad.modals.initsocketfail": "N\u00earesney\u00eano ciyageyro\u011fi.", + "pad.modals.slowcommit": "B\u00eag\u0131rey\u0131n.", + "pad.modals.deleted": "Esteriya.", + "pad.modals.deleted.explanation": "Ena ped wedariye", + "pad.share": "Na ped v\u0131la ke", + "pad.share.readonly": "Tenya b\u0131wane", + "pad.share.link": "G\u0131re", + "pad.share.emebdcode": "Degusnaye URL", + "pad.chat": "M\u0131hebet", + "pad.chat.title": "Qand\u00ea ena ped m\u0131hebet ake.", + "timeslider.pageTitle": "\u011e\u0131zag\u00ea zemani {{appTitle}}", + "timeslider.toolbar.returnbutton": "Peyser \u015fo ped", + "timeslider.toolbar.authors": "Nu\u015fto\u011fi:", + "timeslider.toolbar.authorsList": "Nu\u015fto\u011fi \u00e7\u0131niy\u00ea", + "timeslider.exportCurrent": "Versiyon\u00ea enewki teber de:", + "timeslider.version": "Versiyon\u00ea {{version}}", + "timeslider.saved": "{{day}} {{month}}, {{year}} de biyo qeyd", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u00c7ele", + "timeslider.month.february": "\u015e\u0131bate", + "timeslider.month.march": "Adar", + "timeslider.month.april": "Nisane", + "timeslider.month.may": "Gulane", + "timeslider.month.june": "Heziran", + "timeslider.month.july": "Temuze", + "timeslider.month.august": "Tebaxe", + "timeslider.month.september": "Ke\u015fkelun", + "timeslider.month.october": "T\u0131\u015frino Ver\u00ean", + "timeslider.month.november": "T\u0131\u015frino Pey\u00ean", + "timeslider.month.december": "Kanun" } \ No newline at end of file diff --git a/src/locales/el.json b/src/locales/el.json index 52b4b7d6..78b8a753 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -1,124 +1,124 @@ { - "@metadata": { - "authors": [ - "Evropi", - "Glavkos", - "Monopatis", - "Protnet" - ] - }, - "index.newPad": "\u039d\u03ad\u03bf Pad", - "index.createOpenPad": "\u03ae \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\/\u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03b5\u03bd\u03cc\u03c2 Pad \u03bc\u03b5 \u03cc\u03bd\u03bf\u03bc\u03b1:", - "pad.toolbar.bold.title": "\u0388\u03bd\u03c4\u03bf\u03bd\u03b1 (Ctrl-B)", - "pad.toolbar.italic.title": "\u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 (Ctrl-I)", - "pad.toolbar.underline.title": "\u03a5\u03c0\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0394\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03ae \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae", - "pad.toolbar.ol.title": "\u03a4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1", - "pad.toolbar.ul.title": "\u039b\u03af\u03c3\u03c4\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c3\u03b5\u03b9\u03c1\u03ac", - "pad.toolbar.indent.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03c3\u03bf\u03c7\u03ae\u03c2", - "pad.toolbar.unindent.title": "\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b5\u03c3\u03bf\u03c7\u03ae\u03c2", - "pad.toolbar.undo.title": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03a3\u03c5\u03bd\u03c4\u03b1\u03ba\u03c4\u03ce\u03bd", - "pad.toolbar.import_export.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03cc\/\u03c3\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03bf\u03cd\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c5\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd", - "pad.toolbar.timeslider.title": "\u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", - "pad.toolbar.savedRevision.title": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0391\u03bd\u03b1\u03b8\u03b5\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2", - "pad.toolbar.settings.title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2", - "pad.toolbar.embed.title": "\u0395\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 pad", - "pad.toolbar.showusers.title": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 pad", - "pad.colorpicker.save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", - "pad.colorpicker.cancel": "\u0386\u03ba\u03c5\u03c1\u03bf", - "pad.loading": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...", - "pad.passwordRequired": "\u03a7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b3\u03b9\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", - "pad.permissionDenied": "\u0394\u03b5\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03af\u03c9\u03bc\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", - "pad.wrongPassword": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c3\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03bb\u03b1\u03bd\u03b8\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2", - "pad.settings.padSettings": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 Pad", - "pad.settings.myView": "\u0397 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03bc\u03bf\u03c5", - "pad.settings.stickychat": "\u0397 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03ac\u03bd\u03c4\u03b1 \u03bf\u03c1\u03b1\u03c4\u03ae", - "pad.settings.colorcheck": "\u03a7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7", - "pad.settings.linenocheck": "\u0391\u03c1\u03b9\u03b8\u03bc\u03bf\u03af \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2", - "pad.settings.rtlcheck": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b2\u03ac\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03b1\u03c0\u03cc \u03b4\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b1 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac;", - "pad.settings.fontType": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac\u03c2:", - "pad.settings.fontType.normal": "\u039a\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae", - "pad.settings.fontType.monospaced": "\u039a\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c0\u03bb\u03ac\u03c4\u03bf\u03c5\u03c2", - "pad.settings.globalView": "\u039a\u03b1\u03b8\u03bf\u03bb\u03b9\u03ba\u03ae \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae", - "pad.settings.language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1:", - "pad.importExport.import_export": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae", - "pad.importExport.import": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03bf\u03c0\u03bf\u03b9\u03bf\u03c5\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ae \u03b5\u03b3\u03b3\u03c1\u03ac\u03c6\u03bf\u03c5", - "pad.importExport.importSuccessful": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2!", - "pad.importExport.export": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 pad \u03c9\u03c2:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0391\u03c0\u03bb\u03cc \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03bb\u03bf\u03cd \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ae \u03bc\u03bf\u03c1\u03c6\u03ae\u03c2 html. \u0393\u03b9\u03b1 \u03c0\u03b9\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf abiword<\/a>.", - "pad.modals.connected": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03b9.", - "pad.modals.reconnecting": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf pad \u03c3\u03b1\u03c2...", - "pad.modals.forcereconnect": "\u0395\u03c0\u03b9\u03b2\u03bf\u03bb\u03ae \u03b5\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", - "pad.modals.userdup": "\u0391\u03bd\u03bf\u03b9\u03b3\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5 \u03ac\u03bb\u03bb\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf", - "pad.modals.userdup.explanation": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf pad \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03bd\u03bf\u03b9\u03c7\u03c4\u03cc \u03c3\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03b1\u03c0\u03cc \u03ad\u03bd\u03b1 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc\u03bd \u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae.", - "pad.modals.userdup.advice": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf.", - "pad.modals.unauth": "\u0394\u03b5\u03bd \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9", - "pad.modals.unauth.explanation": "\u03a4\u03b1 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03ac \u03c3\u03b1\u03c2 \u03ac\u03bb\u03bb\u03b1\u03be\u03b1\u03bd \u03cc\u03c3\u03bf \u03b2\u03bb\u03ad\u03c0\u03b1\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5.", - "pad.modals.looping": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5.", - "pad.modals.looping.explanation": "\u03a5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1\u03c2 \u03bc\u03b5 \u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd.", - "pad.modals.looping.cause": "\u038a\u03c3\u03c9\u03c2 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03ae\u03ba\u03b1\u03c4\u03b5 \u03bc\u03ad\u03c3\u03c9 \u03b5\u03bd\u03cc\u03c2 \u03bc\u03b7 \u03c3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03cd \u03c4\u03b5\u03af\u03c7\u03bf\u03c5\u03c2 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b1\u03c3\u03af\u03b1\u03c2 \u03ae \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03bc\u03b5\u03c3\u03bf\u03bb\u03ac\u03b2\u03b7\u03c3\u03b7\u03c2.", - "pad.modals.initsocketfail": "\u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u03ae \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae.", - "pad.modals.initsocketfail.explanation": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd.", - "pad.modals.initsocketfail.cause": "\u0391\u03c5\u03c4\u03cc \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ce\u03c2 \u03c3\u03b5 \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03ae \u03c4\u03b7\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf \u03b4\u03b9\u03b1\u03b4\u03af\u03ba\u03c4\u03c5\u03bf.", - "pad.modals.slowcommit": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5.", - "pad.modals.slowcommit.explanation": "\u039f \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9.", - "pad.modals.slowcommit.cause": "\u0391\u03c5\u03c4\u03cc \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5.", - "pad.modals.deleted": "\u0394\u03b9\u03b5\u03b3\u03c1\u03ac\u03c6\u03b7.", - "pad.modals.deleted.explanation": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf pad \u03ad\u03c7\u03b5\u03b9 \u03ba\u03b1\u03c4\u03b1\u03c1\u03b3\u03b7\u03b8\u03b5\u03af.", - "pad.modals.disconnected": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af.", - "pad.modals.disconnected.explanation": "\u03a7\u03ac\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae", - "pad.modals.disconnected.cause": "\u039f \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b1\u03c2 \u03b5\u03ac\u03bd \u03b1\u03c5\u03c4\u03cc \u03b5\u03be\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af \u03bd\u03b1 \u03c3\u03c5\u03bc\u03b2\u03b1\u03af\u03bd\u03b5\u03b9.", - "pad.share": "\u039c\u03bf\u03b9\u03c1\u03b1\u03c3\u03c4\u03b5\u03af\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", - "pad.share.readonly": "\u039c\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7", - "pad.share.link": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2", - "pad.share.emebdcode": "URL \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2", - "pad.chat": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1", - "pad.chat.title": "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad.", - "pad.chat.loadmessages": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03c9\u03bd \u03bc\u03b7\u03bd\u03c5\u03bc\u03ac\u03c4\u03c9\u03bd", - "timeslider.pageTitle": "{{appTitle}} \u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", - "timeslider.toolbar.returnbutton": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03c3\u03c4\u03bf pad", - "timeslider.toolbar.authors": "\u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b5\u03c2:", - "timeslider.toolbar.authorsList": "\u039a\u03b1\u03bd\u03ad\u03bd\u03b1\u03c2 \u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7\u03c2", - "timeslider.toolbar.exportlink.title": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae", - "timeslider.exportCurrent": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7\u03c2 \u03c9\u03c2:", - "timeslider.version": "\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 {{version}}", - "timeslider.saved": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c4\u03b9\u03c2 {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5", - "timeslider.month.february": "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5", - "timeslider.month.march": "\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5", - "timeslider.month.april": "\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5", - "timeslider.month.may": "\u039c\u03b1\u0390\u03bf\u03c5", - "timeslider.month.june": "\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5", - "timeslider.month.july": "\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5", - "timeslider.month.august": "\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5", - "timeslider.month.september": "\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.month.october": "\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.month.november": "\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.month.december": "\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.unnamedauthor": "{{num}} \u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03c2 \u03c3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03b1\u03c2", - "timeslider.unnamedauthors": "{{num}} \u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03b9 \u03c3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c2", - "pad.savedrevs.marked": "\u0391\u03c5\u03c4\u03ae \u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03b5\u03c0\u03b9\u03c3\u03b7\u03bc\u03ac\u03bd\u03b8\u03b7\u03ba\u03b5 \u03c9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7", - "pad.userlist.entername": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03ac \u03c3\u03b1\u03c2", - "pad.userlist.unnamed": "\u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03c2", - "pad.userlist.guest": "\u0395\u03c0\u03b9\u03c3\u03ba\u03ad\u03c0\u03c4\u03b7\u03c2", - "pad.userlist.deny": "\u0386\u03c1\u03bd\u03b7\u03c3\u03b7", - "pad.userlist.approve": "\u0388\u03b3\u03ba\u03c1\u03b9\u03c3\u03b7", - "pad.editbar.clearcolors": "\u039d\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03ba\u03ba\u03b1\u03b8\u03ac\u03c1\u03b9\u03c3\u03b7 \u03c7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03c3\u03cd\u03bd\u03c4\u03b1\u03be\u03b7\u03c2 \u03c3\u03b5 \u03bf\u03bb\u03cc\u03ba\u03bb\u03b7\u03c1\u03bf \u03c4\u03bf \u03ad\u03b3\u03b3\u03c1\u03b1\u03c6\u03bf;", - "pad.impexp.importbutton": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03a4\u03ce\u03c1\u03b1", - "pad.impexp.importing": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b1\u03b9...", - "pad.impexp.confirmimport": "\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03bd\u03cc\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b8\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03bf \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03c4\u03bf\u03c5 pad. \u0395\u03af\u03c3\u03c4\u03b5 \u03b2\u03ad\u03b2\u03b1\u03b9\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5;", - "pad.impexp.convertFailed": "\u0394\u03b5\u03bd \u03ba\u03b1\u03c4\u03b1\u03c6\u03ad\u03c1\u03b1\u03bc\u03b5 \u03bd\u03b1 \u03b5\u03b9\u03c3\u03ac\u03b3\u03bf\u03c5\u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03c4\u03cd\u03c0\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ae \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03c4\u03b5 \u03c7\u03b5\u03b9\u03c1\u03bf\u03ba\u03af\u03bd\u03b7\u03c4\u03b1", - "pad.impexp.uploadFailed": "\u0397 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5, \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac", - "pad.impexp.importfailed": "\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5", - "pad.impexp.copypaste": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03c4\u03b5", - "pad.impexp.exportdisabled": "\u0397 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03b5 \u03bc\u03bf\u03c1\u03c6\u03ae {{type}} \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af. \u0395\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae \u03c4\u03bf\u03c5 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03cc\u03c2 \u03c3\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2." + "@metadata": { + "authors": [ + "Evropi", + "Glavkos", + "Monopatis", + "Protnet" + ] + }, + "index.newPad": "\u039d\u03ad\u03bf Pad", + "index.createOpenPad": "\u03ae \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1/\u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03b5\u03bd\u03cc\u03c2 Pad \u03bc\u03b5 \u03cc\u03bd\u03bf\u03bc\u03b1:", + "pad.toolbar.bold.title": "\u0388\u03bd\u03c4\u03bf\u03bd\u03b1 (Ctrl-B)", + "pad.toolbar.italic.title": "\u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 (Ctrl-I)", + "pad.toolbar.underline.title": "\u03a5\u03c0\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0394\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03ae \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae", + "pad.toolbar.ol.title": "\u03a4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1", + "pad.toolbar.ul.title": "\u039b\u03af\u03c3\u03c4\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c3\u03b5\u03b9\u03c1\u03ac", + "pad.toolbar.indent.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03c3\u03bf\u03c7\u03ae\u03c2", + "pad.toolbar.unindent.title": "\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b5\u03c3\u03bf\u03c7\u03ae\u03c2", + "pad.toolbar.undo.title": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03a3\u03c5\u03bd\u03c4\u03b1\u03ba\u03c4\u03ce\u03bd", + "pad.toolbar.import_export.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03cc/\u03c3\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03bf\u03cd\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c5\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd", + "pad.toolbar.timeslider.title": "\u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", + "pad.toolbar.savedRevision.title": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0391\u03bd\u03b1\u03b8\u03b5\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2", + "pad.toolbar.settings.title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2", + "pad.toolbar.embed.title": "\u0395\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 pad", + "pad.toolbar.showusers.title": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 pad", + "pad.colorpicker.save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", + "pad.colorpicker.cancel": "\u0386\u03ba\u03c5\u03c1\u03bf", + "pad.loading": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...", + "pad.passwordRequired": "\u03a7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b3\u03b9\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", + "pad.permissionDenied": "\u0394\u03b5\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03af\u03c9\u03bc\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", + "pad.wrongPassword": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c3\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03bb\u03b1\u03bd\u03b8\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2", + "pad.settings.padSettings": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 Pad", + "pad.settings.myView": "\u0397 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03bc\u03bf\u03c5", + "pad.settings.stickychat": "\u0397 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03ac\u03bd\u03c4\u03b1 \u03bf\u03c1\u03b1\u03c4\u03ae", + "pad.settings.colorcheck": "\u03a7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7", + "pad.settings.linenocheck": "\u0391\u03c1\u03b9\u03b8\u03bc\u03bf\u03af \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2", + "pad.settings.rtlcheck": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b2\u03ac\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03b1\u03c0\u03cc \u03b4\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b1 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac;", + "pad.settings.fontType": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac\u03c2:", + "pad.settings.fontType.normal": "\u039a\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae", + "pad.settings.fontType.monospaced": "\u039a\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c0\u03bb\u03ac\u03c4\u03bf\u03c5\u03c2", + "pad.settings.globalView": "\u039a\u03b1\u03b8\u03bf\u03bb\u03b9\u03ba\u03ae \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae", + "pad.settings.language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1:", + "pad.importExport.import_export": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae", + "pad.importExport.import": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03bf\u03c0\u03bf\u03b9\u03bf\u03c5\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ae \u03b5\u03b3\u03b3\u03c1\u03ac\u03c6\u03bf\u03c5", + "pad.importExport.importSuccessful": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2!", + "pad.importExport.export": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 pad \u03c9\u03c2:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u0391\u03c0\u03bb\u03cc \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03bb\u03bf\u03cd \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ae \u03bc\u03bf\u03c1\u03c6\u03ae\u03c2 html. \u0393\u03b9\u03b1 \u03c0\u03b9\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf abiword\u003C/a\u003E.", + "pad.modals.connected": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03b9.", + "pad.modals.reconnecting": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf pad \u03c3\u03b1\u03c2...", + "pad.modals.forcereconnect": "\u0395\u03c0\u03b9\u03b2\u03bf\u03bb\u03ae \u03b5\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", + "pad.modals.userdup": "\u0391\u03bd\u03bf\u03b9\u03b3\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5 \u03ac\u03bb\u03bb\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf", + "pad.modals.userdup.explanation": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf pad \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03bd\u03bf\u03b9\u03c7\u03c4\u03cc \u03c3\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03b1\u03c0\u03cc \u03ad\u03bd\u03b1 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc\u03bd \u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae.", + "pad.modals.userdup.advice": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf.", + "pad.modals.unauth": "\u0394\u03b5\u03bd \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9", + "pad.modals.unauth.explanation": "\u03a4\u03b1 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03ac \u03c3\u03b1\u03c2 \u03ac\u03bb\u03bb\u03b1\u03be\u03b1\u03bd \u03cc\u03c3\u03bf \u03b2\u03bb\u03ad\u03c0\u03b1\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5.", + "pad.modals.looping": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5.", + "pad.modals.looping.explanation": "\u03a5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1\u03c2 \u03bc\u03b5 \u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd.", + "pad.modals.looping.cause": "\u038a\u03c3\u03c9\u03c2 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03ae\u03ba\u03b1\u03c4\u03b5 \u03bc\u03ad\u03c3\u03c9 \u03b5\u03bd\u03cc\u03c2 \u03bc\u03b7 \u03c3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03cd \u03c4\u03b5\u03af\u03c7\u03bf\u03c5\u03c2 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b1\u03c3\u03af\u03b1\u03c2 \u03ae \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03bc\u03b5\u03c3\u03bf\u03bb\u03ac\u03b2\u03b7\u03c3\u03b7\u03c2.", + "pad.modals.initsocketfail": "\u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u03ae \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae.", + "pad.modals.initsocketfail.explanation": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd.", + "pad.modals.initsocketfail.cause": "\u0391\u03c5\u03c4\u03cc \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ce\u03c2 \u03c3\u03b5 \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03ae \u03c4\u03b7\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf \u03b4\u03b9\u03b1\u03b4\u03af\u03ba\u03c4\u03c5\u03bf.", + "pad.modals.slowcommit": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5.", + "pad.modals.slowcommit.explanation": "\u039f \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9.", + "pad.modals.slowcommit.cause": "\u0391\u03c5\u03c4\u03cc \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5.", + "pad.modals.deleted": "\u0394\u03b9\u03b5\u03b3\u03c1\u03ac\u03c6\u03b7.", + "pad.modals.deleted.explanation": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf pad \u03ad\u03c7\u03b5\u03b9 \u03ba\u03b1\u03c4\u03b1\u03c1\u03b3\u03b7\u03b8\u03b5\u03af.", + "pad.modals.disconnected": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af.", + "pad.modals.disconnected.explanation": "\u03a7\u03ac\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae", + "pad.modals.disconnected.cause": "\u039f \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b1\u03c2 \u03b5\u03ac\u03bd \u03b1\u03c5\u03c4\u03cc \u03b5\u03be\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af \u03bd\u03b1 \u03c3\u03c5\u03bc\u03b2\u03b1\u03af\u03bd\u03b5\u03b9.", + "pad.share": "\u039c\u03bf\u03b9\u03c1\u03b1\u03c3\u03c4\u03b5\u03af\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", + "pad.share.readonly": "\u039c\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7", + "pad.share.link": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2", + "pad.share.emebdcode": "URL \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2", + "pad.chat": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1", + "pad.chat.title": "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad.", + "pad.chat.loadmessages": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03c9\u03bd \u03bc\u03b7\u03bd\u03c5\u03bc\u03ac\u03c4\u03c9\u03bd", + "timeslider.pageTitle": "{{appTitle}} \u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", + "timeslider.toolbar.returnbutton": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03c3\u03c4\u03bf pad", + "timeslider.toolbar.authors": "\u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b5\u03c2:", + "timeslider.toolbar.authorsList": "\u039a\u03b1\u03bd\u03ad\u03bd\u03b1\u03c2 \u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7\u03c2", + "timeslider.toolbar.exportlink.title": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae", + "timeslider.exportCurrent": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7\u03c2 \u03c9\u03c2:", + "timeslider.version": "\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 {{version}}", + "timeslider.saved": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c4\u03b9\u03c2 {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5", + "timeslider.month.february": "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5", + "timeslider.month.march": "\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5", + "timeslider.month.april": "\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5", + "timeslider.month.may": "\u039c\u03b1\u0390\u03bf\u03c5", + "timeslider.month.june": "\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5", + "timeslider.month.july": "\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5", + "timeslider.month.august": "\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5", + "timeslider.month.september": "\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", + "timeslider.month.october": "\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5", + "timeslider.month.november": "\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", + "timeslider.month.december": "\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", + "timeslider.unnamedauthor": "{{num}} \u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03c2 \u03c3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03b1\u03c2", + "timeslider.unnamedauthors": "{{num}} \u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03b9 \u03c3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c2", + "pad.savedrevs.marked": "\u0391\u03c5\u03c4\u03ae \u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03b5\u03c0\u03b9\u03c3\u03b7\u03bc\u03ac\u03bd\u03b8\u03b7\u03ba\u03b5 \u03c9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7", + "pad.userlist.entername": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03ac \u03c3\u03b1\u03c2", + "pad.userlist.unnamed": "\u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03c2", + "pad.userlist.guest": "\u0395\u03c0\u03b9\u03c3\u03ba\u03ad\u03c0\u03c4\u03b7\u03c2", + "pad.userlist.deny": "\u0386\u03c1\u03bd\u03b7\u03c3\u03b7", + "pad.userlist.approve": "\u0388\u03b3\u03ba\u03c1\u03b9\u03c3\u03b7", + "pad.editbar.clearcolors": "\u039d\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03ba\u03ba\u03b1\u03b8\u03ac\u03c1\u03b9\u03c3\u03b7 \u03c7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03c3\u03cd\u03bd\u03c4\u03b1\u03be\u03b7\u03c2 \u03c3\u03b5 \u03bf\u03bb\u03cc\u03ba\u03bb\u03b7\u03c1\u03bf \u03c4\u03bf \u03ad\u03b3\u03b3\u03c1\u03b1\u03c6\u03bf;", + "pad.impexp.importbutton": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03a4\u03ce\u03c1\u03b1", + "pad.impexp.importing": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b1\u03b9...", + "pad.impexp.confirmimport": "\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03bd\u03cc\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b8\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03bf \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03c4\u03bf\u03c5 pad. \u0395\u03af\u03c3\u03c4\u03b5 \u03b2\u03ad\u03b2\u03b1\u03b9\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5;", + "pad.impexp.convertFailed": "\u0394\u03b5\u03bd \u03ba\u03b1\u03c4\u03b1\u03c6\u03ad\u03c1\u03b1\u03bc\u03b5 \u03bd\u03b1 \u03b5\u03b9\u03c3\u03ac\u03b3\u03bf\u03c5\u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03c4\u03cd\u03c0\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ae \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03c4\u03b5 \u03c7\u03b5\u03b9\u03c1\u03bf\u03ba\u03af\u03bd\u03b7\u03c4\u03b1", + "pad.impexp.uploadFailed": "\u0397 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5, \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac", + "pad.impexp.importfailed": "\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5", + "pad.impexp.copypaste": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03c4\u03b5", + "pad.impexp.exportdisabled": "\u0397 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03b5 \u03bc\u03bf\u03c1\u03c6\u03ae {{type}} \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af. \u0395\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae \u03c4\u03bf\u03c5 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03cc\u03c2 \u03c3\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2." } \ No newline at end of file diff --git a/src/locales/es.json b/src/locales/es.json index 187f3637..dae17e9f 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1,125 +1,125 @@ { - "@metadata": { - "authors": { - "0": "Armando-Martin", - "1": "Jacobo", - "2": "Joker", - "3": "Rubenwap", - "5": "Vivaelcelta", - "6": "Xuacu" - } - }, - "index.newPad": "Nuevo Pad", - "index.createOpenPad": "o crea\/abre un Pad con el nombre:", - "pad.toolbar.bold.title": "Negrita (Ctrl-B)", - "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Subrayado (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Tachado", - "pad.toolbar.ol.title": "Lista ordenada", - "pad.toolbar.ul.title": "Lista desordenada", - "pad.toolbar.indent.title": "Sangrar", - "pad.toolbar.unindent.title": "Desangrar", - "pad.toolbar.undo.title": "Deshacer (Ctrl-Z)", - "pad.toolbar.redo.title": "Rehacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Eliminar los colores de los autores", - "pad.toolbar.import_export.title": "Importar\/Exportar a diferentes formatos de archivos", - "pad.toolbar.timeslider.title": "L\u00ednea de tiempo", - "pad.toolbar.savedRevision.title": "Revisiones guardadas", - "pad.toolbar.settings.title": "Configuraci\u00f3n", - "pad.toolbar.embed.title": "Incrustar este pad", - "pad.toolbar.showusers.title": "Mostrar los usuarios de este pad", - "pad.colorpicker.save": "Guardar", - "pad.colorpicker.cancel": "Cancelar", - "pad.loading": "Cargando...", - "pad.passwordRequired": "Necesitas una contrase\u00f1a para acceder a este documento", - "pad.permissionDenied": "No tienes permiso para acceder a esta p\u00e1gina", - "pad.wrongPassword": "La contrase\u00f1a era incorrecta", - "pad.settings.padSettings": "Configuraci\u00f3n del Pad", - "pad.settings.myView": "Preferencias personales", - "pad.settings.stickychat": "Chat siempre encima", - "pad.settings.colorcheck": "Color de autor\u00eda", - "pad.settings.linenocheck": "N\u00fameros de l\u00ednea", - "pad.settings.fontType": "Tipograf\u00eda:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespacio", - "pad.settings.globalView": "Preferencias globales", - "pad.settings.language": "Idioma:", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Subir cualquier texto o documento", - "pad.importExport.importSuccessful": "\u00a1Operaci\u00f3n realizada con \u00e9xito!", - "pad.importExport.export": "Exporta el pad actual como:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Texto plano", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "S\u00f3lo puede importar formatos de texto plano o html. Para funciones m\u00e1s avanzadas instale abiword<\/a>.", - "pad.modals.connected": "Conectado.", - "pad.modals.reconnecting": "Reconectando a tu pad..", - "pad.modals.forcereconnect": "Reconexi\u00f3n forzosa", - "pad.modals.userdup": "Abierto en otra ventana", - "pad.modals.userdup.explanation": "Este pad parece estar abierto en m\u00e1s de una ventana de tu navegador.", - "pad.modals.userdup.advice": "Reconectar para usar esta ventana.", - "pad.modals.unauth": "No autorizado.", - "pad.modals.unauth.explanation": "Los permisos han cambiado mientras estabas viendo esta p\u00e1gina. Intenta reconectar de nuevo.", - "pad.modals.looping": "Desconectado.", - "pad.modals.looping.explanation": "Estamos teniendo problemas con la sincronizaci\u00f3n en el servidor.", - "pad.modals.looping.cause": "Puede deberse a que te conectes a trav\u00e9s de un proxy o un cortafuegos incompatible.", - "pad.modals.initsocketfail": "Servidor incalcanzable.", - "pad.modals.initsocketfail.explanation": "No se pudo conectar al servidor de sincronizaci\u00f3n.", - "pad.modals.initsocketfail.cause": "Puede ser a causa de tu navegador o de una ca\u00edda en tu conexi\u00f3n de Internet.", - "pad.modals.slowcommit": "Desconectado.", - "pad.modals.slowcommit.explanation": "El servidor no responde.", - "pad.modals.slowcommit.cause": "Puede deberse a problemas con tu conexi\u00f3n de red.", - "pad.modals.deleted": "Borrado.", - "pad.modals.deleted.explanation": "Este pad ha sido borrado.", - "pad.modals.disconnected": "Has sido desconectado.", - "pad.modals.disconnected.explanation": "Se perdi\u00f3 la conexi\u00f3n con el servidor", - "pad.modals.disconnected.cause": "El servidor podr\u00eda no estar disponible. Contacte con nosotros si esto contin\u00faa sucediendo.", - "pad.share": "Compatir el pad", - "pad.share.readonly": "S\u00f3lo lectura", - "pad.share.link": "Enlace", - "pad.share.emebdcode": "Incrustar URL", - "pad.chat": "Chat", - "pad.chat.title": "Abrir el chat para este pad.", - "pad.chat.loadmessages": "Cargar m\u00e1s mensajes", - "timeslider.pageTitle": "{{appTitle}} L\u00ednea de tiempo", - "timeslider.toolbar.returnbutton": "Volver al pad", - "timeslider.toolbar.authors": "Autores:", - "timeslider.toolbar.authorsList": "Sin autores", - "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar la versi\u00f3n actual como:", - "timeslider.version": "Versi\u00f3n {{version}}", - "timeslider.saved": "Guardado el {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Enero", - "timeslider.month.february": "Febrero", - "timeslider.month.march": "Marzo", - "timeslider.month.april": "Abril", - "timeslider.month.may": "Mayo", - "timeslider.month.june": "Junio", - "timeslider.month.july": "Julio", - "timeslider.month.august": "Agosto", - "timeslider.month.september": "Septiembre", - "timeslider.month.october": "Octubre", - "timeslider.month.november": "Noviembre", - "timeslider.month.december": "Diciembre", - "timeslider.unnamedauthor": "{{num}} autor desconocido", - "timeslider.unnamedauthors": "{{num}} autores desconocidos", - "pad.savedrevs.marked": "Revisi\u00f3n guardada", - "pad.userlist.entername": "Escribe tu nombre", - "pad.userlist.unnamed": "an\u00f3nimo", - "pad.userlist.guest": "Invitado", - "pad.userlist.deny": "Denegar", - "pad.userlist.approve": "Aprobar", - "pad.editbar.clearcolors": "\u00bfDesea borrar el color de los autores en todo el documento?", - "pad.impexp.importbutton": "Importar", - "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "Al importar un fichero se borrar\u00e1 el contenido actual del documento. \u00bfQuiere continuar?", - "pad.impexp.convertFailed": "No pudimos importar este fichero. Intentalo con otro formato diferente o copia y pega manualmente.", - "pad.impexp.uploadFailed": "El env\u00edo del fichero fall\u00f3. Intentelo de nuevo.", - "pad.impexp.importfailed": "Fallo al importar", - "pad.impexp.copypaste": "Intente copiar y pegar", - "pad.impexp.exportdisabled": "La exportaci\u00f3n al formato {{type}} format est\u00e1 desactivada. Contacte con su administrador de sistemas." + "@metadata": { + "authors": { + "0": "Armando-Martin", + "1": "Jacobo", + "2": "Joker", + "3": "Rubenwap", + "5": "Vivaelcelta", + "6": "Xuacu" + } + }, + "index.newPad": "Nuevo Pad", + "index.createOpenPad": "o crea/abre un Pad con el nombre:", + "pad.toolbar.bold.title": "Negrita (Ctrl-B)", + "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", + "pad.toolbar.underline.title": "Subrayado (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Tachado", + "pad.toolbar.ol.title": "Lista ordenada", + "pad.toolbar.ul.title": "Lista desordenada", + "pad.toolbar.indent.title": "Sangrar", + "pad.toolbar.unindent.title": "Desangrar", + "pad.toolbar.undo.title": "Deshacer (Ctrl-Z)", + "pad.toolbar.redo.title": "Rehacer (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Eliminar los colores de los autores", + "pad.toolbar.import_export.title": "Importar/Exportar a diferentes formatos de archivos", + "pad.toolbar.timeslider.title": "L\u00ednea de tiempo", + "pad.toolbar.savedRevision.title": "Revisiones guardadas", + "pad.toolbar.settings.title": "Configuraci\u00f3n", + "pad.toolbar.embed.title": "Incrustar este pad", + "pad.toolbar.showusers.title": "Mostrar los usuarios de este pad", + "pad.colorpicker.save": "Guardar", + "pad.colorpicker.cancel": "Cancelar", + "pad.loading": "Cargando...", + "pad.passwordRequired": "Necesitas una contrase\u00f1a para acceder a este documento", + "pad.permissionDenied": "No tienes permiso para acceder a esta p\u00e1gina", + "pad.wrongPassword": "La contrase\u00f1a era incorrecta", + "pad.settings.padSettings": "Configuraci\u00f3n del Pad", + "pad.settings.myView": "Preferencias personales", + "pad.settings.stickychat": "Chat siempre encima", + "pad.settings.colorcheck": "Color de autor\u00eda", + "pad.settings.linenocheck": "N\u00fameros de l\u00ednea", + "pad.settings.fontType": "Tipograf\u00eda:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monoespacio", + "pad.settings.globalView": "Preferencias globales", + "pad.settings.language": "Idioma:", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Subir cualquier texto o documento", + "pad.importExport.importSuccessful": "\u00a1Operaci\u00f3n realizada con \u00e9xito!", + "pad.importExport.export": "Exporta el pad actual como:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Texto plano", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "S\u00f3lo puede importar formatos de texto plano o html. Para funciones m\u00e1s avanzadas instale \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eabiword\u003C/a\u003E.", + "pad.modals.connected": "Conectado.", + "pad.modals.reconnecting": "Reconectando a tu pad..", + "pad.modals.forcereconnect": "Reconexi\u00f3n forzosa", + "pad.modals.userdup": "Abierto en otra ventana", + "pad.modals.userdup.explanation": "Este pad parece estar abierto en m\u00e1s de una ventana de tu navegador.", + "pad.modals.userdup.advice": "Reconectar para usar esta ventana.", + "pad.modals.unauth": "No autorizado.", + "pad.modals.unauth.explanation": "Los permisos han cambiado mientras estabas viendo esta p\u00e1gina. Intenta reconectar de nuevo.", + "pad.modals.looping": "Desconectado.", + "pad.modals.looping.explanation": "Estamos teniendo problemas con la sincronizaci\u00f3n en el servidor.", + "pad.modals.looping.cause": "Puede deberse a que te conectes a trav\u00e9s de un proxy o un cortafuegos incompatible.", + "pad.modals.initsocketfail": "Servidor incalcanzable.", + "pad.modals.initsocketfail.explanation": "No se pudo conectar al servidor de sincronizaci\u00f3n.", + "pad.modals.initsocketfail.cause": "Puede ser a causa de tu navegador o de una ca\u00edda en tu conexi\u00f3n de Internet.", + "pad.modals.slowcommit": "Desconectado.", + "pad.modals.slowcommit.explanation": "El servidor no responde.", + "pad.modals.slowcommit.cause": "Puede deberse a problemas con tu conexi\u00f3n de red.", + "pad.modals.deleted": "Borrado.", + "pad.modals.deleted.explanation": "Este pad ha sido borrado.", + "pad.modals.disconnected": "Has sido desconectado.", + "pad.modals.disconnected.explanation": "Se perdi\u00f3 la conexi\u00f3n con el servidor", + "pad.modals.disconnected.cause": "El servidor podr\u00eda no estar disponible. Contacte con nosotros si esto contin\u00faa sucediendo.", + "pad.share": "Compatir el pad", + "pad.share.readonly": "S\u00f3lo lectura", + "pad.share.link": "Enlace", + "pad.share.emebdcode": "Incrustar URL", + "pad.chat": "Chat", + "pad.chat.title": "Abrir el chat para este pad.", + "pad.chat.loadmessages": "Cargar m\u00e1s mensajes", + "timeslider.pageTitle": "{{appTitle}} L\u00ednea de tiempo", + "timeslider.toolbar.returnbutton": "Volver al pad", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Sin autores", + "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar la versi\u00f3n actual como:", + "timeslider.version": "Versi\u00f3n {{version}}", + "timeslider.saved": "Guardado el {{day}} de {{month}} de {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Enero", + "timeslider.month.february": "Febrero", + "timeslider.month.march": "Marzo", + "timeslider.month.april": "Abril", + "timeslider.month.may": "Mayo", + "timeslider.month.june": "Junio", + "timeslider.month.july": "Julio", + "timeslider.month.august": "Agosto", + "timeslider.month.september": "Septiembre", + "timeslider.month.october": "Octubre", + "timeslider.month.november": "Noviembre", + "timeslider.month.december": "Diciembre", + "timeslider.unnamedauthor": "{{num}} autor desconocido", + "timeslider.unnamedauthors": "{{num}} autores desconocidos", + "pad.savedrevs.marked": "Revisi\u00f3n guardada", + "pad.userlist.entername": "Escribe tu nombre", + "pad.userlist.unnamed": "an\u00f3nimo", + "pad.userlist.guest": "Invitado", + "pad.userlist.deny": "Denegar", + "pad.userlist.approve": "Aprobar", + "pad.editbar.clearcolors": "\u00bfDesea borrar el color de los autores en todo el documento?", + "pad.impexp.importbutton": "Importar", + "pad.impexp.importing": "Importando...", + "pad.impexp.confirmimport": "Al importar un fichero se borrar\u00e1 el contenido actual del documento. \u00bfQuiere continuar?", + "pad.impexp.convertFailed": "No pudimos importar este fichero. Intentalo con otro formato diferente o copia y pega manualmente.", + "pad.impexp.uploadFailed": "El env\u00edo del fichero fall\u00f3. Intentelo de nuevo.", + "pad.impexp.importfailed": "Fallo al importar", + "pad.impexp.copypaste": "Intente copiar y pegar", + "pad.impexp.exportdisabled": "La exportaci\u00f3n al formato {{type}} format est\u00e1 desactivada. Contacte con su administrador de sistemas." } \ No newline at end of file diff --git a/src/locales/fa.json b/src/locales/fa.json index 6495ace5..4d2c448f 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -1,124 +1,124 @@ { - "@metadata": { - "authors": { - "0": "BMRG14", - "1": "Dalba", - "3": "ZxxZxxZ", - "4": "\u0627\u0644\u0646\u0627\u0632" - } - }, - "index.newPad": "\u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062a\u0627\u0632\u0647", - "index.createOpenPad": "\u06cc\u0627 \u0627\u06cc\u062c\u0627\u062f\/\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0628\u0627 \u0646\u0627\u0645:", - "pad.toolbar.bold.title": "\u067e\u0631\u0631\u0646\u06af (Ctrl-B)", - "pad.toolbar.italic.title": "\u06a9\u062c (Ctrl-I)", - "pad.toolbar.underline.title": "\u0632\u06cc\u0631\u062e\u0637 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u062e\u0637 \u062e\u0648\u0631\u062f\u0647", - "pad.toolbar.ol.title": "\u0641\u0647\u0631\u0633\u062a \u0645\u0631\u062a\u0628 \u0634\u062f\u0647", - "pad.toolbar.ul.title": "\u0641\u0647\u0631\u0633\u062a \u0645\u0631\u062a\u0628 \u0646\u0634\u062f\u0647", - "pad.toolbar.indent.title": "\u062a\u0648\u0631\u0641\u062a\u06af\u06cc", - "pad.toolbar.unindent.title": "\u0628\u06cc\u0631\u0648\u0646 \u0631\u0641\u062a\u06af\u06cc", - "pad.toolbar.undo.title": "\u0628\u0627\u0637\u0644\u200c\u06a9\u0631\u062f\u0646 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0627\u0632 \u0646\u0648 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", - "pad.toolbar.import_export.title": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc\/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0632\/\u0628\u0647 \u0642\u0627\u0644\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641", - "pad.toolbar.timeslider.title": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646", - "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u06cc \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc", - "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a", - "pad.toolbar.embed.title": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.toolbar.showusers.title": "\u0646\u0645\u0627\u06cc\u0634 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.colorpicker.save": "\u0630\u062e\u06cc\u0631\u0647", - "pad.colorpicker.cancel": "\u0644\u063a\u0648", - "pad.loading": "\u062f\u0631 \u062d\u0627\u0644 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc...", - "pad.passwordRequired": "\u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0646\u06cc\u0627\u0632 \u0628\u0647 \u06cc\u06a9 \u06af\u0630\u0631\u0648\u0627\u0698\u0647 \u062f\u0627\u0631\u06cc\u062f", - "pad.permissionDenied": "\u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647\u200c\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0631\u0627 \u0646\u062f\u0627\u0631\u06cc\u062f", - "pad.wrongPassword": "\u06af\u0630\u0631\u0648\u0627\u0698\u0647\u200c\u06cc \u0634\u0645\u0627 \u062f\u0631\u0633\u062a \u0646\u06cc\u0633\u062a", - "pad.settings.padSettings": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.settings.myView": "\u0646\u0645\u0627\u06cc \u0645\u0646", - "pad.settings.stickychat": "\u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u06cc\u0634\u0647 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u0627\u0634\u062f", - "pad.settings.colorcheck": "\u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", - "pad.settings.linenocheck": "\u0634\u0645\u0627\u0631\u0647\u200c\u06cc \u062e\u0637\u0648\u0637", - "pad.settings.rtlcheck": "\u062e\u0648\u0627\u0646\u062f\u0646 \u0645\u062d\u062a\u0648\u0627 \u0627\u0632 \u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e\u061f", - "pad.settings.fontType": "\u0646\u0648\u0639 \u0642\u0644\u0645:", - "pad.settings.fontType.normal": "\u0633\u0627\u062f\u0647", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "\u0646\u0645\u0627\u06cc \u0633\u0631\u0627\u0633\u0631\u06cc", - "pad.settings.language": "\u0632\u0628\u0627\u0646:", - "pad.importExport.import_export": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc\/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc", - "pad.importExport.import": "\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647\u200c\u06cc \u0645\u062a\u0646\u06cc \u06cc\u0627 \u0633\u0646\u062f", - "pad.importExport.importSuccessful": "\u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0648\u062f!", - "pad.importExport.export": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0628\u0627 \u0642\u0627\u0644\u0628:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0645\u062a\u0646 \u0633\u0627\u062f\u0647", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (\u0642\u0627\u0644\u0628 \u0633\u0646\u062f \u0628\u0627\u0632)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0634\u0645\u0627 \u062a\u0646\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0642\u0627\u0644\u0628 \u0645\u062a\u0646 \u0633\u0627\u062f\u0647 \u06cc\u0627 \u0627\u0686\u200c\u062a\u06cc\u200c\u0627\u0645\u200c\u0627\u0644 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0634\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 AbiWord<\/a> \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.", - "pad.modals.connected": "\u0645\u062a\u0635\u0644 \u0634\u062f.", - "pad.modals.reconnecting": "\u062f\u0631 \u062d\u0627\u0644 \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0634\u0645\u0627..", - "pad.modals.forcereconnect": "\u0648\u0627\u062f\u0627\u0634\u062a\u0646 \u0628\u0647 \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647", - "pad.modals.userdup": "\u062f\u0631 \u067e\u0646\u062c\u0631\u0647\u200c\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0627\u0632 \u0634\u062f", - "pad.modals.userdup.explanation": "\u06af\u0645\u0627\u0646 \u0645\u06cc\u200c\u0631\u0648\u062f \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0631 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647\u200c\u06cc \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0627\u0632 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.userdup.advice": "\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u067e\u0646\u062c\u0631\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06cc\u062f.", - "pad.modals.unauth": "\u0645\u062c\u0627\u0632 \u0646\u06cc\u0633\u062a", - "pad.modals.unauth.explanation": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u0645\u0627 \u062f\u0631 \u062d\u06cc\u0646 \u0645\u0634\u0627\u0647\u062f\u0647\u200c\u06cc \u0627\u06cc\u0646 \u0628\u0631\u06af\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627\u0641\u062a\u0647\u200c\u0627\u0633\u062a. \u062f\u0648\u0628\u0627\u0631\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f.", - "pad.modals.looping": "\u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f.", - "pad.modals.looping.explanation": "\u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u0628\u0627 \u0633\u0631\u0648\u0631 \u0647\u0645\u06af\u0627\u0645\u200c\u0633\u0627\u0632\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.", - "pad.modals.looping.cause": "\u0634\u0627\u06cc\u062f \u0634\u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u06cc\u0627 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0646\u0627\u0633\u0627\u0632\u06af\u0627\u0631 \u0645\u062a\u0635\u0644 \u0634\u062f\u0647\u200c\u0627\u06cc\u062f.", - "pad.modals.initsocketfail": "\u0633\u0631\u0648\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u06cc\u0633\u062a.", - "pad.modals.initsocketfail.explanation": "\u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u0632\u06cc \u0648\u0635\u0644 \u0634\u062f.", - "pad.modals.initsocketfail.cause": "\u0634\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0628\u0647 \u062e\u0627\u0637\u0631 \u0645\u0634\u06a9\u0644\u06cc \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u06cc\u0627 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0634\u0645\u0627 \u0628\u0627\u0634\u062f.", - "pad.modals.slowcommit": "\u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f.", - "pad.modals.slowcommit.explanation": "\u0633\u0631\u0648\u0631 \u067e\u0627\u0633\u062e \u0646\u0645\u06cc\u200c\u062f\u0647\u062f.", - "pad.modals.slowcommit.cause": "\u0627\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u062e\u0627\u0637\u0631 \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u062f\u0631 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0634\u0628\u06a9\u0647 \u0628\u0627\u0634\u062f.", - "pad.modals.deleted": "\u067e\u0627\u06a9 \u0634\u062f.", - "pad.modals.deleted.explanation": "\u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u067e\u0627\u06a9 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.disconnected": "\u0627\u062a\u0635\u0627\u0644 \u0634\u0645\u0627 \u0642\u0637\u0639 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.disconnected.explanation": "\u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.disconnected.cause": "\u0633\u0631\u0648\u0631 \u0634\u0627\u06cc\u062f \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u0628\u0627\u0634\u062f. \u0627\u06af\u0631 \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0628\u0627\u0632 \u0647\u0645 \u0631\u062e \u062f\u0627\u062f \u0645\u0627 \u0631\u0627 \u0622\u06af\u0627\u0647 \u0633\u0627\u0632\u06cc\u062f.", - "pad.share": "\u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0631\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.share.readonly": "\u0641\u0642\u0637 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc", - "pad.share.link": "\u067e\u06cc\u0648\u0646\u062f", - "pad.share.emebdcode": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0646\u0634\u0627\u0646\u06cc", - "pad.chat": "\u06af\u0641\u062a\u06af\u0648", - "pad.chat.title": "\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06af\u0641\u062a\u06af\u0648 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.chat.loadmessages": "\u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631", - "timeslider.pageTitle": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646 {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "timeslider.toolbar.authors": "\u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u0627\u0646:", - "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0646\u0648\u06cc\u0633\u0646\u062f\u0647", - "timeslider.toolbar.exportlink.title": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc", - "timeslider.exportCurrent": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0646\u06af\u0627\u0631\u0634 \u06a9\u0646\u0648\u0646\u06cc \u0628\u0647 \u0639\u0646\u0648\u0627\u0646:", - "timeslider.version": "\u0646\u06af\u0627\u0631\u0634 {{version}}", - "timeslider.saved": "{{month}} {{day}}\u060c {{year}} \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0698\u0627\u0646\u0648\u06cc\u0647", - "timeslider.month.february": "\u0641\u0628\u0631\u06cc\u0647", - "timeslider.month.march": "\u0645\u0627\u0631\u0686", - "timeslider.month.april": "\u0622\u067e\u0631\u06cc\u0644", - "timeslider.month.may": "\u0645\u06cc", - "timeslider.month.june": "\u0698\u0648\u0626\u0646", - "timeslider.month.july": "\u062c\u0648\u0644\u0627\u06cc", - "timeslider.month.august": "\u0622\u06af\u0648\u0633\u062a", - "timeslider.month.september": "\u0633\u067e\u062a\u0627\u0645\u0628\u0631", - "timeslider.month.october": "\u0627\u06a9\u062a\u0628\u0631", - "timeslider.month.november": "\u0646\u0648\u0627\u0645\u0628\u0631", - "timeslider.month.december": "\u062f\u0633\u0627\u0645\u0628\u0631", - "timeslider.unnamedauthor": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", - "timeslider.unnamedauthors": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", - "pad.savedrevs.marked": "\u0627\u06cc\u0646 \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc \u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0639\u0644\u0627\u0645\u062a\u200c\u06af\u0630\u0627\u0631\u06cc \u0634\u062f", - "pad.userlist.entername": "\u0646\u0627\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f", - "pad.userlist.unnamed": "\u0628\u062f\u0648\u0646 \u0646\u0627\u0645", - "pad.userlist.guest": "\u0645\u0647\u0645\u0627\u0646", - "pad.userlist.deny": "\u0631\u062f \u06a9\u0631\u062f\u0646", - "pad.userlist.approve": "\u067e\u0630\u06cc\u0631\u0641\u062a\u0646", - "pad.editbar.clearcolors": "\u0631\u0646\u06af \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc \u0627\u0632 \u0647\u0645\u0647\u200c\u06cc \u0633\u0646\u062f \u067e\u0627\u06a9 \u0634\u0648\u062f\u061f", - "pad.impexp.importbutton": "\u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646", - "pad.impexp.importing": "\u062f\u0631 \u062d\u0627\u0644 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc...", - "pad.impexp.confirmimport": "\u0628\u0627 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0646\u0648\u0634\u062a\u0647\u200c\u06cc \u06a9\u0646\u0648\u0646\u06cc \u062f\u0641\u062a\u0631\u0686\u0647 \u067e\u0627\u06a9 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0622\u06cc\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u062f\u061f", - "pad.impexp.convertFailed": "\u0645\u0627 \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u062e\u0648\u0627\u0647\u0634\u0645\u0646\u062f\u06cc\u0645 \u0642\u0627\u0644\u0628 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0633\u0646\u062f\u062a\u0627\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u06cc\u0627 \u0628\u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0622\u0646\u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f", - "pad.impexp.uploadFailed": "\u0622\u067e\u0644\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u0646\u0634\u062f\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u06a9\u0646\u06cc\u062f", - "pad.impexp.importfailed": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0646\u062c\u0627\u0645 \u0646\u0634\u062f", - "pad.impexp.copypaste": "\u06a9\u067e\u06cc \u067e\u06cc\u0633\u062a \u06a9\u0646\u06cc\u062f", - "pad.impexp.exportdisabled": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0628\u0627 \u0642\u0627\u0644\u0628 {{type}} \u0627\u0632 \u06a9\u0627\u0631 \u0627\u0641\u062a\u0627\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0628\u0627 \u0645\u062f\u06cc\u0631 \u0633\u06cc\u0633\u062a\u0645\u062a\u0627\u0646 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f." + "@metadata": { + "authors": { + "0": "BMRG14", + "1": "Dalba", + "3": "ZxxZxxZ", + "4": "\u0627\u0644\u0646\u0627\u0632" + } + }, + "index.newPad": "\u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062a\u0627\u0632\u0647", + "index.createOpenPad": "\u06cc\u0627 \u0627\u06cc\u062c\u0627\u062f/\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0628\u0627 \u0646\u0627\u0645:", + "pad.toolbar.bold.title": "\u067e\u0631\u0631\u0646\u06af (Ctrl-B)", + "pad.toolbar.italic.title": "\u06a9\u062c (Ctrl-I)", + "pad.toolbar.underline.title": "\u0632\u06cc\u0631\u062e\u0637 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u062e\u0637 \u062e\u0648\u0631\u062f\u0647", + "pad.toolbar.ol.title": "\u0641\u0647\u0631\u0633\u062a \u0645\u0631\u062a\u0628 \u0634\u062f\u0647", + "pad.toolbar.ul.title": "\u0641\u0647\u0631\u0633\u062a \u0645\u0631\u062a\u0628 \u0646\u0634\u062f\u0647", + "pad.toolbar.indent.title": "\u062a\u0648\u0631\u0641\u062a\u06af\u06cc", + "pad.toolbar.unindent.title": "\u0628\u06cc\u0631\u0648\u0646 \u0631\u0641\u062a\u06af\u06cc", + "pad.toolbar.undo.title": "\u0628\u0627\u0637\u0644\u200c\u06a9\u0631\u062f\u0646 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0627\u0632 \u0646\u0648 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", + "pad.toolbar.import_export.title": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0632/\u0628\u0647 \u0642\u0627\u0644\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641", + "pad.toolbar.timeslider.title": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646", + "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u06cc \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc", + "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a", + "pad.toolbar.embed.title": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "pad.toolbar.showusers.title": "\u0646\u0645\u0627\u06cc\u0634 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "pad.colorpicker.save": "\u0630\u062e\u06cc\u0631\u0647", + "pad.colorpicker.cancel": "\u0644\u063a\u0648", + "pad.loading": "\u062f\u0631 \u062d\u0627\u0644 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc...", + "pad.passwordRequired": "\u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0646\u06cc\u0627\u0632 \u0628\u0647 \u06cc\u06a9 \u06af\u0630\u0631\u0648\u0627\u0698\u0647 \u062f\u0627\u0631\u06cc\u062f", + "pad.permissionDenied": "\u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647\u200c\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0631\u0627 \u0646\u062f\u0627\u0631\u06cc\u062f", + "pad.wrongPassword": "\u06af\u0630\u0631\u0648\u0627\u0698\u0647\u200c\u06cc \u0634\u0645\u0627 \u062f\u0631\u0633\u062a \u0646\u06cc\u0633\u062a", + "pad.settings.padSettings": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "pad.settings.myView": "\u0646\u0645\u0627\u06cc \u0645\u0646", + "pad.settings.stickychat": "\u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u06cc\u0634\u0647 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u0627\u0634\u062f", + "pad.settings.colorcheck": "\u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", + "pad.settings.linenocheck": "\u0634\u0645\u0627\u0631\u0647\u200c\u06cc \u062e\u0637\u0648\u0637", + "pad.settings.rtlcheck": "\u062e\u0648\u0627\u0646\u062f\u0646 \u0645\u062d\u062a\u0648\u0627 \u0627\u0632 \u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e\u061f", + "pad.settings.fontType": "\u0646\u0648\u0639 \u0642\u0644\u0645:", + "pad.settings.fontType.normal": "\u0633\u0627\u062f\u0647", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "\u0646\u0645\u0627\u06cc \u0633\u0631\u0627\u0633\u0631\u06cc", + "pad.settings.language": "\u0632\u0628\u0627\u0646:", + "pad.importExport.import_export": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc", + "pad.importExport.import": "\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647\u200c\u06cc \u0645\u062a\u0646\u06cc \u06cc\u0627 \u0633\u0646\u062f", + "pad.importExport.importSuccessful": "\u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0648\u062f!", + "pad.importExport.export": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0628\u0627 \u0642\u0627\u0644\u0628:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u0645\u062a\u0646 \u0633\u0627\u062f\u0647", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (\u0642\u0627\u0644\u0628 \u0633\u0646\u062f \u0628\u0627\u0632)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u0634\u0645\u0627 \u062a\u0646\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0642\u0627\u0644\u0628 \u0645\u062a\u0646 \u0633\u0627\u062f\u0647 \u06cc\u0627 \u0627\u0686\u200c\u062a\u06cc\u200c\u0627\u0645\u200c\u0627\u0644 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0634\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003EAbiWord\u003C/a\u003E \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.", + "pad.modals.connected": "\u0645\u062a\u0635\u0644 \u0634\u062f.", + "pad.modals.reconnecting": "\u062f\u0631 \u062d\u0627\u0644 \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0634\u0645\u0627..", + "pad.modals.forcereconnect": "\u0648\u0627\u062f\u0627\u0634\u062a\u0646 \u0628\u0647 \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647", + "pad.modals.userdup": "\u062f\u0631 \u067e\u0646\u062c\u0631\u0647\u200c\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0627\u0632 \u0634\u062f", + "pad.modals.userdup.explanation": "\u06af\u0645\u0627\u0646 \u0645\u06cc\u200c\u0631\u0648\u062f \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0631 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647\u200c\u06cc \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0627\u0632 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", + "pad.modals.userdup.advice": "\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u067e\u0646\u062c\u0631\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06cc\u062f.", + "pad.modals.unauth": "\u0645\u062c\u0627\u0632 \u0646\u06cc\u0633\u062a", + "pad.modals.unauth.explanation": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u0645\u0627 \u062f\u0631 \u062d\u06cc\u0646 \u0645\u0634\u0627\u0647\u062f\u0647\u200c\u06cc \u0627\u06cc\u0646 \u0628\u0631\u06af\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627\u0641\u062a\u0647\u200c\u0627\u0633\u062a. \u062f\u0648\u0628\u0627\u0631\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f.", + "pad.modals.looping": "\u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f.", + "pad.modals.looping.explanation": "\u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u0628\u0627 \u0633\u0631\u0648\u0631 \u0647\u0645\u06af\u0627\u0645\u200c\u0633\u0627\u0632\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.", + "pad.modals.looping.cause": "\u0634\u0627\u06cc\u062f \u0634\u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u06cc\u0627 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0646\u0627\u0633\u0627\u0632\u06af\u0627\u0631 \u0645\u062a\u0635\u0644 \u0634\u062f\u0647\u200c\u0627\u06cc\u062f.", + "pad.modals.initsocketfail": "\u0633\u0631\u0648\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u06cc\u0633\u062a.", + "pad.modals.initsocketfail.explanation": "\u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u0632\u06cc \u0648\u0635\u0644 \u0634\u062f.", + "pad.modals.initsocketfail.cause": "\u0634\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0628\u0647 \u062e\u0627\u0637\u0631 \u0645\u0634\u06a9\u0644\u06cc \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u06cc\u0627 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0634\u0645\u0627 \u0628\u0627\u0634\u062f.", + "pad.modals.slowcommit": "\u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f.", + "pad.modals.slowcommit.explanation": "\u0633\u0631\u0648\u0631 \u067e\u0627\u0633\u062e \u0646\u0645\u06cc\u200c\u062f\u0647\u062f.", + "pad.modals.slowcommit.cause": "\u0627\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u062e\u0627\u0637\u0631 \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u062f\u0631 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0634\u0628\u06a9\u0647 \u0628\u0627\u0634\u062f.", + "pad.modals.deleted": "\u067e\u0627\u06a9 \u0634\u062f.", + "pad.modals.deleted.explanation": "\u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u067e\u0627\u06a9 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", + "pad.modals.disconnected": "\u0627\u062a\u0635\u0627\u0644 \u0634\u0645\u0627 \u0642\u0637\u0639 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", + "pad.modals.disconnected.explanation": "\u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", + "pad.modals.disconnected.cause": "\u0633\u0631\u0648\u0631 \u0634\u0627\u06cc\u062f \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u0628\u0627\u0634\u062f. \u0627\u06af\u0631 \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0628\u0627\u0632 \u0647\u0645 \u0631\u062e \u062f\u0627\u062f \u0645\u0627 \u0631\u0627 \u0622\u06af\u0627\u0647 \u0633\u0627\u0632\u06cc\u062f.", + "pad.share": "\u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0631\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "pad.share.readonly": "\u0641\u0642\u0637 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc", + "pad.share.link": "\u067e\u06cc\u0648\u0646\u062f", + "pad.share.emebdcode": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0646\u0634\u0627\u0646\u06cc", + "pad.chat": "\u06af\u0641\u062a\u06af\u0648", + "pad.chat.title": "\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06af\u0641\u062a\u06af\u0648 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "pad.chat.loadmessages": "\u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631", + "timeslider.pageTitle": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646 {{appTitle}}", + "timeslider.toolbar.returnbutton": "\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", + "timeslider.toolbar.authors": "\u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u0627\u0646:", + "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0646\u0648\u06cc\u0633\u0646\u062f\u0647", + "timeslider.toolbar.exportlink.title": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc", + "timeslider.exportCurrent": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0646\u06af\u0627\u0631\u0634 \u06a9\u0646\u0648\u0646\u06cc \u0628\u0647 \u0639\u0646\u0648\u0627\u0646:", + "timeslider.version": "\u0646\u06af\u0627\u0631\u0634 {{version}}", + "timeslider.saved": "{{month}} {{day}}\u060c {{year}} \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u0698\u0627\u0646\u0648\u06cc\u0647", + "timeslider.month.february": "\u0641\u0628\u0631\u06cc\u0647", + "timeslider.month.march": "\u0645\u0627\u0631\u0686", + "timeslider.month.april": "\u0622\u067e\u0631\u06cc\u0644", + "timeslider.month.may": "\u0645\u06cc", + "timeslider.month.june": "\u0698\u0648\u0626\u0646", + "timeslider.month.july": "\u062c\u0648\u0644\u0627\u06cc", + "timeslider.month.august": "\u0622\u06af\u0648\u0633\u062a", + "timeslider.month.september": "\u0633\u067e\u062a\u0627\u0645\u0628\u0631", + "timeslider.month.october": "\u0627\u06a9\u062a\u0628\u0631", + "timeslider.month.november": "\u0646\u0648\u0627\u0645\u0628\u0631", + "timeslider.month.december": "\u062f\u0633\u0627\u0645\u0628\u0631", + "timeslider.unnamedauthor": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", + "timeslider.unnamedauthors": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", + "pad.savedrevs.marked": "\u0627\u06cc\u0646 \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc \u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0639\u0644\u0627\u0645\u062a\u200c\u06af\u0630\u0627\u0631\u06cc \u0634\u062f", + "pad.userlist.entername": "\u0646\u0627\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f", + "pad.userlist.unnamed": "\u0628\u062f\u0648\u0646 \u0646\u0627\u0645", + "pad.userlist.guest": "\u0645\u0647\u0645\u0627\u0646", + "pad.userlist.deny": "\u0631\u062f \u06a9\u0631\u062f\u0646", + "pad.userlist.approve": "\u067e\u0630\u06cc\u0631\u0641\u062a\u0646", + "pad.editbar.clearcolors": "\u0631\u0646\u06af \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc \u0627\u0632 \u0647\u0645\u0647\u200c\u06cc \u0633\u0646\u062f \u067e\u0627\u06a9 \u0634\u0648\u062f\u061f", + "pad.impexp.importbutton": "\u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646", + "pad.impexp.importing": "\u062f\u0631 \u062d\u0627\u0644 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc...", + "pad.impexp.confirmimport": "\u0628\u0627 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0646\u0648\u0634\u062a\u0647\u200c\u06cc \u06a9\u0646\u0648\u0646\u06cc \u062f\u0641\u062a\u0631\u0686\u0647 \u067e\u0627\u06a9 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0622\u06cc\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u062f\u061f", + "pad.impexp.convertFailed": "\u0645\u0627 \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u062e\u0648\u0627\u0647\u0634\u0645\u0646\u062f\u06cc\u0645 \u0642\u0627\u0644\u0628 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0633\u0646\u062f\u062a\u0627\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u06cc\u0627 \u0628\u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0622\u0646\u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f", + "pad.impexp.uploadFailed": "\u0622\u067e\u0644\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u0646\u0634\u062f\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u06a9\u0646\u06cc\u062f", + "pad.impexp.importfailed": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0646\u062c\u0627\u0645 \u0646\u0634\u062f", + "pad.impexp.copypaste": "\u06a9\u067e\u06cc \u067e\u06cc\u0633\u062a \u06a9\u0646\u06cc\u062f", + "pad.impexp.exportdisabled": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0628\u0627 \u0642\u0627\u0644\u0628 {{type}} \u0627\u0632 \u06a9\u0627\u0631 \u0627\u0641\u062a\u0627\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0628\u0627 \u0645\u062f\u06cc\u0631 \u0633\u06cc\u0633\u062a\u0645\u062a\u0627\u0646 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f." } \ No newline at end of file diff --git a/src/locales/fi.json b/src/locales/fi.json index 38190f14..2ed3dc59 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -1,126 +1,126 @@ { - "@metadata": { - "authors": { - "0": "Artnay", - "1": "Jl", - "2": "Nedergard", - "3": "Nike", - "5": "Veikk0.ma", - "6": "VezonThunder" - } - }, - "index.newPad": "Uusi muistio", - "index.createOpenPad": "tai luo tai avaa muistio nimell\u00e4:", - "pad.toolbar.bold.title": "Lihavointi (Ctrl-B)", - "pad.toolbar.italic.title": "Kursivointi (Ctrl-I)", - "pad.toolbar.underline.title": "Alleviivaus (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Yliviivaus", - "pad.toolbar.ol.title": "Numeroitu lista", - "pad.toolbar.ul.title": "Numeroimaton lista", - "pad.toolbar.indent.title": "Sisenn\u00e4", - "pad.toolbar.unindent.title": "Ulonna", - "pad.toolbar.undo.title": "Kumoa (Ctrl-Z)", - "pad.toolbar.redo.title": "Tee uudelleen (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Poista kirjoittajav\u00e4rit", - "pad.toolbar.import_export.title": "Tuo tai vie eri tiedostomuodoista tai -muotoihin", - "pad.toolbar.timeslider.title": "Aikajana", - "pad.toolbar.savedRevision.title": "Tallenna muutos", - "pad.toolbar.settings.title": "Asetukset", - "pad.toolbar.embed.title": "Upota muistio", - "pad.toolbar.showusers.title": "N\u00e4yt\u00e4 muistion k\u00e4ytt\u00e4j\u00e4t", - "pad.colorpicker.save": "Tallenna", - "pad.colorpicker.cancel": "Peruuta", - "pad.loading": "Ladataan\u2026", - "pad.passwordRequired": "T\u00e4m\u00e4 muistio on suojattu salasanalla.", - "pad.permissionDenied": "K\u00e4ytt\u00f6oikeutesi eiv\u00e4t riit\u00e4 t\u00e4m\u00e4n muistion k\u00e4ytt\u00e4miseen.", - "pad.wrongPassword": "V\u00e4\u00e4r\u00e4 salasana", - "pad.settings.padSettings": "Muistion asetukset", - "pad.settings.myView": "Oma n\u00e4kym\u00e4", - "pad.settings.stickychat": "Keskustelu aina n\u00e4kyviss\u00e4", - "pad.settings.colorcheck": "Kirjoittajav\u00e4rit", - "pad.settings.linenocheck": "Rivinumerot", - "pad.settings.rtlcheck": "Luetaanko sis\u00e4lt\u00f6 oikealta vasemmalle?", - "pad.settings.fontType": "Kirjasintyyppi:", - "pad.settings.fontType.normal": "normaali", - "pad.settings.fontType.monospaced": "tasalevyinen", - "pad.settings.globalView": "Yleisn\u00e4kym\u00e4", - "pad.settings.language": "Kieli:", - "pad.importExport.import_export": "Tuonti\/vienti", - "pad.importExport.import": "L\u00e4het\u00e4 mik\u00e4 tahansa tekstitiedosto tai asiakirja", - "pad.importExport.importSuccessful": "Onnistui!", - "pad.importExport.export": "Vie muistio muodossa:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Muotoilematon teksti", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Tuonti on tuettu vain HTML- ja raakatekstitiedostoista. Lis\u00e4tietoja tuonnin lis\u00e4asetuksista on sivulla install abiword<\/a>.", - "pad.modals.connected": "Yhdistetty.", - "pad.modals.reconnecting": "Muodostetaan yhteytt\u00e4 muistioon uudelleen...", - "pad.modals.forcereconnect": "Pakota yhdist\u00e4m\u00e4\u00e4n uudelleen", - "pad.modals.userdup": "Avattu toisessa ikkunassa", - "pad.modals.userdup.explanation": "T\u00e4m\u00e4 muistio vaikuttaa olevan avoinna useammassa eri selainikkunassa t\u00e4ll\u00e4 koneella.", - "pad.modals.userdup.advice": "Yhdist\u00e4 uudelleen, jos haluat k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 ikkunaa.", - "pad.modals.unauth": "Oikeudet eiv\u00e4t riit\u00e4", - "pad.modals.unauth.explanation": "K\u00e4ytt\u00f6oikeutesi ovat muuttuneet katsellessasi t\u00e4t\u00e4 sivua. Yrit\u00e4 yhdist\u00e4\u00e4 uudelleen.", - "pad.modals.looping": "Yhteys katkaistu.", - "pad.modals.looping.explanation": "Synkronointipalvelimen kanssa on yhteysongelmia.", - "pad.modals.looping.cause": "Yhteytesi on mahdollisesti muodostettu yhteensopimattoman palomuurin tai v\u00e4lityspalvelimen kautta.", - "pad.modals.initsocketfail": "Palvelimeen ei saada yhteytt\u00e4.", - "pad.modals.initsocketfail.explanation": "Synkronointipalvelimeen ei saatu yhteytt\u00e4.", - "pad.modals.initsocketfail.cause": "T\u00e4m\u00e4 johtuu mit\u00e4 luultavimmin selaimestasi tai verkkoyhteydest\u00e4si.", - "pad.modals.slowcommit": "Yhteys katkaistu.", - "pad.modals.slowcommit.explanation": "Palvelin ei vastaa.", - "pad.modals.slowcommit.cause": "T\u00e4m\u00e4 saattaa johtua verkkoyhteyden ongelmista.", - "pad.modals.deleted": "Poistettu.", - "pad.modals.deleted.explanation": "T\u00e4m\u00e4 muistio on poistettu.", - "pad.modals.disconnected": "Yhteytesi on katkaistu.", - "pad.modals.disconnected.explanation": "Yhteys palvelimeen katkesi", - "pad.modals.disconnected.cause": "Palvelin saattaa olla k\u00e4ytt\u00e4m\u00e4tt\u00f6miss\u00e4. Ilmoitathan meille, jos t\u00e4m\u00e4 ongelma toistuu.", - "pad.share": "Jaa muistio", - "pad.share.readonly": "Vain luku", - "pad.share.link": "Linkki", - "pad.share.emebdcode": "Upotusosoite", - "pad.chat": "Keskustelu", - "pad.chat.title": "Avaa keskustelu nykyisest\u00e4 muistiosta.", - "pad.chat.loadmessages": "Lataa lis\u00e4\u00e4 viestej\u00e4", - "timeslider.pageTitle": "{{appTitle}} -aikajana", - "timeslider.toolbar.returnbutton": "Palaa muistioon", - "timeslider.toolbar.authors": "Tekij\u00e4t:", - "timeslider.toolbar.authorsList": "Ei tekij\u00f6it\u00e4", - "timeslider.toolbar.exportlink.title": "Vie", - "timeslider.exportCurrent": "Vie nykyinen versio muodossa:", - "timeslider.version": "Versio {{version}}", - "timeslider.saved": "Tallennettu {{day}}. {{month}}ta {{year}}", - "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "tammikuu", - "timeslider.month.february": "helmikuu", - "timeslider.month.march": "maaliskuu", - "timeslider.month.april": "huhtikuu", - "timeslider.month.may": "toukokuu", - "timeslider.month.june": "kes\u00e4kuu", - "timeslider.month.july": "hein\u00e4kuu", - "timeslider.month.august": "elokuu", - "timeslider.month.september": "syyskuu", - "timeslider.month.october": "lokakuu", - "timeslider.month.november": "marraskuu", - "timeslider.month.december": "joulukuu", - "timeslider.unnamedauthor": "{{num}} nimet\u00f6n tekij\u00e4", - "timeslider.unnamedauthors": "{{num}} nimet\u00f6nt\u00e4 tekij\u00e4\u00e4", - "pad.savedrevs.marked": "T\u00e4m\u00e4 versio on nyt merkitty tallennetuksi versioksi", - "pad.userlist.entername": "Kirjoita nimesi", - "pad.userlist.unnamed": "nimet\u00f6n", - "pad.userlist.guest": "Vieras", - "pad.userlist.deny": "Est\u00e4", - "pad.userlist.approve": "Hyv\u00e4ksy", - "pad.editbar.clearcolors": "Poistetaanko asiakirjasta tekij\u00e4v\u00e4rit?", - "pad.impexp.importbutton": "Tuo nyt", - "pad.impexp.importing": "Tuodaan...", - "pad.impexp.confirmimport": "Tiedoston tuonti korvaa kaiken muistiossa olevan tekstin. Haluatko varmasti jatkaa?", - "pad.impexp.convertFailed": "TIedoston tuonti ep\u00e4onnistui. K\u00e4yt\u00e4 eri tiedostomuotoa tai kopioi ja liit\u00e4 k\u00e4sin.", - "pad.impexp.uploadFailed": "L\u00e4hetys ep\u00e4onnistui. Yrit\u00e4 uudelleen.", - "pad.impexp.importfailed": "Tuonti ep\u00e4onnistui", - "pad.impexp.copypaste": "Kopioi ja liit\u00e4", - "pad.impexp.exportdisabled": "Vienti muotoon \"{{type}}\" ei ole k\u00e4yt\u00f6ss\u00e4. Ota yhteys yll\u00e4pit\u00e4j\u00e4\u00e4n saadaksesi lis\u00e4tietoja." + "@metadata": { + "authors": { + "0": "Artnay", + "1": "Jl", + "2": "Nedergard", + "3": "Nike", + "5": "Veikk0.ma", + "6": "VezonThunder" + } + }, + "index.newPad": "Uusi muistio", + "index.createOpenPad": "tai luo tai avaa muistio nimell\u00e4:", + "pad.toolbar.bold.title": "Lihavointi (Ctrl-B)", + "pad.toolbar.italic.title": "Kursivointi (Ctrl-I)", + "pad.toolbar.underline.title": "Alleviivaus (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Yliviivaus", + "pad.toolbar.ol.title": "Numeroitu lista", + "pad.toolbar.ul.title": "Numeroimaton lista", + "pad.toolbar.indent.title": "Sisenn\u00e4", + "pad.toolbar.unindent.title": "Ulonna", + "pad.toolbar.undo.title": "Kumoa (Ctrl-Z)", + "pad.toolbar.redo.title": "Tee uudelleen (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Poista kirjoittajav\u00e4rit", + "pad.toolbar.import_export.title": "Tuo tai vie eri tiedostomuodoista tai -muotoihin", + "pad.toolbar.timeslider.title": "Aikajana", + "pad.toolbar.savedRevision.title": "Tallenna muutos", + "pad.toolbar.settings.title": "Asetukset", + "pad.toolbar.embed.title": "Upota muistio", + "pad.toolbar.showusers.title": "N\u00e4yt\u00e4 muistion k\u00e4ytt\u00e4j\u00e4t", + "pad.colorpicker.save": "Tallenna", + "pad.colorpicker.cancel": "Peruuta", + "pad.loading": "Ladataan\u2026", + "pad.passwordRequired": "T\u00e4m\u00e4 muistio on suojattu salasanalla.", + "pad.permissionDenied": "K\u00e4ytt\u00f6oikeutesi eiv\u00e4t riit\u00e4 t\u00e4m\u00e4n muistion k\u00e4ytt\u00e4miseen.", + "pad.wrongPassword": "V\u00e4\u00e4r\u00e4 salasana", + "pad.settings.padSettings": "Muistion asetukset", + "pad.settings.myView": "Oma n\u00e4kym\u00e4", + "pad.settings.stickychat": "Keskustelu aina n\u00e4kyviss\u00e4", + "pad.settings.colorcheck": "Kirjoittajav\u00e4rit", + "pad.settings.linenocheck": "Rivinumerot", + "pad.settings.rtlcheck": "Luetaanko sis\u00e4lt\u00f6 oikealta vasemmalle?", + "pad.settings.fontType": "Kirjasintyyppi:", + "pad.settings.fontType.normal": "normaali", + "pad.settings.fontType.monospaced": "tasalevyinen", + "pad.settings.globalView": "Yleisn\u00e4kym\u00e4", + "pad.settings.language": "Kieli:", + "pad.importExport.import_export": "Tuonti/vienti", + "pad.importExport.import": "L\u00e4het\u00e4 mik\u00e4 tahansa tekstitiedosto tai asiakirja", + "pad.importExport.importSuccessful": "Onnistui!", + "pad.importExport.export": "Vie muistio muodossa:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Muotoilematon teksti", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Tuonti on tuettu vain HTML- ja raakatekstitiedostoista. Lis\u00e4tietoja tuonnin lis\u00e4asetuksista on sivulla \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstall abiword\u003C/a\u003E.", + "pad.modals.connected": "Yhdistetty.", + "pad.modals.reconnecting": "Muodostetaan yhteytt\u00e4 muistioon uudelleen...", + "pad.modals.forcereconnect": "Pakota yhdist\u00e4m\u00e4\u00e4n uudelleen", + "pad.modals.userdup": "Avattu toisessa ikkunassa", + "pad.modals.userdup.explanation": "T\u00e4m\u00e4 muistio vaikuttaa olevan avoinna useammassa eri selainikkunassa t\u00e4ll\u00e4 koneella.", + "pad.modals.userdup.advice": "Yhdist\u00e4 uudelleen, jos haluat k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 ikkunaa.", + "pad.modals.unauth": "Oikeudet eiv\u00e4t riit\u00e4", + "pad.modals.unauth.explanation": "K\u00e4ytt\u00f6oikeutesi ovat muuttuneet katsellessasi t\u00e4t\u00e4 sivua. Yrit\u00e4 yhdist\u00e4\u00e4 uudelleen.", + "pad.modals.looping": "Yhteys katkaistu.", + "pad.modals.looping.explanation": "Synkronointipalvelimen kanssa on yhteysongelmia.", + "pad.modals.looping.cause": "Yhteytesi on mahdollisesti muodostettu yhteensopimattoman palomuurin tai v\u00e4lityspalvelimen kautta.", + "pad.modals.initsocketfail": "Palvelimeen ei saada yhteytt\u00e4.", + "pad.modals.initsocketfail.explanation": "Synkronointipalvelimeen ei saatu yhteytt\u00e4.", + "pad.modals.initsocketfail.cause": "T\u00e4m\u00e4 johtuu mit\u00e4 luultavimmin selaimestasi tai verkkoyhteydest\u00e4si.", + "pad.modals.slowcommit": "Yhteys katkaistu.", + "pad.modals.slowcommit.explanation": "Palvelin ei vastaa.", + "pad.modals.slowcommit.cause": "T\u00e4m\u00e4 saattaa johtua verkkoyhteyden ongelmista.", + "pad.modals.deleted": "Poistettu.", + "pad.modals.deleted.explanation": "T\u00e4m\u00e4 muistio on poistettu.", + "pad.modals.disconnected": "Yhteytesi on katkaistu.", + "pad.modals.disconnected.explanation": "Yhteys palvelimeen katkesi", + "pad.modals.disconnected.cause": "Palvelin saattaa olla k\u00e4ytt\u00e4m\u00e4tt\u00f6miss\u00e4. Ilmoitathan meille, jos t\u00e4m\u00e4 ongelma toistuu.", + "pad.share": "Jaa muistio", + "pad.share.readonly": "Vain luku", + "pad.share.link": "Linkki", + "pad.share.emebdcode": "Upotusosoite", + "pad.chat": "Keskustelu", + "pad.chat.title": "Avaa keskustelu nykyisest\u00e4 muistiosta.", + "pad.chat.loadmessages": "Lataa lis\u00e4\u00e4 viestej\u00e4", + "timeslider.pageTitle": "{{appTitle}} -aikajana", + "timeslider.toolbar.returnbutton": "Palaa muistioon", + "timeslider.toolbar.authors": "Tekij\u00e4t:", + "timeslider.toolbar.authorsList": "Ei tekij\u00f6it\u00e4", + "timeslider.toolbar.exportlink.title": "Vie", + "timeslider.exportCurrent": "Vie nykyinen versio muodossa:", + "timeslider.version": "Versio {{version}}", + "timeslider.saved": "Tallennettu {{day}}. {{month}}ta {{year}}", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "tammikuu", + "timeslider.month.february": "helmikuu", + "timeslider.month.march": "maaliskuu", + "timeslider.month.april": "huhtikuu", + "timeslider.month.may": "toukokuu", + "timeslider.month.june": "kes\u00e4kuu", + "timeslider.month.july": "hein\u00e4kuu", + "timeslider.month.august": "elokuu", + "timeslider.month.september": "syyskuu", + "timeslider.month.october": "lokakuu", + "timeslider.month.november": "marraskuu", + "timeslider.month.december": "joulukuu", + "timeslider.unnamedauthor": "{{num}} nimet\u00f6n tekij\u00e4", + "timeslider.unnamedauthors": "{{num}} nimet\u00f6nt\u00e4 tekij\u00e4\u00e4", + "pad.savedrevs.marked": "T\u00e4m\u00e4 versio on nyt merkitty tallennetuksi versioksi", + "pad.userlist.entername": "Kirjoita nimesi", + "pad.userlist.unnamed": "nimet\u00f6n", + "pad.userlist.guest": "Vieras", + "pad.userlist.deny": "Est\u00e4", + "pad.userlist.approve": "Hyv\u00e4ksy", + "pad.editbar.clearcolors": "Poistetaanko asiakirjasta tekij\u00e4v\u00e4rit?", + "pad.impexp.importbutton": "Tuo nyt", + "pad.impexp.importing": "Tuodaan...", + "pad.impexp.confirmimport": "Tiedoston tuonti korvaa kaiken muistiossa olevan tekstin. Haluatko varmasti jatkaa?", + "pad.impexp.convertFailed": "TIedoston tuonti ep\u00e4onnistui. K\u00e4yt\u00e4 eri tiedostomuotoa tai kopioi ja liit\u00e4 k\u00e4sin.", + "pad.impexp.uploadFailed": "L\u00e4hetys ep\u00e4onnistui. Yrit\u00e4 uudelleen.", + "pad.impexp.importfailed": "Tuonti ep\u00e4onnistui", + "pad.impexp.copypaste": "Kopioi ja liit\u00e4", + "pad.impexp.exportdisabled": "Vienti muotoon \"{{type}}\" ei ole k\u00e4yt\u00f6ss\u00e4. Ota yhteys yll\u00e4pit\u00e4j\u00e4\u00e4n saadaksesi lis\u00e4tietoja." } \ No newline at end of file diff --git a/src/locales/fr.json b/src/locales/fr.json index 6e1e79b4..e1c807d0 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1,130 +1,131 @@ { - "@metadata": { - "authors": { - "0": "Cquoi", - "1": "Crochet.david", - "2": "Gomoko", - "3": "Goofy", - "4": "Goofy-bz", - "5": "Jean-Fr\u00e9d\u00e9ric", - "6": "Leviathan", - "7": "McDutchie", - "8": "Od1n", - "10": "Tux-tn" - } - }, - "index.newPad": "Nouveau Pad", - "index.createOpenPad": "ou cr\u00e9er\/ouvrir un Pad intitul\u00e9 :", - "pad.toolbar.bold.title": "Gras (Ctrl-B)", - "pad.toolbar.italic.title": "Italique (Ctrl-I)", - "pad.toolbar.underline.title": "Soulign\u00e9 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Barr\u00e9", - "pad.toolbar.ol.title": "Liste ordonn\u00e9e", - "pad.toolbar.ul.title": "Liste \u00e0 puces", - "pad.toolbar.indent.title": "Indenter", - "pad.toolbar.unindent.title": "D\u00e9sindenter", - "pad.toolbar.undo.title": "Annuler (Ctrl-Z)", - "pad.toolbar.redo.title": "R\u00e9tablir (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Effacer les couleurs identifiant les auteurs", - "pad.toolbar.import_export.title": "Importer\/Exporter de\/vers un format de fichier diff\u00e9rent", - "pad.toolbar.timeslider.title": "Historique dynamique", - "pad.toolbar.savedRevision.title": "Enregistrer la r\u00e9vision", - "pad.toolbar.settings.title": "Param\u00e8tres", - "pad.toolbar.embed.title": "Int\u00e9grer ce Pad", - "pad.toolbar.showusers.title": "Afficher les utilisateurs du Pad", - "pad.colorpicker.save": "Enregistrer", - "pad.colorpicker.cancel": "Annuler", - "pad.loading": "Chargement\u2026", - "pad.passwordRequired": "Vous avez besoin d'un mot de passe pour acc\u00e9der \u00e0 ce Pad", - "pad.permissionDenied": "Il ne vous est pas permis d\u2019acc\u00e9der \u00e0 ce Pad", - "pad.wrongPassword": "Mot de passe incorrect", - "pad.settings.padSettings": "Param\u00e8tres du Pad", - "pad.settings.myView": "Ma vue", - "pad.settings.stickychat": "Toujours afficher le chat", - "pad.settings.colorcheck": "Couleurs d\u2019identification", - "pad.settings.linenocheck": "Num\u00e9ros de lignes", - "pad.settings.rtlcheck": "Lire le contenu de la droite vers la gauche?", - "pad.settings.fontType": "Type de police :", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Vue d\u2019ensemble", - "pad.settings.language": "Langue :", - "pad.importExport.import_export": "Importer\/Exporter", - "pad.importExport.import": "Charger un texte ou un document", - "pad.importExport.importSuccessful": "R\u00e9ussi!", - "pad.importExport.export": "Exporter le Pad actuel comme :", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Texte brut", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalit\u00e9s d'importation plus \u00e9volu\u00e9es, veuillez installer abiword<\/a>.", - "pad.modals.connected": "Connect\u00e9.", - "pad.modals.reconnecting": "Reconnexion vers votre Pad...", - "pad.modals.forcereconnect": "Forcer la reconnexion.", - "pad.modals.userdup": "Ouvert dans une autre fen\u00eatre", - "pad.modals.userdup.explanation": "Il semble que ce Pad soit ouvert dans plusieurs fen\u00eatres de votre navigateur sur cet ordinateur.", - "pad.modals.userdup.advice": "Se reconnecter en utilisant cette fen\u00eatre.", - "pad.modals.unauth": "Non autoris\u00e9", - "pad.modals.unauth.explanation": "Vos permissions ont \u00e9t\u00e9 chang\u00e9es lors de l'affichage de cette page. Essayez de vous reconnecter.", - "pad.modals.looping": "D\u00e9connect\u00e9.", - "pad.modals.looping.explanation": "Nous \u00e9prouvons un probl\u00e8me de communication au serveur de synchronisation.", - "pad.modals.looping.cause": "Il est possible que votre connexion soit prot\u00e9g\u00e9e par un pare-feu incompatible ou un serveur proxy incompatible.", - "pad.modals.initsocketfail": "Le serveur est introuvable.", - "pad.modals.initsocketfail.explanation": "Impossible de se connecter au serveur de synchronisation.", - "pad.modals.initsocketfail.cause": "Le probl\u00e8me peut venir de votre navigateur web ou de votre connexion Internet.", - "pad.modals.slowcommit": "D\u00e9connect\u00e9.", - "pad.modals.slowcommit.explanation": "Le serveur ne r\u00e9pond pas.", - "pad.modals.slowcommit.cause": "Ce probl\u00e8me peut venir d'une mauvaise connectivit\u00e9 au r\u00e9seau.", - "pad.modals.deleted": "Supprim\u00e9.", - "pad.modals.deleted.explanation": "Ce Pad a \u00e9t\u00e9 supprim\u00e9.", - "pad.modals.disconnected": "Vous avez \u00e9t\u00e9 d\u00e9connect\u00e9.", - "pad.modals.disconnected.explanation": "La connexion au serveur a \u00e9chou\u00e9.", - "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Veuillez nous en informer si le probl\u00e8me persiste.", - "pad.share": "Partager ce Pad", - "pad.share.readonly": "Lecture seule", - "pad.share.link": "Lien", - "pad.share.emebdcode": "Lien \u00e0 int\u00e9grer", - "pad.chat": "Chat", - "pad.chat.title": "Ouvrir le chat associ\u00e9 \u00e0 ce pad.", - "pad.chat.loadmessages": "Charger davantage de messages", - "timeslider.pageTitle": "Historique dynamique de {{appTitle}}", - "timeslider.toolbar.returnbutton": "Retour \u00e0 ce Pad.", - "timeslider.toolbar.authors": "Auteurs :", - "timeslider.toolbar.authorsList": "Aucun auteur", - "timeslider.toolbar.exportlink.title": "Exporter", - "timeslider.exportCurrent": "Exporter la version actuelle en\u00a0:", - "timeslider.version": "Version {{version}}", - "timeslider.saved": "Enregistr\u00e9 le {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{secondes}}", - "timeslider.month.january": "Janvier", - "timeslider.month.february": "F\u00e9vrier", - "timeslider.month.march": "Mars", - "timeslider.month.april": "Avril", - "timeslider.month.may": "Mai", - "timeslider.month.june": "Juin", - "timeslider.month.july": "Juillet", - "timeslider.month.august": "Ao\u00fbt", - "timeslider.month.september": "Septembre", - "timeslider.month.october": "Octobre", - "timeslider.month.november": "Novembre", - "timeslider.month.december": "D\u00e9cembre", - "timeslider.unnamedauthor": "{{num}} auteur anonyme", - "timeslider.unnamedauthors": "{{num}} auteurs anonymes", - "pad.savedrevs.marked": "Cette r\u00e9vision est maintenant marqu\u00e9e comme r\u00e9vision enregistr\u00e9e", - "pad.userlist.entername": "Entrez votre nom", - "pad.userlist.unnamed": "sans nom", - "pad.userlist.guest": "Invit\u00e9", - "pad.userlist.deny": "Refuser", - "pad.userlist.approve": "Approuver", - "pad.editbar.clearcolors": "Effacer les couleurs de paternit\u00e9 dans tout le document ?", - "pad.impexp.importbutton": "Importer maintenant", - "pad.impexp.importing": "Import en cours...", - "pad.impexp.confirmimport": "Importer un fichier \u00e9crasera le texte actuel du bloc. \u00cates-vous s\u00fbr 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.uploadFailed": "Le t\u00e9l\u00e9chargement a \u00e9chou\u00e9, veuillez r\u00e9essayer", - "pad.impexp.importfailed": "\u00c9chec de l'importation", - "pad.impexp.copypaste": "Veuillez copier\/coller", - "pad.impexp.exportdisabled": "Exporter au format {{type}} est d\u00e9sactiv\u00e9. Veuillez contacter votre administrateur syst\u00e8me pour plus de d\u00e9tails." + "@metadata": { + "authors": { + "0": "Cquoi", + "1": "Crochet.david", + "2": "Gomoko", + "3": "Goofy", + "4": "Goofy-bz", + "5": "Jean-Fr\u00e9d\u00e9ric", + "6": "Leviathan", + "7": "McDutchie", + "8": "Od1n", + "9": "Peter17", + "11": "Tux-tn" + } + }, + "index.newPad": "Nouveau Pad", + "index.createOpenPad": "ou cr\u00e9er/ouvrir un Pad intitul\u00e9 :", + "pad.toolbar.bold.title": "Gras (Ctrl-B)", + "pad.toolbar.italic.title": "Italique (Ctrl-I)", + "pad.toolbar.underline.title": "Soulign\u00e9 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Barr\u00e9", + "pad.toolbar.ol.title": "Liste ordonn\u00e9e", + "pad.toolbar.ul.title": "Liste \u00e0 puces", + "pad.toolbar.indent.title": "Indenter", + "pad.toolbar.unindent.title": "D\u00e9sindenter", + "pad.toolbar.undo.title": "Annuler (Ctrl-Z)", + "pad.toolbar.redo.title": "R\u00e9tablir (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Effacer les couleurs identifiant les auteurs", + "pad.toolbar.import_export.title": "Importer/Exporter de/vers un format de fichier diff\u00e9rent", + "pad.toolbar.timeslider.title": "Historique dynamique", + "pad.toolbar.savedRevision.title": "Enregistrer la r\u00e9vision", + "pad.toolbar.settings.title": "Param\u00e8tres", + "pad.toolbar.embed.title": "Int\u00e9grer ce Pad", + "pad.toolbar.showusers.title": "Afficher les utilisateurs du Pad", + "pad.colorpicker.save": "Enregistrer", + "pad.colorpicker.cancel": "Annuler", + "pad.loading": "Chargement\u2026", + "pad.passwordRequired": "Vous avez besoin d'un mot de passe pour acc\u00e9der \u00e0 ce Pad", + "pad.permissionDenied": "Il ne vous est pas permis d\u2019acc\u00e9der \u00e0 ce Pad", + "pad.wrongPassword": "Mot de passe incorrect", + "pad.settings.padSettings": "Param\u00e8tres du Pad", + "pad.settings.myView": "Ma vue", + "pad.settings.stickychat": "Toujours afficher le chat", + "pad.settings.colorcheck": "Couleurs d\u2019identification", + "pad.settings.linenocheck": "Num\u00e9ros de lignes", + "pad.settings.rtlcheck": "Lire le contenu de la droite vers la gauche ?", + "pad.settings.fontType": "Type de police :", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Vue d\u2019ensemble", + "pad.settings.language": "Langue :", + "pad.importExport.import_export": "Importer/Exporter", + "pad.importExport.import": "Charger un texte ou un document", + "pad.importExport.importSuccessful": "R\u00e9ussi!", + "pad.importExport.export": "Exporter le Pad actuel comme :", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Texte brut", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalit\u00e9s d'importation plus \u00e9volu\u00e9es, veuillez \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstaller abiword\u003C/a\u003E.", + "pad.modals.connected": "Connect\u00e9.", + "pad.modals.reconnecting": "Reconnexion vers votre Pad...", + "pad.modals.forcereconnect": "Forcer la reconnexion.", + "pad.modals.userdup": "Ouvert dans une autre fen\u00eatre", + "pad.modals.userdup.explanation": "Il semble que ce Pad soit ouvert dans plusieurs fen\u00eatres de votre navigateur sur cet ordinateur.", + "pad.modals.userdup.advice": "Se reconnecter en utilisant cette fen\u00eatre.", + "pad.modals.unauth": "Non autoris\u00e9", + "pad.modals.unauth.explanation": "Vos permissions ont \u00e9t\u00e9 chang\u00e9es lors de l'affichage de cette page. Essayez de vous reconnecter.", + "pad.modals.looping": "D\u00e9connect\u00e9.", + "pad.modals.looping.explanation": "Nous \u00e9prouvons un probl\u00e8me de communication au serveur de synchronisation.", + "pad.modals.looping.cause": "Il est possible que votre connexion soit prot\u00e9g\u00e9e par un pare-feu incompatible ou un serveur proxy incompatible.", + "pad.modals.initsocketfail": "Le serveur est introuvable.", + "pad.modals.initsocketfail.explanation": "Impossible de se connecter au serveur de synchronisation.", + "pad.modals.initsocketfail.cause": "Le probl\u00e8me peut venir de votre navigateur web ou de votre connexion Internet.", + "pad.modals.slowcommit": "D\u00e9connect\u00e9.", + "pad.modals.slowcommit.explanation": "Le serveur ne r\u00e9pond pas.", + "pad.modals.slowcommit.cause": "Ce probl\u00e8me peut venir d'une mauvaise connectivit\u00e9 au r\u00e9seau.", + "pad.modals.deleted": "Supprim\u00e9.", + "pad.modals.deleted.explanation": "Ce Pad a \u00e9t\u00e9 supprim\u00e9.", + "pad.modals.disconnected": "Vous avez \u00e9t\u00e9 d\u00e9connect\u00e9.", + "pad.modals.disconnected.explanation": "La connexion au serveur a \u00e9chou\u00e9.", + "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Veuillez nous en informer si le probl\u00e8me persiste.", + "pad.share": "Partager ce Pad", + "pad.share.readonly": "Lecture seule", + "pad.share.link": "Lien", + "pad.share.emebdcode": "Lien \u00e0 int\u00e9grer", + "pad.chat": "Chat", + "pad.chat.title": "Ouvrir le chat associ\u00e9 \u00e0 ce pad.", + "pad.chat.loadmessages": "Charger davantage de messages", + "timeslider.pageTitle": "Historique dynamique de {{appTitle}}", + "timeslider.toolbar.returnbutton": "Retour \u00e0 ce Pad.", + "timeslider.toolbar.authors": "Auteurs :", + "timeslider.toolbar.authorsList": "Aucun auteur", + "timeslider.toolbar.exportlink.title": "Exporter", + "timeslider.exportCurrent": "Exporter la version actuelle en\u00a0:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Enregistr\u00e9 le {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{secondes}}", + "timeslider.month.january": "Janvier", + "timeslider.month.february": "F\u00e9vrier", + "timeslider.month.march": "Mars", + "timeslider.month.april": "Avril", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juin", + "timeslider.month.july": "Juillet", + "timeslider.month.august": "Ao\u00fbt", + "timeslider.month.september": "Septembre", + "timeslider.month.october": "Octobre", + "timeslider.month.november": "Novembre", + "timeslider.month.december": "D\u00e9cembre", + "timeslider.unnamedauthor": "{{num}} auteur anonyme", + "timeslider.unnamedauthors": "{{num}} auteurs anonymes", + "pad.savedrevs.marked": "Cette r\u00e9vision est maintenant marqu\u00e9e comme r\u00e9vision enregistr\u00e9e", + "pad.userlist.entername": "Entrez votre nom", + "pad.userlist.unnamed": "sans nom", + "pad.userlist.guest": "Invit\u00e9", + "pad.userlist.deny": "Refuser", + "pad.userlist.approve": "Approuver", + "pad.editbar.clearcolors": "Effacer les couleurs de paternit\u00e9 dans tout le document ?", + "pad.impexp.importbutton": "Importer maintenant", + "pad.impexp.importing": "Import en cours...", + "pad.impexp.confirmimport": "Importer un fichier \u00e9crasera le texte actuel du bloc. \u00cates-vous s\u00fbr 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.uploadFailed": "Le t\u00e9l\u00e9chargement a \u00e9chou\u00e9, veuillez r\u00e9essayer", + "pad.impexp.importfailed": "\u00c9chec de l'importation", + "pad.impexp.copypaste": "Veuillez copier/coller", + "pad.impexp.exportdisabled": "Exporter au format {{type}} est d\u00e9sactiv\u00e9. Veuillez contacter votre administrateur syst\u00e8me pour plus de d\u00e9tails." } \ No newline at end of file diff --git a/src/locales/gl.json b/src/locales/gl.json index 6b9c2b54..dc5d640c 100644 --- a/src/locales/gl.json +++ b/src/locales/gl.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": { - "1": "Toli\u00f1o" - } - }, - "index.newPad": "Novo documento", - "index.createOpenPad": "ou cree\/abra un documento co nome:", - "pad.toolbar.bold.title": "Negra (Ctrl-B)", - "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Subli\u00f1ar (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Riscar", - "pad.toolbar.ol.title": "Lista ordenada", - "pad.toolbar.ul.title": "Lista sen ordenar", - "pad.toolbar.indent.title": "Sangr\u00eda", - "pad.toolbar.unindent.title": "Sen sangr\u00eda", - "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", - "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificaci\u00f3n dos autores", - "pad.toolbar.import_export.title": "Importar\/Exportar desde\/a diferentes formatos de ficheiro", - "pad.toolbar.timeslider.title": "Li\u00f1a do tempo", - "pad.toolbar.savedRevision.title": "Gardar a revisi\u00f3n", - "pad.toolbar.settings.title": "Configuraci\u00f3ns", - "pad.toolbar.embed.title": "Incorporar este documento", - "pad.toolbar.showusers.title": "Mostrar os usuarios deste documento", - "pad.colorpicker.save": "Gardar", - "pad.colorpicker.cancel": "Cancelar", - "pad.loading": "Cargando...", - "pad.passwordRequired": "C\u00f3mpre un contrasinal para acceder a este documento", - "pad.permissionDenied": "Non ten permiso para acceder a este documento", - "pad.wrongPassword": "O contrasinal era incorrecto", - "pad.settings.padSettings": "Configuraci\u00f3ns do documento", - "pad.settings.myView": "A mi\u00f1a vista", - "pad.settings.stickychat": "Chat sempre visible", - "pad.settings.colorcheck": "Cores de identificaci\u00f3n", - "pad.settings.linenocheck": "N\u00fameros de li\u00f1a", - "pad.settings.rtlcheck": "Quere ler o contido da dereita \u00e1 esquerda?", - "pad.settings.fontType": "Tipo de letra:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespazada", - "pad.settings.globalView": "Vista global", - "pad.settings.language": "Lingua:", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Cargar un ficheiro de texto ou documento", - "pad.importExport.importSuccessful": "Correcto!", - "pad.importExport.export": "Exportar o documento actual en formato:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Texto simple", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "S\u00f3 pode importar texto simple ou formatos HTML. Para obter m\u00e1is informaci\u00f3n sobre as caracter\u00edsticas de importaci\u00f3n avanzadas instale abiword<\/a>.", - "pad.modals.connected": "Conectado.", - "pad.modals.reconnecting": "Reconectando co seu documento...", - "pad.modals.forcereconnect": "Forzar a reconexi\u00f3n", - "pad.modals.userdup": "Aberto noutra vent\u00e1", - "pad.modals.userdup.explanation": "Semella que este documento est\u00e1 aberto en varias vent\u00e1s do navegador neste ordenador.", - "pad.modals.userdup.advice": "Reconectar para usar esta vent\u00e1.", - "pad.modals.unauth": "Non autorizado", - "pad.modals.unauth.explanation": "Os seus permisos cambiaron mentres estaba nesta p\u00e1xina. Intente a reconexi\u00f3n.", - "pad.modals.looping": "Desconectado.", - "pad.modals.looping.explanation": "Hai un problema de comunicaci\u00f3n co servidor de sincronizaci\u00f3n.", - "pad.modals.looping.cause": "Seica a s\u00faa conexi\u00f3n pasa a trav\u00e9s dun firewall ou proxy incompatible.", - "pad.modals.initsocketfail": "Non se pode alcanzar o servidor.", - "pad.modals.initsocketfail.explanation": "Non se pode conectar co servidor de sincronizaci\u00f3n.", - "pad.modals.initsocketfail.cause": "Isto acontece probablemente debido a un problema co navegador ou coa conexi\u00f3n \u00e1 internet.", - "pad.modals.slowcommit": "Desconectado.", - "pad.modals.slowcommit.explanation": "O servidor non responde.", - "pad.modals.slowcommit.cause": "Isto pode deberse a un problema de conexi\u00f3n \u00e1 rede.", - "pad.modals.deleted": "Borrado.", - "pad.modals.deleted.explanation": "Este documento foi eliminado.", - "pad.modals.disconnected": "Foi desconectado.", - "pad.modals.disconnected.explanation": "Perdeuse a conexi\u00f3n co servidor", - "pad.modals.disconnected.cause": "O servidor non est\u00e1 dispo\u00f1ible. P\u00f3\u00f1ase en contacto con n\u00f3s se o problema contin\u00faa.", - "pad.share": "Compartir este documento", - "pad.share.readonly": "Lectura s\u00f3", - "pad.share.link": "Ligaz\u00f3n", - "pad.share.emebdcode": "Incorporar o URL", - "pad.chat": "Chat", - "pad.chat.title": "Abrir o chat deste documento.", - "pad.chat.loadmessages": "Cargar m\u00e1is mensaxes", - "timeslider.pageTitle": "Li\u00f1a do tempo de {{appTitle}}", - "timeslider.toolbar.returnbutton": "Volver ao documento", - "timeslider.toolbar.authors": "Autores:", - "timeslider.toolbar.authorsList": "Ning\u00fan autor", - "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar a versi\u00f3n actual en formato:", - "timeslider.version": "Versi\u00f3n {{version}}", - "timeslider.saved": "Gardado o {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "xaneiro", - "timeslider.month.february": "febreiro", - "timeslider.month.march": "marzo", - "timeslider.month.april": "abril", - "timeslider.month.may": "maio", - "timeslider.month.june": "xu\u00f1o", - "timeslider.month.july": "xullo", - "timeslider.month.august": "agosto", - "timeslider.month.september": "setembro", - "timeslider.month.october": "outubro", - "timeslider.month.november": "novembro", - "timeslider.month.december": "decembro", - "timeslider.unnamedauthor": "{{num}} autor an\u00f3nimo", - "timeslider.unnamedauthors": "{{num}} autores an\u00f3nimos", - "pad.savedrevs.marked": "Esta revisi\u00f3n est\u00e1 agora marcada como revisi\u00f3n gardada", - "pad.userlist.entername": "Insira o seu nome", - "pad.userlist.unnamed": "an\u00f3nimo", - "pad.userlist.guest": "Convidado", - "pad.userlist.deny": "Rexeitar", - "pad.userlist.approve": "Aprobar", - "pad.editbar.clearcolors": "Quere limpar as cores de identificaci\u00f3n dos autores en todo o documento?", - "pad.impexp.importbutton": "Importar agora", - "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "A importaci\u00f3n dun ficheiro ha sobrescribir o texto actual do documento. Est\u00e1 seguro de querer continuar?", - "pad.impexp.convertFailed": "Non somos capaces de importar o ficheiro. Utilice un formato de documento diferente ou copie e pegue manualmente", - "pad.impexp.uploadFailed": "Houbo un erro ao cargar o ficheiro; int\u00e9nteo de novo", - "pad.impexp.importfailed": "Fallou a importaci\u00f3n", - "pad.impexp.copypaste": "Copie e pegue", - "pad.impexp.exportdisabled": "A exportaci\u00f3n en formato {{type}} est\u00e1 desactivada. P\u00f3\u00f1ase en contacto co administrador do sistema se quere m\u00e1is detalles." + "@metadata": { + "authors": { + "1": "Toli\u00f1o" + } + }, + "index.newPad": "Novo documento", + "index.createOpenPad": "ou cree/abra un documento co nome:", + "pad.toolbar.bold.title": "Negra (Ctrl-B)", + "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", + "pad.toolbar.underline.title": "Subli\u00f1ar (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Riscar", + "pad.toolbar.ol.title": "Lista ordenada", + "pad.toolbar.ul.title": "Lista sen ordenar", + "pad.toolbar.indent.title": "Sangr\u00eda", + "pad.toolbar.unindent.title": "Sen sangr\u00eda", + "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", + "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificaci\u00f3n dos autores", + "pad.toolbar.import_export.title": "Importar/Exportar desde/a diferentes formatos de ficheiro", + "pad.toolbar.timeslider.title": "Li\u00f1a do tempo", + "pad.toolbar.savedRevision.title": "Gardar a revisi\u00f3n", + "pad.toolbar.settings.title": "Configuraci\u00f3ns", + "pad.toolbar.embed.title": "Incorporar este documento", + "pad.toolbar.showusers.title": "Mostrar os usuarios deste documento", + "pad.colorpicker.save": "Gardar", + "pad.colorpicker.cancel": "Cancelar", + "pad.loading": "Cargando...", + "pad.passwordRequired": "C\u00f3mpre un contrasinal para acceder a este documento", + "pad.permissionDenied": "Non ten permiso para acceder a este documento", + "pad.wrongPassword": "O contrasinal era incorrecto", + "pad.settings.padSettings": "Configuraci\u00f3ns do documento", + "pad.settings.myView": "A mi\u00f1a vista", + "pad.settings.stickychat": "Chat sempre visible", + "pad.settings.colorcheck": "Cores de identificaci\u00f3n", + "pad.settings.linenocheck": "N\u00fameros de li\u00f1a", + "pad.settings.rtlcheck": "Quere ler o contido da dereita \u00e1 esquerda?", + "pad.settings.fontType": "Tipo de letra:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monoespazada", + "pad.settings.globalView": "Vista global", + "pad.settings.language": "Lingua:", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Cargar un ficheiro de texto ou documento", + "pad.importExport.importSuccessful": "Correcto!", + "pad.importExport.export": "Exportar o documento actual en formato:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Texto simple", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "S\u00f3 pode importar texto simple ou formatos HTML. Para obter m\u00e1is informaci\u00f3n sobre as caracter\u00edsticas de importaci\u00f3n avanzadas \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstale abiword\u003C/a\u003E.", + "pad.modals.connected": "Conectado.", + "pad.modals.reconnecting": "Reconectando co seu documento...", + "pad.modals.forcereconnect": "Forzar a reconexi\u00f3n", + "pad.modals.userdup": "Aberto noutra vent\u00e1", + "pad.modals.userdup.explanation": "Semella que este documento est\u00e1 aberto en varias vent\u00e1s do navegador neste ordenador.", + "pad.modals.userdup.advice": "Reconectar para usar esta vent\u00e1.", + "pad.modals.unauth": "Non autorizado", + "pad.modals.unauth.explanation": "Os seus permisos cambiaron mentres estaba nesta p\u00e1xina. Intente a reconexi\u00f3n.", + "pad.modals.looping": "Desconectado.", + "pad.modals.looping.explanation": "Hai un problema de comunicaci\u00f3n co servidor de sincronizaci\u00f3n.", + "pad.modals.looping.cause": "Seica a s\u00faa conexi\u00f3n pasa a trav\u00e9s dun firewall ou proxy incompatible.", + "pad.modals.initsocketfail": "Non se pode alcanzar o servidor.", + "pad.modals.initsocketfail.explanation": "Non se pode conectar co servidor de sincronizaci\u00f3n.", + "pad.modals.initsocketfail.cause": "Isto acontece probablemente debido a un problema co navegador ou coa conexi\u00f3n \u00e1 internet.", + "pad.modals.slowcommit": "Desconectado.", + "pad.modals.slowcommit.explanation": "O servidor non responde.", + "pad.modals.slowcommit.cause": "Isto pode deberse a un problema de conexi\u00f3n \u00e1 rede.", + "pad.modals.deleted": "Borrado.", + "pad.modals.deleted.explanation": "Este documento foi eliminado.", + "pad.modals.disconnected": "Foi desconectado.", + "pad.modals.disconnected.explanation": "Perdeuse a conexi\u00f3n co servidor", + "pad.modals.disconnected.cause": "O servidor non est\u00e1 dispo\u00f1ible. P\u00f3\u00f1ase en contacto con n\u00f3s se o problema contin\u00faa.", + "pad.share": "Compartir este documento", + "pad.share.readonly": "Lectura s\u00f3", + "pad.share.link": "Ligaz\u00f3n", + "pad.share.emebdcode": "Incorporar o URL", + "pad.chat": "Chat", + "pad.chat.title": "Abrir o chat deste documento.", + "pad.chat.loadmessages": "Cargar m\u00e1is mensaxes", + "timeslider.pageTitle": "Li\u00f1a do tempo de {{appTitle}}", + "timeslider.toolbar.returnbutton": "Volver ao documento", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Ning\u00fan autor", + "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar a versi\u00f3n actual en formato:", + "timeslider.version": "Versi\u00f3n {{version}}", + "timeslider.saved": "Gardado o {{day}} de {{month}} de {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "xaneiro", + "timeslider.month.february": "febreiro", + "timeslider.month.march": "marzo", + "timeslider.month.april": "abril", + "timeslider.month.may": "maio", + "timeslider.month.june": "xu\u00f1o", + "timeslider.month.july": "xullo", + "timeslider.month.august": "agosto", + "timeslider.month.september": "setembro", + "timeslider.month.october": "outubro", + "timeslider.month.november": "novembro", + "timeslider.month.december": "decembro", + "timeslider.unnamedauthor": "{{num}} autor an\u00f3nimo", + "timeslider.unnamedauthors": "{{num}} autores an\u00f3nimos", + "pad.savedrevs.marked": "Esta revisi\u00f3n est\u00e1 agora marcada como revisi\u00f3n gardada", + "pad.userlist.entername": "Insira o seu nome", + "pad.userlist.unnamed": "an\u00f3nimo", + "pad.userlist.guest": "Convidado", + "pad.userlist.deny": "Rexeitar", + "pad.userlist.approve": "Aprobar", + "pad.editbar.clearcolors": "Quere limpar as cores de identificaci\u00f3n dos autores en todo o documento?", + "pad.impexp.importbutton": "Importar agora", + "pad.impexp.importing": "Importando...", + "pad.impexp.confirmimport": "A importaci\u00f3n dun ficheiro ha sobrescribir o texto actual do documento. Est\u00e1 seguro de querer continuar?", + "pad.impexp.convertFailed": "Non somos capaces de importar o ficheiro. Utilice un formato de documento diferente ou copie e pegue manualmente", + "pad.impexp.uploadFailed": "Houbo un erro ao cargar o ficheiro; int\u00e9nteo de novo", + "pad.impexp.importfailed": "Fallou a importaci\u00f3n", + "pad.impexp.copypaste": "Copie e pegue", + "pad.impexp.exportdisabled": "A exportaci\u00f3n en formato {{type}} est\u00e1 desactivada. P\u00f3\u00f1ase en contacto co administrador do sistema se quere m\u00e1is detalles." } \ No newline at end of file diff --git a/src/locales/he.json b/src/locales/he.json index 77e68e63..92b30e9f 100644 --- a/src/locales/he.json +++ b/src/locales/he.json @@ -1,122 +1,123 @@ { - "@metadata": { - "authors": [ - "Amire80", - "Ofrahod" - ] - }, - "index.newPad": "\u05e4\u05e0\u05e7\u05e1 \u05d7\u05d3\u05e9", - "index.createOpenPad": "\u05d0\u05d5 \u05d9\u05e6\u05d9\u05e8\u05d4 \u05d0\u05d5 \u05e4\u05ea\u05d9\u05d7\u05d4 \u05e9\u05dc \u05e4\u05e0\u05e7\u05e1 \u05e2\u05dd \u05d1\u05e9\u05dd:", - "pad.toolbar.bold.title": "\u05d1\u05d5\u05dc\u05d8 (Ctrl-B)", - "pad.toolbar.italic.title": "\u05e0\u05d8\u05d5\u05d9 (Ctrl-I)", - "pad.toolbar.underline.title": "\u05e7\u05d5 \u05ea\u05d7\u05ea\u05d9 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u05e7\u05d5 \u05de\u05d5\u05d7\u05e7", - "pad.toolbar.ol.title": "\u05e8\u05e9\u05d9\u05de\u05d4 \u05de\u05de\u05d5\u05e1\u05e4\u05e8\u05ea", - "pad.toolbar.ul.title": "\u05e8\u05e9\u05d9\u05de\u05d4", - "pad.toolbar.indent.title": "\u05d4\u05d6\u05d7\u05d4", - "pad.toolbar.unindent.title": "\u05e6\u05de\u05e6\u05d5\u05dd \u05d4\u05d6\u05d7\u05d4", - "pad.toolbar.undo.title": "\u05d1\u05d9\u05d8\u05d5\u05dc (Ctrl-Z)", - "pad.toolbar.redo.title": "\u05d1\u05d9\u05e6\u05d5\u05e2 \u05de\u05d7\u05d3\u05e9", - "pad.toolbar.clearAuthorship.title": "\u05e0\u05d9\u05e7\u05d5\u05d9 \u05e6\u05d1\u05e2\u05d9\u05dd", - "pad.toolbar.import_export.title": "\u05d9\u05d9\u05d1\u05d5\u05d0\/\u05d9\u05d9\u05e6\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8\u05d9 \u05e7\u05d1\u05e6\u05d9\u05dd \u05e9\u05d5\u05e0\u05d9\u05dd", - "pad.toolbar.timeslider.title": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df", - "pad.toolbar.savedRevision.title": "\u05e9\u05de\u05d9\u05e8\u05ea \u05d2\u05e8\u05e1\u05d4", - "pad.toolbar.settings.title": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", - "pad.toolbar.embed.title": "\u05d4\u05d8\u05de\u05e2\u05ea \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.toolbar.showusers.title": "\u05d4\u05e6\u05d2\u05ea \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.colorpicker.save": "\u05e9\u05de\u05d9\u05e8\u05d4", - "pad.colorpicker.cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", - "pad.loading": "\u05d8\u05e2\u05d9\u05e0\u05d4...", - "pad.passwordRequired": "\u05d3\u05e8\u05d5\u05e9\u05d4 \u05e1\u05e1\u05de\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.permissionDenied": "\u05d0\u05d9\u05df \u05dc\u05da \u05d4\u05e8\u05e9\u05d0\u05d4 \u05dc\u05d2\u05e9\u05ea \u05dc\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.wrongPassword": "\u05e1\u05e1\u05de\u05ea\u05da \u05d4\u05d9\u05d9\u05ea\u05d4 \u05e9\u05d2\u05d5\u05d9\u05d4", - "pad.settings.padSettings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e4\u05e0\u05e7\u05e1", - "pad.settings.myView": "\u05d4\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e9\u05dc\u05d9", - "pad.settings.stickychat": "\u05d4\u05e9\u05d9\u05d7\u05d4 \u05ea\u05de\u05d9\u05d3 \u05e2\u05dc \u05d4\u05de\u05e1\u05da", - "pad.settings.colorcheck": "\u05e6\u05d1\u05d9\u05e2\u05d4 \u05dc\u05e4\u05d9 \u05de\u05d7\u05d1\u05e8", - "pad.settings.linenocheck": "\u05de\u05e1\u05e4\u05e8\u05d9 \u05e9\u05d5\u05e8\u05d5\u05ea", - "pad.settings.rtlcheck": "\u05dc\u05e7\u05e8\u05d5\u05d0 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc?", - "pad.settings.fontType": "\u05e1\u05d5\u05d2 \u05d2\u05d5\u05e4\u05df:", - "pad.settings.fontType.normal": "\u05e8\u05d2\u05d9\u05dc", - "pad.settings.fontType.monospaced": "\u05d1\u05e8\u05d5\u05d7\u05d1 \u05e7\u05d1\u05d5\u05e2", - "pad.settings.globalView": "\u05ea\u05e6\u05d5\u05d2\u05d4 \u05dc\u05db\u05dc \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd", - "pad.settings.language": "\u05e9\u05e4\u05d4:", - "pad.importExport.import_export": "\u05d9\u05d9\u05d1\u05d5\u05d0\/\u05d9\u05d9\u05e6\u05d5\u05d0", - "pad.importExport.import": "\u05d4\u05e2\u05dc\u05d0\u05ea \u05db\u05dc \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e7\u05e1\u05d8 \u05d0\u05d5 \u05de\u05e1\u05de\u05da", - "pad.importExport.importSuccessful": "\u05d6\u05d4 \u05e2\u05d1\u05d3!", - "pad.importExport.export": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05d1\u05ea\u05d5\u05e8:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u05d8\u05e7\u05e1\u05d8 \u05e8\u05d2\u05d9\u05dc", - "pad.importExport.exportword": "\u05de\u05d9\u05e7\u05e8\u05d5\u05e1\u05d5\u05e4\u05d8 \u05d5\u05d5\u05e8\u05d3", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u05d1\u05d0\u05e4\u05e9\u05e8\u05d5\u05ea\u05da \u05dc\u05d9\u05d9\u05d1\u05d0 \u05de\u05d8\u05e7\u05e1\u05d8 \u05e4\u05e9\u05d5\u05d8 \u05d0\u05d5 \u05de\u05beHTML. \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d9\u05d9\u05d1\u05d5\u05d0 \u05de\u05ea\u05e7\u05d3\u05de\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05d9\u05e9 \u05dc\u05d4\u05ea\u05e7\u05d9\u05df \u05d0\u05ea abiword<\/a>.", - "pad.modals.connected": "\u05de\u05d7\u05d5\u05d1\u05db\u05e8.", - "pad.modals.reconnecting": "\u05de\u05ea\u05d1\u05e6\u05e2 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05de\u05d7\u05d3\u05e9...", - "pad.modals.forcereconnect": "\u05d7\u05d9\u05d1\u05d5\u05e8 \u05db\u05e4\u05d5\u05d9 \u05de\u05d7\u05d3\u05e9", - "pad.modals.userdup": "\u05e4\u05ea\u05d5\u05d7 \u05d1\u05d7\u05dc\u05d5\u05df \u05d0\u05d7\u05e8", - "pad.modals.userdup.explanation": "\u05e0\u05e8\u05d0\u05d4 \u05e9\u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4 \u05e4\u05ea\u05d5\u05d7 \u05d1\u05d9\u05d5\u05ea\u05e8 \u05de\u05d7\u05dc\u05d5\u05df \u05d3\u05e4\u05d3\u05e4\u05df \u05d0\u05d7\u05d3 \u05d1\u05de\u05d7\u05e9\u05d1 \u05d4\u05d6\u05d4.", - "pad.modals.userdup.advice": "\u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05de\u05d7\u05d3\u05e9 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05d7\u05dc\u05d5\u05df \u05d4\u05d6\u05d4.", - "pad.modals.unauth": "\u05d0\u05d9\u05df \u05d4\u05e8\u05e9\u05d0\u05d4", - "pad.modals.unauth.explanation": "\u05d4\u05d4\u05e8\u05e9\u05d0\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05e9\u05ea\u05e0\u05d5 \u05d1\u05d6\u05de\u05df \u05e9\u05e0\u05d9\u05e1\u05d9\u05ea \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8. \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05de\u05d7\u05d3\u05e9.", - "pad.modals.looping": "\u05dc\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8.", - "pad.modals.looping.explanation": "\u05d9\u05e9 \u05d1\u05e2\u05d9\u05d5\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8 \u05e2\u05dd \u05d4\u05e9\u05e8\u05ea \u05d4\u05de\u05ea\u05d0\u05dd.", - "pad.modals.looping.cause": "\u05d9\u05d9\u05ea\u05db\u05df \u05e9\u05d4\u05ea\u05d7\u05d1\u05e8\u05ea \u05d3\u05e8\u05da \u05d7\u05d5\u05de\u05ea\u05be\u05d0\u05e9 \u05d0\u05d5 \u05e9\u05e8\u05ea \u05de\u05ea\u05d5\u05d5\u05da \u05e9\u05d0\u05d9\u05e0\u05dd \u05de\u05ea\u05d0\u05d9\u05de\u05d9\u05dd.", - "pad.modals.initsocketfail": "\u05d0\u05d9\u05df \u05ea\u05e7\u05e9\u05d5\u05e8\u05d5\u05ea \u05dc\u05e9\u05e8\u05ea.", - "pad.modals.initsocketfail.explanation": "\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05dc\u05e9\u05e8\u05ea \u05d4\u05de\u05ea\u05d0\u05dd \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7\u05d4.", - "pad.modals.initsocketfail.cause": "\u05d0\u05d5\u05dc\u05d9 \u05d6\u05d4 \u05d1\u05d2\u05dc\u05dc \u05d4\u05d3\u05e4\u05d3\u05e4\u05df \u05e9\u05dc\u05da \u05d0\u05d5 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8 \u05e9\u05dc\u05da.", - "pad.modals.slowcommit": "\u05de\u05e0\u05d5\u05ea\u05e7.", - "pad.modals.slowcommit.explanation": "\u05d4\u05e9\u05e8\u05ea \u05d0\u05d9\u05e0\u05d5 \u05de\u05d2\u05d9\u05d1.", - "pad.modals.slowcommit.cause": "\u05d0\u05d5\u05dc\u05d9 \u05d6\u05d4 \u05d1\u05d2\u05dc\u05dc \u05d1\u05e2\u05d9\u05d5\u05ea \u05e2\u05dd \u05ea\u05e7\u05e9\u05d5\u05e8\u05ea \u05dc\u05e8\u05e9\u05ea.", - "pad.modals.deleted": "\u05e0\u05de\u05d7\u05e7.", - "pad.modals.deleted.explanation": "\u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4 \u05d4\u05d5\u05e1\u05e8.", - "pad.modals.disconnected": "\u05e0\u05d5\u05ea\u05e7\u05ea.", - "pad.modals.disconnected.explanation": "\u05d4\u05ea\u05e7\u05e9\u05d5\u05e8\u05ea \u05dc\u05e9\u05e8\u05ea \u05d0\u05d1\u05d3\u05d4", - "pad.modals.disconnected.cause": "\u05d9\u05d9\u05ea\u05db\u05df \u05e9\u05d4\u05e9\u05e8\u05ea \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df. \u05e0\u05d0 \u05dc\u05d4\u05d5\u05e1\u05d9\u05e2 \u05dc\u05e0\u05d5 \u05d0\u05dd \u05d6\u05d4 \u05de\u05de\u05e9\u05d9\u05da \u05dc\u05e7\u05e8\u05d5\u05ea.", - "pad.share": "\u05e9\u05d9\u05ea\u05d5\u05e3 \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.share.readonly": "\u05e7\u05d9\u05e9\u05d5\u05e8", - "pad.share.link": "\u05e7\u05d9\u05e9\u05d5\u05e8", - "pad.share.emebdcode": "\u05d4\u05d8\u05de\u05e2\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8", - "pad.chat": "\u05e9\u05d9\u05d7\u05d4", - "pad.chat.title": "\u05e4\u05ea\u05d9\u05d7\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4.", - "pad.chat.loadmessages": "\u05d8\u05e2\u05d9\u05e0\u05ea \u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea", - "timeslider.pageTitle": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df \u05e9\u05dc {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u05d7\u05d6\u05e8\u05d4 \u05d0\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1", - "timeslider.toolbar.authors": "\u05db\u05d5\u05ea\u05d1\u05d9\u05dd:", - "timeslider.toolbar.authorsList": "\u05d0\u05d9\u05df \u05db\u05d5\u05ea\u05d1\u05d9\u05dd", - "timeslider.toolbar.exportlink.title": "\u05d9\u05e6\u05d5\u05d0", - "timeslider.exportCurrent": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d4\u05db\u05e8\u05e1\u05d4 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05d1\u05ea\u05d5\u05e8:", - "timeslider.version": "\u05d2\u05e8\u05e1\u05d4 {{version}}", - "timeslider.saved": "\u05e0\u05e9\u05de\u05e8\u05d4 \u05d1\u05be{{day}} \u05d1{{month}} {{year}}", - "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u05d9\u05e0\u05d5\u05d0\u05e8", - "timeslider.month.february": "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8", - "timeslider.month.march": "\u05de\u05e8\u05e5", - "timeslider.month.april": "\u05d0\u05e4\u05e8\u05d9\u05dc", - "timeslider.month.may": "\u05de\u05d0\u05d9", - "timeslider.month.june": "\u05d9\u05d5\u05e0\u05d9", - "timeslider.month.july": "\u05d9\u05d5\u05dc\u05d9", - "timeslider.month.august": "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8", - "timeslider.month.september": "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8", - "timeslider.month.october": "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8", - "timeslider.month.november": "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8", - "timeslider.month.december": "\u05d3\u05e6\u05de\u05d1\u05e8", - "timeslider.unnamedauthor": "\u05db\u05d5\u05ea\u05d1 \u05d7\u05e1\u05e8\u05be\u05e9\u05dd \u05d0\u05d7\u05d3", - "timeslider.unnamedauthors": "{{num}} \u05db\u05d5\u05ea\u05d1\u05d9\u05dd \u05d7\u05e1\u05e8\u05d9\u05be\u05e9\u05dd", - "pad.savedrevs.marked": "\u05d2\u05e8\u05e1\u05d4 \u05d6\u05d5 \u05de\u05e1\u05d5\u05de\u05e0\u05ea \u05db\u05d2\u05e8\u05e1\u05d4 \u05e9\u05de\u05d5\u05e8\u05d4", - "pad.userlist.entername": "\u05e0\u05d0 \u05dc\u05d4\u05d6\u05d9\u05df \u05d0\u05ea \u05e9\u05de\u05da", - "pad.userlist.unnamed": "\u05dc\u05dc\u05d0 \u05e9\u05dd", - "pad.userlist.guest": "\u05d0\u05d5\u05e8\u05d7", - "pad.userlist.deny": "\u05dc\u05d3\u05d7\u05d5\u05ea", - "pad.userlist.approve": "\u05dc\u05d0\u05e9\u05e8", - "pad.editbar.clearcolors": "\u05dc\u05e0\u05e7\u05d5\u05ea \u05e6\u05d1\u05e2\u05d9\u05dd \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05db\u05d5\u05ea\u05d1\u05d9\u05dd \u05d1\u05db\u05dc \u05d4\u05de\u05e1\u05de\u05da?", - "pad.impexp.importbutton": "\u05dc\u05d9\u05d9\u05d1\u05d0 \u05db\u05e2\u05ea", - "pad.impexp.importing": "\u05d9\u05d9\u05d1\u05d5\u05d0...", - "pad.impexp.confirmimport": "\u05d9\u05d1\u05d5\u05d0 \u05e9\u05dc \u05e7\u05d5\u05d1\u05e5 \u05d9\u05d1\u05d8\u05dc \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05d1\u05e4\u05e0\u05e7\u05e1. \u05d4\u05d0\u05dd \u05d0\u05ea\u05dd \u05d1\u05d8\u05d5\u05d7\u05d9\u05dd \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05db\u05dd \u05dc\u05d4\u05de\u05e9\u05d9\u05da?", - "pad.impexp.convertFailed": "\u05dc\u05d0 \u05d4\u05ea\u05d7\u05dc\u05dc\u05d0 \u05d4\u05e6\u05dc\u05d7\u05e0\u05d5 \u05dc\u05d9\u05d9\u05d1\u05d0 \u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d4\u05d6\u05d4. \u05e0\u05d0 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8 \u05de\u05e1\u05de\u05da \u05e9\u05d5\u05e0\u05d4 \u05d0\u05d5 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7 \u05d9\u05d3\u05e0\u05d9\u05ea", - "pad.impexp.uploadFailed": "\u05d4\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4, \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05e9\u05d5\u05d1", - "pad.impexp.importfailed": "\u05d4\u05d9\u05d9\u05d1\u05d5\u05d0 \u05e0\u05db\u05e9\u05dc", - "pad.impexp.copypaste": "\u05e0\u05d0 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7", - "pad.impexp.exportdisabled": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8 {{type}} \u05d0\u05d9\u05e0\u05d5 \u05e4\u05e2\u05d9\u05dc. \u05de\u05e0\u05d4\u05dc \u05d4\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05dc\u05da \u05d9\u05d5\u05db\u05dc \u05dc\u05e1\u05e4\u05e8 \u05dc\u05da \u05e2\u05dc \u05d6\u05d4 \u05e2\u05d5\u05d3 \u05e4\u05e8\u05d8\u05d9\u05dd." + "@metadata": { + "authors": { + "0": "Amire80", + "1": "Ofrahod", + "3": "\u05ea\u05d5\u05de\u05e8 \u05d8" + } + }, + "index.newPad": "\u05e4\u05e0\u05e7\u05e1 \u05d7\u05d3\u05e9", + "index.createOpenPad": "\u05d0\u05d5 \u05d9\u05e6\u05d9\u05e8\u05d4 \u05d0\u05d5 \u05e4\u05ea\u05d9\u05d7\u05d4 \u05e9\u05dc \u05e4\u05e0\u05e7\u05e1 \u05e2\u05dd \u05d1\u05e9\u05dd:", + "pad.toolbar.bold.title": "\u05d1\u05d5\u05dc\u05d8 (Ctrl-B)", + "pad.toolbar.italic.title": "\u05e0\u05d8\u05d5\u05d9 (Ctrl-I)", + "pad.toolbar.underline.title": "\u05e7\u05d5 \u05ea\u05d7\u05ea\u05d9 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u05e7\u05d5 \u05de\u05d5\u05d7\u05e7", + "pad.toolbar.ol.title": "\u05e8\u05e9\u05d9\u05de\u05d4 \u05de\u05de\u05d5\u05e1\u05e4\u05e8\u05ea", + "pad.toolbar.ul.title": "\u05e8\u05e9\u05d9\u05de\u05d4", + "pad.toolbar.indent.title": "\u05d4\u05d6\u05d7\u05d4", + "pad.toolbar.unindent.title": "\u05e6\u05de\u05e6\u05d5\u05dd \u05d4\u05d6\u05d7\u05d4", + "pad.toolbar.undo.title": "\u05d1\u05d9\u05d8\u05d5\u05dc (Ctrl-Z)", + "pad.toolbar.redo.title": "\u05d1\u05d9\u05e6\u05d5\u05e2 \u05de\u05d7\u05d3\u05e9", + "pad.toolbar.clearAuthorship.title": "\u05e0\u05d9\u05e7\u05d5\u05d9 \u05e6\u05d1\u05e2\u05d9\u05dd", + "pad.toolbar.import_export.title": "\u05d9\u05d9\u05d1\u05d5\u05d0/\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8\u05d9 \u05e7\u05d1\u05e6\u05d9\u05dd \u05e9\u05d5\u05e0\u05d9\u05dd", + "pad.toolbar.timeslider.title": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df", + "pad.toolbar.savedRevision.title": "\u05e9\u05de\u05d9\u05e8\u05ea \u05d2\u05e8\u05e1\u05d4", + "pad.toolbar.settings.title": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", + "pad.toolbar.embed.title": "\u05e9\u05d9\u05ea\u05d5\u05e3 \u05d5\u05d4\u05d8\u05de\u05e2\u05d4 \u05e9\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", + "pad.toolbar.showusers.title": "\u05d4\u05e6\u05d2\u05ea \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", + "pad.colorpicker.save": "\u05e9\u05de\u05d9\u05e8\u05d4", + "pad.colorpicker.cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", + "pad.loading": "\u05d8\u05e2\u05d9\u05e0\u05d4...", + "pad.passwordRequired": "\u05d3\u05e8\u05d5\u05e9\u05d4 \u05e1\u05e1\u05de\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", + "pad.permissionDenied": "\u05d0\u05d9\u05df \u05dc\u05da \u05d4\u05e8\u05e9\u05d0\u05d4 \u05dc\u05d2\u05e9\u05ea \u05dc\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", + "pad.wrongPassword": "\u05e1\u05e1\u05de\u05ea\u05da \u05d4\u05d9\u05d9\u05ea\u05d4 \u05e9\u05d2\u05d5\u05d9\u05d4", + "pad.settings.padSettings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e4\u05e0\u05e7\u05e1", + "pad.settings.myView": "\u05d4\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e9\u05dc\u05d9", + "pad.settings.stickychat": "\u05d4\u05e9\u05d9\u05d7\u05d4 \u05ea\u05de\u05d9\u05d3 \u05e2\u05dc \u05d4\u05de\u05e1\u05da", + "pad.settings.colorcheck": "\u05e6\u05d1\u05d9\u05e2\u05d4 \u05dc\u05e4\u05d9 \u05de\u05d7\u05d1\u05e8", + "pad.settings.linenocheck": "\u05de\u05e1\u05e4\u05e8\u05d9 \u05e9\u05d5\u05e8\u05d5\u05ea", + "pad.settings.rtlcheck": "\u05dc\u05e7\u05e8\u05d5\u05d0 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc?", + "pad.settings.fontType": "\u05e1\u05d5\u05d2 \u05d2\u05d5\u05e4\u05df:", + "pad.settings.fontType.normal": "\u05e8\u05d2\u05d9\u05dc", + "pad.settings.fontType.monospaced": "\u05d1\u05e8\u05d5\u05d7\u05d1 \u05e7\u05d1\u05d5\u05e2", + "pad.settings.globalView": "\u05ea\u05e6\u05d5\u05d2\u05d4 \u05dc\u05db\u05dc \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd", + "pad.settings.language": "\u05e9\u05e4\u05d4:", + "pad.importExport.import_export": "\u05d9\u05d9\u05d1\u05d5\u05d0/\u05d9\u05d9\u05e6\u05d5\u05d0", + "pad.importExport.import": "\u05d4\u05e2\u05dc\u05d0\u05ea \u05db\u05dc \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e7\u05e1\u05d8 \u05d0\u05d5 \u05de\u05e1\u05de\u05da", + "pad.importExport.importSuccessful": "\u05d6\u05d4 \u05e2\u05d1\u05d3!", + "pad.importExport.export": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05d1\u05ea\u05d5\u05e8:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u05d8\u05e7\u05e1\u05d8 \u05e8\u05d2\u05d9\u05dc", + "pad.importExport.exportword": "\u05de\u05d9\u05e7\u05e8\u05d5\u05e1\u05d5\u05e4\u05d8 \u05d5\u05d5\u05e8\u05d3", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u05d1\u05d0\u05e4\u05e9\u05e8\u05d5\u05ea\u05da \u05dc\u05d9\u05d9\u05d1\u05d0 \u05de\u05d8\u05e7\u05e1\u05d8 \u05e4\u05e9\u05d5\u05d8 \u05d0\u05d5 \u05de\u05beHTML. \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d9\u05d9\u05d1\u05d5\u05d0 \u05de\u05ea\u05e7\u05d3\u05de\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05d9\u05e9 \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u05dc\u05d4\u05ea\u05e7\u05d9\u05df \u05d0\u05ea abiword\u003C/a\u003E.", + "pad.modals.connected": "\u05de\u05d7\u05d5\u05d1\u05e8.", + "pad.modals.reconnecting": "\u05de\u05ea\u05d1\u05e6\u05e2 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05de\u05d7\u05d3\u05e9...", + "pad.modals.forcereconnect": "\u05dc\u05db\u05e4\u05d5\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8 \u05de\u05d7\u05d3\u05e9", + "pad.modals.userdup": "\u05e4\u05ea\u05d5\u05d7 \u05d1\u05d7\u05dc\u05d5\u05df \u05d0\u05d7\u05e8", + "pad.modals.userdup.explanation": "\u05e0\u05e8\u05d0\u05d4 \u05e9\u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4 \u05e4\u05ea\u05d5\u05d7 \u05d1\u05d9\u05d5\u05ea\u05e8 \u05de\u05d7\u05dc\u05d5\u05df \u05d3\u05e4\u05d3\u05e4\u05df \u05d0\u05d7\u05d3 \u05d1\u05de\u05d7\u05e9\u05d1 \u05d4\u05d6\u05d4.", + "pad.modals.userdup.advice": "\u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05de\u05d7\u05d3\u05e9 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05d7\u05dc\u05d5\u05df \u05d4\u05d6\u05d4.", + "pad.modals.unauth": "\u05d0\u05d9\u05df \u05d4\u05e8\u05e9\u05d0\u05d4", + "pad.modals.unauth.explanation": "\u05d4\u05d4\u05e8\u05e9\u05d0\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05e9\u05ea\u05e0\u05d5 \u05d1\u05d6\u05de\u05df \u05e9\u05e0\u05d9\u05e1\u05d9\u05ea \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8. \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05de\u05d7\u05d3\u05e9.", + "pad.modals.looping": "\u05dc\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8.", + "pad.modals.looping.explanation": "\u05d9\u05e9 \u05d1\u05e2\u05d9\u05d5\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8 \u05e2\u05dd \u05d4\u05e9\u05e8\u05ea \u05d4\u05de\u05ea\u05d0\u05dd.", + "pad.modals.looping.cause": "\u05d9\u05d9\u05ea\u05db\u05df \u05e9\u05d4\u05ea\u05d7\u05d1\u05e8\u05ea \u05d3\u05e8\u05da \u05d7\u05d5\u05de\u05ea\u05be\u05d0\u05e9 \u05d0\u05d5 \u05e9\u05e8\u05ea \u05de\u05ea\u05d5\u05d5\u05da \u05d1\u05dc\u05ea\u05d9\u05be\u05ea\u05d5\u05d0\u05de\u05d9\u05dd.", + "pad.modals.initsocketfail": "\u05d0\u05d9\u05df \u05ea\u05e7\u05e9\u05d5\u05e8\u05d5\u05ea \u05dc\u05e9\u05e8\u05ea.", + "pad.modals.initsocketfail.explanation": "\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05dc\u05e9\u05e8\u05ea \u05d4\u05de\u05ea\u05d0\u05dd \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7\u05d4.", + "pad.modals.initsocketfail.cause": "\u05d0\u05d5\u05dc\u05d9 \u05d6\u05d4 \u05d1\u05d2\u05dc\u05dc \u05d4\u05d3\u05e4\u05d3\u05e4\u05df \u05e9\u05dc\u05da \u05d0\u05d5 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8 \u05e9\u05dc\u05da.", + "pad.modals.slowcommit": "\u05de\u05e0\u05d5\u05ea\u05e7.", + "pad.modals.slowcommit.explanation": "\u05d4\u05e9\u05e8\u05ea \u05d0\u05d9\u05e0\u05d5 \u05de\u05d2\u05d9\u05d1.", + "pad.modals.slowcommit.cause": "\u05d0\u05d5\u05dc\u05d9 \u05d6\u05d4 \u05d1\u05d2\u05dc\u05dc \u05d1\u05e2\u05d9\u05d5\u05ea \u05e2\u05dd \u05ea\u05e7\u05e9\u05d5\u05e8\u05ea \u05dc\u05e8\u05e9\u05ea.", + "pad.modals.deleted": "\u05e0\u05de\u05d7\u05e7.", + "pad.modals.deleted.explanation": "\u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4 \u05d4\u05d5\u05e1\u05e8.", + "pad.modals.disconnected": "\u05e0\u05d5\u05ea\u05e7\u05ea.", + "pad.modals.disconnected.explanation": "\u05d4\u05ea\u05e7\u05e9\u05d5\u05e8\u05ea \u05dc\u05e9\u05e8\u05ea \u05d0\u05d1\u05d3\u05d4", + "pad.modals.disconnected.cause": "\u05d9\u05d9\u05ea\u05db\u05df \u05e9\u05d4\u05e9\u05e8\u05ea \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df. \u05e0\u05d0 \u05dc\u05d4\u05d5\u05d3\u05d9\u05e2 \u05dc\u05e0\u05d5 \u05d0\u05dd \u05d6\u05d4 \u05de\u05de\u05e9\u05d9\u05da \u05dc\u05e7\u05e8\u05d5\u05ea.", + "pad.share": "\u05e9\u05d9\u05ea\u05d5\u05e3 \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", + "pad.share.readonly": "\u05e7\u05d9\u05e9\u05d5\u05e8", + "pad.share.link": "\u05e7\u05d9\u05e9\u05d5\u05e8", + "pad.share.emebdcode": "\u05d4\u05d8\u05de\u05e2\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8", + "pad.chat": "\u05e9\u05d9\u05d7\u05d4", + "pad.chat.title": "\u05e4\u05ea\u05d9\u05d7\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4.", + "pad.chat.loadmessages": "\u05d8\u05e2\u05d9\u05e0\u05ea \u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea", + "timeslider.pageTitle": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df \u05e9\u05dc {{appTitle}}", + "timeslider.toolbar.returnbutton": "\u05d7\u05d6\u05e8\u05d4 \u05d0\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1", + "timeslider.toolbar.authors": "\u05db\u05d5\u05ea\u05d1\u05d9\u05dd:", + "timeslider.toolbar.authorsList": "\u05d0\u05d9\u05df \u05db\u05d5\u05ea\u05d1\u05d9\u05dd", + "timeslider.toolbar.exportlink.title": "\u05d9\u05d9\u05e6\u05d5\u05d0", + "timeslider.exportCurrent": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d4\u05d2\u05e8\u05e1\u05d4 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05d1\u05ea\u05d5\u05e8:", + "timeslider.version": "\u05d2\u05e8\u05e1\u05d4 {{version}}", + "timeslider.saved": "\u05e0\u05e9\u05de\u05e8\u05d4 \u05d1\u05be{{day}} \u05d1{{month}} {{year}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u05d9\u05e0\u05d5\u05d0\u05e8", + "timeslider.month.february": "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8", + "timeslider.month.march": "\u05de\u05e8\u05e5", + "timeslider.month.april": "\u05d0\u05e4\u05e8\u05d9\u05dc", + "timeslider.month.may": "\u05de\u05d0\u05d9", + "timeslider.month.june": "\u05d9\u05d5\u05e0\u05d9", + "timeslider.month.july": "\u05d9\u05d5\u05dc\u05d9", + "timeslider.month.august": "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8", + "timeslider.month.september": "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8", + "timeslider.month.october": "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8", + "timeslider.month.november": "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8", + "timeslider.month.december": "\u05d3\u05e6\u05de\u05d1\u05e8", + "timeslider.unnamedauthor": "\u05db\u05d5\u05ea\u05d1 \u05d7\u05e1\u05e8\u05be\u05e9\u05dd \u05d0\u05d7\u05d3", + "timeslider.unnamedauthors": "{{num}} \u05db\u05d5\u05ea\u05d1\u05d9\u05dd \u05d7\u05e1\u05e8\u05d9\u05be\u05e9\u05dd", + "pad.savedrevs.marked": "\u05d2\u05e8\u05e1\u05d4 \u05d6\u05d5 \u05de\u05e1\u05d5\u05de\u05e0\u05ea \u05db\u05d2\u05e8\u05e1\u05d4 \u05e9\u05de\u05d5\u05e8\u05d4", + "pad.userlist.entername": "\u05e0\u05d0 \u05dc\u05d4\u05d6\u05d9\u05df \u05d0\u05ea \u05e9\u05de\u05da", + "pad.userlist.unnamed": "\u05dc\u05dc\u05d0 \u05e9\u05dd", + "pad.userlist.guest": "\u05d0\u05d5\u05e8\u05d7", + "pad.userlist.deny": "\u05dc\u05d3\u05d7\u05d5\u05ea", + "pad.userlist.approve": "\u05dc\u05d0\u05e9\u05e8", + "pad.editbar.clearcolors": "\u05dc\u05e0\u05e7\u05d5\u05ea \u05e6\u05d1\u05e2\u05d9\u05dd \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05db\u05d5\u05ea\u05d1\u05d9\u05dd \u05d1\u05db\u05dc \u05d4\u05de\u05e1\u05de\u05da?", + "pad.impexp.importbutton": "\u05dc\u05d9\u05d9\u05d1\u05d0 \u05db\u05e2\u05ea", + "pad.impexp.importing": "\u05d9\u05d9\u05d1\u05d5\u05d0...", + "pad.impexp.confirmimport": "\u05d9\u05d9\u05d1\u05d5\u05d0 \u05e9\u05dc \u05e7\u05d5\u05d1\u05e5 \u05d9\u05d1\u05d8\u05dc \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05d1\u05e4\u05e0\u05e7\u05e1. \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da?", + "pad.impexp.convertFailed": "\u05dc\u05d0 \u05d4\u05e6\u05dc\u05d7\u05e0\u05d5 \u05dc\u05d9\u05d9\u05d1\u05d0 \u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d4\u05d6\u05d4. \u05e0\u05d0 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8 \u05de\u05e1\u05de\u05da \u05e9\u05d5\u05e0\u05d4 \u05d0\u05d5 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7 \u05d9\u05d3\u05e0\u05d9\u05ea", + "pad.impexp.uploadFailed": "\u05d4\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4, \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05e9\u05d5\u05d1", + "pad.impexp.importfailed": "\u05d4\u05d9\u05d9\u05d1\u05d5\u05d0 \u05e0\u05db\u05e9\u05dc", + "pad.impexp.copypaste": "\u05e0\u05d0 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7", + "pad.impexp.exportdisabled": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8 {{type}} \u05d0\u05d9\u05e0\u05d5 \u05e4\u05e2\u05d9\u05dc. \u05de\u05e0\u05d4\u05dc \u05d4\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05dc\u05da \u05d9\u05d5\u05db\u05dc \u05dc\u05e1\u05e4\u05e8 \u05dc\u05da \u05e2\u05dc \u05d6\u05d4 \u05e2\u05d5\u05d3 \u05e4\u05e8\u05d8\u05d9\u05dd." } \ No newline at end of file diff --git a/src/locales/hu.json b/src/locales/hu.json index 6e667300..ab9edff0 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -1,111 +1,111 @@ { - "@metadata": { - "authors": { - "0": "Dj", - "1": "Misibacsi", - "2": "R-Joe", - "4": "Tgr" - } - }, - "index.newPad": "\u00daj notesz", - "index.createOpenPad": "vagy notesz l\u00e9trehoz\u00e1sa ezen a n\u00e9ven:", - "pad.toolbar.bold.title": "F\u00e9lk\u00f6v\u00e9r (Ctrl-B)", - "pad.toolbar.italic.title": "D\u0151lt (Ctrl-I)", - "pad.toolbar.underline.title": "Al\u00e1h\u00faz\u00e1s (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u00c1th\u00faz\u00e1s", - "pad.toolbar.ol.title": "Sz\u00e1mozott lista", - "pad.toolbar.ul.title": "Sz\u00e1mozatlan lista", - "pad.toolbar.indent.title": "Beh\u00faz\u00e1s n\u00f6vel\u00e9se", - "pad.toolbar.unindent.title": "Beh\u00faz\u00e1s cs\u00f6kkent\u00e9se", - "pad.toolbar.undo.title": "Vissza (Ctrl-Z)", - "pad.toolbar.redo.title": "\u00dajra (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Szerz\u0151k sz\u00ednez\u00e9s\u00e9nek kikapcsol\u00e1sa", - "pad.toolbar.import_export.title": "Import\u00e1l\u00e1s\/export\u00e1l\u00e1s k\u00fcl\u00f6nb\u00f6z\u0151 f\u00e1jlform\u00e1tumokb\u00f3l\/ba", - "pad.toolbar.timeslider.title": "Id\u0151cs\u00faszka", - "pad.toolbar.savedRevision.title": "Mentett \u00e1llapotok", - "pad.toolbar.settings.title": "Be\u00e1ll\u00edt\u00e1sok", - "pad.toolbar.embed.title": "Notesz be\u00e1gyaz\u00e1sa", - "pad.toolbar.showusers.title": "Notesz felhaszn\u00e1l\u00f3inak megmutat\u00e1sa", - "pad.colorpicker.save": "Ment\u00e9s", - "pad.colorpicker.cancel": "M\u00e9gsem", - "pad.loading": "Bet\u00f6lt\u00e9s\u2026", - "pad.passwordRequired": "Jelsz\u00f3ra van sz\u00fcks\u00e9ged ezen notesz el\u00e9r\u00e9s\u00e9hez", - "pad.permissionDenied": "Nincs enged\u00e9lyed ezen notesz el\u00e9r\u00e9s\u00e9hez", - "pad.wrongPassword": "A jelsz\u00f3 rossz volt", - "pad.settings.padSettings": "Notesz be\u00e1ll\u00edt\u00e1sai", - "pad.settings.myView": "Az \u00e9n n\u00e9zetem", - "pad.settings.stickychat": "Mindig mutasd a cseveg\u00e9s-dobozt", - "pad.settings.colorcheck": "Szerz\u0151k sz\u00ednei", - "pad.settings.linenocheck": "Sorok sz\u00e1moz\u00e1sa", - "pad.settings.fontType": "Bet\u0171t\u00edpus:", - "pad.settings.fontType.normal": "Szok\u00e1sos", - "pad.settings.fontType.monospaced": "\u00cdr\u00f3g\u00e9pes", - "pad.settings.globalView": "Glob\u00e1lis n\u00e9zet", - "pad.settings.language": "Nyelv:", - "pad.importExport.import_export": "Import\/export", - "pad.importExport.import": "Tetsz\u0151leges sz\u00f6vegf\u00e1jl vagy dokumentum felt\u00f6lt\u00e9se", - "pad.importExport.importSuccessful": "Siker!", - "pad.importExport.export": "Jelenlegi notesz export\u00e1l\u00e1sa \u00edgy:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Sima sz\u00f6veg", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document form\u00e1tum)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "Kapcsol\u00f3dva.", - "pad.modals.reconnecting": "\u00dajrakapcsol\u00f3d\u00e1s a noteszhez...", - "pad.modals.forcereconnect": "\u00dajrakapcsol\u00f3d\u00e1s k\u00e9nyszer\u00edt\u00e9se", - "pad.modals.userdup.explanation": "\u00dagy t\u0171nik, ez a notesz t\u00f6bb k\u00fcl\u00f6nb\u00f6z\u0151 b\u00f6ng\u00e9sz\u0151ablakban is meg van nyitva a sz\u00e1m\u00edt\u00f3g\u00e9peden.", - "pad.modals.userdup.advice": "Kapcsol\u00f3dj \u00fajra, ha ezt az ablakot akarod haszn\u00e1lni.", - "pad.modals.unauth": "Nincs r\u00e1 jogosults\u00e1god", - "pad.modals.unauth.explanation": "A jogosults\u00e1gaid v\u00e1ltoztak, mik\u00f6zben n\u00e9zted ezt az oldalt. Pr\u00f3b\u00e1lj \u00fajrakapcsol\u00f3dni.", - "pad.modals.looping": "Kapcsolat bontva.", - "pad.modals.looping.explanation": "Nem siker\u00fclt a kommunik\u00e1ci\u00f3 a szinkroniz\u00e1ci\u00f3s szerverrel.", - "pad.modals.looping.cause": "Tal\u00e1n egy t\u00fal szigor\u00fa t\u0171zfalon vagy proxyn kereszt\u00fcl kapcsol\u00f3dt\u00e1l az internetre.", - "pad.modals.initsocketfail": "A szerver nem \u00e9rhet\u0151 el.", - "pad.modals.initsocketfail.explanation": "Nem siker\u00fclt kapcsol\u00f3dni a szinkroniz\u00e1ci\u00f3s szerverhez.", - "pad.modals.initsocketfail.cause": "Val\u00f3sz\u00edn\u0171leg a b\u00f6ng\u00e9sz\u0151ddel vagy az internetkapcsolatoddal van probl\u00e9ma.", - "pad.modals.slowcommit": "Megszakadt a kapcsolat.", - "pad.modals.slowcommit.explanation": "A szerver nem v\u00e1laszol.", - "pad.modals.slowcommit.cause": "Val\u00f3sz\u00edn\u0171leg az internetkapcsolattal van probl\u00e9ma.", - "pad.modals.deleted": "T\u00f6r\u00f6lve.", - "pad.modals.deleted.explanation": "Ez a notesz el lett t\u00e1vol\u00edtva.", - "pad.modals.disconnected": "Kapcsolat bontva.", - "pad.modals.disconnected.explanation": "A szerverrel val\u00f3 kapcsolat megsz\u0171nt.", - "pad.modals.disconnected.cause": "Lehet, hogy a szerver nem el\u00e9rhet\u0151. K\u00e9rlek, \u00e9rtes\u00edts minket, ha a probl\u00e9ma tart\u00f3san fenn\u00e1ll.", - "pad.share": "Notesz megoszt\u00e1sa", - "pad.share.readonly": "Csak olvashat\u00f3", - "pad.share.link": "Hivatkoz\u00e1s", - "pad.share.emebdcode": "URL be\u00e1gyaz\u00e1sa", - "pad.chat": "Cseveg\u00e9s", - "pad.chat.title": "A noteszhez tartoz\u00f3 cseveg\u00e9s megnyit\u00e1sa.", - "timeslider.pageTitle": "{{appTitle}} id\u0151cs\u00faszka", - "timeslider.toolbar.returnbutton": "Vissza a noteszhez", - "timeslider.toolbar.authors": "Szerz\u0151k:", - "timeslider.toolbar.authorsList": "Nincsenek szerz\u0151k", - "timeslider.exportCurrent": "Jelenlegi v\u00e1ltozat export\u00e1l\u00e1sa \u00edgy:", - "timeslider.version": "{{version}} verzi\u00f3", - "timeslider.saved": "{{year}}. {{month}} {{day}}-n elmentve", - "timeslider.dateformat": "{{year}}\/{{month}}\/{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "janu\u00e1r", - "timeslider.month.february": "febru\u00e1r", - "timeslider.month.march": "m\u00e1rcius", - "timeslider.month.april": "\u00e1prilis", - "timeslider.month.may": "m\u00e1jus", - "timeslider.month.june": "j\u00fanius", - "timeslider.month.july": "j\u00falius", - "timeslider.month.august": "augusztus", - "timeslider.month.september": "szeptember", - "timeslider.month.october": "okt\u00f3ber", - "timeslider.month.november": "november", - "timeslider.month.december": "december", - "pad.userlist.entername": "Add meg a nevedet", - "pad.userlist.unnamed": "n\u00e9vtelen", - "pad.userlist.guest": "Vend\u00e9g", - "pad.userlist.deny": "Megtagad", - "pad.userlist.approve": "J\u00f3v\u00e1hagy", - "pad.impexp.importbutton": "Import\u00e1l\u00e1s most", - "pad.impexp.importing": "Import\u00e1l\u00e1s\u2026", - "pad.impexp.uploadFailed": "A felt\u00f6lt\u00e9s sikertelen, pr\u00f3b\u00e1ld meg \u00fajra", - "pad.impexp.importfailed": "Az import\u00e1l\u00e1s nem siker\u00fclt" + "@metadata": { + "authors": { + "0": "Dj", + "1": "Misibacsi", + "2": "R-Joe", + "4": "Tgr" + } + }, + "index.newPad": "\u00daj notesz", + "index.createOpenPad": "vagy notesz l\u00e9trehoz\u00e1sa ezen a n\u00e9ven:", + "pad.toolbar.bold.title": "F\u00e9lk\u00f6v\u00e9r (Ctrl-B)", + "pad.toolbar.italic.title": "D\u0151lt (Ctrl-I)", + "pad.toolbar.underline.title": "Al\u00e1h\u00faz\u00e1s (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u00c1th\u00faz\u00e1s", + "pad.toolbar.ol.title": "Sz\u00e1mozott lista", + "pad.toolbar.ul.title": "Sz\u00e1mozatlan lista", + "pad.toolbar.indent.title": "Beh\u00faz\u00e1s n\u00f6vel\u00e9se", + "pad.toolbar.unindent.title": "Beh\u00faz\u00e1s cs\u00f6kkent\u00e9se", + "pad.toolbar.undo.title": "Vissza (Ctrl-Z)", + "pad.toolbar.redo.title": "\u00dajra (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Szerz\u0151k sz\u00ednez\u00e9s\u00e9nek kikapcsol\u00e1sa", + "pad.toolbar.import_export.title": "Import\u00e1l\u00e1s/export\u00e1l\u00e1s k\u00fcl\u00f6nb\u00f6z\u0151 f\u00e1jlform\u00e1tumokb\u00f3l/ba", + "pad.toolbar.timeslider.title": "Id\u0151cs\u00faszka", + "pad.toolbar.savedRevision.title": "Mentett \u00e1llapotok", + "pad.toolbar.settings.title": "Be\u00e1ll\u00edt\u00e1sok", + "pad.toolbar.embed.title": "Notesz be\u00e1gyaz\u00e1sa", + "pad.toolbar.showusers.title": "Notesz felhaszn\u00e1l\u00f3inak megmutat\u00e1sa", + "pad.colorpicker.save": "Ment\u00e9s", + "pad.colorpicker.cancel": "M\u00e9gsem", + "pad.loading": "Bet\u00f6lt\u00e9s\u2026", + "pad.passwordRequired": "Jelsz\u00f3ra van sz\u00fcks\u00e9ged ezen notesz el\u00e9r\u00e9s\u00e9hez", + "pad.permissionDenied": "Nincs enged\u00e9lyed ezen notesz el\u00e9r\u00e9s\u00e9hez", + "pad.wrongPassword": "A jelsz\u00f3 rossz volt", + "pad.settings.padSettings": "Notesz be\u00e1ll\u00edt\u00e1sai", + "pad.settings.myView": "Az \u00e9n n\u00e9zetem", + "pad.settings.stickychat": "Mindig mutasd a cseveg\u00e9s-dobozt", + "pad.settings.colorcheck": "Szerz\u0151k sz\u00ednei", + "pad.settings.linenocheck": "Sorok sz\u00e1moz\u00e1sa", + "pad.settings.fontType": "Bet\u0171t\u00edpus:", + "pad.settings.fontType.normal": "Szok\u00e1sos", + "pad.settings.fontType.monospaced": "\u00cdr\u00f3g\u00e9pes", + "pad.settings.globalView": "Glob\u00e1lis n\u00e9zet", + "pad.settings.language": "Nyelv:", + "pad.importExport.import_export": "Import/export", + "pad.importExport.import": "Tetsz\u0151leges sz\u00f6vegf\u00e1jl vagy dokumentum felt\u00f6lt\u00e9se", + "pad.importExport.importSuccessful": "Siker!", + "pad.importExport.export": "Jelenlegi notesz export\u00e1l\u00e1sa \u00edgy:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Sima sz\u00f6veg", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document form\u00e1tum)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "Kapcsol\u00f3dva.", + "pad.modals.reconnecting": "\u00dajrakapcsol\u00f3d\u00e1s a noteszhez...", + "pad.modals.forcereconnect": "\u00dajrakapcsol\u00f3d\u00e1s k\u00e9nyszer\u00edt\u00e9se", + "pad.modals.userdup.explanation": "\u00dagy t\u0171nik, ez a notesz t\u00f6bb k\u00fcl\u00f6nb\u00f6z\u0151 b\u00f6ng\u00e9sz\u0151ablakban is meg van nyitva a sz\u00e1m\u00edt\u00f3g\u00e9peden.", + "pad.modals.userdup.advice": "Kapcsol\u00f3dj \u00fajra, ha ezt az ablakot akarod haszn\u00e1lni.", + "pad.modals.unauth": "Nincs r\u00e1 jogosults\u00e1god", + "pad.modals.unauth.explanation": "A jogosults\u00e1gaid v\u00e1ltoztak, mik\u00f6zben n\u00e9zted ezt az oldalt. Pr\u00f3b\u00e1lj \u00fajrakapcsol\u00f3dni.", + "pad.modals.looping": "Kapcsolat bontva.", + "pad.modals.looping.explanation": "Nem siker\u00fclt a kommunik\u00e1ci\u00f3 a szinkroniz\u00e1ci\u00f3s szerverrel.", + "pad.modals.looping.cause": "Tal\u00e1n egy t\u00fal szigor\u00fa t\u0171zfalon vagy proxyn kereszt\u00fcl kapcsol\u00f3dt\u00e1l az internetre.", + "pad.modals.initsocketfail": "A szerver nem \u00e9rhet\u0151 el.", + "pad.modals.initsocketfail.explanation": "Nem siker\u00fclt kapcsol\u00f3dni a szinkroniz\u00e1ci\u00f3s szerverhez.", + "pad.modals.initsocketfail.cause": "Val\u00f3sz\u00edn\u0171leg a b\u00f6ng\u00e9sz\u0151ddel vagy az internetkapcsolatoddal van probl\u00e9ma.", + "pad.modals.slowcommit": "Megszakadt a kapcsolat.", + "pad.modals.slowcommit.explanation": "A szerver nem v\u00e1laszol.", + "pad.modals.slowcommit.cause": "Val\u00f3sz\u00edn\u0171leg az internetkapcsolattal van probl\u00e9ma.", + "pad.modals.deleted": "T\u00f6r\u00f6lve.", + "pad.modals.deleted.explanation": "Ez a notesz el lett t\u00e1vol\u00edtva.", + "pad.modals.disconnected": "Kapcsolat bontva.", + "pad.modals.disconnected.explanation": "A szerverrel val\u00f3 kapcsolat megsz\u0171nt.", + "pad.modals.disconnected.cause": "Lehet, hogy a szerver nem el\u00e9rhet\u0151. K\u00e9rlek, \u00e9rtes\u00edts minket, ha a probl\u00e9ma tart\u00f3san fenn\u00e1ll.", + "pad.share": "Notesz megoszt\u00e1sa", + "pad.share.readonly": "Csak olvashat\u00f3", + "pad.share.link": "Hivatkoz\u00e1s", + "pad.share.emebdcode": "URL be\u00e1gyaz\u00e1sa", + "pad.chat": "Cseveg\u00e9s", + "pad.chat.title": "A noteszhez tartoz\u00f3 cseveg\u00e9s megnyit\u00e1sa.", + "timeslider.pageTitle": "{{appTitle}} id\u0151cs\u00faszka", + "timeslider.toolbar.returnbutton": "Vissza a noteszhez", + "timeslider.toolbar.authors": "Szerz\u0151k:", + "timeslider.toolbar.authorsList": "Nincsenek szerz\u0151k", + "timeslider.exportCurrent": "Jelenlegi v\u00e1ltozat export\u00e1l\u00e1sa \u00edgy:", + "timeslider.version": "{{version}} verzi\u00f3", + "timeslider.saved": "{{year}}. {{month}} {{day}}-n elmentve", + "timeslider.dateformat": "{{year}}/{{month}}/{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "janu\u00e1r", + "timeslider.month.february": "febru\u00e1r", + "timeslider.month.march": "m\u00e1rcius", + "timeslider.month.april": "\u00e1prilis", + "timeslider.month.may": "m\u00e1jus", + "timeslider.month.june": "j\u00fanius", + "timeslider.month.july": "j\u00falius", + "timeslider.month.august": "augusztus", + "timeslider.month.september": "szeptember", + "timeslider.month.october": "okt\u00f3ber", + "timeslider.month.november": "november", + "timeslider.month.december": "december", + "pad.userlist.entername": "Add meg a nevedet", + "pad.userlist.unnamed": "n\u00e9vtelen", + "pad.userlist.guest": "Vend\u00e9g", + "pad.userlist.deny": "Megtagad", + "pad.userlist.approve": "J\u00f3v\u00e1hagy", + "pad.impexp.importbutton": "Import\u00e1l\u00e1s most", + "pad.impexp.importing": "Import\u00e1l\u00e1s\u2026", + "pad.impexp.uploadFailed": "A felt\u00f6lt\u00e9s sikertelen, pr\u00f3b\u00e1ld meg \u00fajra", + "pad.impexp.importfailed": "Az import\u00e1l\u00e1s nem siker\u00fclt" } \ No newline at end of file diff --git a/src/locales/ia.json b/src/locales/ia.json index 3c57a8f0..3fea6648 100644 --- a/src/locales/ia.json +++ b/src/locales/ia.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": [ - "McDutchie" - ] - }, - "index.newPad": "Nove pad", - "index.createOpenPad": "o crear\/aperir un pad con le nomine:", - "pad.toolbar.bold.title": "Grasse (Ctrl-B)", - "pad.toolbar.italic.title": "Italic (Ctrl-I)", - "pad.toolbar.underline.title": "Sublinear (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Cancellar", - "pad.toolbar.ol.title": "Lista ordinate", - "pad.toolbar.ul.title": "Lista non ordinate", - "pad.toolbar.indent.title": "Indentar", - "pad.toolbar.unindent.title": "Disindentar", - "pad.toolbar.undo.title": "Disfacer (Ctrl-Z)", - "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Rader colores de autor", - "pad.toolbar.import_export.title": "Importar\/exportar in differente formatos de file", - "pad.toolbar.timeslider.title": "Glissa-tempore", - "pad.toolbar.savedRevision.title": "Version salveguardate", - "pad.toolbar.settings.title": "Configuration", - "pad.toolbar.embed.title": "Incorporar iste pad", - "pad.toolbar.showusers.title": "Monstrar le usatores de iste pad", - "pad.colorpicker.save": "Salveguardar", - "pad.colorpicker.cancel": "Cancellar", - "pad.loading": "Cargamento\u2026", - "pad.passwordRequired": "Un contrasigno es necessari pro acceder a iste pad", - "pad.permissionDenied": "Tu non ha le permission de acceder a iste pad", - "pad.wrongPassword": "Le contrasigno es incorrecte", - "pad.settings.padSettings": "Configuration del pad", - "pad.settings.myView": "Mi vista", - "pad.settings.stickychat": "Chat sempre visibile", - "pad.settings.colorcheck": "Colores de autor", - "pad.settings.linenocheck": "Numeros de linea", - "pad.settings.rtlcheck": "Leger le contento de dextra a sinistra?", - "pad.settings.fontType": "Typo de litteras:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monospatial", - "pad.settings.globalView": "Vista global", - "pad.settings.language": "Lingua:", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Incargar qualcunque file de texto o documento", - "pad.importExport.importSuccessful": "Succedite!", - "pad.importExport.export": "Exportar le pad actual como:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Texto simple", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Tu pote solmente importar files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, installa AbiWord<\/a>.", - "pad.modals.connected": "Connectite.", - "pad.modals.reconnecting": "Reconnecte a tu pad\u2026", - "pad.modals.forcereconnect": "Fortiar reconnexion", - "pad.modals.userdup": "Aperte in un altere fenestra", - "pad.modals.userdup.explanation": "Iste pad pare esser aperte in plus de un fenestra de navigator in iste computator.", - "pad.modals.userdup.advice": "Reconnecte pro usar iste fenestra.", - "pad.modals.unauth": "Non autorisate", - "pad.modals.unauth.explanation": "Tu permissiones ha cambiate durante que tu legeva iste pagina. Tenta reconnecter.", - "pad.modals.looping": "Disconnectite.", - "pad.modals.looping.explanation": "Il ha problemas de communication con le servitor de synchronisation.", - "pad.modals.looping.cause": "Il es possibile que tu connexion passa per un firewall o proxy incompatibile.", - "pad.modals.initsocketfail": "Le servitor es inattingibile.", - "pad.modals.initsocketfail.explanation": "Impossibile connecter al servitor de synchronisation.", - "pad.modals.initsocketfail.cause": "Isto es probabilemente causate per un problema con tu navigator o connexion a internet.", - "pad.modals.slowcommit": "Disconnectite.", - "pad.modals.slowcommit.explanation": "Le servitor non responde.", - "pad.modals.slowcommit.cause": "Isto pote esser causate per problemas con le connexion al rete.", - "pad.modals.deleted": "Delite.", - "pad.modals.deleted.explanation": "Iste pad ha essite removite.", - "pad.modals.disconnected": "Tu ha essite disconnectite.", - "pad.modals.disconnected.explanation": "Le connexion al servitor ha essite perdite.", - "pad.modals.disconnected.cause": "Le servitor pote esser indisponibile. Per favor notifica nos si isto continua a producer se.", - "pad.share": "Diffunder iste pad", - "pad.share.readonly": "Lectura solmente", - "pad.share.link": "Ligamine", - "pad.share.emebdcode": "Codice de incorporation", - "pad.chat": "Chat", - "pad.chat.title": "Aperir le chat pro iste pad.", - "pad.chat.loadmessages": "Cargar plus messages", - "timeslider.pageTitle": "Glissa-tempore pro {{appTitle}}", - "timeslider.toolbar.returnbutton": "Retornar al pad", - "timeslider.toolbar.authors": "Autores:", - "timeslider.toolbar.authorsList": "Nulle autor", - "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar le version actual como:", - "timeslider.version": "Version {{version}}", - "timeslider.saved": "Salveguardate le {{day}} de {{month}} {{year}}", - "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "januario", - "timeslider.month.february": "februario", - "timeslider.month.march": "martio", - "timeslider.month.april": "april", - "timeslider.month.may": "maio", - "timeslider.month.june": "junio", - "timeslider.month.july": "julio", - "timeslider.month.august": "augusto", - "timeslider.month.september": "septembre", - "timeslider.month.october": "octobre", - "timeslider.month.november": "novembre", - "timeslider.month.december": "decembre", - "timeslider.unnamedauthor": "{{num}} autor sin nomine", - "timeslider.unnamedauthors": "{{num}} autores sin nomine", - "pad.savedrevs.marked": "Iste version es ora marcate como version salveguardate", - "pad.userlist.entername": "Entra tu nomine", - "pad.userlist.unnamed": "sin nomine", - "pad.userlist.guest": "Invitato", - "pad.userlist.deny": "Refusar", - "pad.userlist.approve": "Approbar", - "pad.editbar.clearcolors": "Rader le colores de autor in tote le documento?", - "pad.impexp.importbutton": "Importar ora", - "pad.impexp.importing": "Importation in curso\u2026", - "pad.impexp.confirmimport": "Le importation de un file superscribera le texto actual del pad. Es tu secur de voler continuar?", - "pad.impexp.convertFailed": "Nos non ha potite importar iste file. Per favor usa un altere formato de documento o copia e colla le texto manualmente.", - "pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.", - "pad.impexp.importfailed": "Importation fallite", - "pad.impexp.copypaste": "Per favor copia e colla", - "pad.impexp.exportdisabled": "Le exportation in formato {{type}} es disactivate. Per favor contacta le administrator del systema pro detalios." + "@metadata": { + "authors": [ + "McDutchie" + ] + }, + "index.newPad": "Nove pad", + "index.createOpenPad": "o crear/aperir un pad con le nomine:", + "pad.toolbar.bold.title": "Grasse (Ctrl-B)", + "pad.toolbar.italic.title": "Italic (Ctrl-I)", + "pad.toolbar.underline.title": "Sublinear (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Cancellar", + "pad.toolbar.ol.title": "Lista ordinate", + "pad.toolbar.ul.title": "Lista non ordinate", + "pad.toolbar.indent.title": "Indentar", + "pad.toolbar.unindent.title": "Disindentar", + "pad.toolbar.undo.title": "Disfacer (Ctrl-Z)", + "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Rader colores de autor", + "pad.toolbar.import_export.title": "Importar/exportar in differente formatos de file", + "pad.toolbar.timeslider.title": "Glissa-tempore", + "pad.toolbar.savedRevision.title": "Version salveguardate", + "pad.toolbar.settings.title": "Configuration", + "pad.toolbar.embed.title": "Incorporar iste pad", + "pad.toolbar.showusers.title": "Monstrar le usatores de iste pad", + "pad.colorpicker.save": "Salveguardar", + "pad.colorpicker.cancel": "Cancellar", + "pad.loading": "Cargamento\u2026", + "pad.passwordRequired": "Un contrasigno es necessari pro acceder a iste pad", + "pad.permissionDenied": "Tu non ha le permission de acceder a iste pad", + "pad.wrongPassword": "Le contrasigno es incorrecte", + "pad.settings.padSettings": "Configuration del pad", + "pad.settings.myView": "Mi vista", + "pad.settings.stickychat": "Chat sempre visibile", + "pad.settings.colorcheck": "Colores de autor", + "pad.settings.linenocheck": "Numeros de linea", + "pad.settings.rtlcheck": "Leger le contento de dextra a sinistra?", + "pad.settings.fontType": "Typo de litteras:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospatial", + "pad.settings.globalView": "Vista global", + "pad.settings.language": "Lingua:", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Incargar qualcunque file de texto o documento", + "pad.importExport.importSuccessful": "Succedite!", + "pad.importExport.export": "Exportar le pad actual como:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Texto simple", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Tu pote solmente importar files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstalla AbiWord\u003C/a\u003E.", + "pad.modals.connected": "Connectite.", + "pad.modals.reconnecting": "Reconnecte a tu pad\u2026", + "pad.modals.forcereconnect": "Fortiar reconnexion", + "pad.modals.userdup": "Aperte in un altere fenestra", + "pad.modals.userdup.explanation": "Iste pad pare esser aperte in plus de un fenestra de navigator in iste computator.", + "pad.modals.userdup.advice": "Reconnecte pro usar iste fenestra.", + "pad.modals.unauth": "Non autorisate", + "pad.modals.unauth.explanation": "Tu permissiones ha cambiate durante que tu legeva iste pagina. Tenta reconnecter.", + "pad.modals.looping": "Disconnectite.", + "pad.modals.looping.explanation": "Il ha problemas de communication con le servitor de synchronisation.", + "pad.modals.looping.cause": "Il es possibile que tu connexion passa per un firewall o proxy incompatibile.", + "pad.modals.initsocketfail": "Le servitor es inattingibile.", + "pad.modals.initsocketfail.explanation": "Impossibile connecter al servitor de synchronisation.", + "pad.modals.initsocketfail.cause": "Isto es probabilemente causate per un problema con tu navigator o connexion a internet.", + "pad.modals.slowcommit": "Disconnectite.", + "pad.modals.slowcommit.explanation": "Le servitor non responde.", + "pad.modals.slowcommit.cause": "Isto pote esser causate per problemas con le connexion al rete.", + "pad.modals.deleted": "Delite.", + "pad.modals.deleted.explanation": "Iste pad ha essite removite.", + "pad.modals.disconnected": "Tu ha essite disconnectite.", + "pad.modals.disconnected.explanation": "Le connexion al servitor ha essite perdite.", + "pad.modals.disconnected.cause": "Le servitor pote esser indisponibile. Per favor notifica nos si isto continua a producer se.", + "pad.share": "Diffunder iste pad", + "pad.share.readonly": "Lectura solmente", + "pad.share.link": "Ligamine", + "pad.share.emebdcode": "Codice de incorporation", + "pad.chat": "Chat", + "pad.chat.title": "Aperir le chat pro iste pad.", + "pad.chat.loadmessages": "Cargar plus messages", + "timeslider.pageTitle": "Glissa-tempore pro {{appTitle}}", + "timeslider.toolbar.returnbutton": "Retornar al pad", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Nulle autor", + "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar le version actual como:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Salveguardate le {{day}} de {{month}} {{year}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januario", + "timeslider.month.february": "februario", + "timeslider.month.march": "martio", + "timeslider.month.april": "april", + "timeslider.month.may": "maio", + "timeslider.month.june": "junio", + "timeslider.month.july": "julio", + "timeslider.month.august": "augusto", + "timeslider.month.september": "septembre", + "timeslider.month.october": "octobre", + "timeslider.month.november": "novembre", + "timeslider.month.december": "decembre", + "timeslider.unnamedauthor": "{{num}} autor sin nomine", + "timeslider.unnamedauthors": "{{num}} autores sin nomine", + "pad.savedrevs.marked": "Iste version es ora marcate como version salveguardate", + "pad.userlist.entername": "Entra tu nomine", + "pad.userlist.unnamed": "sin nomine", + "pad.userlist.guest": "Invitato", + "pad.userlist.deny": "Refusar", + "pad.userlist.approve": "Approbar", + "pad.editbar.clearcolors": "Rader le colores de autor in tote le documento?", + "pad.impexp.importbutton": "Importar ora", + "pad.impexp.importing": "Importation in curso\u2026", + "pad.impexp.confirmimport": "Le importation de un file superscribera le texto actual del pad. Es tu secur de voler continuar?", + "pad.impexp.convertFailed": "Nos non ha potite importar iste file. Per favor usa un altere formato de documento o copia e colla le texto manualmente.", + "pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.", + "pad.impexp.importfailed": "Importation fallite", + "pad.impexp.copypaste": "Per favor copia e colla", + "pad.impexp.exportdisabled": "Le exportation in formato {{type}} es disactivate. Per favor contacta le administrator del systema pro detalios." } \ No newline at end of file diff --git a/src/locales/it.json b/src/locales/it.json index c80b2a39..9f3371b5 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1,124 +1,124 @@ { - "@metadata": { - "authors": { - "0": "Beta16", - "1": "Gianfranco", - "2": "Muxator", - "4": "Vituzzu" - } - }, - "index.newPad": "Nuovo Pad", - "index.createOpenPad": "o creare o aprire un Pad con il nome:", - "pad.toolbar.bold.title": "Grassetto (Ctrl-B)", - "pad.toolbar.italic.title": "Corsivo (Ctrl-I)", - "pad.toolbar.underline.title": "Sottolineato (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Barrato", - "pad.toolbar.ol.title": "Elenco numerato", - "pad.toolbar.ul.title": "Elenco puntato", - "pad.toolbar.indent.title": "Rientro", - "pad.toolbar.unindent.title": "Riduci rientro", - "pad.toolbar.undo.title": "Annulla (Ctrl-Z)", - "pad.toolbar.redo.title": "Ripeti (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Elimina i colori che indicano gli autori", - "pad.toolbar.import_export.title": "Importa\/esporta da\/a diversi formati di file", - "pad.toolbar.timeslider.title": "Presentazione cronologia", - "pad.toolbar.savedRevision.title": "Versione salvata", - "pad.toolbar.settings.title": "Impostazioni", - "pad.toolbar.embed.title": "Incorpora questo Pad", - "pad.toolbar.showusers.title": "Visualizza gli utenti su questo Pad", - "pad.colorpicker.save": "Salva", - "pad.colorpicker.cancel": "Annulla", - "pad.loading": "Caricamento in corso\u2026", - "pad.passwordRequired": "Per accedere a questo Pad \u00e8 necessaria una password", - "pad.permissionDenied": "Non si dispone dei permessi necessari per accedere a questo Pad", - "pad.wrongPassword": "La password \u00e8 sbagliata", - "pad.settings.padSettings": "Impostazioni del Pad", - "pad.settings.myView": "Mia visualizzazione", - "pad.settings.stickychat": "Chat sempre sullo schermo", - "pad.settings.colorcheck": "Colori che indicano gli autori", - "pad.settings.linenocheck": "Numeri di riga", - "pad.settings.rtlcheck": "Leggere il contenuto da destra a sinistra?", - "pad.settings.fontType": "Tipo di carattere:", - "pad.settings.fontType.normal": "Normale", - "pad.settings.fontType.monospaced": "A larghezza fissa", - "pad.settings.globalView": "Visualizzazione globale", - "pad.settings.language": "Lingua:", - "pad.importExport.import_export": "Importazione\/esportazione", - "pad.importExport.import": "Carica un file di testo o un documento", - "pad.importExport.importSuccessful": "Riuscito!", - "pad.importExport.export": "Esportare il Pad corrente come:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Solo testo", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u00c8 possibile importare solo i formati di testo semplice o HTML. Per metodi pi\u00f9 avanzati di importazione installare Abiword<\/a>.", - "pad.modals.connected": "Connesso.", - "pad.modals.reconnecting": "Riconnessione al pad in corso...", - "pad.modals.forcereconnect": "Forza la riconnessione", - "pad.modals.userdup": "Aperto in un'altra finestra", - "pad.modals.userdup.explanation": "Questo Pad sembra essere aperto in pi\u00f9 di una finestra del browser su questo computer.", - "pad.modals.userdup.advice": "Riconnettiti per utilizzare invece questa finestra.", - "pad.modals.unauth": "Non autorizzato", - "pad.modals.unauth.explanation": "Le tue autorizzazioni sono state modificate durante la visualizzazione di questa pagina. Prova a riconnetterti.", - "pad.modals.looping": "Disconnesso.", - "pad.modals.looping.explanation": "Ci sono problemi di comunicazione con il server di sincronizzazione.", - "pad.modals.looping.cause": "Forse sei connesso attraverso un firewall o un server proxy non compatibili.", - "pad.modals.initsocketfail": "Il server non \u00e8 raggiungibile.", - "pad.modals.initsocketfail.explanation": "Impossibile connettersi al server di sincronizzazione.", - "pad.modals.initsocketfail.cause": "Questo probabilmente \u00e8 dovuto a un problema con il tuo browser o con la tua connessione a internet.", - "pad.modals.slowcommit": "Disconnesso.", - "pad.modals.slowcommit.explanation": "Il server non risponde.", - "pad.modals.slowcommit.cause": "Questo potrebbe essere dovuto a problemi con la connettivit\u00e0 di rete.", - "pad.modals.deleted": "Cancellato.", - "pad.modals.deleted.explanation": "Questo Pad \u00e8 stato rimosso.", - "pad.modals.disconnected": "Sei stato disconnesso.", - "pad.modals.disconnected.explanation": "La connessione al server \u00e8 stata persa", - "pad.modals.disconnected.cause": "Il server potrebbe essere non disponibile. Per favore, fateci sapere se il problema persiste.", - "pad.share": "Condividi questo Pad", - "pad.share.readonly": "Sola lettura", - "pad.share.link": "Link", - "pad.share.emebdcode": "Incorpora URL", - "pad.chat": "Chat", - "pad.chat.title": "Apri la chat per questo Pad.", - "pad.chat.loadmessages": "Carica altri messaggi", - "timeslider.pageTitle": "Cronologia {{appTitle}}", - "timeslider.toolbar.returnbutton": "Ritorna al Pad", - "timeslider.toolbar.authors": "Autori:", - "timeslider.toolbar.authorsList": "Nessun autore", - "timeslider.toolbar.exportlink.title": "esporta", - "timeslider.exportCurrent": "Esporta la versione corrente come:", - "timeslider.version": "Versione {{version}}", - "timeslider.saved": "Salvato {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "gennaio", - "timeslider.month.february": "febbraio", - "timeslider.month.march": "marzo", - "timeslider.month.april": "aprile", - "timeslider.month.may": "maggio", - "timeslider.month.june": "giugno", - "timeslider.month.july": "luglio", - "timeslider.month.august": "agosto", - "timeslider.month.september": "settembre", - "timeslider.month.october": "ottobre", - "timeslider.month.november": "novembre", - "timeslider.month.december": "dicembre", - "timeslider.unnamedauthor": "{{num}} autore senza nome", - "timeslider.unnamedauthors": "{{num}} autori senza nome", - "pad.savedrevs.marked": "Questa revisione \u00e8 ora contrassegnata come una versione salvata", - "pad.userlist.entername": "Inserisci il tuo nome", - "pad.userlist.unnamed": "senza nome", - "pad.userlist.guest": "Ospite", - "pad.userlist.deny": "Nega", - "pad.userlist.approve": "Approva", - "pad.editbar.clearcolors": "Eliminare i colori degli autori sull'intero documento?", - "pad.impexp.importbutton": "Importa ora", - "pad.impexp.importing": "Importazione in corso...", - "pad.impexp.confirmimport": "L'importazione del file sovrascriver\u00e0 il testo attuale del Pad. Sei sicuro di voler procedere?", - "pad.impexp.convertFailed": "Non \u00e8 stato possibile importare questo file. Utilizzare un formato differente o copiare ed incollare a mano", - "pad.impexp.uploadFailed": "Caricamento non riuscito, riprovare", - "pad.impexp.importfailed": "Importazione fallita", - "pad.impexp.copypaste": "Si prega di copiare e incollare", - "pad.impexp.exportdisabled": "L'esportazione come {{type}} \u00e8 disabilitata. Contattare l'amministratore per i dettagli." + "@metadata": { + "authors": { + "0": "Beta16", + "1": "Gianfranco", + "2": "Muxator", + "4": "Vituzzu" + } + }, + "index.newPad": "Nuovo Pad", + "index.createOpenPad": "o creare o aprire un Pad con il nome:", + "pad.toolbar.bold.title": "Grassetto (Ctrl-B)", + "pad.toolbar.italic.title": "Corsivo (Ctrl-I)", + "pad.toolbar.underline.title": "Sottolineato (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Barrato", + "pad.toolbar.ol.title": "Elenco numerato", + "pad.toolbar.ul.title": "Elenco puntato", + "pad.toolbar.indent.title": "Rientro", + "pad.toolbar.unindent.title": "Riduci rientro", + "pad.toolbar.undo.title": "Annulla (Ctrl-Z)", + "pad.toolbar.redo.title": "Ripeti (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Elimina i colori che indicano gli autori", + "pad.toolbar.import_export.title": "Importa/esporta da/a diversi formati di file", + "pad.toolbar.timeslider.title": "Presentazione cronologia", + "pad.toolbar.savedRevision.title": "Versione salvata", + "pad.toolbar.settings.title": "Impostazioni", + "pad.toolbar.embed.title": "Condividi ed incorpora questo Pad", + "pad.toolbar.showusers.title": "Visualizza gli utenti su questo Pad", + "pad.colorpicker.save": "Salva", + "pad.colorpicker.cancel": "Annulla", + "pad.loading": "Caricamento in corso\u2026", + "pad.passwordRequired": "Per accedere a questo Pad \u00e8 necessaria una password", + "pad.permissionDenied": "Non si dispone dei permessi necessari per accedere a questo Pad", + "pad.wrongPassword": "La password \u00e8 sbagliata", + "pad.settings.padSettings": "Impostazioni del Pad", + "pad.settings.myView": "Mia visualizzazione", + "pad.settings.stickychat": "Chat sempre sullo schermo", + "pad.settings.colorcheck": "Colori che indicano gli autori", + "pad.settings.linenocheck": "Numeri di riga", + "pad.settings.rtlcheck": "Leggere il contenuto da destra a sinistra?", + "pad.settings.fontType": "Tipo di carattere:", + "pad.settings.fontType.normal": "Normale", + "pad.settings.fontType.monospaced": "A larghezza fissa", + "pad.settings.globalView": "Visualizzazione globale", + "pad.settings.language": "Lingua:", + "pad.importExport.import_export": "Importazione/esportazione", + "pad.importExport.import": "Carica un file di testo o un documento", + "pad.importExport.importSuccessful": "Riuscito!", + "pad.importExport.export": "Esportare il Pad corrente come:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Solo testo", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u00c8 possibile importare solo i formati di testo semplice o HTML. Per metodi pi\u00f9 avanzati di importazione \u003Ca href=https://github.com/broadcast/etherpad-lite/wiki/How-to-enable-importing and exporting-different file formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\u003Einstallare Abiword\u003C/a\u003E.", + "pad.modals.connected": "Connesso.", + "pad.modals.reconnecting": "Riconnessione al pad in corso...", + "pad.modals.forcereconnect": "Forza la riconnessione", + "pad.modals.userdup": "Aperto in un'altra finestra", + "pad.modals.userdup.explanation": "Questo Pad sembra essere aperto in pi\u00f9 di una finestra del browser su questo computer.", + "pad.modals.userdup.advice": "Riconnettiti per utilizzare invece questa finestra.", + "pad.modals.unauth": "Non autorizzato", + "pad.modals.unauth.explanation": "Le tue autorizzazioni sono state modificate durante la visualizzazione di questa pagina. Prova a riconnetterti.", + "pad.modals.looping": "Disconnesso.", + "pad.modals.looping.explanation": "Ci sono problemi di comunicazione con il server di sincronizzazione.", + "pad.modals.looping.cause": "Forse sei connesso attraverso un firewall o un server proxy non compatibili.", + "pad.modals.initsocketfail": "Il server non \u00e8 raggiungibile.", + "pad.modals.initsocketfail.explanation": "Impossibile connettersi al server di sincronizzazione.", + "pad.modals.initsocketfail.cause": "Questo probabilmente \u00e8 dovuto a un problema con il tuo browser o con la tua connessione a internet.", + "pad.modals.slowcommit": "Disconnesso.", + "pad.modals.slowcommit.explanation": "Il server non risponde.", + "pad.modals.slowcommit.cause": "Questo potrebbe essere dovuto a problemi con la connettivit\u00e0 di rete.", + "pad.modals.deleted": "Cancellato.", + "pad.modals.deleted.explanation": "Questo Pad \u00e8 stato rimosso.", + "pad.modals.disconnected": "Sei stato disconnesso.", + "pad.modals.disconnected.explanation": "La connessione al server \u00e8 stata persa", + "pad.modals.disconnected.cause": "Il server potrebbe essere non disponibile. Per favore, fateci sapere se il problema persiste.", + "pad.share": "Condividi questo Pad", + "pad.share.readonly": "Sola lettura", + "pad.share.link": "Link", + "pad.share.emebdcode": "Incorpora URL", + "pad.chat": "Chat", + "pad.chat.title": "Apri la chat per questo Pad.", + "pad.chat.loadmessages": "Carica altri messaggi", + "timeslider.pageTitle": "Cronologia {{appTitle}}", + "timeslider.toolbar.returnbutton": "Ritorna al Pad", + "timeslider.toolbar.authors": "Autori:", + "timeslider.toolbar.authorsList": "Nessun autore", + "timeslider.toolbar.exportlink.title": "esporta", + "timeslider.exportCurrent": "Esporta la versione corrente come:", + "timeslider.version": "Versione {{version}}", + "timeslider.saved": "Salvato {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "gennaio", + "timeslider.month.february": "febbraio", + "timeslider.month.march": "marzo", + "timeslider.month.april": "aprile", + "timeslider.month.may": "maggio", + "timeslider.month.june": "giugno", + "timeslider.month.july": "luglio", + "timeslider.month.august": "agosto", + "timeslider.month.september": "settembre", + "timeslider.month.october": "ottobre", + "timeslider.month.november": "novembre", + "timeslider.month.december": "dicembre", + "timeslider.unnamedauthor": "{{num}} autore senza nome", + "timeslider.unnamedauthors": "{{num}} autori senza nome", + "pad.savedrevs.marked": "Questa revisione \u00e8 ora contrassegnata come una versione salvata", + "pad.userlist.entername": "Inserisci il tuo nome", + "pad.userlist.unnamed": "senza nome", + "pad.userlist.guest": "Ospite", + "pad.userlist.deny": "Nega", + "pad.userlist.approve": "Approva", + "pad.editbar.clearcolors": "Eliminare i colori degli autori sull'intero documento?", + "pad.impexp.importbutton": "Importa ora", + "pad.impexp.importing": "Importazione in corso...", + "pad.impexp.confirmimport": "L'importazione del file sovrascriver\u00e0 il testo attuale del Pad. Sei sicuro di voler procedere?", + "pad.impexp.convertFailed": "Non \u00e8 stato possibile importare questo file. Utilizzare un formato differente o copiare ed incollare a mano", + "pad.impexp.uploadFailed": "Caricamento non riuscito, riprovare", + "pad.impexp.importfailed": "Importazione fallita", + "pad.impexp.copypaste": "Si prega di copiare e incollare", + "pad.impexp.exportdisabled": "L'esportazione come {{type}} \u00e8 disabilitata. Contattare l'amministratore per i dettagli." } \ No newline at end of file diff --git a/src/locales/ja.json b/src/locales/ja.json index 2464f02c..bffacb54 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": [ - "Shirayuki" - ] - }, - "index.newPad": "\u65b0\u898f\u4f5c\u6210", - "index.createOpenPad": "\u307e\u305f\u306f\u4f5c\u6210\/\u7de8\u96c6\u3059\u308b\u30d1\u30c3\u30c9\u540d\u3092\u5165\u529b:", - "pad.toolbar.bold.title": "\u592a\u5b57 (Ctrl-B)", - "pad.toolbar.italic.title": "\u659c\u4f53 (Ctrl-I)", - "pad.toolbar.underline.title": "\u4e0b\u7dda (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u53d6\u308a\u6d88\u3057\u7dda", - "pad.toolbar.ol.title": "\u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8", - "pad.toolbar.ul.title": "\u756a\u53f7\u306a\u3057\u30ea\u30b9\u30c8", - "pad.toolbar.indent.title": "\u30a4\u30f3\u30c7\u30f3\u30c8", - "pad.toolbar.unindent.title": "\u30a4\u30f3\u30c7\u30f3\u30c8\u89e3\u9664", - "pad.toolbar.undo.title": "\u5143\u306b\u623b\u3059 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u3084\u308a\u76f4\u3057 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb", - "pad.toolbar.import_export.title": "\u4ed6\u306e\u5f62\u5f0f\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", - "pad.toolbar.timeslider.title": "\u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", - "pad.toolbar.savedRevision.title": "\u7248\u3092\u4fdd\u5b58", - "pad.toolbar.settings.title": "\u8a2d\u5b9a", - "pad.toolbar.embed.title": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u57cb\u3081\u8fbc\u3080", - "pad.toolbar.showusers.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u8868\u793a", - "pad.colorpicker.save": "\u4fdd\u5b58", - "pad.colorpicker.cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", - "pad.loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...", - "pad.passwordRequired": "\u3053\u306e\u30d1\u30c3\u30c9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059", - "pad.permissionDenied": "\u3042\u306a\u305f\u306b\u306f\u3053\u306e\u30d1\u30c3\u30c9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u304c\u3042\u308a\u307e\u305b\u3093", - "pad.wrongPassword": "\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059", - "pad.settings.padSettings": "\u30d1\u30c3\u30c9\u306e\u8a2d\u5b9a", - "pad.settings.myView": "\u500b\u4eba\u8a2d\u5b9a", - "pad.settings.stickychat": "\u753b\u9762\u306b\u30c1\u30e3\u30c3\u30c8\u3092\u5e38\u306b\u8868\u793a", - "pad.settings.colorcheck": "\u4f5c\u8005\u306e\u8272\u5206\u3051", - "pad.settings.linenocheck": "\u884c\u756a\u53f7", - "pad.settings.rtlcheck": "\u53f3\u6a2a\u66f8\u304d\u306b\u3059\u308b", - "pad.settings.fontType": "\u30d5\u30a9\u30f3\u30c8\u306e\u7a2e\u985e:", - "pad.settings.fontType.normal": "\u901a\u5e38", - "pad.settings.fontType.monospaced": "\u56fa\u5b9a\u5e45", - "pad.settings.globalView": "\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a", - "pad.settings.language": "\u8a00\u8a9e:", - "pad.importExport.import_export": "\u30a4\u30f3\u30dd\u30fc\u30c8\/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", - "pad.importExport.import": "\u3042\u3089\u3086\u308b\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3084\u6587\u66f8\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u3059", - "pad.importExport.importSuccessful": "\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002", - "pad.importExport.export": "\u73fe\u5728\u306e\u30d1\u30c3\u30c9\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u307e\u305f\u306f HTML \u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306e\u307f\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u3059\u3002\u3088\u308a\u9ad8\u5ea6\u306a\u30a4\u30f3\u30dd\u30fc\u30c8\u6a5f\u80fd\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001abiword \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a>\u3057\u3066\u304f\u3060\u3055\u3044\u3002", - "pad.modals.connected": "\u63a5\u7d9a\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.reconnecting": "\u30d1\u30c3\u30c9\u306b\u518d\u63a5\u7d9a\u4e2d...", - "pad.modals.forcereconnect": "\u5f37\u5236\u7684\u306b\u518d\u63a5\u7d9a", - "pad.modals.userdup": "\u5225\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u958b\u304b\u308c\u3066\u3044\u307e\u3059", - "pad.modals.userdup.explanation": "\u3053\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306e\u8907\u6570\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3001\u3053\u306e\u30d1\u30c3\u30c9\u3092\u958b\u3044\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002", - "pad.modals.userdup.advice": "\u4ee3\u308f\u308a\u306b\u3053\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u518d\u63a5\u7d9a\u3057\u307e\u3059\u3002", - "pad.modals.unauth": "\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093", - "pad.modals.unauth.explanation": "\u3053\u306e\u30da\u30fc\u30b8\u306e\u95b2\u89a7\u4e2d\u306b\u3042\u306a\u305f\u306e\u6a29\u9650\u304c\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002\u518d\u63a5\u7d9a\u3092\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002", - "pad.modals.looping": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.looping.explanation": "\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u901a\u4fe1\u306b\u554f\u984c\u70b9\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.looping.cause": "\u3054\u4f7f\u7528\u4e2d\u306e\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u307e\u305f\u306f\u30d7\u30ed\u30ad\u30b7\u3068\u306f\u4e92\u63db\u6027\u304c\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.initsocketfail": "\u30b5\u30fc\u30d0\u30fc\u306b\u5230\u9054\u3067\u304d\u307e\u305b\u3093\u3002", - "pad.modals.initsocketfail.explanation": "\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002", - "pad.modals.initsocketfail.cause": "\u3053\u308c\u306f\u3054\u4f7f\u7528\u4e2d\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u3084\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u63a5\u7d9a\u306e\u554f\u984c\u304c\u539f\u56e0\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.slowcommit": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.slowcommit.explanation": "\u30b5\u30fc\u30d0\u30fc\u304c\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002", - "pad.modals.slowcommit.cause": "\u3053\u308c\u306f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u306e\u554f\u984c\u304c\u539f\u56e0\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.deleted": "\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.deleted.explanation": "\u3053\u306e\u30d1\u30c3\u30c9\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.disconnected": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.disconnected.explanation": "\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u63a5\u7d9a\u304c\u5931\u308f\u308c\u307e\u3057\u305f", - "pad.modals.disconnected.cause": "\u30b5\u30fc\u30d0\u30fc\u306b\u5230\u9054\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u554f\u984c\u304c\u89e3\u6c7a\u3057\u306a\u3044\u5834\u5408\u306f\u304a\u77e5\u3089\u305b\u304f\u3060\u3055\u3044\u3002", - "pad.share": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u5171\u6709", - "pad.share.readonly": "\u8aad\u307f\u53d6\u308a\u5c02\u7528", - "pad.share.link": "\u30ea\u30f3\u30af", - "pad.share.emebdcode": "\u57cb\u3081\u8fbc\u307f\u7528 URL", - "pad.chat": "\u30c1\u30e3\u30c3\u30c8", - "pad.chat.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30c1\u30e3\u30c3\u30c8\u3092\u958b\u304d\u307e\u3059\u3002", - "pad.chat.loadmessages": "\u305d\u306e\u4ed6\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8aad\u307f\u8fbc\u3080", - "timeslider.pageTitle": "{{appTitle}} \u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", - "timeslider.toolbar.returnbutton": "\u30d1\u30c3\u30c9\u306b\u623b\u308b", - "timeslider.toolbar.authors": "\u4f5c\u8005:", - "timeslider.toolbar.authorsList": "\u4f5c\u8005\u306a\u3057", - "timeslider.toolbar.exportlink.title": "\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", - "timeslider.exportCurrent": "\u73fe\u5728\u306e\u7248\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", - "timeslider.version": "\u30d0\u30fc\u30b8\u30e7\u30f3 {{version}}", - "timeslider.saved": "| {{year}}\u5e74{{month}}{{day}}\u65e5\u306b\u4fdd\u5b58", - "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "1\u6708", - "timeslider.month.february": "2\u6708", - "timeslider.month.march": "3\u6708", - "timeslider.month.april": "4\u6708", - "timeslider.month.may": "5\u6708", - "timeslider.month.june": "6\u6708", - "timeslider.month.july": "7\u6708", - "timeslider.month.august": "8\u6708", - "timeslider.month.september": "9\u6708", - "timeslider.month.october": "10\u6708", - "timeslider.month.november": "11\u6708", - "timeslider.month.december": "12\u6708", - "timeslider.unnamedauthor": "{{num}} \u4eba\u306e\u533f\u540d\u306e\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}} \u4eba\u306e\u533f\u540d\u306e\u4f5c\u8005", - "pad.savedrevs.marked": "\u3053\u306e\u7248\u3092\u3001\u4fdd\u5b58\u6e08\u307f\u306e\u7248\u3068\u3057\u3066\u30de\u30fc\u30af\u3057\u307e\u3057\u305f\u3002", - "pad.userlist.entername": "\u540d\u524d\u3092\u5165\u529b", - "pad.userlist.unnamed": "\u540d\u524d\u306a\u3057", - "pad.userlist.guest": "\u30b2\u30b9\u30c8", - "pad.userlist.deny": "\u62d2\u5426", - "pad.userlist.approve": "\u627f\u8a8d", - "pad.editbar.clearcolors": "\u6587\u66f8\u5168\u4f53\u306e\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb\u3057\u307e\u3059\u304b?", - "pad.impexp.importbutton": "\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b", - "pad.impexp.importing": "\u30a4\u30f3\u30dd\u30fc\u30c8\u4e2d...", - "pad.impexp.confirmimport": "\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u3068\u3001\u30d1\u30c3\u30c9\u306e\u73fe\u5728\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u4e0a\u66f8\u304d\u3055\u308c\u307e\u3059\u3002\u672c\u5f53\u306b\u7d9a\u884c\u3057\u307e\u3059\u304b?", - "pad.impexp.convertFailed": "\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4ed6\u306e\u6587\u66f8\u5f62\u5f0f\u3092\u4f7f\u7528\u3059\u308b\u304b\u3001\u624b\u4f5c\u696d\u3067\u30b3\u30d4\u30fc & \u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044", - "pad.impexp.uploadFailed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044", - "pad.impexp.importfailed": "\u30a4\u30f3\u30dd\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f", - "pad.impexp.copypaste": "\u30b3\u30d4\u30fc & \u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044", - "pad.impexp.exportdisabled": "{{type}}\u5f62\u5f0f\u3067\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306f\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u8a73\u7d30\u306f\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005\u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044\u3002" + "@metadata": { + "authors": [ + "Shirayuki" + ] + }, + "index.newPad": "\u65b0\u898f\u4f5c\u6210", + "index.createOpenPad": "\u307e\u305f\u306f\u4f5c\u6210/\u7de8\u96c6\u3059\u308b\u30d1\u30c3\u30c9\u540d\u3092\u5165\u529b:", + "pad.toolbar.bold.title": "\u592a\u5b57 (Ctrl-B)", + "pad.toolbar.italic.title": "\u659c\u4f53 (Ctrl-I)", + "pad.toolbar.underline.title": "\u4e0b\u7dda (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u53d6\u308a\u6d88\u3057\u7dda", + "pad.toolbar.ol.title": "\u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8", + "pad.toolbar.ul.title": "\u756a\u53f7\u306a\u3057\u30ea\u30b9\u30c8", + "pad.toolbar.indent.title": "\u30a4\u30f3\u30c7\u30f3\u30c8", + "pad.toolbar.unindent.title": "\u30a4\u30f3\u30c7\u30f3\u30c8\u89e3\u9664", + "pad.toolbar.undo.title": "\u5143\u306b\u623b\u3059 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u3084\u308a\u76f4\u3057 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb", + "pad.toolbar.import_export.title": "\u4ed6\u306e\u5f62\u5f0f\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", + "pad.toolbar.timeslider.title": "\u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", + "pad.toolbar.savedRevision.title": "\u7248\u3092\u4fdd\u5b58", + "pad.toolbar.settings.title": "\u8a2d\u5b9a", + "pad.toolbar.embed.title": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u5171\u6709\u3059\u308b/\u57cb\u3081\u8fbc\u3080", + "pad.toolbar.showusers.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u8868\u793a", + "pad.colorpicker.save": "\u4fdd\u5b58", + "pad.colorpicker.cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", + "pad.loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...", + "pad.passwordRequired": "\u3053\u306e\u30d1\u30c3\u30c9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059", + "pad.permissionDenied": "\u3042\u306a\u305f\u306b\u306f\u3053\u306e\u30d1\u30c3\u30c9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u304c\u3042\u308a\u307e\u305b\u3093", + "pad.wrongPassword": "\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059", + "pad.settings.padSettings": "\u30d1\u30c3\u30c9\u306e\u8a2d\u5b9a", + "pad.settings.myView": "\u500b\u4eba\u8a2d\u5b9a", + "pad.settings.stickychat": "\u753b\u9762\u306b\u30c1\u30e3\u30c3\u30c8\u3092\u5e38\u306b\u8868\u793a", + "pad.settings.colorcheck": "\u4f5c\u8005\u306e\u8272\u5206\u3051", + "pad.settings.linenocheck": "\u884c\u756a\u53f7", + "pad.settings.rtlcheck": "\u53f3\u6a2a\u66f8\u304d\u306b\u3059\u308b", + "pad.settings.fontType": "\u30d5\u30a9\u30f3\u30c8\u306e\u7a2e\u985e:", + "pad.settings.fontType.normal": "\u901a\u5e38", + "pad.settings.fontType.monospaced": "\u56fa\u5b9a\u5e45", + "pad.settings.globalView": "\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a", + "pad.settings.language": "\u8a00\u8a9e:", + "pad.importExport.import_export": "\u30a4\u30f3\u30dd\u30fc\u30c8/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", + "pad.importExport.import": "\u3042\u3089\u3086\u308b\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3084\u6587\u66f8\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u3059", + "pad.importExport.importSuccessful": "\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002", + "pad.importExport.export": "\u73fe\u5728\u306e\u30d1\u30c3\u30c9\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u307e\u305f\u306f HTML \u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306e\u307f\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u3059\u3002\u3088\u308a\u9ad8\u5ea6\u306a\u30a4\u30f3\u30dd\u30fc\u30c8\u6a5f\u80fd\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eabiword \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u003C/a\u003E\u3057\u3066\u304f\u3060\u3055\u3044\u3002", + "pad.modals.connected": "\u63a5\u7d9a\u3055\u308c\u307e\u3057\u305f\u3002", + "pad.modals.reconnecting": "\u30d1\u30c3\u30c9\u306b\u518d\u63a5\u7d9a\u4e2d...", + "pad.modals.forcereconnect": "\u5f37\u5236\u7684\u306b\u518d\u63a5\u7d9a", + "pad.modals.userdup": "\u5225\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u958b\u304b\u308c\u3066\u3044\u307e\u3059", + "pad.modals.userdup.explanation": "\u3053\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306e\u8907\u6570\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3001\u3053\u306e\u30d1\u30c3\u30c9\u3092\u958b\u3044\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002", + "pad.modals.userdup.advice": "\u4ee3\u308f\u308a\u306b\u3053\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u518d\u63a5\u7d9a\u3057\u307e\u3059\u3002", + "pad.modals.unauth": "\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093", + "pad.modals.unauth.explanation": "\u3053\u306e\u30da\u30fc\u30b8\u306e\u95b2\u89a7\u4e2d\u306b\u3042\u306a\u305f\u306e\u6a29\u9650\u304c\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002\u518d\u63a5\u7d9a\u3092\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002", + "pad.modals.looping": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", + "pad.modals.looping.explanation": "\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u901a\u4fe1\u306b\u554f\u984c\u70b9\u304c\u3042\u308a\u307e\u3059\u3002", + "pad.modals.looping.cause": "\u3054\u4f7f\u7528\u4e2d\u306e\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u307e\u305f\u306f\u30d7\u30ed\u30ad\u30b7\u3068\u306f\u4e92\u63db\u6027\u304c\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", + "pad.modals.initsocketfail": "\u30b5\u30fc\u30d0\u30fc\u306b\u5230\u9054\u3067\u304d\u307e\u305b\u3093\u3002", + "pad.modals.initsocketfail.explanation": "\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002", + "pad.modals.initsocketfail.cause": "\u3053\u308c\u306f\u3054\u4f7f\u7528\u4e2d\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u3084\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u63a5\u7d9a\u306e\u554f\u984c\u304c\u539f\u56e0\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", + "pad.modals.slowcommit": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", + "pad.modals.slowcommit.explanation": "\u30b5\u30fc\u30d0\u30fc\u304c\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002", + "pad.modals.slowcommit.cause": "\u3053\u308c\u306f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u306e\u554f\u984c\u304c\u539f\u56e0\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", + "pad.modals.deleted": "\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002", + "pad.modals.deleted.explanation": "\u3053\u306e\u30d1\u30c3\u30c9\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002", + "pad.modals.disconnected": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", + "pad.modals.disconnected.explanation": "\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u63a5\u7d9a\u304c\u5931\u308f\u308c\u307e\u3057\u305f", + "pad.modals.disconnected.cause": "\u30b5\u30fc\u30d0\u30fc\u306b\u5230\u9054\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u554f\u984c\u304c\u89e3\u6c7a\u3057\u306a\u3044\u5834\u5408\u306f\u304a\u77e5\u3089\u305b\u304f\u3060\u3055\u3044\u3002", + "pad.share": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u5171\u6709", + "pad.share.readonly": "\u8aad\u307f\u53d6\u308a\u5c02\u7528", + "pad.share.link": "\u30ea\u30f3\u30af", + "pad.share.emebdcode": "\u57cb\u3081\u8fbc\u307f\u7528 URL", + "pad.chat": "\u30c1\u30e3\u30c3\u30c8", + "pad.chat.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30c1\u30e3\u30c3\u30c8\u3092\u958b\u304d\u307e\u3059\u3002", + "pad.chat.loadmessages": "\u305d\u306e\u4ed6\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8aad\u307f\u8fbc\u3080", + "timeslider.pageTitle": "{{appTitle}} \u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", + "timeslider.toolbar.returnbutton": "\u30d1\u30c3\u30c9\u306b\u623b\u308b", + "timeslider.toolbar.authors": "\u4f5c\u8005:", + "timeslider.toolbar.authorsList": "\u4f5c\u8005\u306a\u3057", + "timeslider.toolbar.exportlink.title": "\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", + "timeslider.exportCurrent": "\u73fe\u5728\u306e\u7248\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", + "timeslider.version": "\u30d0\u30fc\u30b8\u30e7\u30f3 {{version}}", + "timeslider.saved": "| {{year}}\u5e74{{month}}{{day}}\u65e5\u306b\u4fdd\u5b58", + "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "1\u6708", + "timeslider.month.february": "2\u6708", + "timeslider.month.march": "3\u6708", + "timeslider.month.april": "4\u6708", + "timeslider.month.may": "5\u6708", + "timeslider.month.june": "6\u6708", + "timeslider.month.july": "7\u6708", + "timeslider.month.august": "8\u6708", + "timeslider.month.september": "9\u6708", + "timeslider.month.october": "10\u6708", + "timeslider.month.november": "11\u6708", + "timeslider.month.december": "12\u6708", + "timeslider.unnamedauthor": "{{num}} \u4eba\u306e\u533f\u540d\u306e\u4f5c\u8005", + "timeslider.unnamedauthors": "{{num}} \u4eba\u306e\u533f\u540d\u306e\u4f5c\u8005", + "pad.savedrevs.marked": "\u3053\u306e\u7248\u3092\u3001\u4fdd\u5b58\u6e08\u307f\u306e\u7248\u3068\u3057\u3066\u30de\u30fc\u30af\u3057\u307e\u3057\u305f\u3002", + "pad.userlist.entername": "\u540d\u524d\u3092\u5165\u529b", + "pad.userlist.unnamed": "\u540d\u524d\u306a\u3057", + "pad.userlist.guest": "\u30b2\u30b9\u30c8", + "pad.userlist.deny": "\u62d2\u5426", + "pad.userlist.approve": "\u627f\u8a8d", + "pad.editbar.clearcolors": "\u6587\u66f8\u5168\u4f53\u306e\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb\u3057\u307e\u3059\u304b?", + "pad.impexp.importbutton": "\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b", + "pad.impexp.importing": "\u30a4\u30f3\u30dd\u30fc\u30c8\u4e2d...", + "pad.impexp.confirmimport": "\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u3068\u3001\u30d1\u30c3\u30c9\u306e\u73fe\u5728\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u4e0a\u66f8\u304d\u3055\u308c\u307e\u3059\u3002\u672c\u5f53\u306b\u7d9a\u884c\u3057\u307e\u3059\u304b?", + "pad.impexp.convertFailed": "\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4ed6\u306e\u6587\u66f8\u5f62\u5f0f\u3092\u4f7f\u7528\u3059\u308b\u304b\u3001\u624b\u4f5c\u696d\u3067\u30b3\u30d4\u30fc \u0026 \u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044", + "pad.impexp.uploadFailed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044", + "pad.impexp.importfailed": "\u30a4\u30f3\u30dd\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f", + "pad.impexp.copypaste": "\u30b3\u30d4\u30fc \u0026 \u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044", + "pad.impexp.exportdisabled": "{{type}}\u5f62\u5f0f\u3067\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306f\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u8a73\u7d30\u306f\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005\u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044\u3002" } \ No newline at end of file diff --git a/src/locales/ko.json b/src/locales/ko.json index ac12f0b4..298440ce 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": { - "1": "\uc544\ub77c" - } - }, - "index.newPad": "\uc0c8 \ud328\ub4dc", - "index.createOpenPad": "\ub610\ub294 \ub2e4\uc74c \uc774\ub984\uc73c\ub85c \ud328\ub4dc \ub9cc\ub4e4\uae30\/\uc5f4\uae30:", - "pad.toolbar.bold.title": "\uad75\uac8c (Ctrl-B)", - "pad.toolbar.italic.title": "\uae30\uc6b8\uc784 (Ctrl-I)", - "pad.toolbar.underline.title": "\ubc11\uc904 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\ucde8\uc18c\uc120", - "pad.toolbar.ol.title": "\uc21c\uc11c \uc788\ub294 \ubaa9\ub85d", - "pad.toolbar.ul.title": "\uc21c\uc11c \uc5c6\ub294 \ubaa9\ub85d", - "pad.toolbar.indent.title": "\ub4e4\uc5ec\uc4f0\uae30", - "pad.toolbar.unindent.title": "\ub0b4\uc5b4\uc4f0\uae30", - "pad.toolbar.undo.title": "\uc2e4\ud589 \ucde8\uc18c (Ctrl-Z)", - "pad.toolbar.redo.title": "\ub2e4\uc2dc \uc2e4\ud589 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\uc800\uc790\uc758 \uc0c9 \uc9c0\uc6b0\uae30", - "pad.toolbar.import_export.title": "\ub2e4\ub978 \ud30c\uc77c \ud615\uc2dd\uc73c\ub85c \uac00\uc838\uc624\uae30\/\ub0b4\ubcf4\ub0b4\uae30", - "pad.toolbar.timeslider.title": "\uc2dc\uac04\uc2ac\ub77c\uc774\ub354", - "pad.toolbar.savedRevision.title": "\ud310 \uc800\uc7a5", - "pad.toolbar.settings.title": "\uc124\uc815", - "pad.toolbar.embed.title": "\uc774 \ud328\ub4dc \ud3ec\ud568\ud558\uae30", - "pad.toolbar.showusers.title": "\uc774 \ud328\ub4dc\uc5d0 \uc0ac\uc6a9\uc790 \ubcf4\uae30", - "pad.colorpicker.save": "\uc800\uc7a5", - "pad.colorpicker.cancel": "\ucde8\uc18c", - "pad.loading": "\ubd88\ub7ec\uc624\ub294 \uc911...", - "pad.passwordRequired": "\uc774 \ud328\ub4dc\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ube44\ubc00\ubc88\ud638\uac00 \ud544\uc694\ud569\ub2c8\ub2e4", - "pad.permissionDenied": "\uc774 \ud328\ub4dc\uc5d0 \uc811\uadfc\ud560 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", - "pad.wrongPassword": "\ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", - "pad.settings.padSettings": "\ud328\ub4dc \uc124\uc815", - "pad.settings.myView": "\ub0b4 \ubcf4\uae30", - "pad.settings.stickychat": "\ud654\uba74\uc5d0 \ud56d\uc0c1 \ub300\ud654 \ubcf4\uae30", - "pad.settings.colorcheck": "\uc800\uc790 \uc0c9", - "pad.settings.linenocheck": "\uc904 \ubc88\ud638", - "pad.settings.rtlcheck": "\uc6b0\ud6a1\uc11c(\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c)\uc785\ub2c8\uae4c?", - "pad.settings.fontType": "\uae00\uaf34 \uc885\ub958:", - "pad.settings.fontType.normal": "\ubcf4\ud1b5", - "pad.settings.fontType.monospaced": "\uace0\uc815 \ud3ed", - "pad.settings.globalView": "\uc804\uc5ed \ubcf4\uae30", - "pad.settings.language": "\uc5b8\uc5b4:", - "pad.importExport.import_export": "\uac00\uc838\uc624\uae30\/\ub0b4\ubcf4\ub0b4\uae30", - "pad.importExport.import": "\ud14d\uc2a4\ud2b8 \ud30c\uc77c\uc774\ub098 \ubb38\uc11c \uc62c\ub9ac\uae30", - "pad.importExport.importSuccessful": "\uc131\uacf5!", - "pad.importExport.export": "\ub2e4\uc74c\uc73c\ub85c \ud604\uc7ac \ud328\ub4dc \ub0b4\ubcf4\ub0b4\uae30:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\uc77c\ubc18 \ud14d\uc2a4\ud2b8", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\uc77c\ubc18 \ud14d\uc2a4\ud2b8\ub098 html \ud615\uc2dd\uc73c\ub85c\ub9cc \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 \uac00\uc838\uc624\uae30 \uae30\ub2a5\uc5d0 \ub300\ud574\uc11c\ub294 abiword\ub97c \uc124\uce58<\/a>\ud558\uc138\uc694.", - "pad.modals.connected": "\uc5f0\uacb0\ud588\uc2b5\ub2c8\ub2e4.", - "pad.modals.reconnecting": "\ud328\ub4dc\uc5d0 \ub2e4\uc2dc \uc5f0\uacb0 \uc911..", - "pad.modals.forcereconnect": "\uac15\uc81c\ub85c \ub2e4\uc2dc \uc5f0\uacb0", - "pad.modals.userdup": "\ub2e4\ub978 \ucc3d\uc5d0\uc11c \uc5f4\ub9ac\uace0 \uc788\uc2b5\ub2c8\ub2e4", - "pad.modals.userdup.explanation": "\uc774 \ud328\ub4dc\ub294 \uc774 \ucef4\ud4e8\ud130\uc5d0 \ud558\ub098\ubcf4\ub2e4 \ub9ce\uc774 \ube0c\ub77c\uc6b0\uc800 \ucc3d\uc5d0\uc11c \uc5f4\ub9b0 \uac83 \uac19\uc2b5\ub2c8\ub2e4.", - "pad.modals.userdup.advice": "\ub300\uc2e0 \uc774 \ucc3d\uc744 \uc0ac\uc6a9\ud574 \ub2e4\uc2dc \uc5f0\uacb0\ud569\ub2c8\ub2e4.", - "pad.modals.unauth": "\uad8c\ud55c\uc774 \uc5c6\uc74c", - "pad.modals.unauth.explanation": "\uc774 \ubb38\uc11c\ub97c \ubcf4\ub294 \ub3d9\uc548 \uad8c\ud55c\uc774 \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ud558\uc138\uc694.", - "pad.modals.looping": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", - "pad.modals.looping.explanation": "\ub3d9\uae30 \uc11c\ubc84\uc640\uc758 \ud1b5\uc2e0 \ubb38\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.looping.cause": "\uc544\ub9c8 \ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc29\ud654\ubcbd\uc774\ub098 \ud504\ub85d\uc2dc\ub97c \ud1b5\ud574 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.initsocketfail": "\uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", - "pad.modals.initsocketfail.explanation": "\ub3d9\uae30 \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", - "pad.modals.initsocketfail.cause": "\uc544\ub9c8\ub3c4 \ube0c\ub77c\uc6b0\uc800\ub098 \uc778\ud130\ub137 \uc5f0\uacb0\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.slowcommit": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", - "pad.modals.slowcommit.explanation": "\uc11c\ubc84\uac00 \uc751\ub2f5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", - "pad.modals.slowcommit.cause": "\ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.deleted": "\uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "pad.modals.deleted.explanation": "\uc774 \ud328\ub4dc\ub97c \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4.", - "pad.modals.disconnected": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", - "pad.modals.disconnected.explanation": "\uc11c\ubc84\uc5d0\uc11c \uc5f0\uacb0\uc744 \uc783\uc5c8\uc2b5\ub2c8\ub2e4", - "pad.modals.disconnected.cause": "\uc11c\ubc84\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774 \ubb38\uc81c\uac00 \uacc4\uc18d \ubc1c\uc0dd\ud558\uba74 \uc54c\ub824\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.", - "pad.share": "\uc774 \ud328\ub4dc \uacf5\uc720\ud558\uae30", - "pad.share.readonly": "\uc77d\uae30 \uc804\uc6a9", - "pad.share.link": "\ub9c1\ud06c", - "pad.share.emebdcode": "URL \ud3ec\ud568", - "pad.chat": "\ub300\ud654", - "pad.chat.title": "\uc774 \ud328\ub4dc\uc5d0 \ub300\ud654\ub97c \uc5fd\ub2c8\ub2e4.", - "pad.chat.loadmessages": "\ub354 \ub9ce\uc740 \uba54\uc2dc\uc9c0 \ubd88\ub7ec\uc624\uae30", - "timeslider.pageTitle": "{{appTitle}} \uc2dc\uac04\uc2ac\ub77c\uc774\ub354", - "timeslider.toolbar.returnbutton": "\ud328\ub4dc\ub85c \ub3cc\uc544\uac00\uae30", - "timeslider.toolbar.authors": "\uc800\uc790:", - "timeslider.toolbar.authorsList": "\uc800\uc790 \uc5c6\uc74c", - "timeslider.toolbar.exportlink.title": "\ub0b4\ubcf4\ub0b4\uae30", - "timeslider.exportCurrent": "\ud604\uc7ac \ubc84\uc804\uc73c\ub85c \ub0b4\ubcf4\ub0b4\uae30:", - "timeslider.version": "\ubc84\uc804 {{version}}", - "timeslider.saved": "{{year}}\ub144 {{month}} {{day}}\uc77c\uc5d0 \uc800\uc7a5\ud568", - "timeslider.dateformat": "{{year}}\ub144\/{{month}}\/{{day}}\uc77c {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "1\uc6d4", - "timeslider.month.february": "2\uc6d4", - "timeslider.month.march": "3\uc6d4", - "timeslider.month.april": "4\uc6d4", - "timeslider.month.may": "5\uc6d4", - "timeslider.month.june": "6\uc6d4", - "timeslider.month.july": "7\uc6d4", - "timeslider.month.august": "8\uc6d4", - "timeslider.month.september": "9\uc6d4", - "timeslider.month.october": "10\uc6d4", - "timeslider.month.november": "11\uc6d4", - "timeslider.month.december": "12\uc6d4", - "timeslider.unnamedauthor": "\uc774\ub984 \uc5c6\ub294 \uc800\uc790 {{num}}\uba85", - "timeslider.unnamedauthors": "\uc774\ub984 \uc5c6\ub294 \uc800\uc790 {{num}}\uba85", - "pad.savedrevs.marked": "\uc774 \ud310\uc740 \uc774\uc81c \uc800\uc7a5\ud55c \ud310\uc73c\ub85c \ud45c\uc2dc\ud569\ub2c8\ub2e4.", - "pad.userlist.entername": "\uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694", - "pad.userlist.unnamed": "\uc774\ub984\uc5c6\uc74c", - "pad.userlist.guest": "\uc190\ub2d8", - "pad.userlist.deny": "\uac70\ubd80", - "pad.userlist.approve": "\uc2b9\uc778", - "pad.editbar.clearcolors": "\uc804\uccb4 \ubb38\uc11c\uc758 \uc800\uc790 \uc0c9\uc744 \uc9c0\uc6b0\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", - "pad.impexp.importbutton": "\uc9c0\uae08 \uac00\uc838\uc624\uae30", - "pad.impexp.importing": "\uac00\uc838\uc624\ub294 \uc911...", - "pad.impexp.confirmimport": "\ud30c\uc77c\uc744 \uac00\uc838\uc624\uba74 \ud328\ub4dc\uc758 \ud604\uc7ac \ud14d\uc2a4\ud2b8\ub97c \ub36e\uc5b4\uc4f0\uac8c \ub429\ub2c8\ub2e4. \uc9c4\ud589\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", - "pad.impexp.convertFailed": "\uc774 \ud30c\uc77c\uc744 \uac00\uc838\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\ub978 \ubb38\uc11c \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud558\uac70\ub098 \uc218\ub3d9\uc73c\ub85c \ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694", - "pad.impexp.uploadFailed": "\uc62c\ub9ac\uae30\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694", - "pad.impexp.importfailed": "\uac00\uc838\uc624\uae30\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4", - "pad.impexp.copypaste": "\ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694", - "pad.impexp.exportdisabled": "{{type}} \ud615\uc2dd\uc73c\ub85c \ub0b4\ubcf4\ub0b4\uae30\uac00 \ube44\ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4." + "@metadata": { + "authors": { + "1": "\uc544\ub77c" + } + }, + "index.newPad": "\uc0c8 \ud328\ub4dc", + "index.createOpenPad": "\ub610\ub294 \ub2e4\uc74c \uc774\ub984\uc73c\ub85c \ud328\ub4dc \ub9cc\ub4e4\uae30/\uc5f4\uae30:", + "pad.toolbar.bold.title": "\uad75\uac8c (Ctrl-B)", + "pad.toolbar.italic.title": "\uae30\uc6b8\uc784 (Ctrl-I)", + "pad.toolbar.underline.title": "\ubc11\uc904 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\ucde8\uc18c\uc120", + "pad.toolbar.ol.title": "\uc21c\uc11c \uc788\ub294 \ubaa9\ub85d", + "pad.toolbar.ul.title": "\uc21c\uc11c \uc5c6\ub294 \ubaa9\ub85d", + "pad.toolbar.indent.title": "\ub4e4\uc5ec\uc4f0\uae30", + "pad.toolbar.unindent.title": "\ub0b4\uc5b4\uc4f0\uae30", + "pad.toolbar.undo.title": "\uc2e4\ud589 \ucde8\uc18c (Ctrl-Z)", + "pad.toolbar.redo.title": "\ub2e4\uc2dc \uc2e4\ud589 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\uc800\uc790\uc758 \uc0c9 \uc9c0\uc6b0\uae30", + "pad.toolbar.import_export.title": "\ub2e4\ub978 \ud30c\uc77c \ud615\uc2dd\uc73c\ub85c \uac00\uc838\uc624\uae30/\ub0b4\ubcf4\ub0b4\uae30", + "pad.toolbar.timeslider.title": "\uc2dc\uac04\uc2ac\ub77c\uc774\ub354", + "pad.toolbar.savedRevision.title": "\ud310 \uc800\uc7a5", + "pad.toolbar.settings.title": "\uc124\uc815", + "pad.toolbar.embed.title": "\uc774 \ud328\ub4dc \ud3ec\ud568\ud558\uae30", + "pad.toolbar.showusers.title": "\uc774 \ud328\ub4dc\uc5d0 \uc0ac\uc6a9\uc790 \ubcf4\uae30", + "pad.colorpicker.save": "\uc800\uc7a5", + "pad.colorpicker.cancel": "\ucde8\uc18c", + "pad.loading": "\ubd88\ub7ec\uc624\ub294 \uc911...", + "pad.passwordRequired": "\uc774 \ud328\ub4dc\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ube44\ubc00\ubc88\ud638\uac00 \ud544\uc694\ud569\ub2c8\ub2e4", + "pad.permissionDenied": "\uc774 \ud328\ub4dc\uc5d0 \uc811\uadfc\ud560 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", + "pad.wrongPassword": "\ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "pad.settings.padSettings": "\ud328\ub4dc \uc124\uc815", + "pad.settings.myView": "\ub0b4 \ubcf4\uae30", + "pad.settings.stickychat": "\ud654\uba74\uc5d0 \ud56d\uc0c1 \ub300\ud654 \ubcf4\uae30", + "pad.settings.colorcheck": "\uc800\uc790 \uc0c9", + "pad.settings.linenocheck": "\uc904 \ubc88\ud638", + "pad.settings.rtlcheck": "\uc6b0\ud6a1\uc11c(\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c)\uc785\ub2c8\uae4c?", + "pad.settings.fontType": "\uae00\uaf34 \uc885\ub958:", + "pad.settings.fontType.normal": "\ubcf4\ud1b5", + "pad.settings.fontType.monospaced": "\uace0\uc815 \ud3ed", + "pad.settings.globalView": "\uc804\uc5ed \ubcf4\uae30", + "pad.settings.language": "\uc5b8\uc5b4:", + "pad.importExport.import_export": "\uac00\uc838\uc624\uae30/\ub0b4\ubcf4\ub0b4\uae30", + "pad.importExport.import": "\ud14d\uc2a4\ud2b8 \ud30c\uc77c\uc774\ub098 \ubb38\uc11c \uc62c\ub9ac\uae30", + "pad.importExport.importSuccessful": "\uc131\uacf5!", + "pad.importExport.export": "\ub2e4\uc74c\uc73c\ub85c \ud604\uc7ac \ud328\ub4dc \ub0b4\ubcf4\ub0b4\uae30:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\uc77c\ubc18 \ud14d\uc2a4\ud2b8", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\uc77c\ubc18 \ud14d\uc2a4\ud2b8\ub098 html \ud615\uc2dd\uc73c\ub85c\ub9cc \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 \uac00\uc838\uc624\uae30 \uae30\ub2a5\uc5d0 \ub300\ud574\uc11c\ub294 \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eabiword\ub97c \uc124\uce58\u003C/a\u003E\ud558\uc138\uc694.", + "pad.modals.connected": "\uc5f0\uacb0\ud588\uc2b5\ub2c8\ub2e4.", + "pad.modals.reconnecting": "\ud328\ub4dc\uc5d0 \ub2e4\uc2dc \uc5f0\uacb0 \uc911..", + "pad.modals.forcereconnect": "\uac15\uc81c\ub85c \ub2e4\uc2dc \uc5f0\uacb0", + "pad.modals.userdup": "\ub2e4\ub978 \ucc3d\uc5d0\uc11c \uc5f4\ub9ac\uace0 \uc788\uc2b5\ub2c8\ub2e4", + "pad.modals.userdup.explanation": "\uc774 \ud328\ub4dc\ub294 \uc774 \ucef4\ud4e8\ud130\uc5d0 \ud558\ub098\ubcf4\ub2e4 \ub9ce\uc774 \ube0c\ub77c\uc6b0\uc800 \ucc3d\uc5d0\uc11c \uc5f4\ub9b0 \uac83 \uac19\uc2b5\ub2c8\ub2e4.", + "pad.modals.userdup.advice": "\ub300\uc2e0 \uc774 \ucc3d\uc744 \uc0ac\uc6a9\ud574 \ub2e4\uc2dc \uc5f0\uacb0\ud569\ub2c8\ub2e4.", + "pad.modals.unauth": "\uad8c\ud55c\uc774 \uc5c6\uc74c", + "pad.modals.unauth.explanation": "\uc774 \ubb38\uc11c\ub97c \ubcf4\ub294 \ub3d9\uc548 \uad8c\ud55c\uc774 \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ud558\uc138\uc694.", + "pad.modals.looping": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", + "pad.modals.looping.explanation": "\ub3d9\uae30 \uc11c\ubc84\uc640\uc758 \ud1b5\uc2e0 \ubb38\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4.", + "pad.modals.looping.cause": "\uc544\ub9c8 \ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc29\ud654\ubcbd\uc774\ub098 \ud504\ub85d\uc2dc\ub97c \ud1b5\ud574 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.", + "pad.modals.initsocketfail": "\uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "pad.modals.initsocketfail.explanation": "\ub3d9\uae30 \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", + "pad.modals.initsocketfail.cause": "\uc544\ub9c8\ub3c4 \ube0c\ub77c\uc6b0\uc800\ub098 \uc778\ud130\ub137 \uc5f0\uacb0\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.", + "pad.modals.slowcommit": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", + "pad.modals.slowcommit.explanation": "\uc11c\ubc84\uac00 \uc751\ub2f5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", + "pad.modals.slowcommit.cause": "\ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.", + "pad.modals.deleted": "\uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "pad.modals.deleted.explanation": "\uc774 \ud328\ub4dc\ub97c \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4.", + "pad.modals.disconnected": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", + "pad.modals.disconnected.explanation": "\uc11c\ubc84\uc5d0\uc11c \uc5f0\uacb0\uc744 \uc783\uc5c8\uc2b5\ub2c8\ub2e4", + "pad.modals.disconnected.cause": "\uc11c\ubc84\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774 \ubb38\uc81c\uac00 \uacc4\uc18d \ubc1c\uc0dd\ud558\uba74 \uc54c\ub824\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.", + "pad.share": "\uc774 \ud328\ub4dc \uacf5\uc720\ud558\uae30", + "pad.share.readonly": "\uc77d\uae30 \uc804\uc6a9", + "pad.share.link": "\ub9c1\ud06c", + "pad.share.emebdcode": "URL \ud3ec\ud568", + "pad.chat": "\ub300\ud654", + "pad.chat.title": "\uc774 \ud328\ub4dc\uc5d0 \ub300\ud654\ub97c \uc5fd\ub2c8\ub2e4.", + "pad.chat.loadmessages": "\ub354 \ub9ce\uc740 \uba54\uc2dc\uc9c0 \ubd88\ub7ec\uc624\uae30", + "timeslider.pageTitle": "{{appTitle}} \uc2dc\uac04\uc2ac\ub77c\uc774\ub354", + "timeslider.toolbar.returnbutton": "\ud328\ub4dc\ub85c \ub3cc\uc544\uac00\uae30", + "timeslider.toolbar.authors": "\uc800\uc790:", + "timeslider.toolbar.authorsList": "\uc800\uc790 \uc5c6\uc74c", + "timeslider.toolbar.exportlink.title": "\ub0b4\ubcf4\ub0b4\uae30", + "timeslider.exportCurrent": "\ud604\uc7ac \ubc84\uc804\uc73c\ub85c \ub0b4\ubcf4\ub0b4\uae30:", + "timeslider.version": "\ubc84\uc804 {{version}}", + "timeslider.saved": "{{year}}\ub144 {{month}} {{day}}\uc77c\uc5d0 \uc800\uc7a5\ud568", + "timeslider.dateformat": "{{year}}\ub144/{{month}}/{{day}}\uc77c {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "1\uc6d4", + "timeslider.month.february": "2\uc6d4", + "timeslider.month.march": "3\uc6d4", + "timeslider.month.april": "4\uc6d4", + "timeslider.month.may": "5\uc6d4", + "timeslider.month.june": "6\uc6d4", + "timeslider.month.july": "7\uc6d4", + "timeslider.month.august": "8\uc6d4", + "timeslider.month.september": "9\uc6d4", + "timeslider.month.october": "10\uc6d4", + "timeslider.month.november": "11\uc6d4", + "timeslider.month.december": "12\uc6d4", + "timeslider.unnamedauthor": "\uc774\ub984 \uc5c6\ub294 \uc800\uc790 {{num}}\uba85", + "timeslider.unnamedauthors": "\uc774\ub984 \uc5c6\ub294 \uc800\uc790 {{num}}\uba85", + "pad.savedrevs.marked": "\uc774 \ud310\uc740 \uc774\uc81c \uc800\uc7a5\ud55c \ud310\uc73c\ub85c \ud45c\uc2dc\ud569\ub2c8\ub2e4.", + "pad.userlist.entername": "\uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694", + "pad.userlist.unnamed": "\uc774\ub984\uc5c6\uc74c", + "pad.userlist.guest": "\uc190\ub2d8", + "pad.userlist.deny": "\uac70\ubd80", + "pad.userlist.approve": "\uc2b9\uc778", + "pad.editbar.clearcolors": "\uc804\uccb4 \ubb38\uc11c\uc758 \uc800\uc790 \uc0c9\uc744 \uc9c0\uc6b0\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", + "pad.impexp.importbutton": "\uc9c0\uae08 \uac00\uc838\uc624\uae30", + "pad.impexp.importing": "\uac00\uc838\uc624\ub294 \uc911...", + "pad.impexp.confirmimport": "\ud30c\uc77c\uc744 \uac00\uc838\uc624\uba74 \ud328\ub4dc\uc758 \ud604\uc7ac \ud14d\uc2a4\ud2b8\ub97c \ub36e\uc5b4\uc4f0\uac8c \ub429\ub2c8\ub2e4. \uc9c4\ud589\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", + "pad.impexp.convertFailed": "\uc774 \ud30c\uc77c\uc744 \uac00\uc838\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\ub978 \ubb38\uc11c \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud558\uac70\ub098 \uc218\ub3d9\uc73c\ub85c \ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694", + "pad.impexp.uploadFailed": "\uc62c\ub9ac\uae30\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694", + "pad.impexp.importfailed": "\uac00\uc838\uc624\uae30\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4", + "pad.impexp.copypaste": "\ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694", + "pad.impexp.exportdisabled": "{{type}} \ud615\uc2dd\uc73c\ub85c \ub0b4\ubcf4\ub0b4\uae30\uac00 \ube44\ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4." } \ No newline at end of file diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 648f9506..6890d3f5 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -1,120 +1,121 @@ { - "@metadata": { - "authors": { - "1": "Purodha" - } - }, - "index.newPad": "Neu Padd", - "index.createOpenPad": "udder maach e Padd op med d\u00e4m Naame:", - "pad.toolbar.bold.title": "F\u00e4ttschreff (Strg-B)", - "pad.toolbar.italic.title": "Scheive Schreff (Strg-I)", - "pad.toolbar.underline.title": "Ongerstresche (Strg-U)", - "pad.toolbar.strikethrough.title": "Dorschjeschtresche", - "pad.toolbar.ol.title": "Le\u00df met Nommere", - "pad.toolbar.ul.title": "Le\u00df met Pongkte", - "pad.toolbar.indent.title": "Enjer\u00f6k", - "pad.toolbar.unindent.title": "U\u00dfjer\u00f6k", - "pad.toolbar.undo.title": "Retuur n\u00e4mme (Strg-Z)", - "pad.toolbar.redo.title": "Norrens (Strg-Y)", - "pad.toolbar.clearAuthorship.title": "d\u00e4 Schriiver ier F\u00e4rve fottn\u00e4mme", - "pad.toolbar.import_export.title": "Vun ongerscheidlijje Dattei_Fommaate empotteere udder \u00e4xpotteere", - "pad.toolbar.timeslider.title": "Verjangeheid afschpelle", - "pad.toolbar.savedRevision.title": "de Versjohn fa\u00dfhallde", - "pad.toolbar.settings.title": "Enscht\u00e4llonge", - "pad.toolbar.embed.title": "Donn dat Padd enbenge", - "pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije", - "pad.colorpicker.save": "Fa\u00dfhallde", - "pad.colorpicker.cancel": "Oph\u00fc\u00fcre", - "pad.loading": "Aam Laade …", - "pad.passwordRequired": "Do bruchs e Pa\u00dfwoot f\u00f6r heh dat P\u00e4dd.", - "pad.permissionDenied": "Do h\u00e4s nit dat R\u00e4\u00e4sch, op heh dat P\u00e4dd zohzejriife.", - "pad.wrongPassword": "Ding Pa\u00dfwoot wohr verkeht.", - "pad.settings.padSettings": "Dam P\u00e4dd sin Enscht\u00e4llonge", - "pad.settings.myView": "Anseesch", - "pad.settings.stickychat": "Donn der Klaaf emmer aanzeije", - "pad.settings.colorcheck": "F\u00e4rve f\u00f6r de Schriiver", - "pad.settings.linenocheck": "Nommere f\u00f6r de Reije", - "pad.settings.fontType": "Zoot Schreff", - "pad.settings.fontType.normal": "Nomaal", - "pad.settings.fontType.monospaced": "einheidlesch brejde Zeische", - "pad.settings.globalView": "Et U\u00dfsin f\u00f6r Alle", - "pad.settings.language": "Schprooch:", - "pad.importExport.import_export": "Empoot\/\u00c4xpoot", - "pad.importExport.import": "Donn jeede T\u00e4x udder jeede Zoot Dokem\u00e4nt huhlaade", - "pad.importExport.importSuccessful": "Jeschaff!", - "pad.importExport.export": "Don dat P\u00e4dd \u00e4xpoteere al\u00df:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Eijfach T\u00e4x", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF (Poteerbaa Dokem\u00e4nte Fommaat)", - "pad.importExport.exportopen": "ODF (Offe Dokem\u00e4nte-Fommaat)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Mer k\u00fcnne blo\u00df eijfaache T\u00e4xte udder HTML_Fommaate empoteere. Opw\u00e4ndejere M\u00fcjjeleschkeite f\u00f6 der Empoot jon och, dof\u00f6r bruch mer en Enschtallazjuhn met Abiword<\/i><\/a>.", - "pad.modals.connected": "Verbonge.", - "pad.modals.reconnecting": "Ben wider aam Verbenge …", - "pad.modals.forcereconnect": "Wider verbenge", - "pad.modals.userdup": "En enem andere Finster en \u00c4rbeid", - "pad.modals.userdup.explanation": "Heh dat Padd schingk en mieh wi einem Finster vun enem Brauser op heh d\u00e4m R\u00e4\u00e4schner op ze sin.", - "pad.modals.userdup.advice": "En heh d\u00e4m Finster wider verbenge.", - "pad.modals.unauth": "Nit ber\u00e4\u00e4schtesch", - "pad.modals.unauth.explanation": "Ding Ber\u00e4\u00e4schtejong h\u00e4t sesch je\u00e4ndert, derwiehl De di Sigg aam beloore wohr\u00df. Vers\u00f6hk en neu Verbendong ze maache.", - "pad.modals.looping": "De Verbendong es fott.", - "pad.modals.looping.explanation": "Et jitt Probleeme met d\u00e4 Verbendong mem \u1e9e\u00f6\u00f6ver f\u00f6r de Schriiver ier Aandeile zesamme_ze_br\u00e4nge.", - "pad.modals.looping.cause": "K\u00fcnnt sin, Ding Verbendong jeiht dorj_ene onzopa\u00df proxy-\u1e9e\u00f6\u00f6ver udder firewall.", - "pad.modals.initsocketfail": "D\u00e4 \u1e9e\u00f6\u00f6ver es nit ze \u00e4reische.", - "pad.modals.initsocketfail.explanation": "Kein Verbendong met d\u00e4m \u1e9e\u00f6\u00f6ver ze krijje.", - "pad.modals.initsocketfail.cause": "Dat k\u00fcnnt aam Brauser udder aan d\u00e4m singer Verbendong \u00f6vver et Internet lijje.", - "pad.modals.slowcommit": "De Verbendong es fott.", - "pad.modals.slowcommit.explanation": "D\u00e4 \u1e9e\u00f6\u00f6ver antwoot nit.", - "pad.modals.slowcommit.cause": "Dat k\u00fcnnt aan Probleeme met Verbendonge em N\u00e4zw\u00e4rrek lijje.", - "pad.modals.deleted": "Fottjeschme\u00dfe.", - "pad.modals.deleted.explanation": "Dat P\u00e4dd es fottjeschme\u00dfe woode.", - "pad.modals.disconnected": "Do bes nit mieh verbonge.", - "pad.modals.disconnected.explanation": "De Verbendong mem \u1e9e\u00f6\u00f6ver es fott.", - "pad.modals.disconnected.cause": "D\u00e4 \u1e9e\u00f6\u00f6ver k\u00fcnnt nit loufe.\nSidd_esu jood und saat ons Bescheid, wann dat \u00f6fters pa\u00dfeet.", - "pad.share": "Maach heh dat Padd \u00f6ffentlesch", - "pad.share.readonly": "Nor zom L\u00e4sse", - "pad.share.link": "Lengk", - "pad.share.emebdcode": "URL enboue", - "pad.chat": "Klaaf", - "pad.chat.title": "Maach d\u00e4 Klaaf f\u00f6r heh dat P\u00e4dd op", - "pad.chat.loadmessages": "Mieh Nohresschte laade...", - "timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle", - "timeslider.toolbar.returnbutton": "Jangk retuur nohm P\u00e4dd", - "timeslider.toolbar.authors": "Schriiver:", - "timeslider.toolbar.authorsList": "Kein Schriivere", - "timeslider.toolbar.exportlink.title": "\u00c4xpoot", - "timeslider.exportCurrent": "Donn de meu\u00dfte V\u00e4sjohn \u00e4xpotteere al\u00df:", - "timeslider.version": "V\u00e4sjon {{version}}", - "timeslider.saved": "Fa\u00dfjehallde aam {{day}}. {{month}} {{year}}", - "timeslider.dateformat": "amm {{day}}. {{month}} {{year}} \u00f6m {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Jannewaa", - "timeslider.month.february": "F\u00e4\u00e4browaa", - "timeslider.month.march": "M\u00e4\u00e4z", - "timeslider.month.april": "Apprell", - "timeslider.month.may": "Mai", - "timeslider.month.june": "Juuni", - "timeslider.month.july": "Juuli", - "timeslider.month.august": "Oujo\u00df", - "timeslider.month.september": "S\u00e4pt\u00e4mber", - "timeslider.month.october": "Oktoober", - "timeslider.month.november": "Nov\u00e4mber", - "timeslider.month.december": "Dez\u00e4mber", - "timeslider.unnamedauthor": "{{num}} naameloose Schriever", - "timeslider.unnamedauthors": "{{num}} naameloose Schriever", - "pad.savedrevs.marked": "Heh di V\u00e4sjohn es j\u00e4z fa\u00dfjehallde.", - "pad.userlist.entername": "Jif Dinge Naame en", - "pad.userlist.unnamed": "naamelo\u00df\u00df", - "pad.userlist.guest": "Ja\u00df\u00df", - "pad.userlist.deny": "Aflehne", - "pad.userlist.approve": "Joodhei\u00dfe", - "pad.editbar.clearcolors": "Sulle mer de F\u00e4rve f\u00f6r de Schriiver uss_em janze T\u00e4x fott maache?", - "pad.impexp.importbutton": "J\u00e4z empoteere", - "pad.impexp.importing": "Ben aam Empotteere …", - "pad.impexp.confirmimport": "En Dattei ze empotteere m\u00e4\u00e4t der janze T\u00e4x em P\u00e4dd fott. Wess De dat verfaftesch hann?", - "pad.impexp.convertFailed": "Mer kunnte di Dattei nit empoteere. Nemm en ander Dattei-Fommaat udder donn d\u00e4 T\u00e4x vun Hand kopeere un ennf\u00f6\u00f6je.", - "pad.impexp.uploadFailed": "Et Huhlaade es don\u00e4vve jejange, bes esu jood un probeer et norr_ens", - "pad.impexp.importfailed": "Et Empoteere es don\u00e4vve jejange", - "pad.impexp.copypaste": "Bes esu jood un donn et koppeere un enf\u00f6\u00f6je", - "pad.impexp.exportdisabled": "Et \u00c4xpotteere em {{type}}-Formmaat es affjeschalldt. De Verwallder vun heh d\u00e4 Sigge k\u00fcnne doh velleisch wiggerh\u00e4llefe." + "@metadata": { + "authors": { + "1": "Purodha" + } + }, + "index.newPad": "Neu Padd", + "index.createOpenPad": "udder maach e Padd op med d\u00e4m Naame:", + "pad.toolbar.bold.title": "F\u00e4ttschreff (Strg-B)", + "pad.toolbar.italic.title": "Scheive Schreff (Strg-I)", + "pad.toolbar.underline.title": "Ongerstresche (Strg-U)", + "pad.toolbar.strikethrough.title": "Dorschjeschtresche", + "pad.toolbar.ol.title": "Le\u00df met Nommere", + "pad.toolbar.ul.title": "Le\u00df met Pongkte", + "pad.toolbar.indent.title": "Enjer\u00f6k", + "pad.toolbar.unindent.title": "U\u00dfjer\u00f6k", + "pad.toolbar.undo.title": "Retuur n\u00e4mme (Strg-Z)", + "pad.toolbar.redo.title": "Norrens (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "d\u00e4 Schriiver ier F\u00e4rve fottn\u00e4mme", + "pad.toolbar.import_export.title": "Vun ongerscheidlijje Dattei_Fommaate empotteere udder \u00e4xpotteere", + "pad.toolbar.timeslider.title": "Verjangeheid afschpelle", + "pad.toolbar.savedRevision.title": "de Versjohn fa\u00dfhallde", + "pad.toolbar.settings.title": "Enscht\u00e4llonge", + "pad.toolbar.embed.title": "Donn dat Padd enbenge", + "pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije", + "pad.colorpicker.save": "Fa\u00dfhallde", + "pad.colorpicker.cancel": "Oph\u00fc\u00fcre", + "pad.loading": "Ben aam Laade\u0026nbsp;\u0026hellip;", + "pad.passwordRequired": "Do bruchs e Pa\u00dfwoot f\u00f6r heh dat P\u00e4dd.", + "pad.permissionDenied": "Do h\u00e4s nit dat R\u00e4\u00e4sch, op heh dat P\u00e4dd zohzejriife.", + "pad.wrongPassword": "Ding Pa\u00dfwoot wohr verkeht.", + "pad.settings.padSettings": "Dam P\u00e4dd sin Enscht\u00e4llonge", + "pad.settings.myView": "Anseesch", + "pad.settings.stickychat": "Donn der Klaaf emmer aanzeije", + "pad.settings.colorcheck": "F\u00e4rve f\u00f6r de Schriiver", + "pad.settings.linenocheck": "Nommere f\u00f6r de Reije", + "pad.settings.rtlcheck": "Schreff vun R\u00e4\u00e4sch\u00df noh Lenks?", + "pad.settings.fontType": "Zoot Schreff", + "pad.settings.fontType.normal": "Nomaal", + "pad.settings.fontType.monospaced": "einheidlesch brejde Zeische", + "pad.settings.globalView": "Et U\u00dfsin f\u00f6r Alle", + "pad.settings.language": "Schprooch:", + "pad.importExport.import_export": "Empoot/\u00c4xpoot", + "pad.importExport.import": "Donn jeede T\u00e4x udder jeede Zoot Dokem\u00e4nt huhlaade", + "pad.importExport.importSuccessful": "Jeschaff!", + "pad.importExport.export": "Don dat P\u00e4dd \u00e4xpoteere al\u00df:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Eijfach T\u00e4x", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF (Poteerbaa Dokem\u00e4nte Fommaat)", + "pad.importExport.exportopen": "ODF (Offe Dokem\u00e4nte-Fommaat)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Mer k\u00fcnne blo\u00df eijfaache T\u00e4xte udder HTML_Fommaate empoteere. Opw\u00e4ndejere M\u00fcjjeleschkeite f\u00f6 der Empoot jon och, dof\u00f6r bruch mer en \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003EEnschtallazjuhn met \u003Ci lang=\"en\"\u003EAbiword\u003C/i\u003E\u003C/a\u003E.", + "pad.modals.connected": "Verbonge.", + "pad.modals.reconnecting": "Ben wider aam Verbenge\u0026nbsp;\u0026hellip;", + "pad.modals.forcereconnect": "Wider verbenge", + "pad.modals.userdup": "En enem andere Finster en \u00c4rbeid", + "pad.modals.userdup.explanation": "Heh dat Padd schingk en mieh wi einem Finster vun enem Brauser op heh d\u00e4m R\u00e4\u00e4schner op ze sin.", + "pad.modals.userdup.advice": "En heh d\u00e4m Finster wider verbenge.", + "pad.modals.unauth": "Nit ber\u00e4\u00e4schtesch", + "pad.modals.unauth.explanation": "Ding Ber\u00e4\u00e4schtejong h\u00e4t sesch je\u00e4ndert, derwiehl De di Sigg aam beloore wohr\u00df. Vers\u00f6hk en neu Verbendong ze maache.", + "pad.modals.looping": "De Verbendong es fott.", + "pad.modals.looping.explanation": "Et jitt Probleeme met d\u00e4 Verbendong mem \u1e9e\u00f6\u00f6ver f\u00f6r de Schriiver ier Aandeile zesamme_ze_br\u00e4nge.", + "pad.modals.looping.cause": "K\u00fcnnt sin, Ding Verbendong jeiht dorj_ene onzopa\u00df proxy-\u1e9e\u00f6\u00f6ver udder firewall.", + "pad.modals.initsocketfail": "D\u00e4 \u1e9e\u00f6\u00f6ver es nit ze \u00e4reische.", + "pad.modals.initsocketfail.explanation": "Kein Verbendong met d\u00e4m \u1e9e\u00f6\u00f6ver ze krijje.", + "pad.modals.initsocketfail.cause": "Dat k\u00fcnnt aam Brauser udder aan d\u00e4m singer Verbendong \u00f6vver et Internet lijje.", + "pad.modals.slowcommit": "De Verbendong es fott.", + "pad.modals.slowcommit.explanation": "D\u00e4 \u1e9e\u00f6\u00f6ver antwoot nit.", + "pad.modals.slowcommit.cause": "Dat k\u00fcnnt aan Probleeme met Verbendonge em N\u00e4zw\u00e4rrek lijje.", + "pad.modals.deleted": "Fottjeschme\u00dfe.", + "pad.modals.deleted.explanation": "Dat P\u00e4dd es fottjeschme\u00dfe woode.", + "pad.modals.disconnected": "Do bes nit mieh verbonge.", + "pad.modals.disconnected.explanation": "De Verbendong mem \u1e9e\u00f6\u00f6ver es fott.", + "pad.modals.disconnected.cause": "D\u00e4 \u1e9e\u00f6\u00f6ver k\u00fcnnt nit loufe.\nSidd_esu jood und saat ons Bescheid, wann dat \u00f6fters pa\u00dfeet.", + "pad.share": "Maach heh dat Padd \u00f6ffentlesch", + "pad.share.readonly": "Nor zom L\u00e4sse", + "pad.share.link": "Lengk", + "pad.share.emebdcode": "URL enboue", + "pad.chat": "Klaaf", + "pad.chat.title": "Maach d\u00e4 Klaaf f\u00f6r heh dat P\u00e4dd op", + "pad.chat.loadmessages": "Mieh Nohresschte laade...", + "timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle", + "timeslider.toolbar.returnbutton": "Jangk retuur nohm P\u00e4dd", + "timeslider.toolbar.authors": "Schriiver:", + "timeslider.toolbar.authorsList": "Kein Schriivere", + "timeslider.toolbar.exportlink.title": "\u00c4xpoot", + "timeslider.exportCurrent": "Donn de meu\u00dfte V\u00e4sjohn \u00e4xpotteere al\u00df:", + "timeslider.version": "V\u00e4sjon {{version}}", + "timeslider.saved": "Fa\u00dfjehallde aam {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "amm {{day}}. {{month}} {{year}} \u00f6m {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Jannewaa", + "timeslider.month.february": "F\u00e4\u00e4browaa", + "timeslider.month.march": "M\u00e4\u00e4z", + "timeslider.month.april": "Apprell", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juuni", + "timeslider.month.july": "Juuli", + "timeslider.month.august": "Oujo\u00df", + "timeslider.month.september": "S\u00e4pt\u00e4mber", + "timeslider.month.october": "Oktoober", + "timeslider.month.november": "Nov\u00e4mber", + "timeslider.month.december": "Dez\u00e4mber", + "timeslider.unnamedauthor": "{{num}} naameloose Schriever", + "timeslider.unnamedauthors": "{{num}} naameloose Schriever", + "pad.savedrevs.marked": "Heh di V\u00e4sjohn es j\u00e4z fa\u00dfjehallde.", + "pad.userlist.entername": "Jif Dinge Naame en", + "pad.userlist.unnamed": "naamelo\u00df\u00df", + "pad.userlist.guest": "Ja\u00df\u00df", + "pad.userlist.deny": "Aflehne", + "pad.userlist.approve": "Joodhei\u00dfe", + "pad.editbar.clearcolors": "Sulle mer de F\u00e4rve f\u00f6r de Schriiver uss_em janze T\u00e4x fott maache?", + "pad.impexp.importbutton": "J\u00e4z empoteere", + "pad.impexp.importing": "Ben aam Empotteere\u0026nbsp;\u0026hellip;", + "pad.impexp.confirmimport": "En Dattei ze empotteere m\u00e4\u00e4t der janze T\u00e4x em P\u00e4dd fott. Wess De dat verfaftesch hann?", + "pad.impexp.convertFailed": "Mer kunnte di Dattei nit empoteere. Nemm en ander Dattei-Fommaat udder donn d\u00e4 T\u00e4x vun Hand kopeere un ennf\u00f6\u00f6je.", + "pad.impexp.uploadFailed": "Et Huhlaade es don\u00e4vve jejange, bes esu jood un probeer et norr_ens", + "pad.impexp.importfailed": "Et Empoteere es don\u00e4vve jejange", + "pad.impexp.copypaste": "Bes esu jood un donn et koppeere un enf\u00f6\u00f6je", + "pad.impexp.exportdisabled": "Et \u00c4xpotteere em {{type}}-Formmaat es affjeschalldt. De Verwallder vun heh d\u00e4 Sigge k\u00fcnne doh velleisch wiggerh\u00e4llefe." } \ No newline at end of file diff --git a/src/locales/mk.json b/src/locales/mk.json index 1ba1fb70..c95e6940 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -1,122 +1,122 @@ { - "@metadata": { - "authors": [ - "Bjankuloski06", - "Brest" - ] - }, - "index.newPad": "\u041d\u043e\u0432\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430", - "index.createOpenPad": "\u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0435\u0442\u0435\/\u043e\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0441\u043e \u0438\u043c\u0435\u0442\u043e:", - "pad.toolbar.bold.title": "\u0417\u0430\u0434\u0435\u0431\u0435\u043b\u0435\u043d\u043e (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u043e\u0441\u043e (Ctrl-I)", - "pad.toolbar.underline.title": "\u041f\u043e\u0434\u0432\u043b\u0435\u0447\u0435\u043d\u043e (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u041f\u0440\u0435\u0446\u0440\u0442\u0430\u043d\u043e", - "pad.toolbar.ol.title": "\u041f\u043e\u0434\u0440\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.ul.title": "\u041d\u0435\u043f\u043e\u0434\u0440\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.indent.title": "\u0412\u043e\u0432\u043b\u0435\u043a\u0443\u0432\u0430\u045a\u0435", - "pad.toolbar.unindent.title": "\u041e\u0442\u0441\u0442\u0430\u043f", - "pad.toolbar.undo.title": "\u0412\u0440\u0430\u0442\u0438 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041f\u043e\u043d\u0438\u0448\u0442\u0438 \u0433\u0438 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438", - "pad.toolbar.import_export.title": "\u0423\u0432\u043e\u0437\/\u0418\u0437\u0432\u043e\u0437 \u043e\u0434\/\u0432\u043e \u0440\u0430\u0437\u043d\u0438 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u0447\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438", - "pad.toolbar.timeslider.title": "\u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", - "pad.toolbar.savedRevision.title": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430", - "pad.toolbar.settings.title": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438", - "pad.toolbar.embed.title": "\u0412\u043c\u0435\u0442\u043d\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", - "pad.toolbar.showusers.title": "\u041f\u0440\u0438\u043a\u0430\u0436. \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", - "pad.colorpicker.save": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458", - "pad.colorpicker.cancel": "\u041e\u0442\u043a\u0430\u0436\u0438", - "pad.loading": "\u0412\u0447\u0438\u0442\u0443\u0432\u0430\u043c...", - "pad.passwordRequired": "\u041f\u043e\u0442\u0440\u0435\u0431\u043d\u0430 \u0435 \u043b\u043e\u0437\u0438\u043d\u043a\u0430 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f", - "pad.permissionDenied": "\u0417\u0430 \u043e\u0432\u0434\u0435 \u043d\u0435 \u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0430 \u0434\u043e\u0437\u0432\u043e\u043b\u0430 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f", - "pad.wrongPassword": "\u041f\u043e\u0433\u0440\u0435\u0448\u043d\u0430 \u043b\u043e\u0437\u0438\u043d\u043a\u0430", - "pad.settings.padSettings": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430", - "pad.settings.myView": "\u041c\u043e\u0458 \u043f\u043e\u0433\u043b\u0435\u0434", - "pad.settings.stickychat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u0441\u0435\u043a\u043e\u0433\u0430\u0448 \u043d\u0430 \u0435\u043a\u0440\u0430\u043d\u043e\u0442", - "pad.settings.colorcheck": "\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438 \u0431\u043e\u0438", - "pad.settings.linenocheck": "\u0411\u0440\u043e\u0435\u0432\u0438 \u043d\u0430 \u0440\u0435\u0434\u043e\u0432\u0438\u0442\u0435", - "pad.settings.rtlcheck": "\u0421\u043e\u0434\u0440\u0436\u0438\u043d\u0438\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0447\u0438\u0442\u0430\u0430\u0442 \u043e\u0434 \u0434\u0435\u0441\u043d\u043e \u043d\u0430 \u043b\u0435\u0432\u043e?", - "pad.settings.fontType": "\u0422\u0438\u043f \u043d\u0430 \u0444\u043e\u043d\u0442:", - "pad.settings.fontType.normal": "\u041d\u043e\u0440\u043c\u0430\u043b\u0435\u043d", - "pad.settings.fontType.monospaced": "\u041d\u0435\u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d", - "pad.settings.globalView": "\u0413\u043e\u0431\u0430\u043b\u0435\u043d \u043f\u043e\u0433\u043b\u0435\u0434", - "pad.settings.language": "\u0408\u0430\u0437\u0438\u043a:", - "pad.importExport.import_export": "\u0423\u0432\u043e\u0437\/\u0418\u0437\u0432\u043e\u0437", - "pad.importExport.import": "\u041f\u043e\u0434\u0438\u0433\u0430\u045a\u0435 \u043d\u0430 \u0431\u0438\u043b\u043e \u043a\u0430\u043a\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u043d\u0430 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", - "pad.importExport.export": "\u0418\u0437\u0432\u0435\u0437\u0438 \u0458\u0430 \u0442\u0435\u043a\u043e\u0432\u043d\u0430\u0442\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u043a\u0430\u043a\u043e", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u041f\u0440\u043e\u0441\u0442 \u0442\u0435\u043a\u0441\u0442", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0443\u0432\u0435\u0437\u0443\u0432\u0430\u0442\u0435 \u0441\u0430\u043c\u043e \u043e\u0434 \u043f\u0440\u043e\u0441\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438 html-\u0444\u043e\u0440\u043c\u0430\u0442. \u041f\u043e\u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0438 \u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0443\u0432\u043e\u0437 \u045c\u0435 \u0434\u043e\u0431\u0438\u0435\u0442\u0435 \u0430\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0435 AbiWord<\/a>.", - "pad.modals.connected": "\u041f\u043e\u0432\u0440\u0437\u0430\u043d\u043e.", - "pad.modals.reconnecting": "\u0412\u0435 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u043c \u0441\u043e \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430...", - "pad.modals.forcereconnect": "\u041d\u0430\u043c\u0435\u0442\u043d\u0438 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435", - "pad.modals.userdup": "\u041e\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0432\u043e \u0434\u0440\u0443\u0433 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446", - "pad.modals.userdup.explanation": "\u041e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u0432\u0435\u045c\u0435 \u043e\u0434 \u0435\u0434\u0435\u043d \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 (\u0432\u043e \u043f\u0440\u0435\u043b\u0438\u0441\u0442\u0443\u0432\u0430\u0447) \u043d\u0430 \u0441\u043c\u0435\u0442\u0430\u0447\u043e\u0442.", - "pad.modals.userdup.advice": "\u041f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435 \u0441\u0435 \u0437\u0430 \u0434\u0430 \u0433\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043e\u0432\u043e\u0458 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446.", - "pad.modals.unauth": "\u041d\u0435\u043e\u0432\u043b\u0430\u0441\u0442\u0435\u043d\u043e", - "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0438\u0442\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0438 \u0441\u0435 \u0438\u043c\u0430\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u0442\u043e \u0434\u043e\u0434\u0435\u043a\u0430 \u0458\u0430 \u0433\u043b\u0435\u0434\u0430\u0432\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0432\u0430. \u041e\u0431\u0438\u0434\u0435\u0442\u0435 \u0441\u0435 \u0434\u0430 \u0441\u0435 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435.", - "pad.modals.looping": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430.", - "pad.modals.looping.explanation": "\u0421\u0435 \u0458\u0430\u0432\u0438\u0458\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441\u043e \u0432\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u0443\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u043d\u0438\u043e\u0442 \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447.", - "pad.modals.looping.cause": "\u041c\u043e\u0436\u0435\u0431\u0438 \u0441\u0442\u0435 \u043f\u043e\u0432\u0440\u0437\u0430\u043d\u0438 \u043f\u0440\u0435\u043a\u0443 \u043d\u0435\u0441\u043a\u043b\u0430\u0434\u0435\u043d \u043e\u0433\u043d\u0435\u043d \u0455\u0438\u0434 \u0438\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u043f\u043d\u0438\u043a.", - "pad.modals.initsocketfail": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u0435\u043d.", - "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0432 \u0434\u0430 \u0441\u0435 \u043f\u043e\u0432\u0440\u0437\u0430\u043c \u0441\u043e \u0443\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u043d\u0438\u043e\u0442 \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447.", - "pad.modals.initsocketfail.cause": "\u041e\u0432\u0430 \u0432\u0435\u0440\u043e\u0458\u0430\u0442\u043d\u043e \u0441\u0435 \u0434\u043e\u043b\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043e \u0432\u0430\u0448\u0438\u043e\u0442 \u043f\u0440\u0435\u043b\u0438\u0441\u0442\u0443\u0432\u0430\u0447 \u0438\u043b\u0438 \u0432\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.", - "pad.modals.slowcommit": "\u041f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u043e.", - "pad.modals.slowcommit.explanation": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u043d\u0435 \u0441\u0435 \u043e\u0434\u0455\u0438\u0432\u0430.", - "pad.modals.slowcommit.cause": "\u041e\u0432\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0434\u043e\u043b\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441\u043e \u043c\u0440\u0435\u0436\u043d\u043e\u0442\u043e \u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435.", - "pad.modals.deleted": "\u0418\u0437\u0431\u0440\u0438\u0448\u0430\u043d\u043e.", - "pad.modals.deleted.explanation": "\u041e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0435 \u043e\u0442\u0441\u0442\u0440\u0430\u043d\u0435\u0442\u0430.", - "pad.modals.disconnected": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430.", - "pad.modals.disconnected.explanation": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430", - "pad.modals.disconnected.cause": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u0435\u043d. \u0418\u0437\u0432\u0435\u0441\u0442\u0435\u0442\u0435 \u043d\u00e8 \u0430\u043a\u043e \u043e\u0432\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438 \u0434\u0430 \u0432\u0438 \u0441\u0435 \u0441\u043b\u0443\u0447\u0443\u0432\u0430.", - "pad.share": "\u0421\u043f\u043e\u0434\u0435\u043b\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", - "pad.share.readonly": "\u0421\u0430\u043c\u043e \u0447\u0438\u0442\u0430\u045a\u0435", - "pad.share.link": "\u0412\u0440\u0441\u043a\u0430", - "pad.share.emebdcode": "\u0412\u043c\u0435\u0442\u043d\u0438 URL", - "pad.chat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440", - "pad.chat.title": "\u041e\u0442\u0432\u043e\u0440\u0438 \u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0442 \u0437\u0430 \u043e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430.", - "pad.chat.loadmessages": "\u0412\u0447\u0438\u0442\u0430\u0458 \u0443\u0448\u0442\u0435 \u043f\u043e\u0440\u0430\u043a\u0438", - "timeslider.pageTitle": "{{appTitle}} \u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", - "timeslider.toolbar.returnbutton": "\u041d\u0430\u0437\u0430\u0434 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430", - "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u0438:", - "timeslider.toolbar.authorsList": "\u041d\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u0440\u0438", - "timeslider.toolbar.exportlink.title": "\u0418\u0437\u0432\u043e\u0437", - "timeslider.exportCurrent": "\u0418\u0437\u0432\u0435\u0437\u0438 \u0458\u0430 \u0442\u0435\u043a\u043e\u0432\u043d\u0430\u0442\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 \u043a\u0430\u043a\u043e:", - "timeslider.version": "\u0412\u0435\u0440\u0437\u0438\u0458\u0430 {{version}}", - "timeslider.saved": "\u0417\u0430\u0447\u0443\u0432\u0430\u043d\u043e \u043d\u0430 {{day}} {{month}} {{year}} \u0433.", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0458\u0430\u043d\u0443\u0430\u0440\u0438", - "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", - "timeslider.month.march": "\u043c\u0430\u0440\u0442", - "timeslider.month.april": "\u0430\u043f\u0440\u0438\u043b", - "timeslider.month.may": "\u043c\u0430\u0458", - "timeslider.month.june": "\u0458\u0443\u043d\u0438", - "timeslider.month.july": "\u0458\u0443\u043b\u0438", - "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", - "timeslider.month.september": "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438", - "timeslider.month.october": "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438", - "timeslider.month.november": "\u043d\u043e\u0435\u043c\u0432\u0440\u0438", - "timeslider.month.december": "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438", - "timeslider.unnamedauthor": "{{num}} \u043d\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u043d \u0430\u0432\u0442\u043e\u0440", - "timeslider.unnamedauthors": "{{num}} \u043d\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u0438 \u0430\u0432\u0442\u043e\u0440\u0438", - "pad.savedrevs.marked": "\u041e\u0432\u0430\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430 \u0441\u0435\u0433\u0430 \u0435 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043a\u0430\u043a\u043e \u0437\u0430\u0447\u0443\u0432\u0430\u043d\u0430", - "pad.userlist.entername": "\u0412\u043d\u0435\u0441\u0435\u0442\u0435 \u0433\u043e \u0432\u0430\u0448\u0435\u0442\u043e \u0438\u043c\u0435", - "pad.userlist.unnamed": "\u0431\u0435\u0437 \u0438\u043c\u0435", - "pad.userlist.guest": "\u0413\u043e\u0441\u0442\u0438\u043d", - "pad.userlist.deny": "\u041e\u0434\u0431\u0438\u0458", - "pad.userlist.approve": "\u041e\u0434\u043e\u0431\u0440\u0438", - "pad.editbar.clearcolors": "\u0414\u0430 \u0433\u0438 \u043e\u0442\u0441\u0442\u0440\u0430\u043d\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438 \u043e\u0434 \u0446\u0435\u043b\u0438\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442?", - "pad.impexp.importbutton": "\u0423\u0432\u0435\u0437\u0438 \u0441\u0435\u0433\u0430", - "pad.impexp.importing": "\u0423\u0432\u0435\u0437\u0443\u0432\u0430\u043c...", - "pad.impexp.confirmimport": "\u0423\u0432\u0435\u0437\u0443\u0432\u0430\u0458\u045c\u0438 \u0458\u0430 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430\u0442\u0430 \u045c\u0435 \u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0446\u0435\u043b\u0438\u043e\u0442 \u0434\u043e\u0441\u0435\u0433\u0430\u0448\u0435\u043d \u0442\u0435\u043a\u0441\u0442 \u0432\u043e \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430. \u0414\u0430\u043b\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0435\u043a\u0430 \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435?", - "pad.impexp.convertFailed": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0432 \u0434\u0430 \u0458\u0430 \u0443\u0432\u0435\u0437\u0430\u043c \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430\u0442\u0430. \u041f\u043e\u0441\u043b\u0443\u0436\u0435\u0442\u0435 \u0441\u0435 \u0441\u043e \u043f\u043e\u0438\u043d\u0430\u043a\u043e\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u043b\u0438 \u043f\u0440\u0435\u043a\u043e\u043f\u0438\u0440\u0430\u0458\u0442\u0435 \u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0442 \u0440\u0430\u0447\u043d\u043e.", - "pad.impexp.uploadFailed": "\u041f\u043e\u0434\u0438\u0433\u0430\u045a\u0435\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u0430. \u041e\u0431\u0438\u0434\u0435\u0442\u0435 \u0441\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.", - "pad.impexp.importfailed": "\u0423\u0432\u043e\u0437\u043e\u0442 \u043d\u0435 \u0443\u0441\u043f\u0435\u0430", - "pad.impexp.copypaste": "\u041f\u0440\u0435\u043a\u043e\u043f\u0438\u0440\u0430\u0458\u0442\u0435", - "pad.impexp.exportdisabled": "\u0418\u0437\u0432\u043e\u0437\u043e\u0442 \u0432\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0442 {{type}} \u0435 \u043e\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u0410\u043a\u043e \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u0434\u043e\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u045c\u0435 \u0437\u0430 \u043e\u0432\u0430, \u043e\u0431\u0440\u0430\u0442\u0435\u0442\u0435 \u0441\u0435 \u043a\u0430\u0458 \u0441\u0438\u0441\u0442\u0435\u043c\u0441\u043a\u0438\u043e\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440." + "@metadata": { + "authors": [ + "Bjankuloski06", + "Brest" + ] + }, + "index.newPad": "\u041d\u043e\u0432\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430", + "index.createOpenPad": "\u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0435\u0442\u0435/\u043e\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0441\u043e \u0438\u043c\u0435\u0442\u043e:", + "pad.toolbar.bold.title": "\u0417\u0430\u0434\u0435\u0431\u0435\u043b\u0435\u043d\u043e (Ctrl-B)", + "pad.toolbar.italic.title": "\u041a\u043e\u0441\u043e (Ctrl-I)", + "pad.toolbar.underline.title": "\u041f\u043e\u0434\u0432\u043b\u0435\u0447\u0435\u043d\u043e (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u041f\u0440\u0435\u0446\u0440\u0442\u0430\u043d\u043e", + "pad.toolbar.ol.title": "\u041f\u043e\u0434\u0440\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a", + "pad.toolbar.ul.title": "\u041d\u0435\u043f\u043e\u0434\u0440\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a", + "pad.toolbar.indent.title": "\u0412\u043e\u0432\u043b\u0435\u043a\u0443\u0432\u0430\u045a\u0435", + "pad.toolbar.unindent.title": "\u041e\u0442\u0441\u0442\u0430\u043f", + "pad.toolbar.undo.title": "\u0412\u0440\u0430\u0442\u0438 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u041f\u043e\u043d\u0438\u0448\u0442\u0438 \u0433\u0438 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438", + "pad.toolbar.import_export.title": "\u0423\u0432\u043e\u0437/\u0418\u0437\u0432\u043e\u0437 \u043e\u0434/\u0432\u043e \u0440\u0430\u0437\u043d\u0438 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u0447\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438", + "pad.toolbar.timeslider.title": "\u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", + "pad.toolbar.savedRevision.title": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430", + "pad.toolbar.settings.title": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438", + "pad.toolbar.embed.title": "\u0412\u043c\u0435\u0442\u043d\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", + "pad.toolbar.showusers.title": "\u041f\u0440\u0438\u043a\u0430\u0436. \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", + "pad.colorpicker.save": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458", + "pad.colorpicker.cancel": "\u041e\u0442\u043a\u0430\u0436\u0438", + "pad.loading": "\u0412\u0447\u0438\u0442\u0443\u0432\u0430\u043c...", + "pad.passwordRequired": "\u041f\u043e\u0442\u0440\u0435\u0431\u043d\u0430 \u0435 \u043b\u043e\u0437\u0438\u043d\u043a\u0430 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f", + "pad.permissionDenied": "\u0417\u0430 \u043e\u0432\u0434\u0435 \u043d\u0435 \u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0430 \u0434\u043e\u0437\u0432\u043e\u043b\u0430 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f", + "pad.wrongPassword": "\u041f\u043e\u0433\u0440\u0435\u0448\u043d\u0430 \u043b\u043e\u0437\u0438\u043d\u043a\u0430", + "pad.settings.padSettings": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430", + "pad.settings.myView": "\u041c\u043e\u0458 \u043f\u043e\u0433\u043b\u0435\u0434", + "pad.settings.stickychat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u0441\u0435\u043a\u043e\u0433\u0430\u0448 \u043d\u0430 \u0435\u043a\u0440\u0430\u043d\u043e\u0442", + "pad.settings.colorcheck": "\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438 \u0431\u043e\u0438", + "pad.settings.linenocheck": "\u0411\u0440\u043e\u0435\u0432\u0438 \u043d\u0430 \u0440\u0435\u0434\u043e\u0432\u0438\u0442\u0435", + "pad.settings.rtlcheck": "\u0421\u043e\u0434\u0440\u0436\u0438\u043d\u0438\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0447\u0438\u0442\u0430\u0430\u0442 \u043e\u0434 \u0434\u0435\u0441\u043d\u043e \u043d\u0430 \u043b\u0435\u0432\u043e?", + "pad.settings.fontType": "\u0422\u0438\u043f \u043d\u0430 \u0444\u043e\u043d\u0442:", + "pad.settings.fontType.normal": "\u041d\u043e\u0440\u043c\u0430\u043b\u0435\u043d", + "pad.settings.fontType.monospaced": "\u041d\u0435\u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d", + "pad.settings.globalView": "\u0413\u043e\u0431\u0430\u043b\u0435\u043d \u043f\u043e\u0433\u043b\u0435\u0434", + "pad.settings.language": "\u0408\u0430\u0437\u0438\u043a:", + "pad.importExport.import_export": "\u0423\u0432\u043e\u0437/\u0418\u0437\u0432\u043e\u0437", + "pad.importExport.import": "\u041f\u043e\u0434\u0438\u0433\u0430\u045a\u0435 \u043d\u0430 \u0431\u0438\u043b\u043e \u043a\u0430\u043a\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u043d\u0430 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", + "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", + "pad.importExport.export": "\u0418\u0437\u0432\u0435\u0437\u0438 \u0458\u0430 \u0442\u0435\u043a\u043e\u0432\u043d\u0430\u0442\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u043a\u0430\u043a\u043e", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u041f\u0440\u043e\u0441\u0442 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0443\u0432\u0435\u0437\u0443\u0432\u0430\u0442\u0435 \u0441\u0430\u043c\u043e \u043e\u0434 \u043f\u0440\u043e\u0441\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438 html-\u0444\u043e\u0440\u043c\u0430\u0442. \u041f\u043e\u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0438 \u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0443\u0432\u043e\u0437 \u045c\u0435 \u0434\u043e\u0431\u0438\u0435\u0442\u0435 \u0430\u043a\u043e \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0435 AbiWord\u003C/a\u003E.", + "pad.modals.connected": "\u041f\u043e\u0432\u0440\u0437\u0430\u043d\u043e.", + "pad.modals.reconnecting": "\u0412\u0435 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u043c \u0441\u043e \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430...", + "pad.modals.forcereconnect": "\u041d\u0430\u043c\u0435\u0442\u043d\u0438 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435", + "pad.modals.userdup": "\u041e\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0432\u043e \u0434\u0440\u0443\u0433 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446", + "pad.modals.userdup.explanation": "\u041e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u0432\u0435\u045c\u0435 \u043e\u0434 \u0435\u0434\u0435\u043d \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 (\u0432\u043e \u043f\u0440\u0435\u043b\u0438\u0441\u0442\u0443\u0432\u0430\u0447) \u043d\u0430 \u0441\u043c\u0435\u0442\u0430\u0447\u043e\u0442.", + "pad.modals.userdup.advice": "\u041f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435 \u0441\u0435 \u0437\u0430 \u0434\u0430 \u0433\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043e\u0432\u043e\u0458 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446.", + "pad.modals.unauth": "\u041d\u0435\u043e\u0432\u043b\u0430\u0441\u0442\u0435\u043d\u043e", + "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0438\u0442\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0438 \u0441\u0435 \u0438\u043c\u0430\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u0442\u043e \u0434\u043e\u0434\u0435\u043a\u0430 \u0458\u0430 \u0433\u043b\u0435\u0434\u0430\u0432\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0432\u0430. \u041e\u0431\u0438\u0434\u0435\u0442\u0435 \u0441\u0435 \u0434\u0430 \u0441\u0435 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435.", + "pad.modals.looping": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430.", + "pad.modals.looping.explanation": "\u0421\u0435 \u0458\u0430\u0432\u0438\u0458\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441\u043e \u0432\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u0443\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u043d\u0438\u043e\u0442 \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447.", + "pad.modals.looping.cause": "\u041c\u043e\u0436\u0435\u0431\u0438 \u0441\u0442\u0435 \u043f\u043e\u0432\u0440\u0437\u0430\u043d\u0438 \u043f\u0440\u0435\u043a\u0443 \u043d\u0435\u0441\u043a\u043b\u0430\u0434\u0435\u043d \u043e\u0433\u043d\u0435\u043d \u0455\u0438\u0434 \u0438\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u043f\u043d\u0438\u043a.", + "pad.modals.initsocketfail": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u0435\u043d.", + "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0432 \u0434\u0430 \u0441\u0435 \u043f\u043e\u0432\u0440\u0437\u0430\u043c \u0441\u043e \u0443\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u043d\u0438\u043e\u0442 \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447.", + "pad.modals.initsocketfail.cause": "\u041e\u0432\u0430 \u0432\u0435\u0440\u043e\u0458\u0430\u0442\u043d\u043e \u0441\u0435 \u0434\u043e\u043b\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043e \u0432\u0430\u0448\u0438\u043e\u0442 \u043f\u0440\u0435\u043b\u0438\u0441\u0442\u0443\u0432\u0430\u0447 \u0438\u043b\u0438 \u0432\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.", + "pad.modals.slowcommit": "\u041f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u043e.", + "pad.modals.slowcommit.explanation": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u043d\u0435 \u0441\u0435 \u043e\u0434\u0455\u0438\u0432\u0430.", + "pad.modals.slowcommit.cause": "\u041e\u0432\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0434\u043e\u043b\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441\u043e \u043c\u0440\u0435\u0436\u043d\u043e\u0442\u043e \u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435.", + "pad.modals.deleted": "\u0418\u0437\u0431\u0440\u0438\u0448\u0430\u043d\u043e.", + "pad.modals.deleted.explanation": "\u041e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0435 \u043e\u0442\u0441\u0442\u0440\u0430\u043d\u0435\u0442\u0430.", + "pad.modals.disconnected": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430.", + "pad.modals.disconnected.explanation": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430", + "pad.modals.disconnected.cause": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u0435\u043d. \u0418\u0437\u0432\u0435\u0441\u0442\u0435\u0442\u0435 \u043d\u00e8 \u0430\u043a\u043e \u043e\u0432\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438 \u0434\u0430 \u0432\u0438 \u0441\u0435 \u0441\u043b\u0443\u0447\u0443\u0432\u0430.", + "pad.share": "\u0421\u043f\u043e\u0434\u0435\u043b\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", + "pad.share.readonly": "\u0421\u0430\u043c\u043e \u0447\u0438\u0442\u0430\u045a\u0435", + "pad.share.link": "\u0412\u0440\u0441\u043a\u0430", + "pad.share.emebdcode": "\u0412\u043c\u0435\u0442\u043d\u0438 URL", + "pad.chat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440", + "pad.chat.title": "\u041e\u0442\u0432\u043e\u0440\u0438 \u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0442 \u0437\u0430 \u043e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430.", + "pad.chat.loadmessages": "\u0412\u0447\u0438\u0442\u0430\u0458 \u0443\u0448\u0442\u0435 \u043f\u043e\u0440\u0430\u043a\u0438", + "timeslider.pageTitle": "{{appTitle}} \u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", + "timeslider.toolbar.returnbutton": "\u041d\u0430\u0437\u0430\u0434 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430", + "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u0438:", + "timeslider.toolbar.authorsList": "\u041d\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u0440\u0438", + "timeslider.toolbar.exportlink.title": "\u0418\u0437\u0432\u043e\u0437", + "timeslider.exportCurrent": "\u0418\u0437\u0432\u0435\u0437\u0438 \u0458\u0430 \u0442\u0435\u043a\u043e\u0432\u043d\u0430\u0442\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 \u043a\u0430\u043a\u043e:", + "timeslider.version": "\u0412\u0435\u0440\u0437\u0438\u0458\u0430 {{version}}", + "timeslider.saved": "\u0417\u0430\u0447\u0443\u0432\u0430\u043d\u043e \u043d\u0430 {{day}} {{month}} {{year}} \u0433.", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u0458\u0430\u043d\u0443\u0430\u0440\u0438", + "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", + "timeslider.month.march": "\u043c\u0430\u0440\u0442", + "timeslider.month.april": "\u0430\u043f\u0440\u0438\u043b", + "timeslider.month.may": "\u043c\u0430\u0458", + "timeslider.month.june": "\u0458\u0443\u043d\u0438", + "timeslider.month.july": "\u0458\u0443\u043b\u0438", + "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", + "timeslider.month.september": "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438", + "timeslider.month.october": "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438", + "timeslider.month.november": "\u043d\u043e\u0435\u043c\u0432\u0440\u0438", + "timeslider.month.december": "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438", + "timeslider.unnamedauthor": "{{num}} \u043d\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u043d \u0430\u0432\u0442\u043e\u0440", + "timeslider.unnamedauthors": "{{num}} \u043d\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u0438 \u0430\u0432\u0442\u043e\u0440\u0438", + "pad.savedrevs.marked": "\u041e\u0432\u0430\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430 \u0441\u0435\u0433\u0430 \u0435 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043a\u0430\u043a\u043e \u0437\u0430\u0447\u0443\u0432\u0430\u043d\u0430", + "pad.userlist.entername": "\u0412\u043d\u0435\u0441\u0435\u0442\u0435 \u0433\u043e \u0432\u0430\u0448\u0435\u0442\u043e \u0438\u043c\u0435", + "pad.userlist.unnamed": "\u0431\u0435\u0437 \u0438\u043c\u0435", + "pad.userlist.guest": "\u0413\u043e\u0441\u0442\u0438\u043d", + "pad.userlist.deny": "\u041e\u0434\u0431\u0438\u0458", + "pad.userlist.approve": "\u041e\u0434\u043e\u0431\u0440\u0438", + "pad.editbar.clearcolors": "\u0414\u0430 \u0433\u0438 \u043e\u0442\u0441\u0442\u0440\u0430\u043d\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438 \u043e\u0434 \u0446\u0435\u043b\u0438\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442?", + "pad.impexp.importbutton": "\u0423\u0432\u0435\u0437\u0438 \u0441\u0435\u0433\u0430", + "pad.impexp.importing": "\u0423\u0432\u0435\u0437\u0443\u0432\u0430\u043c...", + "pad.impexp.confirmimport": "\u0423\u0432\u0435\u0437\u0443\u0432\u0430\u0458\u045c\u0438 \u0458\u0430 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430\u0442\u0430 \u045c\u0435 \u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0446\u0435\u043b\u0438\u043e\u0442 \u0434\u043e\u0441\u0435\u0433\u0430\u0448\u0435\u043d \u0442\u0435\u043a\u0441\u0442 \u0432\u043e \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430. \u0414\u0430\u043b\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0435\u043a\u0430 \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435?", + "pad.impexp.convertFailed": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0432 \u0434\u0430 \u0458\u0430 \u0443\u0432\u0435\u0437\u0430\u043c \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430\u0442\u0430. \u041f\u043e\u0441\u043b\u0443\u0436\u0435\u0442\u0435 \u0441\u0435 \u0441\u043e \u043f\u043e\u0438\u043d\u0430\u043a\u043e\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u043b\u0438 \u043f\u0440\u0435\u043a\u043e\u043f\u0438\u0440\u0430\u0458\u0442\u0435 \u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0442 \u0440\u0430\u0447\u043d\u043e.", + "pad.impexp.uploadFailed": "\u041f\u043e\u0434\u0438\u0433\u0430\u045a\u0435\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u0430. \u041e\u0431\u0438\u0434\u0435\u0442\u0435 \u0441\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.", + "pad.impexp.importfailed": "\u0423\u0432\u043e\u0437\u043e\u0442 \u043d\u0435 \u0443\u0441\u043f\u0435\u0430", + "pad.impexp.copypaste": "\u041f\u0440\u0435\u043a\u043e\u043f\u0438\u0440\u0430\u0458\u0442\u0435", + "pad.impexp.exportdisabled": "\u0418\u0437\u0432\u043e\u0437\u043e\u0442 \u0432\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0442 {{type}} \u0435 \u043e\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u0410\u043a\u043e \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u0434\u043e\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u045c\u0435 \u0437\u0430 \u043e\u0432\u0430, \u043e\u0431\u0440\u0430\u0442\u0435\u0442\u0435 \u0441\u0435 \u043a\u0430\u0458 \u0441\u0438\u0441\u0442\u0435\u043c\u0441\u043a\u0438\u043e\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440." } \ No newline at end of file diff --git a/src/locales/ml.json b/src/locales/ml.json index 2ffbee2f..be71c23b 100644 --- a/src/locales/ml.json +++ b/src/locales/ml.json @@ -1,123 +1,123 @@ { - "@metadata": { - "authors": [ - "Hrishikesh.kb", - "Praveenp", - "Santhosh.thottingal" - ] - }, - "index.newPad": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d3e\u0d21\u0d4d", - "index.createOpenPad": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d2a\u0d47\u0d30\u0d41\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d2a\u0d3e\u0d21\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15\/\u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15:", - "pad.toolbar.bold.title": "\u0d15\u0d1f\u0d4d\u0d1f\u0d3f\u0d15\u0d42\u0d1f\u0d4d\u0d1f\u0d3f\u0d2f\u0d46\u0d34\u0d41\u0d24\u0d41\u0d15 (Ctrl-B)", - "pad.toolbar.italic.title": "\u0d1a\u0d46\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d46\u0d34\u0d41\u0d24\u0d41\u0d15 (Ctrl-I)", - "pad.toolbar.underline.title": "\u0d05\u0d1f\u0d3f\u0d35\u0d30\u0d2f\u0d3f\u0d1f\u0d41\u0d15 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0d35\u0d46\u0d1f\u0d4d\u0d1f\u0d41\u0d15", - "pad.toolbar.ol.title": "\u0d15\u0d4d\u0d30\u0d2e\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d2a\u0d1f\u0d4d\u0d1f\u0d3f\u0d15", - "pad.toolbar.ul.title": "\u0d15\u0d4d\u0d30\u0d2e\u0d30\u0d39\u0d3f\u0d24 \u0d2a\u0d1f\u0d4d\u0d1f\u0d3f\u0d15", - "pad.toolbar.indent.title": "\u0d35\u0d32\u0d24\u0d4d\u0d24\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d33\u0d4d\u0d33\u0d41\u0d15", - "pad.toolbar.unindent.title": "\u0d07\u0d1f\u0d24\u0d4d\u0d24\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d33\u0d4d\u0d33\u0d41\u0d15", - "pad.toolbar.undo.title": "\u0d24\u0d3f\u0d30\u0d38\u0d4d\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d02 \u0d15\u0d33\u0d2f\u0d41\u0d15", - "pad.toolbar.import_export.title": "\u0d35\u0d4d\u0d2f\u0d24\u0d4d\u0d2f\u0d38\u0d4d\u0d24 \u0d2b\u0d2f\u0d7d \u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d\/\u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f\/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.toolbar.timeslider.title": "\u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", - "pad.toolbar.savedRevision.title": "\u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.toolbar.settings.title": "\u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", - "pad.toolbar.embed.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.toolbar.showusers.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d09\u0d2a\u0d2f\u0d4b\u0d15\u0d4d\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d2a\u0d4d\u0d30\u0d26\u0d7c\u0d36\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.colorpicker.save": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.colorpicker.cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.loading": "\u0d36\u0d47\u0d16\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", - "pad.passwordRequired": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d3f\u0d28\u0d3e\u0d2f\u0d3f \u0d12\u0d30\u0d41 \u0d30\u0d39\u0d38\u0d4d\u0d2f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d28\u0d7d\u0d15\u0d47\u0d23\u0d4d\u0d1f\u0d24\u0d3e\u0d23\u0d4d", - "pad.permissionDenied": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d15\u0d3e\u0d23\u0d41\u0d35\u0d3e\u0d7b \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d28\u0d41\u0d2e\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", - "pad.wrongPassword": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d28\u0d32\u0d4d\u0d15\u0d3f\u0d2f \u0d30\u0d39\u0d38\u0d4d\u0d2f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d46\u0d31\u0d4d\u0d31\u0d3e\u0d2f\u0d3f\u0d30\u0d41\u0d28\u0d4d\u0d28\u0d41", - "pad.settings.padSettings": "\u0d2a\u0d3e\u0d21\u0d4d \u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", - "pad.settings.myView": "\u0d0e\u0d28\u0d4d\u0d31\u0d46 \u0d15\u0d3e\u0d34\u0d4d\u0d1a", - "pad.settings.stickychat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d02 \u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d0e\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d41\u0d02 \u0d38\u0d4d\u0d15\u0d4d\u0d30\u0d40\u0d28\u0d3f\u0d7d \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.settings.colorcheck": "\u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d3e\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e", - "pad.settings.linenocheck": "\u0d35\u0d30\u0d3f\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d15\u0d4d\u0d30\u0d2e\u0d38\u0d02\u0d16\u0d4d\u0d2f", - "pad.settings.rtlcheck": "\u0d09\u0d33\u0d4d\u0d33\u0d1f\u0d15\u0d4d\u0d15\u0d02 \u0d35\u0d32\u0d24\u0d4d\u0d24\u0d41\u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d1f\u0d24\u0d4d\u0d24\u0d4b\u0d1f\u0d4d\u0d1f\u0d3e\u0d23\u0d4b \u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d47\u0d23\u0d4d\u0d1f\u0d24\u0d4d?", - "pad.settings.fontType": "\u0d2b\u0d4b\u0d23\u0d4d\u0d1f\u0d4d \u0d24\u0d30\u0d02:", - "pad.settings.fontType.normal": "\u0d38\u0d3e\u0d27\u0d3e\u0d30\u0d23\u0d02", - "pad.settings.fontType.monospaced": "\u0d2e\u0d4b\u0d23\u0d4b\u0d38\u0d4d\u0d2a\u0d47\u0d38\u0d4d", - "pad.settings.globalView": "\u0d2e\u0d4a\u0d24\u0d4d\u0d24\u0d15\u0d4d\u0d15\u0d3e\u0d34\u0d4d\u0d1a", - "pad.settings.language": "\u0d2d\u0d3e\u0d37:", - "pad.importExport.import_export": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f\/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.importExport.import": "\u0d0e\u0d28\u0d4d\u0d24\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d32\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d2e\u0d4b \u0d30\u0d47\u0d16\u0d2f\u0d4b \u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.importExport.importSuccessful": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d02!", - "pad.importExport.export": "\u0d07\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d24\u0d4d\u0d24\u0d46 \u0d2a\u0d3e\u0d21\u0d4d \u0d07\u0d19\u0d4d\u0d19\u0d28\u0d46 \u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15:", - "pad.importExport.exporthtml": "\u0d0e\u0d1a\u0d4d\u0d1a\u0d4d.\u0d31\u0d4d\u0d31\u0d3f.\u0d0e\u0d02.\u0d0e\u0d7d.", - "pad.importExport.exportplain": "\u0d35\u0d46\u0d31\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d4d", - "pad.importExport.exportword": "\u0d2e\u0d48\u0d15\u0d4d\u0d30\u0d4b\u0d38\u0d4b\u0d2b\u0d4d\u0d31\u0d4d\u0d31\u0d4d \u0d35\u0d47\u0d21\u0d4d", - "pad.importExport.exportpdf": "\u0d2a\u0d3f.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d.", - "pad.importExport.exportopen": "\u0d12.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d. (\u0d13\u0d2a\u0d4d\u0d2a\u0d7a \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d)", - "pad.importExport.exportdokuwiki": "\u0d21\u0d4b\u0d15\u0d41\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d3f", - "pad.importExport.abiword.innerHTML": "\u0d2a\u0d4d\u0d32\u0d46\u0d2f\u0d3f\u0d7b \u0d1f\u0d46\u0d15\u0d4d\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b \u0d0e\u0d1a\u0d4d\u0d1a\u0d4d.\u0d31\u0d4d\u0d31\u0d3f.\u0d0e\u0d02.\u0d0e\u0d7d. \u0d24\u0d30\u0d2e\u0d4b \u0d2e\u0d3e\u0d24\u0d4d\u0d30\u0d2e\u0d47 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d28\u0d3e\u0d35\u0d42. \u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d35\u0d3f\u0d2a\u0d41\u0d32\u0d40\u0d15\u0d43\u0d24 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d38\u0d57\u0d15\u0d30\u0d4d\u0d2f\u0d19\u0d4d\u0d19\u0d7e\u0d15\u0d4d\u0d15\u0d3e\u0d2f\u0d3f \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d05\u0d2c\u0d3f\u0d35\u0d47\u0d21\u0d4d \u0d07\u0d7b\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d7e \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15<\/a>.", - "pad.modals.connected": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", - "pad.modals.reconnecting": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d4d \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", - "pad.modals.forcereconnect": "\u0d0e\u0d28\u0d4d\u0d24\u0d3e\u0d2f\u0d3e\u0d32\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.modals.userdup": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d1c\u0d3e\u0d32\u0d15\u0d24\u0d4d\u0d24\u0d3f\u0d7d \u0d24\u0d41\u0d31\u0d28\u0d4d\u0d28\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", - "pad.modals.userdup.explanation": "\u0d08 \u0d15\u0d2e\u0d4d\u0d2a\u0d4d\u0d2f\u0d42\u0d1f\u0d4d\u0d1f\u0d31\u0d3f\u0d7d \u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d12\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d27\u0d3f\u0d15\u0d02 \u0d2c\u0d4d\u0d30\u0d57\u0d38\u0d7c \u0d1c\u0d3e\u0d32\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d24\u0d41\u0d31\u0d28\u0d4d\u0d28\u0d24\u0d3e\u0d2f\u0d3f \u0d15\u0d3e\u0d23\u0d41\u0d28\u0d4d\u0d28\u0d41.", - "pad.modals.userdup.advice": "\u0d08 \u0d1c\u0d3e\u0d32\u0d15\u0d02 \u0d24\u0d28\u0d4d\u0d28\u0d46 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d28\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.modals.unauth": "\u0d05\u0d28\u0d41\u0d35\u0d3e\u0d26\u0d2e\u0d3f\u0d32\u0d4d\u0d32", - "pad.modals.unauth.explanation": "\u0d08 \u0d24\u0d3e\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d41\u0d15\u0d4a\u0d23\u0d4d\u0d1f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d46 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d05\u0d28\u0d41\u0d2e\u0d24\u0d3f\u0d15\u0d33\u0d3f\u0d7d \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d3e\u0d2f\u0d3f. \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15.", - "pad.modals.looping": "\u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41.", - "pad.modals.looping.explanation": "\u0d38\u0d3f\u0d02\u0d15\u0d4d\u0d30\u0d23\u0d48\u0d38\u0d47\u0d37\u0d7b \u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d41\u0d33\u0d4d\u0d33 \u0d06\u0d36\u0d2f\u0d35\u0d3f\u0d28\u0d3f\u0d2e\u0d2f\u0d24\u0d4d\u0d24\u0d3f\u0d7d \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d23\u0d4d\u0d1f\u0d4d.", - "pad.modals.looping.cause": "\u0d12\u0d30\u0d41\u0d2a\u0d15\u0d4d\u0d37\u0d47 \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d24\u0d4d\u0d24 \u0d2b\u0d2f\u0d7c\u0d35\u0d3e\u0d33\u0d3f\u0d32\u0d42\u0d1f\u0d46\u0d2f\u0d4b \u0d2a\u0d4d\u0d30\u0d4b\u0d15\u0d4d\u0d38\u0d3f\u0d2f\u0d3f\u0d32\u0d42\u0d1f\u0d46\u0d2f\u0d4b \u0d06\u0d15\u0d3e\u0d02 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d.", - "pad.modals.initsocketfail": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d3f\u0d32\u0d46\u0d24\u0d4d\u0d24\u0d3e\u0d7b \u0d2a\u0d31\u0d4d\u0d31\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32.", - "pad.modals.initsocketfail.explanation": "\u0d38\u0d3f\u0d02\u0d15\u0d4d\u0d30\u0d23\u0d48\u0d38\u0d47\u0d37\u0d7b \u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32.", - "pad.modals.initsocketfail.cause": "\u0d07\u0d28\u0d4d\u0d31\u0d7c\u0d28\u0d46\u0d31\u0d4d\u0d31\u0d4d \u0d15\u0d23\u0d15\u0d4d\u0d37\u0d28\u0d4d\u0d31\u0d46\u0d2f\u0d4b \u0d2c\u0d4d\u0d30\u0d57\u0d38\u0d31\u0d3f\u0d28\u0d4d\u0d31\u0d46\u0d2f\u0d4b \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d2e\u0d3e\u0d15\u0d3e\u0d02", - "pad.modals.slowcommit": "\u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41.", - "pad.modals.slowcommit.explanation": "\u0d38\u0d46\u0d7c\u0d35\u0d7c \u0d2a\u0d4d\u0d30\u0d24\u0d3f\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32.", - "pad.modals.slowcommit.cause": "\u0d28\u0d46\u0d31\u0d4d\u0d31\u0d4d\u200c\u0d35\u0d7c\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d02 \u0d15\u0d3e\u0d30\u0d23\u0d2e\u0d3e\u0d15\u0d3e\u0d02.", - "pad.modals.deleted": "\u0d2e\u0d3e\u0d2f\u0d4d\u0d1a\u0d4d\u0d1a\u0d41", - "pad.modals.deleted.explanation": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41.", - "pad.modals.disconnected": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", - "pad.modals.disconnected.explanation": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d41\u0d33\u0d4d\u0d33 \u0d2c\u0d28\u0d4d\u0d27\u0d02 \u0d28\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", - "pad.modals.disconnected.cause": "\u0d38\u0d46\u0d7c\u0d35\u0d7c \u0d32\u0d2d\u0d4d\u0d2f\u0d2e\u0d32\u0d4d\u0d32\u0d3e\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d02. \u0d07\u0d24\u0d4d \u0d24\u0d41\u0d1f\u0d7c\u0d1a\u0d4d\u0d1a\u0d2f\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41\u0d23\u0d4d\u0d1f\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d1e\u0d19\u0d4d\u0d19\u0d33\u0d46 \u0d05\u0d31\u0d3f\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15.", - "pad.share": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15", - "pad.share.readonly": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2e\u0d3e\u0d24\u0d4d\u0d30\u0d02", - "pad.share.link": "\u0d15\u0d23\u0d4d\u0d23\u0d3f", - "pad.share.emebdcode": "\u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d2f\u0d41.\u0d06\u0d7c.\u0d0e\u0d7d.", - "pad.chat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02", - "pad.chat.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15.", - "pad.chat.loadmessages": "\u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d7e \u0d0e\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15", - "timeslider.pageTitle": "{{appTitle}} \u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", - "timeslider.toolbar.returnbutton": "\u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d3f\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d41\u0d2a\u0d4b\u0d35\u0d41\u0d15", - "timeslider.toolbar.authors": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e:", - "timeslider.toolbar.authorsList": "\u0d06\u0d30\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d3f\u0d2f\u0d3f\u0d1f\u0d4d\u0d1f\u0d3f\u0d32\u0d4d\u0d32", - "timeslider.toolbar.exportlink.title": "\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f", - "timeslider.exportCurrent": "\u0d08 \u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d07\u0d19\u0d4d\u0d19\u0d28\u0d46 \u0d0e\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15:", - "timeslider.version": "\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d {{version}}", - "timeslider.saved": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d24\u0d4d {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f", - "timeslider.month.february": "\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f", - "timeslider.month.march": "\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d", - "timeslider.month.april": "\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d", - "timeslider.month.may": "\u0d2e\u0d47\u0d2f\u0d4d", - "timeslider.month.june": "\u0d1c\u0d42\u0d7a", - "timeslider.month.july": "\u0d1c\u0d42\u0d32\u0d48", - "timeslider.month.august": "\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d", - "timeslider.month.september": "\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c", - "timeslider.month.october": "\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c", - "timeslider.month.november": "\u0d28\u0d35\u0d02\u0d2c\u0d7c", - "timeslider.month.december": "\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c", - "timeslider.unnamedauthor": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d35\u0d4d", - "timeslider.unnamedauthors": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e", - "pad.savedrevs.marked": "\u0d08 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d3e\u0d2f\u0d3f \u0d05\u0d1f\u0d2f\u0d3e\u0d33\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", - "pad.userlist.entername": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", - "pad.userlist.unnamed": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24", - "pad.userlist.guest": "\u0d05\u0d24\u0d3f\u0d25\u0d3f", - "pad.userlist.deny": "\u0d28\u0d3f\u0d30\u0d38\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.userlist.approve": "\u0d05\u0d02\u0d17\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.editbar.clearcolors": "\u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d3f\u0d7d \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d38\u0d42\u0d1a\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d28\u0d3e\u0d2f\u0d3f \u0d28\u0d7d\u0d15\u0d3f\u0d2f\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e \u0d12\u0d34\u0d3f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d1f\u0d4d\u0d1f\u0d46?", - "pad.impexp.importbutton": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.impexp.importing": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...", - "pad.impexp.confirmimport": "\u0d12\u0d30\u0d41 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d02 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d7e \u0d28\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d28\u0d3f\u0d1f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d02, \u0d24\u0d41\u0d1f\u0d30\u0d23\u0d2e\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d09\u0d31\u0d2a\u0d4d\u0d2a\u0d3e\u0d23\u0d4b?", - "pad.impexp.convertFailed": "\u0d08 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d02 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d38\u0d3e\u0d27\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d32\u0d4d\u0d32. \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15\u0d2f\u0d4b, \u0d38\u0d4d\u0d35\u0d28\u0d4d\u0d24\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15\u0d2f\u0d4b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.impexp.uploadFailed": "\u0d05\u0d2a\u0d4d\u200c\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.impexp.importfailed": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", - "pad.impexp.copypaste": "\u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.impexp.exportdisabled": "{{type}} \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d3f\u0d7d \u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d24\u0d1f\u0d1e\u0d4d\u0d1e\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41. \u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d02 \u0d05\u0d21\u0d4d\u0d2e\u0d3f\u0d28\u0d3f\u0d38\u0d4d\u0d1f\u0d4d\u0d30\u0d47\u0d31\u0d4d\u0d31\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d15." + "@metadata": { + "authors": [ + "Hrishikesh.kb", + "Praveenp", + "Santhosh.thottingal" + ] + }, + "index.newPad": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d3e\u0d21\u0d4d", + "index.createOpenPad": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d2a\u0d47\u0d30\u0d41\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d2a\u0d3e\u0d21\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15/\u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15:", + "pad.toolbar.bold.title": "\u0d15\u0d1f\u0d4d\u0d1f\u0d3f\u0d15\u0d42\u0d1f\u0d4d\u0d1f\u0d3f\u0d2f\u0d46\u0d34\u0d41\u0d24\u0d41\u0d15 (Ctrl-B)", + "pad.toolbar.italic.title": "\u0d1a\u0d46\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d46\u0d34\u0d41\u0d24\u0d41\u0d15 (Ctrl-I)", + "pad.toolbar.underline.title": "\u0d05\u0d1f\u0d3f\u0d35\u0d30\u0d2f\u0d3f\u0d1f\u0d41\u0d15 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0d35\u0d46\u0d1f\u0d4d\u0d1f\u0d41\u0d15", + "pad.toolbar.ol.title": "\u0d15\u0d4d\u0d30\u0d2e\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d2a\u0d1f\u0d4d\u0d1f\u0d3f\u0d15", + "pad.toolbar.ul.title": "\u0d15\u0d4d\u0d30\u0d2e\u0d30\u0d39\u0d3f\u0d24 \u0d2a\u0d1f\u0d4d\u0d1f\u0d3f\u0d15", + "pad.toolbar.indent.title": "\u0d35\u0d32\u0d24\u0d4d\u0d24\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d33\u0d4d\u0d33\u0d41\u0d15", + "pad.toolbar.unindent.title": "\u0d07\u0d1f\u0d24\u0d4d\u0d24\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d33\u0d4d\u0d33\u0d41\u0d15", + "pad.toolbar.undo.title": "\u0d24\u0d3f\u0d30\u0d38\u0d4d\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d02 \u0d15\u0d33\u0d2f\u0d41\u0d15", + "pad.toolbar.import_export.title": "\u0d35\u0d4d\u0d2f\u0d24\u0d4d\u0d2f\u0d38\u0d4d\u0d24 \u0d2b\u0d2f\u0d7d \u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d/\u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.toolbar.timeslider.title": "\u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", + "pad.toolbar.savedRevision.title": "\u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.toolbar.settings.title": "\u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", + "pad.toolbar.embed.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.toolbar.showusers.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d09\u0d2a\u0d2f\u0d4b\u0d15\u0d4d\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d2a\u0d4d\u0d30\u0d26\u0d7c\u0d36\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.colorpicker.save": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.colorpicker.cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.loading": "\u0d36\u0d47\u0d16\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", + "pad.passwordRequired": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d3f\u0d28\u0d3e\u0d2f\u0d3f \u0d12\u0d30\u0d41 \u0d30\u0d39\u0d38\u0d4d\u0d2f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d28\u0d7d\u0d15\u0d47\u0d23\u0d4d\u0d1f\u0d24\u0d3e\u0d23\u0d4d", + "pad.permissionDenied": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d15\u0d3e\u0d23\u0d41\u0d35\u0d3e\u0d7b \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d28\u0d41\u0d2e\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", + "pad.wrongPassword": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d28\u0d32\u0d4d\u0d15\u0d3f\u0d2f \u0d30\u0d39\u0d38\u0d4d\u0d2f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d46\u0d31\u0d4d\u0d31\u0d3e\u0d2f\u0d3f\u0d30\u0d41\u0d28\u0d4d\u0d28\u0d41", + "pad.settings.padSettings": "\u0d2a\u0d3e\u0d21\u0d4d \u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", + "pad.settings.myView": "\u0d0e\u0d28\u0d4d\u0d31\u0d46 \u0d15\u0d3e\u0d34\u0d4d\u0d1a", + "pad.settings.stickychat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d0e\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d41\u0d02 \u0d38\u0d4d\u0d15\u0d4d\u0d30\u0d40\u0d28\u0d3f\u0d7d \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.settings.colorcheck": "\u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d3e\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e", + "pad.settings.linenocheck": "\u0d35\u0d30\u0d3f\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d15\u0d4d\u0d30\u0d2e\u0d38\u0d02\u0d16\u0d4d\u0d2f", + "pad.settings.rtlcheck": "\u0d09\u0d33\u0d4d\u0d33\u0d1f\u0d15\u0d4d\u0d15\u0d02 \u0d35\u0d32\u0d24\u0d4d\u0d24\u0d41\u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d1f\u0d24\u0d4d\u0d24\u0d4b\u0d1f\u0d4d\u0d1f\u0d3e\u0d23\u0d4b \u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d47\u0d23\u0d4d\u0d1f\u0d24\u0d4d?", + "pad.settings.fontType": "\u0d2b\u0d4b\u0d23\u0d4d\u0d1f\u0d4d \u0d24\u0d30\u0d02:", + "pad.settings.fontType.normal": "\u0d38\u0d3e\u0d27\u0d3e\u0d30\u0d23\u0d02", + "pad.settings.fontType.monospaced": "\u0d2e\u0d4b\u0d23\u0d4b\u0d38\u0d4d\u0d2a\u0d47\u0d38\u0d4d", + "pad.settings.globalView": "\u0d2e\u0d4a\u0d24\u0d4d\u0d24\u0d15\u0d4d\u0d15\u0d3e\u0d34\u0d4d\u0d1a", + "pad.settings.language": "\u0d2d\u0d3e\u0d37:", + "pad.importExport.import_export": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.importExport.import": "\u0d0e\u0d28\u0d4d\u0d24\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d32\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d2e\u0d4b \u0d30\u0d47\u0d16\u0d2f\u0d4b \u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.importExport.importSuccessful": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d02!", + "pad.importExport.export": "\u0d07\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d24\u0d4d\u0d24\u0d46 \u0d2a\u0d3e\u0d21\u0d4d \u0d07\u0d19\u0d4d\u0d19\u0d28\u0d46 \u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15:", + "pad.importExport.exporthtml": "\u0d0e\u0d1a\u0d4d\u0d1a\u0d4d.\u0d31\u0d4d\u0d31\u0d3f.\u0d0e\u0d02.\u0d0e\u0d7d.", + "pad.importExport.exportplain": "\u0d35\u0d46\u0d31\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d4d", + "pad.importExport.exportword": "\u0d2e\u0d48\u0d15\u0d4d\u0d30\u0d4b\u0d38\u0d4b\u0d2b\u0d4d\u0d31\u0d4d\u0d31\u0d4d \u0d35\u0d47\u0d21\u0d4d", + "pad.importExport.exportpdf": "\u0d2a\u0d3f.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d.", + "pad.importExport.exportopen": "\u0d12.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d. (\u0d13\u0d2a\u0d4d\u0d2a\u0d7a \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d)", + "pad.importExport.exportdokuwiki": "\u0d21\u0d4b\u0d15\u0d41\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d3f", + "pad.importExport.abiword.innerHTML": "\u0d2a\u0d4d\u0d32\u0d46\u0d2f\u0d3f\u0d7b \u0d1f\u0d46\u0d15\u0d4d\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b \u0d0e\u0d1a\u0d4d\u0d1a\u0d4d.\u0d31\u0d4d\u0d31\u0d3f.\u0d0e\u0d02.\u0d0e\u0d7d. \u0d24\u0d30\u0d2e\u0d4b \u0d2e\u0d3e\u0d24\u0d4d\u0d30\u0d2e\u0d47 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d28\u0d3e\u0d35\u0d42. \u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d35\u0d3f\u0d2a\u0d41\u0d32\u0d40\u0d15\u0d43\u0d24 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d38\u0d57\u0d15\u0d30\u0d4d\u0d2f\u0d19\u0d4d\u0d19\u0d7e\u0d15\u0d4d\u0d15\u0d3e\u0d2f\u0d3f \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u0d05\u0d2c\u0d3f\u0d35\u0d47\u0d21\u0d4d \u0d07\u0d7b\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d7e \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15\u003C/a\u003E.", + "pad.modals.connected": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", + "pad.modals.reconnecting": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d4d \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", + "pad.modals.forcereconnect": "\u0d0e\u0d28\u0d4d\u0d24\u0d3e\u0d2f\u0d3e\u0d32\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.modals.userdup": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d1c\u0d3e\u0d32\u0d15\u0d24\u0d4d\u0d24\u0d3f\u0d7d \u0d24\u0d41\u0d31\u0d28\u0d4d\u0d28\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", + "pad.modals.userdup.explanation": "\u0d08 \u0d15\u0d2e\u0d4d\u0d2a\u0d4d\u0d2f\u0d42\u0d1f\u0d4d\u0d1f\u0d31\u0d3f\u0d7d \u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d12\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d27\u0d3f\u0d15\u0d02 \u0d2c\u0d4d\u0d30\u0d57\u0d38\u0d7c \u0d1c\u0d3e\u0d32\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d24\u0d41\u0d31\u0d28\u0d4d\u0d28\u0d24\u0d3e\u0d2f\u0d3f \u0d15\u0d3e\u0d23\u0d41\u0d28\u0d4d\u0d28\u0d41.", + "pad.modals.userdup.advice": "\u0d08 \u0d1c\u0d3e\u0d32\u0d15\u0d02 \u0d24\u0d28\u0d4d\u0d28\u0d46 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d28\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.modals.unauth": "\u0d05\u0d28\u0d41\u0d35\u0d3e\u0d26\u0d2e\u0d3f\u0d32\u0d4d\u0d32", + "pad.modals.unauth.explanation": "\u0d08 \u0d24\u0d3e\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d41\u0d15\u0d4a\u0d23\u0d4d\u0d1f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d46 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d05\u0d28\u0d41\u0d2e\u0d24\u0d3f\u0d15\u0d33\u0d3f\u0d7d \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d3e\u0d2f\u0d3f. \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15.", + "pad.modals.looping": "\u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41.", + "pad.modals.looping.explanation": "\u0d38\u0d3f\u0d02\u0d15\u0d4d\u0d30\u0d23\u0d48\u0d38\u0d47\u0d37\u0d7b \u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d41\u0d33\u0d4d\u0d33 \u0d06\u0d36\u0d2f\u0d35\u0d3f\u0d28\u0d3f\u0d2e\u0d2f\u0d24\u0d4d\u0d24\u0d3f\u0d7d \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d23\u0d4d\u0d1f\u0d4d.", + "pad.modals.looping.cause": "\u0d12\u0d30\u0d41\u0d2a\u0d15\u0d4d\u0d37\u0d47 \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d24\u0d4d\u0d24 \u0d2b\u0d2f\u0d7c\u0d35\u0d3e\u0d33\u0d3f\u0d32\u0d42\u0d1f\u0d46\u0d2f\u0d4b \u0d2a\u0d4d\u0d30\u0d4b\u0d15\u0d4d\u0d38\u0d3f\u0d2f\u0d3f\u0d32\u0d42\u0d1f\u0d46\u0d2f\u0d4b \u0d06\u0d15\u0d3e\u0d02 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d.", + "pad.modals.initsocketfail": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d3f\u0d32\u0d46\u0d24\u0d4d\u0d24\u0d3e\u0d7b \u0d2a\u0d31\u0d4d\u0d31\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32.", + "pad.modals.initsocketfail.explanation": "\u0d38\u0d3f\u0d02\u0d15\u0d4d\u0d30\u0d23\u0d48\u0d38\u0d47\u0d37\u0d7b \u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32.", + "pad.modals.initsocketfail.cause": "\u0d07\u0d28\u0d4d\u0d31\u0d7c\u0d28\u0d46\u0d31\u0d4d\u0d31\u0d4d \u0d15\u0d23\u0d15\u0d4d\u0d37\u0d28\u0d4d\u0d31\u0d46\u0d2f\u0d4b \u0d2c\u0d4d\u0d30\u0d57\u0d38\u0d31\u0d3f\u0d28\u0d4d\u0d31\u0d46\u0d2f\u0d4b \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d2e\u0d3e\u0d15\u0d3e\u0d02", + "pad.modals.slowcommit": "\u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41.", + "pad.modals.slowcommit.explanation": "\u0d38\u0d46\u0d7c\u0d35\u0d7c \u0d2a\u0d4d\u0d30\u0d24\u0d3f\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32.", + "pad.modals.slowcommit.cause": "\u0d28\u0d46\u0d31\u0d4d\u0d31\u0d4d\u200c\u0d35\u0d7c\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d02 \u0d15\u0d3e\u0d30\u0d23\u0d2e\u0d3e\u0d15\u0d3e\u0d02.", + "pad.modals.deleted": "\u0d2e\u0d3e\u0d2f\u0d4d\u0d1a\u0d4d\u0d1a\u0d41", + "pad.modals.deleted.explanation": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41.", + "pad.modals.disconnected": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", + "pad.modals.disconnected.explanation": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d41\u0d33\u0d4d\u0d33 \u0d2c\u0d28\u0d4d\u0d27\u0d02 \u0d28\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", + "pad.modals.disconnected.cause": "\u0d38\u0d46\u0d7c\u0d35\u0d7c \u0d32\u0d2d\u0d4d\u0d2f\u0d2e\u0d32\u0d4d\u0d32\u0d3e\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d02. \u0d07\u0d24\u0d4d \u0d24\u0d41\u0d1f\u0d7c\u0d1a\u0d4d\u0d1a\u0d2f\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41\u0d23\u0d4d\u0d1f\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d1e\u0d19\u0d4d\u0d19\u0d33\u0d46 \u0d05\u0d31\u0d3f\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15.", + "pad.share": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15", + "pad.share.readonly": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2e\u0d3e\u0d24\u0d4d\u0d30\u0d02", + "pad.share.link": "\u0d15\u0d23\u0d4d\u0d23\u0d3f", + "pad.share.emebdcode": "\u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d2f\u0d41.\u0d06\u0d7c.\u0d0e\u0d7d.", + "pad.chat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02", + "pad.chat.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15.", + "pad.chat.loadmessages": "\u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d7e \u0d0e\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15", + "timeslider.pageTitle": "{{appTitle}} \u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", + "timeslider.toolbar.returnbutton": "\u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d3f\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d41\u0d2a\u0d4b\u0d35\u0d41\u0d15", + "timeslider.toolbar.authors": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e:", + "timeslider.toolbar.authorsList": "\u0d06\u0d30\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d3f\u0d2f\u0d3f\u0d1f\u0d4d\u0d1f\u0d3f\u0d32\u0d4d\u0d32", + "timeslider.toolbar.exportlink.title": "\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f", + "timeslider.exportCurrent": "\u0d08 \u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d07\u0d19\u0d4d\u0d19\u0d28\u0d46 \u0d0e\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15:", + "timeslider.version": "\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d {{version}}", + "timeslider.saved": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d24\u0d4d {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f", + "timeslider.month.february": "\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f", + "timeslider.month.march": "\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d", + "timeslider.month.april": "\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d", + "timeslider.month.may": "\u0d2e\u0d47\u0d2f\u0d4d", + "timeslider.month.june": "\u0d1c\u0d42\u0d7a", + "timeslider.month.july": "\u0d1c\u0d42\u0d32\u0d48", + "timeslider.month.august": "\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d", + "timeslider.month.september": "\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c", + "timeslider.month.october": "\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c", + "timeslider.month.november": "\u0d28\u0d35\u0d02\u0d2c\u0d7c", + "timeslider.month.december": "\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c", + "timeslider.unnamedauthor": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d35\u0d4d", + "timeslider.unnamedauthors": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e", + "pad.savedrevs.marked": "\u0d08 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d3e\u0d2f\u0d3f \u0d05\u0d1f\u0d2f\u0d3e\u0d33\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", + "pad.userlist.entername": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", + "pad.userlist.unnamed": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24", + "pad.userlist.guest": "\u0d05\u0d24\u0d3f\u0d25\u0d3f", + "pad.userlist.deny": "\u0d28\u0d3f\u0d30\u0d38\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.userlist.approve": "\u0d05\u0d02\u0d17\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.editbar.clearcolors": "\u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d3f\u0d7d \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d38\u0d42\u0d1a\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d28\u0d3e\u0d2f\u0d3f \u0d28\u0d7d\u0d15\u0d3f\u0d2f\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e \u0d12\u0d34\u0d3f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d1f\u0d4d\u0d1f\u0d46?", + "pad.impexp.importbutton": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.impexp.importing": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...", + "pad.impexp.confirmimport": "\u0d12\u0d30\u0d41 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d02 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d7e \u0d28\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d28\u0d3f\u0d1f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d02, \u0d24\u0d41\u0d1f\u0d30\u0d23\u0d2e\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d09\u0d31\u0d2a\u0d4d\u0d2a\u0d3e\u0d23\u0d4b?", + "pad.impexp.convertFailed": "\u0d08 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d02 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d38\u0d3e\u0d27\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d32\u0d4d\u0d32. \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15\u0d2f\u0d4b, \u0d38\u0d4d\u0d35\u0d28\u0d4d\u0d24\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15\u0d2f\u0d4b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.impexp.uploadFailed": "\u0d05\u0d2a\u0d4d\u200c\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.impexp.importfailed": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", + "pad.impexp.copypaste": "\u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15", + "pad.impexp.exportdisabled": "{{type}} \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d3f\u0d7d \u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d24\u0d1f\u0d1e\u0d4d\u0d1e\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41. \u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d02 \u0d05\u0d21\u0d4d\u0d2e\u0d3f\u0d28\u0d3f\u0d38\u0d4d\u0d1f\u0d4d\u0d30\u0d47\u0d31\u0d4d\u0d31\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d15." } \ No newline at end of file diff --git a/src/locales/ms.json b/src/locales/ms.json index 732a7759..2c6f72a5 100644 --- a/src/locales/ms.json +++ b/src/locales/ms.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": [ - "Anakmalaysia" - ] - }, - "index.newPad": "Pad baru", - "index.createOpenPad": "atau cipta\/buka Pad yang bernama:", - "pad.toolbar.bold.title": "Tebal (Ctrl-B)", - "pad.toolbar.italic.title": "Miring (Ctrl-I)", - "pad.toolbar.underline.title": "Garis bawah (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Garis lorek", - "pad.toolbar.ol.title": "Senarai tertib", - "pad.toolbar.ul.title": "Senarai tak tertib", - "pad.toolbar.indent.title": "Engsot ke dalam", - "pad.toolbar.unindent.title": "Engsot ke luar", - "pad.toolbar.undo.title": "Buat asal (Ctrl-Z)", - "pad.toolbar.redo.title": "Buat semula (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Padamkan Warna Pengarang", - "pad.toolbar.import_export.title": "Import\/Eksport dari\/ke format-format fail berbeza", - "pad.toolbar.timeslider.title": "Gelangsar masa", - "pad.toolbar.savedRevision.title": "Simpan Semakan", - "pad.toolbar.settings.title": "Tetapan", - "pad.toolbar.embed.title": "Benamkan pad ini", - "pad.toolbar.showusers.title": "Tunjukkan pengguna pada pad ini", - "pad.colorpicker.save": "Simpan", - "pad.colorpicker.cancel": "Batalkan", - "pad.loading": "Sedang dimuatkan...", - "pad.passwordRequired": "Anda memerlukan kata laluan untuk mengakses pad ini", - "pad.permissionDenied": "Anda tiada kebenaran untuk mengakses pad ini", - "pad.wrongPassword": "Kata laluan anda salah", - "pad.settings.padSettings": "Tetapan Pad", - "pad.settings.myView": "Paparan Saya", - "pad.settings.stickychat": "Sentiasa bersembang pada skrin", - "pad.settings.colorcheck": "Warna pengarang", - "pad.settings.linenocheck": "Nombor baris", - "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", - "pad.settings.fontType": "Jenis fon:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Paparan Sejagat", - "pad.settings.language": "Bahasa:", - "pad.importExport.import_export": "Import\/Eksport", - "pad.importExport.import": "Muat naik sebarang fail teks atau dokumen", - "pad.importExport.importSuccessful": "Berjaya!", - "pad.importExport.export": "Eksport pad semasa sebagai:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Teks biasa", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Anda hanya boleh mengimport dari format teks biasa atau html. Untuk ciri-ciri import yang lebih maju, sila memasang abiword<\/a>.", - "pad.modals.connected": "Bersambung.", - "pad.modals.reconnecting": "Bersambung semula dengan pad anda...", - "pad.modals.forcereconnect": "Sambung semula secara paksa", - "pad.modals.userdup": "Dibuka di tetingkap lain", - "pad.modals.userdup.explanation": "Pad ini nampaknya telah dibuka di lebih daripada satu tetingkap pelayar pada komputer ini.", - "pad.modals.userdup.advice": "Sambung semula untuk menggunakan tetingkap ini pula.", - "pad.modals.unauth": "Tidak dibenarkan", - "pad.modals.unauth.explanation": "Kebenaran anda telah berubah sewaktu memaparkan halaman ini. Cuba bersambung semula.", - "pad.modals.looping": "Terputus.", - "pad.modals.looping.explanation": "Terdapat masalah komunikasi dengan pelayan penyegerakan.", - "pad.modals.looping.cause": "Mungkin anda telah bersambung melalui tembok api atau proksi yang tidak serasi.", - "pad.modals.initsocketfail": "Pelayan tidak boleh dicapai.", - "pad.modals.initsocketfail.explanation": "Tidak dapat bersambung dengan pelayar penyegerakan.", - "pad.modals.initsocketfail.cause": "Ini mungkin disebabkan oleh masalah dengan pelayar atau sambungan internet anda.", - "pad.modals.slowcommit": "Terputus.", - "pad.modals.slowcommit.explanation": "Pelayan tidak membalas.", - "pad.modals.slowcommit.cause": "Ini mungkin disebabkan oleh masalah dengan kesambungan rangkaian anda.", - "pad.modals.deleted": "Dihapuskan.", - "pad.modals.deleted.explanation": "Pad ini telah dibuang.", - "pad.modals.disconnected": "Sambungan anda telah diputuskan.", - "pad.modals.disconnected.explanation": "Sambungan ke pelayan terputus", - "pad.modals.disconnected.cause": "Pelayan mungkin tidak dapat dicapai. Sila beritahu kami jika masalah ini berterusan.", - "pad.share": "Kongsikan pad ini", - "pad.share.readonly": "Baca sahaja", - "pad.share.link": "Pautan", - "pad.share.emebdcode": "Benamkan URL", - "pad.chat": "Sembang", - "pad.chat.title": "Buka ruang sembang untuk pad ini.", - "pad.chat.loadmessages": "Muatkan banyak lagi pesanan", - "timeslider.pageTitle": "Gelangsar Masa {{appTitle}}", - "timeslider.toolbar.returnbutton": "Kembali ke pad", - "timeslider.toolbar.authors": "Pengarang:", - "timeslider.toolbar.authorsList": "Tiada Pengarang", - "timeslider.toolbar.exportlink.title": "Eksport", - "timeslider.exportCurrent": "Eksport versi semasa sebagai:", - "timeslider.version": "Versi {{version}}", - "timeslider.saved": "Disimpan pada {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Januari", - "timeslider.month.february": "Februari", - "timeslider.month.march": "Mac", - "timeslider.month.april": "April", - "timeslider.month.may": "Mei", - "timeslider.month.june": "Jun", - "timeslider.month.july": "Julai", - "timeslider.month.august": "Ogos", - "timeslider.month.september": "September", - "timeslider.month.october": "Oktober", - "timeslider.month.november": "November", - "timeslider.month.december": "Disember", - "timeslider.unnamedauthor": "{{num}} orang pengarang awanama", - "timeslider.unnamedauthors": "{{num}} orang pengarang awanama", - "pad.savedrevs.marked": "Semakan ini telah ditandai sebagai semakan tersimpan", - "pad.userlist.entername": "Taipkan nama anda", - "pad.userlist.unnamed": "tanpa nama", - "pad.userlist.guest": "Tetamu", - "pad.userlist.deny": "Tolak", - "pad.userlist.approve": "Terima", - "pad.editbar.clearcolors": "Padamkan warna pengarang pada seluruh dokumen?", - "pad.impexp.importbutton": "Import Sekarang", - "pad.impexp.importing": "Sedang mengimport...", - "pad.impexp.confirmimport": "Mengimport fail akan menulis ganti teks semasa pada pad ini. Adakah anda benar-benar ingin teruskan?", - "pad.impexp.convertFailed": "Fail tidak dapat diimport. Sila gunakan format dokumen yang lain atau salin tampal secara manual", - "pad.impexp.uploadFailed": "Muat naik gagal, sila cuba lagi", - "pad.impexp.importfailed": "Import gagal", - "pad.impexp.copypaste": "Sila salin tampal", - "pad.impexp.exportdisabled": "Mengeksport dalam format {{type}} dilarang. Sila hubungi pentadbir sistem anda untuk keterangan lanjut." + "@metadata": { + "authors": [ + "Anakmalaysia" + ] + }, + "index.newPad": "Pad baru", + "index.createOpenPad": "atau cipta/buka Pad yang bernama:", + "pad.toolbar.bold.title": "Tebal (Ctrl-B)", + "pad.toolbar.italic.title": "Miring (Ctrl-I)", + "pad.toolbar.underline.title": "Garis bawah (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Garis lorek", + "pad.toolbar.ol.title": "Senarai tertib", + "pad.toolbar.ul.title": "Senarai tak tertib", + "pad.toolbar.indent.title": "Engsot ke dalam", + "pad.toolbar.unindent.title": "Engsot ke luar", + "pad.toolbar.undo.title": "Buat asal (Ctrl-Z)", + "pad.toolbar.redo.title": "Buat semula (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Padamkan Warna Pengarang", + "pad.toolbar.import_export.title": "Import/Eksport dari/ke format-format fail berbeza", + "pad.toolbar.timeslider.title": "Gelangsar masa", + "pad.toolbar.savedRevision.title": "Simpan Semakan", + "pad.toolbar.settings.title": "Tetapan", + "pad.toolbar.embed.title": "Benamkan pad ini", + "pad.toolbar.showusers.title": "Tunjukkan pengguna pada pad ini", + "pad.colorpicker.save": "Simpan", + "pad.colorpicker.cancel": "Batalkan", + "pad.loading": "Sedang dimuatkan...", + "pad.passwordRequired": "Anda memerlukan kata laluan untuk mengakses pad ini", + "pad.permissionDenied": "Anda tiada kebenaran untuk mengakses pad ini", + "pad.wrongPassword": "Kata laluan anda salah", + "pad.settings.padSettings": "Tetapan Pad", + "pad.settings.myView": "Paparan Saya", + "pad.settings.stickychat": "Sentiasa bersembang pada skrin", + "pad.settings.colorcheck": "Warna pengarang", + "pad.settings.linenocheck": "Nombor baris", + "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", + "pad.settings.fontType": "Jenis fon:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Paparan Sejagat", + "pad.settings.language": "Bahasa:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Muat naik sebarang fail teks atau dokumen", + "pad.importExport.importSuccessful": "Berjaya!", + "pad.importExport.export": "Eksport pad semasa sebagai:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Teks biasa", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Anda hanya boleh mengimport dari format teks biasa atau html. Untuk ciri-ciri import yang lebih maju, sila \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Ememasang abiword\u003C/a\u003E.", + "pad.modals.connected": "Bersambung.", + "pad.modals.reconnecting": "Bersambung semula dengan pad anda...", + "pad.modals.forcereconnect": "Sambung semula secara paksa", + "pad.modals.userdup": "Dibuka di tetingkap lain", + "pad.modals.userdup.explanation": "Pad ini nampaknya telah dibuka di lebih daripada satu tetingkap pelayar pada komputer ini.", + "pad.modals.userdup.advice": "Sambung semula untuk menggunakan tetingkap ini pula.", + "pad.modals.unauth": "Tidak dibenarkan", + "pad.modals.unauth.explanation": "Kebenaran anda telah berubah sewaktu memaparkan halaman ini. Cuba bersambung semula.", + "pad.modals.looping": "Terputus.", + "pad.modals.looping.explanation": "Terdapat masalah komunikasi dengan pelayan penyegerakan.", + "pad.modals.looping.cause": "Mungkin anda telah bersambung melalui tembok api atau proksi yang tidak serasi.", + "pad.modals.initsocketfail": "Pelayan tidak boleh dicapai.", + "pad.modals.initsocketfail.explanation": "Tidak dapat bersambung dengan pelayar penyegerakan.", + "pad.modals.initsocketfail.cause": "Ini mungkin disebabkan oleh masalah dengan pelayar atau sambungan internet anda.", + "pad.modals.slowcommit": "Terputus.", + "pad.modals.slowcommit.explanation": "Pelayan tidak membalas.", + "pad.modals.slowcommit.cause": "Ini mungkin disebabkan oleh masalah dengan kesambungan rangkaian anda.", + "pad.modals.deleted": "Dihapuskan.", + "pad.modals.deleted.explanation": "Pad ini telah dibuang.", + "pad.modals.disconnected": "Sambungan anda telah diputuskan.", + "pad.modals.disconnected.explanation": "Sambungan ke pelayan terputus", + "pad.modals.disconnected.cause": "Pelayan mungkin tidak dapat dicapai. Sila beritahu kami jika masalah ini berterusan.", + "pad.share": "Kongsikan pad ini", + "pad.share.readonly": "Baca sahaja", + "pad.share.link": "Pautan", + "pad.share.emebdcode": "Benamkan URL", + "pad.chat": "Sembang", + "pad.chat.title": "Buka ruang sembang untuk pad ini.", + "pad.chat.loadmessages": "Muatkan banyak lagi pesanan", + "timeslider.pageTitle": "Gelangsar Masa {{appTitle}}", + "timeslider.toolbar.returnbutton": "Kembali ke pad", + "timeslider.toolbar.authors": "Pengarang:", + "timeslider.toolbar.authorsList": "Tiada Pengarang", + "timeslider.toolbar.exportlink.title": "Eksport", + "timeslider.exportCurrent": "Eksport versi semasa sebagai:", + "timeslider.version": "Versi {{version}}", + "timeslider.saved": "Disimpan pada {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januari", + "timeslider.month.february": "Februari", + "timeslider.month.march": "Mac", + "timeslider.month.april": "April", + "timeslider.month.may": "Mei", + "timeslider.month.june": "Jun", + "timeslider.month.july": "Julai", + "timeslider.month.august": "Ogos", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Disember", + "timeslider.unnamedauthor": "{{num}} orang pengarang awanama", + "timeslider.unnamedauthors": "{{num}} orang pengarang awanama", + "pad.savedrevs.marked": "Semakan ini telah ditandai sebagai semakan tersimpan", + "pad.userlist.entername": "Taipkan nama anda", + "pad.userlist.unnamed": "tanpa nama", + "pad.userlist.guest": "Tetamu", + "pad.userlist.deny": "Tolak", + "pad.userlist.approve": "Terima", + "pad.editbar.clearcolors": "Padamkan warna pengarang pada seluruh dokumen?", + "pad.impexp.importbutton": "Import Sekarang", + "pad.impexp.importing": "Sedang mengimport...", + "pad.impexp.confirmimport": "Mengimport fail akan menulis ganti teks semasa pada pad ini. Adakah anda benar-benar ingin teruskan?", + "pad.impexp.convertFailed": "Fail tidak dapat diimport. Sila gunakan format dokumen yang lain atau salin tampal secara manual", + "pad.impexp.uploadFailed": "Muat naik gagal, sila cuba lagi", + "pad.impexp.importfailed": "Import gagal", + "pad.impexp.copypaste": "Sila salin tampal", + "pad.impexp.exportdisabled": "Mengeksport dalam format {{type}} dilarang. Sila hubungi pentadbir sistem anda untuk keterangan lanjut." } \ No newline at end of file diff --git a/src/locales/nb.json b/src/locales/nb.json new file mode 100644 index 00000000..bc35c3e7 --- /dev/null +++ b/src/locales/nb.json @@ -0,0 +1,121 @@ +{ + "index.newPad": "Ny Pad", + "index.createOpenPad": "eller opprette/\u00e5pne 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)", + "pad.toolbar.strikethrough.title": "Gjennomstreking", + "pad.toolbar.ol.title": "Nummerert liste", + "pad.toolbar.ul.title": "Punktliste", + "pad.toolbar.indent.title": "Innrykk", + "pad.toolbar.unindent.title": "Rykk ut", + "pad.toolbar.undo.title": "Angre (Ctrl-Z)", + "pad.toolbar.redo.title": "Gj\u00f8r omigjen (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Fjern forfatterfarger", + "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.colorpicker.save": "Lagre", + "pad.colorpicker.cancel": "Avbryt", + "pad.loading": "Laster inn...", + "pad.passwordRequired": "Du trenger et passord for \u00e5 f\u00e5 tilgang til denne padden", + "pad.permissionDenied": "Du har ikke tilgang til denne padden", + "pad.wrongPassword": "Feil passord", + "pad.settings.padSettings": "Padinnstillinger", + "pad.settings.myView": "Min visning", + "pad.settings.stickychat": "Chat alltid synlig", + "pad.settings.colorcheck": "Forfatterfarger", + "pad.settings.linenocheck": "Linjenummer", + "pad.settings.rtlcheck": "Les innhold fra h\u00f8yre til venstre?", + "pad.settings.fontType": "Skrifttype:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Fast bredde", + "pad.settings.globalView": "Global visning", + "pad.settings.language": "Spr\u00e5k:", + "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.exporthtml": "HTML", + "pad.importExport.exportplain": "Ren tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Du kan bare importere fra ren tekst eller HTML-formater. For mer avanserte importfunksjoner, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstaller abiword\u003C/a\u003E.", + "pad.modals.connected": "Tilkoblet.", + "pad.modals.reconnecting": "Kobler til din pad p\u00e5 nytt...", + "pad.modals.forcereconnect": "Tving gjenoppkobling", + "pad.modals.userdup": "\u00c5pnet i nytt vindu", + "pad.modals.userdup.explanation": "Denne padden ser ut til \u00e5 v\u00e6re \u00e5pnet i mer enn et nettleservindu p\u00e5 denne maskinen.", + "pad.modals.userdup.advice": "Koble til igjen for \u00e5 bruke dette vinduet i stedenfor.", + "pad.modals.unauth": "Ikke tillatt", + "pad.modals.unauth.explanation": "Dine rettigheter har blitt endret mens du s\u00e5 p\u00e5 denne siden. Pr\u00f8v \u00e5 koble til p\u00e5 nytt", + "pad.modals.looping": "Frakoblet", + "pad.modals.looping.explanation": "Det er kommunikasjonsproblemer med synkroniseringsserveren.", + "pad.modals.looping.cause": "Kanskje du koblet til en inkompatibel brannmur eller mellomtjener", + "pad.modals.initsocketfail": "Serveren er utilgjengelig", + "pad.modals.initsocketfail.explanation": "Kunne ikke koble til synkroniseringsserveren.", + "pad.modals.initsocketfail.cause": "Dette er sannsynligvis p\u00e5 grunn av et problem med nettleseren eller din internettoppkobling", + "pad.modals.slowcommit": "Frakoblet.", + "pad.modals.slowcommit.explanation": "Serveren svarer ikke.", + "pad.modals.slowcommit.cause": "Dette kan v\u00e6re et problem med nettverkstilkoblingen", + "pad.modals.deleted": "Slettet.", + "pad.modals.deleted.explanation": "Denne padden 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\u00e6re utilgjengelig. Vennligst si i fra til oss hvis dette fortsetter \u00e5 skje", + "pad.share": "Del denne padden", + "pad.share.readonly": "Skrivebeskyttet", + "pad.share.link": "Lenke", + "pad.share.emebdcode": "URL for innbygging", + "pad.chat": "Chat", + "pad.chat.title": "\u00c5pne chatten for denne padden.", + "pad.chat.loadmessages": "Last flere beskjeder", + "timeslider.pageTitle": "{{appTitle}} Tidslinje", + "timeslider.toolbar.returnbutton": "G\u00e5 tilbake til pad", + "timeslider.toolbar.authors": "Forfattere:", + "timeslider.toolbar.authorsList": "Ingen forfattere", + "timeslider.toolbar.exportlink.title": "Eksporter", + "timeslider.exportCurrent": "Eksporter n\u00e5v\u00e6rende versjon som:", + "timeslider.version": "Versjon {{version}}", + "timeslider.saved": "Lagret {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januar", + "timeslider.month.february": "februar", + "timeslider.month.march": "mars", + "timeslider.month.april": "april", + "timeslider.month.may": "mai", + "timeslider.month.june": "juni", + "timeslider.month.july": "juli", + "timeslider.month.august": "august", + "timeslider.month.september": "september", + "timeslider.month.october": "oktober", + "timeslider.month.november": "november", + "timeslider.month.december": "desember", + "timeslider.unnamedauthor": "{{num}} navnl\u00f8se forfattere", + "timeslider.unnamedauthors": "{{num}} navnl\u00f8se forfattere", + "pad.savedrevs.marked": "Denne revisjonen er n\u00e5 markert som en lagret revisjon", + "pad.userlist.entername": "Skriv inn ditt navn", + "pad.userlist.unnamed": "navnl\u00f8s", + "pad.userlist.guest": "Gjest", + "pad.userlist.deny": "Nekt", + "pad.userlist.approve": "Godkjenn", + "pad.editbar.clearcolors": "Fjern forfatterfarger p\u00e5 hele dokumentet?", + "pad.impexp.importbutton": "Importer n\u00e5", + "pad.impexp.importing": "Importerer...", + "pad.impexp.confirmimport": "Importering av en fil vil overskrive den n\u00e5v\u00e6rende teksten p\u00e5 padden. Er du sikker p\u00e5 at du vil fortsette?", + "pad.impexp.convertFailed": "Vi greide ikke \u00e5 importere denne filen. Bruk et annet dokumentformat eller kopier og lim inn teksten manuelt", + "pad.impexp.uploadFailed": "Opplastning feilet. Pr\u00f8v igjen", + "pad.impexp.importfailed": "Import feilet", + "pad.impexp.copypaste": "Vennligst kopier og lim inn", + "pad.impexp.exportdisabled": "Eksporterer som {{type}} er deaktivert. Vennligst kontakt din systemadministrator for detaljer.", + "@metadata": { + "authors": [ + "Laaknor" + ] + } +} \ No newline at end of file diff --git a/src/locales/nl.json b/src/locales/nl.json index 3f4a0cab..75f37f99 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": [ - "Siebrand" - ] - }, - "index.newPad": "Nieuw pad", - "index.createOpenPad": "Maak of open pad met de naam:", - "pad.toolbar.bold.title": "Vet (Ctrl-B)", - "pad.toolbar.italic.title": "Cursief (Ctrl-I)", - "pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Doorhalen", - "pad.toolbar.ol.title": "Geordende lijst", - "pad.toolbar.ul.title": "Ongeordende lijst", - "pad.toolbar.indent.title": "Inspringen", - "pad.toolbar.unindent.title": "Inspringing verkleinen", - "pad.toolbar.undo.title": "Ongedaan maken (Ctrl-Z)", - "pad.toolbar.redo.title": "Opnieuw uitvoeren (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Kleuren auteurs wissen", - "pad.toolbar.import_export.title": "Naar\/van andere opmaak exporteren\/importeren", - "pad.toolbar.timeslider.title": "Tijdlijn", - "pad.toolbar.savedRevision.title": "Versie opslaan", - "pad.toolbar.settings.title": "Instellingen", - "pad.toolbar.embed.title": "Pad insluiten", - "pad.toolbar.showusers.title": "Gebruikers van dit pad weergeven", - "pad.colorpicker.save": "Opslaan", - "pad.colorpicker.cancel": "Annuleren", - "pad.loading": "Bezig met laden\u2026", - "pad.passwordRequired": "U hebt een wachtwoord nodig om toegang te krijgen tot deze pad", - "pad.permissionDenied": "U hebt geen rechten om deze pad te bekijken", - "pad.wrongPassword": "U hebt een onjuist wachtwoord ingevoerd", - "pad.settings.padSettings": "Padinstellingen", - "pad.settings.myView": "Mijn overzicht", - "pad.settings.stickychat": "Chat altijd zichtbaar", - "pad.settings.colorcheck": "Kleuren auteurs", - "pad.settings.linenocheck": "Regelnummers", - "pad.settings.rtlcheck": "Inhoud van rechts naar links lezen?", - "pad.settings.fontType": "Lettertype:", - "pad.settings.fontType.normal": "Normaal", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Globaal overzicht", - "pad.settings.language": "Taal:", - "pad.importExport.import_export": "Importeren\/exporteren", - "pad.importExport.import": "Upload een tekstbestand of document", - "pad.importExport.importSuccessful": "Afgerond", - "pad.importExport.export": "Huidige pad exporteren als", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Tekst zonder opmaak", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit platte tekst of een HTML-opmaak. Installeer abiword<\/a> om meer geavanceerde importmogelijkheden te krijgen.", - "pad.modals.connected": "Verbonden.", - "pad.modals.reconnecting": "Opnieuw verbinding maken met uw pad...", - "pad.modals.forcereconnect": "Opnieuw verbinden", - "pad.modals.userdup": "In een ander venster geopend", - "pad.modals.userdup.explanation": "Dit pad is meer dan \u00e9\u00e9n keer geopend in een browservenster op deze computer.", - "pad.modals.userdup.advice": "Maak opnieuw verbinding als u dit venster wilt gebruiken.", - "pad.modals.unauth": "Niet toegestaan", - "pad.modals.unauth.explanation": "Uw rechten zijn gewijzigd terwijl u de pagina aan het bekijken was. Probeer opnieuw te verbinden.", - "pad.modals.looping": "Verbinding verbroken.", - "pad.modals.looping.explanation": "Er is een probleem opgetreden tijdens de communicatie met de synchronisatieserver.", - "pad.modals.looping.cause": "Mogelijk gebruikt de server een niet compatibele firewall of proxy server.", - "pad.modals.initsocketfail": "Server is niet bereikbaar.", - "pad.modals.initsocketfail.explanation": "Het was niet mogelijk te verbinden met de synchronisatieserver.", - "pad.modals.initsocketfail.cause": "Mogelijk komt dit door uw browser of internetverbinding.", - "pad.modals.slowcommit": "Verbinding verbroken.", - "pad.modals.slowcommit.explanation": "De server reageert niet.", - "pad.modals.slowcommit.cause": "Dit komt mogelijk door netwerkproblemen.", - "pad.modals.deleted": "Verwijderd.", - "pad.modals.deleted.explanation": "Dit pad is verwijderd.", - "pad.modals.disconnected": "Uw verbinding is verbroken.", - "pad.modals.disconnected.explanation": "De verbinding met de server is verbroken", - "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel alstublieft de beheerder op de hoogte.", - "pad.share": "Pad delen", - "pad.share.readonly": "Alleen-lezen", - "pad.share.link": "Koppeling", - "pad.share.emebdcode": "URL insluiten", - "pad.chat": "Chatten", - "pad.chat.title": "Chat voor dit pad opnenen", - "pad.chat.loadmessages": "Meer berichten laden", - "timeslider.pageTitle": "Tijdlijn voor {{appTitle}}", - "timeslider.toolbar.returnbutton": "Terug naar pad", - "timeslider.toolbar.authors": "Auteurs:", - "timeslider.toolbar.authorsList": "Geen auteurs", - "timeslider.toolbar.exportlink.title": "Exporteren", - "timeslider.exportCurrent": "Huidige versie exporteren als:", - "timeslider.version": "Versie {{version}}", - "timeslider.saved": "Opgeslagen op {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "januari", - "timeslider.month.february": "februari", - "timeslider.month.march": "maart", - "timeslider.month.april": "april", - "timeslider.month.may": "mei", - "timeslider.month.june": "juni", - "timeslider.month.july": "juli", - "timeslider.month.august": "augustus", - "timeslider.month.september": "september", - "timeslider.month.october": "oktober", - "timeslider.month.november": "november", - "timeslider.month.december": "december", - "timeslider.unnamedauthor": "{{num}} onbekende auteur", - "timeslider.unnamedauthors": "{{num}} onbekende auteurs", - "pad.savedrevs.marked": "Deze versie is nu gemarkeerd als opgeslagen versie", - "pad.userlist.entername": "Geef uw naam op", - "pad.userlist.unnamed": "zonder naam", - "pad.userlist.guest": "Gast", - "pad.userlist.deny": "Weigeren", - "pad.userlist.approve": "Goedkeuren", - "pad.editbar.clearcolors": "Auteurskleuren voor het hele document wissen?", - "pad.impexp.importbutton": "Nu importeren", - "pad.impexp.importing": "Bezig met importeren\u2026", - "pad.impexp.confirmimport": "Door een bestand te importeren overschrijft u de huidige tekst van de pad. Wilt u echt doorgaan?", - "pad.impexp.convertFailed": "Het was niet mogelijk dit bestand te importeren. Gebruik een andere documentopmaak of kopieer en plak de inhoud handmatig", - "pad.impexp.uploadFailed": "Het uploaden is mislukt. Probeer het opnieuw", - "pad.impexp.importfailed": "Importeren is mislukt", - "pad.impexp.copypaste": "Gebruik kopi\u00ebren en plakken", - "pad.impexp.exportdisabled": "Exporteren als {{type}} is uitgeschakeld. Neem contact op met de systeembeheerder voor details." + "@metadata": { + "authors": [ + "Siebrand" + ] + }, + "index.newPad": "Nieuw pad", + "index.createOpenPad": "Maak of open pad met de naam:", + "pad.toolbar.bold.title": "Vet (Ctrl-B)", + "pad.toolbar.italic.title": "Cursief (Ctrl-I)", + "pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Doorhalen", + "pad.toolbar.ol.title": "Geordende lijst", + "pad.toolbar.ul.title": "Ongeordende lijst", + "pad.toolbar.indent.title": "Inspringen", + "pad.toolbar.unindent.title": "Inspringing verkleinen", + "pad.toolbar.undo.title": "Ongedaan maken (Ctrl-Z)", + "pad.toolbar.redo.title": "Opnieuw uitvoeren (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Kleuren auteurs wissen", + "pad.toolbar.import_export.title": "Naar/van andere opmaak exporteren/importeren", + "pad.toolbar.timeslider.title": "Tijdlijn", + "pad.toolbar.savedRevision.title": "Versie opslaan", + "pad.toolbar.settings.title": "Instellingen", + "pad.toolbar.embed.title": "Pad insluiten", + "pad.toolbar.showusers.title": "Gebruikers van dit pad weergeven", + "pad.colorpicker.save": "Opslaan", + "pad.colorpicker.cancel": "Annuleren", + "pad.loading": "Bezig met laden\u2026", + "pad.passwordRequired": "U hebt een wachtwoord nodig om toegang te krijgen tot deze pad", + "pad.permissionDenied": "U hebt geen rechten om deze pad te bekijken", + "pad.wrongPassword": "U hebt een onjuist wachtwoord ingevoerd", + "pad.settings.padSettings": "Padinstellingen", + "pad.settings.myView": "Mijn overzicht", + "pad.settings.stickychat": "Chat altijd zichtbaar", + "pad.settings.colorcheck": "Kleuren auteurs", + "pad.settings.linenocheck": "Regelnummers", + "pad.settings.rtlcheck": "Inhoud van rechts naar links lezen?", + "pad.settings.fontType": "Lettertype:", + "pad.settings.fontType.normal": "Normaal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Globaal overzicht", + "pad.settings.language": "Taal:", + "pad.importExport.import_export": "Importeren/exporteren", + "pad.importExport.import": "Upload een tekstbestand of document", + "pad.importExport.importSuccessful": "Afgerond", + "pad.importExport.export": "Huidige pad exporteren als", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Tekst zonder opmaak", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit platte tekst of een HTML-opmaak. \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003EInstalleer abiword\u003C/a\u003E om meer geavanceerde importmogelijkheden te krijgen.", + "pad.modals.connected": "Verbonden.", + "pad.modals.reconnecting": "Opnieuw verbinding maken met uw pad...", + "pad.modals.forcereconnect": "Opnieuw verbinden", + "pad.modals.userdup": "In een ander venster geopend", + "pad.modals.userdup.explanation": "Dit pad is meer dan \u00e9\u00e9n keer geopend in een browservenster op deze computer.", + "pad.modals.userdup.advice": "Maak opnieuw verbinding als u dit venster wilt gebruiken.", + "pad.modals.unauth": "Niet toegestaan", + "pad.modals.unauth.explanation": "Uw rechten zijn gewijzigd terwijl u de pagina aan het bekijken was. Probeer opnieuw te verbinden.", + "pad.modals.looping": "Verbinding verbroken.", + "pad.modals.looping.explanation": "Er is een probleem opgetreden tijdens de communicatie met de synchronisatieserver.", + "pad.modals.looping.cause": "Mogelijk gebruikt de server een niet compatibele firewall of proxy server.", + "pad.modals.initsocketfail": "Server is niet bereikbaar.", + "pad.modals.initsocketfail.explanation": "Het was niet mogelijk te verbinden met de synchronisatieserver.", + "pad.modals.initsocketfail.cause": "Mogelijk komt dit door uw browser of internetverbinding.", + "pad.modals.slowcommit": "Verbinding verbroken.", + "pad.modals.slowcommit.explanation": "De server reageert niet.", + "pad.modals.slowcommit.cause": "Dit komt mogelijk door netwerkproblemen.", + "pad.modals.deleted": "Verwijderd.", + "pad.modals.deleted.explanation": "Dit pad is verwijderd.", + "pad.modals.disconnected": "Uw verbinding is verbroken.", + "pad.modals.disconnected.explanation": "De verbinding met de server is verbroken", + "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel alstublieft de beheerder op de hoogte.", + "pad.share": "Pad delen", + "pad.share.readonly": "Alleen-lezen", + "pad.share.link": "Koppeling", + "pad.share.emebdcode": "URL insluiten", + "pad.chat": "Chatten", + "pad.chat.title": "Chat voor dit pad opnenen", + "pad.chat.loadmessages": "Meer berichten laden", + "timeslider.pageTitle": "Tijdlijn voor {{appTitle}}", + "timeslider.toolbar.returnbutton": "Terug naar pad", + "timeslider.toolbar.authors": "Auteurs:", + "timeslider.toolbar.authorsList": "Geen auteurs", + "timeslider.toolbar.exportlink.title": "Exporteren", + "timeslider.exportCurrent": "Huidige versie exporteren als:", + "timeslider.version": "Versie {{version}}", + "timeslider.saved": "Opgeslagen op {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januari", + "timeslider.month.february": "februari", + "timeslider.month.march": "maart", + "timeslider.month.april": "april", + "timeslider.month.may": "mei", + "timeslider.month.june": "juni", + "timeslider.month.july": "juli", + "timeslider.month.august": "augustus", + "timeslider.month.september": "september", + "timeslider.month.october": "oktober", + "timeslider.month.november": "november", + "timeslider.month.december": "december", + "timeslider.unnamedauthor": "{{num}} onbekende auteur", + "timeslider.unnamedauthors": "{{num}} onbekende auteurs", + "pad.savedrevs.marked": "Deze versie is nu gemarkeerd als opgeslagen versie", + "pad.userlist.entername": "Geef uw naam op", + "pad.userlist.unnamed": "zonder naam", + "pad.userlist.guest": "Gast", + "pad.userlist.deny": "Weigeren", + "pad.userlist.approve": "Goedkeuren", + "pad.editbar.clearcolors": "Auteurskleuren voor het hele document wissen?", + "pad.impexp.importbutton": "Nu importeren", + "pad.impexp.importing": "Bezig met importeren\u2026", + "pad.impexp.confirmimport": "Door een bestand te importeren overschrijft u de huidige tekst van de pad. Wilt u echt doorgaan?", + "pad.impexp.convertFailed": "Het was niet mogelijk dit bestand te importeren. Gebruik een andere documentopmaak of kopieer en plak de inhoud handmatig", + "pad.impexp.uploadFailed": "Het uploaden is mislukt. Probeer het opnieuw", + "pad.impexp.importfailed": "Importeren is mislukt", + "pad.impexp.copypaste": "Gebruik kopi\u00ebren en plakken", + "pad.impexp.exportdisabled": "Exporteren als {{type}} is uitgeschakeld. Neem contact op met de systeembeheerder voor details." } \ No newline at end of file diff --git a/src/locales/nn.json b/src/locales/nn.json index e8004e8d..6e60728c 100644 --- a/src/locales/nn.json +++ b/src/locales/nn.json @@ -1,117 +1,117 @@ { - "@metadata": { - "authors": { - "1": "Unhammer" - } - }, - "index.newPad": "Ny blokk", - "index.createOpenPad": "eller opprett\/opna ei blokk med namnet:", - "pad.toolbar.bold.title": "Feit (Ctrl-B)", - "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", - "pad.toolbar.underline.title": "Understreking (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Gjennomstreking", - "pad.toolbar.ol.title": "Nummerert liste", - "pad.toolbar.ul.title": "Punktliste", - "pad.toolbar.indent.title": "Innrykk", - "pad.toolbar.unindent.title": "Rykk ut", - "pad.toolbar.undo.title": "Angra (Ctrl-Z)", - "pad.toolbar.redo.title": "Gjer om (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Fjern forfattarfargar", - "pad.toolbar.import_export.title": "Importer\/eksporter til\/fr\u00e5 ulike filformat", - "pad.toolbar.timeslider.title": "Tidslinje", - "pad.toolbar.savedRevision.title": "Lagra utg\u00e5ver", - "pad.toolbar.settings.title": "Innstillingar", - "pad.toolbar.embed.title": "Bygg inn blokka i ei nettside", - "pad.toolbar.showusers.title": "Syn brukarane p\u00e5 blokka", - "pad.colorpicker.save": "Lagra", - "pad.colorpicker.cancel": "Avbryt", - "pad.loading": "Lastar \u2026", - "pad.passwordRequired": "Du treng eit passord for \u00e5 opna denne blokka", - "pad.permissionDenied": "Du har ikkje tilgang til denne blokka", - "pad.wrongPassword": "Feil passord", - "pad.settings.padSettings": "Blokkinnstillingar", - "pad.settings.myView": "Mi visning", - "pad.settings.stickychat": "Prat alltid synleg", - "pad.settings.colorcheck": "Forfattarfargar", - "pad.settings.linenocheck": "Linjenummer", - "pad.settings.fontType": "Skrifttype:", - "pad.settings.fontType.normal": "Vanleg", - "pad.settings.fontType.monospaced": "Fast breidd", - "pad.settings.globalView": "Global visning", - "pad.settings.language": "Spr\u00e5k:", - "pad.importExport.import_export": "Importer\/eksporter", - "pad.importExport.import": "Last opp tekstfiler eller dokument", - "pad.importExport.importSuccessful": "Vellukka!", - "pad.importExport.export": "Eksporter blokka som:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Rein tekst", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan berre importera fr\u00e5 rein tekst- eller HTML-format. Ver venleg og installer Abiword<\/a> om du treng meir avanserte importfunksjonar.", - "pad.modals.connected": "Tilkopla.", - "pad.modals.reconnecting": "Gjenopprettar tilkoplinga til blokka di \u2026", - "pad.modals.forcereconnect": "Tving gjentilkopling", - "pad.modals.userdup": "Opna i eit anna vindauge", - "pad.modals.userdup.explanation": "Det ser ut som om denne blokka er open i meir enn eitt nettlesarvindauge p\u00e5 denne maskinen.", - "pad.modals.userdup.advice": "Kopla til om att for \u00e5 bruka dette vinduage i staden.", - "pad.modals.unauth": "Ikkje tillate", - "pad.modals.unauth.explanation": "Rettane dine blei endra under visning av denne sida. Pr\u00f8v \u00e5 kopla til p\u00e5 nytt.", - "pad.modals.looping": "Fr\u00e5kopla.", - "pad.modals.looping.explanation": "Det oppstod kommunikasjonsproblem med synkroniseringstenaren.", - "pad.modals.looping.cause": "Kanskje du kopla til gjennom ein inkompatibel brannmur eller mellomtenar.", - "pad.modals.initsocketfail": "Klarte ikkje \u00e5 n\u00e5 tenaren.", - "pad.modals.initsocketfail.explanation": "Klarte ikkje \u00e5 kopla til synkroniseringstenaren.", - "pad.modals.initsocketfail.cause": "Dette er sannsynlegvis p\u00e5 grunn av eit problem med nettlesaren eller internettilkoplinga di.", - "pad.modals.slowcommit": "Fr\u00e5kopla.", - "pad.modals.slowcommit.explanation": "Tenaren svarer ikkje.", - "pad.modals.slowcommit.cause": "Dette kan vera p\u00e5 grunn av problem med nettilkoplinga.", - "pad.modals.deleted": "Sletta.", - "pad.modals.deleted.explanation": "Denne blokka er fjerna.", - "pad.modals.disconnected": "Du blei fr\u00e5kopla.", - "pad.modals.disconnected.explanation": "Mista tilkoplinga til tenaren", - "pad.modals.disconnected.cause": "Tenaren er ikkje tilgjengeleg. Ver venleg og gi oss ei melding om dette skjer fleire gonger.", - "pad.share": "Del denne blokka", - "pad.share.readonly": "Skriveverna", - "pad.share.link": "Lenkje", - "pad.share.emebdcode": "URL for innebygging", - "pad.chat": "Prat", - "pad.chat.title": "Opna pratepanelet for denne blokka.", - "timeslider.pageTitle": "Tidslinje for {{appTitle}}", - "timeslider.toolbar.returnbutton": "Attende til blokka", - "timeslider.toolbar.authors": "Forfattarar:", - "timeslider.toolbar.authorsList": "Ingen forfattarar", - "timeslider.toolbar.exportlink.title": "Eksporter", - "timeslider.exportCurrent": "Eksporter denne utg\u00e5va som:", - "timeslider.version": "Utg\u00e5ve {{version}}", - "timeslider.saved": "Lagra {{day}}. {{month}}, {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}.{{minutes}}.{{seconds}}", - "timeslider.month.january": "januar", - "timeslider.month.february": "februar", - "timeslider.month.march": "mars", - "timeslider.month.april": "april", - "timeslider.month.may": "mai", - "timeslider.month.june": "juni", - "timeslider.month.july": "juli", - "timeslider.month.august": "august", - "timeslider.month.september": "september", - "timeslider.month.october": "oktober", - "timeslider.month.november": "november", - "timeslider.month.december": "desember", - "pad.savedrevs.marked": "Denne utg\u00e5va er no merkt som ei lagra utg\u00e5ve", - "pad.userlist.entername": "Skriv namnet ditt", - "pad.userlist.unnamed": "utan namn", - "pad.userlist.guest": "Gjest", - "pad.userlist.deny": "Nekt", - "pad.userlist.approve": "Godkjenn", - "pad.editbar.clearcolors": "Fjern forfattarfargar i heile dokumentet?", - "pad.impexp.importbutton": "Importer no", - "pad.impexp.importing": "Importerer \u2026", - "pad.impexp.confirmimport": "Viss du importerer ei fil, vil denne blokka bli overskriven. Er du sikker p\u00e5 at du vil fortsetja?", - "pad.impexp.convertFailed": "Me klarte ikkje \u00e5 importera denne fila. Ver venleg og bruk eit anna dokumentformat, eller kopier og lim inn for hand.", - "pad.impexp.uploadFailed": "Feil ved opplasting, ver venleg og pr\u00f8v om att", - "pad.impexp.importfailed": "Feil ved importering", - "pad.impexp.copypaste": "Ver venleg og kopier og lim inn", - "pad.impexp.exportdisabled": "Eksport av {{type}} er skrudd av. Ver venleg og ta kontakt med systemadministrator for meir informasjon." + "@metadata": { + "authors": { + "1": "Unhammer" + } + }, + "index.newPad": "Ny blokk", + "index.createOpenPad": "eller opprett/opna ei blokk med namnet:", + "pad.toolbar.bold.title": "Feit (Ctrl-B)", + "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", + "pad.toolbar.underline.title": "Understreking (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Gjennomstreking", + "pad.toolbar.ol.title": "Nummerert liste", + "pad.toolbar.ul.title": "Punktliste", + "pad.toolbar.indent.title": "Innrykk", + "pad.toolbar.unindent.title": "Rykk ut", + "pad.toolbar.undo.title": "Angra (Ctrl-Z)", + "pad.toolbar.redo.title": "Gjer om (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Fjern forfattarfargar", + "pad.toolbar.import_export.title": "Importer/eksporter til/fr\u00e5 ulike filformat", + "pad.toolbar.timeslider.title": "Tidslinje", + "pad.toolbar.savedRevision.title": "Lagra utg\u00e5ver", + "pad.toolbar.settings.title": "Innstillingar", + "pad.toolbar.embed.title": "Bygg inn blokka i ei nettside", + "pad.toolbar.showusers.title": "Syn brukarane p\u00e5 blokka", + "pad.colorpicker.save": "Lagra", + "pad.colorpicker.cancel": "Avbryt", + "pad.loading": "Lastar \u2026", + "pad.passwordRequired": "Du treng eit passord for \u00e5 opna denne blokka", + "pad.permissionDenied": "Du har ikkje tilgang til denne blokka", + "pad.wrongPassword": "Feil passord", + "pad.settings.padSettings": "Blokkinnstillingar", + "pad.settings.myView": "Mi visning", + "pad.settings.stickychat": "Prat alltid synleg", + "pad.settings.colorcheck": "Forfattarfargar", + "pad.settings.linenocheck": "Linjenummer", + "pad.settings.fontType": "Skrifttype:", + "pad.settings.fontType.normal": "Vanleg", + "pad.settings.fontType.monospaced": "Fast breidd", + "pad.settings.globalView": "Global visning", + "pad.settings.language": "Spr\u00e5k:", + "pad.importExport.import_export": "Importer/eksporter", + "pad.importExport.import": "Last opp tekstfiler eller dokument", + "pad.importExport.importSuccessful": "Vellukka!", + "pad.importExport.export": "Eksporter blokka som:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Rein tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Du kan berre importera fr\u00e5 rein tekst- eller HTML-format. Ver venleg og \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstaller Abiword\u003C/a\u003E om du treng meir avanserte importfunksjonar.", + "pad.modals.connected": "Tilkopla.", + "pad.modals.reconnecting": "Gjenopprettar tilkoplinga til blokka di \u2026", + "pad.modals.forcereconnect": "Tving gjentilkopling", + "pad.modals.userdup": "Opna i eit anna vindauge", + "pad.modals.userdup.explanation": "Det ser ut som om denne blokka er open i meir enn eitt nettlesarvindauge p\u00e5 denne maskinen.", + "pad.modals.userdup.advice": "Kopla til om att for \u00e5 bruka dette vinduage i staden.", + "pad.modals.unauth": "Ikkje tillate", + "pad.modals.unauth.explanation": "Rettane dine blei endra under visning av denne sida. Pr\u00f8v \u00e5 kopla til p\u00e5 nytt.", + "pad.modals.looping": "Fr\u00e5kopla.", + "pad.modals.looping.explanation": "Det oppstod kommunikasjonsproblem med synkroniseringstenaren.", + "pad.modals.looping.cause": "Kanskje du kopla til gjennom ein inkompatibel brannmur eller mellomtenar.", + "pad.modals.initsocketfail": "Klarte ikkje \u00e5 n\u00e5 tenaren.", + "pad.modals.initsocketfail.explanation": "Klarte ikkje \u00e5 kopla til synkroniseringstenaren.", + "pad.modals.initsocketfail.cause": "Dette er sannsynlegvis p\u00e5 grunn av eit problem med nettlesaren eller internettilkoplinga di.", + "pad.modals.slowcommit": "Fr\u00e5kopla.", + "pad.modals.slowcommit.explanation": "Tenaren svarer ikkje.", + "pad.modals.slowcommit.cause": "Dette kan vera p\u00e5 grunn av problem med nettilkoplinga.", + "pad.modals.deleted": "Sletta.", + "pad.modals.deleted.explanation": "Denne blokka er fjerna.", + "pad.modals.disconnected": "Du blei fr\u00e5kopla.", + "pad.modals.disconnected.explanation": "Mista tilkoplinga til tenaren", + "pad.modals.disconnected.cause": "Tenaren er ikkje tilgjengeleg. Ver venleg og gi oss ei melding om dette skjer fleire gonger.", + "pad.share": "Del denne blokka", + "pad.share.readonly": "Skriveverna", + "pad.share.link": "Lenkje", + "pad.share.emebdcode": "URL for innebygging", + "pad.chat": "Prat", + "pad.chat.title": "Opna pratepanelet for denne blokka.", + "timeslider.pageTitle": "Tidslinje for {{appTitle}}", + "timeslider.toolbar.returnbutton": "Attende til blokka", + "timeslider.toolbar.authors": "Forfattarar:", + "timeslider.toolbar.authorsList": "Ingen forfattarar", + "timeslider.toolbar.exportlink.title": "Eksporter", + "timeslider.exportCurrent": "Eksporter denne utg\u00e5va som:", + "timeslider.version": "Utg\u00e5ve {{version}}", + "timeslider.saved": "Lagra {{day}}. {{month}}, {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", + "timeslider.month.january": "januar", + "timeslider.month.february": "februar", + "timeslider.month.march": "mars", + "timeslider.month.april": "april", + "timeslider.month.may": "mai", + "timeslider.month.june": "juni", + "timeslider.month.july": "juli", + "timeslider.month.august": "august", + "timeslider.month.september": "september", + "timeslider.month.october": "oktober", + "timeslider.month.november": "november", + "timeslider.month.december": "desember", + "pad.savedrevs.marked": "Denne utg\u00e5va er no merkt som ei lagra utg\u00e5ve", + "pad.userlist.entername": "Skriv namnet ditt", + "pad.userlist.unnamed": "utan namn", + "pad.userlist.guest": "Gjest", + "pad.userlist.deny": "Nekt", + "pad.userlist.approve": "Godkjenn", + "pad.editbar.clearcolors": "Fjern forfattarfargar i heile dokumentet?", + "pad.impexp.importbutton": "Importer no", + "pad.impexp.importing": "Importerer \u2026", + "pad.impexp.confirmimport": "Viss du importerer ei fil, vil denne blokka bli overskriven. Er du sikker p\u00e5 at du vil fortsetja?", + "pad.impexp.convertFailed": "Me klarte ikkje \u00e5 importera denne fila. Ver venleg og bruk eit anna dokumentformat, eller kopier og lim inn for hand.", + "pad.impexp.uploadFailed": "Feil ved opplasting, ver venleg og pr\u00f8v om att", + "pad.impexp.importfailed": "Feil ved importering", + "pad.impexp.copypaste": "Ver venleg og kopier og lim inn", + "pad.impexp.exportdisabled": "Eksport av {{type}} er skrudd av. Ver venleg og ta kontakt med systemadministrator for meir informasjon." } \ No newline at end of file diff --git a/src/locales/oc.json b/src/locales/oc.json index 08390825..be4da3cd 100644 --- a/src/locales/oc.json +++ b/src/locales/oc.json @@ -1,118 +1,118 @@ { - "@metadata": { - "authors": [ - "Cedric31" - ] - }, - "index.newPad": "Pad nov\u00e8l", - "index.createOpenPad": "o crear\/dobrir un Pad intitulat :", - "pad.toolbar.bold.title": "Gras (Ctrl-B)", - "pad.toolbar.italic.title": "Italica (Ctrl-I)", - "pad.toolbar.underline.title": "Soslinhat (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Raiat", - "pad.toolbar.ol.title": "Lista ordenada", - "pad.toolbar.ul.title": "Lista amb de piuses", - "pad.toolbar.indent.title": "Indentar", - "pad.toolbar.unindent.title": "Desindentar", - "pad.toolbar.undo.title": "Anullar (Ctrl-Z)", - "pad.toolbar.redo.title": "Restablir (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Escafar las colors qu'identifican los autors", - "pad.toolbar.import_export.title": "Importar\/Exportar de\/cap a un format de fichi\u00e8r diferent", - "pad.toolbar.timeslider.title": "Istoric dinamic", - "pad.toolbar.savedRevision.title": "Versions enregistradas", - "pad.toolbar.settings.title": "Param\u00e8tres", - "pad.toolbar.embed.title": "Integrar aqueste Pad", - "pad.toolbar.showusers.title": "Afichar los utilizaires del Pad", - "pad.colorpicker.save": "Enregistrar", - "pad.colorpicker.cancel": "Anullar", - "pad.loading": "Cargament...", - "pad.passwordRequired": "Av\u00e8tz besonh d'un senhal per accedir a aqueste Pad", - "pad.permissionDenied": "Vos es pas perm\u00e9s d\u2019accedir a aqueste Pad.", - "pad.wrongPassword": "Senhal incorr\u00e8cte", - "pad.settings.padSettings": "Param\u00e8tres del Pad", - "pad.settings.myView": "Ma vista", - "pad.settings.stickychat": "Afichar totjorn lo chat", - "pad.settings.colorcheck": "Colors d\u2019identificacion", - "pad.settings.linenocheck": "Num\u00e8ros de linhas", - "pad.settings.fontType": "Tipe de poli\u00e7a :", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Vista d\u2019ensemble", - "pad.settings.language": "Lenga :", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Cargar un t\u00e8xte o un document", - "pad.importExport.importSuccessful": "Capitat !", - "pad.importExport.export": "Exportar lo Pad actual coma :", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "T\u00e8xte brut", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Pod\u00e8tz pas importar que de formats t\u00e8xte brut o html. Per de foncionalitats d'importacion mai evoluadas, installatz abiword<\/a>.", - "pad.modals.connected": "Connectat.", - "pad.modals.reconnecting": "Reconnexion cap a v\u00f2stre Pad...", - "pad.modals.forcereconnect": "For\u00e7ar la reconnexion.", - "pad.modals.userdup": "Dob\u00e8rt dins una autra fen\u00e8stra", - "pad.modals.userdup.explanation": "Sembla qu'aqueste Pad es dob\u00e8rt dins mai d'una fen\u00e8stra de v\u00f2stre navigador sus aqueste ordenador.", - "pad.modals.userdup.advice": "Se reconnectar en utilizant aquesta fen\u00e8stra.", - "pad.modals.unauth": "Pas autorizat", - "pad.modals.unauth.explanation": "V\u00f2stras permissions son estadas cambiadas al moment de l'afichatge d'aquesta pagina. Ensajatz de vos reconnectar.", - "pad.modals.looping": "Desconnectat", - "pad.modals.looping.explanation": "Av\u00e8m un probl\u00e8ma de comunicacion amb lo servidor de sincronizacion.", - "pad.modals.looping.cause": "Es possible que v\u00f2stra connexion si\u00e1 protegida per un parafu\u00f2c incompatible o un servidor proxy incompatible.", - "pad.modals.initsocketfail": "Lo servidor es introbable.", - "pad.modals.initsocketfail.explanation": "Impossible de se connectar al servidor de sincronizacion.", - "pad.modals.initsocketfail.cause": "Lo probl\u00e8ma p\u00f2t venir de v\u00f2stre navigador web o de v\u00f2stra connexion Internet.", - "pad.modals.slowcommit": "Desconnectat", - "pad.modals.slowcommit.explanation": "Lo servidor respond pas.", - "pad.modals.slowcommit.cause": "Aqueste probl\u00e8ma p\u00f2t venir d'una marrida connectivitat a la ret.", - "pad.modals.deleted": "Suprimit.", - "pad.modals.deleted.explanation": "Aqueste Pad es estat suprimit.", - "pad.modals.disconnected": "S\u00e8tz estat desconnectat.", - "pad.modals.disconnected.explanation": "La connexion al servidor a fracassat.", - "pad.modals.disconnected.cause": "Es possible que lo servidor si\u00e1 indisponible. Informatz-nos-ne se lo probl\u00e8ma persist\u00eds.", - "pad.share": "Partejar aqueste Pad", - "pad.share.readonly": "Lectura sola", - "pad.share.link": "Ligam", - "pad.share.emebdcode": "Ligam d'integrar", - "pad.chat": "Chat", - "pad.chat.title": "Dobrir lo chat associat a aqueste pad.", - "pad.chat.loadmessages": "Cargar mai de messatges.", - "timeslider.pageTitle": "Istoric dinamic de {{appTitle}}", - "timeslider.toolbar.returnbutton": "Retorn a aqueste Pad.", - "timeslider.toolbar.authors": "Autors :", - "timeslider.toolbar.authorsList": "Pas cap d'autor", - "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar la version actuala en\u00a0:", - "timeslider.version": "Version {{version}}", - "timeslider.saved": "Enregistrat lo {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Geni\u00e8r", - "timeslider.month.february": "Febri\u00e8r", - "timeslider.month.march": "Mar\u00e7", - "timeslider.month.april": "Abril", - "timeslider.month.may": "Mai", - "timeslider.month.june": "Junh", - "timeslider.month.july": "Julhet", - "timeslider.month.august": "Agost", - "timeslider.month.september": "Setembre", - "timeslider.month.october": "Octobre", - "timeslider.month.november": "Novembre", - "timeslider.month.december": "Decembre", - "pad.savedrevs.marked": "Aquesta revision es ara marcada coma revision enregistrada", - "pad.userlist.entername": "Entratz v\u00f2stre nom", - "pad.userlist.unnamed": "sens nom", - "pad.userlist.guest": "Convidat", - "pad.userlist.deny": "Refusar", - "pad.userlist.approve": "Aprovar", - "pad.editbar.clearcolors": "Escafar las colors de paternitat dins tot lo document ?", - "pad.impexp.importbutton": "Importar ara", - "pad.impexp.importing": "Imp\u00f2rt en cors...", - "pad.impexp.confirmimport": "Importar un fichi\u00e8r espotir\u00e0 lo t\u00e8xte actual del bl\u00f2t. S\u00e8tz segur que lo vol\u00e8tz far ?", - "pad.impexp.convertFailed": "Pod\u00e8m pas importar aqueste fichi\u00e8r. Utilizatz un autre format de document o fas\u00e8tz un copiar\/pegar manual", - "pad.impexp.uploadFailed": "Lo telecargament a fracassat, reensajatz", - "pad.impexp.importfailed": "Frac\u00e0s de l'importacion", - "pad.impexp.copypaste": "Copiatz\/pegatz", - "pad.impexp.exportdisabled": "Exportar al format {{type}} es desactivat. Contactatz v\u00f2stre administrator del sist\u00e8ma per mai de detalhs." + "@metadata": { + "authors": [ + "Cedric31" + ] + }, + "index.newPad": "Pad nov\u00e8l", + "index.createOpenPad": "o crear/dobrir un Pad intitulat :", + "pad.toolbar.bold.title": "Gras (Ctrl-B)", + "pad.toolbar.italic.title": "Italica (Ctrl-I)", + "pad.toolbar.underline.title": "Soslinhat (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Raiat", + "pad.toolbar.ol.title": "Lista ordenada", + "pad.toolbar.ul.title": "Lista amb de piuses", + "pad.toolbar.indent.title": "Indentar", + "pad.toolbar.unindent.title": "Desindentar", + "pad.toolbar.undo.title": "Anullar (Ctrl-Z)", + "pad.toolbar.redo.title": "Restablir (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Escafar las colors qu'identifican los autors", + "pad.toolbar.import_export.title": "Importar/Exportar de/cap a un format de fichi\u00e8r diferent", + "pad.toolbar.timeslider.title": "Istoric dinamic", + "pad.toolbar.savedRevision.title": "Versions enregistradas", + "pad.toolbar.settings.title": "Param\u00e8tres", + "pad.toolbar.embed.title": "Integrar aqueste Pad", + "pad.toolbar.showusers.title": "Afichar los utilizaires del Pad", + "pad.colorpicker.save": "Enregistrar", + "pad.colorpicker.cancel": "Anullar", + "pad.loading": "Cargament...", + "pad.passwordRequired": "Av\u00e8tz besonh d'un senhal per accedir a aqueste Pad", + "pad.permissionDenied": "Vos es pas perm\u00e9s d\u2019accedir a aqueste Pad.", + "pad.wrongPassword": "Senhal incorr\u00e8cte", + "pad.settings.padSettings": "Param\u00e8tres del Pad", + "pad.settings.myView": "Ma vista", + "pad.settings.stickychat": "Afichar totjorn lo chat", + "pad.settings.colorcheck": "Colors d\u2019identificacion", + "pad.settings.linenocheck": "Num\u00e8ros de linhas", + "pad.settings.fontType": "Tipe de poli\u00e7a :", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Vista d\u2019ensemble", + "pad.settings.language": "Lenga :", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Cargar un t\u00e8xte o un document", + "pad.importExport.importSuccessful": "Capitat !", + "pad.importExport.export": "Exportar lo Pad actual coma :", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "T\u00e8xte brut", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Pod\u00e8tz pas importar que de formats t\u00e8xte brut o html. Per de foncionalitats d'importacion mai evoluadas, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstallatz abiword\u003C/a\u003E.", + "pad.modals.connected": "Connectat.", + "pad.modals.reconnecting": "Reconnexion cap a v\u00f2stre Pad...", + "pad.modals.forcereconnect": "For\u00e7ar la reconnexion.", + "pad.modals.userdup": "Dob\u00e8rt dins una autra fen\u00e8stra", + "pad.modals.userdup.explanation": "Sembla qu'aqueste Pad es dob\u00e8rt dins mai d'una fen\u00e8stra de v\u00f2stre navigador sus aqueste ordenador.", + "pad.modals.userdup.advice": "Se reconnectar en utilizant aquesta fen\u00e8stra.", + "pad.modals.unauth": "Pas autorizat", + "pad.modals.unauth.explanation": "V\u00f2stras permissions son estadas cambiadas al moment de l'afichatge d'aquesta pagina. Ensajatz de vos reconnectar.", + "pad.modals.looping": "Desconnectat", + "pad.modals.looping.explanation": "Av\u00e8m un probl\u00e8ma de comunicacion amb lo servidor de sincronizacion.", + "pad.modals.looping.cause": "Es possible que v\u00f2stra connexion si\u00e1 protegida per un parafu\u00f2c incompatible o un servidor proxy incompatible.", + "pad.modals.initsocketfail": "Lo servidor es introbable.", + "pad.modals.initsocketfail.explanation": "Impossible de se connectar al servidor de sincronizacion.", + "pad.modals.initsocketfail.cause": "Lo probl\u00e8ma p\u00f2t venir de v\u00f2stre navigador web o de v\u00f2stra connexion Internet.", + "pad.modals.slowcommit": "Desconnectat", + "pad.modals.slowcommit.explanation": "Lo servidor respond pas.", + "pad.modals.slowcommit.cause": "Aqueste probl\u00e8ma p\u00f2t venir d'una marrida connectivitat a la ret.", + "pad.modals.deleted": "Suprimit.", + "pad.modals.deleted.explanation": "Aqueste Pad es estat suprimit.", + "pad.modals.disconnected": "S\u00e8tz estat desconnectat.", + "pad.modals.disconnected.explanation": "La connexion al servidor a fracassat.", + "pad.modals.disconnected.cause": "Es possible que lo servidor si\u00e1 indisponible. Informatz-nos-ne se lo probl\u00e8ma persist\u00eds.", + "pad.share": "Partejar aqueste Pad", + "pad.share.readonly": "Lectura sola", + "pad.share.link": "Ligam", + "pad.share.emebdcode": "Ligam d'integrar", + "pad.chat": "Chat", + "pad.chat.title": "Dobrir lo chat associat a aqueste pad.", + "pad.chat.loadmessages": "Cargar mai de messatges.", + "timeslider.pageTitle": "Istoric dinamic de {{appTitle}}", + "timeslider.toolbar.returnbutton": "Retorn a aqueste Pad.", + "timeslider.toolbar.authors": "Autors :", + "timeslider.toolbar.authorsList": "Pas cap d'autor", + "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar la version actuala en\u00a0:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Enregistrat lo {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Geni\u00e8r", + "timeslider.month.february": "Febri\u00e8r", + "timeslider.month.march": "Mar\u00e7", + "timeslider.month.april": "Abril", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Junh", + "timeslider.month.july": "Julhet", + "timeslider.month.august": "Agost", + "timeslider.month.september": "Setembre", + "timeslider.month.october": "Octobre", + "timeslider.month.november": "Novembre", + "timeslider.month.december": "Decembre", + "pad.savedrevs.marked": "Aquesta revision es ara marcada coma revision enregistrada", + "pad.userlist.entername": "Entratz v\u00f2stre nom", + "pad.userlist.unnamed": "sens nom", + "pad.userlist.guest": "Convidat", + "pad.userlist.deny": "Refusar", + "pad.userlist.approve": "Aprovar", + "pad.editbar.clearcolors": "Escafar las colors de paternitat dins tot lo document ?", + "pad.impexp.importbutton": "Importar ara", + "pad.impexp.importing": "Imp\u00f2rt en cors...", + "pad.impexp.confirmimport": "Importar un fichi\u00e8r espotir\u00e0 lo t\u00e8xte actual del bl\u00f2t. S\u00e8tz segur que lo vol\u00e8tz far ?", + "pad.impexp.convertFailed": "Pod\u00e8m pas importar aqueste fichi\u00e8r. Utilizatz un autre format de document o fas\u00e8tz un copiar/pegar manual", + "pad.impexp.uploadFailed": "Lo telecargament a fracassat, reensajatz", + "pad.impexp.importfailed": "Frac\u00e0s de l'importacion", + "pad.impexp.copypaste": "Copiatz/pegatz", + "pad.impexp.exportdisabled": "Exportar al format {{type}} es desactivat. Contactatz v\u00f2stre administrator del sist\u00e8ma per mai de detalhs." } \ No newline at end of file diff --git a/src/locales/os.json b/src/locales/os.json index 64b3ea2a..3f6d0d24 100644 --- a/src/locales/os.json +++ b/src/locales/os.json @@ -1,120 +1,121 @@ { - "@metadata": { - "authors": [ - "Bouron" - ] - }, - "index.newPad": "\u041d\u043e\u0433", - "index.createOpenPad": "\u043a\u04d5\u043d\u04d5 \u0441\u0430\u0440\u0430\u0437\/\u0431\u0430\u043a\u04d5\u043d \u043d\u043e\u0433 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0430\u0445\u04d5\u043c \u043d\u043e\u043c\u0438\u043c\u04d5:", - "pad.toolbar.bold.title": "\u0411\u04d5\u0437\u0434\u0436\u044b\u043d (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u044a\u04d5\u0434\u0437 (Ctrl-I)", - "pad.toolbar.underline.title": "\u0411\u044b\u043d\u044b\u043b\u0445\u0430\u0445\u0445 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0425\u0430\u0445\u0445", - "pad.toolbar.ol.title": "\u041d\u044b\u043c\u0430\u0434 \u043d\u043e\u043c\u0445\u044b\u0433\u044a\u0434", - "pad.toolbar.ul.title": "\u04d4\u043d\u04d5\u043d\u044b\u043c\u0430\u0434 \u043d\u043e\u043c\u0445\u044b\u0433\u044a\u0434", - "pad.toolbar.indent.title": "\u0425\u0430\u0441\u0442", - "pad.toolbar.unindent.title": "\u04d4\u0442\u0442\u04d5\u043c\u04d5\u0445\u0430\u0441\u0442", - "pad.toolbar.undo.title": "\u0420\u0430\u0437\u0434\u04d5\u0445\u044b\u043d (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0420\u0430\u0446\u0430\u0440\u0430\u0437\u044b\u043d (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5 \u0430\u0439\u0441\u044b\u043d\u04d5\u043d", - "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u0439\/\u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u043c", - "pad.toolbar.timeslider.title": "\u0420\u04d5\u0441\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", - "pad.toolbar.savedRevision.title": "\u0424\u04d5\u043b\u0442\u04d5\u0440 \u0431\u0430\u0432\u04d5\u0440\u044b\u043d\u04d5\u043d", - "pad.toolbar.settings.title": "\u0423\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u04d5", - "pad.toolbar.embed.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0444\u0442\u0430\u0443\u044b\u043d", - "pad.toolbar.showusers.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0440\u0445\u0430\u0439\u0434\u0436\u044b\u0442\u044b \u0440\u0430\u0432\u0434\u0438\u0441\u044b\u043d", - "pad.colorpicker.save": "\u041d\u044b\u0432\u00e6\u0440\u044b\u043d", - "pad.colorpicker.cancel": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", - "pad.loading": "\u00c6\u0432\u0433\u00e6\u0434 \u0446\u00e6\u0443\u044b...", - "pad.passwordRequired": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u0440\u044b\u0432\u043d\u0430\u043b\u044b\u043d\u04d5\u043d \u0434\u04d5 \u0445\u044a\u04d5\u0443\u044b \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.permissionDenied": "\u0414\u04d5\u0443\u04d5\u043d \u043d\u04d5\u0439 \u0431\u0430\u0440 \u0430\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u0440\u044b\u0432\u043d\u0430\u043b\u044b\u043d", - "pad.wrongPassword": "\u0414\u04d5 \u043f\u0430\u0440\u043e\u043b\u044c \u0440\u0430\u0441\u0442 \u043d\u04d5\u0443", - "pad.settings.padSettings": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u044b\u0442\u04d5", - "pad.settings.myView": "\u041c\u04d5 \u0443\u044b\u043d\u0434", - "pad.settings.stickychat": "\u041d\u044b\u0445\u0430\u0441 \u0430\u043b\u043a\u0443\u044b\u0434\u04d5\u0440 \u04d5\u0432\u0434\u0438\u0441\u044b\u043d", - "pad.settings.colorcheck": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u0445\u0443\u044b\u0437\u0442\u04d5", - "pad.settings.linenocheck": "\u0420\u04d5\u043d\u0445\u044a\u044b\u0442\u044b \u043d\u043e\u043c\u044b\u0440\u0442\u04d5", - "pad.settings.fontType": "\u0428\u0440\u0438\u0444\u0442\u044b \u0445\u0443\u044b\u0437:", - "pad.settings.fontType.normal": "\u0425\u0443\u044b\u043c\u04d5\u0442\u04d5\u0433", - "pad.settings.fontType.monospaced": "\u04d4\u043c\u0443\u04d5\u0440\u04d5\u0445", - "pad.settings.globalView": "\u0418\u0443\u0443\u044b\u043b\u044b \u0443\u044b\u043d\u0434", - "pad.settings.language": "\u00c6\u0432\u0437\u0430\u0433:", - "pad.importExport.import_export": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442", - "pad.importExport.import": "\u0418\u0441\u0442\u044b \u0442\u0435\u043a\u0441\u0442 \u0444\u0430\u0439\u043b \u043a\u04d5\u043d\u04d5 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", - "pad.importExport.importSuccessful": "\u04d4\u043d\u0442\u044b\u0441\u0442!", - "pad.importExport.export": "\u041d\u044b\u0440\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u044d\u043a\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u043a\u0443\u044b\u0434:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0425\u0443\u044b\u043c\u00e6\u0442\u00e6\u0433 \u0442\u0435\u043a\u0441\u0442", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0414\u04d5 \u0431\u043e\u043d \u0443 \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u04d5\u0440\u043c\u04d5\u0441\u0442 \u0445\u0443\u044b\u043c\u04d5\u0442\u04d5\u0433 \u0442\u0435\u043a\u0441\u0442 \u043a\u04d5\u043d\u04d5 html \u0444\u043e\u0440\u043c\u0430\u0442\u04d5\u0439. \u041b\u04d5\u043c\u0431\u044b\u043d\u04d5\u0433 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u043c\u0438\u043d\u0438\u0443\u0434\u0436\u044b\u0442\u04d5\u043d, \u0434\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0441\u04d5\u0432\u04d5\u0440 abiword<\/a>.", - "pad.modals.connected": "\u0418\u0443\u0433\u043e\u043d\u0434.", - "pad.modals.reconnecting": "\u0414\u04d5 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u043d\u043e\u0433\u04d5\u0439 \u0438\u0443\u0433\u043e\u043d\u0434 \u0446\u04d5\u0443\u044b..", - "pad.modals.forcereconnect": "\u0422\u044b\u0445\u0445\u04d5\u0439 \u0431\u0430\u0438\u0443 \u043a\u04d5\u043d\u044b\u043d", - "pad.modals.userdup": "\u041d\u043e\u0433 \u0440\u0443\u0434\u0437\u044b\u043d\u0434\u0436\u044b \u0431\u0430\u043a\u04d5\u043d\u044b\u043d", - "pad.modals.userdup.explanation": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u04d5\u0432\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0430\u0446\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0438\u0443\u04d5\u0439 \u0444\u044b\u043b\u0434\u04d5\u0440 \u0440\u0443\u0434\u0437\u044b\u043d\u0434\u0436\u044b \u0443 \u0433\u043e\u043c.", - "pad.modals.userdup.advice": "\u041d\u043e\u0433\u04d5\u0439 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d, \u0430\u0446\u044b \u0440\u0443\u0434\u0437\u044b\u043d\u0433\u04d5\u0439 \u0430\u0440\u0445\u0430\u0439\u044b\u043d\u044b \u0431\u04d5\u0441\u0442\u044b.", - "pad.modals.unauth": "\u041d\u04d5 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0433\u043e\u043d\u0434", - "pad.modals.unauth.explanation": "\u0414\u04d5 \u0431\u0430\u0440\u0442\u04d5 \u0444\u04d5\u0438\u0432\u0442\u043e\u0439, \u0446\u0430\u043b\u044b\u043d\u043c\u04d5 \u0434\u044b \u0430\u0446\u044b \u0444\u0430\u0440\u0441 \u043a\u0430\u0441\u0442\u04d5. \u0411\u0430\u0444\u04d5\u043b\u0432\u0430\u0440 \u043d\u043e\u0433\u04d5\u0439 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d.", - "pad.modals.looping": "\u0425\u0438\u0446\u04d5\u043d.", - "pad.modals.looping.explanation": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0439\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0438\u043c\u04d5 \u0431\u0430\u0438\u0443 \u043a\u04d5\u043d\u044b\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u04d5.", - "pad.modals.looping.cause": "\u0423\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0434\u044b \u0431\u0430\u0438\u0443 \u0434\u04d5 \u04d5\u043d\u04d5\u043c\u0431\u04d5\u043b\u0433\u04d5 \u0444\u0430\u0439\u0440\u0432\u043e\u043b \u043a\u04d5\u043d\u04d5 \u043f\u0440\u043e\u043a\u0441\u0438\u0439\u044b \u0443\u044b\u043b\u0442\u044b.", - "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0431\u0430\u0438\u0443\u0433\u04d5\u043d\u04d5\u043d \u043d\u04d5\u0439.", - "pad.modals.initsocketfail.explanation": "\u041d\u04d5 \u0440\u0430\u0443\u0430\u0434\u0438\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0439\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d.", - "pad.modals.initsocketfail.cause": "\u0410\u0439 \u0443\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0434\u04d5 \u0441\u0433\u0430\u0440\u04d5\u043d \u043a\u04d5\u043d\u04d5 \u0434\u04d5 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u044b \u0442\u044b\u0445\u0445\u04d5\u0439 \u0443.", - "pad.modals.slowcommit": "\u0425\u0438\u0446\u04d5\u043d\u0433\u043e\u043d\u0434.", - "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u04d5 \u0434\u0437\u0443\u0430\u043f\u043f \u043a\u04d5\u043d\u044b.", - "pad.modals.slowcommit.cause": "\u0410\u0439 \u0433\u04d5\u043d\u04d5\u043d \u0438\u0441 \u0443 \u0445\u044b\u0437\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u04d5\u0439\u044b \u0442\u044b\u0445\u0445\u04d5\u0439.", - "pad.modals.deleted": "\u0425\u0430\u0444\u0442.", - "pad.modals.deleted.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0445\u0430\u0444\u0442 \u04d5\u0440\u0446\u044b\u0434.", - "pad.modals.disconnected": "\u0414\u044b \u0445\u0438\u0446\u04d5\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434\u0442\u04d5.", - "pad.modals.disconnected.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440\u0438\u043c\u04d5 \u0438\u0443\u0433\u043e\u043d\u0434 \u0444\u0435\u0441\u04d5\u0444\u0442\u0438\u0441", - "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0433\u04d5\u043d\u04d5\u043d \u0438\u0441 \u0431\u0430\u0438\u0443\u0433\u04d5\u043d\u04d5\u043d \u043d\u04d5\u0439. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0444\u0435\u0445\u044a\u0443\u0441\u044b\u043d \u043d\u044b\u043d \u04d5\u0439 \u043a\u04d5\u043d, \u043a\u04d5\u0434 \u0430\u0444\u0442\u04d5 \u0434\u0430\u0440\u0434\u0434\u04d5\u0440 \u043a\u04d5\u043d\u0430.", - "pad.share": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u0439\u0443\u0430\u0440\u044b\u043d", - "pad.share.readonly": "\u04d4\u0440\u043c\u04d5\u0441\u0442 \u0444\u04d5\u0440\u0441\u044b\u043d\u04d5\u043d", - "pad.share.link": "\u04d4\u0440\u0432\u0438\u0442\u04d5\u043d", - "pad.share.emebdcode": "URL \u0431\u0430\u0432\u04d5\u0440\u044b\u043d", - "pad.chat": "\u041d\u044b\u0445\u0430\u0441", - "pad.chat.title": "\u041e\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u043d \u0447\u0430\u0442 \u0431\u0430\u043a\u04d5\u043d.", - "pad.chat.loadmessages": "\u0424\u044b\u043b\u0434\u04d5\u0440 \u0444\u044b\u0441\u0442\u04d5\u0433 \u0440\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", - "timeslider.pageTitle": "{{appTitle}}-\u044b \u0440\u04d5\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", - "timeslider.toolbar.returnbutton": "\u0424\u04d5\u0441\u0442\u04d5\u043c\u04d5, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5", - "timeslider.toolbar.authors": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5:", - "timeslider.toolbar.authorsList": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5 \u043d\u04d5\u0439", - "timeslider.toolbar.exportlink.title": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442", - "timeslider.exportCurrent": "\u0421\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u043d\u044b\u0440\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043a\u0443\u044b\u0434:", - "timeslider.version": "\u0412\u0435\u0440\u0441\u0438 {{version}}", - "timeslider.saved": "\u04d4\u0432\u04d5\u0440\u0434 \u04d5\u0440\u0446\u044b\u0434 {{year}}-\u04d5\u043c \u0430\u0437\u044b, {{day}}-\u04d5\u043c {{month}}-\u044b", - "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u044f\u043d\u0432\u0430\u0440\u044c", - "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0430\u043b\u044c", - "timeslider.month.march": "\u043c\u0430\u0440\u0442\u044a\u0438", - "timeslider.month.april": "\u0430\u043f\u0440\u0435\u043b\u044c", - "timeslider.month.may": "\u043c\u0430\u0439", - "timeslider.month.june": "\u0438\u044e\u043d\u044c", - "timeslider.month.july": "\u0438\u044e\u043b\u044c", - "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", - "timeslider.month.september": "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", - "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", - "timeslider.unnamedauthor": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0433", - "timeslider.unnamedauthors": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b", - "pad.savedrevs.marked": "\u0410\u0446\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0440 \u043a\u0443\u044b\u0434 \u04d5\u0432\u04d5\u0440\u0434 \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0441\u0430\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434", - "pad.userlist.entername": "\u0414\u04d5 \u043d\u043e\u043c \u0431\u0430\u0444\u044b\u0441\u0441", - "pad.userlist.unnamed": "\u04d5\u043d\u04d5\u043d\u043e\u043c", - "pad.userlist.guest": "\u0423\u0430\u0437\u04d5\u0433", - "pad.userlist.deny": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", - "pad.userlist.approve": "\u0421\u0431\u04d5\u043b\u0432\u044b\u0440\u0434 \u043a\u04d5\u043d\u044b\u043d", - "pad.editbar.clearcolors": "\u04d4\u043d\u04d5\u0445\u044a\u04d5\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u0439 \u0445\u044a\u04d5\u0443\u044b \u0430\u0439\u0441\u044b\u043d \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5?", - "pad.impexp.importbutton": "\u0415\u043d\u044b\u0440 \u0441\u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d", - "pad.impexp.importing": "\u0418\u043c\u043f\u043e\u0440\u0442 \u0446\u04d5\u0443\u044b...", - "pad.impexp.confirmimport": "\u0424\u0430\u0439\u043b\u044b \u0438\u043c\u043f\u043e\u0440\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u044b\u0440\u044b \u0442\u0435\u043a\u0441\u0442 \u0431\u044b\u043d\u0442\u043e\u043d \u0444\u04d5\u0438\u0432\u0434\u0437\u04d5\u043d\u0438\u0441. \u04d4\u0446\u04d5\u0433 \u0434\u04d5 \u0444\u04d5\u043d\u0434\u044b \u0443\u044b\u0439 \u0441\u0430\u0440\u0430\u0437\u044b\u043d?", - "pad.impexp.convertFailed": "\u041c\u0430\u0445\u04d5\u043d \u043d\u04d5 \u0431\u043e\u043d \u043d\u0435 \u0441\u0441\u0438\u0441 \u0430\u0446\u044b \u0444\u0430\u0439\u043b \u0441\u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0441\u043f\u0430\u0439\u0434\u0430 \u043a\u04d5\u043d \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u04d5\u0439, \u043a\u04d5\u043d\u04d5 \u0441\u043a\u044a\u043e\u043f\u0438 \u043a\u04d5\u043d \u04d5\u043c\u04d5 \u0431\u0430\u0442\u044b\u0441\u0441 \u0442\u0435\u043a\u0441\u0442 \u0434\u04d5\u0445\u04d5\u0434\u04d5\u0433.", - "pad.impexp.uploadFailed": "\u0411\u0430\u0432\u0433\u04d5\u043d\u044b\u043d \u043d\u04d5 \u0440\u0430\u0443\u0430\u0434, \u0434\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0444\u04d5\u0441\u0442\u04d5\u0434\u04d5\u0440 \u0431\u0430\u0444\u04d5\u043b\u0432\u0430\u0440", - "pad.impexp.importfailed": "\u0418\u043c\u043f\u043e\u0440\u0442 \u043d\u04d5 \u0440\u0430\u0443\u0430\u0434", - "pad.impexp.copypaste": "\u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u043a\u044a\u043e\u043f\u0438 \u043a\u04d5\u043d \u04d5\u043c\u04d5 \u04d5\u0432\u04d5\u0440", - "pad.impexp.exportdisabled": "{{type}} \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0445\u0438\u0446\u04d5\u043d \u0443. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0431\u0430\u0434\u0437\u0443\u0440 \u0434\u04d5 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u043d \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0442\u04d5\u043c \u0444\u044b\u043b\u0434\u04d5\u0440 \u0431\u0430\u0437\u043e\u043d\u044b\u043d\u04d5\u043d." + "@metadata": { + "authors": [ + "Bouron" + ] + }, + "index.newPad": "\u041d\u043e\u0433", + "index.createOpenPad": "\u043a\u04d5\u043d\u04d5 \u0441\u0430\u0440\u0430\u0437/\u0431\u0430\u043a\u04d5\u043d \u043d\u043e\u0433 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0430\u0445\u04d5\u043c \u043d\u043e\u043c\u0438\u043c\u04d5:", + "pad.toolbar.bold.title": "\u0411\u04d5\u0437\u0434\u0436\u044b\u043d (Ctrl-B)", + "pad.toolbar.italic.title": "\u041a\u044a\u04d5\u0434\u0437 (Ctrl-I)", + "pad.toolbar.underline.title": "\u0411\u044b\u043d\u044b\u043b\u0445\u0430\u0445\u0445 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0425\u0430\u0445\u0445", + "pad.toolbar.ol.title": "\u041d\u044b\u043c\u0430\u0434 \u043d\u043e\u043c\u0445\u044b\u0433\u044a\u0434", + "pad.toolbar.ul.title": "\u04d4\u043d\u04d5\u043d\u044b\u043c\u0430\u0434 \u043d\u043e\u043c\u0445\u044b\u0433\u044a\u0434", + "pad.toolbar.indent.title": "\u0425\u0430\u0441\u0442", + "pad.toolbar.unindent.title": "\u04d4\u0442\u0442\u04d5\u043c\u04d5\u0445\u0430\u0441\u0442", + "pad.toolbar.undo.title": "\u0420\u0430\u0437\u0434\u04d5\u0445\u044b\u043d (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0420\u0430\u0446\u0430\u0440\u0430\u0437\u044b\u043d (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5 \u0430\u0439\u0441\u044b\u043d\u04d5\u043d", + "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u0439/\u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u043c", + "pad.toolbar.timeslider.title": "\u0420\u04d5\u0441\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", + "pad.toolbar.savedRevision.title": "\u0424\u04d5\u043b\u0442\u04d5\u0440 \u0431\u0430\u0432\u04d5\u0440\u044b\u043d\u04d5\u043d", + "pad.toolbar.settings.title": "\u0423\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u04d5", + "pad.toolbar.embed.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0444\u0442\u0430\u0443\u044b\u043d", + "pad.toolbar.showusers.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0440\u0445\u0430\u0439\u0434\u0436\u044b\u0442\u044b \u0440\u0430\u0432\u0434\u0438\u0441\u044b\u043d", + "pad.colorpicker.save": "\u041d\u044b\u0432\u00e6\u0440\u044b\u043d", + "pad.colorpicker.cancel": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", + "pad.loading": "\u00c6\u0432\u0433\u00e6\u0434 \u0446\u00e6\u0443\u044b...", + "pad.passwordRequired": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u0440\u044b\u0432\u043d\u0430\u043b\u044b\u043d\u04d5\u043d \u0434\u04d5 \u0445\u044a\u04d5\u0443\u044b \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.permissionDenied": "\u0414\u04d5\u0443\u04d5\u043d \u043d\u04d5\u0439 \u0431\u0430\u0440 \u0430\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u0440\u044b\u0432\u043d\u0430\u043b\u044b\u043d", + "pad.wrongPassword": "\u0414\u04d5 \u043f\u0430\u0440\u043e\u043b\u044c \u0440\u0430\u0441\u0442 \u043d\u04d5\u0443", + "pad.settings.padSettings": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u044b\u0442\u04d5", + "pad.settings.myView": "\u041c\u04d5 \u0443\u044b\u043d\u0434", + "pad.settings.stickychat": "\u041d\u044b\u0445\u0430\u0441 \u0430\u043b\u043a\u0443\u044b\u0434\u04d5\u0440 \u04d5\u0432\u0434\u0438\u0441\u044b\u043d", + "pad.settings.colorcheck": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u0445\u0443\u044b\u0437\u0442\u04d5", + "pad.settings.linenocheck": "\u0420\u04d5\u043d\u0445\u044a\u044b\u0442\u044b \u043d\u043e\u043c\u044b\u0440\u0442\u04d5", + "pad.settings.rtlcheck": "\u041c\u0438\u0434\u0438\u0441 \u0440\u0430\u0445\u0438\u0437\u04d5\u0439 \u0433\u0430\u043b\u0438\u0443\u043c\u04d5 \u0445\u044a\u04d5\u0443\u044b \u0444\u04d5\u0440\u0441\u044b\u043d?", + "pad.settings.fontType": "\u0428\u0440\u0438\u0444\u0442\u044b \u0445\u0443\u044b\u0437:", + "pad.settings.fontType.normal": "\u0425\u0443\u044b\u043c\u04d5\u0442\u04d5\u0433", + "pad.settings.fontType.monospaced": "\u04d4\u043c\u0443\u04d5\u0440\u04d5\u0445", + "pad.settings.globalView": "\u0418\u0443\u0443\u044b\u043b\u044b \u0443\u044b\u043d\u0434", + "pad.settings.language": "\u00c6\u0432\u0437\u0430\u0433:", + "pad.importExport.import_export": "\u0418\u043c\u043f\u043e\u0440\u0442/\u044d\u043a\u0441\u043f\u043e\u0440\u0442", + "pad.importExport.import": "\u0418\u0441\u0442\u044b \u0442\u0435\u043a\u0441\u0442 \u0444\u0430\u0439\u043b \u043a\u04d5\u043d\u04d5 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", + "pad.importExport.importSuccessful": "\u04d4\u043d\u0442\u044b\u0441\u0442!", + "pad.importExport.export": "\u041d\u044b\u0440\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u044d\u043a\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u043a\u0443\u044b\u0434:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u0425\u0443\u044b\u043c\u00e6\u0442\u00e6\u0433 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u0414\u04d5 \u0431\u043e\u043d \u0443 \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u04d5\u0440\u043c\u04d5\u0441\u0442 \u0445\u0443\u044b\u043c\u04d5\u0442\u04d5\u0433 \u0442\u0435\u043a\u0441\u0442 \u043a\u04d5\u043d\u04d5 html \u0444\u043e\u0440\u043c\u0430\u0442\u04d5\u0439. \u041b\u04d5\u043c\u0431\u044b\u043d\u04d5\u0433 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u043c\u0438\u043d\u0438\u0443\u0434\u0436\u044b\u0442\u04d5\u043d, \u0434\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u0441\u04d5\u0432\u04d5\u0440 abiword\u003C/a\u003E.", + "pad.modals.connected": "\u0418\u0443\u0433\u043e\u043d\u0434.", + "pad.modals.reconnecting": "\u0414\u04d5 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u043d\u043e\u0433\u04d5\u0439 \u0438\u0443\u0433\u043e\u043d\u0434 \u0446\u04d5\u0443\u044b..", + "pad.modals.forcereconnect": "\u0422\u044b\u0445\u0445\u04d5\u0439 \u0431\u0430\u0438\u0443 \u043a\u04d5\u043d\u044b\u043d", + "pad.modals.userdup": "\u041d\u043e\u0433 \u0440\u0443\u0434\u0437\u044b\u043d\u0434\u0436\u044b \u0431\u0430\u043a\u04d5\u043d\u044b\u043d", + "pad.modals.userdup.explanation": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u04d5\u0432\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0430\u0446\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0438\u0443\u04d5\u0439 \u0444\u044b\u043b\u0434\u04d5\u0440 \u0440\u0443\u0434\u0437\u044b\u043d\u0434\u0436\u044b \u0443 \u0433\u043e\u043c.", + "pad.modals.userdup.advice": "\u041d\u043e\u0433\u04d5\u0439 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d, \u0430\u0446\u044b \u0440\u0443\u0434\u0437\u044b\u043d\u0433\u04d5\u0439 \u0430\u0440\u0445\u0430\u0439\u044b\u043d\u044b \u0431\u04d5\u0441\u0442\u044b.", + "pad.modals.unauth": "\u041d\u04d5 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0433\u043e\u043d\u0434", + "pad.modals.unauth.explanation": "\u0414\u04d5 \u0431\u0430\u0440\u0442\u04d5 \u0444\u04d5\u0438\u0432\u0442\u043e\u0439, \u0446\u0430\u043b\u044b\u043d\u043c\u04d5 \u0434\u044b \u0430\u0446\u044b \u0444\u0430\u0440\u0441 \u043a\u0430\u0441\u0442\u04d5. \u0411\u0430\u0444\u04d5\u043b\u0432\u0430\u0440 \u043d\u043e\u0433\u04d5\u0439 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d.", + "pad.modals.looping": "\u0425\u0438\u0446\u04d5\u043d.", + "pad.modals.looping.explanation": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0439\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0438\u043c\u04d5 \u0431\u0430\u0438\u0443 \u043a\u04d5\u043d\u044b\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u04d5.", + "pad.modals.looping.cause": "\u0423\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0434\u044b \u0431\u0430\u0438\u0443 \u0434\u04d5 \u04d5\u043d\u04d5\u043c\u0431\u04d5\u043b\u0433\u04d5 \u0444\u0430\u0439\u0440\u0432\u043e\u043b \u043a\u04d5\u043d\u04d5 \u043f\u0440\u043e\u043a\u0441\u0438\u0439\u044b \u0443\u044b\u043b\u0442\u044b.", + "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0431\u0430\u0438\u0443\u0433\u04d5\u043d\u04d5\u043d \u043d\u04d5\u0439.", + "pad.modals.initsocketfail.explanation": "\u041d\u04d5 \u0440\u0430\u0443\u0430\u0434\u0438\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0439\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d.", + "pad.modals.initsocketfail.cause": "\u0410\u0439 \u0443\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0434\u04d5 \u0441\u0433\u0430\u0440\u04d5\u043d \u043a\u04d5\u043d\u04d5 \u0434\u04d5 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u044b \u0442\u044b\u0445\u0445\u04d5\u0439 \u0443.", + "pad.modals.slowcommit": "\u0425\u0438\u0446\u04d5\u043d\u0433\u043e\u043d\u0434.", + "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u04d5 \u0434\u0437\u0443\u0430\u043f\u043f \u043a\u04d5\u043d\u044b.", + "pad.modals.slowcommit.cause": "\u0410\u0439 \u0433\u04d5\u043d\u04d5\u043d \u0438\u0441 \u0443 \u0445\u044b\u0437\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u04d5\u0439\u044b \u0442\u044b\u0445\u0445\u04d5\u0439.", + "pad.modals.deleted": "\u0425\u0430\u0444\u0442.", + "pad.modals.deleted.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0445\u0430\u0444\u0442 \u04d5\u0440\u0446\u044b\u0434.", + "pad.modals.disconnected": "\u0414\u044b \u0445\u0438\u0446\u04d5\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434\u0442\u04d5.", + "pad.modals.disconnected.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440\u0438\u043c\u04d5 \u0438\u0443\u0433\u043e\u043d\u0434 \u0444\u0435\u0441\u04d5\u0444\u0442\u0438\u0441", + "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0433\u04d5\u043d\u04d5\u043d \u0438\u0441 \u0431\u0430\u0438\u0443\u0433\u04d5\u043d\u04d5\u043d \u043d\u04d5\u0439. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0444\u0435\u0445\u044a\u0443\u0441\u044b\u043d \u043d\u044b\u043d \u04d5\u0439 \u043a\u04d5\u043d, \u043a\u04d5\u0434 \u0430\u0444\u0442\u04d5 \u0434\u0430\u0440\u0434\u0434\u04d5\u0440 \u043a\u04d5\u043d\u0430.", + "pad.share": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u0439\u0443\u0430\u0440\u044b\u043d", + "pad.share.readonly": "\u04d4\u0440\u043c\u04d5\u0441\u0442 \u0444\u04d5\u0440\u0441\u044b\u043d\u04d5\u043d", + "pad.share.link": "\u04d4\u0440\u0432\u0438\u0442\u04d5\u043d", + "pad.share.emebdcode": "URL \u0431\u0430\u0432\u04d5\u0440\u044b\u043d", + "pad.chat": "\u041d\u044b\u0445\u0430\u0441", + "pad.chat.title": "\u041e\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u043d \u0447\u0430\u0442 \u0431\u0430\u043a\u04d5\u043d.", + "pad.chat.loadmessages": "\u0424\u044b\u043b\u0434\u04d5\u0440 \u0444\u044b\u0441\u0442\u04d5\u0433 \u0440\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", + "timeslider.pageTitle": "{{appTitle}}-\u044b \u0440\u04d5\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", + "timeslider.toolbar.returnbutton": "\u0424\u04d5\u0441\u0442\u04d5\u043c\u04d5, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5", + "timeslider.toolbar.authors": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5:", + "timeslider.toolbar.authorsList": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5 \u043d\u04d5\u0439", + "timeslider.toolbar.exportlink.title": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442", + "timeslider.exportCurrent": "\u0421\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u043d\u044b\u0440\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043a\u0443\u044b\u0434:", + "timeslider.version": "\u0412\u0435\u0440\u0441\u0438 {{version}}", + "timeslider.saved": "\u04d4\u0432\u04d5\u0440\u0434 \u04d5\u0440\u0446\u044b\u0434 {{year}}-\u04d5\u043c \u0430\u0437\u044b, {{day}}-\u04d5\u043c {{month}}-\u044b", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u044f\u043d\u0432\u0430\u0440\u044c", + "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0430\u043b\u044c", + "timeslider.month.march": "\u043c\u0430\u0440\u0442\u044a\u0438", + "timeslider.month.april": "\u0430\u043f\u0440\u0435\u043b\u044c", + "timeslider.month.may": "\u043c\u0430\u0439", + "timeslider.month.june": "\u0438\u044e\u043d\u044c", + "timeslider.month.july": "\u0438\u044e\u043b\u044c", + "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", + "timeslider.month.september": "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c", + "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", + "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", + "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", + "timeslider.unnamedauthor": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0433", + "timeslider.unnamedauthors": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b", + "pad.savedrevs.marked": "\u0410\u0446\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0440 \u043a\u0443\u044b\u0434 \u04d5\u0432\u04d5\u0440\u0434 \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0441\u0430\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434", + "pad.userlist.entername": "\u0414\u04d5 \u043d\u043e\u043c \u0431\u0430\u0444\u044b\u0441\u0441", + "pad.userlist.unnamed": "\u04d5\u043d\u04d5\u043d\u043e\u043c", + "pad.userlist.guest": "\u0423\u0430\u0437\u04d5\u0433", + "pad.userlist.deny": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", + "pad.userlist.approve": "\u0421\u0431\u04d5\u043b\u0432\u044b\u0440\u0434 \u043a\u04d5\u043d\u044b\u043d", + "pad.editbar.clearcolors": "\u04d4\u043d\u04d5\u0445\u044a\u04d5\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u0439 \u0445\u044a\u04d5\u0443\u044b \u0430\u0439\u0441\u044b\u043d \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5?", + "pad.impexp.importbutton": "\u0415\u043d\u044b\u0440 \u0441\u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d", + "pad.impexp.importing": "\u0418\u043c\u043f\u043e\u0440\u0442 \u0446\u04d5\u0443\u044b...", + "pad.impexp.confirmimport": "\u0424\u0430\u0439\u043b\u044b \u0438\u043c\u043f\u043e\u0440\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u044b\u0440\u044b \u0442\u0435\u043a\u0441\u0442 \u0431\u044b\u043d\u0442\u043e\u043d \u0444\u04d5\u0438\u0432\u0434\u0437\u04d5\u043d\u0438\u0441. \u04d4\u0446\u04d5\u0433 \u0434\u04d5 \u0444\u04d5\u043d\u0434\u044b \u0443\u044b\u0439 \u0441\u0430\u0440\u0430\u0437\u044b\u043d?", + "pad.impexp.convertFailed": "\u041c\u0430\u0445\u04d5\u043d \u043d\u04d5 \u0431\u043e\u043d \u043d\u0435 \u0441\u0441\u0438\u0441 \u0430\u0446\u044b \u0444\u0430\u0439\u043b \u0441\u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0441\u043f\u0430\u0439\u0434\u0430 \u043a\u04d5\u043d \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u04d5\u0439, \u043a\u04d5\u043d\u04d5 \u0441\u043a\u044a\u043e\u043f\u0438 \u043a\u04d5\u043d \u04d5\u043c\u04d5 \u0431\u0430\u0442\u044b\u0441\u0441 \u0442\u0435\u043a\u0441\u0442 \u0434\u04d5\u0445\u04d5\u0434\u04d5\u0433.", + "pad.impexp.uploadFailed": "\u0411\u0430\u0432\u0433\u04d5\u043d\u044b\u043d \u043d\u04d5 \u0440\u0430\u0443\u0430\u0434, \u0434\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0444\u04d5\u0441\u0442\u04d5\u0434\u04d5\u0440 \u0431\u0430\u0444\u04d5\u043b\u0432\u0430\u0440", + "pad.impexp.importfailed": "\u0418\u043c\u043f\u043e\u0440\u0442 \u043d\u04d5 \u0440\u0430\u0443\u0430\u0434", + "pad.impexp.copypaste": "\u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u043a\u044a\u043e\u043f\u0438 \u043a\u04d5\u043d \u04d5\u043c\u04d5 \u04d5\u0432\u04d5\u0440", + "pad.impexp.exportdisabled": "{{type}} \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0445\u0438\u0446\u04d5\u043d \u0443. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0431\u0430\u0434\u0437\u0443\u0440 \u0434\u04d5 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u043d \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0442\u04d5\u043c \u0444\u044b\u043b\u0434\u04d5\u0440 \u0431\u0430\u0437\u043e\u043d\u044b\u043d\u04d5\u043d." } \ No newline at end of file diff --git a/src/locales/pl.json b/src/locales/pl.json index 6a46dd77..98d73e38 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -1,122 +1,123 @@ { - "@metadata": { - "authors": { - "0": "Rezonansowy", - "2": "WTM", - "3": "Woytecr" - } - }, - "index.newPad": "Nowy Dokument", - "index.createOpenPad": "lub stw\u00f3rz\/otw\u00f3rz dokument o nazwie:", - "pad.toolbar.bold.title": "Pogrubienie (Ctrl-B)", - "pad.toolbar.italic.title": "Kursywa (Ctrl-I)", - "pad.toolbar.underline.title": "Podkre\u015blenie (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Przekre\u015blenie", - "pad.toolbar.ol.title": "Lista uporz\u0105dkowana", - "pad.toolbar.ul.title": "Lista nieuporz\u0105dkowana", - "pad.toolbar.indent.title": "Wci\u0119cie", - "pad.toolbar.unindent.title": "Zmniejsz wci\u0119cie", - "pad.toolbar.undo.title": "Cofnij (Ctrl-Z)", - "pad.toolbar.redo.title": "Pon\u00f3w (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Usu\u0144 kolory autor\u00f3w", - "pad.toolbar.import_export.title": "Import\/eksport z\/do r\u00f3\u017cnych format\u00f3w plik\u00f3w", - "pad.toolbar.timeslider.title": "O\u015b czasu", - "pad.toolbar.savedRevision.title": "Zapisz wersj\u0119", - "pad.toolbar.settings.title": "Ustawienia", - "pad.toolbar.embed.title": "Umie\u015b\u0107 ten Notatnik", - "pad.toolbar.showusers.title": "Poka\u017c u\u017cytkownik\u00f3w", - "pad.colorpicker.save": "Zapisz", - "pad.colorpicker.cancel": "Anuluj", - "pad.loading": "\u0141adowanie...", - "pad.passwordRequired": "Musisz poda\u0107 has\u0142o aby uzyska\u0107 dost\u0119p do tego dokumentu", - "pad.permissionDenied": "Nie masz uprawnie\u0144 dost\u0119pu do tego dokumentu", - "pad.wrongPassword": "Nieprawid\u0142owe has\u0142o", - "pad.settings.padSettings": "Ustawienia dokumentu", - "pad.settings.myView": "M\u00f3j widok", - "pad.settings.stickychat": "Czat zawsze na ekranie", - "pad.settings.colorcheck": "Kolory autorstwa", - "pad.settings.linenocheck": "Numery linii", - "pad.settings.fontType": "Rodzaj czcionki:", - "pad.settings.fontType.normal": "Normalna", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Widok og\u00f3lny", - "pad.settings.language": "J\u0119zyk:", - "pad.importExport.import_export": "Import\/eksport", - "pad.importExport.import": "Prze\u015blij dowolny plik tekstowy lub dokument", - "pad.importExport.importSuccessful": "Sukces!", - "pad.importExport.export": "Eksportuj bie\u017c\u0105cy dokument jako:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Zwyk\u0142y tekst", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Mo\u017cesz importowa\u0107 pliki tylko w formacie zwyk\u0142ego tekstu lub html. Aby umo\u017cliwi\u0107 bardziej zaawansowane funkcje importu, zainstaluj abiword<\/a>.", - "pad.modals.connected": "Po\u0142\u0105czony.", - "pad.modals.reconnecting": "Ponowne \u0142\u0105czenie z dokumentem...", - "pad.modals.forcereconnect": "Wymu\u015b ponowne po\u0142\u0105czenie", - "pad.modals.userdup": "Otwarty w innym oknie", - "pad.modals.userdup.explanation": "Ten dokument prawdopodobnie zosta\u0142 otwarty w wi\u0119cej ni\u017c jednym oknie przegl\u0105darki.", - "pad.modals.userdup.advice": "Po\u0142\u0105cz ponownie przy u\u017cyciu tego okna.", - "pad.modals.unauth": "Brak autoryzacji", - "pad.modals.unauth.explanation": "Twoje uprawnienia uleg\u0142y zmianie podczas przegl\u0105dania tej strony. Spr\u00f3buj ponownie si\u0119 po\u0142\u0105czy\u0107.", - "pad.modals.looping": "Roz\u0142\u0105czony.", - "pad.modals.looping.explanation": "Wyst\u0105pi\u0142y problemy z komunikacj\u0105 z serwerem synchronizacji.", - "pad.modals.looping.cause": "By\u0107 mo\u017ce jeste\u015b po\u0142\u0105czony przez niezgodn\u0105 zapor\u0119 lub serwer proxy.", - "pad.modals.initsocketfail": "Serwer jest nieosi\u0105galny.", - "pad.modals.initsocketfail.explanation": "Nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 z serwerem synchronizacji.", - "pad.modals.initsocketfail.cause": "Przyczyn\u0105 s\u0105 prawdopodobnie problemy z przegl\u0105darka lub po\u0142\u0105czeniem z internetem.", - "pad.modals.slowcommit": "Roz\u0142\u0105czony.", - "pad.modals.slowcommit.explanation": "Serwer nie odpowiada.", - "pad.modals.slowcommit.cause": "Mo\u017ce by\u0107 to spowodowane problemami z Twoim po\u0142\u0105czeniem z sieci\u0105.", - "pad.modals.deleted": "Usuni\u0119to.", - "pad.modals.deleted.explanation": "Ten dokument zosta\u0142 usuni\u0119ty.", - "pad.modals.disconnected": "Zosta\u0142e\u015b roz\u0142\u0105czony.", - "pad.modals.disconnected.explanation": "Utracono po\u0142\u0105czenie z serwerem", - "pad.modals.disconnected.cause": "Serwer mo\u017ce by\u0107 niedost\u0119pny. Poinformuj nas je\u017celi problem b\u0119dzie si\u0119 powtarza\u0142.", - "pad.share": "Udost\u0119pnij ten dokument", - "pad.share.readonly": "Tylko do odczytu", - "pad.share.link": "Link", - "pad.share.emebdcode": "Kod do umieszczenia", - "pad.chat": "Czat", - "pad.chat.title": "Otw\u00f3rz czat dla tego dokumentu.", - "pad.chat.loadmessages": "Za\u0142aduj wi\u0119cej wiadomo\u015bci", - "timeslider.pageTitle": "O\u015b czasu {{appTitle}}", - "timeslider.toolbar.returnbutton": "Powr\u00f3\u0107 do dokumentu", - "timeslider.toolbar.authors": "Autorzy:", - "timeslider.toolbar.authorsList": "Brak autor\u00f3w", - "timeslider.toolbar.exportlink.title": "Eksportuj", - "timeslider.exportCurrent": "Eksportuj bie\u017c\u0105c\u0105 wersj\u0119 jako:", - "timeslider.version": "Wersja {{version}}", - "timeslider.saved": "Zapisano {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Stycze\u0144", - "timeslider.month.february": "Luty", - "timeslider.month.march": "Marzec", - "timeslider.month.april": "Kwiecie\u0144", - "timeslider.month.may": "Maj", - "timeslider.month.june": "Czerwiec", - "timeslider.month.july": "Lipiec", - "timeslider.month.august": "Sierpie\u0144", - "timeslider.month.september": "Wrzesie\u0144", - "timeslider.month.october": "Pa\u017adziernik", - "timeslider.month.november": "Listopad", - "timeslider.month.december": "Grudzie\u0144", - "timeslider.unnamedauthor": "{{num}} nienazwany autor", - "timeslider.unnamedauthors": "{{num}} autor\u00f3w bez nazw", - "pad.savedrevs.marked": "Ta wersja zosta\u0142a w\u0142a\u015bnie oznaczona jako zapisana.", - "pad.userlist.entername": "Wprowad\u017a swoj\u0105 nazw\u0119", - "pad.userlist.unnamed": "bez nazwy", - "pad.userlist.guest": "Go\u015b\u0107", - "pad.userlist.deny": "Zabro\u0144", - "pad.userlist.approve": "Akceptuj", - "pad.editbar.clearcolors": "Wyczy\u015bci\u0107 kolory autorstwa w ca\u0142ym dokumencie?", - "pad.impexp.importbutton": "Importuj teraz", - "pad.impexp.importing": "Importowanie...", - "pad.impexp.confirmimport": "Importowanie pliku spowoduje zast\u0105pienie bie\u017c\u0105cego tekstu. Czy na pewno chcesz kontynuowa\u0107?", - "pad.impexp.convertFailed": "Nie byli\u015bmy w stanie zaimportowa\u0107 tego pliku. Prosz\u0119 u\u017cy\u0107 innego formatu dokumentu lub skopiowa\u0107 i wklei\u0107 r\u0119cznie", - "pad.impexp.uploadFailed": "Przesy\u0142anie nie powiod\u0142o si\u0119, prosz\u0119 spr\u00f3bowa\u0107 jeszcze raz", - "pad.impexp.importfailed": "Importowanie nie powiod\u0142o si\u0119", - "pad.impexp.copypaste": "Prosz\u0119 skopiowa\u0107 i wklei\u0107", - "pad.impexp.exportdisabled": "Eksport do formatu {{type}} jest wy\u0142\u0105czony. Prosz\u0119 skontaktowa\u0107 si\u0119 z administratorem aby uzyska\u0107 wi\u0119cej szczeg\u00f3\u0142\u00f3w." + "@metadata": { + "authors": { + "0": "Rezonansowy", + "2": "WTM", + "3": "Woytecr" + } + }, + "index.newPad": "Nowy Dokument", + "index.createOpenPad": "lub stw\u00f3rz/otw\u00f3rz dokument o nazwie:", + "pad.toolbar.bold.title": "Pogrubienie (Ctrl-B)", + "pad.toolbar.italic.title": "Kursywa (Ctrl-I)", + "pad.toolbar.underline.title": "Podkre\u015blenie (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Przekre\u015blenie", + "pad.toolbar.ol.title": "Lista uporz\u0105dkowana", + "pad.toolbar.ul.title": "Lista nieuporz\u0105dkowana", + "pad.toolbar.indent.title": "Wci\u0119cie", + "pad.toolbar.unindent.title": "Zmniejsz wci\u0119cie", + "pad.toolbar.undo.title": "Cofnij (Ctrl-Z)", + "pad.toolbar.redo.title": "Pon\u00f3w (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Usu\u0144 kolory autor\u00f3w", + "pad.toolbar.import_export.title": "Import/eksport z/do r\u00f3\u017cnych format\u00f3w plik\u00f3w", + "pad.toolbar.timeslider.title": "O\u015b czasu", + "pad.toolbar.savedRevision.title": "Zapisz wersj\u0119", + "pad.toolbar.settings.title": "Ustawienia", + "pad.toolbar.embed.title": "Umie\u015b\u0107 ten Notatnik", + "pad.toolbar.showusers.title": "Poka\u017c u\u017cytkownik\u00f3w", + "pad.colorpicker.save": "Zapisz", + "pad.colorpicker.cancel": "Anuluj", + "pad.loading": "\u0141adowanie...", + "pad.passwordRequired": "Musisz poda\u0107 has\u0142o aby uzyska\u0107 dost\u0119p do tego dokumentu", + "pad.permissionDenied": "Nie masz uprawnie\u0144 dost\u0119pu do tego dokumentu", + "pad.wrongPassword": "Nieprawid\u0142owe has\u0142o", + "pad.settings.padSettings": "Ustawienia dokumentu", + "pad.settings.myView": "M\u00f3j widok", + "pad.settings.stickychat": "Czat zawsze na ekranie", + "pad.settings.colorcheck": "Kolory autorstwa", + "pad.settings.linenocheck": "Numery linii", + "pad.settings.rtlcheck": "Czytasz tre\u015b\u0107 od prawej do lewej?", + "pad.settings.fontType": "Rodzaj czcionki:", + "pad.settings.fontType.normal": "Normalna", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Widok og\u00f3lny", + "pad.settings.language": "J\u0119zyk:", + "pad.importExport.import_export": "Import/eksport", + "pad.importExport.import": "Prze\u015blij dowolny plik tekstowy lub dokument", + "pad.importExport.importSuccessful": "Sukces!", + "pad.importExport.export": "Eksportuj bie\u017c\u0105cy dokument jako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Zwyk\u0142y tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Mo\u017cesz importowa\u0107 pliki tylko w formacie zwyk\u0142ego tekstu lub html. Aby umo\u017cliwi\u0107 bardziej zaawansowane funkcje importu, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Ezainstaluj abiword\u003C/a\u003E.", + "pad.modals.connected": "Po\u0142\u0105czony.", + "pad.modals.reconnecting": "Ponowne \u0142\u0105czenie z dokumentem...", + "pad.modals.forcereconnect": "Wymu\u015b ponowne po\u0142\u0105czenie", + "pad.modals.userdup": "Otwarty w innym oknie", + "pad.modals.userdup.explanation": "Ten dokument prawdopodobnie zosta\u0142 otwarty w wi\u0119cej ni\u017c jednym oknie przegl\u0105darki.", + "pad.modals.userdup.advice": "Po\u0142\u0105cz ponownie przy u\u017cyciu tego okna.", + "pad.modals.unauth": "Brak autoryzacji", + "pad.modals.unauth.explanation": "Twoje uprawnienia uleg\u0142y zmianie podczas przegl\u0105dania tej strony. Spr\u00f3buj ponownie si\u0119 po\u0142\u0105czy\u0107.", + "pad.modals.looping": "Roz\u0142\u0105czony.", + "pad.modals.looping.explanation": "Wyst\u0105pi\u0142y problemy z komunikacj\u0105 z serwerem synchronizacji.", + "pad.modals.looping.cause": "By\u0107 mo\u017ce jeste\u015b po\u0142\u0105czony przez niezgodn\u0105 zapor\u0119 lub serwer proxy.", + "pad.modals.initsocketfail": "Serwer jest nieosi\u0105galny.", + "pad.modals.initsocketfail.explanation": "Nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 z serwerem synchronizacji.", + "pad.modals.initsocketfail.cause": "Przyczyn\u0105 s\u0105 prawdopodobnie problemy z przegl\u0105darka lub po\u0142\u0105czeniem z internetem.", + "pad.modals.slowcommit": "Roz\u0142\u0105czony.", + "pad.modals.slowcommit.explanation": "Serwer nie odpowiada.", + "pad.modals.slowcommit.cause": "Mo\u017ce by\u0107 to spowodowane problemami z Twoim po\u0142\u0105czeniem z sieci\u0105.", + "pad.modals.deleted": "Usuni\u0119to.", + "pad.modals.deleted.explanation": "Ten dokument zosta\u0142 usuni\u0119ty.", + "pad.modals.disconnected": "Zosta\u0142e\u015b roz\u0142\u0105czony.", + "pad.modals.disconnected.explanation": "Utracono po\u0142\u0105czenie z serwerem", + "pad.modals.disconnected.cause": "Serwer mo\u017ce by\u0107 niedost\u0119pny. Poinformuj nas je\u017celi problem b\u0119dzie si\u0119 powtarza\u0142.", + "pad.share": "Udost\u0119pnij ten dokument", + "pad.share.readonly": "Tylko do odczytu", + "pad.share.link": "Link", + "pad.share.emebdcode": "Kod do umieszczenia", + "pad.chat": "Czat", + "pad.chat.title": "Otw\u00f3rz czat dla tego dokumentu.", + "pad.chat.loadmessages": "Za\u0142aduj wi\u0119cej wiadomo\u015bci", + "timeslider.pageTitle": "O\u015b czasu {{appTitle}}", + "timeslider.toolbar.returnbutton": "Powr\u00f3\u0107 do dokumentu", + "timeslider.toolbar.authors": "Autorzy:", + "timeslider.toolbar.authorsList": "Brak autor\u00f3w", + "timeslider.toolbar.exportlink.title": "Eksportuj", + "timeslider.exportCurrent": "Eksportuj bie\u017c\u0105c\u0105 wersj\u0119 jako:", + "timeslider.version": "Wersja {{version}}", + "timeslider.saved": "Zapisano {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Stycze\u0144", + "timeslider.month.february": "Luty", + "timeslider.month.march": "Marzec", + "timeslider.month.april": "Kwiecie\u0144", + "timeslider.month.may": "Maj", + "timeslider.month.june": "Czerwiec", + "timeslider.month.july": "Lipiec", + "timeslider.month.august": "Sierpie\u0144", + "timeslider.month.september": "Wrzesie\u0144", + "timeslider.month.october": "Pa\u017adziernik", + "timeslider.month.november": "Listopad", + "timeslider.month.december": "Grudzie\u0144", + "timeslider.unnamedauthor": "{{num}} nienazwany autor", + "timeslider.unnamedauthors": "{{num}} autor\u00f3w bez nazw", + "pad.savedrevs.marked": "Ta wersja zosta\u0142a w\u0142a\u015bnie oznaczona jako zapisana.", + "pad.userlist.entername": "Wprowad\u017a swoj\u0105 nazw\u0119", + "pad.userlist.unnamed": "bez nazwy", + "pad.userlist.guest": "Go\u015b\u0107", + "pad.userlist.deny": "Zabro\u0144", + "pad.userlist.approve": "Akceptuj", + "pad.editbar.clearcolors": "Wyczy\u015bci\u0107 kolory autorstwa w ca\u0142ym dokumencie?", + "pad.impexp.importbutton": "Importuj teraz", + "pad.impexp.importing": "Importowanie...", + "pad.impexp.confirmimport": "Importowanie pliku spowoduje zast\u0105pienie bie\u017c\u0105cego tekstu. Czy na pewno chcesz kontynuowa\u0107?", + "pad.impexp.convertFailed": "Nie byli\u015bmy w stanie zaimportowa\u0107 tego pliku. Prosz\u0119 u\u017cy\u0107 innego formatu dokumentu lub skopiowa\u0107 i wklei\u0107 r\u0119cznie", + "pad.impexp.uploadFailed": "Przesy\u0142anie nie powiod\u0142o si\u0119, prosz\u0119 spr\u00f3bowa\u0107 jeszcze raz", + "pad.impexp.importfailed": "Importowanie nie powiod\u0142o si\u0119", + "pad.impexp.copypaste": "Prosz\u0119 skopiowa\u0107 i wklei\u0107", + "pad.impexp.exportdisabled": "Eksport do formatu {{type}} jest wy\u0142\u0105czony. Prosz\u0119 skontaktowa\u0107 si\u0119 z administratorem aby uzyska\u0107 wi\u0119cej szczeg\u00f3\u0142\u00f3w." } \ No newline at end of file diff --git a/src/locales/ps.json b/src/locales/ps.json index b992a56a..07dd4375 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -1,53 +1,53 @@ { - "@metadata": { - "authors": [ - "Ahmed-Najib-Biabani-Ibrahimkhel" - ] - }, - "pad.toolbar.bold.title": "\u0632\u063a\u0631\u062f (Ctrl-B)", - "pad.toolbar.italic.title": "\u0631\u06d0\u0648\u0646\u062f (Ctrl-I)", - "pad.toolbar.undo.title": "\u0646\u0627\u06a9\u0693\u0644 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0628\u064a\u0627\u06a9\u0693\u0644 (Ctrl-Y)", - "pad.toolbar.settings.title": "\u0627\u0645\u0633\u062a\u0646\u06d0", - "pad.colorpicker.save": "\u062e\u0648\u0646\u062f\u064a \u06a9\u0648\u0644", - "pad.colorpicker.cancel": "\u0646\u0627\u06ab\u0627\u0631\u0644", - "pad.loading": "\u0628\u0631\u0633\u06d0\u0631\u06d0\u062f\u0646\u06d0 \u06a9\u06d0 \u062f\u06cc...", - "pad.wrongPassword": "\u067e\u067c\u0646\u0648\u0645 \u0645\u0648 \u0633\u0645 \u0646\u0647 \u0648", - "pad.settings.myView": "\u0632\u0645\u0627 \u06a9\u062a\u0646\u0647", - "pad.settings.fontType": "\u0644\u064a\u06a9\u0628\u06bc\u06d0 \u0689\u0648\u0644:", - "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", - "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648\u0633\u067e\u06d0\u0633", - "pad.settings.globalView": "\u0646\u0693\u06d0\u0648\u0627\u0644\u0647 \u069a\u06a9\u0627\u0631\u06d0\u062f\u0646\u0647", - "pad.settings.language": "\u0698\u0628\u0647:", - "pad.importExport.importSuccessful": "\u0628\u0631\u064a\u0627\u0644\u06cc \u0634\u0648!", - "pad.importExport.exporthtml": "\u0627\u0686 \u067c\u064a \u0627\u0645 \u0627\u06d0\u0644", - "pad.importExport.exportplain": "\u0633\u0627\u062f\u0647 \u0645\u062a\u0646", - "pad.importExport.exportword": "\u0645\u0627\u064a\u06a9\u0631\u0648\u0633\u0627\u0641\u067c \u0648\u0631\u0689", - "pad.importExport.exportpdf": "\u067e\u064a \u0689\u064a \u0627\u06d0\u0641", - "pad.importExport.exportopen": "ODF (\u0627\u0648\u067e\u0646 \u0689\u0627\u06a9\u0648\u0645\u0646\u067c \u0641\u0627\u0631\u0645\u067c)", - "pad.modals.deleted": "\u0693\u0646\u06ab \u0634\u0648.", - "pad.share.readonly": "\u064a\u0648\u0627\u0632\u06d0 \u0644\u0648\u0633\u062a\u0646\u0647", - "pad.share.link": "\u062a\u0693\u0646\u0647", - "pad.share.emebdcode": "\u064a\u0648 \u0622\u0631 \u0627\u06d0\u0644 \u067c\u0648\u0645\u0628\u0644", - "pad.chat": "\u0628\u0627\u0646\u0689\u0627\u0631", - "pad.chat.loadmessages": "\u0646\u0648\u0631 \u067e\u064a\u063a\u0627\u0645\u0648\u0646\u0647 \u0628\u0631\u0633\u06d0\u0631\u0648\u0644", - "timeslider.toolbar.authors": "\u0644\u064a\u06a9\u0648\u0627\u0644:", - "timeslider.toolbar.authorsList": "\u0628\u06d0 \u0644\u064a\u06a9\u0648\u0627\u0644\u0647", - "timeslider.month.january": "\u062c\u0646\u0648\u0631\u064a", - "timeslider.month.february": "\u0641\u0628\u0631\u0648\u0631\u064a", - "timeslider.month.march": "\u0645\u0627\u0631\u0686", - "timeslider.month.april": "\u0627\u067e\u0631\u06d0\u0644", - "timeslider.month.may": "\u0645\u06cd", - "timeslider.month.june": "\u062c\u0648\u0646", - "timeslider.month.july": "\u062c\u0648\u0644\u0627\u06cc", - "timeslider.month.august": "\u0627\u06ab\u0633\u067c", - "timeslider.month.september": "\u0633\u06d0\u067e\u062a\u0645\u0628\u0631", - "timeslider.month.october": "\u0627\u06a9\u062a\u0648\u0628\u0631", - "timeslider.month.november": "\u0646\u0648\u0645\u0628\u0631", - "timeslider.month.december": "\u0689\u064a\u0633\u0645\u0628\u0631", - "pad.userlist.entername": "\u0646\u0648\u0645 \u0645\u0648 \u0648\u0631\u06a9\u0693\u06cd", - "pad.userlist.unnamed": "\u0628\u06d0 \u0646\u0648\u0645\u0647", - "pad.userlist.guest": "\u0645\u06d0\u0644\u0645\u0647", - "pad.userlist.deny": "\u0631\u062f\u0648\u0644", - "pad.userlist.approve": "\u0645\u0646\u0644" + "@metadata": { + "authors": [ + "Ahmed-Najib-Biabani-Ibrahimkhel" + ] + }, + "pad.toolbar.bold.title": "\u0632\u063a\u0631\u062f (Ctrl-B)", + "pad.toolbar.italic.title": "\u0631\u06d0\u0648\u0646\u062f (Ctrl-I)", + "pad.toolbar.undo.title": "\u0646\u0627\u06a9\u0693\u0644 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0628\u064a\u0627\u06a9\u0693\u0644 (Ctrl-Y)", + "pad.toolbar.settings.title": "\u0627\u0645\u0633\u062a\u0646\u06d0", + "pad.colorpicker.save": "\u062e\u0648\u0646\u062f\u064a \u06a9\u0648\u0644", + "pad.colorpicker.cancel": "\u0646\u0627\u06ab\u0627\u0631\u0644", + "pad.loading": "\u0628\u0631\u0633\u06d0\u0631\u06d0\u062f\u0646\u06d0 \u06a9\u06d0 \u062f\u06cc...", + "pad.wrongPassword": "\u067e\u067c\u0646\u0648\u0645 \u0645\u0648 \u0633\u0645 \u0646\u0647 \u0648", + "pad.settings.myView": "\u0632\u0645\u0627 \u06a9\u062a\u0646\u0647", + "pad.settings.fontType": "\u0644\u064a\u06a9\u0628\u06bc\u06d0 \u0689\u0648\u0644:", + "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", + "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648\u0633\u067e\u06d0\u0633", + "pad.settings.globalView": "\u0646\u0693\u06d0\u0648\u0627\u0644\u0647 \u069a\u06a9\u0627\u0631\u06d0\u062f\u0646\u0647", + "pad.settings.language": "\u0698\u0628\u0647:", + "pad.importExport.importSuccessful": "\u0628\u0631\u064a\u0627\u0644\u06cc \u0634\u0648!", + "pad.importExport.exporthtml": "\u0627\u0686 \u067c\u064a \u0627\u0645 \u0627\u06d0\u0644", + "pad.importExport.exportplain": "\u0633\u0627\u062f\u0647 \u0645\u062a\u0646", + "pad.importExport.exportword": "\u0645\u0627\u064a\u06a9\u0631\u0648\u0633\u0627\u0641\u067c \u0648\u0631\u0689", + "pad.importExport.exportpdf": "\u067e\u064a \u0689\u064a \u0627\u06d0\u0641", + "pad.importExport.exportopen": "ODF (\u0627\u0648\u067e\u0646 \u0689\u0627\u06a9\u0648\u0645\u0646\u067c \u0641\u0627\u0631\u0645\u067c)", + "pad.modals.deleted": "\u0693\u0646\u06ab \u0634\u0648.", + "pad.share.readonly": "\u064a\u0648\u0627\u0632\u06d0 \u0644\u0648\u0633\u062a\u0646\u0647", + "pad.share.link": "\u062a\u0693\u0646\u0647", + "pad.share.emebdcode": "\u064a\u0648 \u0622\u0631 \u0627\u06d0\u0644 \u067c\u0648\u0645\u0628\u0644", + "pad.chat": "\u0628\u0627\u0646\u0689\u0627\u0631", + "pad.chat.loadmessages": "\u0646\u0648\u0631 \u067e\u064a\u063a\u0627\u0645\u0648\u0646\u0647 \u0628\u0631\u0633\u06d0\u0631\u0648\u0644", + "timeslider.toolbar.authors": "\u0644\u064a\u06a9\u0648\u0627\u0644:", + "timeslider.toolbar.authorsList": "\u0628\u06d0 \u0644\u064a\u06a9\u0648\u0627\u0644\u0647", + "timeslider.month.january": "\u062c\u0646\u0648\u0631\u064a", + "timeslider.month.february": "\u0641\u0628\u0631\u0648\u0631\u064a", + "timeslider.month.march": "\u0645\u0627\u0631\u0686", + "timeslider.month.april": "\u0627\u067e\u0631\u06d0\u0644", + "timeslider.month.may": "\u0645\u06cd", + "timeslider.month.june": "\u062c\u0648\u0646", + "timeslider.month.july": "\u062c\u0648\u0644\u0627\u06cc", + "timeslider.month.august": "\u0627\u06ab\u0633\u067c", + "timeslider.month.september": "\u0633\u06d0\u067e\u062a\u0645\u0628\u0631", + "timeslider.month.october": "\u0627\u06a9\u062a\u0648\u0628\u0631", + "timeslider.month.november": "\u0646\u0648\u0645\u0628\u0631", + "timeslider.month.december": "\u0689\u064a\u0633\u0645\u0628\u0631", + "pad.userlist.entername": "\u0646\u0648\u0645 \u0645\u0648 \u0648\u0631\u06a9\u0693\u06cd", + "pad.userlist.unnamed": "\u0628\u06d0 \u0646\u0648\u0645\u0647", + "pad.userlist.guest": "\u0645\u06d0\u0644\u0645\u0647", + "pad.userlist.deny": "\u0631\u062f\u0648\u0644", + "pad.userlist.approve": "\u0645\u0646\u0644" } \ No newline at end of file diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index e029165d..6ea65f47 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -1,120 +1,122 @@ { - "@metadata": { - "authors": [ - "Tuliouel" - ] - }, - "index.newPad": "Nova Nota", - "index.createOpenPad": "ou criar-abrir uma Nota com o nome:", - "pad.toolbar.bold.title": "Negrito (Ctrl-B)", - "pad.toolbar.italic.title": "It\u00e1lico (Ctrl-I)", - "pad.toolbar.underline.title": "Sublinhar (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Tachado", - "pad.toolbar.ol.title": "Lista ordenada", - "pad.toolbar.ul.title": "Lista n\u00e3o ordenada", - "pad.toolbar.indent.title": "Aumentar Recuo", - "pad.toolbar.unindent.title": "Diminuir Recuo", - "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", - "pad.toolbar.redo.title": "Refazer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Limpar as cores de identifica\u00e7\u00e3o de autoria", - "pad.toolbar.import_export.title": "Importar\/Exportar de\/para diferentes formatos de arquivo", - "pad.toolbar.timeslider.title": "Linha do tempo", - "pad.toolbar.savedRevision.title": "Salvar revis\u00e3o", - "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", - "pad.toolbar.embed.title": "Incorporar esta Nota", - "pad.toolbar.showusers.title": "Mostrar os usuarios nesta Nota", - "pad.colorpicker.save": "Salvar", - "pad.colorpicker.cancel": "Cancelar", - "pad.loading": "Carregando...", - "pad.passwordRequired": "Voc\u00ea precisa de uma senha para acessar esta Nota", - "pad.permissionDenied": "Voc\u00ea n\u00e3o tem permiss\u00e3o para acessar esta nota", - "pad.wrongPassword": "Senha incorreta", - "pad.settings.padSettings": "Configura\u00e7\u00f5es da Nota", - "pad.settings.myView": "Minha Vis\u00e3o", - "pad.settings.stickychat": "Conversa sempre vis\u00edvel", - "pad.settings.colorcheck": "Cores de autoria", - "pad.settings.linenocheck": "N\u00fameros de linha", - "pad.settings.fontType": "Tipo de fonte:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespa\u00e7ada", - "pad.settings.globalView": "Vis\u00e3o global", - "pad.settings.language": "Idioma:", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Enviar um arquivo texto ou documento", - "pad.importExport.importSuccessful": "Completo!", - "pad.importExport.export": "Exportar a presente nota como:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Texto puro", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Voc\u00ea s\u00f3 pode importar de formatos de texto puro ou html. Para recursos de importa\u00e7\u00e3o mais avan\u00e7ados instale o abiword<\/a>.", - "pad.modals.connected": "Conectado.", - "pad.modals.reconnecting": "Reconectando \u00e0 sua nota...", - "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", - "pad.modals.userdup": "Aberto noutra janela", - "pad.modals.userdup.explanation": "Esta nota parece estar aberta em mais de uma janela de navegador deste computador.", - "pad.modals.userdup.advice": "Reconectar para usar esta janela.", - "pad.modals.unauth": "N\u00e3o autorizado", - "pad.modals.unauth.explanation": "Suas permiss\u00f5es foram mudadas enquanto visualizava esta p\u00e1gina. Tente reconectar.", - "pad.modals.looping": "Reconectado.", - "pad.modals.looping.explanation": "H\u00e1 problemas de comunica\u00e7\u00e3o com o servidor de sincroniza\u00e7\u00e3o.", - "pad.modals.looping.cause": "Talvez voc\u00ea tenha conectado por um firewall ou proxy incompat\u00edvel.", - "pad.modals.initsocketfail": "Servidor \u00e9 inalcan\u00e7\u00e1vel.", - "pad.modals.initsocketfail.explanation": "N\u00e3o foi poss\u00edvel conectar com o servidor de sincroniza\u00e7\u00e3o.", - "pad.modals.initsocketfail.cause": "Isto provavelmente ocorreu por um problema em seu navegador ou conex\u00e3o.", - "pad.modals.slowcommit": "Desconectado.", - "pad.modals.slowcommit.explanation": "O servidor n\u00e3o responde.", - "pad.modals.slowcommit.cause": "Isto pode ser por problemas com a conex\u00e3o de rede.", - "pad.modals.deleted": "Exclu\u00eddo", - "pad.modals.deleted.explanation": "Esta nota foi removida.", - "pad.modals.disconnected": "Voc\u00ea foi desconectado.", - "pad.modals.disconnected.explanation": "A conex\u00e3o com o servidor foi perdida", - "pad.modals.disconnected.cause": "O servidor pode estar indispon\u00edvel. Comunique-nos caso isso continue.", - "pad.share": "Compartilhar esta nota", - "pad.share.readonly": "Somente leitura", - "pad.share.link": "Liga\u00e7\u00e3o", - "pad.share.emebdcode": "Incorporar o URL", - "pad.chat": "Bate-papo", - "pad.chat.title": "Abrir o bate-papo desta nota.", - "pad.chat.loadmessages": "Carregar mais mensagens", - "timeslider.pageTitle": "Linha do tempo de {{appTitle}}", - "timeslider.toolbar.returnbutton": "Retornar para a nota", - "timeslider.toolbar.authors": "Autores:", - "timeslider.toolbar.authorsList": "Sem autores", - "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar a vers\u00e3o atual em formato:", - "timeslider.version": "Vers\u00e3o {{version}}", - "timeslider.saved": "Salvo em {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Janeiro", - "timeslider.month.february": "Fevereiro", - "timeslider.month.march": "Mar\u00e7o", - "timeslider.month.april": "Abril", - "timeslider.month.may": "Maio", - "timeslider.month.june": "Junho", - "timeslider.month.july": "Julho", - "timeslider.month.august": "Agosto", - "timeslider.month.september": "Setembro", - "timeslider.month.october": "Outubro", - "timeslider.month.november": "Novembro", - "timeslider.month.december": "Dezembro", - "timeslider.unnamedauthor": "{{num}} autor desconhecido", - "timeslider.unnamedauthors": "{{num}} autores desconhecidos", - "pad.savedrevs.marked": "Esta revis\u00e3o foi marcada como salva", - "pad.userlist.entername": "Insira o seu nome", - "pad.userlist.unnamed": "Sem t\u00edtulo", - "pad.userlist.guest": "Convidado", - "pad.userlist.deny": "Negar", - "pad.userlist.approve": "Aprovar", - "pad.editbar.clearcolors": "Deseja limpar cores de autoria em todo o documento?", - "pad.impexp.importbutton": "Importar agora", - "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "Importar um arquivo sobrescrever\u00e1 o atual texto da nota. Tem certeza de que deseja prosseguir?", - "pad.impexp.convertFailed": "N\u00e3o foi poss\u00edvel importar este arquivo. Use outro formato ou copie e cole manualmente", - "pad.impexp.uploadFailed": "O envio falhou. Tente outra vez", - "pad.impexp.importfailed": "A importa\u00e7\u00e3o falhou", - "pad.impexp.copypaste": "Copie e cole", - "pad.impexp.exportdisabled": "A exposta\u00e7\u00e3o em formato {{type}} est\u00e1 desativada. Comunique-se com o administrador do sistema para detalhes." + "@metadata": { + "authors": [ + "Gusta", + "Tuliouel" + ] + }, + "index.newPad": "Nova Nota", + "index.createOpenPad": "ou criar-abrir uma Nota com o nome:", + "pad.toolbar.bold.title": "Negrito (Ctrl-B)", + "pad.toolbar.italic.title": "It\u00e1lico (Ctrl-I)", + "pad.toolbar.underline.title": "Sublinhar (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Tachado", + "pad.toolbar.ol.title": "Lista ordenada", + "pad.toolbar.ul.title": "Lista n\u00e3o ordenada", + "pad.toolbar.indent.title": "Aumentar Recuo", + "pad.toolbar.unindent.title": "Diminuir Recuo", + "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", + "pad.toolbar.redo.title": "Refazer (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Limpar as cores de identifica\u00e7\u00e3o de autoria", + "pad.toolbar.import_export.title": "Importar/Exportar de/para diferentes formatos de arquivo", + "pad.toolbar.timeslider.title": "Linha do tempo", + "pad.toolbar.savedRevision.title": "Salvar revis\u00e3o", + "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", + "pad.toolbar.embed.title": "Compartilhar e mencionar esta nota", + "pad.toolbar.showusers.title": "Mostrar os usuarios nesta Nota", + "pad.colorpicker.save": "Salvar", + "pad.colorpicker.cancel": "Cancelar", + "pad.loading": "Carregando...", + "pad.passwordRequired": "Voc\u00ea precisa de uma senha para acessar esta Nota", + "pad.permissionDenied": "Voc\u00ea n\u00e3o tem permiss\u00e3o para acessar esta nota", + "pad.wrongPassword": "Senha incorreta", + "pad.settings.padSettings": "Configura\u00e7\u00f5es da Nota", + "pad.settings.myView": "Minha Vis\u00e3o", + "pad.settings.stickychat": "Conversa sempre vis\u00edvel", + "pad.settings.colorcheck": "Cores de autoria", + "pad.settings.linenocheck": "N\u00fameros de linha", + "pad.settings.rtlcheck": "Ler conte\u00fado da direita para esquerda?", + "pad.settings.fontType": "Tipo de fonte:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monoespa\u00e7ada", + "pad.settings.globalView": "Vis\u00e3o global", + "pad.settings.language": "Idioma:", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Enviar um arquivo texto ou documento", + "pad.importExport.importSuccessful": "Completo!", + "pad.importExport.export": "Exportar a presente nota como:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Texto puro", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Voc\u00ea s\u00f3 pode importar de formatos de texto puro ou html. Para recursos de importa\u00e7\u00e3o mais avan\u00e7ados \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstale o abiword\u003C/a\u003E.", + "pad.modals.connected": "Conectado.", + "pad.modals.reconnecting": "Reconectando \u00e0 sua nota...", + "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", + "pad.modals.userdup": "Aberto noutra janela", + "pad.modals.userdup.explanation": "Esta nota parece estar aberta em mais de uma janela de navegador deste computador.", + "pad.modals.userdup.advice": "Reconectar para usar esta janela.", + "pad.modals.unauth": "N\u00e3o autorizado", + "pad.modals.unauth.explanation": "Suas permiss\u00f5es foram mudadas enquanto visualizava esta p\u00e1gina. Tente reconectar.", + "pad.modals.looping": "Reconectado.", + "pad.modals.looping.explanation": "H\u00e1 problemas de comunica\u00e7\u00e3o com o servidor de sincroniza\u00e7\u00e3o.", + "pad.modals.looping.cause": "Talvez voc\u00ea tenha conectado por um firewall ou proxy incompat\u00edvel.", + "pad.modals.initsocketfail": "Servidor \u00e9 inalcan\u00e7\u00e1vel.", + "pad.modals.initsocketfail.explanation": "N\u00e3o foi poss\u00edvel conectar com o servidor de sincroniza\u00e7\u00e3o.", + "pad.modals.initsocketfail.cause": "Isto provavelmente ocorreu por um problema em seu navegador ou conex\u00e3o.", + "pad.modals.slowcommit": "Desconectado.", + "pad.modals.slowcommit.explanation": "O servidor n\u00e3o responde.", + "pad.modals.slowcommit.cause": "Isto pode ser por problemas com a conex\u00e3o de rede.", + "pad.modals.deleted": "Exclu\u00eddo", + "pad.modals.deleted.explanation": "Esta nota foi removida.", + "pad.modals.disconnected": "Voc\u00ea foi desconectado.", + "pad.modals.disconnected.explanation": "A conex\u00e3o com o servidor foi perdida", + "pad.modals.disconnected.cause": "O servidor pode estar indispon\u00edvel. Comunique-nos caso isso continue.", + "pad.share": "Compartilhar esta nota", + "pad.share.readonly": "Somente leitura", + "pad.share.link": "Liga\u00e7\u00e3o", + "pad.share.emebdcode": "Incorporar o URL", + "pad.chat": "Bate-papo", + "pad.chat.title": "Abrir o bate-papo desta nota.", + "pad.chat.loadmessages": "Carregar mais mensagens", + "timeslider.pageTitle": "Linha do tempo de {{appTitle}}", + "timeslider.toolbar.returnbutton": "Retornar para a nota", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Sem autores", + "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar a vers\u00e3o atual em formato:", + "timeslider.version": "Vers\u00e3o {{version}}", + "timeslider.saved": "Salvo em {{day}} de {{month}} de {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Janeiro", + "timeslider.month.february": "Fevereiro", + "timeslider.month.march": "Mar\u00e7o", + "timeslider.month.april": "Abril", + "timeslider.month.may": "Maio", + "timeslider.month.june": "Junho", + "timeslider.month.july": "Julho", + "timeslider.month.august": "Agosto", + "timeslider.month.september": "Setembro", + "timeslider.month.october": "Outubro", + "timeslider.month.november": "Novembro", + "timeslider.month.december": "Dezembro", + "timeslider.unnamedauthor": "{{num}} autor desconhecido", + "timeslider.unnamedauthors": "{{num}} autores desconhecidos", + "pad.savedrevs.marked": "Esta revis\u00e3o foi marcada como salva", + "pad.userlist.entername": "Insira o seu nome", + "pad.userlist.unnamed": "Sem t\u00edtulo", + "pad.userlist.guest": "Convidado", + "pad.userlist.deny": "Negar", + "pad.userlist.approve": "Aprovar", + "pad.editbar.clearcolors": "Deseja limpar cores de autoria em todo o documento?", + "pad.impexp.importbutton": "Importar agora", + "pad.impexp.importing": "Importando...", + "pad.impexp.confirmimport": "Importar um arquivo sobrescrever\u00e1 o atual texto da nota. Tem certeza de que deseja prosseguir?", + "pad.impexp.convertFailed": "N\u00e3o foi poss\u00edvel importar este arquivo. Use outro formato ou copie e cole manualmente", + "pad.impexp.uploadFailed": "O envio falhou. Tente outra vez", + "pad.impexp.importfailed": "A importa\u00e7\u00e3o falhou", + "pad.impexp.copypaste": "Copie e cole", + "pad.impexp.exportdisabled": "A exposta\u00e7\u00e3o em formato {{type}} est\u00e1 desativada. Comunique-se com o administrador do sistema para detalhes." } \ No newline at end of file diff --git a/src/locales/pt.json b/src/locales/pt.json index 0e651fe8..bb672462 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -1,59 +1,62 @@ { - "@metadata": { - "authors": { - "1": "Waldir" - } - }, - "index.newPad": "Novo Pad", - "index.createOpenPad": "ou criar\/abrir um Pad com o nome:", - "pad.toolbar.bold.title": "Negrito (Ctrl-B)", - "pad.toolbar.italic.title": "It\u00e1lico (Ctrl-I)", - "pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", - "pad.toolbar.ol.title": "Lista numerada", - "pad.toolbar.ul.title": "Lista", - "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", - "pad.toolbar.redo.title": "Refazer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Limpar cores de autoria", - "pad.toolbar.import_export.title": "Importar\/exportar de\/para diferentes formatos de ficheiro", - "pad.toolbar.timeslider.title": "Linha de tempo", - "pad.toolbar.savedRevision.title": "Vers\u00f5es gravadas", - "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", - "pad.toolbar.embed.title": "Incorporar este Pad", - "pad.toolbar.showusers.title": "Mostrar os utilizadores neste Pad", - "pad.colorpicker.save": "Gravar", - "pad.colorpicker.cancel": "Cancelar", - "pad.loading": "A carregar\u2026", - "pad.settings.padSettings": "Configura\u00e7\u00f5es do Pad", - "pad.settings.myView": "Minha vista", - "pad.settings.colorcheck": "Cores de autoria", - "pad.settings.linenocheck": "N\u00fameros de linha", - "pad.settings.fontType": "Tipo de letra:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespa\u00e7ada", - "pad.settings.globalView": "Vista global", - "pad.settings.language": "L\u00edngua:", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Carregar qualquer ficheiro de texto ou documento", - "pad.importExport.export": "Exportar o Pad actual como:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Texto simples", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "Ligado.", - "pad.modals.reconnecting": "Reconectando-se ao seu bloco\u2026", - "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", - "timeslider.month.january": "Janeiro", - "timeslider.month.february": "Fevereiro", - "timeslider.month.march": "Mar\u00e7o", - "timeslider.month.april": "Abril\ufffd\ufffd", - "timeslider.month.may": "Maio", - "timeslider.month.june": "Junho", - "timeslider.month.july": "Julho", - "timeslider.month.august": "Agosto", - "timeslider.month.september": "Setembro", - "timeslider.month.october": "Outubro", - "timeslider.month.november": "Novembro", - "timeslider.month.december": "Dezembro" + "@metadata": { + "authors": { + "1": "Waldir" + } + }, + "index.newPad": "Novo Pad", + "index.createOpenPad": "ou criar/abrir um Pad com o nome:", + "pad.toolbar.bold.title": "Negrito (Ctrl-B)", + "pad.toolbar.italic.title": "It\u00e1lico (Ctrl-I)", + "pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Riscar", + "pad.toolbar.ol.title": "Lista numerada", + "pad.toolbar.ul.title": "Lista", + "pad.toolbar.indent.title": "Avan\u00e7ar", + "pad.toolbar.unindent.title": "Recuar", + "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", + "pad.toolbar.redo.title": "Refazer (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Limpar cores de autoria", + "pad.toolbar.import_export.title": "Importar/exportar de/para diferentes formatos de ficheiro", + "pad.toolbar.timeslider.title": "Linha de tempo", + "pad.toolbar.savedRevision.title": "Vers\u00f5es gravadas", + "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", + "pad.toolbar.embed.title": "Incorporar este Pad", + "pad.toolbar.showusers.title": "Mostrar os utilizadores neste Pad", + "pad.colorpicker.save": "Gravar", + "pad.colorpicker.cancel": "Cancelar", + "pad.loading": "A carregar\u2026", + "pad.settings.padSettings": "Configura\u00e7\u00f5es do Pad", + "pad.settings.myView": "Minha vista", + "pad.settings.colorcheck": "Cores de autoria", + "pad.settings.linenocheck": "N\u00fameros de linha", + "pad.settings.fontType": "Tipo de letra:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monoespa\u00e7ada", + "pad.settings.globalView": "Vista global", + "pad.settings.language": "L\u00edngua:", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Carregar qualquer ficheiro de texto ou documento", + "pad.importExport.export": "Exportar o Pad actual como:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Texto simples", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "Ligado.", + "pad.modals.reconnecting": "Reconectando-se ao seu bloco\u2026", + "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", + "timeslider.month.january": "Janeiro", + "timeslider.month.february": "Fevereiro", + "timeslider.month.march": "Mar\u00e7o", + "timeslider.month.april": "Abril", + "timeslider.month.may": "Maio", + "timeslider.month.june": "Junho", + "timeslider.month.july": "Julho", + "timeslider.month.august": "Agosto", + "timeslider.month.september": "Setembro", + "timeslider.month.october": "Outubro", + "timeslider.month.november": "Novembro", + "timeslider.month.december": "Dezembro" } \ No newline at end of file diff --git a/src/locales/ru.json b/src/locales/ru.json index 8cd82a5f..b4bf539a 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1,124 +1,124 @@ { - "@metadata": { - "authors": [ - "Amire80", - "DCamer", - "Eleferen", - "Volkov" - ] - }, - "index.newPad": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c", - "index.createOpenPad": "\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\/\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c:", - "pad.toolbar.bold.title": "\u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl-B)", - "pad.toolbar.italic.title": "\u043a\u0443\u0440\u0441\u0438\u0432 (Ctrl-I)", - "pad.toolbar.underline.title": "\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0437\u0430\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435", - "pad.toolbar.ol.title": "\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.ul.title": "\u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.indent.title": "\u041e\u0442\u0441\u0442\u0443\u043f", - "pad.toolbar.unindent.title": "\u0412\u044b\u0441\u0442\u0443\u043f", - "pad.toolbar.undo.title": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", - "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432", - "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438", - "pad.toolbar.savedRevision.title": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e", - "pad.toolbar.settings.title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", - "pad.toolbar.embed.title": "\u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435", - "pad.colorpicker.save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", - "pad.colorpicker.cancel": "\u041e\u0442\u043c\u0435\u043d\u0430", - "pad.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...", - "pad.passwordRequired": "\u0412\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430", - "pad.permissionDenied": "\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f", - "pad.wrongPassword": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.settings.padSettings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", - "pad.settings.myView": "\u041c\u043e\u0439 \u0432\u0438\u0434", - "pad.settings.stickychat": "\u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0447\u0430\u0442", - "pad.settings.colorcheck": "\u0426\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", - "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a", - "pad.settings.rtlcheck": "\u0427\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e?", - "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0430:", - "pad.settings.fontType.normal": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439", - "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0439", - "pad.settings.globalView": "\u041e\u0431\u0449\u0438\u0439 \u0432\u0438\u0434", - "pad.settings.language": "\u042f\u0437\u044b\u043a:", - "pad.importExport.import_export": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442", - "pad.importExport.import": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", - "pad.importExport.export": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043a\u0430\u043a:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 OpenOffice)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 HTML. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 AbiWord<\/a>.", - "pad.modals.connected": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d.", - "pad.modals.reconnecting": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.modals.forcereconnect": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435", - "pad.modals.userdup": "\u041e\u0442\u043a\u0440\u044b\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435", - "pad.modals.userdup.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0442\u043a\u0440\u044b\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.", - "pad.modals.userdup.advice": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u043d\u0430.", - "pad.modals.unauth": "\u041d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d", - "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.", - "pad.modals.looping": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", - "pad.modals.looping.explanation": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", - "pad.modals.looping.cause": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0431\u0440\u0430\u043d\u0434\u043c\u0430\u0443\u044d\u0440 \u0438\u043b\u0438 \u043f\u0440\u043e\u043a\u0441\u0438.", - "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.", - "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", - "pad.modals.initsocketfail.cause": "\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c.", - "pad.modals.slowcommit": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", - "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442.", - "pad.modals.slowcommit.cause": "\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c.", - "pad.modals.deleted": "\u0423\u0434\u0430\u043b\u0435\u043d.", - "pad.modals.deleted.explanation": "\u042d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d.", - "pad.modals.disconnected": "\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043d\u043e.", - "pad.modals.disconnected.explanation": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e", - "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043d\u0430\u043c, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0441\u044f.", - "pad.share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", - "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435", - "pad.share.link": "\u0421\u0441\u044b\u043b\u043a\u0430", - "pad.share.emebdcode": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c URL", - "pad.chat": "\u0427\u0430\u0442", - "pad.chat.title": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.", - "pad.chat.loadmessages": "\u0415\u0449\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f", - "timeslider.pageTitle": "\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u043a\u0430\u043b\u0430 {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u041a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u044b:", - "timeslider.toolbar.authorsList": "\u041d\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u043e\u0432", - "timeslider.toolbar.exportlink.title": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442", - "timeslider.exportCurrent": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u0430\u043a:", - "timeslider.version": "\u0412\u0435\u0440\u0441\u0438\u044f {{version}}", - "timeslider.saved": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e {{day}}.{{month}}.{{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u044f\u043d\u0432\u0430\u0440\u044c", - "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0430\u043b\u044c", - "timeslider.month.march": "\u043c\u0430\u0440\u0442", - "timeslider.month.april": "\u0430\u043f\u0440\u0435\u043b\u044c", - "timeslider.month.may": "\u043c\u0430\u0439", - "timeslider.month.june": "\u0438\u044e\u043d\u044c", - "timeslider.month.july": "\u0438\u044e\u043b\u044c", - "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", - "timeslider.month.september": "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", - "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", - "timeslider.unnamedauthor": "{{num}} \u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u0440", - "timeslider.unnamedauthors": "\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432: {{num}}", - "pad.savedrevs.marked": "\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f", - "pad.userlist.entername": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0435 \u0438\u043c\u044f", - "pad.userlist.unnamed": "\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439", - "pad.userlist.guest": "\u0413\u043e\u0441\u0442\u044c", - "pad.userlist.deny": "\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c", - "pad.userlist.approve": "\u0423\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c", - "pad.editbar.clearcolors": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0432\u043e \u0432\u0441\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435?", - "pad.impexp.importbutton": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441", - "pad.impexp.importing": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u2026", - "pad.impexp.confirmimport": "\u0418\u043c\u043f\u043e\u0440\u0442 \u0444\u0430\u0439\u043b\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", - "pad.impexp.convertFailed": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e", - "pad.impexp.uploadFailed": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437", - "pad.impexp.importfailed": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438", - "pad.impexp.copypaste": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435", - "pad.impexp.exportdisabled": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {{type}} \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. \u0414\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443." + "@metadata": { + "authors": [ + "Amire80", + "DCamer", + "Eleferen", + "Volkov" + ] + }, + "index.newPad": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c", + "index.createOpenPad": "\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c/\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c:", + "pad.toolbar.bold.title": "\u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl-B)", + "pad.toolbar.italic.title": "\u043a\u0443\u0440\u0441\u0438\u0432 (Ctrl-I)", + "pad.toolbar.underline.title": "\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0437\u0430\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435", + "pad.toolbar.ol.title": "\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", + "pad.toolbar.ul.title": "\u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", + "pad.toolbar.indent.title": "\u041e\u0442\u0441\u0442\u0443\u043f", + "pad.toolbar.unindent.title": "\u0412\u044b\u0441\u0442\u0443\u043f", + "pad.toolbar.undo.title": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", + "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432", + "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438", + "pad.toolbar.savedRevision.title": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e", + "pad.toolbar.settings.title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "pad.toolbar.embed.title": "\u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", + "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435", + "pad.colorpicker.save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", + "pad.colorpicker.cancel": "\u041e\u0442\u043c\u0435\u043d\u0430", + "pad.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...", + "pad.passwordRequired": "\u0412\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430", + "pad.permissionDenied": "\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f", + "pad.wrongPassword": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.settings.padSettings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", + "pad.settings.myView": "\u041c\u043e\u0439 \u0432\u0438\u0434", + "pad.settings.stickychat": "\u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0447\u0430\u0442", + "pad.settings.colorcheck": "\u0426\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", + "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a", + "pad.settings.rtlcheck": "\u0427\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e?", + "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0430:", + "pad.settings.fontType.normal": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439", + "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0439", + "pad.settings.globalView": "\u041e\u0431\u0449\u0438\u0439 \u0432\u0438\u0434", + "pad.settings.language": "\u042f\u0437\u044b\u043a:", + "pad.importExport.import_export": "\u0418\u043c\u043f\u043e\u0440\u0442/\u044d\u043a\u0441\u043f\u043e\u0440\u0442", + "pad.importExport.import": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", + "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", + "pad.importExport.export": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043a\u0430\u043a:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 OpenOffice)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 HTML. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 AbiWord\u003C/a\u003E.", + "pad.modals.connected": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d.", + "pad.modals.reconnecting": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.modals.forcereconnect": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435", + "pad.modals.userdup": "\u041e\u0442\u043a\u0440\u044b\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435", + "pad.modals.userdup.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0442\u043a\u0440\u044b\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.", + "pad.modals.userdup.advice": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u043d\u0430.", + "pad.modals.unauth": "\u041d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d", + "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.", + "pad.modals.looping": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", + "pad.modals.looping.explanation": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", + "pad.modals.looping.cause": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0431\u0440\u0430\u043d\u0434\u043c\u0430\u0443\u044d\u0440 \u0438\u043b\u0438 \u043f\u0440\u043e\u043a\u0441\u0438.", + "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.", + "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", + "pad.modals.initsocketfail.cause": "\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c.", + "pad.modals.slowcommit": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", + "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442.", + "pad.modals.slowcommit.cause": "\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c.", + "pad.modals.deleted": "\u0423\u0434\u0430\u043b\u0435\u043d.", + "pad.modals.deleted.explanation": "\u042d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d.", + "pad.modals.disconnected": "\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043d\u043e.", + "pad.modals.disconnected.explanation": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e", + "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043d\u0430\u043c, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0441\u044f.", + "pad.share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", + "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435", + "pad.share.link": "\u0421\u0441\u044b\u043b\u043a\u0430", + "pad.share.emebdcode": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c URL", + "pad.chat": "\u0427\u0430\u0442", + "pad.chat.title": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.", + "pad.chat.loadmessages": "\u0415\u0449\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f", + "timeslider.pageTitle": "\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u043a\u0430\u043b\u0430 {{appTitle}}", + "timeslider.toolbar.returnbutton": "\u041a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u044b:", + "timeslider.toolbar.authorsList": "\u041d\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u043e\u0432", + "timeslider.toolbar.exportlink.title": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442", + "timeslider.exportCurrent": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u0430\u043a:", + "timeslider.version": "\u0412\u0435\u0440\u0441\u0438\u044f {{version}}", + "timeslider.saved": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u044f\u043d\u0432\u0430\u0440\u044c", + "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0430\u043b\u044c", + "timeslider.month.march": "\u043c\u0430\u0440\u0442", + "timeslider.month.april": "\u0430\u043f\u0440\u0435\u043b\u044c", + "timeslider.month.may": "\u043c\u0430\u0439", + "timeslider.month.june": "\u0438\u044e\u043d\u044c", + "timeslider.month.july": "\u0438\u044e\u043b\u044c", + "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", + "timeslider.month.september": "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c", + "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", + "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", + "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", + "timeslider.unnamedauthor": "{{num}} \u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u0440", + "timeslider.unnamedauthors": "\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432: {{num}}", + "pad.savedrevs.marked": "\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f", + "pad.userlist.entername": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0435 \u0438\u043c\u044f", + "pad.userlist.unnamed": "\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439", + "pad.userlist.guest": "\u0413\u043e\u0441\u0442\u044c", + "pad.userlist.deny": "\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c", + "pad.userlist.approve": "\u0423\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c", + "pad.editbar.clearcolors": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0432\u043e \u0432\u0441\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435?", + "pad.impexp.importbutton": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441", + "pad.impexp.importing": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u2026", + "pad.impexp.confirmimport": "\u0418\u043c\u043f\u043e\u0440\u0442 \u0444\u0430\u0439\u043b\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", + "pad.impexp.convertFailed": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e", + "pad.impexp.uploadFailed": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437", + "pad.impexp.importfailed": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438", + "pad.impexp.copypaste": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435", + "pad.impexp.exportdisabled": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {{type}} \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. \u0414\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443." } \ No newline at end of file diff --git a/src/locales/sl.json b/src/locales/sl.json index 98cd92b6..e00e9bf1 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": [ - "Mateju" - ] - }, - "index.newPad": "Nov dokument", - "index.createOpenPad": "ali pa odpri dokument z imenom:", - "pad.toolbar.bold.title": "Krepko (Ctrl-B)", - "pad.toolbar.italic.title": "Le\u017ee\u010de (Ctrl-I)", - "pad.toolbar.underline.title": "Pod\u010drtano (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Pre\u010drtano", - "pad.toolbar.ol.title": "O\u0161tevil\u010den seznam", - "pad.toolbar.ul.title": "Vrsti\u010dni seznam", - "pad.toolbar.indent.title": "Zamik desno", - "pad.toolbar.unindent.title": "Zamik levo", - "pad.toolbar.undo.title": "Razveljavi (Ctrl-Z)", - "pad.toolbar.redo.title": "Ponovno uveljavi (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Po\u010disti barvo avtorstva", - "pad.toolbar.import_export.title": "Izvozi\/Uvozi razli\u010dne oblike zapisov", - "pad.toolbar.timeslider.title": "Drsnik zgodovine", - "pad.toolbar.savedRevision.title": "Shrani predelavo", - "pad.toolbar.settings.title": "Nastavitve", - "pad.toolbar.embed.title": "Vstavi dokument", - "pad.toolbar.showusers.title": "Poka\u017ei uporabnike dokumenta", - "pad.colorpicker.save": "Shrani", - "pad.colorpicker.cancel": "Prekli\u010di", - "pad.loading": "Nalaganje ...", - "pad.passwordRequired": "Za dostop do dokumenta je zahtevano geslo.", - "pad.permissionDenied": "Za dostop do dokumenta so zahtevana posebna dovoljenja.", - "pad.wrongPassword": "Vpisano geslo je napa\u010dno.", - "pad.settings.padSettings": "Nastavitve dokumenta", - "pad.settings.myView": "Pogled", - "pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu.", - "pad.settings.colorcheck": "Barve avtorstva", - "pad.settings.linenocheck": "\u0160tevilke vrstic", - "pad.settings.rtlcheck": "Ali naj se vsebina prebira od desne proti levi?", - "pad.settings.fontType": "Vrsta pisave:", - "pad.settings.fontType.normal": "Obi\u010dajno", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Splo\u0161ni pogled", - "pad.settings.language": "Jezik:", - "pad.importExport.import_export": "Uvoz\/Izvoz", - "pad.importExport.import": "Nalo\u017ei katerokoli besedilno datoteko ali dokument.", - "pad.importExport.importSuccessful": "Opravilo je uspe\u0161no kon\u010dano!", - "pad.importExport.export": "Izvozi trenutni dokument kot:", - "pad.importExport.exporthtml": "HTML (oblikovano besedilo)", - "pad.importExport.exportplain": "TXT (neoblikovano besedilo)", - "pad.importExport.exportword": "DOC (zapis Microsoft Word)", - "pad.importExport.exportpdf": "PDF (zapis Acrobat PDF)", - "pad.importExport.exportopen": "ODF (zapis Open Document)", - "pad.importExport.exportdokuwiki": "DokuWiki (zapis DokuWiki)", - "pad.importExport.abiword.innerHTML": "Uvoziti je mogo\u010de le obi\u010dajno neoblikovano besedilo in zapise HTML. Za naprednej\u0161e zmo\u017enosti namestite program Abiword<\/a>.", - "pad.modals.connected": "Povezano.", - "pad.modals.reconnecting": "Poteka povezovanje z dokumentom ...", - "pad.modals.forcereconnect": "Vsili ponovno povezavo.", - "pad.modals.userdup": "Dokument je \u017ee odprt v v drugem oknu.", - "pad.modals.userdup.explanation": "Videti je, da je ta dokument odprt v ve\u010d kot enem oknu brskalnika na tem ra\u010dunalniku.", - "pad.modals.userdup.advice": "Ponovno vzpostavite povezavo in uporabljajte to okno.", - "pad.modals.unauth": "Nepoobla\u0161\u010den dostop", - "pad.modals.unauth.explanation": "Med pregledovanjem te strani so se dovoljenja za ogled spremenila. Treba se bo znova povezati.", - "pad.modals.looping": "Prekinjena povezava.", - "pad.modals.looping.explanation": "Zaznane so te\u017eave s povezavo za usklajevanje s stre\u017enikom.", - "pad.modals.looping.cause": "Morda je vzpostavljena povezava preko neustrezno nastavljenega po\u017earnega zidu ali posredni\u0161kega stre\u017enika.", - "pad.modals.initsocketfail": "Dostop do stre\u017enika ni mogo\u010d.", - "pad.modals.initsocketfail.explanation": "Povezava s stre\u017enikom za usklajevanje ni mogo\u010da.", - "pad.modals.initsocketfail.cause": "Najverjetneje je te\u017eava v brskalniku, ali pa so te\u017eave z internetno povezavo.", - "pad.modals.slowcommit": "Prekinjena povezava.", - "pad.modals.slowcommit.explanation": "Stre\u017enik se ne odziva.", - "pad.modals.slowcommit.cause": "Najverjetneje je pri\u0161lo do napake med vzpostavitvijo povezave.", - "pad.modals.deleted": "Izbrisano.", - "pad.modals.deleted.explanation": "Dokument je odstranjen.", - "pad.modals.disconnected": "Povezava je prekinjena.", - "pad.modals.disconnected.explanation": "Povezava s stre\u017enikom je bila prekinjena.", - "pad.modals.disconnected.cause": "Stre\u017enik je najverjetneje nedosegljiv. Po\u0161ljite poro\u010dilo, \u010de s napaka ve\u010dkrat pojavi.", - "pad.share": "Dolo\u010di souporabo dokumenta", - "pad.share.readonly": "Le za branje", - "pad.share.link": "Povezava", - "pad.share.emebdcode": "Vstavi naslov URL", - "pad.chat": "Klepet", - "pad.chat.title": "Odpri klepetalno okno dokumenta.", - "pad.chat.loadmessages": "Nalo\u017ei ve\u010d sporo\u010dil", - "timeslider.pageTitle": "Zgodovina dokumenta {{appTitle}}", - "timeslider.toolbar.returnbutton": "Vrni se na dokument", - "timeslider.toolbar.authors": "Autorji:", - "timeslider.toolbar.authorsList": "Ni dolo\u010denih avtorjev", - "timeslider.toolbar.exportlink.title": "Izvozi", - "timeslider.exportCurrent": "Izvozi trenutno razli\u010dico kot:", - "timeslider.version": "Razli\u010dica {{version}}", - "timeslider.saved": "Shranjeno {{day}}.{{month}}.{{year}}", - "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Januar", - "timeslider.month.february": "Februar", - "timeslider.month.march": "Marec", - "timeslider.month.april": "April", - "timeslider.month.may": "Maj", - "timeslider.month.june": "Junij", - "timeslider.month.july": "Julij", - "timeslider.month.august": "August", - "timeslider.month.september": "September", - "timeslider.month.october": "Oktober", - "timeslider.month.november": "November", - "timeslider.month.december": "December", - "timeslider.unnamedauthor": "neimenovani avtor {{num}}", - "timeslider.unnamedauthors": "{{num}} neimenovani avtorji", - "pad.savedrevs.marked": "Ta predelava je ozna\u010dena kot shranjena predelava.", - "pad.userlist.entername": "Vpi\u0161ite ime", - "pad.userlist.unnamed": "neimenovana oseba", - "pad.userlist.guest": "Gost", - "pad.userlist.deny": "Zavrni", - "pad.userlist.approve": "Odobri", - "pad.editbar.clearcolors": "Ali naj se po\u010distijo barve avtorstva v celotnem dokumentu?", - "pad.impexp.importbutton": "Uvozi takoj", - "pad.impexp.importing": "Poteka uva\u017eanje ...", - "pad.impexp.confirmimport": "Uvoz datoteke prepi\u0161e obstoje\u010de besedilo dokumenta. Ali ste prepri\u010dani, da \u017eelite nadaljevati?", - "pad.impexp.convertFailed": "Datoteke ni mogo\u010de uvoziti. Uporabiti je treba enega izmed podprtih zapisov dokumentov ali pa vsebino prilepiti ro\u010dno.", - "pad.impexp.uploadFailed": "Nalaganje je spodletelo, poskusite znova.", - "pad.impexp.importfailed": "Uvoz je spodletel.", - "pad.impexp.copypaste": "Vsebino kopirajte in prilepite.", - "pad.impexp.exportdisabled": "Izvoz v zapis {{type}} je onemogo\u010den. Za ve\u010d podrobnosti stopite v stik s skrbnikom." + "@metadata": { + "authors": [ + "Mateju" + ] + }, + "index.newPad": "Nov dokument", + "index.createOpenPad": "ali pa odpri dokument z imenom:", + "pad.toolbar.bold.title": "Krepko (Ctrl-B)", + "pad.toolbar.italic.title": "Le\u017ee\u010de (Ctrl-I)", + "pad.toolbar.underline.title": "Pod\u010drtano (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Pre\u010drtano", + "pad.toolbar.ol.title": "O\u0161tevil\u010den seznam", + "pad.toolbar.ul.title": "Vrsti\u010dni seznam", + "pad.toolbar.indent.title": "Zamik desno", + "pad.toolbar.unindent.title": "Zamik levo", + "pad.toolbar.undo.title": "Razveljavi (Ctrl-Z)", + "pad.toolbar.redo.title": "Ponovno uveljavi (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Po\u010disti barvo avtorstva", + "pad.toolbar.import_export.title": "Izvozi/Uvozi razli\u010dne oblike zapisov", + "pad.toolbar.timeslider.title": "Drsnik zgodovine", + "pad.toolbar.savedRevision.title": "Shrani predelavo", + "pad.toolbar.settings.title": "Nastavitve", + "pad.toolbar.embed.title": "Vstavi dokument", + "pad.toolbar.showusers.title": "Poka\u017ei uporabnike dokumenta", + "pad.colorpicker.save": "Shrani", + "pad.colorpicker.cancel": "Prekli\u010di", + "pad.loading": "Nalaganje ...", + "pad.passwordRequired": "Za dostop do dokumenta je zahtevano geslo.", + "pad.permissionDenied": "Za dostop do dokumenta so zahtevana posebna dovoljenja.", + "pad.wrongPassword": "Vpisano geslo je napa\u010dno.", + "pad.settings.padSettings": "Nastavitve dokumenta", + "pad.settings.myView": "Pogled", + "pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu.", + "pad.settings.colorcheck": "Barve avtorstva", + "pad.settings.linenocheck": "\u0160tevilke vrstic", + "pad.settings.rtlcheck": "Ali naj se vsebina prebira od desne proti levi?", + "pad.settings.fontType": "Vrsta pisave:", + "pad.settings.fontType.normal": "Obi\u010dajno", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Splo\u0161ni pogled", + "pad.settings.language": "Jezik:", + "pad.importExport.import_export": "Uvoz/Izvoz", + "pad.importExport.import": "Nalo\u017ei katerokoli besedilno datoteko ali dokument.", + "pad.importExport.importSuccessful": "Opravilo je uspe\u0161no kon\u010dano!", + "pad.importExport.export": "Izvozi trenutni dokument kot:", + "pad.importExport.exporthtml": "HTML (oblikovano besedilo)", + "pad.importExport.exportplain": "TXT (neoblikovano besedilo)", + "pad.importExport.exportword": "DOC (zapis Microsoft Word)", + "pad.importExport.exportpdf": "PDF (zapis Acrobat PDF)", + "pad.importExport.exportopen": "ODF (zapis Open Document)", + "pad.importExport.exportdokuwiki": "DokuWiki (zapis DokuWiki)", + "pad.importExport.abiword.innerHTML": "Uvoziti je mogo\u010de le obi\u010dajno neoblikovano besedilo in zapise HTML. Za naprednej\u0161e zmo\u017enosti namestite \u003Ca href=\\\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\\\"\u003Eprogram Abiword\u003C/a\u003E.", + "pad.modals.connected": "Povezano.", + "pad.modals.reconnecting": "Poteka povezovanje z dokumentom ...", + "pad.modals.forcereconnect": "Vsili ponovno povezavo.", + "pad.modals.userdup": "Dokument je \u017ee odprt v v drugem oknu.", + "pad.modals.userdup.explanation": "Videti je, da je ta dokument odprt v ve\u010d kot enem oknu brskalnika na tem ra\u010dunalniku.", + "pad.modals.userdup.advice": "Ponovno vzpostavite povezavo in uporabljajte to okno.", + "pad.modals.unauth": "Nepoobla\u0161\u010den dostop", + "pad.modals.unauth.explanation": "Med pregledovanjem te strani so se dovoljenja za ogled spremenila. Treba se bo znova povezati.", + "pad.modals.looping": "Prekinjena povezava.", + "pad.modals.looping.explanation": "Zaznane so te\u017eave s povezavo za usklajevanje s stre\u017enikom.", + "pad.modals.looping.cause": "Morda je vzpostavljena povezava preko neustrezno nastavljenega po\u017earnega zidu ali posredni\u0161kega stre\u017enika.", + "pad.modals.initsocketfail": "Dostop do stre\u017enika ni mogo\u010d.", + "pad.modals.initsocketfail.explanation": "Povezava s stre\u017enikom za usklajevanje ni mogo\u010da.", + "pad.modals.initsocketfail.cause": "Najverjetneje je te\u017eava v brskalniku, ali pa so te\u017eave z internetno povezavo.", + "pad.modals.slowcommit": "Prekinjena povezava.", + "pad.modals.slowcommit.explanation": "Stre\u017enik se ne odziva.", + "pad.modals.slowcommit.cause": "Najverjetneje je pri\u0161lo do napake med vzpostavitvijo povezave.", + "pad.modals.deleted": "Izbrisano.", + "pad.modals.deleted.explanation": "Dokument je odstranjen.", + "pad.modals.disconnected": "Povezava je prekinjena.", + "pad.modals.disconnected.explanation": "Povezava s stre\u017enikom je bila prekinjena.", + "pad.modals.disconnected.cause": "Stre\u017enik je najverjetneje nedosegljiv. Po\u0161ljite poro\u010dilo, \u010de s napaka ve\u010dkrat pojavi.", + "pad.share": "Dolo\u010di souporabo dokumenta", + "pad.share.readonly": "Le za branje", + "pad.share.link": "Povezava", + "pad.share.emebdcode": "Vstavi naslov URL", + "pad.chat": "Klepet", + "pad.chat.title": "Odpri klepetalno okno dokumenta.", + "pad.chat.loadmessages": "Nalo\u017ei ve\u010d sporo\u010dil", + "timeslider.pageTitle": "Zgodovina dokumenta {{appTitle}}", + "timeslider.toolbar.returnbutton": "Vrni se na dokument", + "timeslider.toolbar.authors": "Autorji:", + "timeslider.toolbar.authorsList": "Ni dolo\u010denih avtorjev", + "timeslider.toolbar.exportlink.title": "Izvozi", + "timeslider.exportCurrent": "Izvozi trenutno razli\u010dico kot:", + "timeslider.version": "Razli\u010dica {{version}}", + "timeslider.saved": "Shranjeno {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januar", + "timeslider.month.february": "Februar", + "timeslider.month.march": "Marec", + "timeslider.month.april": "April", + "timeslider.month.may": "Maj", + "timeslider.month.june": "Junij", + "timeslider.month.july": "Julij", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "December", + "timeslider.unnamedauthor": "neimenovani avtor {{num}}", + "timeslider.unnamedauthors": "{{num}} neimenovani avtorji", + "pad.savedrevs.marked": "Ta predelava je ozna\u010dena kot shranjena predelava.", + "pad.userlist.entername": "Vpi\u0161ite ime", + "pad.userlist.unnamed": "neimenovana oseba", + "pad.userlist.guest": "Gost", + "pad.userlist.deny": "Zavrni", + "pad.userlist.approve": "Odobri", + "pad.editbar.clearcolors": "Ali naj se po\u010distijo barve avtorstva v celotnem dokumentu?", + "pad.impexp.importbutton": "Uvozi takoj", + "pad.impexp.importing": "Poteka uva\u017eanje ...", + "pad.impexp.confirmimport": "Uvoz datoteke prepi\u0161e obstoje\u010de besedilo dokumenta. Ali ste prepri\u010dani, da \u017eelite nadaljevati?", + "pad.impexp.convertFailed": "Datoteke ni mogo\u010de uvoziti. Uporabiti je treba enega izmed podprtih zapisov dokumentov ali pa vsebino prilepiti ro\u010dno.", + "pad.impexp.uploadFailed": "Nalaganje je spodletelo, poskusite znova.", + "pad.impexp.importfailed": "Uvoz je spodletel.", + "pad.impexp.copypaste": "Vsebino kopirajte in prilepite.", + "pad.impexp.exportdisabled": "Izvoz v zapis {{type}} je onemogo\u010den. Za ve\u010d podrobnosti stopite v stik s skrbnikom." } \ No newline at end of file diff --git a/src/locales/sq.json b/src/locales/sq.json index 6ae81135..5b5086ff 100644 --- a/src/locales/sq.json +++ b/src/locales/sq.json @@ -1,115 +1,115 @@ { - "@metadata": { - "authors": [ - "Besnik b" - ] - }, - "index.newPad": "Bllok i Ri", - "index.createOpenPad": "ose krijoni\/hapni nj\u00eb Bllok me emrin:", - "pad.toolbar.bold.title": "T\u00eb trasha (Ctrl-B)", - "pad.toolbar.italic.title": "T\u00eb pjerr\u00ebta (Ctrl-I)", - "pad.toolbar.underline.title": "T\u00eb n\u00ebnvizuara (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Hequrvije", - "pad.toolbar.ol.title": "List\u00eb e renditur", - "pad.toolbar.ul.title": "List\u00eb e parenditur", - "pad.toolbar.indent.title": "Brendazi", - "pad.toolbar.unindent.title": "Jashtazi", - "pad.toolbar.undo.title": "Zhb\u00ebje (Ctrl-Z)", - "pad.toolbar.redo.title": "Rib\u00ebje (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Hiq Ngjyra Autor\u00ebsish", - "pad.toolbar.import_export.title": "Importoni\/Eksportoni nga\/n\u00eb formate t\u00eb tjera kartelash", - "pad.toolbar.timeslider.title": "Rrjedha kohore", - "pad.toolbar.savedRevision.title": "Rishikime t\u00eb Ruajtura", - "pad.toolbar.settings.title": "Rregullime", - "pad.toolbar.embed.title": "Trup\u00ebzojeni k\u00ebt\u00eb bllok", - "pad.toolbar.showusers.title": "Shfaq p\u00ebrdoruesit n\u00eb k\u00ebt\u00eb bllok", - "pad.colorpicker.save": "Ruaje", - "pad.colorpicker.cancel": "Anuloje", - "pad.loading": "Po ngarkohet...", - "pad.passwordRequired": "Ju duhet nj\u00eb fjal\u00ebkalim q\u00eb t\u00eb mund t\u00eb p\u00ebrdorni k\u00ebt\u00eb bllok", - "pad.permissionDenied": "Nuk keni leje t\u00eb hyni n\u00eb k\u00ebt\u00eb bllok", - "pad.wrongPassword": "Fjal\u00ebkalimi juaj qe gabim", - "pad.settings.padSettings": "Rregullime blloku", - "pad.settings.myView": "Pamja Ime", - "pad.settings.stickychat": "Fjalosje p\u00ebrher\u00eb n\u00eb ekran", - "pad.settings.colorcheck": "Ngjyra autor\u00ebsish", - "pad.settings.linenocheck": "Numra rreshtash", - "pad.settings.fontType": "Lloj shkronjash:", - "pad.settings.fontType.normal": "Normale", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Pamje Globale", - "pad.settings.language": "Gjuh\u00eb:", - "pad.importExport.import_export": "Import\/Eksport", - "pad.importExport.import": "Ngarkoni cil\u00ebndo kartel\u00eb teksti ose dokument", - "pad.importExport.importSuccessful": "Me sukses!", - "pad.importExport.export": "Eksportojeni bllokun e tanish\u00ebm si:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Tekst t\u00eb thjesht\u00eb", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Mund t\u00eb importoni vet\u00ebm prej formati tekst i thjesht\u00eb ose html. P\u00ebr ve\u00e7ori m\u00eb t\u00eb p\u00ebrparuara importimi, ju lutemi, instaloni Abiword-in<\/a>.", - "pad.modals.connected": "I lidhur.", - "pad.modals.reconnecting": "Po rilidheni te blloku juaj..", - "pad.modals.forcereconnect": "Rilidhje e detyruar", - "pad.modals.userdup.explanation": "Ky bllok duket se gjendet i hapur n\u00eb m\u00eb shum\u00eb se nj\u00eb dritare shfletuesi n\u00eb k\u00ebt\u00eb kompjuter.", - "pad.modals.userdup.advice": "Rilidhu q\u00eb t\u00eb p\u00ebrdoret kjo dritare, m\u00eb mir\u00eb.", - "pad.modals.unauth": "I paautorizuar", - "pad.modals.unauth.explanation": "Nd\u00ebrkoh\u00eb q\u00eb shihnit k\u00ebt\u00eb dritare, lejet tuaja kan\u00eb ndryshuar. Provoni t\u00eb rilidheni.", - "pad.modals.looping": "I shk\u00ebputur.", - "pad.modals.looping.explanation": "Ka probleme komunikimi me sh\u00ebrbyesin e nj\u00ebkoh\u00ebsimit.", - "pad.modals.looping.cause": "Ndoshta jeni lidhur p\u00ebrmes nj\u00eb firewall-i ose nd\u00ebrmjet\u00ebsi t\u00eb pap\u00ebrputhsh\u00ebm.", - "pad.modals.initsocketfail": "Nuk kapet dot sh\u00ebrbyesi.", - "pad.modals.initsocketfail.explanation": "Nuk u lidh dot te sh\u00ebrbyesi i nj\u00ebkoh\u00ebsimit.", - "pad.modals.initsocketfail.cause": "Ka gjasa q\u00eb kjo vjen p\u00ebr shkak t\u00eb nj\u00eb problemi me shfletuesin tuaj ose lidhjen tuaj n\u00eb internet.", - "pad.modals.slowcommit": "I shk\u00ebputur.", - "pad.modals.slowcommit.explanation": "Sh\u00ebrbyesi nuk po p\u00ebrgjigjet.", - "pad.modals.slowcommit.cause": "Kjo mund t\u00eb vij\u00eb p\u00ebr shkak problemesh lidhjeje me rrjetin.", - "pad.modals.deleted": "I fshir\u00eb.", - "pad.modals.deleted.explanation": "Ky bllok \u00ebsht\u00eb hequr.", - "pad.modals.disconnected": "Jeni shk\u00ebputur.", - "pad.modals.disconnected.explanation": "U pre lidhja me sh\u00ebrbyesin", - "pad.modals.disconnected.cause": "Sh\u00ebrbyesi mund t\u00eb mos jet\u00eb n\u00eb pun\u00eb. Ju lutemi, na njoftoni, n\u00ebse kjo vazhdon t\u00eb ndodh\u00eb.", - "pad.share": "Ndajeni k\u00ebt\u00eb bllok me t\u00eb tjer\u00ebt", - "pad.share.readonly": "Vet\u00ebm p\u00ebr lexim", - "pad.share.link": "Lidhje", - "pad.share.emebdcode": "URL trup\u00ebzimi", - "pad.chat": "Fjalosje", - "pad.chat.title": "Hapni fjalosjen p\u00ebr k\u00ebt\u00eb bllok.", - "timeslider.pageTitle": "Rrjedh\u00eb kohore e {{appTitle}}", - "timeslider.toolbar.returnbutton": "Rikthehuni te blloku", - "timeslider.toolbar.authors": "Autor\u00eb:", - "timeslider.toolbar.authorsList": "Pa Autor\u00eb", - "timeslider.exportCurrent": "Eksportojeni versionin e tanish\u00ebm si:", - "timeslider.version": "Versioni {{version}}", - "timeslider.saved": "Ruajtur m\u00eb {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Janar", - "timeslider.month.february": "Shkurt", - "timeslider.month.march": "Mars", - "timeslider.month.april": "Prill", - "timeslider.month.may": "Maj", - "timeslider.month.june": "Qershor", - "timeslider.month.july": "Korrik", - "timeslider.month.august": "Gusht", - "timeslider.month.september": "Shtator", - "timeslider.month.october": "Tetor", - "timeslider.month.november": "N\u00ebntor", - "timeslider.month.december": "Dhjetor", - "pad.savedrevs.marked": "Ky rishikim tani \u00ebsht\u00eb sh\u00ebnuar si rishikim i ruajtur", - "pad.userlist.entername": "Jepni emrin tuaj", - "pad.userlist.unnamed": "pa em\u00ebr", - "pad.userlist.guest": "Vizitor", - "pad.userlist.deny": "Mohoje", - "pad.userlist.approve": "Miratoje", - "pad.editbar.clearcolors": "T\u00eb hiqen ngjyra autor\u00ebsish n\u00eb krejt dokumentin?", - "pad.impexp.importbutton": "Importoje Tani", - "pad.impexp.importing": "Po importohet...", - "pad.impexp.confirmimport": "Importimi i nj\u00eb kartele do t\u00eb mbishkruaj\u00eb tekstin e tanish\u00ebm t\u00eb bllokut. Jeni i sigurt se doni t\u00eb vazhdohet?", - "pad.impexp.convertFailed": "Nuk qem\u00eb n\u00eb gjendje ta importonim k\u00ebt\u00eb kartel\u00eb. Ju lutemi, p\u00ebrdorni nj\u00eb format tjet\u00ebr dokumentesh ose kopjojeni dhe hidheni dorazi", - "pad.impexp.uploadFailed": "Ngarkimi d\u00ebshtoi, ju lutemi, riprovoni", - "pad.impexp.importfailed": "Importimi d\u00ebshtoi", - "pad.impexp.copypaste": "Ju lutemi, kopjojeni dhe ngjiteni", - "pad.impexp.exportdisabled": "Eksportimi n\u00eb formatin {{type}} \u00ebsht\u00eb i \u00e7aktivizuar. P\u00ebr holl\u00ebsi, ju lutemi, lidhuni me administratorin e sistemit." + "@metadata": { + "authors": [ + "Besnik b" + ] + }, + "index.newPad": "Bllok i Ri", + "index.createOpenPad": "ose krijoni/hapni nj\u00eb Bllok me emrin:", + "pad.toolbar.bold.title": "T\u00eb trasha (Ctrl-B)", + "pad.toolbar.italic.title": "T\u00eb pjerr\u00ebta (Ctrl-I)", + "pad.toolbar.underline.title": "T\u00eb n\u00ebnvizuara (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Hequrvije", + "pad.toolbar.ol.title": "List\u00eb e renditur", + "pad.toolbar.ul.title": "List\u00eb e parenditur", + "pad.toolbar.indent.title": "Brendazi", + "pad.toolbar.unindent.title": "Jashtazi", + "pad.toolbar.undo.title": "Zhb\u00ebje (Ctrl-Z)", + "pad.toolbar.redo.title": "Rib\u00ebje (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Hiq Ngjyra Autor\u00ebsish", + "pad.toolbar.import_export.title": "Importoni/Eksportoni nga/n\u00eb formate t\u00eb tjera kartelash", + "pad.toolbar.timeslider.title": "Rrjedha kohore", + "pad.toolbar.savedRevision.title": "Rishikime t\u00eb Ruajtura", + "pad.toolbar.settings.title": "Rregullime", + "pad.toolbar.embed.title": "Trup\u00ebzojeni k\u00ebt\u00eb bllok", + "pad.toolbar.showusers.title": "Shfaq p\u00ebrdoruesit n\u00eb k\u00ebt\u00eb bllok", + "pad.colorpicker.save": "Ruaje", + "pad.colorpicker.cancel": "Anuloje", + "pad.loading": "Po ngarkohet...", + "pad.passwordRequired": "Ju duhet nj\u00eb fjal\u00ebkalim q\u00eb t\u00eb mund t\u00eb p\u00ebrdorni k\u00ebt\u00eb bllok", + "pad.permissionDenied": "Nuk keni leje t\u00eb hyni n\u00eb k\u00ebt\u00eb bllok", + "pad.wrongPassword": "Fjal\u00ebkalimi juaj qe gabim", + "pad.settings.padSettings": "Rregullime blloku", + "pad.settings.myView": "Pamja Ime", + "pad.settings.stickychat": "Fjalosje p\u00ebrher\u00eb n\u00eb ekran", + "pad.settings.colorcheck": "Ngjyra autor\u00ebsish", + "pad.settings.linenocheck": "Numra rreshtash", + "pad.settings.fontType": "Lloj shkronjash:", + "pad.settings.fontType.normal": "Normale", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Pamje Globale", + "pad.settings.language": "Gjuh\u00eb:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Ngarkoni cil\u00ebndo kartel\u00eb teksti ose dokument", + "pad.importExport.importSuccessful": "Me sukses!", + "pad.importExport.export": "Eksportojeni bllokun e tanish\u00ebm si:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Tekst t\u00eb thjesht\u00eb", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Mund t\u00eb importoni vet\u00ebm prej formati tekst i thjesht\u00eb ose html. P\u00ebr ve\u00e7ori m\u00eb t\u00eb p\u00ebrparuara importimi, ju lutemi, \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstaloni Abiword-in\u003C/a\u003E.", + "pad.modals.connected": "I lidhur.", + "pad.modals.reconnecting": "Po rilidheni te blloku juaj..", + "pad.modals.forcereconnect": "Rilidhje e detyruar", + "pad.modals.userdup.explanation": "Ky bllok duket se gjendet i hapur n\u00eb m\u00eb shum\u00eb se nj\u00eb dritare shfletuesi n\u00eb k\u00ebt\u00eb kompjuter.", + "pad.modals.userdup.advice": "Rilidhu q\u00eb t\u00eb p\u00ebrdoret kjo dritare, m\u00eb mir\u00eb.", + "pad.modals.unauth": "I paautorizuar", + "pad.modals.unauth.explanation": "Nd\u00ebrkoh\u00eb q\u00eb shihnit k\u00ebt\u00eb dritare, lejet tuaja kan\u00eb ndryshuar. Provoni t\u00eb rilidheni.", + "pad.modals.looping": "I shk\u00ebputur.", + "pad.modals.looping.explanation": "Ka probleme komunikimi me sh\u00ebrbyesin e nj\u00ebkoh\u00ebsimit.", + "pad.modals.looping.cause": "Ndoshta jeni lidhur p\u00ebrmes nj\u00eb firewall-i ose nd\u00ebrmjet\u00ebsi t\u00eb pap\u00ebrputhsh\u00ebm.", + "pad.modals.initsocketfail": "Nuk kapet dot sh\u00ebrbyesi.", + "pad.modals.initsocketfail.explanation": "Nuk u lidh dot te sh\u00ebrbyesi i nj\u00ebkoh\u00ebsimit.", + "pad.modals.initsocketfail.cause": "Ka gjasa q\u00eb kjo vjen p\u00ebr shkak t\u00eb nj\u00eb problemi me shfletuesin tuaj ose lidhjen tuaj n\u00eb internet.", + "pad.modals.slowcommit": "I shk\u00ebputur.", + "pad.modals.slowcommit.explanation": "Sh\u00ebrbyesi nuk po p\u00ebrgjigjet.", + "pad.modals.slowcommit.cause": "Kjo mund t\u00eb vij\u00eb p\u00ebr shkak problemesh lidhjeje me rrjetin.", + "pad.modals.deleted": "I fshir\u00eb.", + "pad.modals.deleted.explanation": "Ky bllok \u00ebsht\u00eb hequr.", + "pad.modals.disconnected": "Jeni shk\u00ebputur.", + "pad.modals.disconnected.explanation": "U pre lidhja me sh\u00ebrbyesin", + "pad.modals.disconnected.cause": "Sh\u00ebrbyesi mund t\u00eb mos jet\u00eb n\u00eb pun\u00eb. Ju lutemi, na njoftoni, n\u00ebse kjo vazhdon t\u00eb ndodh\u00eb.", + "pad.share": "Ndajeni k\u00ebt\u00eb bllok me t\u00eb tjer\u00ebt", + "pad.share.readonly": "Vet\u00ebm p\u00ebr lexim", + "pad.share.link": "Lidhje", + "pad.share.emebdcode": "URL trup\u00ebzimi", + "pad.chat": "Fjalosje", + "pad.chat.title": "Hapni fjalosjen p\u00ebr k\u00ebt\u00eb bllok.", + "timeslider.pageTitle": "Rrjedh\u00eb kohore e {{appTitle}}", + "timeslider.toolbar.returnbutton": "Rikthehuni te blloku", + "timeslider.toolbar.authors": "Autor\u00eb:", + "timeslider.toolbar.authorsList": "Pa Autor\u00eb", + "timeslider.exportCurrent": "Eksportojeni versionin e tanish\u00ebm si:", + "timeslider.version": "Versioni {{version}}", + "timeslider.saved": "Ruajtur m\u00eb {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Janar", + "timeslider.month.february": "Shkurt", + "timeslider.month.march": "Mars", + "timeslider.month.april": "Prill", + "timeslider.month.may": "Maj", + "timeslider.month.june": "Qershor", + "timeslider.month.july": "Korrik", + "timeslider.month.august": "Gusht", + "timeslider.month.september": "Shtator", + "timeslider.month.october": "Tetor", + "timeslider.month.november": "N\u00ebntor", + "timeslider.month.december": "Dhjetor", + "pad.savedrevs.marked": "Ky rishikim tani \u00ebsht\u00eb sh\u00ebnuar si rishikim i ruajtur", + "pad.userlist.entername": "Jepni emrin tuaj", + "pad.userlist.unnamed": "pa em\u00ebr", + "pad.userlist.guest": "Vizitor", + "pad.userlist.deny": "Mohoje", + "pad.userlist.approve": "Miratoje", + "pad.editbar.clearcolors": "T\u00eb hiqen ngjyra autor\u00ebsish n\u00eb krejt dokumentin?", + "pad.impexp.importbutton": "Importoje Tani", + "pad.impexp.importing": "Po importohet...", + "pad.impexp.confirmimport": "Importimi i nj\u00eb kartele do t\u00eb mbishkruaj\u00eb tekstin e tanish\u00ebm t\u00eb bllokut. Jeni i sigurt se doni t\u00eb vazhdohet?", + "pad.impexp.convertFailed": "Nuk qem\u00eb n\u00eb gjendje ta importonim k\u00ebt\u00eb kartel\u00eb. Ju lutemi, p\u00ebrdorni nj\u00eb format tjet\u00ebr dokumentesh ose kopjojeni dhe hidheni dorazi", + "pad.impexp.uploadFailed": "Ngarkimi d\u00ebshtoi, ju lutemi, riprovoni", + "pad.impexp.importfailed": "Importimi d\u00ebshtoi", + "pad.impexp.copypaste": "Ju lutemi, kopjojeni dhe ngjiteni", + "pad.impexp.exportdisabled": "Eksportimi n\u00eb formatin {{type}} \u00ebsht\u00eb i \u00e7aktivizuar. P\u00ebr holl\u00ebsi, ju lutemi, lidhuni me administratorin e sistemit." } \ No newline at end of file diff --git a/src/locales/sv.json b/src/locales/sv.json index 5e37d02a..2382ac42 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -1,121 +1,121 @@ { - "@metadata": { - "authors": { - "1": "WikiPhoenix" - } - }, - "index.newPad": "Nytt block", - "index.createOpenPad": "eller skapa\/\u00f6ppna ett block med namnet:", - "pad.toolbar.bold.title": "Fet (Ctrl-B)", - "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", - "pad.toolbar.underline.title": "Understruken (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Genomstruken", - "pad.toolbar.ol.title": "Numrerad lista", - "pad.toolbar.ul.title": "Ta bort numrerad lista", - "pad.toolbar.indent.title": "\u00d6ka indrag", - "pad.toolbar.unindent.title": "Minska indrag", - "pad.toolbar.undo.title": "\u00c5ngra (Ctrl-Z)", - "pad.toolbar.redo.title": "G\u00f6r om (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Rensa f\u00f6rfattarf\u00e4rger", - "pad.toolbar.import_export.title": "Importera\/exportera fr\u00e5n\/till olika filformat", - "pad.toolbar.timeslider.title": "Tidsreglage", - "pad.toolbar.savedRevision.title": "Spara revision", - "pad.toolbar.settings.title": "Inst\u00e4llningar", - "pad.toolbar.embed.title": "B\u00e4dda in detta block", - "pad.toolbar.showusers.title": "Visa anv\u00e4ndarna p\u00e5 detta block", - "pad.colorpicker.save": "Spara", - "pad.colorpicker.cancel": "Avbryt", - "pad.loading": "L\u00e4ser in...", - "pad.passwordRequired": "Du beh\u00f6ver ett l\u00f6senord f\u00f6r att f\u00e5 tillg\u00e5ng till detta block", - "pad.permissionDenied": "Du har inte beh\u00f6righet att f\u00e5 tillg\u00e5ng till detta block", - "pad.wrongPassword": "Ditt l\u00f6senord \u00e4r fel", - "pad.settings.padSettings": "Blockinst\u00e4llningar", - "pad.settings.myView": "Min vy", - "pad.settings.stickychat": "Chatten alltid p\u00e5 sk\u00e4rmen", - "pad.settings.colorcheck": "F\u00f6rfattarskapsf\u00e4rger", - "pad.settings.linenocheck": "Radnummer", - "pad.settings.rtlcheck": "Vill du l\u00e4sa inneh\u00e5llet fr\u00e5n h\u00f6ger till v\u00e4nster?", - "pad.settings.fontType": "Typsnitt:", - "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Fast breddsteg", - "pad.settings.globalView": "Global vy", - "pad.settings.language": "Spr\u00e5k:", - "pad.importExport.import_export": "Importera\/exportera", - "pad.importExport.import": "Ladda upp en textfil eller dokument", - "pad.importExport.importSuccessful": "\u00c5tg\u00e4rden slutf\u00f6rdes!", - "pad.importExport.export": "Export aktuellt block som:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Oformaterad text", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan endast importera fr\u00e5n oformaterad text eller html-format. F\u00f6r mer avancerade importeringsfunktioner, var god installera abiword<\/a>.", - "pad.modals.connected": "Ansluten.", - "pad.modals.reconnecting": "\u00c5teransluter till ditt block...", - "pad.modals.forcereconnect": "Tvinga \u00e5teranslutning", - "pad.modals.userdup": "\u00d6ppnades i ett nytt f\u00f6nster", - "pad.modals.userdup.explanation": "Detta block verkar vara \u00f6ppet i mer \u00e4n ett f\u00f6nster p\u00e5 denna dator.", - "pad.modals.userdup.advice": "\u00c5teranslut f\u00f6r att anv\u00e4nda detta f\u00f6nster ist\u00e4llet.", - "pad.modals.unauth": "Inte godk\u00e4nd", - "pad.modals.unauth.explanation": "Din beh\u00f6righet \u00e4ndrades medan du visar denna sida. F\u00f6rs\u00f6k att \u00e5teransluta.", - "pad.modals.looping": "Fr\u00e5nkopplad.", - "pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppst\u00e5tt.", - "pad.modals.looping.cause": "Kanske du \u00e4r ansluten via en inkompatibel brandv\u00e4gg eller proxy.", - "pad.modals.initsocketfail": "Servern inte kan n\u00e5s.", - "pad.modals.initsocketfail.explanation": "Det gick inte att ansluta till synkroniseringsservern.", - "pad.modals.initsocketfail.cause": "Detta \u00e4r beror troligen p\u00e5 ett problem med din webbl\u00e4sare eller din internetanslutning.", - "pad.modals.slowcommit": "Fr\u00e5nkopplad.", - "pad.modals.slowcommit.explanation": "Servern svarar inte.", - "pad.modals.slowcommit.cause": "Detta kan bero p\u00e5 problem med n\u00e4tverksanslutningen.", - "pad.modals.deleted": "Raderad.", - "pad.modals.deleted.explanation": "Detta block har tagits bort.", - "pad.modals.disconnected": "Du har kopplats fr\u00e5n.", - "pad.modals.disconnected.explanation": "Anslutningen till servern avbr\u00f6ts", - "pad.modals.disconnected.cause": "Servern kanske inte \u00e4r tillg\u00e4nglig. Var god meddela oss om detta forts\u00e4tter att h\u00e4nda.", - "pad.share": "Dela detta block", - "pad.share.readonly": "Skrivskyddad", - "pad.share.link": "L\u00e4nk", - "pad.share.emebdcode": "B\u00e4dda in URL", - "pad.chat": "Chatt", - "pad.chat.title": "\u00d6ppna chatten f\u00f6r detta block.", - "pad.chat.loadmessages": "L\u00e4s in fler meddelanden", - "timeslider.pageTitle": "Tidsreglage f\u00f6r {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u00c5terv\u00e4nd till blocket", - "timeslider.toolbar.authors": "F\u00f6rfattare:", - "timeslider.toolbar.authorsList": "Ingen f\u00f6rfattare", - "timeslider.toolbar.exportlink.title": "Exportera", - "timeslider.exportCurrent": "Exportera aktuell version som:", - "timeslider.version": "Version {{version}}", - "timeslider.saved": "Sparades den {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "januari", - "timeslider.month.february": "februari", - "timeslider.month.march": "mars", - "timeslider.month.april": "april", - "timeslider.month.may": "maj", - "timeslider.month.june": "juni", - "timeslider.month.july": "juli", - "timeslider.month.august": "augusti", - "timeslider.month.september": "september", - "timeslider.month.october": "oktober", - "timeslider.month.november": "november", - "timeslider.month.december": "december", - "timeslider.unnamedauthor": "{{num}} namnl\u00f6s f\u00f6rfattare", - "timeslider.unnamedauthors": "{{num}} namnl\u00f6sa f\u00f6rfattare", - "pad.savedrevs.marked": "Denna revision \u00e4r nu markerad som en sparad revision", - "pad.userlist.entername": "Ange ditt namn", - "pad.userlist.unnamed": "namnl\u00f6s", - "pad.userlist.guest": "G\u00e4st", - "pad.userlist.deny": "Neka", - "pad.userlist.approve": "Godk\u00e4nn", - "pad.editbar.clearcolors": "Rensa f\u00f6rfattarf\u00e4rger p\u00e5 hela dokumentet?", - "pad.impexp.importbutton": "Importera nu", - "pad.impexp.importing": "Importerar...", - "pad.impexp.confirmimport": "Att importera en fil kommer att skriva \u00f6ver den aktuella texten i blocket. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", - "pad.impexp.convertFailed": "Vi kunde inte importera denna fil. Var god anv\u00e4nd ett annat dokumentformat eller kopiera och klistra in den manuellt", - "pad.impexp.uploadFailed": "Uppladdningen misslyckades, var god f\u00f6rs\u00f6k igen", - "pad.impexp.importfailed": "Importering misslyckades", - "pad.impexp.copypaste": "Var god kopiera och klistra in", - "pad.impexp.exportdisabled": "Exportering av formatet {{type}} \u00e4r inaktiverad. Var god kontakta din systemadministrat\u00f6r f\u00f6r mer information." + "@metadata": { + "authors": { + "1": "WikiPhoenix" + } + }, + "index.newPad": "Nytt block", + "index.createOpenPad": "eller skapa/\u00f6ppna ett block med namnet:", + "pad.toolbar.bold.title": "Fet (Ctrl-B)", + "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", + "pad.toolbar.underline.title": "Understruken (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Genomstruken", + "pad.toolbar.ol.title": "Numrerad lista", + "pad.toolbar.ul.title": "Ta bort numrerad lista", + "pad.toolbar.indent.title": "\u00d6ka indrag", + "pad.toolbar.unindent.title": "Minska indrag", + "pad.toolbar.undo.title": "\u00c5ngra (Ctrl-Z)", + "pad.toolbar.redo.title": "G\u00f6r om (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Rensa f\u00f6rfattarf\u00e4rger", + "pad.toolbar.import_export.title": "Importera/exportera fr\u00e5n/till olika filformat", + "pad.toolbar.timeslider.title": "Tidsreglage", + "pad.toolbar.savedRevision.title": "Spara revision", + "pad.toolbar.settings.title": "Inst\u00e4llningar", + "pad.toolbar.embed.title": "B\u00e4dda in detta block", + "pad.toolbar.showusers.title": "Visa anv\u00e4ndarna p\u00e5 detta block", + "pad.colorpicker.save": "Spara", + "pad.colorpicker.cancel": "Avbryt", + "pad.loading": "L\u00e4ser in...", + "pad.passwordRequired": "Du beh\u00f6ver ett l\u00f6senord f\u00f6r att f\u00e5 tillg\u00e5ng till detta block", + "pad.permissionDenied": "Du har inte beh\u00f6righet att f\u00e5 tillg\u00e5ng till detta block", + "pad.wrongPassword": "Ditt l\u00f6senord \u00e4r fel", + "pad.settings.padSettings": "Blockinst\u00e4llningar", + "pad.settings.myView": "Min vy", + "pad.settings.stickychat": "Chatten alltid p\u00e5 sk\u00e4rmen", + "pad.settings.colorcheck": "F\u00f6rfattarskapsf\u00e4rger", + "pad.settings.linenocheck": "Radnummer", + "pad.settings.rtlcheck": "Vill du l\u00e4sa inneh\u00e5llet fr\u00e5n h\u00f6ger till v\u00e4nster?", + "pad.settings.fontType": "Typsnitt:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Fast breddsteg", + "pad.settings.globalView": "Global vy", + "pad.settings.language": "Spr\u00e5k:", + "pad.importExport.import_export": "Importera/exportera", + "pad.importExport.import": "Ladda upp en textfil eller dokument", + "pad.importExport.importSuccessful": "\u00c5tg\u00e4rden slutf\u00f6rdes!", + "pad.importExport.export": "Export aktuellt block som:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Oformaterad text", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Du kan endast importera fr\u00e5n oformaterad text eller html-format. F\u00f6r mer avancerade importeringsfunktioner, var god \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstallera abiword\u003C/a\u003E.", + "pad.modals.connected": "Ansluten.", + "pad.modals.reconnecting": "\u00c5teransluter till ditt block...", + "pad.modals.forcereconnect": "Tvinga \u00e5teranslutning", + "pad.modals.userdup": "\u00d6ppnades i ett nytt f\u00f6nster", + "pad.modals.userdup.explanation": "Detta block verkar vara \u00f6ppet i mer \u00e4n ett f\u00f6nster p\u00e5 denna dator.", + "pad.modals.userdup.advice": "\u00c5teranslut f\u00f6r att anv\u00e4nda detta f\u00f6nster ist\u00e4llet.", + "pad.modals.unauth": "Inte godk\u00e4nd", + "pad.modals.unauth.explanation": "Din beh\u00f6righet \u00e4ndrades medan du visar denna sida. F\u00f6rs\u00f6k att \u00e5teransluta.", + "pad.modals.looping": "Fr\u00e5nkopplad.", + "pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppst\u00e5tt.", + "pad.modals.looping.cause": "Kanske du \u00e4r ansluten via en inkompatibel brandv\u00e4gg eller proxy.", + "pad.modals.initsocketfail": "Servern inte kan n\u00e5s.", + "pad.modals.initsocketfail.explanation": "Det gick inte att ansluta till synkroniseringsservern.", + "pad.modals.initsocketfail.cause": "Detta \u00e4r beror troligen p\u00e5 ett problem med din webbl\u00e4sare eller din internetanslutning.", + "pad.modals.slowcommit": "Fr\u00e5nkopplad.", + "pad.modals.slowcommit.explanation": "Servern svarar inte.", + "pad.modals.slowcommit.cause": "Detta kan bero p\u00e5 problem med n\u00e4tverksanslutningen.", + "pad.modals.deleted": "Raderad.", + "pad.modals.deleted.explanation": "Detta block har tagits bort.", + "pad.modals.disconnected": "Du har kopplats fr\u00e5n.", + "pad.modals.disconnected.explanation": "Anslutningen till servern avbr\u00f6ts", + "pad.modals.disconnected.cause": "Servern kanske inte \u00e4r tillg\u00e4nglig. Var god meddela oss om detta forts\u00e4tter att h\u00e4nda.", + "pad.share": "Dela detta block", + "pad.share.readonly": "Skrivskyddad", + "pad.share.link": "L\u00e4nk", + "pad.share.emebdcode": "B\u00e4dda in URL", + "pad.chat": "Chatt", + "pad.chat.title": "\u00d6ppna chatten f\u00f6r detta block.", + "pad.chat.loadmessages": "L\u00e4s in fler meddelanden", + "timeslider.pageTitle": "Tidsreglage f\u00f6r {{appTitle}}", + "timeslider.toolbar.returnbutton": "\u00c5terv\u00e4nd till blocket", + "timeslider.toolbar.authors": "F\u00f6rfattare:", + "timeslider.toolbar.authorsList": "Ingen f\u00f6rfattare", + "timeslider.toolbar.exportlink.title": "Exportera", + "timeslider.exportCurrent": "Exportera aktuell version som:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Sparades den {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januari", + "timeslider.month.february": "februari", + "timeslider.month.march": "mars", + "timeslider.month.april": "april", + "timeslider.month.may": "maj", + "timeslider.month.june": "juni", + "timeslider.month.july": "juli", + "timeslider.month.august": "augusti", + "timeslider.month.september": "september", + "timeslider.month.october": "oktober", + "timeslider.month.november": "november", + "timeslider.month.december": "december", + "timeslider.unnamedauthor": "{{num}} namnl\u00f6s f\u00f6rfattare", + "timeslider.unnamedauthors": "{{num}} namnl\u00f6sa f\u00f6rfattare", + "pad.savedrevs.marked": "Denna revision \u00e4r nu markerad som en sparad revision", + "pad.userlist.entername": "Ange ditt namn", + "pad.userlist.unnamed": "namnl\u00f6s", + "pad.userlist.guest": "G\u00e4st", + "pad.userlist.deny": "Neka", + "pad.userlist.approve": "Godk\u00e4nn", + "pad.editbar.clearcolors": "Rensa f\u00f6rfattarf\u00e4rger p\u00e5 hela dokumentet?", + "pad.impexp.importbutton": "Importera nu", + "pad.impexp.importing": "Importerar...", + "pad.impexp.confirmimport": "Att importera en fil kommer att skriva \u00f6ver den aktuella texten i blocket. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", + "pad.impexp.convertFailed": "Vi kunde inte importera denna fil. Var god anv\u00e4nd ett annat dokumentformat eller kopiera och klistra in den manuellt", + "pad.impexp.uploadFailed": "Uppladdningen misslyckades, var god f\u00f6rs\u00f6k igen", + "pad.impexp.importfailed": "Importering misslyckades", + "pad.impexp.copypaste": "Var god kopiera och klistra in", + "pad.impexp.exportdisabled": "Exportering av formatet {{type}} \u00e4r inaktiverad. Var god kontakta din systemadministrat\u00f6r f\u00f6r mer information." } \ No newline at end of file diff --git a/src/locales/te.json b/src/locales/te.json index 898b40fd..4ffc5df4 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -1,83 +1,83 @@ { - "@metadata": { - "authors": { - "0": "JVRKPRASAD", - "1": "Malkum", - "3": "Veeven" - } - }, - "index.newPad": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c32\u0c15", - "index.createOpenPad": "\u0c12\u0c15 \u0c2a\u0c47\u0c30\u0c41\u0c24\u0c4b \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c05\u0c26\u0c47 \u0c2a\u0c47\u0c30\u0c41\u0c24\u0c4b \u0c09\u0c28\u0c4d\u0c28 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f", - "pad.toolbar.bold.title": "\u0c2e\u0c02\u0c26\u0c02", - "pad.toolbar.italic.title": "\u0c35\u0c3e\u0c32\u0c41 \u0c05\u0c15\u0c4d\u0c37\u0c30\u0c3e\u0c32\u0c41", - "pad.toolbar.underline.title": "\u0c15\u0c4d\u0c30\u0c3f\u0c02\u0c26\u0c17\u0c40\u0c24", - "pad.toolbar.strikethrough.title": "\u0c15\u0c4a\u0c1f\u0c4d\u0c1f\u0c3f\u0c35\u0c47\u0c24", - "pad.toolbar.ol.title": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c47\u0c36\u0c3f\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c28 \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e", - "pad.toolbar.ul.title": "\u0c05\u0c28\u0c3f\u0c30\u0c4d\u0c26\u0c47\u0c36\u0c3f\u0c24 \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e, ( \u0c15\u0c4d\u0c30\u0c2e\u0c2a\u0c26\u0c4d\u0c27\u0c24\u0c3f \u0c32\u0c47\u0c28\u0c3f \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e )", - "pad.toolbar.undo.title": "\u0c1a\u0c47\u0c2f\u0c35\u0c26\u0c4d\u0c26\u0c41", - "pad.toolbar.redo.title": "\u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f\u0c1a\u0c46\u0c2f\u0c4d\u0c2f\u0c3f", - "pad.toolbar.clearAuthorship.title": "\u0c2e\u0c42\u0c32\u0c15\u0c30\u0c4d\u0c24\u0c2a\u0c41 \u0c35\u0c30\u0c4d\u0c23\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c40\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f", - "pad.toolbar.import_export.title": "\u0c2d\u0c3f\u0c28\u0c4d\u0c28\u0c2e\u0c48\u0c28 \u0c30\u0c42\u0c2a\u0c32\u0c3e\u0c35\u0c28\u0c4d\u0c2f\u0c3e\u0c32\u0c28\u0c41 \u0c2c\u0c2f\u0c1f \u0c28\u0c41\u0c02\u0c21\u0c3f \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c2c\u0c2f\u0c1f\u0c15\u0c41 \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", - "pad.toolbar.timeslider.title": "\u0c2a\u0c28\u0c3f\u0c38\u0c2e\u0c2f \u0c38\u0c42\u0c1a\u0c3f\u0c15 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02", - "pad.toolbar.savedRevision.title": "\u0c26\u0c3e\u0c1a\u0c3f\u0c28 \u0c2a\u0c41\u0c28\u0c30\u0c41\u0c1a\u0c4d\u0c1a\u0c30\u0c23\u0c32\u0c41", - "pad.toolbar.settings.title": "\u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", - "pad.toolbar.embed.title": "\u0c08 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c2a\u0c4a\u0c26\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", - "pad.toolbar.showusers.title": "\u0c08 \u0c2a\u0c32\u0c15 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c35\u0c3f\u0c28\u0c3f\u0c2f\u0c4b\u0c17\u0c26\u0c3e\u0c30\u0c41\u0c32\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41", - "pad.colorpicker.save": "\u0c2d\u0c26\u0c4d\u0c30\u0c2a\u0c30\u0c1a\u0c41", - "pad.colorpicker.cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41\u0c1a\u0c47\u0c2f\u0c3f", - "pad.loading": "\u0c32\u0c4b\u0c21\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", - "pad.wrongPassword": "\u0c2e\u0c40 \u0c38\u0c02\u0c15\u0c47\u0c24\u0c2a\u0c26\u0c02 \u0c24\u0c2a\u0c4d\u0c2a\u0c41", - "pad.settings.padSettings": "\u0c2a\u0c32\u0c15 \u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", - "pad.settings.myView": "\u0c28\u0c3e \u0c09\u0c26\u0c4d\u0c26\u0c47\u0c36\u0c4d\u0c2f\u0c2e\u0c41", - "pad.settings.stickychat": "\u0c24\u0c46\u0c30\u0c2a\u0c48\u0c28\u0c47 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c0e\u0c32\u0c4d\u0c32\u0c2a\u0c41\u0c21\u0c41 \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", - "pad.settings.colorcheck": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c15\u0c41 \u0c30\u0c02\u0c17\u0c41\u0c32\u0c41", - "pad.settings.linenocheck": "\u0c35\u0c30\u0c41\u0c38 \u0c38\u0c02\u0c16\u0c4d\u0c2f\u0c32\u0c41", - "pad.settings.fontType": "\u0c05\u0c15\u0c4d\u0c37\u0c30\u0c36\u0c48\u0c32\u0c3f \u0c30\u0c15\u0c02:", - "pad.settings.fontType.normal": "\u0c38\u0c3e\u0c27\u0c3e\u0c30\u0c23", - "pad.settings.fontType.monospaced": "\u0c2e\u0c4b\u0c28\u0c4b\u0c38\u0c4d\u0c2a\u0c47\u0c38\u0c4d", - "pad.settings.globalView": "\u0c2c\u0c2f\u0c1f\u0c15\u0c3f \u0c26\u0c30\u0c4d\u0c36\u0c28\u0c02", - "pad.settings.language": "\u0c2d\u0c3e\u0c37", - "pad.importExport.import_export": "\u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f\/\u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f", - "pad.importExport.import": "\u0c2a\u0c3e\u0c20\u0c2e\u0c41 \u0c26\u0c38\u0c4d\u0c24\u0c4d\u0c30\u0c2e\u0c41 \u0c32\u0c47\u0c26\u0c3e \u0c2a\u0c24\u0c4d\u0c30\u0c2e\u0c41\u0c28\u0c41 \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", - "pad.importExport.importSuccessful": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02!", - "pad.importExport.export": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c2e\u0c41\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", - "pad.importExport.exporthtml": "\u0c39\u0c46\u0c1a\u0c4d \u0c1f\u0c3f \u0c0e\u0c02 \u0c0e\u0c32\u0c4d", - "pad.importExport.exportplain": "\u0c38\u0c3e\u0c26\u0c3e \u0c2a\u0c3e\u0c20\u0c4d\u0c2f\u0c02", - "pad.importExport.exportword": "\u0c2e\u0c48\u0c15\u0c4d\u0c30\u0c4b\u0c38\u0c3e\u0c2b\u0c4d\u0c1f\u0c4d \u0c35\u0c30\u0c4d\u0c21\u0c4d", - "pad.importExport.exportpdf": "\u0c2a\u0c40 \u0c21\u0c3f \u0c0e\u0c2b\u0c4d", - "pad.importExport.exportopen": "\u0c13 \u0c21\u0c3f \u0c0e\u0c2b\u0c4d (\u0c13\u0c2a\u0c46\u0c28\u0c4d \u0c21\u0c3e\u0c15\u0c4d\u0c2f\u0c41\u0c2e\u0c46\u0c02\u0c1f\u0c4d \u0c2b\u0c3e\u0c30\u0c4d\u0c2e\u0c3e\u0c1f\u0c4d)", - "pad.importExport.exportdokuwiki": "\u0c21\u0c3e\u0c15\u0c4d\u0c2f\u0c41\u0c35\u0c3f\u0c15\u0c3f", - "pad.modals.connected": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c41\u0c26\u0c3f\u0c30\u0c3f\u0c02\u0c26\u0c3f.", - "pad.modals.reconnecting": "\u0c2e\u0c40 \u0c2a\u0c32\u0c15\u0c15\u0c41 \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c41\u0c2a\u0c41\u0c24\u0c41\u0c02\u0c26\u0c3f...", - "pad.modals.forcereconnect": "\u0c2c\u0c32\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e\u0c28\u0c48\u0c28\u0c3e \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c41\u0c26\u0c3f\u0c30\u0c3f\u0c02\u0c1a\u0c41", - "pad.modals.userdup.explanation": "\u0c08 \u0c2a\u0c32\u0c15, \u0c08 \u0c15\u0c02\u0c2a\u0c4d\u0c2f\u0c42\u0c1f\u0c30\u0c4d\u0c32\u0c4b \u0c12\u0c15\u0c1f\u0c3f\u0c15\u0c28\u0c4d\u0c28 \u0c0e\u0c15\u0c4d\u0c15\u0c41\u0c35 \u0c17\u0c35\u0c3e\u0c15\u0c4d\u0c37\u0c2e\u0c41\u0c32\u0c32\u0c4b \u0c24\u0c46\u0c30\u0c41\u0c1a\u0c41\u0c15\u0c41\u0c28\u0c4d\u0c28\u0c1f\u0c4d\u0c32\u0c41 \u0c05\u0c28\u0c3f\u0c2a\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f.", - "pad.modals.userdup.advice": "\u0c2c\u0c26\u0c41\u0c32\u0c41\u0c17\u0c3e \u0c08 \u0c17\u0c35\u0c3e\u0c15\u0c4d\u0c37\u0c2e\u0c41\u0c28\u0c41 \u0c35\u0c3e\u0c21\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c2a\u0c02\u0c21\u0c3f", - "pad.modals.unauth": "\u0c05\u0c27\u0c3f\u0c15\u0c3e\u0c30\u0c02 \u0c32\u0c47\u0c26\u0c41", - "pad.modals.unauth.explanation": "\u0c2e\u0c40\u0c30\u0c41 \u0c08 \u0c2a\u0c41\u0c1f\u0c28\u0c41 \u0c1a\u0c42\u0c38\u0c4d\u0c24\u0c42\u0c28\u0c4d\u0c28\u0c2a\u0c4d\u0c2a\u0c41\u0c21\u0c41 \u0c2e\u0c40 \u0c05\u0c28\u0c41\u0c2e\u0c24\u0c41\u0c32\u0c41 \u0c2e\u0c3e\u0c30\u0c3e\u0c2f\u0c3f. \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c2a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f.", - "pad.modals.looping": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c4b\u0c32\u0c4d\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f.", - "pad.modals.slowcommit": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c4b\u0c32\u0c4d\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f.", - "pad.modals.deleted": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f ( \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28\u0c26\u0c3f )", - "pad.share": "\u0c08 \u0c2a\u0c32\u0c15\u0c28\u0c41 \u0c2a\u0c02\u0c1a\u0c41\u0c15\u0c4a\u0c28\u0c41", - "pad.share.readonly": "\u0c1a\u0c26\u0c41\u0c35\u0c41\u0c1f\u0c15\u0c41 \u0c2e\u0c3e\u0c24\u0c4d\u0c30\u0c2e\u0c47", - "pad.share.link": "\u0c32\u0c02\u0c15\u0c46", - "pad.share.emebdcode": "\u0c2f\u0c41 \u0c06\u0c30\u0c4d \u0c0e\u0c32\u0c4d \u0c28\u0c41 \u0c2a\u0c4a\u0c26\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", - "pad.chat": "\u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f", - "pad.chat.title": "\u0c08 \u0c2a\u0c32\u0c15\u0c15\u0c41 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c24\u0c46\u0c30\u0c3f\u0c1a\u0c3f \u0c09\u0c02\u0c1a\u0c02\u0c21\u0c3f.", - "timeslider.pageTitle": "{{appTitle}} \u0c2a\u0c28\u0c3f\u0c38\u0c2e\u0c2f \u0c38\u0c42\u0c1a\u0c3f\u0c15 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02", - "timeslider.toolbar.returnbutton": "\u0c2a\u0c32\u0c15\u0c15\u0c3f \u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f", - "timeslider.toolbar.authors": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c41:", - "timeslider.toolbar.authorsList": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c41 \u0c32\u0c47\u0c30\u0c41", - "timeslider.exportCurrent": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c05\u0c35\u0c24\u0c3e\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c02\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", - "timeslider.month.january": "\u0c1c\u0c28\u0c35\u0c30\u0c3f", - "timeslider.month.february": "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f", - "timeslider.month.march": "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f", - "timeslider.month.april": "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d", - "timeslider.month.may": "\u0c2e\u0c47", - "timeslider.month.june": "\u0c1c\u0c42\u0c28\u0c4d", - "timeslider.month.july": "\u0c1c\u0c42\u0c32\u0c48", - "timeslider.month.august": "\u0c06\u0c17\u0c37\u0c4d\u0c1f\u0c41", - "timeslider.month.september": "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c41", - "timeslider.month.october": "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c41", - "timeslider.month.november": "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c41", - "timeslider.month.december": "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c41" + "@metadata": { + "authors": { + "0": "JVRKPRASAD", + "1": "Malkum", + "3": "Veeven" + } + }, + "index.newPad": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c32\u0c15", + "index.createOpenPad": "\u0c12\u0c15 \u0c2a\u0c47\u0c30\u0c41\u0c24\u0c4b \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c05\u0c26\u0c47 \u0c2a\u0c47\u0c30\u0c41\u0c24\u0c4b \u0c09\u0c28\u0c4d\u0c28 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f", + "pad.toolbar.bold.title": "\u0c2e\u0c02\u0c26\u0c02", + "pad.toolbar.italic.title": "\u0c35\u0c3e\u0c32\u0c41 \u0c05\u0c15\u0c4d\u0c37\u0c30\u0c3e\u0c32\u0c41", + "pad.toolbar.underline.title": "\u0c15\u0c4d\u0c30\u0c3f\u0c02\u0c26\u0c17\u0c40\u0c24", + "pad.toolbar.strikethrough.title": "\u0c15\u0c4a\u0c1f\u0c4d\u0c1f\u0c3f\u0c35\u0c47\u0c24", + "pad.toolbar.ol.title": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c47\u0c36\u0c3f\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c28 \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e", + "pad.toolbar.ul.title": "\u0c05\u0c28\u0c3f\u0c30\u0c4d\u0c26\u0c47\u0c36\u0c3f\u0c24 \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e, ( \u0c15\u0c4d\u0c30\u0c2e\u0c2a\u0c26\u0c4d\u0c27\u0c24\u0c3f \u0c32\u0c47\u0c28\u0c3f \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e )", + "pad.toolbar.undo.title": "\u0c1a\u0c47\u0c2f\u0c35\u0c26\u0c4d\u0c26\u0c41", + "pad.toolbar.redo.title": "\u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f\u0c1a\u0c46\u0c2f\u0c4d\u0c2f\u0c3f", + "pad.toolbar.clearAuthorship.title": "\u0c2e\u0c42\u0c32\u0c15\u0c30\u0c4d\u0c24\u0c2a\u0c41 \u0c35\u0c30\u0c4d\u0c23\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c40\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "pad.toolbar.import_export.title": "\u0c2d\u0c3f\u0c28\u0c4d\u0c28\u0c2e\u0c48\u0c28 \u0c30\u0c42\u0c2a\u0c32\u0c3e\u0c35\u0c28\u0c4d\u0c2f\u0c3e\u0c32\u0c28\u0c41 \u0c2c\u0c2f\u0c1f \u0c28\u0c41\u0c02\u0c21\u0c3f \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c2c\u0c2f\u0c1f\u0c15\u0c41 \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "pad.toolbar.timeslider.title": "\u0c2a\u0c28\u0c3f\u0c38\u0c2e\u0c2f \u0c38\u0c42\u0c1a\u0c3f\u0c15 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02", + "pad.toolbar.savedRevision.title": "\u0c26\u0c3e\u0c1a\u0c3f\u0c28 \u0c2a\u0c41\u0c28\u0c30\u0c41\u0c1a\u0c4d\u0c1a\u0c30\u0c23\u0c32\u0c41", + "pad.toolbar.settings.title": "\u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", + "pad.toolbar.embed.title": "\u0c08 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c2a\u0c4a\u0c26\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "pad.toolbar.showusers.title": "\u0c08 \u0c2a\u0c32\u0c15 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c35\u0c3f\u0c28\u0c3f\u0c2f\u0c4b\u0c17\u0c26\u0c3e\u0c30\u0c41\u0c32\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41", + "pad.colorpicker.save": "\u0c2d\u0c26\u0c4d\u0c30\u0c2a\u0c30\u0c1a\u0c41", + "pad.colorpicker.cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41\u0c1a\u0c47\u0c2f\u0c3f", + "pad.loading": "\u0c32\u0c4b\u0c21\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", + "pad.wrongPassword": "\u0c2e\u0c40 \u0c38\u0c02\u0c15\u0c47\u0c24\u0c2a\u0c26\u0c02 \u0c24\u0c2a\u0c4d\u0c2a\u0c41", + "pad.settings.padSettings": "\u0c2a\u0c32\u0c15 \u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", + "pad.settings.myView": "\u0c28\u0c3e \u0c09\u0c26\u0c4d\u0c26\u0c47\u0c36\u0c4d\u0c2f\u0c2e\u0c41", + "pad.settings.stickychat": "\u0c24\u0c46\u0c30\u0c2a\u0c48\u0c28\u0c47 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c0e\u0c32\u0c4d\u0c32\u0c2a\u0c41\u0c21\u0c41 \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", + "pad.settings.colorcheck": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c15\u0c41 \u0c30\u0c02\u0c17\u0c41\u0c32\u0c41", + "pad.settings.linenocheck": "\u0c35\u0c30\u0c41\u0c38 \u0c38\u0c02\u0c16\u0c4d\u0c2f\u0c32\u0c41", + "pad.settings.fontType": "\u0c05\u0c15\u0c4d\u0c37\u0c30\u0c36\u0c48\u0c32\u0c3f \u0c30\u0c15\u0c02:", + "pad.settings.fontType.normal": "\u0c38\u0c3e\u0c27\u0c3e\u0c30\u0c23", + "pad.settings.fontType.monospaced": "\u0c2e\u0c4b\u0c28\u0c4b\u0c38\u0c4d\u0c2a\u0c47\u0c38\u0c4d", + "pad.settings.globalView": "\u0c2c\u0c2f\u0c1f\u0c15\u0c3f \u0c26\u0c30\u0c4d\u0c36\u0c28\u0c02", + "pad.settings.language": "\u0c2d\u0c3e\u0c37", + "pad.importExport.import_export": "\u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f/\u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f", + "pad.importExport.import": "\u0c2a\u0c3e\u0c20\u0c2e\u0c41 \u0c26\u0c38\u0c4d\u0c24\u0c4d\u0c30\u0c2e\u0c41 \u0c32\u0c47\u0c26\u0c3e \u0c2a\u0c24\u0c4d\u0c30\u0c2e\u0c41\u0c28\u0c41 \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", + "pad.importExport.importSuccessful": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02!", + "pad.importExport.export": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c2e\u0c41\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", + "pad.importExport.exporthtml": "\u0c39\u0c46\u0c1a\u0c4d \u0c1f\u0c3f \u0c0e\u0c02 \u0c0e\u0c32\u0c4d", + "pad.importExport.exportplain": "\u0c38\u0c3e\u0c26\u0c3e \u0c2a\u0c3e\u0c20\u0c4d\u0c2f\u0c02", + "pad.importExport.exportword": "\u0c2e\u0c48\u0c15\u0c4d\u0c30\u0c4b\u0c38\u0c3e\u0c2b\u0c4d\u0c1f\u0c4d \u0c35\u0c30\u0c4d\u0c21\u0c4d", + "pad.importExport.exportpdf": "\u0c2a\u0c40 \u0c21\u0c3f \u0c0e\u0c2b\u0c4d", + "pad.importExport.exportopen": "\u0c13 \u0c21\u0c3f \u0c0e\u0c2b\u0c4d (\u0c13\u0c2a\u0c46\u0c28\u0c4d \u0c21\u0c3e\u0c15\u0c4d\u0c2f\u0c41\u0c2e\u0c46\u0c02\u0c1f\u0c4d \u0c2b\u0c3e\u0c30\u0c4d\u0c2e\u0c3e\u0c1f\u0c4d)", + "pad.importExport.exportdokuwiki": "\u0c21\u0c3e\u0c15\u0c4d\u0c2f\u0c41\u0c35\u0c3f\u0c15\u0c3f", + "pad.modals.connected": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c41\u0c26\u0c3f\u0c30\u0c3f\u0c02\u0c26\u0c3f.", + "pad.modals.reconnecting": "\u0c2e\u0c40 \u0c2a\u0c32\u0c15\u0c15\u0c41 \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c41\u0c2a\u0c41\u0c24\u0c41\u0c02\u0c26\u0c3f...", + "pad.modals.forcereconnect": "\u0c2c\u0c32\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e\u0c28\u0c48\u0c28\u0c3e \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c41\u0c26\u0c3f\u0c30\u0c3f\u0c02\u0c1a\u0c41", + "pad.modals.userdup.explanation": "\u0c08 \u0c2a\u0c32\u0c15, \u0c08 \u0c15\u0c02\u0c2a\u0c4d\u0c2f\u0c42\u0c1f\u0c30\u0c4d\u0c32\u0c4b \u0c12\u0c15\u0c1f\u0c3f\u0c15\u0c28\u0c4d\u0c28 \u0c0e\u0c15\u0c4d\u0c15\u0c41\u0c35 \u0c17\u0c35\u0c3e\u0c15\u0c4d\u0c37\u0c2e\u0c41\u0c32\u0c32\u0c4b \u0c24\u0c46\u0c30\u0c41\u0c1a\u0c41\u0c15\u0c41\u0c28\u0c4d\u0c28\u0c1f\u0c4d\u0c32\u0c41 \u0c05\u0c28\u0c3f\u0c2a\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f.", + "pad.modals.userdup.advice": "\u0c2c\u0c26\u0c41\u0c32\u0c41\u0c17\u0c3e \u0c08 \u0c17\u0c35\u0c3e\u0c15\u0c4d\u0c37\u0c2e\u0c41\u0c28\u0c41 \u0c35\u0c3e\u0c21\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c2a\u0c02\u0c21\u0c3f", + "pad.modals.unauth": "\u0c05\u0c27\u0c3f\u0c15\u0c3e\u0c30\u0c02 \u0c32\u0c47\u0c26\u0c41", + "pad.modals.unauth.explanation": "\u0c2e\u0c40\u0c30\u0c41 \u0c08 \u0c2a\u0c41\u0c1f\u0c28\u0c41 \u0c1a\u0c42\u0c38\u0c4d\u0c24\u0c42\u0c28\u0c4d\u0c28\u0c2a\u0c4d\u0c2a\u0c41\u0c21\u0c41 \u0c2e\u0c40 \u0c05\u0c28\u0c41\u0c2e\u0c24\u0c41\u0c32\u0c41 \u0c2e\u0c3e\u0c30\u0c3e\u0c2f\u0c3f. \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c2a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f.", + "pad.modals.looping": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c4b\u0c32\u0c4d\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f.", + "pad.modals.slowcommit": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c4b\u0c32\u0c4d\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f.", + "pad.modals.deleted": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f ( \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28\u0c26\u0c3f )", + "pad.share": "\u0c08 \u0c2a\u0c32\u0c15\u0c28\u0c41 \u0c2a\u0c02\u0c1a\u0c41\u0c15\u0c4a\u0c28\u0c41", + "pad.share.readonly": "\u0c1a\u0c26\u0c41\u0c35\u0c41\u0c1f\u0c15\u0c41 \u0c2e\u0c3e\u0c24\u0c4d\u0c30\u0c2e\u0c47", + "pad.share.link": "\u0c32\u0c02\u0c15\u0c46", + "pad.share.emebdcode": "\u0c2f\u0c41 \u0c06\u0c30\u0c4d \u0c0e\u0c32\u0c4d \u0c28\u0c41 \u0c2a\u0c4a\u0c26\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "pad.chat": "\u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f", + "pad.chat.title": "\u0c08 \u0c2a\u0c32\u0c15\u0c15\u0c41 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c24\u0c46\u0c30\u0c3f\u0c1a\u0c3f \u0c09\u0c02\u0c1a\u0c02\u0c21\u0c3f.", + "timeslider.pageTitle": "{{appTitle}} \u0c2a\u0c28\u0c3f\u0c38\u0c2e\u0c2f \u0c38\u0c42\u0c1a\u0c3f\u0c15 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02", + "timeslider.toolbar.returnbutton": "\u0c2a\u0c32\u0c15\u0c15\u0c3f \u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f", + "timeslider.toolbar.authors": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c41:", + "timeslider.toolbar.authorsList": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c41 \u0c32\u0c47\u0c30\u0c41", + "timeslider.exportCurrent": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c05\u0c35\u0c24\u0c3e\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c02\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", + "timeslider.month.january": "\u0c1c\u0c28\u0c35\u0c30\u0c3f", + "timeslider.month.february": "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f", + "timeslider.month.march": "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f", + "timeslider.month.april": "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d", + "timeslider.month.may": "\u0c2e\u0c47", + "timeslider.month.june": "\u0c1c\u0c42\u0c28\u0c4d", + "timeslider.month.july": "\u0c1c\u0c42\u0c32\u0c48", + "timeslider.month.august": "\u0c06\u0c17\u0c37\u0c4d\u0c1f\u0c41", + "timeslider.month.september": "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c41", + "timeslider.month.october": "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c41", + "timeslider.month.november": "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c41", + "timeslider.month.december": "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c41" } \ No newline at end of file diff --git a/src/locales/uk.json b/src/locales/uk.json index 0da478cc..641533b0 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -1,122 +1,123 @@ { - "@metadata": { - "authors": { - "0": "Base", - "1": "Olvin", - "3": "Steve.rusyn" - } - }, - "index.newPad": "\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438", - "index.createOpenPad": "\u0430\u0431\u043e \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438\/\u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u043e\u044e:", - "pad.toolbar.bold.title": "\u041d\u0430\u043f\u0456\u0432\u0436\u0438\u0440\u043d\u0438\u0439 (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl-I)", - "pad.toolbar.underline.title": "\u041f\u0456\u0434\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u043d\u044f (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0417\u0430\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u043d\u044f", - "pad.toolbar.ol.title": "\u0423\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.ul.title": "\u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.indent.title": "\u0412\u0456\u0434\u0441\u0442\u0443\u043f", - "pad.toolbar.unindent.title": "\u0412\u0438\u0441\u0442\u0443\u043f", - "pad.toolbar.undo.title": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0438 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.toolbar.import_export.title": "\u0406\u043c\u043f\u043e\u0440\u0442\/\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f\u043c \u0440\u0456\u0437\u043d\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0456\u0432 \u0444\u0430\u0439\u043b\u0456\u0432", - "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0447\u0430\u0441\u0443", - "pad.toolbar.savedRevision.title": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0456 \u0432\u0435\u0440\u0441\u0456\u0457", - "pad.toolbar.settings.title": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", - "pad.toolbar.embed.title": "\u0412\u0431\u0443\u0434\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432 \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.colorpicker.save": "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438", - "pad.colorpicker.cancel": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438", - "pad.loading": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026", - "pad.passwordRequired": "\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u0456\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.permissionDenied": "\u0412\u0438 \u043d\u0435 \u043c\u0430\u0454 \u0434\u043e\u0437\u0432\u043e\u043b\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.wrongPassword": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.settings.padSettings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.settings.myView": "\u041c\u0456\u0439 \u0412\u0438\u0433\u043b\u044f\u0434", - "pad.settings.stickychat": "\u0417\u0430\u0432\u0436\u0434\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0442", - "pad.settings.colorcheck": "\u041a\u043e\u043b\u044c\u043e\u0440\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0438 \u0440\u044f\u0434\u043a\u0456\u0432", - "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0443:", - "pad.settings.fontType.normal": "\u0417\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u0439", - "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u0438\u0439", - "pad.settings.globalView": "\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0432\u0438\u0433\u043b\u044f\u0434", - "pad.settings.language": "\u041c\u043e\u0432\u0430:", - "pad.importExport.import_export": "\u0406\u043c\u043f\u043e\u0440\u0442\/\u0415\u043a\u0441\u043f\u043e\u0440\u0442", - "pad.importExport.import": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0443\u0434\u044c-\u044f\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0438\u0439 \u0444\u0430\u0439\u043b \u0430\u0431\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0456\u0448\u043d\u043e!", - "pad.importExport.export": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u044f\u043a:", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0417\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 OpenOffice)", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0412\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043b\u0438\u0449\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0430\u0431\u043e html. \u0414\u043b\u044f \u0431\u0456\u043b\u044c\u0448 \u043f\u0440\u043e\u0441\u0443\u043d\u0443\u0442\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0456\u0432 \u0456\u043c\u043f\u043e\u0440\u0442\u0443 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u0456\u0442\u044c abiword<\/a>.", - "pad.modals.connected": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.reconnecting": "\u041f\u0435\u0440\u0435\u043f\u0456\u0434\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0434\u043e \u0412\u0430\u0448\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443..", - "pad.modals.forcereconnect": "\u041f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f", - "pad.modals.userdup": "\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0432 \u0456\u043d\u0448\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456", - "pad.modals.userdup.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043c\u043e\u0436\u043b\u0438\u0432\u043e, \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0431\u0456\u043b\u044c\u0448 \u043d\u0456\u0436 \u0432 \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u043e\u043c\u043f'\u044e\u0442\u0435\u0440\u0456.", - "pad.modals.userdup.advice": "\u041f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044c \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u044e\u0447\u0438 \u0446\u0435 \u0432\u0456\u043a\u043d\u043e.", - "pad.modals.unauth": "\u041d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043e", - "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0456 \u043f\u0440\u0430\u0432\u0430 \u0431\u0443\u043b\u043e \u0437\u043c\u0456\u043d\u0435\u043d\u043e \u043f\u0456\u0434 \u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0443 \u0446\u0456\u0454\u0457 \u0441\u0442\u043e\u0440\u0456\u043d\u043a. \u0421\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044c.", - "pad.modals.looping": "\u0412\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.looping.explanation": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0437\u0432'\u0454\u0437\u043a\u0443 \u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0456\u0437\u0430\u0446\u0456\u0457.", - "pad.modals.looping.cause": "\u041c\u043e\u0436\u043b\u0438\u0432\u043e, \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u0443\u043c\u0456\u0441\u043d\u0438\u0439 \u0431\u0440\u0430\u043d\u0434\u043c\u0430\u0443\u0435\u0440 \u0430\u0431\u043e \u043f\u0440\u043e\u043a\u0441\u0456-\u0441\u0435\u0440\u0432\u0435\u0440.", - "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439.", - "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u0434\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0456\u0437\u0430\u0446\u0456\u0457.", - "pad.modals.initsocketfail.cause": "\u0419\u043c\u043e\u0432\u0456\u0440\u043d\u043e, \u0446\u0435 \u043f\u043e\u0432'\u044f\u0437\u0430\u043d\u043e \u0437 \u0412\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0430\u0431\u043e \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0437'\u0454\u0434\u043d\u0430\u043d\u043d\u044f\u043c.", - "pad.modals.slowcommit": "\u0412\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0430\u0454.", - "pad.modals.slowcommit.cause": "\u0426\u0435 \u043c\u043e\u0436\u0435 \u0431\u0443\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f\u043c \u0434\u043e \u043c\u0435\u0440\u0435\u0436\u0456.", - "pad.modals.deleted": "\u0412\u0438\u043b\u0443\u0447\u0435\u043d\u043e.", - "pad.modals.deleted.explanation": "\u0426\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0443\u043b\u043e \u0432\u0438\u043b\u0443\u0447\u0435\u043d\u043e.", - "pad.modals.disconnected": "\u0412\u0430\u0441 \u0431\u0443\u043b\u043e \u0432\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.disconnected.explanation": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0432\u0442\u0440\u0430\u0447\u0435\u043d\u043e", - "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440, \u043c\u043e\u0436\u043b\u0438\u0432\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u0442\u0435 \u043d\u0430\u043c, \u044f\u043a\u0449\u043e \u0446\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044e\u0432\u0430\u0442\u0438\u043c\u0435\u0442\u044c\u0441\u044f.", - "pad.share": "\u041f\u043e\u0434\u0456\u043b\u0438\u0442\u0438\u0441\u044c", - "pad.share.readonly": "\u0422\u0456\u043b\u044c\u043a\u0438 \u0447\u0438\u0442\u0430\u043d\u043d\u044f", - "pad.share.link": "\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f", - "pad.share.emebdcode": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 URL", - "pad.chat": "\u0427\u0430\u0442", - "pad.chat.title": "\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0447\u0430\u0442 \u0434\u043b\u044f \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443.", - "pad.chat.loadmessages": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0456\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u044c", - "timeslider.pageTitle": "\u0427\u0430\u0441\u043e\u0432\u0430 \u0448\u043a\u0430\u043b\u0430 {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438\u0441\u044c \u0434\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u0438:", - "timeslider.toolbar.authorsList": "\u041d\u0435\u043c\u0430\u0454 \u0430\u0432\u0442\u043e\u0440\u0456\u0432", - "timeslider.toolbar.exportlink.title": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442", - "timeslider.exportCurrent": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0443 \u0432\u0435\u0440\u0441\u0456\u044e \u044f\u043a:", - "timeslider.version": "\u0412\u0435\u0440\u0441\u0456\u044f {{version}}", - "timeslider.saved": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0421\u0456\u0447\u0435\u043d\u044c", - "timeslider.month.february": "\u041b\u044e\u0442\u0438\u0439", - "timeslider.month.march": "\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c", - "timeslider.month.april": "\u041a\u0432\u0456\u0442\u0435\u043d\u044c", - "timeslider.month.may": "\u0422\u0440\u0430\u0432\u0435\u043d\u044c", - "timeslider.month.june": "\u0427\u0435\u0440\u0432\u0435\u043d\u044c", - "timeslider.month.july": "\u041b\u0438\u043f\u0435\u043d\u044c", - "timeslider.month.august": "\u0421\u0435\u0440\u043f\u0435\u043d\u044c", - "timeslider.month.september": "\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c", - "timeslider.month.october": "\u0416\u043e\u0432\u0442\u0435\u043d\u044c", - "timeslider.month.november": "\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434", - "timeslider.month.december": "\u0413\u0440\u0443\u0434\u0435\u043d\u044c", - "timeslider.unnamedauthor": "{{num}} \u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u0440", - "timeslider.unnamedauthors": "\u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432: {{num}}", - "pad.savedrevs.marked": "\u0426\u044e \u0432\u0435\u0440\u0441\u0456\u044e \u043f\u043e\u043c\u0456\u0447\u0435\u043d\u043e \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e\u044e \u0432\u0435\u0440\u0441\u0456\u0454\u044e", - "pad.userlist.entername": "\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u0412\u0430\u0448\u0435 \u0456\u043c'\u044f", - "pad.userlist.unnamed": "\u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0439", - "pad.userlist.guest": "\u0413\u0456\u0441\u0442\u044c", - "pad.userlist.deny": "\u0417\u0430\u0431\u043e\u0440\u043e\u043d\u0438\u0442\u0438", - "pad.userlist.approve": "\u041f\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438", - "pad.editbar.clearcolors": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0443 \u0432\u0441\u044c\u043e\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0456?", - "pad.impexp.importbutton": "\u0406\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0437\u0430\u0440\u0430\u0437", - "pad.impexp.importing": "\u0406\u043c\u043f\u043e\u0440\u0442...", - "pad.impexp.confirmimport": "\u0406\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0444\u0430\u0439\u043b\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443. \u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438?", - "pad.impexp.convertFailed": "\u041c\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c\u043e \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0444\u0430\u0439\u043b. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0456\u043d\u0448\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443, \u0430\u0431\u043e \u043f\u0440\u044f\u043c\u043e \u0441\u043a\u043e\u043f\u0456\u044e\u0439\u0442\u0435 \u0442\u0430 \u0432\u0441\u0442\u0430\u0432\u0442\u0435", - "pad.impexp.uploadFailed": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044c, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0441\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u043d\u043e\u0432\u0443", - "pad.impexp.importfailed": "\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u043f\u0440\u0438 \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u043d\u043d\u0456", - "pad.impexp.copypaste": "\u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0441\u043a\u043e\u043f\u0456\u044e\u0439\u0442\u0435 \u0442\u0430 \u0432\u0441\u0442\u0430\u0432\u0442\u0435", - "pad.impexp.exportdisabled": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442 {{type}} \u0432\u0438\u043c\u043a\u043d\u0435\u043d\u043e. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0437\u0432'\u044f\u0436\u0456\u0442\u044c\u0441\u044f \u0456\u0437 \u0412\u0430\u0448\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u043c \u0430\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0437\u0430 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438." + "@metadata": { + "authors": { + "0": "Base", + "1": "Olvin", + "3": "Steve.rusyn" + } + }, + "index.newPad": "\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438", + "index.createOpenPad": "\u0430\u0431\u043e \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438/\u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u043e\u044e:", + "pad.toolbar.bold.title": "\u041d\u0430\u043f\u0456\u0432\u0436\u0438\u0440\u043d\u0438\u0439 (Ctrl-B)", + "pad.toolbar.italic.title": "\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl-I)", + "pad.toolbar.underline.title": "\u041f\u0456\u0434\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u043d\u044f (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0417\u0430\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u043d\u044f", + "pad.toolbar.ol.title": "\u0423\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", + "pad.toolbar.ul.title": "\u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", + "pad.toolbar.indent.title": "\u0412\u0456\u0434\u0441\u0442\u0443\u043f", + "pad.toolbar.unindent.title": "\u0412\u0438\u0441\u0442\u0443\u043f", + "pad.toolbar.undo.title": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0438 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.toolbar.import_export.title": "\u0406\u043c\u043f\u043e\u0440\u0442/\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f\u043c \u0440\u0456\u0437\u043d\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0456\u0432 \u0444\u0430\u0439\u043b\u0456\u0432", + "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0447\u0430\u0441\u0443", + "pad.toolbar.savedRevision.title": "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0432\u0435\u0440\u0441\u0456\u044e", + "pad.toolbar.settings.title": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", + "pad.toolbar.embed.title": "\u041f\u043e\u0434\u0456\u043b\u0438\u0442\u0438\u0441\u044c \u0442\u0430 \u0432\u0431\u0443\u0434\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", + "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432 \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.colorpicker.save": "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438", + "pad.colorpicker.cancel": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438", + "pad.loading": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026", + "pad.passwordRequired": "\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u0456\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.permissionDenied": "\u0412\u0438 \u043d\u0435 \u043c\u0430\u0454 \u0434\u043e\u0437\u0432\u043e\u043b\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.wrongPassword": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c", + "pad.settings.padSettings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.settings.myView": "\u041c\u0456\u0439 \u0412\u0438\u0433\u043b\u044f\u0434", + "pad.settings.stickychat": "\u0417\u0430\u0432\u0436\u0434\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0442", + "pad.settings.colorcheck": "\u041a\u043e\u043b\u044c\u043e\u0440\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0438 \u0440\u044f\u0434\u043a\u0456\u0432", + "pad.settings.rtlcheck": "\u0427\u0438\u0442\u0430\u0442\u0438 \u0432\u043c\u0456\u0441\u0442 \u0437 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u043b\u0456\u0432\u043e?", + "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0443:", + "pad.settings.fontType.normal": "\u0417\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u0439", + "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u0438\u0439", + "pad.settings.globalView": "\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0432\u0438\u0433\u043b\u044f\u0434", + "pad.settings.language": "\u041c\u043e\u0432\u0430:", + "pad.importExport.import_export": "\u0406\u043c\u043f\u043e\u0440\u0442/\u0415\u043a\u0441\u043f\u043e\u0440\u0442", + "pad.importExport.import": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0443\u0434\u044c-\u044f\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0438\u0439 \u0444\u0430\u0439\u043b \u0430\u0431\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", + "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0456\u0448\u043d\u043e!", + "pad.importExport.export": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u044f\u043a:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u0417\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 OpenOffice)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u0412\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043b\u0438\u0449\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0430\u0431\u043e html. \u0414\u043b\u044f \u0431\u0456\u043b\u044c\u0448 \u043f\u0440\u043e\u0441\u0443\u043d\u0443\u0442\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0456\u0432 \u0456\u043c\u043f\u043e\u0440\u0442\u0443 \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u0432\u0441\u0442\u0430\u043d\u043e\u0432\u0456\u0442\u044c abiword\u003C/a\u003E.", + "pad.modals.connected": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043e.", + "pad.modals.reconnecting": "\u041f\u0435\u0440\u0435\u043f\u0456\u0434\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0434\u043e \u0412\u0430\u0448\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443..", + "pad.modals.forcereconnect": "\u041f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f", + "pad.modals.userdup": "\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0432 \u0456\u043d\u0448\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456", + "pad.modals.userdup.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043c\u043e\u0436\u043b\u0438\u0432\u043e, \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0431\u0456\u043b\u044c\u0448 \u043d\u0456\u0436 \u0432 \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u043e\u043c\u043f'\u044e\u0442\u0435\u0440\u0456.", + "pad.modals.userdup.advice": "\u041f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044c \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u044e\u0447\u0438 \u0446\u0435 \u0432\u0456\u043a\u043d\u043e.", + "pad.modals.unauth": "\u041d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043e", + "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0456 \u043f\u0440\u0430\u0432\u0430 \u0431\u0443\u043b\u043e \u0437\u043c\u0456\u043d\u0435\u043d\u043e \u043f\u0456\u0434 \u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0443 \u0446\u0456\u0454\u0457 \u0441\u0442\u043e\u0440\u0456\u043d\u043a. \u0421\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044c.", + "pad.modals.looping": "\u0412\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", + "pad.modals.looping.explanation": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0437\u0432'\u0454\u0437\u043a\u0443 \u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0456\u0437\u0430\u0446\u0456\u0457.", + "pad.modals.looping.cause": "\u041c\u043e\u0436\u043b\u0438\u0432\u043e, \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u0443\u043c\u0456\u0441\u043d\u0438\u0439 \u0431\u0440\u0430\u043d\u0434\u043c\u0430\u0443\u0435\u0440 \u0430\u0431\u043e \u043f\u0440\u043e\u043a\u0441\u0456-\u0441\u0435\u0440\u0432\u0435\u0440.", + "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439.", + "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u0434\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0456\u0437\u0430\u0446\u0456\u0457.", + "pad.modals.initsocketfail.cause": "\u0419\u043c\u043e\u0432\u0456\u0440\u043d\u043e, \u0446\u0435 \u043f\u043e\u0432'\u044f\u0437\u0430\u043d\u043e \u0437 \u0412\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0430\u0431\u043e \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0437'\u0454\u0434\u043d\u0430\u043d\u043d\u044f\u043c.", + "pad.modals.slowcommit": "\u0412\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", + "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0430\u0454.", + "pad.modals.slowcommit.cause": "\u0426\u0435 \u043c\u043e\u0436\u0435 \u0431\u0443\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f\u043c \u0434\u043e \u043c\u0435\u0440\u0435\u0436\u0456.", + "pad.modals.deleted": "\u0412\u0438\u043b\u0443\u0447\u0435\u043d\u043e.", + "pad.modals.deleted.explanation": "\u0426\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0443\u043b\u043e \u0432\u0438\u043b\u0443\u0447\u0435\u043d\u043e.", + "pad.modals.disconnected": "\u0412\u0430\u0441 \u0431\u0443\u043b\u043e \u0432\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", + "pad.modals.disconnected.explanation": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0432\u0442\u0440\u0430\u0447\u0435\u043d\u043e", + "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440, \u043c\u043e\u0436\u043b\u0438\u0432\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u0442\u0435 \u043d\u0430\u043c, \u044f\u043a\u0449\u043e \u0446\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044e\u0432\u0430\u0442\u0438\u043c\u0435\u0442\u044c\u0441\u044f.", + "pad.share": "\u041f\u043e\u0434\u0456\u043b\u0438\u0442\u0438\u0441\u044c", + "pad.share.readonly": "\u0422\u0456\u043b\u044c\u043a\u0438 \u0447\u0438\u0442\u0430\u043d\u043d\u044f", + "pad.share.link": "\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f", + "pad.share.emebdcode": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 URL", + "pad.chat": "\u0427\u0430\u0442", + "pad.chat.title": "\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0447\u0430\u0442 \u0434\u043b\u044f \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443.", + "pad.chat.loadmessages": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0456\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u044c", + "timeslider.pageTitle": "\u0427\u0430\u0441\u043e\u0432\u0430 \u0448\u043a\u0430\u043b\u0430 {{appTitle}}", + "timeslider.toolbar.returnbutton": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438\u0441\u044c \u0434\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", + "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u0438:", + "timeslider.toolbar.authorsList": "\u041d\u0435\u043c\u0430\u0454 \u0430\u0432\u0442\u043e\u0440\u0456\u0432", + "timeslider.toolbar.exportlink.title": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442", + "timeslider.exportCurrent": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0443 \u0432\u0435\u0440\u0441\u0456\u044e \u044f\u043a:", + "timeslider.version": "\u0412\u0435\u0440\u0441\u0456\u044f {{version}}", + "timeslider.saved": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u0421\u0456\u0447\u0435\u043d\u044c", + "timeslider.month.february": "\u041b\u044e\u0442\u0438\u0439", + "timeslider.month.march": "\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c", + "timeslider.month.april": "\u041a\u0432\u0456\u0442\u0435\u043d\u044c", + "timeslider.month.may": "\u0422\u0440\u0430\u0432\u0435\u043d\u044c", + "timeslider.month.june": "\u0427\u0435\u0440\u0432\u0435\u043d\u044c", + "timeslider.month.july": "\u041b\u0438\u043f\u0435\u043d\u044c", + "timeslider.month.august": "\u0421\u0435\u0440\u043f\u0435\u043d\u044c", + "timeslider.month.september": "\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c", + "timeslider.month.october": "\u0416\u043e\u0432\u0442\u0435\u043d\u044c", + "timeslider.month.november": "\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434", + "timeslider.month.december": "\u0413\u0440\u0443\u0434\u0435\u043d\u044c", + "timeslider.unnamedauthor": "{{num}} \u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u0440", + "timeslider.unnamedauthors": "\u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432: {{num}}", + "pad.savedrevs.marked": "\u0426\u044e \u0432\u0435\u0440\u0441\u0456\u044e \u043f\u043e\u043c\u0456\u0447\u0435\u043d\u043e \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e\u044e \u0432\u0435\u0440\u0441\u0456\u0454\u044e", + "pad.userlist.entername": "\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u0412\u0430\u0448\u0435 \u0456\u043c'\u044f", + "pad.userlist.unnamed": "\u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0439", + "pad.userlist.guest": "\u0413\u0456\u0441\u0442\u044c", + "pad.userlist.deny": "\u0417\u0430\u0431\u043e\u0440\u043e\u043d\u0438\u0442\u0438", + "pad.userlist.approve": "\u041f\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438", + "pad.editbar.clearcolors": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0443 \u0432\u0441\u044c\u043e\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0456?", + "pad.impexp.importbutton": "\u0406\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0437\u0430\u0440\u0430\u0437", + "pad.impexp.importing": "\u0406\u043c\u043f\u043e\u0440\u0442...", + "pad.impexp.confirmimport": "\u0406\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0444\u0430\u0439\u043b\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443. \u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438?", + "pad.impexp.convertFailed": "\u041c\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c\u043e \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0444\u0430\u0439\u043b. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0456\u043d\u0448\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443, \u0430\u0431\u043e \u043f\u0440\u044f\u043c\u043e \u0441\u043a\u043e\u043f\u0456\u044e\u0439\u0442\u0435 \u0442\u0430 \u0432\u0441\u0442\u0430\u0432\u0442\u0435", + "pad.impexp.uploadFailed": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044c, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0441\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u043d\u043e\u0432\u0443", + "pad.impexp.importfailed": "\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u043f\u0440\u0438 \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u043d\u043d\u0456", + "pad.impexp.copypaste": "\u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0441\u043a\u043e\u043f\u0456\u044e\u0439\u0442\u0435 \u0442\u0430 \u0432\u0441\u0442\u0430\u0432\u0442\u0435", + "pad.impexp.exportdisabled": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442 {{type}} \u0432\u0438\u043c\u043a\u043d\u0435\u043d\u043e. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0437\u0432'\u044f\u0436\u0456\u0442\u044c\u0441\u044f \u0456\u0437 \u0412\u0430\u0448\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u043c \u0430\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0437\u0430 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438." } \ No newline at end of file diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index a98ebfce..a7f0f81c 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -1,116 +1,116 @@ { - "@metadata": { - "authors": [ - "Dimension", - "Hydra", - "Yfdyh000", - "\u4e4c\u62c9\u8de8\u6c2a", - "\u71c3\u7389" - ] - }, - "index.newPad": "\u65b0\u8bb0\u4e8b\u672c", - "pad.toolbar.bold.title": "\u7c97\u4f53\uff08Ctrl-B\uff09", - "pad.toolbar.italic.title": "\u659c\u4f53 (Ctrl-I)", - "pad.toolbar.underline.title": "\u5e95\u7ebf\uff08Ctrl-U\uff09", - "pad.toolbar.strikethrough.title": "\u5220\u9664\u7ebf", - "pad.toolbar.ol.title": "\u6709\u5e8f\u5217\u8868", - "pad.toolbar.ul.title": "\u65e0\u5e8f\u5217\u8868", - "pad.toolbar.indent.title": "\u7f29\u6392", - "pad.toolbar.unindent.title": "\u51f8\u6392", - "pad.toolbar.undo.title": "\u64a4\u6d88 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u91cd\u505a (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u989c\u8272", - "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6587\u4ef6\u683c\u5f0f\u5bfc\u5165\/\u5bfc\u51fa", - "pad.toolbar.timeslider.title": "\u65f6\u95f4\u8f74", - "pad.toolbar.savedRevision.title": "\u4fdd\u5b58\u4fee\u8ba2", - "pad.toolbar.settings.title": "\u8bbe\u7f6e", - "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64\u8bb0\u4e8b\u672c", - "pad.toolbar.showusers.title": "\u663e\u793a\u6b64\u8bb0\u4e8b\u672c\u7684\u7528\u6237", - "pad.colorpicker.save": "\u4fdd\u5b58", - "pad.colorpicker.cancel": "\u53d6\u6d88", - "pad.loading": "\u8f7d\u5165\u4e2d\u2026\u2026", - "pad.passwordRequired": "\u60a8\u9700\u8981\u4e00\u4e2a\u89c2\u770b\u8fd9\u4e2a\u8bb0\u4e8b\u672c\u7684\u5bc6\u7801", - "pad.permissionDenied": "\u60a8\u6ca1\u6709\u89c2\u770b\u8fd9\u4e2a\u8bb0\u4e8b\u672c\u7684\u6743\u9650", - "pad.wrongPassword": "\u60a8\u7684\u5bc6\u7801\u9519\u4e86", - "pad.settings.padSettings": "\u8bb0\u4e8b\u672c\u8bbe\u7f6e", - "pad.settings.myView": "\u6211\u7684\u89c6\u7a97", - "pad.settings.stickychat": "\u603b\u662f\u5728\u5c4f\u5e55\u4e0a\u663e\u793a\u804a\u5929", - "pad.settings.colorcheck": "\u4f5c\u8005\u989c\u8272", - "pad.settings.linenocheck": "\u884c\u53f7", - "pad.settings.fontType": "\u5b57\u4f53\u7c7b\u578b\uff1a", - "pad.settings.fontType.normal": "\u6b63\u5e38", - "pad.settings.fontType.monospaced": "\u7b49\u5bbd\u5b57\u4f53", - "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u89c6\u7a97", - "pad.settings.language": "\u8bed\u8a00\uff1a", - "pad.importExport.import_export": "\u5bfc\u5165\/\u5bfc\u51fa", - "pad.importExport.import": "\u4e0a\u8f7d\u4efb\u4f55\u6587\u5b57\u6863\u6216\u6587\u6863", - "pad.importExport.importSuccessful": "\u6210\u529f\uff01", - "pad.importExport.export": "\u5bfc\u51fa\u76ee\u524d\u7684\u8bb0\u4e8b\u7c3f\u4e3a\uff1a", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u7eaf\u6587\u672c", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF\uff08\u5f00\u653e\u6587\u6863\u683c\u5f0f\uff09", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "\u5df2\u8fde\u63a5\u3002", - "pad.modals.reconnecting": "\u91cd\u65b0\u8fde\u63a5\u5230\u60a8\u7684\u8bb0\u4e8b\u7c3f...", - "pad.modals.forcereconnect": "\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5", - "pad.modals.userdup": "\u5728\u53e6\u4e00\u4e2a\u89c6\u7a97\u4e2d\u6253\u5f00", - "pad.modals.userdup.explanation": "\u6b64\u8bb0\u4e8b\u7c3f\u4f3c\u4e4e\u5728\u6b64\u7535\u8111\u4e0a\u5728\u591a\u4e2a\u6d4f\u89c8\u5668\u89c6\u7a97\u4e2d\u6253\u5f00\u3002", - "pad.modals.userdup.advice": "\u91cd\u65b0\u8fde\u63a5\u5230\u6b64\u89c6\u7a97\u3002", - "pad.modals.unauth": "\u672a\u6388\u6743", - "pad.modals.looping": "\u5df2\u79bb\u7ebf\u3002", - "pad.modals.initsocketfail": "\u65e0\u6cd5\u8bbf\u95ee\u670d\u52a1\u5668\u3002", - "pad.modals.initsocketfail.explanation": "\u65e0\u6cd5\u8fde\u63a5\u5230\u540c\u6b65\u670d\u52a1\u5668\u3002", - "pad.modals.initsocketfail.cause": "\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u60a8\u7684\u4e92\u8054\u7f51\u8fde\u63a5\u7684\u95ee\u9898\u3002", - "pad.modals.slowcommit": "\u5df2\u79bb\u7ebf\u3002", - "pad.modals.slowcommit.explanation": "\u670d\u52a1\u5668\u6ca1\u6709\u54cd\u5e94\u3002", - "pad.modals.slowcommit.cause": "\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u3002", - "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", - "pad.modals.deleted.explanation": "\u6b64\u8bb0\u4e8b\u672c\u5df2\u88ab\u79fb\u9664\u3002", - "pad.modals.disconnected": "\u60a8\u5df2\u88ab\u79bb\u7ebf\u3002", - "pad.modals.disconnected.explanation": "\u5230\u670d\u52a1\u5668\u7684\u8fde\u63a5\u5df2\u4e22\u5931", - "pad.modals.disconnected.cause": "\u670d\u52a1\u5668\u53ef\u80fd\u65e0\u6cd5\u4f7f\u7528\u3002\u82e5\u6b64\u60c5\u51b5\u6301\u7eed\u53d1\u751f\uff0c\u8bf7\u901a\u77e5\u6211\u4eec\u3002", - "pad.share": "\u5206\u4eab\u6b64\u8bb0\u4e8b\u672c", - "pad.share.readonly": "\u53ea\u80fd\u8bfb", - "pad.share.link": "\u94fe\u63a5", - "pad.share.emebdcode": "\u5d4c\u5165\u7f51\u5740", - "pad.chat": "\u804a\u5929", - "pad.chat.title": "\u6253\u5f00\u6b64\u8bb0\u4e8b\u7c3f\u7684\u804a\u5929\u3002", - "pad.chat.loadmessages": "\u52a0\u8f7d\u66f4\u591a\u4fe1\u606f", - "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u8bb0\u4e8b\u672c", - "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", - "timeslider.toolbar.authorsList": "\u6ca1\u6709\u4f5c\u8005", - "timeslider.toolbar.exportlink.title": "\u5bfc\u51fa", - "timeslider.exportCurrent": "\u5bfc\u51fa\u76ee\u524d\u7248\u672c\u4e3a\uff1a", - "timeslider.version": "\u7b2c {{version}} \u7248\u672c", - "timeslider.saved": "\u5728{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", - "timeslider.month.january": "\u4e00\u6708", - "timeslider.month.february": "\u4e8c\u6708", - "timeslider.month.march": "\u4e09\u6708", - "timeslider.month.april": "\u56db\u6708", - "timeslider.month.may": "\u4e94\u6708", - "timeslider.month.june": "\u516d\u6708", - "timeslider.month.july": "\u4e03\u6708", - "timeslider.month.august": "\u516b\u6708", - "timeslider.month.september": "\u4e5d\u6708", - "timeslider.month.october": "\u5341\u6708", - "timeslider.month.november": "\u5341\u4e00\u6708", - "timeslider.month.december": "\u5341\u4e8c\u6708", - "timeslider.unnamedauthor": "{{num}}\u533f\u540d\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}}\u533f\u540d\u4f5c\u8005", - "pad.savedrevs.marked": "\u6b64\u4fee\u8ba2\u5df2\u6807\u8bb0\u4e3a\u4fdd\u5b58\u4fee\u8ba2", - "pad.userlist.entername": "\u8f93\u5165\u60a8\u7684\u59d3\u540d", - "pad.userlist.unnamed": "\u65e0\u540d", - "pad.userlist.guest": "\u8bbf\u5ba2", - "pad.userlist.deny": "\u62d2\u7edd", - "pad.userlist.approve": "\u6279\u51c6", - "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u4e2a\u6587\u6863\u7684\u4f5c\u8005\u989c\u8272\u5417\uff1f", - "pad.impexp.importbutton": "\u73b0\u5728\u5bfc\u5165", - "pad.impexp.importing": "\u6b63\u5728\u5bfc\u5165...", - "pad.impexp.convertFailed": "\u6211\u4eec\u65e0\u6cd5\u5bfc\u5165\u6b64\u6587\u6863\u3002\u8bf7\u4f7f\u7528\u4ed6\u6587\u6863\u683c\u5f0f\u6216\u624b\u52a8\u590d\u5236\u8d34\u4e0a\u3002", - "pad.impexp.uploadFailed": "\u4e0a\u8f7d\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5", - "pad.impexp.importfailed": "\u5bfc\u5165\u5931\u8d25", - "pad.impexp.copypaste": "\u8bf7\u590d\u5236\u7c98\u8d34", - "pad.impexp.exportdisabled": "{{type}} \u683c\u5f0f\u7684\u5bfc\u51fa\u88ab\u7981\u7528\u3002\u6709\u5173\u8be6\u60c5\uff0c\u8bf7\u4e0e\u60a8\u7684\u7cfb\u7edf\u7ba1\u7406\u5458\u8054\u7cfb\u3002" + "@metadata": { + "authors": [ + "Dimension", + "Hydra", + "Yfdyh000", + "\u4e4c\u62c9\u8de8\u6c2a", + "\u71c3\u7389" + ] + }, + "index.newPad": "\u65b0\u8bb0\u4e8b\u672c", + "pad.toolbar.bold.title": "\u7c97\u4f53\uff08Ctrl-B\uff09", + "pad.toolbar.italic.title": "\u659c\u4f53 (Ctrl-I)", + "pad.toolbar.underline.title": "\u5e95\u7ebf\uff08Ctrl-U\uff09", + "pad.toolbar.strikethrough.title": "\u5220\u9664\u7ebf", + "pad.toolbar.ol.title": "\u6709\u5e8f\u5217\u8868", + "pad.toolbar.ul.title": "\u65e0\u5e8f\u5217\u8868", + "pad.toolbar.indent.title": "\u7f29\u6392", + "pad.toolbar.unindent.title": "\u51f8\u6392", + "pad.toolbar.undo.title": "\u64a4\u6d88 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u91cd\u505a (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u989c\u8272", + "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6587\u4ef6\u683c\u5f0f\u5bfc\u5165/\u5bfc\u51fa", + "pad.toolbar.timeslider.title": "\u65f6\u95f4\u8f74", + "pad.toolbar.savedRevision.title": "\u4fdd\u5b58\u4fee\u8ba2", + "pad.toolbar.settings.title": "\u8bbe\u7f6e", + "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64\u8bb0\u4e8b\u672c", + "pad.toolbar.showusers.title": "\u663e\u793a\u6b64\u8bb0\u4e8b\u672c\u7684\u7528\u6237", + "pad.colorpicker.save": "\u4fdd\u5b58", + "pad.colorpicker.cancel": "\u53d6\u6d88", + "pad.loading": "\u8f7d\u5165\u4e2d\u2026\u2026", + "pad.passwordRequired": "\u60a8\u9700\u8981\u4e00\u4e2a\u89c2\u770b\u8fd9\u4e2a\u8bb0\u4e8b\u672c\u7684\u5bc6\u7801", + "pad.permissionDenied": "\u60a8\u6ca1\u6709\u89c2\u770b\u8fd9\u4e2a\u8bb0\u4e8b\u672c\u7684\u6743\u9650", + "pad.wrongPassword": "\u60a8\u7684\u5bc6\u7801\u9519\u4e86", + "pad.settings.padSettings": "\u8bb0\u4e8b\u672c\u8bbe\u7f6e", + "pad.settings.myView": "\u6211\u7684\u89c6\u7a97", + "pad.settings.stickychat": "\u603b\u662f\u5728\u5c4f\u5e55\u4e0a\u663e\u793a\u804a\u5929", + "pad.settings.colorcheck": "\u4f5c\u8005\u989c\u8272", + "pad.settings.linenocheck": "\u884c\u53f7", + "pad.settings.fontType": "\u5b57\u4f53\u7c7b\u578b\uff1a", + "pad.settings.fontType.normal": "\u6b63\u5e38", + "pad.settings.fontType.monospaced": "\u7b49\u5bbd\u5b57\u4f53", + "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u89c6\u7a97", + "pad.settings.language": "\u8bed\u8a00\uff1a", + "pad.importExport.import_export": "\u5bfc\u5165/\u5bfc\u51fa", + "pad.importExport.import": "\u4e0a\u8f7d\u4efb\u4f55\u6587\u5b57\u6863\u6216\u6587\u6863", + "pad.importExport.importSuccessful": "\u6210\u529f\uff01", + "pad.importExport.export": "\u5bfc\u51fa\u76ee\u524d\u7684\u8bb0\u4e8b\u7c3f\u4e3a\uff1a", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u7eaf\u6587\u672c", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF\uff08\u5f00\u653e\u6587\u6863\u683c\u5f0f\uff09", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u5df2\u8fde\u63a5\u3002", + "pad.modals.reconnecting": "\u91cd\u65b0\u8fde\u63a5\u5230\u60a8\u7684\u8bb0\u4e8b\u7c3f...", + "pad.modals.forcereconnect": "\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5", + "pad.modals.userdup": "\u5728\u53e6\u4e00\u4e2a\u89c6\u7a97\u4e2d\u6253\u5f00", + "pad.modals.userdup.explanation": "\u6b64\u8bb0\u4e8b\u7c3f\u4f3c\u4e4e\u5728\u6b64\u7535\u8111\u4e0a\u5728\u591a\u4e2a\u6d4f\u89c8\u5668\u89c6\u7a97\u4e2d\u6253\u5f00\u3002", + "pad.modals.userdup.advice": "\u91cd\u65b0\u8fde\u63a5\u5230\u6b64\u89c6\u7a97\u3002", + "pad.modals.unauth": "\u672a\u6388\u6743", + "pad.modals.looping": "\u5df2\u79bb\u7ebf\u3002", + "pad.modals.initsocketfail": "\u65e0\u6cd5\u8bbf\u95ee\u670d\u52a1\u5668\u3002", + "pad.modals.initsocketfail.explanation": "\u65e0\u6cd5\u8fde\u63a5\u5230\u540c\u6b65\u670d\u52a1\u5668\u3002", + "pad.modals.initsocketfail.cause": "\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u60a8\u7684\u4e92\u8054\u7f51\u8fde\u63a5\u7684\u95ee\u9898\u3002", + "pad.modals.slowcommit": "\u5df2\u79bb\u7ebf\u3002", + "pad.modals.slowcommit.explanation": "\u670d\u52a1\u5668\u6ca1\u6709\u54cd\u5e94\u3002", + "pad.modals.slowcommit.cause": "\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u3002", + "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", + "pad.modals.deleted.explanation": "\u6b64\u8bb0\u4e8b\u672c\u5df2\u88ab\u79fb\u9664\u3002", + "pad.modals.disconnected": "\u60a8\u5df2\u88ab\u79bb\u7ebf\u3002", + "pad.modals.disconnected.explanation": "\u5230\u670d\u52a1\u5668\u7684\u8fde\u63a5\u5df2\u4e22\u5931", + "pad.modals.disconnected.cause": "\u670d\u52a1\u5668\u53ef\u80fd\u65e0\u6cd5\u4f7f\u7528\u3002\u82e5\u6b64\u60c5\u51b5\u6301\u7eed\u53d1\u751f\uff0c\u8bf7\u901a\u77e5\u6211\u4eec\u3002", + "pad.share": "\u5206\u4eab\u6b64\u8bb0\u4e8b\u672c", + "pad.share.readonly": "\u53ea\u80fd\u8bfb", + "pad.share.link": "\u94fe\u63a5", + "pad.share.emebdcode": "\u5d4c\u5165\u7f51\u5740", + "pad.chat": "\u804a\u5929", + "pad.chat.title": "\u6253\u5f00\u6b64\u8bb0\u4e8b\u7c3f\u7684\u804a\u5929\u3002", + "pad.chat.loadmessages": "\u52a0\u8f7d\u66f4\u591a\u4fe1\u606f", + "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u8bb0\u4e8b\u672c", + "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", + "timeslider.toolbar.authorsList": "\u6ca1\u6709\u4f5c\u8005", + "timeslider.toolbar.exportlink.title": "\u5bfc\u51fa", + "timeslider.exportCurrent": "\u5bfc\u51fa\u76ee\u524d\u7248\u672c\u4e3a\uff1a", + "timeslider.version": "\u7b2c {{version}} \u7248\u672c", + "timeslider.saved": "\u5728{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", + "timeslider.month.january": "\u4e00\u6708", + "timeslider.month.february": "\u4e8c\u6708", + "timeslider.month.march": "\u4e09\u6708", + "timeslider.month.april": "\u56db\u6708", + "timeslider.month.may": "\u4e94\u6708", + "timeslider.month.june": "\u516d\u6708", + "timeslider.month.july": "\u4e03\u6708", + "timeslider.month.august": "\u516b\u6708", + "timeslider.month.september": "\u4e5d\u6708", + "timeslider.month.october": "\u5341\u6708", + "timeslider.month.november": "\u5341\u4e00\u6708", + "timeslider.month.december": "\u5341\u4e8c\u6708", + "timeslider.unnamedauthor": "{{num}}\u533f\u540d\u4f5c\u8005", + "timeslider.unnamedauthors": "{{num}}\u533f\u540d\u4f5c\u8005", + "pad.savedrevs.marked": "\u6b64\u4fee\u8ba2\u5df2\u6807\u8bb0\u4e3a\u4fdd\u5b58\u4fee\u8ba2", + "pad.userlist.entername": "\u8f93\u5165\u60a8\u7684\u59d3\u540d", + "pad.userlist.unnamed": "\u65e0\u540d", + "pad.userlist.guest": "\u8bbf\u5ba2", + "pad.userlist.deny": "\u62d2\u7edd", + "pad.userlist.approve": "\u6279\u51c6", + "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u4e2a\u6587\u6863\u7684\u4f5c\u8005\u989c\u8272\u5417\uff1f", + "pad.impexp.importbutton": "\u73b0\u5728\u5bfc\u5165", + "pad.impexp.importing": "\u6b63\u5728\u5bfc\u5165...", + "pad.impexp.convertFailed": "\u6211\u4eec\u65e0\u6cd5\u5bfc\u5165\u6b64\u6587\u6863\u3002\u8bf7\u4f7f\u7528\u4ed6\u6587\u6863\u683c\u5f0f\u6216\u624b\u52a8\u590d\u5236\u8d34\u4e0a\u3002", + "pad.impexp.uploadFailed": "\u4e0a\u8f7d\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5", + "pad.impexp.importfailed": "\u5bfc\u5165\u5931\u8d25", + "pad.impexp.copypaste": "\u8bf7\u590d\u5236\u7c98\u8d34", + "pad.impexp.exportdisabled": "{{type}} \u683c\u5f0f\u7684\u5bfc\u51fa\u88ab\u7981\u7528\u3002\u6709\u5173\u8be6\u60c5\uff0c\u8bf7\u4e0e\u60a8\u7684\u7cfb\u7edf\u7ba1\u7406\u5458\u8054\u7cfb\u3002" } \ No newline at end of file diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index 7b5c725c..c194545c 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -1,122 +1,122 @@ { - "@metadata": { - "authors": { - "0": "Shirayuki", - "2": "Simon Shek" - } - }, - "index.newPad": "\u65b0Pad", - "index.createOpenPad": "\u6216\u5275\u5efa\uff0f\u958b\u555f\u4ee5\u4e0b\u540d\u7a31\u7684pad\uff1a", - "pad.toolbar.bold.title": "\u7c97\u9ad4\uff08Ctrl-B\uff09", - "pad.toolbar.italic.title": "\u659c\u9ad4\uff08Ctrl-I\uff09", - "pad.toolbar.underline.title": "\u5e95\u7dda\uff08Ctrl-U\uff09", - "pad.toolbar.strikethrough.title": "\u522a\u9664\u7dda", - "pad.toolbar.ol.title": "\u6709\u5e8f\u6e05\u55ae", - "pad.toolbar.ul.title": "\u7121\u5e8f\u6e05\u55ae", - "pad.toolbar.indent.title": "\u7e2e\u6392", - "pad.toolbar.unindent.title": "\u51f8\u6392", - "pad.toolbar.undo.title": "\u64a4\u92b7\uff08Ctrl-Z\uff09", - "pad.toolbar.redo.title": "\u91cd\u505a\uff08Ctrl-Y\uff09", - "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u984f\u8272", - "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u5c0e\u5165\uff0f\u532f\u51fa", - "pad.toolbar.timeslider.title": "\u6642\u9593\u8ef8", - "pad.toolbar.savedRevision.title": "\u5132\u5b58\u4fee\u8a02", - "pad.toolbar.settings.title": "\u8a2d\u5b9a", - "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64pad", - "pad.toolbar.showusers.title": "\u986f\u793a\u6b64pad\u7684\u7528\u6236", - "pad.colorpicker.save": "\u5132\u5b58", - "pad.colorpicker.cancel": "\u53d6\u6d88", - "pad.loading": "\u8f09\u5165\u4e2d...", - "pad.passwordRequired": "\u60a8\u9700\u8981\u5bc6\u78bc\u624d\u80fd\u8a2a\u554f\u9019\u500bpad", - "pad.permissionDenied": "\u4f60\u6c92\u6709\u8a2a\u554f\u9019\u500bpad\u7684\u6b0a\u9650", - "pad.wrongPassword": "\u5bc6\u78bc\u932f\u8aa4", - "pad.settings.padSettings": "Pad\u8a2d\u5b9a", - "pad.settings.myView": "\u6211\u7684\u8996\u7a97", - "pad.settings.stickychat": "\u6c38\u9060\u5728\u5c4f\u5e55\u4e0a\u986f\u793a\u804a\u5929", - "pad.settings.colorcheck": "\u4f5c\u8005\u984f\u8272", - "pad.settings.linenocheck": "\u884c\u865f", - "pad.settings.rtlcheck": "\u5f9e\u53f3\u81f3\u5de6\u8b80\u53d6\u5167\u5bb9\uff1f", - "pad.settings.fontType": "\u5b57\u9ad4\u985e\u578b\uff1a", - "pad.settings.fontType.normal": "\u6b63\u5e38", - "pad.settings.fontType.monospaced": "\u7b49\u5bec", - "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u8996\u7a97", - "pad.settings.language": "\u8a9e\u8a00\uff1a", - "pad.importExport.import_export": "\u5c0e\u5165\uff0f\u532f\u51fa", - "pad.importExport.import": "\u4e0a\u8f09\u4efb\u4f55\u6587\u5b57\u6a94\u6216\u6587\u6a94", - "pad.importExport.importSuccessful": "\u5b8c\u6210\uff01", - "pad.importExport.export": "\u532f\u51fa\u7576\u524dpad\u70ba\uff1a", - "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u7d14\u6587\u5b57", - "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF\uff08\u958b\u653e\u6587\u4ef6\u683c\u5f0f\uff09", - "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u60a8\u53ea\u53ef\u4ee5\u7d14\u6587\u5b57\u6216html\u683c\u5f0f\u6a94\u532f\u5165\u3002\u5b89\u88ddabiword<\/a>\u53d6\u5f97\u66f4\u591a\u9032\u968e\u7684\u532f\u5165\u529f\u80fd\u3002", - "pad.modals.connected": "\u5df2\u9023\u7dda\u3002", - "pad.modals.reconnecting": "\u91cd\u65b0\u9023\u63a5\u5230\u60a8\u7684pad...", - "pad.modals.forcereconnect": "\u5f37\u5236\u91cd\u65b0\u9023\u7dda", - "pad.modals.userdup": "\u5728\u53e6\u4e00\u500b\u8996\u7a97\u4e2d\u958b\u555f", - "pad.modals.userdup.explanation": "\u6b64pad\u4f3c\u4e4e\u5728\u6b64\u96fb\u8166\u4e0a\u7684\u591a\u500b\u700f\u89bd\u5668\u8996\u7a97\u4e2d\u958b\u555f\u3002", - "pad.modals.userdup.advice": "\u91cd\u65b0\u9023\u63a5\u5230\u6b64\u8996\u7a97\u3002", - "pad.modals.unauth": "\u672a\u6388\u6b0a", - "pad.modals.unauth.explanation": "\u60a8\u7684\u6b0a\u9650\u5728\u67e5\u770b\u6b64\u9801\u6642\u767c\u751f\u66f4\u6539\u3002\u8acb\u5617\u8a66\u91cd\u65b0\u9023\u63a5\u3002", - "pad.modals.looping": "\u5df2\u96e2\u7dda\u3002", - "pad.modals.looping.explanation": "\u8207\u540c\u6b65\u4f3a\u670d\u5668\u9593\u6709\u901a\u4fe1\u554f\u984c\u3002", - "pad.modals.looping.cause": "\u4e5f\u8a31\u60a8\u901a\u904e\u4e00\u500b\u4e0d\u76f8\u5bb9\u7684\u9632\u706b\u7246\u6216\u4ee3\u7406\u4f3a\u670d\u5668\u9023\u63a5\u3002", - "pad.modals.initsocketfail": "\u7121\u6cd5\u8a2a\u554f\u4f3a\u670d\u5668\u3002", - "pad.modals.initsocketfail.explanation": "\u7121\u6cd5\u9023\u63a5\u5230\u540c\u6b65\u4f3a\u670d\u5668\u3002", - "pad.modals.initsocketfail.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u60a8\u7684\u700f\u89bd\u5668\u6216\u60a8\u7684\u4e92\u806f\u7db2\u9023\u63a5\u7684\u554f\u984c\u3002", - "pad.modals.slowcommit": "\u5df2\u96e2\u7dda\u3002", - "pad.modals.slowcommit.explanation": "\u4f3a\u670d\u5668\u6c92\u6709\u56de\u61c9\u3002", - "pad.modals.slowcommit.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u7db2\u8def\u9023\u63a5\u554f\u984c\u3002", - "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", - "pad.modals.deleted.explanation": "\u6b64pad\u5df2\u88ab\u79fb\u9664\u3002", - "pad.modals.disconnected": "\u60a8\u5df2\u4e2d\u65b7\u9023\u7dda\u3002", - "pad.modals.disconnected.explanation": "\u4f3a\u670d\u5668\u9023\u63a5\u66fe\u4e2d\u65b7", - "pad.modals.disconnected.cause": "\u4f3a\u670d\u5668\u53ef\u80fd\u7121\u6cd5\u4f7f\u7528\u3002\u82e5\u6b64\u60c5\u6cc1\u6301\u7e8c\u767c\u751f\uff0c\u8acb\u901a\u77e5\u6211\u5011\u3002", - "pad.share": "\u5206\u4eab\u6b64pad", - "pad.share.readonly": "\u552f\u8b80", - "pad.share.link": "\u9023\u7d50", - "pad.share.emebdcode": "\u5d4c\u5165\u7db2\u5740", - "pad.chat": "\u804a\u5929", - "pad.chat.title": "\u6253\u958b\u6b64pad\u7684\u804a\u5929\u3002", - "pad.chat.loadmessages": "\u8f09\u5165\u66f4\u591a\u8a0a\u606f", - "timeslider.pageTitle": "{{appTitle}}\u6642\u9593\u8ef8", - "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u5230pad", - "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", - "timeslider.toolbar.authorsList": "\u7121\u4f5c\u8005", - "timeslider.toolbar.exportlink.title": "\u532f\u51fa", - "timeslider.exportCurrent": "\u532f\u51fa\u7576\u524d\u7248\u672c\u70ba\uff1a", - "timeslider.version": "\u7248\u672c{{version}}", - "timeslider.saved": "{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", - "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "1\u6708", - "timeslider.month.february": "2\u6708", - "timeslider.month.march": "3\u6708", - "timeslider.month.april": "4\u6708", - "timeslider.month.may": "5\u6708", - "timeslider.month.june": "6\u6708", - "timeslider.month.july": "7\u6708", - "timeslider.month.august": "8\u6708", - "timeslider.month.september": "9\u6708", - "timeslider.month.october": "10\u6708", - "timeslider.month.november": "11\u6708", - "timeslider.month.december": "12\u6708", - "timeslider.unnamedauthor": "{{num}} \u533f\u540d\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}} \u533f\u540d\u4f5c\u8005", - "pad.savedrevs.marked": "\u6b64\u4fee\u8a02\u5df2\u6a19\u8a18\u70ba\u5df2\u4fdd\u5b58\u3002", - "pad.userlist.entername": "\u8f38\u5165\u60a8\u7684\u59d3\u540d", - "pad.userlist.unnamed": "\u672a\u547d\u540d", - "pad.userlist.guest": "\u8a2a\u5ba2", - "pad.userlist.deny": "\u62d2\u7d55", - "pad.userlist.approve": "\u6279\u51c6", - "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u500b\u6587\u6a94\u7684\u4f5c\u8005\u984f\u8272\u55ce\uff1f", - "pad.impexp.importbutton": "\u73fe\u5728\u532f\u5165", - "pad.impexp.importing": "\u532f\u5165\u4e2d...", - "pad.impexp.confirmimport": "\u532f\u5165\u7684\u6a94\u6848\u5c07\u6703\u8986\u84cbpad\u5167\u76ee\u524d\u7684\u6587\u5b57\u3002\u60a8\u78ba\u5b9a\u8981\u7e7c\u7e8c\u55ce\uff1f", - "pad.impexp.convertFailed": "\u672a\u80fd\u532f\u5165\u6b64\u6a94\u6848\u3002\u8acb\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u6216\u624b\u52d5\u8907\u88fd\u8cbc\u4e0a\u532f\u5165\u3002", - "pad.impexp.uploadFailed": "\u4e0a\u8f09\u5931\u6557\uff0c\u8acb\u91cd\u8a66", - "pad.impexp.importfailed": "\u532f\u5165\u5931\u6557", - "pad.impexp.copypaste": "\u8acb\u8907\u88fd\u8cbc\u4e0a", - "pad.impexp.exportdisabled": "{{type}}\u683c\u5f0f\u7684\u532f\u51fa\u88ab\u7981\u7528\u3002\u6709\u95dc\u8a73\u60c5\uff0c\u8acb\u8207\u60a8\u7684\u7cfb\u7d71\u7ba1\u7406\u54e1\u806f\u7e6b\u3002" + "@metadata": { + "authors": { + "0": "Shirayuki", + "2": "Simon Shek" + } + }, + "index.newPad": "\u65b0Pad", + "index.createOpenPad": "\u6216\u5275\u5efa\uff0f\u958b\u555f\u4ee5\u4e0b\u540d\u7a31\u7684pad\uff1a", + "pad.toolbar.bold.title": "\u7c97\u9ad4\uff08Ctrl-B\uff09", + "pad.toolbar.italic.title": "\u659c\u9ad4\uff08Ctrl-I\uff09", + "pad.toolbar.underline.title": "\u5e95\u7dda\uff08Ctrl-U\uff09", + "pad.toolbar.strikethrough.title": "\u522a\u9664\u7dda", + "pad.toolbar.ol.title": "\u6709\u5e8f\u6e05\u55ae", + "pad.toolbar.ul.title": "\u7121\u5e8f\u6e05\u55ae", + "pad.toolbar.indent.title": "\u7e2e\u6392", + "pad.toolbar.unindent.title": "\u51f8\u6392", + "pad.toolbar.undo.title": "\u64a4\u92b7\uff08Ctrl-Z\uff09", + "pad.toolbar.redo.title": "\u91cd\u505a\uff08Ctrl-Y\uff09", + "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u984f\u8272", + "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u5c0e\u5165\uff0f\u532f\u51fa", + "pad.toolbar.timeslider.title": "\u6642\u9593\u8ef8", + "pad.toolbar.savedRevision.title": "\u5132\u5b58\u4fee\u8a02", + "pad.toolbar.settings.title": "\u8a2d\u5b9a", + "pad.toolbar.embed.title": "\u5206\u4eab\u548c\u5d4c\u5165\u6b64pad", + "pad.toolbar.showusers.title": "\u986f\u793a\u6b64pad\u7684\u7528\u6236", + "pad.colorpicker.save": "\u5132\u5b58", + "pad.colorpicker.cancel": "\u53d6\u6d88", + "pad.loading": "\u8f09\u5165\u4e2d...", + "pad.passwordRequired": "\u60a8\u9700\u8981\u5bc6\u78bc\u624d\u80fd\u8a2a\u554f\u9019\u500bpad", + "pad.permissionDenied": "\u4f60\u6c92\u6709\u8a2a\u554f\u9019\u500bpad\u7684\u6b0a\u9650", + "pad.wrongPassword": "\u5bc6\u78bc\u932f\u8aa4", + "pad.settings.padSettings": "Pad\u8a2d\u5b9a", + "pad.settings.myView": "\u6211\u7684\u8996\u7a97", + "pad.settings.stickychat": "\u6c38\u9060\u5728\u5c4f\u5e55\u4e0a\u986f\u793a\u804a\u5929", + "pad.settings.colorcheck": "\u4f5c\u8005\u984f\u8272", + "pad.settings.linenocheck": "\u884c\u865f", + "pad.settings.rtlcheck": "\u5f9e\u53f3\u81f3\u5de6\u8b80\u53d6\u5167\u5bb9\uff1f", + "pad.settings.fontType": "\u5b57\u9ad4\u985e\u578b\uff1a", + "pad.settings.fontType.normal": "\u6b63\u5e38", + "pad.settings.fontType.monospaced": "\u7b49\u5bec", + "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u8996\u7a97", + "pad.settings.language": "\u8a9e\u8a00\uff1a", + "pad.importExport.import_export": "\u5c0e\u5165\uff0f\u532f\u51fa", + "pad.importExport.import": "\u4e0a\u8f09\u4efb\u4f55\u6587\u5b57\u6a94\u6216\u6587\u6a94", + "pad.importExport.importSuccessful": "\u5b8c\u6210\uff01", + "pad.importExport.export": "\u532f\u51fa\u7576\u524dpad\u70ba\uff1a", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u7d14\u6587\u5b57", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF\uff08\u958b\u653e\u6587\u4ef6\u683c\u5f0f\uff09", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "\u60a8\u53ea\u53ef\u4ee5\u7d14\u6587\u5b57\u6216html\u683c\u5f0f\u6a94\u532f\u5165\u3002\u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003E\u5b89\u88ddabiword\u003C/a\u003E\u53d6\u5f97\u66f4\u591a\u9032\u968e\u7684\u532f\u5165\u529f\u80fd\u3002", + "pad.modals.connected": "\u5df2\u9023\u7dda\u3002", + "pad.modals.reconnecting": "\u91cd\u65b0\u9023\u63a5\u5230\u60a8\u7684pad...", + "pad.modals.forcereconnect": "\u5f37\u5236\u91cd\u65b0\u9023\u7dda", + "pad.modals.userdup": "\u5728\u53e6\u4e00\u500b\u8996\u7a97\u4e2d\u958b\u555f", + "pad.modals.userdup.explanation": "\u6b64pad\u4f3c\u4e4e\u5728\u6b64\u96fb\u8166\u4e0a\u7684\u591a\u500b\u700f\u89bd\u5668\u8996\u7a97\u4e2d\u958b\u555f\u3002", + "pad.modals.userdup.advice": "\u91cd\u65b0\u9023\u63a5\u5230\u6b64\u8996\u7a97\u3002", + "pad.modals.unauth": "\u672a\u6388\u6b0a", + "pad.modals.unauth.explanation": "\u60a8\u7684\u6b0a\u9650\u5728\u67e5\u770b\u6b64\u9801\u6642\u767c\u751f\u66f4\u6539\u3002\u8acb\u5617\u8a66\u91cd\u65b0\u9023\u63a5\u3002", + "pad.modals.looping": "\u5df2\u96e2\u7dda\u3002", + "pad.modals.looping.explanation": "\u8207\u540c\u6b65\u4f3a\u670d\u5668\u9593\u6709\u901a\u4fe1\u554f\u984c\u3002", + "pad.modals.looping.cause": "\u4e5f\u8a31\u60a8\u901a\u904e\u4e00\u500b\u4e0d\u76f8\u5bb9\u7684\u9632\u706b\u7246\u6216\u4ee3\u7406\u4f3a\u670d\u5668\u9023\u63a5\u3002", + "pad.modals.initsocketfail": "\u7121\u6cd5\u8a2a\u554f\u4f3a\u670d\u5668\u3002", + "pad.modals.initsocketfail.explanation": "\u7121\u6cd5\u9023\u63a5\u5230\u540c\u6b65\u4f3a\u670d\u5668\u3002", + "pad.modals.initsocketfail.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u60a8\u7684\u700f\u89bd\u5668\u6216\u60a8\u7684\u4e92\u806f\u7db2\u9023\u63a5\u7684\u554f\u984c\u3002", + "pad.modals.slowcommit": "\u5df2\u96e2\u7dda\u3002", + "pad.modals.slowcommit.explanation": "\u4f3a\u670d\u5668\u6c92\u6709\u56de\u61c9\u3002", + "pad.modals.slowcommit.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u7db2\u8def\u9023\u63a5\u554f\u984c\u3002", + "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", + "pad.modals.deleted.explanation": "\u6b64pad\u5df2\u88ab\u79fb\u9664\u3002", + "pad.modals.disconnected": "\u60a8\u5df2\u4e2d\u65b7\u9023\u7dda\u3002", + "pad.modals.disconnected.explanation": "\u4f3a\u670d\u5668\u9023\u63a5\u66fe\u4e2d\u65b7", + "pad.modals.disconnected.cause": "\u4f3a\u670d\u5668\u53ef\u80fd\u7121\u6cd5\u4f7f\u7528\u3002\u82e5\u6b64\u60c5\u6cc1\u6301\u7e8c\u767c\u751f\uff0c\u8acb\u901a\u77e5\u6211\u5011\u3002", + "pad.share": "\u5206\u4eab\u6b64pad", + "pad.share.readonly": "\u552f\u8b80", + "pad.share.link": "\u9023\u7d50", + "pad.share.emebdcode": "\u5d4c\u5165\u7db2\u5740", + "pad.chat": "\u804a\u5929", + "pad.chat.title": "\u6253\u958b\u6b64pad\u7684\u804a\u5929\u3002", + "pad.chat.loadmessages": "\u8f09\u5165\u66f4\u591a\u8a0a\u606f", + "timeslider.pageTitle": "{{appTitle}}\u6642\u9593\u8ef8", + "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u5230pad", + "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", + "timeslider.toolbar.authorsList": "\u7121\u4f5c\u8005", + "timeslider.toolbar.exportlink.title": "\u532f\u51fa", + "timeslider.exportCurrent": "\u532f\u51fa\u7576\u524d\u7248\u672c\u70ba\uff1a", + "timeslider.version": "\u7248\u672c{{version}}", + "timeslider.saved": "{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", + "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "1\u6708", + "timeslider.month.february": "2\u6708", + "timeslider.month.march": "3\u6708", + "timeslider.month.april": "4\u6708", + "timeslider.month.may": "5\u6708", + "timeslider.month.june": "6\u6708", + "timeslider.month.july": "7\u6708", + "timeslider.month.august": "8\u6708", + "timeslider.month.september": "9\u6708", + "timeslider.month.october": "10\u6708", + "timeslider.month.november": "11\u6708", + "timeslider.month.december": "12\u6708", + "timeslider.unnamedauthor": "{{num}} \u533f\u540d\u4f5c\u8005", + "timeslider.unnamedauthors": "{{num}} \u533f\u540d\u4f5c\u8005", + "pad.savedrevs.marked": "\u6b64\u4fee\u8a02\u5df2\u6a19\u8a18\u70ba\u5df2\u4fdd\u5b58\u3002", + "pad.userlist.entername": "\u8f38\u5165\u60a8\u7684\u59d3\u540d", + "pad.userlist.unnamed": "\u672a\u547d\u540d", + "pad.userlist.guest": "\u8a2a\u5ba2", + "pad.userlist.deny": "\u62d2\u7d55", + "pad.userlist.approve": "\u6279\u51c6", + "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u500b\u6587\u6a94\u7684\u4f5c\u8005\u984f\u8272\u55ce\uff1f", + "pad.impexp.importbutton": "\u73fe\u5728\u532f\u5165", + "pad.impexp.importing": "\u532f\u5165\u4e2d...", + "pad.impexp.confirmimport": "\u532f\u5165\u7684\u6a94\u6848\u5c07\u6703\u8986\u84cbpad\u5167\u76ee\u524d\u7684\u6587\u5b57\u3002\u60a8\u78ba\u5b9a\u8981\u7e7c\u7e8c\u55ce\uff1f", + "pad.impexp.convertFailed": "\u672a\u80fd\u532f\u5165\u6b64\u6a94\u6848\u3002\u8acb\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u6216\u624b\u52d5\u8907\u88fd\u8cbc\u4e0a\u532f\u5165\u3002", + "pad.impexp.uploadFailed": "\u4e0a\u8f09\u5931\u6557\uff0c\u8acb\u91cd\u8a66", + "pad.impexp.importfailed": "\u532f\u5165\u5931\u6557", + "pad.impexp.copypaste": "\u8acb\u8907\u88fd\u8cbc\u4e0a", + "pad.impexp.exportdisabled": "{{type}}\u683c\u5f0f\u7684\u532f\u51fa\u88ab\u7981\u7528\u3002\u6709\u95dc\u8a73\u60c5\uff0c\u8acb\u8207\u60a8\u7684\u7cfb\u7d71\u7ba1\u7406\u54e1\u806f\u7e6b\u3002" } \ No newline at end of file From 85c68b1f5157c9ccb81593ee2ca3b1dc0806eb66 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 7 Apr 2013 16:28:28 +0100 Subject: [PATCH 229/463] rewrite author to actual author on changes --- src/node/handler/PadMessageHandler.js | 46 +++++++++++++++++++-------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 85efb008..b463c9b7 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -579,20 +579,6 @@ function handleUserChanges(client, message) throw "Attribute pool is missing attribute "+n+" for changeset "+changeset; } }); - - // Validate all added 'author' attribs to be the same value as the current user - var iterator = Changeset.opIterator(Changeset.unpack(changeset).ops) - , op - while(iterator.hasNext()) { - op = iterator.next() - if(op.opcode != '+') continue; - op.attribs.split('*').forEach(function(attr) { - if(!attr) return - attr = wireApool.getAttrib(attr) - if(!attr) return - if('author' == attr[0] && attr[1] != thisSession.author) throw "Trying to submit changes as another author" - }) - } } catch(e) { @@ -602,6 +588,38 @@ function handleUserChanges(client, message) return; } + // Force the change to be by the author session + // Make sure the actual author is this session AuthorID + + // We need to replace wireApool numToAttrib array where first value is author + // With thisSession.author + var numToAttr = wireApool.numToAttrib; + if(numToAttr){ + for (var attr in numToAttr){ + if (numToAttr[attr][0] === 'author'){ + // We force write the author over a change, for sanity n stuff + wireApool.numToAttrib[attr][1] = thisSession.author; + } + } + } + + // We need to replace wireApool attrToNum value where the first value before + // the comma is author with thisSession.author + var attrToNum = wireApool.attribToNum; + if(attrToNum){ + for (var attr in attrToNum){ + var splitAttr = attr.split(','); + var isAuthor = (splitAttr[0] === 'author'); // Is it an author val? + if (isAuthor){ + // We force write the author over a change, for sanity n stuff + var newValue = 'author,'+thisSession.author; // Create a new value + var key = attrToNum[attr]; // Key is actually the value + delete wireApool.attribToNum[attr]; // Delete the old value + wireApool.attribToNum[newValue] = key; // Write a new value + } + } + } + //ex. adoptChangesetAttribs //Afaik, it copies the new attributes from the changeset, to the global Attribute Pool From 555be31eab7fc3723a84510f45b8e71d92fb8eb4 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 7 Apr 2013 17:11:22 +0000 Subject: [PATCH 230/463] Localisation updates from http://translatewiki.net. --- src/locales/ksh.json | 2 +- src/locales/nb.json | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 6890d3f5..1d3a6b4d 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -21,7 +21,7 @@ "pad.toolbar.timeslider.title": "Verjangeheid afschpelle", "pad.toolbar.savedRevision.title": "de Versjohn fa\u00dfhallde", "pad.toolbar.settings.title": "Enscht\u00e4llonge", - "pad.toolbar.embed.title": "Donn dat Padd enbenge", + "pad.toolbar.embed.title": "Donn dat Padd \u00f6ffentlesch maache un enbenge", "pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije", "pad.colorpicker.save": "Fa\u00dfhallde", "pad.colorpicker.cancel": "Oph\u00fc\u00fcre", diff --git a/src/locales/nb.json b/src/locales/nb.json index bc35c3e7..834c6917 100644 --- a/src/locales/nb.json +++ b/src/locales/nb.json @@ -1,4 +1,9 @@ { + "@metadata": { + "authors": [ + "Laaknor" + ] + }, "index.newPad": "Ny Pad", "index.createOpenPad": "eller opprette/\u00e5pne en ny Pad med dette navnet:", "pad.toolbar.bold.title": "Fet (Ctrl-B)", @@ -112,10 +117,5 @@ "pad.impexp.uploadFailed": "Opplastning feilet. Pr\u00f8v igjen", "pad.impexp.importfailed": "Import feilet", "pad.impexp.copypaste": "Vennligst kopier og lim inn", - "pad.impexp.exportdisabled": "Eksporterer som {{type}} er deaktivert. Vennligst kontakt din systemadministrator for detaljer.", - "@metadata": { - "authors": [ - "Laaknor" - ] - } + "pad.impexp.exportdisabled": "Eksporterer som {{type}} er deaktivert. Vennligst kontakt din systemadministrator for detaljer." } \ No newline at end of file From 12a2da2884895fa7e1afb25b5e1384d53af20730 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 7 Apr 2013 18:40:55 +0100 Subject: [PATCH 231/463] attempting to get right client authorid sent with changeset --- src/static/js/changesettracker.js | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/static/js/changesettracker.js b/src/static/js/changesettracker.js index 58ef21cb..e641cff7 100644 --- a/src/static/js/changesettracker.js +++ b/src/static/js/changesettracker.js @@ -26,6 +26,8 @@ var Changeset = require('./Changeset'); function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) { +//console.log("CS", Changeset); + // latest official text from server var baseAText = Changeset.makeAText("\n"); // changes applied to baseText that have been submitted @@ -161,6 +163,40 @@ function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) } else { + // Get my authorID + var authorId = parent.parent.pad.myUserInfo.userId; + // Rewrite apool authors with my author information + + // We need to replace apool numToAttrib array where first value is author + // With thisSession.author + var numToAttr = apool.numToAttrib; + if(numToAttr){ + for (var attr in numToAttr){ + if (numToAttr[attr][0] === 'author'){ + // We force write the author over a change, for sanity n stuff + apool.numToAttrib[attr][1] = authorId; + } + } + } + + // Make sure the actual author is the AuthorID + // We need to replace apool attrToNum value where the first value before + // the comma is author with authorId + var attrToNum = apool.attribToNum; + if(attrToNum){ + for (var attr in attrToNum){ + var splitAttr = attr.split(','); + var isAuthor = (splitAttr[0] === 'author'); // Is it an author val? + if (isAuthor){ + // We force write the author over a change, for sanity n stuff + var newValue = 'author,'+authorId; // Create a new value + var key = attrToNum[attr]; // Key is actually the value + delete apool.attribToNum[attr]; // Delete the old value + apool.attribToNum[newValue] = key; // Write a new value + } + } + } + if (Changeset.isIdentity(userChangeset)) toSubmit = null; else toSubmit = userChangeset; } From 6c47e29e07392cdd26c70bc89227cefe34b80cef Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 7 Apr 2013 18:43:49 +0100 Subject: [PATCH 232/463] restore PMH original --- src/node/handler/PadMessageHandler.js | 46 ++++++++------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index b463c9b7..85efb008 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -579,6 +579,20 @@ function handleUserChanges(client, message) throw "Attribute pool is missing attribute "+n+" for changeset "+changeset; } }); + + // Validate all added 'author' attribs to be the same value as the current user + var iterator = Changeset.opIterator(Changeset.unpack(changeset).ops) + , op + while(iterator.hasNext()) { + op = iterator.next() + if(op.opcode != '+') continue; + op.attribs.split('*').forEach(function(attr) { + if(!attr) return + attr = wireApool.getAttrib(attr) + if(!attr) return + if('author' == attr[0] && attr[1] != thisSession.author) throw "Trying to submit changes as another author" + }) + } } catch(e) { @@ -588,38 +602,6 @@ function handleUserChanges(client, message) return; } - // Force the change to be by the author session - // Make sure the actual author is this session AuthorID - - // We need to replace wireApool numToAttrib array where first value is author - // With thisSession.author - var numToAttr = wireApool.numToAttrib; - if(numToAttr){ - for (var attr in numToAttr){ - if (numToAttr[attr][0] === 'author'){ - // We force write the author over a change, for sanity n stuff - wireApool.numToAttrib[attr][1] = thisSession.author; - } - } - } - - // We need to replace wireApool attrToNum value where the first value before - // the comma is author with thisSession.author - var attrToNum = wireApool.attribToNum; - if(attrToNum){ - for (var attr in attrToNum){ - var splitAttr = attr.split(','); - var isAuthor = (splitAttr[0] === 'author'); // Is it an author val? - if (isAuthor){ - // We force write the author over a change, for sanity n stuff - var newValue = 'author,'+thisSession.author; // Create a new value - var key = attrToNum[attr]; // Key is actually the value - delete wireApool.attribToNum[attr]; // Delete the old value - wireApool.attribToNum[newValue] = key; // Write a new value - } - } - } - //ex. adoptChangesetAttribs //Afaik, it copies the new attributes from the changeset, to the global Attribute Pool From ffc8f61a2ffd6d3cd0cdaa17481d5f93f49e705f Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 7 Apr 2013 18:44:13 +0100 Subject: [PATCH 233/463] remove cruft --- src/static/js/changesettracker.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/static/js/changesettracker.js b/src/static/js/changesettracker.js index e641cff7..bd11a2b7 100644 --- a/src/static/js/changesettracker.js +++ b/src/static/js/changesettracker.js @@ -26,8 +26,6 @@ var Changeset = require('./Changeset'); function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) { -//console.log("CS", Changeset); - // latest official text from server var baseAText = Changeset.makeAText("\n"); // changes applied to baseText that have been submitted From f135f79d1315e7bf36e5f8a37cf1e61f340c601f Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 7 Apr 2013 19:06:15 +0100 Subject: [PATCH 234/463] only try to redraw the line height of lines that exist.. --- src/static/js/ace2_inner.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 067b546b..0d54d725 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -5180,7 +5180,6 @@ function Ace2Inner(){ { if(n > lineNumbersShown) //all updated, break break; - var h = (b.clientHeight || b.offsetHeight); if (b.nextSibling) { @@ -5215,17 +5214,23 @@ function Ace2Inner(){ var n = lineNumbersShown; var div = odoc.createElement("DIV"); //calculate height for new line number - var h = (b.clientHeight || b.offsetHeight); + if(b){ + var h = (b.clientHeight || b.offsetHeight); - if (b.nextSibling) - h = b.nextSibling.offsetTop - b.offsetTop; + if (b.nextSibling){ + h = b.nextSibling.offsetTop - b.offsetTop; + } + } - if(h) // apply style to div + if(h){ // apply style to div div.style.height = h +"px"; - + } + div.appendChild(odoc.createTextNode(String(n))); fragment.appendChild(div); - b = b.nextSibling; + if(b){ + b = b.nextSibling; + } } container.appendChild(fragment); From 3cdb8131ced507bf8b1ba99b20efbb980d6262cd Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Apr 2013 03:43:34 +0200 Subject: [PATCH 235/463] Actually update windows download link Need to remember to do this on release.. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index db673468..a42c94bd 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Etherpad works with node v0.8 and v0.10, only. (We don't suppot v0.6) ### Prebuilt windows package This package works out of the box on any windows machine, but it's not very useful for developing purposes... -1. Download the windows package +1. [Download the latest windows package](http://etherpad.org/downloads/etherpad-lite-win-1.2.91-7492fb18a4.zip) 2. Extract the folder Now, run `start.bat` and open in your browser. You like it? [Next steps](#next-steps). From 324b9b1f5f20c7b602ebe39650ac38ecc7768fc4 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 8 Apr 2013 16:14:03 +0200 Subject: [PATCH 236/463] pluginfw/installer: Only restart the server when all tasks have finished fixes #1685 --- src/static/js/pluginfw/installer.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 377be35e..22e64350 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -15,7 +15,21 @@ var withNpm = function (npmfn) { }); } +var tasks = 0 +function wrapTaskCb(cb) { + tasks++ + return function() { + cb && cb.apply(this, arguments); + tasks--; + if(tasks == 0) onAllTasksFinished(); + } +} +function onAllTasksFinished() { + hooks.aCallAll("restartServer", {}, function () {}); +} + exports.uninstall = function(plugin_name, cb) { + cb = wrapTaskCb(cb); withNpm(function (er) { if (er) return cb && cb(er); npm.commands.uninstall([plugin_name], function (er) { @@ -23,13 +37,13 @@ exports.uninstall = function(plugin_name, cb) { hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); plugins.update(cb); - hooks.aCallAll("restartServer", {}, function () {}); }); }); }); }; exports.install = function(plugin_name, cb) { + cb = wrapTaskCb(cb) withNpm(function (er) { if (er) return cb && cb(er); npm.commands.install([plugin_name], function (er) { @@ -37,7 +51,6 @@ exports.install = function(plugin_name, cb) { hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); plugins.update(cb); - hooks.aCallAll("restartServer", {}, function () {}); }); }); }); From 7728d5b32118c95c437c938bcc87014fba58f381 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Apr 2013 17:23:03 +0100 Subject: [PATCH 237/463] remove draggable which was used for dragging users in the userbox --- src/static/js/draggable.js | 197 ------------------------------------- 1 file changed, 197 deletions(-) delete mode 100644 src/static/js/draggable.js diff --git a/src/static/js/draggable.js b/src/static/js/draggable.js deleted file mode 100644 index 8d197545..00000000 --- a/src/static/js/draggable.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * This code is mostly from the old Etherpad. Please help us to comment this code. - * This helps other people to understand this code better and helps them to improve it. - * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED - */ - -/** - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS-IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function makeDraggable(jqueryNodes, eventHandler) -{ - jqueryNodes.each(function() - { - var node = $(this); - var state = {}; - var inDrag = false; - - function dragStart(evt) - { - if (inDrag) - { - return; - } - inDrag = true; - if (eventHandler('dragstart', evt, state) !== false) - { - $(document).bind('mousemove', dragUpdate); - $(document).bind('mouseup', dragEnd); - } - evt.preventDefault(); - return false; - } - - function dragUpdate(evt) - { - if (!inDrag) - { - return; - } - eventHandler('dragupdate', evt, state); - evt.preventDefault(); - return false; - } - - function dragEnd(evt) - { - if (!inDrag) - { - return; - } - inDrag = false; - try - { - eventHandler('dragend', evt, state); - } - finally - { - $(document).unbind('mousemove', dragUpdate); - $(document).unbind('mouseup', dragEnd); - evt.preventDefault(); - } - return false; - } - node.bind('mousedown', dragStart); - }); -} - -function makeResizableVPane(top, sep, bottom, minTop, minBottom, callback) -{ - if (minTop === undefined) minTop = 0; - if (minBottom === undefined) minBottom = 0; - - makeDraggable($(sep), function(eType, evt, state) - { - if (eType == 'dragstart') - { - state.startY = evt.pageY; - state.topHeight = $(top).height(); - state.bottomHeight = $(bottom).height(); - state.minTop = minTop; - state.maxTop = (state.topHeight + state.bottomHeight) - minBottom; - } - else if (eType == 'dragupdate') - { - var change = evt.pageY - state.startY; - - var topHeight = state.topHeight + change; - if (topHeight < state.minTop) - { - topHeight = state.minTop; - } - if (topHeight > state.maxTop) - { - topHeight = state.maxTop; - } - change = topHeight - state.topHeight; - - var bottomHeight = state.bottomHeight - change; - var sepHeight = $(sep).height(); - - var totalHeight = topHeight + sepHeight + bottomHeight; - topHeight = 100.0 * topHeight / totalHeight; - sepHeight = 100.0 * sepHeight / totalHeight; - bottomHeight = 100.0 * bottomHeight / totalHeight; - - $(top).css('bottom', 'auto'); - $(top).css('height', topHeight + "%"); - $(sep).css('top', topHeight + "%"); - $(bottom).css('top', (topHeight + sepHeight) + '%'); - $(bottom).css('height', 'auto'); - if (callback) callback(); - } - }); -} - -function makeResizableHPane(left, sep, right, minLeft, minRight, sepWidth, sepOffset, callback) -{ - if (minLeft === undefined) minLeft = 0; - if (minRight === undefined) minRight = 0; - - makeDraggable($(sep), function(eType, evt, state) - { - if (eType == 'dragstart') - { - state.startX = evt.pageX; - state.leftWidth = $(left).width(); - state.rightWidth = $(right).width(); - state.minLeft = minLeft; - state.maxLeft = (state.leftWidth + state.rightWidth) - minRight; - } - else if (eType == 'dragend' || eType == 'dragupdate') - { - var change = evt.pageX - state.startX; - - var leftWidth = state.leftWidth + change; - if (leftWidth < state.minLeft) - { - leftWidth = state.minLeft; - } - if (leftWidth > state.maxLeft) - { - leftWidth = state.maxLeft; - } - change = leftWidth - state.leftWidth; - - var rightWidth = state.rightWidth - change; - newSepWidth = sepWidth; - if (newSepWidth == undefined) newSepWidth = $(sep).width(); - newSepOffset = sepOffset; - if (newSepOffset == undefined) newSepOffset = 0; - - if (change == 0) - { - if (rightWidth != minRight || state.lastRightWidth == undefined) - { - state.lastRightWidth = rightWidth; - rightWidth = minRight; - } - else - { - rightWidth = state.lastRightWidth; - state.lastRightWidth = minRight; - } - change = state.rightWidth - rightWidth; - leftWidth = change + state.leftWidth; - } - - var totalWidth = leftWidth + newSepWidth + rightWidth; - leftWidth = 100.0 * leftWidth / totalWidth; - newSepWidth = 100.0 * newSepWidth / totalWidth; - newSepOffset = 100.0 * newSepOffset / totalWidth; - rightWidth = 100.0 * rightWidth / totalWidth; - - $(left).css('right', 'auto'); - $(left).css('width', leftWidth + "%"); - $(sep).css('left', (leftWidth + newSepOffset) + "%"); - $(right).css('left', (leftWidth + newSepWidth) + '%'); - $(right).css('width', 'auto'); - if (callback) callback(); - } - }); -} - -exports.makeDraggable = makeDraggable; From 946289c221b2a47b96117de40a1f78e646572c8d Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Apr 2013 19:46:45 +0100 Subject: [PATCH 238/463] temp patch for 1652 --- src/static/js/Changeset.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index b1604212..6d184522 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -1663,12 +1663,20 @@ exports.appendATextToAssembler = function (atext, assem) { * @param cs {Changeset} * @param pool {AtributePool} */ +var lastEvent = null; // This is just a temporary measure to ensure we don't send the exact same changeset twice +// Documentation for this is available at https://github.com/ether/etherpad-lite/issues/1652 + exports.prepareForWire = function (cs, pool) { + if(cs == lastEvent){ + throw new Error("Not sending the same event twice..."); + return false; + } var newPool = new AttributePool(); var newCs = exports.moveOpsToNewPool(cs, pool, newPool); + lastEvent = cs; return { translated: newCs, - pool: newPool + pool: newPool }; }; From bf93500214acf94fca8d323d685d3228c0b6cab9 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Apr 2013 19:50:52 +0100 Subject: [PATCH 239/463] some polish for a turd --- src/static/js/Changeset.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 6d184522..89ac5d75 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -1669,14 +1669,13 @@ var lastEvent = null; // This is just a temporary measure to ensure we don't sen exports.prepareForWire = function (cs, pool) { if(cs == lastEvent){ throw new Error("Not sending the same event twice..."); - return false; } var newPool = new AttributePool(); var newCs = exports.moveOpsToNewPool(cs, pool, newPool); lastEvent = cs; return { translated: newCs, - pool: newPool + pool: newPool }; }; From dfc49df52de10d41dfd32f7dc5609a34087b981c Mon Sep 17 00:00:00 2001 From: mluto Date: Mon, 8 Apr 2013 22:58:34 +0200 Subject: [PATCH 240/463] use `parent.parent` instead of `top` in `collab_client.js`, since `top` breaks embedding when a pad is embedded (same origin policy) --- src/static/js/collab_client.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index ff360419..ec56264f 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -295,7 +295,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (oldRev + 1)) { - top.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); + parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -305,7 +305,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - top.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); + parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -319,7 +319,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) { if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1)) { - top.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); + parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } @@ -329,7 +329,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - top.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); + parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } From 49cff88a480a0a261191a8c4e11f1ab5ff5c37d3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Apr 2013 23:03:19 +0100 Subject: [PATCH 241/463] semi working --- src/static/css/iframe_editor.css | 42 ++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 8041d90e..395bfe5a 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -205,13 +205,23 @@ ol.list-number1{ ol.list-number2{ text-indent: 30px; } +ol.list-number3{ + text-indent: 40px; +} +ol.list-number4{ + text-indent: 50px; +} +ol.list-number5{ + text-indent: 60px; +} +ol.list-number6{ + text-indent: 70px; +} + /* Add styling to the first item in a list */ -ol.list1-start{ - counter-reset: first; -} -ol.list2-start{ - counter-reset: second; +body{ + counter-reset:first 0 second 0 third 0 fourth 0 fifth 0 sixth 0; } /* The behavior for incrementing and the prefix */ @@ -225,3 +235,25 @@ ol.list-number2:before { counter-increment: second; } +/* The behavior for incrementing and the prefix */ +ol.list-number3:before { + content: counter(third) ". " ; + counter-increment: third; +} + +ol.list-number4:before { + content: counter(fourth) ". " ; + counter-increment: fourth; +} + +/* The behavior for incrementing and the prefix */ +ol.list-number5:before { + content: counter(fifth) ". " ; + counter-increment: fifth; +} + +ol.list-number6:before { + content: counter(sixth) ". " ; + counter-increment: sixth; +} + From 70a25964b6dcadb06ae6a8979f939dd7598a1793 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 8 Apr 2013 23:32:04 +0100 Subject: [PATCH 242/463] make sure elements are supported, still doesn't assign numbers properly --- src/static/css/iframe_editor.css | 41 +++++++++++++++----------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 395bfe5a..668843cf 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -199,29 +199,18 @@ ol > li { } /* Set the indentation */ -ol.list-number1{ - text-indent: 20px; -} -ol.list-number2{ - text-indent: 30px; -} -ol.list-number3{ - text-indent: 40px; -} -ol.list-number4{ - text-indent: 50px; -} -ol.list-number5{ - text-indent: 60px; -} -ol.list-number6{ - text-indent: 70px; -} - +ol.list-number1{ text-indent: 20px; } +ol.list-number2{ text-indent: 30px; } +ol.list-number3{ text-indent: 40px; } +ol.list-number4{ text-indent: 50px; } +ol.list-number5{ text-indent: 60px; } +ol.list-number6{ text-indent: 70px; } +ol.list-number7{ text-indent: 80px; } +ol.list-number8{ text-indent: 90px; } /* Add styling to the first item in a list */ body{ - counter-reset:first 0 second 0 third 0 fourth 0 fifth 0 sixth 0; + counter-reset:first 0 second 0 third 0 fourth 0 fifth 0 sixth 0 seventh 0 eighth 0; } /* The behavior for incrementing and the prefix */ @@ -235,7 +224,6 @@ ol.list-number2:before { counter-increment: second; } -/* The behavior for incrementing and the prefix */ ol.list-number3:before { content: counter(third) ". " ; counter-increment: third; @@ -246,7 +234,6 @@ ol.list-number4:before { counter-increment: fourth; } -/* The behavior for incrementing and the prefix */ ol.list-number5:before { content: counter(fifth) ". " ; counter-increment: fifth; @@ -257,3 +244,13 @@ ol.list-number6:before { counter-increment: sixth; } +ol.list-number7:before { + content: counter(seventh) ". " ; + counter-increment: seventh; +} + +ol.list-number8:before { + content: counter(eighth) ". " ; + counter-increment: eighth; +} + From bfa233ba04ad2e9773441b9473496385f9cd0b90 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 9 Apr 2013 00:46:13 +0100 Subject: [PATCH 243/463] kudos to quenenni for some working CSS --- src/static/css/iframe_editor.css | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 668843cf..1ae906c4 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -210,47 +210,56 @@ ol.list-number8{ text-indent: 90px; } /* Add styling to the first item in a list */ body{ - counter-reset:first 0 second 0 third 0 fourth 0 fifth 0 sixth 0 seventh 0 eighth 0; + counter-reset:first 1 second 1 third 1 fourth 1 fifth 1 sixth 1 seventh 1 eighth 1; } /* The behavior for incrementing and the prefix */ ol.list-number1:before { content: counter(first) ". " ; - counter-increment: first; + counter-increment: first 1; } ol.list-number2:before { content: counter(second) ". " ; - counter-increment: second; + counter-increment: second 1; } ol.list-number3:before { content: counter(third) ". " ; - counter-increment: third; + counter-increment: third 1; } ol.list-number4:before { content: counter(fourth) ". " ; - counter-increment: fourth; + counter-increment: fourth 1; } ol.list-number5:before { content: counter(fifth) ". " ; - counter-increment: fifth; + counter-increment: fifth 1; } ol.list-number6:before { content: counter(sixth) ". " ; - counter-increment: sixth; + counter-increment: sixth 1; } ol.list-number7:before { content: counter(seventh) ". " ; - counter-increment: seventh; + counter-increment: seventh 1; } ol.list-number8:before { content: counter(eighth) ". " ; - counter-increment: eighth; + counter-increment: eighth 1; } +ol.list-start1:before{ counter-reset: first 0; } +ol.list-start2:before{ counter-reset: second 0; } +ol.list-start3:before{ counter-reset: third 0; } +ol.list-start4:before{ counter-reset: fourth 0; } +ol.list-start5:before{ counter-reset: fifth 0; } +ol.list-start6:before{ counter-reset: sixth 0; } +ol.list-start7:before{ counter-reset: seventh 0; } +ol.list-start8:before{ counter-reset: eighth 0; } + From 2e76bd4e5070875343cf4ac7aa7817294d9ee372 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 9 Apr 2013 01:22:09 +0100 Subject: [PATCH 244/463] working but then create a second list, it will be stupid, SIGH --- src/static/css/iframe_editor.css | 16 ++++++++-------- src/static/js/domline.js | 9 +++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 1ae906c4..7ae680dc 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -254,12 +254,12 @@ ol.list-number8:before { counter-increment: eighth 1; } -ol.list-start1:before{ counter-reset: first 0; } -ol.list-start2:before{ counter-reset: second 0; } -ol.list-start3:before{ counter-reset: third 0; } -ol.list-start4:before{ counter-reset: fourth 0; } -ol.list-start5:before{ counter-reset: fifth 0; } -ol.list-start6:before{ counter-reset: sixth 0; } -ol.list-start7:before{ counter-reset: seventh 0; } -ol.list-start8:before{ counter-reset: eighth 0; } +ol.list-start-number1:before{ counter-reset: first 0; } +ol.list-start-number2:before{ counter-reset: second 0; } +ol.list-start-number3:before{ counter-reset: third 0; } +ol.list-start-number4:before{ counter-reset: fourth 0; } +ol.list-start-number5:before{ counter-reset: fifth 0; } +ol.list-start-number6:before{ counter-reset: sixth 0; } +ol.list-start-number7:before{ counter-reset: seventh 0; } +ol.list-start-number8:before{ counter-reset: eighth 0; } diff --git a/src/static/js/domline.js b/src/static/js/domline.js index 43b5f21a..1e700c75 100644 --- a/src/static/js/domline.js +++ b/src/static/js/domline.js @@ -104,7 +104,6 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) if (listType) { listType = listType[1]; - start = start?'start="'+Security.escapeHTMLAttribute(start[1])+'"':''; if (listType) { if(listType.indexOf("number") < 0) @@ -114,7 +113,13 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) } else { - preHtml = '
    1. '; + if(start){ // is it a start of a list with more than one item in? + if(start[1] == 1){ // if its the first one + preHtml = '
      1. '; + }else{ // its the second+ item in this list level + preHtml = '
        1. '; + } + } postHtml = '
        '; } } From 90c5b26e892a2711949b0fa26ba49c912e3dfb03 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 9 Apr 2013 14:29:55 +0100 Subject: [PATCH 245/463] keep integrity on paste and better styling but new lists dont reset counter --- src/static/css/iframe_editor.css | 18 ++++++++++-------- src/static/js/domline.js | 10 ++++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 7ae680dc..c2cc1453 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -192,21 +192,23 @@ p { ol { display: list-item; + list-style-type: decimal; } ol > li { + display:list-item; display:inline; } /* Set the indentation */ -ol.list-number1{ text-indent: 20px; } -ol.list-number2{ text-indent: 30px; } -ol.list-number3{ text-indent: 40px; } -ol.list-number4{ text-indent: 50px; } -ol.list-number5{ text-indent: 60px; } -ol.list-number6{ text-indent: 70px; } -ol.list-number7{ text-indent: 80px; } -ol.list-number8{ text-indent: 90px; } +ol.list-number1{ text-indent: 0px; } +ol.list-number2{ text-indent: 10px; } +ol.list-number3{ text-indent: 20px; } +ol.list-number4{ text-indent: 30px; } +ol.list-number5{ text-indent: 40px; } +ol.list-number6{ text-indent: 50px; } +ol.list-number7{ text-indent: 60px; } +ol.list-number8{ text-indent: 70px; } /* Add styling to the first item in a list */ body{ diff --git a/src/static/js/domline.js b/src/static/js/domline.js index 1e700c75..ee558a64 100644 --- a/src/static/js/domline.js +++ b/src/static/js/domline.js @@ -114,11 +114,13 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) else { if(start){ // is it a start of a list with more than one item in? - if(start[1] == 1){ // if its the first one - preHtml = '
        1. '; - }else{ // its the second+ item in this list level - preHtml = '
          1. '; + if(start[1] == 1){ // if its the first one at this level? + preHtml = '
            1. '; + }else{ // its not the first item in this list level + preHtml = '
              1. '; } + }else{ + preHtml = '
                1. '; // Handles pasted contents into existing lists } postHtml = '
                '; } From 8836981e32f1caa909f8ba22e1619fedd867b396 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 9 Apr 2013 15:55:14 +0100 Subject: [PATCH 246/463] expose broadcast slider so plugins can interact with it --- src/static/js/timeslider.js | 3 ++- src/templates/timeslider.html | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index cd98dead..19489961 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -108,6 +108,7 @@ function init() { }); exports.socket = socket; // make the socket available + exports.BroadcastSlider = BroadcastSlider; // Make the slider available hooks.aCallAll("postTimesliderInit"); }); @@ -133,7 +134,7 @@ function sendSocketMsg(type, data) var fireWhenAllScriptsAreLoaded = []; -var BroadcastSlider, changesetLoader; +var changesetLoader; function handleClientVars(message) { //save the client Vars diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index d3062449..265ea2a5 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -194,7 +194,7 @@ - - - -
                - - + + + + Admin Dashboard - Etherpad + + + + + + +
                + +
                + + diff --git a/src/templates/admin/plugins-info.html b/src/templates/admin/plugins-info.html index d1ca9a11..24eecb67 100644 --- a/src/templates/admin/plugins-info.html +++ b/src/templates/admin/plugins-info.html @@ -11,7 +11,7 @@
                diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index f4478f8b..dc7d33b9 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -1,4 +1,4 @@ - + Plugin manager - Etherpad @@ -21,7 +21,7 @@ + <% e.begin_block("afterEditbar"); %><% e.end_block(); %>
                <% e.begin_block("userlist"); %> From 3d8452b1439fd24473fb68653cb2f7e3e0bbdb4b Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Thu, 5 Dec 2013 08:41:29 +0100 Subject: [PATCH 440/463] Replace tabs indentation with spaces indentation Some files are obviously external libraries, I didn't touch them --- bin/loadTesting/README | 14 +- bin/loadTesting/launcher.sh | 2 +- doc/easysync/easysync-notes.txt | 14 +- settings.json.template | 57 +- src/node/db/API.js | 4 +- src/node/db/Pad.js | 4 +- src/node/db/SecurityManager.js | 8 +- src/node/handler/PadMessageHandler.js | 6 +- src/node/handler/SocketIORouter.js | 10 +- src/node/hooks/express/padreadonly.js | 56 +- src/node/hooks/express/padurlsanitize.js | 22 +- src/node/hooks/express/specialpages.js | 6 +- src/node/utils/Abiword.js | 2 +- src/node/utils/ExportHtml.js | 20 +- src/static/css/iframe_editor.css | 2 +- src/static/js/Changeset.js | 6 +- src/static/js/ace2_inner.js | 4 +- src/static/js/broadcast_slider.js | 8 +- src/static/js/changesettracker.js | 4 +- src/static/js/chat.js | 14 +- src/static/js/contentcollector.js | 4 +- src/static/js/domline.js | 8 +- src/static/js/html10n.js | 20 +- src/static/js/linestylefilter.js | 2 +- src/static/js/pad_editbar.js | 2 +- src/static/js/pluginfw/hooks.js | 2 +- src/templates/index.html | 36 +- tests/frontend/lib/sendkeys.js | 606 +++++++++--------- tests/frontend/runner.js | 6 +- tests/frontend/specs/alphabet.js | 2 +- tests/frontend/specs/chat.js | 2 +- tests/frontend/specs/helper.js | 58 +- tests/frontend/specs/indentation.js | 4 +- tests/frontend/specs/urls_become_clickable.js | 2 +- tests/frontend/travis/remote_runner.js | 4 +- 35 files changed, 511 insertions(+), 510 deletions(-) diff --git a/bin/loadTesting/README b/bin/loadTesting/README index 2252b66c..c8ecd71e 100644 --- a/bin/loadTesting/README +++ b/bin/loadTesting/README @@ -17,19 +17,19 @@ Installed Xvfb and PhantomJS I installed Xvfb following (roughly) this guide: http://blog.martin-lyness.com/archives/installing-xvfb-on-ubuntu-9-10-karmic-koala - #sudo apt-get install xvfb - #sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic + #sudo apt-get install xvfb + #sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic Launched two instances of Xvfb directly from the terminal: - #Xvfb :0 -ac - #Xvfb :1 -ac + #Xvfb :0 -ac + #Xvfb :1 -ac I installed PhantomJS following this guide: http://code.google.com/p/phantomjs/wiki/Installation - #sudo add-apt-repository ppa:jerome-etienne/neoip - #sudo apt-get update - #sudo apt-get install phantomjs + #sudo add-apt-repository ppa:jerome-etienne/neoip + #sudo apt-get update + #sudo apt-get install phantomjs I created a small JavaScript file for PhatomJS to use to control the browser instances: diff --git a/bin/loadTesting/launcher.sh b/bin/loadTesting/launcher.sh index 375b1544..e940f8e0 100755 --- a/bin/loadTesting/launcher.sh +++ b/bin/loadTesting/launcher.sh @@ -3,7 +3,7 @@ # connect 500 instances to display :0 for i in {1..500} do - echo $i + echo $i echo "Displaying Some shit" DISPLAY=:0 screen -d -m /home/phantomjs/bin/phantomjs loader.js http://10.0.0.55:9001/p/pad2 && sleep 2 done diff --git a/doc/easysync/easysync-notes.txt b/doc/easysync/easysync-notes.txt index d3b3dc55..72adadd2 100644 --- a/doc/easysync/easysync-notes.txt +++ b/doc/easysync/easysync-notes.txt @@ -79,14 +79,14 @@ Here are descriptions of the operations, where capital letters are variables: kept MUST be a newline, and the final newline of the document is allowed. "*I" : Apply attribute I from the pool to the following +, =, |+, or |= command. In other words, any number of * ops can come before a +, =, or | but not - between a | and the corresponding + or =. + between a | and the corresponding + or =. If +, text is inserted having this attribute. If =, text is kept but with - the attribute applied as an attribute addition or removal. - Consecutive attributes must be sorted lexically by (key,value) with key - and value taken as strings. It's illegal to have duplicate keys - for (key,value) pairs that apply to the same text. It's illegal to - have an empty value for a key in the case of an insertion (+), the - pair should just be omitted. + the attribute applied as an attribute addition or removal. + Consecutive attributes must be sorted lexically by (key,value) with key + and value taken as strings. It's illegal to have duplicate keys + for (key,value) pairs that apply to the same text. It's illegal to + have an empty value for a key in the case of an insertion (+), the + pair should just be omitted. Characters from the source text that aren't accounted for are assumed to be kept with the same attributes. diff --git a/settings.json.template b/settings.json.template index 50e7e9d4..43aa1613 100644 --- a/settings.json.template +++ b/settings.json.template @@ -110,40 +110,41 @@ // https://github.com/nomiddlename/log4js-node // You can add as many appenders as you want here: "logconfig" : - { "appenders": [ - { "type": "console" - //, "category": "access"// only logs pad access - } + { "appenders": [ + { "type": "console" + //, "category": "access"// only logs pad access + } /* - , { "type": "file" + , { "type": "file" , "filename": "your-log-file-here.log" , "maxLogSize": 1024 , "backups": 3 // how many log files there're gonna be at max //, "category": "test" // only log a specific category - }*/ + }*/ /* - , { "type": "logLevelFilter" - , "level": "warn" // filters out all log messages that have a lower level than "error" - , "appender": - { Use whatever appender you want here } - }*/ + , { "type": "logLevelFilter" + , "level": "warn" // filters out all log messages that have a lower level than "error" + , "appender": + { Use whatever appender you want here } + }*/ /* - , { "type": "logLevelFilter" - , "level": "error" // filters out all log messages that have a lower level than "error" - , "appender": - { "type": "smtp" - , "subject": "An error occured in your EPL instance!" - , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" - , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message - , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods - "host": "smtp.example.com", "port": 465, - "secureConnection": true, - "auth": { - "user": "foo@example.com", - "pass": "bar_foo" + , { "type": "logLevelFilter" + , "level": "error" // filters out all log messages that have a lower level than "error" + , "appender": + { "type": "smtp" + , "subject": "An error occured in your EPL instance!" + , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" + , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message + , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods + "host": "smtp.example.com", "port": 465, + "secureConnection": true, + "auth": { + "user": "foo@example.com", + "pass": "bar_foo" + } } - } - } - }*/ - ] } + } + }*/ + ] + } } diff --git a/src/node/db/API.js b/src/node/db/API.js index e48c1401..349953cb 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -554,7 +554,7 @@ exports.deletePad = function(padID, callback) /** copyPad(sourceID, destinationID[, force=false]) copies a pad. If force is true, - the destination will be overwritten if it exists. + the destination will be overwritten if it exists. Example returns: @@ -573,7 +573,7 @@ exports.copyPad = function(sourceID, destinationID, force, callback) /** movePad(sourceID, destinationID[, force=false]) moves a pad. If force is true, - the destination will be overwritten if it exists. + the destination will be overwritten if it exists. Example returns: diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index b6dee897..180517d1 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -463,7 +463,7 @@ Pad.prototype.copy = function copy(destinationID, force, callback) { if(exists == true) { - if (!force) + if (!force) { console.log("erroring out without force"); callback(new customError("destinationID already exists","apierror")); @@ -635,7 +635,7 @@ Pad.prototype.remove = function remove(callback) { authorIDs.forEach(function (authorID) { - authorManager.removePad(authorID, padID); + authorManager.removePad(authorID, padID); }); callback(); diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 355603f3..66cfd292 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -151,16 +151,16 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) if(sessionInfo.groupID != groupID) { authLogger.debug("Auth failed: wrong group"); - callback(); - return; + callback(); + return; } //is validUntil still ok? if(sessionInfo.validUntil <= now) { authLogger.debug("Auth failed: validUntil"); - callback(); - return; + callback(); + return; } // There is a valid session diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 0b583661..75ec6bd7 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -455,7 +455,7 @@ function handleGetChatMessages(client, message) pad.getChatMessages(start, end, function(err, chatMessages) { if(ERR(err, callback)) return; - + var infoMsg = { type: "COLLABROOM", data: { @@ -463,7 +463,7 @@ function handleGetChatMessages(client, message) messages: chatMessages } }; - + // send the messages back to the client client.json.send(infoMsg); }); @@ -1564,7 +1564,7 @@ exports.padUsers = function (padID, callback) { author.id = s.author; result.push(author); - callback(); + callback(); }); } }, function(err) { diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 2ca0d80f..b3e046d2 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -57,11 +57,11 @@ exports.setSocketIO = function(_socket) { socket.sockets.on('connection', function(client) { if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){ - client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); - } - else{ - client.set('remoteAddress', client.handshake.address.address); - } + client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); + } + else{ + client.set('remoteAddress', client.handshake.address.address); + } var clientAuthorized = false; //wrap the original send function to log the messages diff --git a/src/node/hooks/express/padreadonly.js b/src/node/hooks/express/padreadonly.js index af5cbed3..9a0a52bf 100644 --- a/src/node/hooks/express/padreadonly.js +++ b/src/node/hooks/express/padreadonly.js @@ -16,50 +16,50 @@ exports.expressCreateServer = function (hook_name, args, cb) { //translate the read only pad to a padId function(callback) { - readOnlyManager.getPadId(req.params.id, function(err, _padId) - { - if(ERR(err, callback)) return; + readOnlyManager.getPadId(req.params.id, function(err, _padId) + { + if(ERR(err, callback)) return; - padId = _padId; + padId = _padId; - //we need that to tell hasPadAcess about the pad - req.params.pad = padId; + //we need that to tell hasPadAcess about the pad + req.params.pad = padId; - callback(); - }); + callback(); + }); }, //render the html document function(callback) { - //return if the there is no padId - if(padId == null) - { - callback("notfound"); - return; - } + //return if the there is no padId + if(padId == null) + { + callback("notfound"); + return; + } - hasPadAccess(req, res, function() - { - //render the html document - exporthtml.getPadHTMLDocument(padId, null, false, function(err, _html) - { - if(ERR(err, callback)) return; - html = _html; - callback(); - }); - }); + hasPadAccess(req, res, function() + { + //render the html document + exporthtml.getPadHTMLDocument(padId, null, false, function(err, _html) + { + if(ERR(err, callback)) return; + html = _html; + callback(); + }); + }); } ], function(err) { //throw any unexpected error if(err && err != "notfound") - ERR(err); + ERR(err); if(err == "notfound") - res.send(404, '404 - Not Found'); + res.send(404, '404 - Not Found'); else - res.send(html); + res.send(html); }); }); -} \ No newline at end of file +} diff --git a/src/node/hooks/express/padurlsanitize.js b/src/node/hooks/express/padurlsanitize.js index 29782b69..2aadccdc 100644 --- a/src/node/hooks/express/padurlsanitize.js +++ b/src/node/hooks/express/padurlsanitize.js @@ -12,20 +12,20 @@ exports.expressCreateServer = function (hook_name, args, cb) { else { padManager.sanitizePadId(padId, function(sanitizedPadId) { - //the pad id was sanitized, so we redirect to the sanitized version - if(sanitizedPadId != padId) - { + //the pad id was sanitized, so we redirect to the sanitized version + if(sanitizedPadId != padId) + { var real_url = sanitizedPadId; var query = url.parse(req.url).query; if ( query ) real_url += '?' + query; - res.header('Location', real_url); - res.send(302, 'You should be redirected to ' + real_url + ''); - } - //the pad id was fine, so just render it - else - { - next(); - } + res.header('Location', real_url); + res.send(302, 'You should be redirected to ' + real_url + ''); + } + //the pad id was fine, so just render it + else + { + next(); + } }); } }); diff --git a/src/node/hooks/express/specialpages.js b/src/node/hooks/express/specialpages.js index 6701726e..7d051965 100644 --- a/src/node/hooks/express/specialpages.js +++ b/src/node/hooks/express/specialpages.js @@ -49,11 +49,11 @@ exports.expressCreateServer = function (hook_name, args, cb) { //there is no custom favicon, send the default favicon if(err) { - filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); - res.sendfile(filePath); + filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); + res.sendfile(filePath); } }); }); -} \ No newline at end of file +} diff --git a/src/node/utils/Abiword.js b/src/node/utils/Abiword.js index 2ef4f444..5f12bd97 100644 --- a/src/node/utils/Abiword.js +++ b/src/node/utils/Abiword.js @@ -143,7 +143,7 @@ else //Queue with the converts we have to do var queue = async.queue(doConvertTask, 1); exports.convertFile = function(srcFile, destFile, type, callback) - { + { queue.push({"srcFile": srcFile, "destFile": destFile, "type": type, "callback": callback}); }; } diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 7b94310a..5179adf6 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -447,7 +447,7 @@ function getHTMLFromAtext(pad, atext, authorColors) pieces.push('
              2. '); } lists.length--; - } + } var lineContentFromHook = hooks.callAllStr("getLineHTMLForExport", { line: line, @@ -455,14 +455,14 @@ function getHTMLFromAtext(pad, atext, authorColors) attribLine: attribLines[i], text: textLines[i] }, " ", " ", ""); - if (lineContentFromHook) - { - pieces.push(lineContentFromHook, ''); - } - else - { - pieces.push(lineContent, '
                '); - } + if (lineContentFromHook) + { + pieces.push(lineContentFromHook, ''); + } + else + { + pieces.push(lineContent, '
                '); + } } } @@ -490,7 +490,7 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) var head = (noDocType ? '' : '\n') + '\n' + (noDocType ? '' : '\n' + - '' + Security.escapeHTML(padId) + '\n' + + '' + Security.escapeHTML(padId) + '\n' + '\n' + '', '', scriptTag(outerScript), '
                x
                '); + outerHTML.push('', '', scriptTag(outerScript), '
                x
                '); var outerFrame = document.createElement("IFRAME"); outerFrame.name = "ace_outer"; diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 2798de44..ec842285 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -79,7 +79,6 @@ function Ace2Inner(){ iframe.ace_outerWin = null; // prevent IE 6 memory leak var sideDiv = iframe.nextSibling; var lineMetricsDiv = sideDiv.nextSibling; - var overlaysdiv = lineMetricsDiv.nextSibling; initLineNumbers(); var outsideKeyDown = noop; From e04f46d4775037d712c5fa07dedda58e443b43d2 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:25:12 +0100 Subject: [PATCH 453/463] [ace2_inner] init() has replaced setup(), reflect this change in the comments and remove the unused setup() --- src/static/js/ace2_inner.js | 52 ++----------------------------------- 1 file changed, 2 insertions(+), 50 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index ec842285..9391e4ed 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -101,13 +101,13 @@ function Ace2Inner(){ apool: new AttribPool() }; - // lines, alltext, alines, and DOM are set up in setup() + // lines, alltext, alines, and DOM are set up in init() if (undoModule.enabled) { undoModule.apool = rep.apool; } - var root, doc; // set in setup() + var root, doc; // set in init() var isEditable = true; var doesWrap = true; var hasLineNumbers = true; @@ -4768,54 +4768,6 @@ function Ace2Inner(){ else $(elem).removeClass(className); } - function setup() - { - doc = document; // defined as a var in scope outside - inCallStackIfNecessary("setup", function() - { - var body = doc.getElementById("innerdocbody"); - root = body; // defined as a var in scope outside - if (browser.mozilla) addClass(root, "mozilla"); - if (browser.safari) addClass(root, "safari"); - if (browser.msie) addClass(root, "msie"); - if (browser.msie) - { - // cache CSS background images - try - { - doc.execCommand("BackgroundImageCache", false, true); - } - catch (e) - { /* throws an error in some IE 6 but not others! */ - } - } - setClassPresence(root, "authorColors", true); - setClassPresence(root, "doesWrap", doesWrap); - - initDynamicCSS(); - - enforceEditability(); - - // set up dom and rep - while (root.firstChild) root.removeChild(root.firstChild); - var oneEntry = createDomLineEntry(""); - doRepLineSplice(0, rep.lines.length(), [oneEntry]); - insertDomLines(null, [oneEntry.domInfo], null); - rep.alines = Changeset.splitAttributionLines( - Changeset.makeAttribution("\n"), "\n"); - - bindTheEventHandlers(); - - }); - - scheduler.setTimeout(function() - { - parent.readyFunc(); // defined in code that sets up the inner iframe - }, 0); - - isSetUp = true; - } - function focus() { window.focus(); From 021db28a0234fe524717642463490c1b3e37e711 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:27:48 +0100 Subject: [PATCH 454/463] [Changeset] a?lines_length was not used within inverse function --- src/static/js/Changeset.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 77bd3a4c..e47b3052 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -1841,14 +1841,6 @@ exports.inverse = function (cs, lines, alines, pool) { } } - function lines_length() { - if ((typeof lines.length) == "number") { - return lines.length; - } else { - return lines.length(); - } - } - function alines_get(idx) { if (alines.get) { return alines.get(idx); @@ -1857,14 +1849,6 @@ exports.inverse = function (cs, lines, alines, pool) { } } - function alines_length() { - if ((typeof alines.length) == "number") { - return alines.length; - } else { - return alines.length(); - } - } - var curLine = 0; var curChar = 0; var curLineOpIter = null; From ca6f877db20a7f12d3bbed0409cdb2b32dae7569 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:28:43 +0100 Subject: [PATCH 455/463] [padDiff] remove unused functions a?lines_length --- src/node/utils/padDiff.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/node/utils/padDiff.js b/src/node/utils/padDiff.js index c5354041..88fa5cba 100644 --- a/src/node/utils/padDiff.js +++ b/src/node/utils/padDiff.js @@ -331,14 +331,6 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { } } - function lines_length() { - if ((typeof lines.length) == "number") { - return lines.length; - } else { - return lines.length(); - } - } - function alines_get(idx) { if (alines.get) { return alines.get(idx); @@ -347,14 +339,6 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { } } - function alines_length() { - if ((typeof alines.length) == "number") { - return alines.length; - } else { - return alines.length(); - } - } - var curLine = 0; var curChar = 0; var curLineOpIter = null; From aadcfbb3d153c191109a7fce1ac2795c220611cc Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:29:41 +0100 Subject: [PATCH 456/463] do not send globalPadId in clientvars - its not used anywhere --- src/node/handler/PadMessageHandler.js | 2 -- src/static/js/collab_client.js | 1 - 2 files changed, 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 75ec6bd7..748b8382 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1076,7 +1076,6 @@ function handleClientReady(client, message) "historicalAuthorData": historicalAuthorData, "apool": apool, "rev": pad.getHeadRevisionNumber(), - "globalPadId": message.padId, "time": currentTime, }, "colorPalette": authorManager.getColorPalette(), @@ -1093,7 +1092,6 @@ function handleClientReady(client, message) "readOnlyId": padIds.readOnlyPadId, "readonly": padIds.readonly, "serverTimestamp": new Date().getTime(), - "globalPadId": message.padId, "userId": author, "abiwordAvailable": settings.abiwordAvailable(), "plugins": { diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 8dfcfc64..b51b0809 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -40,7 +40,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) var rev = serverVars.rev; var padId = serverVars.padId; - var globalPadId = serverVars.globalPadId; var state = "IDLE"; var stateMessage; From 6aaf4c40655d04c14a2d1dc98ceca4dde4fb3e70 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:30:25 +0100 Subject: [PATCH 457/463] [collab_client] remove keys function, which was not used and variable reconnectTimes which was used for some long gone disconnect tracking code --- src/static/js/collab_client.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index b51b0809..ce732b58 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -54,7 +54,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) var userSet = {}; // userId -> userInfo userSet[userId] = initialUserInfo; - var reconnectTimes = []; var caughtErrors = []; var caughtErrorCatchers = []; var caughtErrorTimes = []; @@ -501,16 +500,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } } - function keys(obj) - { - var array = []; - $.each(obj, function(k, v) - { - array.push(k); - }); - return array; - } - function valuesArray(obj) { var array = []; From 1fa8c2a7e61b75c8976fb5bcb3b7ae6dde6493e8 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:30:48 +0100 Subject: [PATCH 458/463] [collab_client] remove unused function getStats --- src/static/js/collab_client.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index ce732b58..146ec51b 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -204,17 +204,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } } - function getStats() - { - var stats = {}; - - stats.screen = [$(window).width(), $(window).height(), window.screen.availWidth, window.screen.availHeight, window.screen.width, window.screen.height].join(','); - stats.ip = serverVars.clientIp; - stats.useragent = serverVars.clientAgent; - - return stats; - } - function setUpSocket() { hiccupCount = 0; From 906ab1820b8555d018cb783840e7b368edfdfbe8 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:31:18 +0100 Subject: [PATCH 459/463] [timeslider] do not include underscore, as its not (longer) used --- src/static/js/timeslider.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 19489961..fd22c69a 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -28,7 +28,6 @@ JSON = require('./json2'); var createCookie = require('./pad_utils').createCookie; var readCookie = require('./pad_utils').readCookie; var randomString = require('./pad_utils').randomString; -var _ = require('./underscore'); var hooks = require('./pluginfw/hooks'); var token, padId, export_links; From ab797c9831d08f521fb0dfdd1e776d36b0945e91 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:31:46 +0100 Subject: [PATCH 460/463] [pad_connectionstatus] padeditbar is not used anywhere in pad_connectionstatus --- src/static/js/pad_connectionstatus.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/pad_connectionstatus.js b/src/static/js/pad_connectionstatus.js index 4cbf1642..76eedbc4 100644 --- a/src/static/js/pad_connectionstatus.js +++ b/src/static/js/pad_connectionstatus.js @@ -21,7 +21,6 @@ */ var padmodals = require('./pad_modals').padmodals; -var padeditbar = require('./pad_editbar').padeditbar; var padconnectionstatus = (function() { From 9400425b1eef135cc671c866da39c116d7e82b17 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:33:58 +0100 Subject: [PATCH 461/463] [virtual_lines] remove traces of virtual_lines/makeVirtualLineView. this code was used for FF2 key handling code and is long unused --- src/node/utils/tar.json | 1 - src/static/js/ace2_inner.js | 1 - src/static/js/virtual_lines.js | 388 --------------------------------- 3 files changed, 390 deletions(-) delete mode 100644 src/static/js/virtual_lines.js diff --git a/src/node/utils/tar.json b/src/node/utils/tar.json index b010f851..70001f8f 100644 --- a/src/node/utils/tar.json +++ b/src/node/utils/tar.json @@ -46,7 +46,6 @@ , "Changeset.js" , "ChangesetUtils.js" , "skiplist.js" - , "virtual_lines.js" , "cssmanager.js" , "colorutils.js" , "undomodule.js" diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 9391e4ed..1c5fcad5 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -51,7 +51,6 @@ function Ace2Inner(){ var linestylefilter = require('./linestylefilter').linestylefilter; var SkipList = require('./skiplist'); var undoModule = require('./undomodule').undoModule; - var makeVirtualLineView = require('./virtual_lines').makeVirtualLineView; var AttributeManager = require('./AttributeManager'); var DEBUG = false; //$$ build script replaces the string "var DEBUG=true;//$$" with "var DEBUG=false;" diff --git a/src/static/js/virtual_lines.js b/src/static/js/virtual_lines.js deleted file mode 100644 index 2bcf5ed6..00000000 --- a/src/static/js/virtual_lines.js +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This code is mostly from the old Etherpad. Please help us to comment this code. - * This helps other people to understand this code better and helps them to improve it. - * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED - */ - -/** - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS-IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function makeVirtualLineView(lineNode) -{ - - // how much to jump forward or backward at once in a charSeeker before - // constructing a DOM node and checking the coordinates (which takes a - // significant fraction of a millisecond). From the - // coordinates and the approximate line height we can estimate how - // many lines we have moved. We risk being off if the number of lines - // we move is on the order of the line height in pixels. Fortunately, - // when the user boosts the font-size they increase both. - var maxCharIncrement = 20; - var seekerAtEnd = null; - - function getNumChars() - { - return lineNode.textContent.length; - } - - function getNumVirtualLines() - { - if (!seekerAtEnd) - { - var seeker = makeCharSeeker(); - seeker.forwardByWhile(maxCharIncrement); - seekerAtEnd = seeker; - } - return seekerAtEnd.getVirtualLine() + 1; - } - - function getVLineAndOffsetForChar(lineChar) - { - var seeker = makeCharSeeker(); - seeker.forwardByWhile(maxCharIncrement, null, lineChar); - var theLine = seeker.getVirtualLine(); - seeker.backwardByWhile(8, function() - { - return seeker.getVirtualLine() == theLine; - }); - seeker.forwardByWhile(1, function() - { - return seeker.getVirtualLine() != theLine; - }); - var lineStartChar = seeker.getOffset(); - return { - vline: theLine, - offset: (lineChar - lineStartChar) - }; - } - - function getCharForVLineAndOffset(vline, offset) - { - // returns revised vline and offset as well as absolute char index within line. - // if offset is beyond end of line, for example, will give new offset at end of line. - var seeker = makeCharSeeker(); - // go to start of line - seeker.binarySearch(function() - { - return seeker.getVirtualLine() >= vline; - }); - var lineStart = seeker.getOffset(); - var theLine = seeker.getVirtualLine(); - // go to offset, overshooting the virtual line only if offset is too large for it - seeker.forwardByWhile(maxCharIncrement, null, lineStart + offset); - // get back into line - seeker.backwardByWhile(1, function() - { - return seeker.getVirtualLine() != theLine; - }, lineStart); - var lineChar = seeker.getOffset(); - var theOffset = lineChar - lineStart; - // handle case of last virtual line; should be able to be at end of it - if (theOffset < offset && theLine == (getNumVirtualLines() - 1)) - { - var lineLen = getNumChars(); - theOffset += lineLen - lineChar; - lineChar = lineLen; - } - - return { - vline: theLine, - offset: theOffset, - lineChar: lineChar - }; - } - - return { - getNumVirtualLines: getNumVirtualLines, - getVLineAndOffsetForChar: getVLineAndOffsetForChar, - getCharForVLineAndOffset: getCharForVLineAndOffset, - makeCharSeeker: function() - { - return makeCharSeeker(); - } - }; - - function deepFirstChildTextNode(nd) - { - nd = nd.firstChild; - while (nd && nd.firstChild) nd = nd.firstChild; - if (nd.data) return nd; - return null; - } - - function makeCharSeeker( /*lineNode*/ ) - { - - function charCoords(tnode, i) - { - var container = tnode.parentNode; - - // treat space specially; a space at the end of a virtual line - // will have weird coordinates - var isSpace = (tnode.nodeValue.charAt(i) === " "); - if (isSpace) - { - if (i == 0) - { - if (container.previousSibling && deepFirstChildTextNode(container.previousSibling)) - { - tnode = deepFirstChildTextNode(container.previousSibling); - i = tnode.length - 1; - container = tnode.parentNode; - } - else - { - return { - top: container.offsetTop, - left: container.offsetLeft - }; - } - } - else - { - i--; // use previous char - } - } - - - var charWrapper = document.createElement("SPAN"); - - // wrap the character - var tnodeText = tnode.nodeValue; - var frag = document.createDocumentFragment(); - frag.appendChild(document.createTextNode(tnodeText.substring(0, i))); - charWrapper.appendChild(document.createTextNode(tnodeText.substr(i, 1))); - frag.appendChild(charWrapper); - frag.appendChild(document.createTextNode(tnodeText.substring(i + 1))); - container.replaceChild(frag, tnode); - - var result = { - top: charWrapper.offsetTop, - left: charWrapper.offsetLeft + (isSpace ? charWrapper.offsetWidth : 0), - height: charWrapper.offsetHeight - }; - - while (container.firstChild) container.removeChild(container.firstChild); - container.appendChild(tnode); - - return result; - } - - var lineText = lineNode.textContent; - var lineLength = lineText.length; - - var curNode = null; - var curChar = 0; - var curCharWithinNode = 0 - var curTop; - var curLeft; - var approxLineHeight; - var whichLine = 0; - - function nextNode() - { - var n = curNode; - if (!n) n = lineNode.firstChild; - else n = n.nextSibling; - while (n && !deepFirstChildTextNode(n)) - { - n = n.nextSibling; - } - return n; - } - - function prevNode() - { - var n = curNode; - if (!n) n = lineNode.lastChild; - else n = n.previousSibling; - while (n && !deepFirstChildTextNode(n)) - { - n = n.previousSibling; - } - return n; - } - - var seeker; - if (lineLength > 0) - { - curNode = nextNode(); - var firstCharData = charCoords(deepFirstChildTextNode(curNode), 0); - approxLineHeight = firstCharData.height; - curTop = firstCharData.top; - curLeft = firstCharData.left; - - function updateCharData(tnode, i) - { - var coords = charCoords(tnode, i); - whichLine += Math.round((coords.top - curTop) / approxLineHeight); - curTop = coords.top; - curLeft = coords.left; - } - - seeker = { - forward: function(numChars) - { - var oldChar = curChar; - var newChar = curChar + numChars; - if (newChar > (lineLength - 1)) newChar = lineLength - 1; - while (curChar < newChar) - { - var curNodeLength = deepFirstChildTextNode(curNode).length; - var toGo = curNodeLength - curCharWithinNode; - if (curChar + toGo > newChar || !nextNode()) - { - // going to next node would be too far - var n = newChar - curChar; - if (n >= toGo) n = toGo - 1; - curChar += n; - curCharWithinNode += n; - break; - } - else - { - // go to next node - curChar += toGo; - curCharWithinNode = 0; - curNode = nextNode(); - } - } - updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode); - return curChar - oldChar; - }, - backward: function(numChars) - { - var oldChar = curChar; - var newChar = curChar - numChars; - if (newChar < 0) newChar = 0; - while (curChar > newChar) - { - if (curChar - curCharWithinNode <= newChar || !prevNode()) - { - // going to prev node would be too far - var n = curChar - newChar; - if (n > curCharWithinNode) n = curCharWithinNode; - curChar -= n; - curCharWithinNode -= n; - break; - } - else - { - // go to prev node - curChar -= curCharWithinNode + 1; - curNode = prevNode(); - curCharWithinNode = deepFirstChildTextNode(curNode).length - 1; - } - } - updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode); - return oldChar - curChar; - }, - getVirtualLine: function() - { - return whichLine; - }, - getLeftCoord: function() - { - return curLeft; - } - }; - } - else - { - curLeft = lineNode.offsetLeft; - seeker = { - forward: function(numChars) - { - return 0; - }, - backward: function(numChars) - { - return 0; - }, - getVirtualLine: function() - { - return 0; - }, - getLeftCoord: function() - { - return curLeft; - } - }; - } - seeker.getOffset = function() - { - return curChar; - }; - seeker.getLineLength = function() - { - return lineLength; - }; - seeker.toString = function() - { - return "seeker[curChar: " + curChar + "(" + lineText.charAt(curChar) + "), left: " + seeker.getLeftCoord() + ", vline: " + seeker.getVirtualLine() + "]"; - }; - - function moveByWhile(isBackward, amount, optCondFunc, optCharLimit) - { - var charsMovedLast = null; - var hasCondFunc = ((typeof optCondFunc) == "function"); - var condFunc = optCondFunc; - var hasCharLimit = ((typeof optCharLimit) == "number"); - var charLimit = optCharLimit; - while (charsMovedLast !== 0 && ((!hasCondFunc) || condFunc())) - { - var toMove = amount; - if (hasCharLimit) - { - var untilLimit = (isBackward ? curChar - charLimit : charLimit - curChar); - if (untilLimit < toMove) toMove = untilLimit; - } - if (toMove < 0) break; - charsMovedLast = (isBackward ? seeker.backward(toMove) : seeker.forward(toMove)); - } - } - - seeker.forwardByWhile = function(amount, optCondFunc, optCharLimit) - { - moveByWhile(false, amount, optCondFunc, optCharLimit); - } - seeker.backwardByWhile = function(amount, optCondFunc, optCharLimit) - { - moveByWhile(true, amount, optCondFunc, optCharLimit); - } - seeker.binarySearch = function(condFunc) - { - // returns index of boundary between false chars and true chars; - // positions seeker at first true char, or else last char - var trueFunc = condFunc; - var falseFunc = function() - { - return !condFunc(); - }; - seeker.forwardByWhile(20, falseFunc); - seeker.backwardByWhile(20, trueFunc); - seeker.forwardByWhile(10, falseFunc); - seeker.backwardByWhile(5, trueFunc); - seeker.forwardByWhile(1, falseFunc); - return seeker.getOffset() + (condFunc() ? 0 : 1); - } - - return seeker; - } - -} - -exports.makeVirtualLineView = makeVirtualLineView; From 77cf2aafacf859b053ee2d704f6b2ce0d4df5a71 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:35:11 +0100 Subject: [PATCH 462/463] [pad_modals] remove unused variables. for the hide/show functions jquery's default variables are used everywhere --- src/static/js/pad_modals.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/static/js/pad_modals.js b/src/static/js/pad_modals.js index 39094a7e..67b03662 100644 --- a/src/static/js/pad_modals.js +++ b/src/static/js/pad_modals.js @@ -20,7 +20,6 @@ * limitations under the License. */ -var padutils = require('./pad_utils').padutils; var padeditbar = require('./pad_editbar').padeditbar; var padmodals = (function() @@ -39,10 +38,10 @@ var padmodals = (function() padeditbar.toggleDropDown("connectivity"); }); }, - showOverlay: function(duration) { + showOverlay: function() { $("#overlay").show(); }, - hideOverlay: function(duration) { + hideOverlay: function() { $("#overlay").hide(); } }; From 3180b96213ab0e8f18be5370899bb515e0afcb72 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 9 Dec 2013 18:13:07 +0000 Subject: [PATCH 463/463] Remove console logs --- src/node/handler/ImportHandler.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index 3e00be77..c751f8f9 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -103,9 +103,7 @@ exports.doImport = function(req, res, padId) // Logic for allowing external Import Plugins hooks.aCallAll("import", {srcFile: srcFile, destFile: destFile}, function(err, result){ if(ERR(err, callback)) return callback(); -console.log(result); if(result.length > 0){ // This feels hacky and wrong.. - console.log("Plugin handling import"); importHandledByPlugin = true; callback(); }else{ @@ -191,7 +189,6 @@ console.log(result); function(callback) { var fileEnding = path.extname(srcFile).toLowerCase(); if (abiword || fileEnding == ".htm" || fileEnding == ".html") { -console.log("trying", fileEnding, abiword, text) try{ importHtml.setPadHTML(pad, text); }catch(e){
    -

    Table of Contents

    -
    - -