Merge new release into master branch!

This commit is contained in:
Stefan 2016-04-24 21:04:16 +02:00
commit dcfb287990
97 changed files with 1976 additions and 555 deletions

1
.gitignore vendored
View File

@ -17,3 +17,4 @@ npm-debug.log
*.crt
*.key
bin/etherpad-1.deb
credentials.json

View File

@ -4,7 +4,7 @@
# About
Etherpad is a really-real time collaborative editor maintained by the Etherpad Community.
Etherpad is written in JavaScript(99.9%) on both the server and client so it's easy for developers to maintain and add new features. Because of this Etherpad has tons of customizations that you can leverage.
Etherpad is written in JavaScript (99.9%) on both the server and client so it's easy for developers to maintain and add new features. Because of this Etherpad has tons of customizations that you can leverage.
Etherpad is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API)
that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API.

View File

@ -1,6 +1,6 @@
#!/bin/sh
NODE_VERSION="0.12.2"
NODE_VERSION="4.4.3"
#Move to the folder where ep-lite is installed
cd `dirname $0`
@ -29,11 +29,11 @@ hash unzip > /dev/null 2>&1 || {
}
START_FOLDER=$(pwd);
TMP_FOLDER=$(mktemp -d)
echo "create a clean environment in /tmp/etherpad-lite-win..."
rm -rf /tmp/etherpad-lite-win
cp -ar . /tmp/etherpad-lite-win
cd /tmp/etherpad-lite-win
echo "create a clean environment in $TMP_FOLDER..."
cp -ar . $TMP_FOLDER
cd $TMP_FOLDER
rm -rf node_modules
rm -f etherpad-lite-win.zip
@ -50,21 +50,20 @@ mv node_modules_resolved node_modules
echo "download windows node..."
cd bin
wget "http://nodejs.org/dist/v$NODE_VERSION/node.exe" -O ../node.exe
wget "https://nodejs.org/dist/v$NODE_VERSION/win-x86/node.exe" -O ../node.exe
echo "remove git history to reduce folder size"
rm -rf .git/objects
echo "remove windows jsdom-nocontextify/test folder"
rm -rf /tmp/etherpad-lite-win/src/node_modules/wd/node_modules/request/node_modules/form-data/node_modules/combined-stream/test
rm -rf /tmp/etherpad-lite-win/src/node_modules/nodemailer/node_modules/mailcomposer/node_modules/mimelib/node_modules/encoding/node_modules/iconv-lite/encodings/tables
rm -rf $TMP_FOLDER/src/node_modules/wd/node_modules/request/node_modules/form-data/node_modules/combined-stream/test
rm -rf $TMP_FOLDER/src/node_modules/nodemailer/node_modules/mailcomposer/node_modules/mimelib/node_modules/encoding/node_modules/iconv-lite/encodings/tables
echo "create the zip..."
cd /tmp
zip -9 -r etherpad-lite-win.zip etherpad-lite-win
mv etherpad-lite-win.zip $START_FOLDER
cd $TMP_FOLDER
zip -9 -r $START_FOLDER/etherpad-lite-win.zip ./*
echo "clean up..."
rm -rf /tmp/etherpad-lite-win
rm -rf $TMP_FOLDER
echo "Finished. You can find the zip in the Etherpad root folder, it's called etherpad-lite-win.zip"

View File

@ -46,15 +46,11 @@ fi
#check node version
NODE_VERSION=$(node --version)
NODE_V_MINOR=$(echo $NODE_VERSION | cut -d "." -f 1-2)
#iojs version checking added
if hash iojs 2>/dev/null; then
IOJS_VERSION=$(iojs --version)
fi
if [ ! $NODE_V_MINOR = "v0.10" ] && [ ! $NODE_V_MINOR = "v0.11" ] && [ ! $NODE_V_MINOR = "v0.12" ]; then
if [ ! $IOJS_VERSION ]; then
echo "You're running a wrong version of node, or io.js is not installed. You're using $NODE_VERSION, we need v0.10.x, v0.11.x or v0.12.x" >&2
exit 1
fi
NODE_V_MAIN=$(echo $NODE_VERSION | cut -d "." -f 1)
NODE_V_MAIN=${NODE_V_MAIN#"v"}
if [ ! $NODE_V_MINOR = "v0.10" ] && [ ! $NODE_V_MINOR = "v0.11" ] && [ ! $NODE_V_MINOR = "v0.12" ] && [ ! $NODE_V_MAIN -ge 4 ]; then
echo "You're running a wrong version of node. You're using $NODE_VERSION, we need node v0.10.x or higher" >&2
exit 1
fi
#Get the name of the settings file

View File

@ -6,11 +6,6 @@ cd /D "%~dp0\.."
:: Is node installed?
cmd /C node -e "" || ( echo "Please install node.js ( http://nodejs.org )" && exit /B 1 )
echo _
echo Checking node version...
set check_version="if(['10','11','12'].indexOf(process.version.split('.')[1]) === -1 && process.version.split('.')[0] !== '1') { console.log('You are running a wrong version of Node. Etherpad requires v0.10+'); process.exit(1) }"
cmd /C node -e %check_version% || exit /B 1
echo _
echo Ensure that all dependencies are up to date... If this is the first time you have run Etherpad please be patient.
cmd /C npm install src/ --loglevel warn || exit /B 1

View File

@ -1,18 +0,0 @@
require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) {
process.chdir(npm.root+'/..')
var settings = require("ep_etherpad-lite/node/utils/Settings");
var dirty = require("ep_etherpad-lite/node_modules/ueberDB/node_modules/dirty")('var/dirty.db');
var db = require("ep_etherpad-lite/node/db/DB");
db.init(function() {
db = db.db;
dirty.on("load", function() {
dirty.forEach(function(key, value) {
db.set(key, value);
});
});
});
});

View File

@ -0,0 +1,38 @@
require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) {
process.chdir(npm.root+'/..')
// This script requires that you have modified your settings.json file
// to work with a real database. Please make a backup of your dirty.db
// file before using this script, just to be safe.
var settings = require("ep_etherpad-lite/node/utils/Settings");
var dirty = require("dirty")('var/dirty.db');
var ueberDB = require("../src/node_modules/ueberDB");
var log4js = require("../src/node_modules/log4js");
var dbWrapperSettings = {
"cache": "0", // The cache slows things down when you're mostly writing.
};
var db = new ueberDB.database(settings.dbType, settings.dbSettings, dbWrapperSettings, log4js.getLogger("ueberDB"));
db.init(function() {
console.log("Waiting for dirtyDB to parse its file.");
dirty.on("load", function(length) {
console.log("Loaded " + length + " records, processing now.");
var remaining = length;
dirty.forEach(function(key, value) {
db.set(key, value, function(error) {
if (typeof error != 'undefined') {
console.log("Unexpected result handling: ", key, value, " was: ", error);
}
remaining -= 1;
var oldremaining = remaining;
if ((oldremaining % 100) == 0) {
console.log("Records not yet flushed to database: ", remaining);
}
});
});
console.log("Please wait for all records to flush to database, then kill this process.");
});
});
});

View File

@ -79,6 +79,9 @@ async.series([
newPad.pool.numToAttrib = oldPad.pool.numToAttrib;
for(var curRevNum = 0; curRevNum <= newRevHead; curRevNum++) {
db.db.get("pad:" + padId + ":revs:" + curRevNum, function(err, rev) {
if (rev.meta) {
throw "The specified revision number could not be found.";
}
var newRevNum = ++newPad.head;
var newRevId = "pad:" + newPad.id + ":revs:" + newRevNum;
db.db.set(newRevId, rev);

View File

@ -35,5 +35,5 @@ bin/installDeps.sh $* || exit 1
echo "Started Etherpad..."
SCRIPTPATH=`pwd -P`
node $SCRIPTPATH/node_modules/ep_etherpad-lite/node/server.js $*
exec node $SCRIPTPATH/node_modules/ep_etherpad-lite/node/server.js $*

View File

@ -37,13 +37,19 @@ Returns the `rep` object.
## editorInfo.ace_isCaret(?)
## editorInfo.ace_getLineAndCharForPoint(?)
## editorInfo.ace_performDocumentApplyAttributesToCharRange(?)
## editorInfo.ace_setAttributeOnSelection(?)
## editorInfo.ace_setAttributeOnSelection(attribute, enabled)
Sets an attribute on current range.
Example: `call.editorInfo.ace_setAttributeOnSelection("turkey::balls", true); // turkey is the attribute here, balls is the value
Notes: to remove the attribute pass enabled as false
## editorInfo.ace_toggleAttributeOnSelection(?)
## editorInfo.ace_getAttributeOnSelection(attribute)
## editorInfo.ace_getAttributeOnSelection(attribute, prevChar)
Returns a boolean if an attribute exists on a selected range.
prevChar value should be true if you want to get the previous Character attribute instead of the current selection for example
if the caret is at position 0,1 (after first character) it's probable you want the attributes on the character at 0,0
The attribute should be the string name of the attribute applied to the selection IE subscript
Example usage: Apply the activeButton Class to a button if an attribute is on a highlighted/selected caret position or range.
Example: `call.editorInfo.ace_getAttributeOnSelection("subscript");` // call here is the callstack from aceEditEvent.
Example `var isItThere = documentAttributeManager.getAttributeOnSelection("turkey::balls", true);`
See the ep_subscript plugin for an example of this function in action.
Notes: Does not work on first or last character of a line. Suffers from a race condition if called with aceEditEvent.
## editorInfo.ace_performSelectionChange(?)

View File

@ -111,7 +111,7 @@ 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.
This hook is provided to allow custom CSS files to be loaded. The return value should be an array of resource urls or paths relative to the plugins directory.
## aceInitInnerdocbodyHead
Called from: src/static/js/ace.js
@ -160,7 +160,19 @@ Things in context:
1. ace - the ace object that is applied to this editor.
2. pad - the pad object of the current pad.
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.
## postToolbarInit
Called from: src/static/js/pad_editbar.js
Things in context:
1. ace - the ace object that is applied to this editor.
2. toolbar - Editbar instance. See below for the Editbar documentation.
Can be used to register custom actions to the toolbar.
Usage examples:
* [https://github.com/tiblu/ep_authorship_toggle]()
## postTimesliderInit
Called from: src/static/js/timeslider.js
@ -339,3 +351,14 @@ Things in context:
This hook is provided to allow author highlight style to be modified.
Registered hooks should return 1 if the plugin handles highlighting. If no plugin returns 1, the core will use the default background-based highlighting.
## aceSelectionChanged
Called from: src/static/js/ace2_inner.js
Things in context:
1. rep - information about where the user's cursor is
2. documentAttributeManager - information about attributes in the document
This hook allows a plugin to react to a cursor or selection change,
perhaps to update a UI element based on the style at the cursor location.

View File

@ -81,7 +81,7 @@ Available blocks in `pad.html` are:
* `modals` - Contains all connectivity messages
* `embedPopup` - the embed dropdown
* `scripts` - Add your script tags here, if you really have to (consider use client-side hooks instead)
`timeslider.html` blocks:
* `timesliderStyles`
@ -90,9 +90,9 @@ Available blocks in `pad.html` are:
* `timesliderTop`
* `timesliderEditbarRight`
* `modals`
`index.html` blocks:
* `indexWrapper` - contains the form for creating new pads
## padInitToolbar
@ -104,6 +104,10 @@ Things in context:
Here you can add custom toolbar items that will be available in the toolbar config in `settings.json`. For more about the toolbar controller see the API section.
Usage examples:
* [https://github.com/tiblu/ep_authorship_toggle]()
## padCreate
Called from: src/node/db/Pad.js
@ -334,7 +338,7 @@ exports.aceAttribClasses = function(hook_name, attr, cb){
```
## exportFileName
Called from src/node/handler/ExportHandler.js
Called from src/node/handler/ExportHandler.js
Things in context:
@ -357,7 +361,7 @@ Things in context:
1. Pad object
This hook will allow a plug-in developer to include more properties and attributes to support during HTML Export. An Array should be returned.
This hook will allow a plug-in developer to include more properties and attributes to support during HTML Export. If tags are stored as `['color', 'red']` on the attribute pool, use `exportHtmlAdditionalTagsWithData` instead. An Array should be returned.
Example:
```
@ -368,6 +372,24 @@ exports.exportHtmlAdditionalTags = function(hook, pad, cb){
};
```
## exportHtmlAdditionalTagsWithData
Called from src/node/utils/ExportHtml.js
Things in context:
1. Pad object
Identical to `exportHtmlAdditionalTags`, but for tags that are stored with an specific value (not simply `true`) on the attribute pool. For example `['color', 'red']`, instead of `['bold', true]`. This hook will allow a plug-in developer to include more properties and attributes to support during HTML Export. An Array of arrays should be returned. The exported HTML will contain tags like `<span data-color="red">` for the content where attributes are `['color', 'red']`.
Example:
```
// Add the props to be supported in export
exports.exportHtmlAdditionalTagsWithData = function(hook, pad, cb){
var padId = pad.id;
cb([["color", "red"], ["color", "blue"]]);
};
```
## userLeave
Called from src/node/handler/PadMessageHandler.js
@ -384,3 +406,20 @@ exports.userLeave = function(hook, session, callback) {
console.log('%s left pad %s', session.author, session.padId);
};
```
### clientReady
Called from src/node/handler/PadMessageHandler.js
This in context:
1. message
This hook gets called when handling a CLIENT_READY which is the first message from the client to the server.
Example:
```
exports.clientReady = function(hook, message) {
console.log('Client has entered the pad' + message.padId);
};
```

View File

@ -61,7 +61,7 @@ Portal submits content into new blog post
## Usage
### API version
The latest version is `1.2.12`
The latest version is `1.2.13`
The current version can be queried via /api.
@ -280,6 +280,16 @@ returns the text of a pad
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}`
#### appendText(padID, text)
* API >= 1.2.13
appends text to a pad
*Example returns:*
* `{code: 0, message:"ok", data: null}`
* `{code: 1, message:"padID does not exist", data: null}`
@ -380,6 +390,16 @@ returns the chatHead (last number of the last chat-message) of the pad
* `{code: 0, message:"ok", data: {chatHead: 42}}`
* `{code: 1, message:"padID does not exist", data: null}`
#### appendChatMessage(padID, text, authorID [, time])
* API >= 1.2.12
creates a chat message, saves it to the database and sends it to all connected clients of this pad
*Example returns:*
* `{code: 0, message:"ok", data: null}`
* `{code: 1, message:"text is no string", 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.

View File

@ -2,6 +2,9 @@
This file must be valid JSON. But comments are allowed
Please edit settings.json, not settings.json.template
To still commit settings without credentials you can
store any credential settings in credentials.json
*/
{
// Name your instance!
@ -44,7 +47,8 @@
"user" : "root",
"host" : "localhost",
"password": "",
"database": "store"
"database": "store",
"charset" : "utf8mb4"
},
*/
@ -66,7 +70,7 @@
"lang": "en-gb"
},
/* Shoud we suppress errors from being visible in the default Pad Text? */
/* Should we suppress errors from being visible in the default Pad Text? */
"suppressErrorsInPadText" : false,
/* Users must have a session to access pads. This effectively allows only group pads to be accessed. */
@ -86,10 +90,14 @@
may cause problems during deployment. Set to 0 to disable caching */
"maxAge" : 21600, // 60 * 60 * 6 = 6 hours
/* This is the path to the Abiword executable. Setting it to null, disables abiword.
/* This is the absolute path to the Abiword executable. Setting it to null, disables abiword.
Abiword is needed to advanced import/export features of pads*/
"abiword" : null,
/* This is the absolute path to the soffice executable. Setting it to null, disables LibreOffice exporting.
LibreOffice can be used in lieu of Abiword to export pads */
"soffice" : null,
/* This is the path to the Tidy executable. Setting it to null, disables Tidy.
Tidy is used to improve the quality of exported pads*/
"tidyHtml" : null,
@ -131,6 +139,11 @@
// Allow Load Testing tools to hit the Etherpad Instance. Warning this will disable security on the instance.
"loadTest": false,
// Disable indentation on new line when previous line ends with some special chars (':', '[', '(', '{')
/*
"indentationOnNewLine": false,
*/
/* The toolbar buttons configuration.
"toolbar": {
"left": [

View File

@ -6,7 +6,8 @@
"Alami",
"Meno25",
"Test Create account",
"محمد أحمد عبد الفتاح"
"محمد أحمد عبد الفتاح",
"Haytham morsy"
]
},
"index.newPad": "باد جديد",
@ -97,6 +98,9 @@
"timeslider.exportCurrent": "تصدير النسخة الحالية ك:",
"timeslider.version": "إصدار {{version}}",
"timeslider.saved": "محفوظ {{month}} {{day}}, {{year}}",
"timeslider.playPause": "تشغيل / إيقاف مؤقت محتويات الباد",
"timeslider.backRevision": "عد إلى مراجعة في هذه الباد",
"timeslider.forwardRevision": "انطلق إلى مراجعة في هذه الباد",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "يناير",
"timeslider.month.february": "فبراير",

View File

@ -4,7 +4,8 @@
"AZISS",
"Khan27",
"Mushviq Abdulla",
"Wertuose"
"Wertuose",
"Mastizada"
]
},
"index.newPad": "Yeni lövhə",
@ -19,22 +20,24 @@
"pad.toolbar.unindent.title": ıxıntı (Shift+TAB)",
"pad.toolbar.undo.title": "Geri qaytar (Ctrl+Z)",
"pad.toolbar.redo.title": "Qaytar (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Müəlliflik Rənglərini Təmizlə",
"pad.toolbar.clearAuthorship.title": "Müəlliflik Rənglərini Təmizlə (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Müxtəlif fayl formatların(a/dan) idxal/ixrac",
"pad.toolbar.timeslider.title": "Vaxt cədvəli",
"pad.toolbar.savedRevision.title": "Saxlanılan Düzəlişlər",
"pad.toolbar.savedRevision.title": "Düzəlişləri Saxla",
"pad.toolbar.settings.title": "Tənzimləmələr",
"pad.toolbar.embed.title": "Bu lövhəni paylaş və qur",
"pad.toolbar.showusers.title": "Lövhədəki istifadəçiləri göstər",
"pad.colorpicker.save": "Saxla",
"pad.colorpicker.cancel": "İmtina",
"pad.loading": "Yüklənir...",
"pad.noCookie": "Çərəz tapıla bilmədi. Lütfən səyyahınızda çərəzlərə icazə verinǃ",
"pad.passwordRequired": "Bu lövhəyə daxil olmaq üçün parol lazımdır",
"pad.permissionDenied": "Bu lövhəyə daxil olmaq üçün icazəniz yoxdur",
"pad.wrongPassword": "Sizin parolunuz səhvdir",
"pad.settings.padSettings": "Lövhə nizamlamaları",
"pad.settings.myView": "Mənim Görüntüm",
"pad.settings.stickychat": "Söhbət həmişə ekranda",
"pad.settings.chatandusers": "Gap və İstifadəçiləri Göstər",
"pad.settings.colorcheck": "Müəlliflik rəngləri",
"pad.settings.linenocheck": "Sətir nömrələri",
"pad.settings.rtlcheck": "Mühtəviyyat sağdan sola doğru oxunsunmu?",
@ -77,7 +80,7 @@
"pad.modals.deleted.explanation": "Bu lövhə silindi.",
"pad.modals.disconnected": "Əlaqə kəsilib.",
"pad.modals.disconnected.explanation": "Serverə qoşulma itirilib",
"pad.modals.disconnected.cause": "Server istifadə olunmur. Əgər problem təkrarlanacaqsa, bizə bildirin.",
"pad.modals.disconnected.cause": "Server ola bilsin, əlçatmazdır. Əgər belə davam edərsə xidmət administratorunu xəbərdar edin.",
"pad.share": "Bu lövhəni paylaş",
"pad.share.readonly": "Yalnız oxuyun",
"pad.share.link": "Keçid",
@ -93,6 +96,7 @@
"timeslider.exportCurrent": "Cari versiyanı ixrac etmək kimi:",
"timeslider.version": "Versiya {{version}}",
"timeslider.saved": "Saxlanıldı {{day}} {{month}}, {{year}}",
"timeslider.playPause": "Geri oxutma / Lövhə Məzmunlarını Dayandır",
"timeslider.dateformat": "{{day}} {{month}}, {{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Yanvar",
"timeslider.month.february": "Fevral",

View File

@ -3,7 +3,8 @@
"authors": [
"Amir a57",
"Mousa",
"Koroğlu"
"Koroğlu",
"Alp Er Tunqa"
]
},
"index.newPad": "یئنی یادداشت دفترچه سی",
@ -11,21 +12,21 @@
"pad.toolbar.bold.title": "بویوت",
"pad.toolbar.italic.title": "مورب",
"pad.toolbar.underline.title": "خطدین آلتی",
"pad.toolbar.strikethrough.title": "خط یئمیش",
"pad.toolbar.ol.title": "جوتدنمیش فهرست",
"pad.toolbar.ul.title": "جوتدنممیش فهرست",
"pad.toolbar.strikethrough.title": "خط یئمیش (Ctrl+5)",
"pad.toolbar.ol.title": "جوتدنمیش فهرست (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "جوتدنمه‌میش لیست (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "ایچری باتدیگی",
"pad.toolbar.unindent.title": "ائشیگه چیخدیگی",
"pad.toolbar.unindent.title": "ائشیگه چیخدیغی (Shift+TAB)",
"pad.toolbar.undo.title": "باطل ائتمک",
"pad.toolbar.redo.title": "یئنی دن",
"pad.toolbar.clearAuthorship.title": "یازیچی رنگ لری پوزماق",
"pad.toolbar.clearAuthorship.title": "یازیچی رنگ لری پوزماق (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "آیری قالیب لردن /ایچری توکمه / ائشیگه توکمه",
"pad.toolbar.timeslider.title": "زمان اسلایدی",
"pad.toolbar.savedRevision.title": "ساخلانمیش نسخه لر",
"pad.toolbar.savedRevision.title": "نۆسخه‌نی ذخیره ائت",
"pad.toolbar.settings.title": "تنظیملر",
"pad.toolbar.embed.title": "بو یادداشت دفترچه سین یئرلتمک",
"pad.toolbar.showusers.title": "بو دفترچه یادداشت دا اولان کاربرلری گوستر",
"pad.colorpicker.save": "قئید ائت",
"pad.colorpicker.save": "ذخیره ائت",
"pad.colorpicker.cancel": "لغو ائت",
"pad.loading": "یوکلنیر...",
"pad.settings.padSettings": "یادداشت دفترچه سینین تنظیملر",
@ -69,6 +70,7 @@
"timeslider.toolbar.returnbutton": "یادداشت دفترچه سینه قاییت",
"timeslider.toolbar.authors": "یازیچیلار",
"timeslider.toolbar.authorsList": "یازیچی سیز",
"timeslider.toolbar.exportlink.title": "ائشیگه آپارماق",
"timeslider.month.january": "ژانویه",
"timeslider.month.february": "فوریه",
"timeslider.month.march": "مارس",

View File

@ -10,16 +10,18 @@
},
"index.newPad": "নতুন প্যাড",
"index.createOpenPad": "অথবা নাম লিখে প্যাড খুলুন/তৈরী করুন:",
"pad.toolbar.bold.title": "গাড় করা (Ctrl-B)",
"pad.toolbar.italic.title": "বাঁকা করা (Ctrl-I)",
"pad.toolbar.underline.title": "আন্ডারলাইন (Ctrl-U)",
"pad.toolbar.strikethrough.title": "স্ট্রাইক্থ্রু",
"pad.toolbar.ol.title": "সারিবদ্ধ তালিকা",
"pad.toolbar.bold.title": "গাঢ় (Ctrl-B)",
"pad.toolbar.italic.title": "বাঁকা (Ctrl+I)",
"pad.toolbar.underline.title": "নিম্নরেখা (Ctrl+U)",
"pad.toolbar.strikethrough.title": "অবচ্ছেদন (Ctrl+5)",
"pad.toolbar.ol.title": "সারিবদ্ধ তালিকা (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "অসারিবদ্ধ তালিকা (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "প্রান্তিককরণ (TAB)",
"pad.toolbar.unindent.title": "আউটডেন্ট (Shift+TAB)",
"pad.toolbar.undo.title": "বাতিল করুন (Ctrl-Z)",
"pad.toolbar.redo.title": "পুনরায় করুন (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "কৃতি রং পরিষ্কার করুন (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "ভিন্ন ফাইল বিন্যাসে আমদানি/রপ্তানি করুন",
"pad.toolbar.timeslider.title": "টাইমস্লাইডার",
"pad.toolbar.savedRevision.title": "সংস্করণ সংরক্ষণ করুন",
"pad.toolbar.settings.title": "সেটিং",
@ -27,24 +29,28 @@
"pad.toolbar.showusers.title": "এই প্যাডের ব্যবহারকারীদের দেখান",
"pad.colorpicker.save": "সংরক্ষণ",
"pad.colorpicker.cancel": "বাতিল",
"pad.loading": "লোডিং...",
"pad.loading": "লোড হচ্ছে...",
"pad.noCookie": "কুকি পাওয়া যায়নি। দয়া করে আপনার ব্রাউজারে কুকি অনুমতি দিন!",
"pad.passwordRequired": "এই প্যাড-টি দেখার জন্য আপনাকে পাসওয়ার্ড ব্যবহার করতে হবে",
"pad.permissionDenied": "দুঃখিত, এ প্যাড-টি দেখার অধিকার আপনার নেই",
"pad.wrongPassword": "আপনার পাসওয়ার্ড সঠিক নয়",
"pad.settings.padSettings": "প্যাডের স্থাপন",
"pad.settings.myView": "আমার দৃশ্য",
"pad.settings.stickychat": "চ্যাট সক্রীনে প্রদর্শন করা হবে",
"pad.settings.chatandusers": "চ্যাট এবং ব্যবহারকারী দেখান",
"pad.settings.colorcheck": "লেখকদের নিজস্ব নির্বাচিত রং",
"pad.settings.linenocheck": "লাইন নম্বর",
"pad.settings.fontType": "ফন্ট-এর প্রকার:",
"pad.settings.rtlcheck": "ডান থেকে বামে বিষয়বস্তু পড়বেন?",
"pad.settings.fontType": "ফন্টের প্রকার:",
"pad.settings.fontType.normal": "সাধারণ",
"pad.settings.fontType.monospaced": "Monospace",
"pad.settings.globalView": "সর্বব্যাপী দৃশ্য",
"pad.settings.language": "ভাষা:",
"pad.importExport.import_export": "আমদানি/রপ্তানি",
"pad.importExport.import": "কোন টেক্সট ফাইল বা ডকুমেন্ট আপলোড করুন",
"pad.importExport.import": "কোন টেক্সট ফাইল বা নথি আপলোড করুন",
"pad.importExport.importSuccessful": "সফল!",
"pad.importExport.export": "এই প্যাডটি রপ্তানি করুন:",
"pad.importExport.exportetherpad": "ইথারপ্যাড",
"pad.importExport.exporthtml": "এইচটিএমএল",
"pad.importExport.exportplain": "সাধারণ লেখা",
"pad.importExport.exportword": "মাইক্রোসফট ওয়ার্ড",
@ -55,9 +61,11 @@
"pad.modals.forcereconnect": "পুনরায় সংযোগস্থাপনের চেষ্টা",
"pad.modals.userdup": "অন্য উইন্ডো-তে খোলা হয়েছে",
"pad.modals.unauth": "আপনার অধিকার নেই",
"pad.modals.initsocketfail": "সার্ভার-এর সাথে যোগাযোগ করতে অসক্ষম।",
"pad.modals.initsocketfail": "সার্ভারে পৌঁছানো যাচ্ছে না।",
"pad.modals.slowcommit.explanation": "সার্ভার সাড়া দিচ্ছে না।",
"pad.modals.deleted": "অপসারিত।",
"pad.modals.deleted.explanation": "এই প্যাডটি অপসারণ করা হয়েছে।",
"pad.modals.disconnected": "আপনি সংযোগ বিচ্ছিন্ন হয়েছে গেছে।",
"pad.modals.disconnected.explanation": "সার্ভারের সাথে যোগাযোগ করা যাচ্ছে না",
"pad.share": "শেয়ার করুন",
"pad.share.readonly": "শুধু পড়া",
@ -86,11 +94,17 @@
"timeslider.month.october": "অক্টোবর",
"timeslider.month.november": "নভেম্বর",
"timeslider.month.december": "ডিসেম্বর",
"pad.userlist.entername": "আপনার নাম",
"timeslider.unnamedauthors": "নামবিহীন {{num}} জন {[plural(num) one: লেখক, other: লেখক ]}",
"pad.userlist.entername": "আপনার নাম লিখুন",
"pad.userlist.unnamed": "কোন নাম নির্বাচন করা হয়নি",
"pad.userlist.guest": "অতিথি",
"pad.userlist.deny": "প্রত্যাখ্যান",
"pad.userlist.approve": "অনুমোদিত",
"pad.impexp.importbutton": "এখন আমদানি করুন",
"pad.impexp.importing": "আমদানি হচ্ছে...",
"pad.impexp.importfailed": "আমদানি ব্যর্থ"
"pad.impexp.padHasData": "আমরা এই ফাইলটি আমদানি করতে সক্ষম হয়নি কারণ এই প্যাড ইতিমধ্যে পরিবর্তিত হয়েছে, দয়া করে একটি নতুন প্যাডে অামদানি করুন।",
"pad.impexp.uploadFailed": "আপলোড করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন",
"pad.impexp.importfailed": "আমদানি ব্যর্থ",
"pad.impexp.copypaste": "দয়া করে অনুলিপি প্রতিলেপন করুন",
"pad.impexp.exportdisabled": "{{type}} হিসেবে রপ্তানি করা নিষ্ক্রিয় আছে। বিস্তারিত জানার জন্য আপনার সিস্টেম প্রশাসকের সাথে যোগাযোগ করুন।"
}

View File

@ -6,7 +6,9 @@
"Pitort",
"Toniher",
"Macofe",
"Joan manel"
"Joan manel",
"Eduardo Martinez",
"Jaumeortola"
]
},
"index.newPad": "Nou pad",
@ -74,7 +76,7 @@
"pad.modals.slowcommit.explanation": "El servidor no respon.",
"pad.modals.slowcommit.cause": "Això podria ser a causa de problemes amb la connectivitat de la xarxa.",
"pad.modals.badChangeset.explanation": "El servidor de sincronització ha classificat com a il·legat una edició que heu fet.",
"pad.modals.badChangeset.cause": "Això pot ser degut a una configuració errònia del servidor o a algun altre comportament inesperat. Si us plau, si considereu que això és un error, contacteu amb l'administrador del servei. Intenteu reconnectar-vos per tal de continuar editant.",
"pad.modals.badChangeset.cause": "Això pot ser degut a una configuració errònia del servidor o a algun altre comportament inesperat. Si considereu que és un error, contacteu amb l'administrador del servei. Intenteu reconnectar-vos per a continuar editant.",
"pad.modals.corruptPad.explanation": "El pad al qual esteu intentant accedir està corrupte.",
"pad.modals.corruptPad.cause": "Això pot ser degut a una configuració errònia del servidor o a algun altre comportament inesperat. Si us plau, contacteu amb l'administrador del servei.",
"pad.modals.deleted": "Suprimit.",
@ -97,6 +99,9 @@
"timeslider.exportCurrent": "Exporta la versió actual com a:",
"timeslider.version": "Versió {{version}}",
"timeslider.saved": "Desat {{month}} {{day}}, {{year}}",
"timeslider.playPause": "Reproducció / Pausa els continguts del pad",
"timeslider.backRevision": "Tornar una revisió enrere en aquest Pad",
"timeslider.forwardRevision": "Anar una revisió endavant en aquest Pad",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Gener",
"timeslider.month.february": "Febrer",

View File

@ -6,7 +6,8 @@
"Juandev",
"Leanes",
"Quinn",
"Aktron"
"Aktron",
"Mormegil"
]
},
"index.newPad": "Založ nový Pad",
@ -113,7 +114,7 @@
"timeslider.month.october": "říjen",
"timeslider.month.november": "listopad",
"timeslider.month.december": "prosinec",
"timeslider.unnamedauthors": "{{num}} {[ plural(num) one: nejmenovaný Autor, few: nejmenovaní Autoři, other: nejmenovaných Autorů ]}",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: nejmenovaný autor, few: nejmenovaní autoři, other: nejmenovaných autorů ]}",
"pad.savedrevs.marked": "Tato revize je nyní označena jako uložená",
"pad.savedrevs.timeslider": "Návštěvou časové osy zobrazíte uložené revize",
"pad.userlist.entername": "Zadejte své jméno",

View File

@ -5,11 +5,12 @@
"Mklehr",
"Nipsky",
"Wikinaut",
"Thargon"
"Thargon",
"Predatorix"
]
},
"index.newPad": "Neues Pad",
"index.createOpenPad": "Pad mit folgendem Namen öffnen:",
"index.createOpenPad": "oder Pad mit folgendem Namen öffnen:",
"pad.toolbar.bold.title": "Fett (Strg-B)",
"pad.toolbar.italic.title": "Kursiv (Strg-I)",
"pad.toolbar.underline.title": "Unterstrichen (Strg-U)",
@ -22,22 +23,22 @@
"pad.toolbar.redo.title": "Wiederholen (Strg-Y)",
"pad.toolbar.clearAuthorship.title": "Autorenfarben zurücksetzen (Strg+Shift+C)",
"pad.toolbar.import_export.title": "Import/Export von/zu verschiedenen Dateiformaten",
"pad.toolbar.timeslider.title": "Pad-Versionsgeschichte anzeigen",
"pad.toolbar.savedRevision.title": "Version markieren",
"pad.toolbar.timeslider.title": "Bearbeitungsverlauf",
"pad.toolbar.savedRevision.title": "Version speichern",
"pad.toolbar.settings.title": "Einstellungen",
"pad.toolbar.embed.title": "Pad teilen oder einbetten",
"pad.toolbar.showusers.title": "Aktuell verbundene Benutzer anzeigen",
"pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten",
"pad.toolbar.showusers.title": "Benutzer dieses Pads anzeigen",
"pad.colorpicker.save": "Speichern",
"pad.colorpicker.cancel": "Abbrechen",
"pad.loading": "Laden …",
"pad.loading": "Lade …",
"pad.noCookie": "Das Cookie konnte nicht gefunden werden. Bitte erlaube Cookies in deinem Browser!",
"pad.passwordRequired": "Sie benötigen ein Passwort, um auf dieses Pad zuzugreifen",
"pad.passwordRequired": "Sie benötigen ein Kennwort, 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.wrongPassword": "Ihr eingegebenes Kennwort war falsch",
"pad.settings.padSettings": "Pad-Einstellungen",
"pad.settings.myView": "Eigene Ansicht",
"pad.settings.stickychat": "Chat immer anzeigen",
"pad.settings.chatandusers": "Chat und Benutzer anzeigen",
"pad.settings.stickychat": "Unterhaltung immer anzeigen",
"pad.settings.chatandusers": "Unterhaltung und Benutzer anzeigen",
"pad.settings.colorcheck": "Autorenfarben anzeigen",
"pad.settings.linenocheck": "Zeilennummern",
"pad.settings.rtlcheck": "Inhalt von rechts nach links lesen?",
@ -56,47 +57,47 @@
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Sie können nur aus Klartext oder HTML-Formaten importieren. Für mehr erweiterte Importfunktionen <a 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\">installieren Sie bitte abiword</a>.",
"pad.importExport.abiword.innerHTML": "Sie können nur aus reinen Text- oder HTML-Formaten importieren. Für umfangreichere Importfunktionen <a 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\">installieren Sie bitte abiword</a>.",
"pad.modals.connected": "Verbunden.",
"pad.modals.reconnecting": "Wiederherstellen der Verbindung …",
"pad.modals.forcereconnect": "Erneut Verbinden",
"pad.modals.forcereconnect": "Erneutes Verbinden erzwingen",
"pad.modals.userdup": "In einem anderen Fenster geöffnet",
"pad.modals.userdup.explanation": "Dieses Pad scheint in mehr als einem Browser-Fenster auf diesem Computer geöffnet 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ür dieses Pad hat sich zwischenzeitlich geändert. Sie können versuchen das Pad erneut aufzurufen.",
"pad.modals.looping.explanation": "Es gibt Probleme bei der Kommunikation mit dem Pad-Server.",
"pad.modals.looping.cause": "Möglicherweise sind Sie durch eine inkompatible Firewall oder über einen inkompatiblen Proxy mit dem Pad-Server verbunden.",
"pad.modals.initsocketfail": "Pad-Server nicht erreichbar.",
"pad.modals.initsocketfail.explanation": "Es konnte keine Verbindung zum Pad-Server hergestellt werden.",
"pad.modals.userdup.explanation": "Dieses Pad scheint in mehr als einem Browser-Fenster auf diesem Rechner geöffnet zu sein.",
"pad.modals.userdup.advice": "Um stattdessen dieses Fenster zu verwenden, verbinden Sie sich bitte erneut.",
"pad.modals.unauth": "Nicht berechtigt",
"pad.modals.unauth.explanation": "Ihre Zugriffsberechtigung für dieses Pad hat sich zwischenzeitlich geändert. Versuchen Sie sich erneut zu verbinden.",
"pad.modals.looping.explanation": "Es gibt Verbindungsprobleme mit dem Server.",
"pad.modals.looping.cause": "Möglicherweise sind Sie durch eine inkompatible Firewall oder über einen inkompatiblen Proxy mit dem Server verbunden.",
"pad.modals.initsocketfail": "Der Server ist nicht erreichbar.",
"pad.modals.initsocketfail.explanation": "Es konnte keine Verbindung zum Server hergestellt werden.",
"pad.modals.initsocketfail.cause": "Dies könnte an Ihrem Browser oder Ihrer Internet-Verbindung liegen.",
"pad.modals.slowcommit.explanation": "Der Pad-Server reagiert nicht.",
"pad.modals.slowcommit.cause": "Dies könnte ein Netzwerkverbindungsproblem sein oder eine momentane Überlastung des Pad-Servers.",
"pad.modals.badChangeset.explanation": "Eine von Ihnen gemachte Änderung wurde vom Pad-Server als ungültig eingestuft.",
"pad.modals.slowcommit.explanation": "Der Server antwortet nicht.",
"pad.modals.slowcommit.cause": "Dies könnte ein Netzwerkverbindungsproblem sein oder eine momentane Überlastung des Servers.",
"pad.modals.badChangeset.explanation": "Eine von Ihnen gemachte Änderung wurde vom Server als ungültig eingestuft.",
"pad.modals.badChangeset.cause": "Dies könnte aufgrund einer falschen Serverkonfiguration oder eines anderen unerwarteten Verhaltens passiert sein. Bitte kontaktiere den Diensteadministrator, falls du glaubst, dass es sich um einen Fehler handelt. Versuche dich erneut zu verbinden, um mit dem Bearbeiten fortzufahren.",
"pad.modals.corruptPad.explanation": "Das Pad, auf das du zugreifen willst, ist beschädigt.",
"pad.modals.corruptPad.cause": "Dies könnte an einer falschen Serverkonfiguration oder eines anderen unerwarteten Verhaltens liegen. Bitte kontaktiere den Diensteadministrator.",
"pad.modals.corruptPad.explanation": "Das Pad, auf das Sie versuchen zuzugreifen, ist beschädigt.",
"pad.modals.corruptPad.cause": "Dies könnte an einer falschen Serverkonfiguration oder eines anderen unerwarteten Verhaltens liegen. Bitte kontaktieren Sie den Administrator dieses Dienstes.",
"pad.modals.deleted": "Gelöscht.",
"pad.modals.deleted.explanation": "Dieses Pad wurde entfernt.",
"pad.modals.disconnected": "Deine Verbindung wurde getrennt.",
"pad.modals.disconnected.explanation": "Die Verbindung zum Pad-Server wurde unterbrochen.",
"pad.modals.disconnected.cause": "Möglicherweise ist der Pad-Server nicht erreichbar. Bitte benachrichtigen Sie den Dienstadministrator, falls dies weiterhin passiert.",
"pad.modals.disconnected": "Ihre Verbindung wurde getrennt.",
"pad.modals.disconnected.explanation": "Die Verbindung zum Server wurde unterbrochen.",
"pad.modals.disconnected.cause": "Möglicherweise ist der Server nicht erreichbar. Bitte benachrichtigen Sie den Dienstadministrator, falls dies weiterhin passiert.",
"pad.share": "Dieses Pad teilen",
"pad.share.readonly": "Eingeschränkter Nur-Lese-Zugriff",
"pad.share.link": "Link",
"pad.share.link": "Verknüpfung",
"pad.share.emebdcode": "In Webseite einbetten",
"pad.chat": "Chat",
"pad.chat.title": "Den Chat dieses Pads öffnen",
"pad.chat": "Unterhaltung",
"pad.chat.title": "Den Chat für dieses Pad öffnen.",
"pad.chat.loadmessages": "Weitere Nachrichten laden",
"timeslider.pageTitle": "{{appTitle}} Pad-Versionsgeschichte",
"timeslider.pageTitle": "{{appTitle}} Bearbeitungsverlauf",
"timeslider.toolbar.returnbutton": "Zurück zum Pad",
"timeslider.toolbar.authors": "Autoren:",
"timeslider.toolbar.authorsList": "keine Autoren",
"timeslider.toolbar.exportlink.title": "Diese Version exportieren",
"timeslider.exportCurrent": "Exportiere diese Version als:",
"timeslider.version": "Version {{version}}",
"timeslider.saved": "gespeichert am {{day}}. {{month}} {{year}}",
"timeslider.playPause": "Padinhalte abspielen/pausieren",
"timeslider.saved": "Gespeichert am {{day}}. {{month}} {{year}}",
"timeslider.playPause": "Padbearbeitung abspielen/pausieren",
"timeslider.backRevision": "Eine Version in diesem Pad zurück gehen",
"timeslider.forwardRevision": "Eine Version in diesem Pad vorwärts gehen",
"timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}",
@ -114,7 +115,7 @@
"timeslider.month.december": "Dezember",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: unbenannter Autor, other: unbenannte Autoren ]}",
"pad.savedrevs.marked": "Diese Version wurde jetzt als gespeicherte Version gekennzeichnet",
"pad.savedrevs.timeslider": "Du kannst gespeicherte Versionen durch das Besuchen der Pad-Versionsgeschichte ansehen",
"pad.savedrevs.timeslider": "Du kannst gespeicherte Versionen durch den Aufruf des Bearbeitungsverlaufes ansehen",
"pad.userlist.entername": "Geben Sie Ihren Namen ein",
"pad.userlist.unnamed": "unbenannt",
"pad.userlist.guest": "Gast",
@ -124,9 +125,9 @@
"pad.impexp.importbutton": "Jetzt importieren",
"pad.impexp.importing": "Importiere …",
"pad.impexp.confirmimport": "Das Importieren einer Datei überschreibt den aktuellen Text des Pads. Wollen Sie wirklich fortfahren?",
"pad.impexp.convertFailed": "Wir können diese Datei nicht importieren. Bitte verwenden Sie ein anderes Dokumentformat oder übertragen Sie den Text manuell.",
"pad.impexp.padHasData": "Wir konnten diese Datei nicht importieren, da dieses Pad bereits Änderungen enthält. Bitte importiere sie in ein neues Pad.",
"pad.impexp.uploadFailed": "Der Upload ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"pad.impexp.convertFailed": "Diese Datei konnte nicht importiert werden. Bitte verwenden Sie ein anderes Dokumentformat oder übertragen Sie den Text manuell.",
"pad.impexp.padHasData": "Diese Datei konnte nicht importiert werden, da dieses Pad bereits Änderungen enthält. Bitte importieren Sie die Datei in ein neues Pad.",
"pad.impexp.uploadFailed": "Das Hochladen ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
"pad.impexp.importfailed": "Import fehlgeschlagen",
"pad.impexp.copypaste": "Bitte kopieren und einfügen",
"pad.impexp.exportdisabled": "Der Export im {{type}}-Format ist deaktiviert. Für Einzelheiten kontaktieren Sie bitte Ihren Systemadministrator."

View File

@ -50,5 +50,15 @@
"pad.importExport.exportpdf": "पिडिएफ",
"pad.importExport.exportopen": "ओडिएफ(खुल्ला कागजात ढाँचा)",
"pad.modals.connected": "जोडीयाको",
"pad.modals.reconnecting": "तमरो प्याडमि आजि: जडान हुन्नाछ"
"pad.modals.reconnecting": "तमरो प्याडमि आजि: जडान हुन्नाछ",
"pad.modals.initsocketfail": "सर्भरमा पहुँच पुर्‍याउन नाइसकियो ।",
"pad.modals.deleted": "मेटियाको",
"pad.modals.deleted.explanation": "यो प्याड हटाइसक्याको छ ।",
"pad.modals.disconnected": "तमरो जडान अवरुद्ध भयो ।",
"pad.modals.disconnected.explanation": "तमरो सर्भरसितको जडान अवरुद्ध भयो",
"pad.share": "यस प्यडलाई बाड्न्या",
"pad.share.readonly": "पड्या मात्तरै",
"pad.share.link": "लिङ्क",
"pad.share.emebdcode": "URL थप्प्या",
"pad.chat": "कुरणिकानी"
}

View File

@ -96,6 +96,9 @@
"timeslider.exportCurrent": "Εξαγωγή τρέχουσας έκδοσης ως:",
"timeslider.version": "Έκδοση {{version}}",
"timeslider.saved": "Αποθηκεύτηκε στις {{day}} {{month}} {{year}}",
"timeslider.playPause": "Αναπαραγωγή / Παύση των περιεχομένων αυτού του Pad",
"timeslider.backRevision": "Επιστροφή σε μια έκδοση αυτού του Pad",
"timeslider.forwardRevision": "Μια έκδοση μπροστά αυτού του Pad",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Ιανουαρίου",
"timeslider.month.february": "Φεβρουαρίου",

View File

@ -94,6 +94,9 @@
"timeslider.exportCurrent": "Elporti la nunan version kiel:",
"timeslider.version": "Versio {{version}}",
"timeslider.saved": "Konservita la {{day}}an de {{month}}, {{year}}",
"timeslider.playPause": "Ludi / paŭzi la enhavojn de la teksto",
"timeslider.backRevision": "Reiri unu version en ĉi tiu teksto",
"timeslider.forwardRevision": "Antaŭeniri unu version en ĉi tiu teksto",
"timeslider.dateformat": "{{day}}-{{month}}-{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "januaro",
"timeslider.month.february": "februaro",

View File

@ -75,7 +75,7 @@
"pad.modals.looping.cause": "Puede deberse a que te conectes a través de un proxy o un cortafuegos incompatible.",
"pad.modals.initsocketfail": "Servidor incalcanzable.",
"pad.modals.initsocketfail.explanation": "No se pudo conectar al servidor de sincronización.",
"pad.modals.initsocketfail.cause": "Probablemente debido a un problema en tu navegador o en tu conexión a internet.",
"pad.modals.initsocketfail.cause": "Probablemente debido a un problema en tu navegador o en tu conexión a Internet.",
"pad.modals.slowcommit.explanation": "El servidor no responde.",
"pad.modals.slowcommit.cause": "Puede deberse a problemas con tu conexión de red.",
"pad.modals.badChangeset.explanation": "Has hecho una edición clasificada como ilegal por el servidor de sincronización.",
@ -132,7 +132,7 @@
"pad.impexp.confirmimport": "Al importar un archivo se borrará el contenido actual del pad. ¿Estás seguro de que quieres continuar?",
"pad.impexp.convertFailed": "No pudimos importar este archivo. Inténtalo con un formato diferente o copia y pega manualmente.",
"pad.impexp.padHasData": "No hemos podido importar este archivo porque este pad ya ha tenido cambios. Importa a un nuevo pad.",
"pad.impexp.uploadFailed": "El envío falló. Intentalo de nuevo.",
"pad.impexp.uploadFailed": "El envío falló. Inténtalo de nuevo.",
"pad.impexp.importfailed": "Fallo al importar",
"pad.impexp.copypaste": "Intenta copiar y pegar",
"pad.impexp.exportdisabled": "La exportación al formato {{type}} está desactivada. Contacta a tu administrador de sistemas."

View File

@ -29,12 +29,14 @@
"pad.colorpicker.save": "Gorde",
"pad.colorpicker.cancel": "Utzi",
"pad.loading": "Kargatzen...",
"pad.noCookie": "Cookiea ez da aurkitu. Mesedez, gaitu cookieak zure nabigatzailean!",
"pad.passwordRequired": "Pasahitza behar duzu pad honetara sartzeko",
"pad.permissionDenied": "Ez duzu bamienik pad honetara sartzeko",
"pad.wrongPassword": "Zure pasahitza oker zegoen",
"pad.settings.padSettings": "Pad hobespenak",
"pad.settings.myView": "Nire ikusmoldea",
"pad.settings.stickychat": "Txata beti pantailan",
"pad.settings.chatandusers": "Erakutsi txata eta erabiltzaileak",
"pad.settings.colorcheck": "Egiletzaren koloreak",
"pad.settings.linenocheck": "Lerro zenbakiak",
"pad.settings.rtlcheck": "Edukia eskubitik ezkerrera irakurri?",
@ -69,11 +71,12 @@
"pad.modals.initsocketfail.cause": "Ziurrenik hau zure nabigatzailea edo internet konexioaren arazo bat dela eta izango da.",
"pad.modals.slowcommit.explanation": "Zerbitzariak ez du erantzuten.",
"pad.modals.slowcommit.cause": "Baliteke hau sarearen konexio arazoak direla eta izatea.",
"pad.modals.badChangeset.explanation": "Sinkronizazio zerbitzariak, zuk egindako aldaketa bat legez kanpokotzat jo du.",
"pad.modals.deleted": "Ezabatua.",
"pad.modals.deleted.explanation": "Pad hau ezabatua izan da.",
"pad.modals.disconnected": "Deskonektatua izan zara.",
"pad.modals.disconnected.explanation": "Zerbitzariaren konexioa galdu da",
"pad.modals.disconnected.cause": "Baliteke zerbitzaria irisgarria ez izatea. Mesedez, esaiguzu hau gertatzen jarraitzen badu.",
"pad.modals.disconnected.cause": "Baliteke zerbitzaria eskuragarri ez egotea. Mesedez, jakinarazi zerbitzuko administrariari honek gertatzen jarraitzen badu.",
"pad.share": "Pad hau partekatu",
"pad.share.readonly": "Irakurtzeko bakarrik",
"pad.share.link": "Lotura",
@ -102,7 +105,7 @@
"timeslider.month.october": "Urria",
"timeslider.month.november": "Azaroa",
"timeslider.month.december": "Abendua",
"timeslider.unnamedauthors": "{{num}} izenik gabeko egileak",
"timeslider.unnamedauthors": "{{num}} izenik gabeko {[plural(num) one: egilea, other: egileak]}",
"pad.savedrevs.marked": "Berrikuspen hau markatua dago gordetako berrikuspen gisa",
"pad.userlist.entername": "Sartu zure erabiltzaile izena",
"pad.userlist.unnamed": "izenik gabe",

View File

@ -19,21 +19,23 @@
"Maxim21",
"Boniface",
"Macofe",
"Framafan"
"Framafan",
"Fylip22",
"C13m3n7"
]
},
"index.newPad": "Nouveau pad",
"index.createOpenPad": "ou créer/ouvrir un pad intitulé :",
"pad.toolbar.bold.title": "Gras (Ctrl-B)",
"pad.toolbar.italic.title": "Italique (Ctrl-I)",
"pad.toolbar.underline.title": "Souligné (Ctrl-U)",
"pad.toolbar.bold.title": "Gras (Ctrl+B)",
"pad.toolbar.italic.title": "Italique (Ctrl+I)",
"pad.toolbar.underline.title": "Souligné (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Barré (Ctrl+5)",
"pad.toolbar.ol.title": "Liste ordonnée (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Liste non ordonnée (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Indenter (TAB)",
"pad.toolbar.unindent.title": "Désindenter (Maj+TAB)",
"pad.toolbar.undo.title": "Annuler (Ctrl-Z)",
"pad.toolbar.redo.title": "Rétablir (Ctrl-Y)",
"pad.toolbar.undo.title": "Annuler (Ctrl+Z)",
"pad.toolbar.redo.title": "Rétablir (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Effacer les couleurs identifiant les auteurs (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importer/Exporter de/vers un format de fichier différent",
"pad.toolbar.timeslider.title": "Historique dynamique",
@ -50,7 +52,7 @@
"pad.wrongPassword": "Votre mot de passe est incorrect",
"pad.settings.padSettings": "Paramètres du pad",
"pad.settings.myView": "Ma vue",
"pad.settings.stickychat": "Toujours afficher le chat",
"pad.settings.stickychat": "Toujours afficher le tchat",
"pad.settings.chatandusers": "Afficher la discussion et les utilisateurs",
"pad.settings.colorcheck": "Couleurs didentification",
"pad.settings.linenocheck": "Numéros de lignes",
@ -70,17 +72,17 @@
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalités d'importation plus évoluées, veuillez <a 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\">installer Abiword</a>.",
"pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou HTML. Pour des fonctionnalités d'importation plus évoluées, veuillez <a 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\">installer Abiword</a>.",
"pad.modals.connected": "Connecté.",
"pad.modals.reconnecting": "Reconnexion vers votre pad...",
"pad.modals.forcereconnect": "Forcer la reconnexion",
"pad.modals.userdup": "Ouvert dans une autre fenêtre",
"pad.modals.userdup.explanation": "Ce pad semble être ouvert dans plusieurs fenêtres de navigateur sur cet ordinateur.",
"pad.modals.userdup.explanation": "Ce pad semble être ouvert dans plusieurs fenêtres sur cet ordinateur.",
"pad.modals.userdup.advice": "Se reconnecter en utilisant cette fenêtre.",
"pad.modals.unauth": "Non autorisé",
"pad.modals.unauth.explanation": "Vos permissions ont été changées lors de l'affichage de cette page. Essayez de vous reconnecter.",
"pad.modals.looping.explanation": "Nous éprouvons un problème de communication au serveur de synchronisation.",
"pad.modals.looping.cause": "Il est possible que votre connexion soit protégée par un pare-feu ou un serveur mandataire incompatible.",
"pad.modals.looping.cause": "Il est possible que vous soyez connecté avec un pare-feu ou un 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": "Ceci est probablement dû à un problème avec votre navigateur ou votre connexion internet.",

56
src/locales/gu.json Normal file
View File

@ -0,0 +1,56 @@
{
"@metadata": {
"authors": [
"Bhatakati aatma",
"Harsh4101991",
"KartikMistry"
]
},
"index.newPad": "નવું પેડ",
"pad.toolbar.bold.title": "બોલ્ડ",
"pad.toolbar.settings.title": "ગોઠવણીઓ",
"pad.colorpicker.save": "સાચવો",
"pad.colorpicker.cancel": "રદ્દ કરો",
"pad.loading": "લાવે છે...",
"pad.noCookie": "કુકી મળી નહી. આપના બ્રાઉઝર સેટિંગમાં જઇ કુકી સક્રિય કરો!",
"pad.passwordRequired": "તમારે આ પેડના ઉપયોગ માટે ગુપ્તસંજ્ઞાની જરુર પડશે",
"pad.permissionDenied": "આ પેડના ઉપયોગની આપને પરવાનગી નથી",
"pad.wrongPassword": "આપની ગુપ્તસંજ્ઞા ખોટી છે",
"pad.settings.padSettings": "પેડ ગોઠવણીઓ",
"pad.settings.myView": "મારા મતે",
"pad.settings.fontType.normal": "સામાન્ય",
"pad.settings.fontType.monospaced": "મોનોસ્પેસ",
"pad.settings.language": "ભાષા:",
"pad.importExport.import_export": "આયાત/નિકાસ",
"pad.importExport.importSuccessful": "સફળ!",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "સાદું લખાણ",
"pad.importExport.exportword": "માઇક્રોસોફ્ટ વર્ડ",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (ઓપન ડોક્યુમેન્ટ ફોરમેટ)",
"pad.importExport.abiword.innerHTML": "આપ માત્ર સાદુ લખાણ અથવા HTML આયાત કરી શકો છો. વધુ અધ્યતન આયાત સુવિધા માટે <a 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\">abiword ઇન્સ્ટોલ કરો</a>.",
"pad.modals.connected": "જોડાયેલું",
"pad.chat": "વાતચીત",
"pad.chat.title": "આ પેડ માટે વાતચીત ખોલો.",
"pad.chat.loadmessages": "વધુ સંદેશાઓ લાવો",
"timeslider.toolbar.authors": "લેખકો:",
"timeslider.month.january": "જાન્યુઆરી",
"timeslider.month.february": "ફેબ્રુઆરી",
"timeslider.month.march": "માર્ચ",
"timeslider.month.april": "એપ્રિલ",
"timeslider.month.may": "મે",
"timeslider.month.june": "જૂન",
"timeslider.month.july": "જુલાઇ",
"timeslider.month.august": "ઓગસ્ટ",
"timeslider.month.september": "સપ્ટેમ્બર",
"timeslider.month.october": "ઓક્ટોબર",
"timeslider.month.november": "નવેમ્બર",
"timeslider.month.december": "ડિસેમ્બર",
"pad.userlist.entername": "તમારું નામ દાખલ કરો",
"pad.userlist.unnamed": "અનામી",
"pad.userlist.guest": "મહેમાન",
"pad.userlist.deny": "નકારો",
"pad.userlist.approve": "મંજૂર",
"pad.impexp.importbutton": "આયાત કરો",
"pad.impexp.importing": "આયાત કરે છે..."
}

View File

@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
"Sveinn í Felli"
"Sveinn í Felli",
"Sveinki"
]
},
"index.newPad": "Ný skrifblokk",
@ -92,6 +93,9 @@
"timeslider.exportCurrent": "Flytja út núverandi útgáfu sem:",
"timeslider.version": "Útgáfa {{version}}",
"timeslider.saved": "Vistað {{day}}. {{month}}, {{year}}",
"timeslider.playPause": "Afspilun / Hlé á efni skrifblokkar",
"timeslider.backRevision": "Fara til baka um eina útgáfu í þessari skrifblokk",
"timeslider.forwardRevision": "Fara áfram um eina útgáfu í þessari skrifblokk",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Janúar",
"timeslider.month.february": "febrúar",

View File

@ -53,7 +53,7 @@
"pad.importExport.export": "Esportare il Pad corrente come:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Solo testo",
"pad.importExport.exportplain": "Testo normale",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
@ -93,10 +93,13 @@
"timeslider.toolbar.returnbutton": "Ritorna al Pad",
"timeslider.toolbar.authors": "Autori:",
"timeslider.toolbar.authorsList": "Nessun autore",
"timeslider.toolbar.exportlink.title": "esporta",
"timeslider.toolbar.exportlink.title": "Esporta",
"timeslider.exportCurrent": "Esporta la versione corrente come:",
"timeslider.version": "Versione {{version}}",
"timeslider.saved": "Salvato {{day}} {{month}} {{year}}",
"timeslider.playPause": "Riproduzione / Pausa contenuti Pad",
"timeslider.backRevision": "Vai indietro di una versione in questo Pad",
"timeslider.forwardRevision": "Vai avanti di una versione in questo Pad",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "gennaio",
"timeslider.month.february": "febbraio",

View File

@ -3,21 +3,23 @@
"authors": [
"Hym411",
"아라",
"Revi"
"Revi",
"Kurousagi",
"SeoJeongHo"
]
},
"index.newPad": "새 패드",
"index.createOpenPad": "또는 다음 이름으로 패드 만들기/열기:",
"pad.toolbar.bold.title": "굵게 (Ctrl-B)",
"pad.toolbar.italic.title": "기울임 (Ctrl-I)",
"pad.toolbar.underline.title": "밑줄 (Ctrl-U)",
"pad.toolbar.bold.title": "굵은꼴 (Ctrl+B)",
"pad.toolbar.italic.title": "기울임꼴 (Ctrl+I)",
"pad.toolbar.underline.title": "밑줄 (Ctrl+U)",
"pad.toolbar.strikethrough.title": "취소선 (Ctrl+5)",
"pad.toolbar.ol.title": "순서 있는 목록 (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "순서 없는 목록 (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "들여쓰기 (TAB)",
"pad.toolbar.unindent.title": "내어쓰기 (Shift+TAB)",
"pad.toolbar.undo.title": "실행 취소 (Ctrl-Z)",
"pad.toolbar.redo.title": "다시 실행 (Ctrl-Y)",
"pad.toolbar.undo.title": "실행 취소 (Ctrl+Z)",
"pad.toolbar.redo.title": "다시 실행 (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "저자의 색 지우기 (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "다른 파일 형식으로 가져오기/내보내기",
"pad.toolbar.timeslider.title": "시간슬라이더",
@ -48,6 +50,7 @@
"pad.importExport.import": "텍스트 파일이나 문서 올리기",
"pad.importExport.importSuccessful": "성공!",
"pad.importExport.export": "다음으로 현재 패드 내보내기:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "일반 텍스트",
"pad.importExport.exportword": "Microsoft Word",
@ -93,6 +96,9 @@
"timeslider.exportCurrent": "현재 버전으로 내보내기:",
"timeslider.version": "버전 {{version}}",
"timeslider.saved": "{{year}}년 {{month}} {{day}}일에 저장함",
"timeslider.playPause": "시작 / 패드 내용을 일시 중지",
"timeslider.backRevision": "패드의 수정판으로 다시 가기",
"timeslider.forwardRevision": "패드의 수정판을 앞으로 이동 시키기",
"timeslider.dateformat": "{{year}}년/{{month}}/{{day}}일 {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "1월",
"timeslider.month.february": "2월",
@ -108,6 +114,7 @@
"timeslider.month.december": "12월",
"timeslider.unnamedauthors": "이름 없는 {[plural(num) one: 저자, other: 저자 ]} {{num}}명",
"pad.savedrevs.marked": "이 판은 이제 저장한 판으로 표시합니다.",
"pad.savedrevs.timeslider": "당신은 타임슬라이더를 통해 저장된 버전을 볼 수 있습니다",
"pad.userlist.entername": "이름을 입력하세요",
"pad.userlist.unnamed": "이름없음",
"pad.userlist.guest": "손님",
@ -118,6 +125,7 @@
"pad.impexp.importing": "가져오는 중...",
"pad.impexp.confirmimport": "파일을 가져오면 패드의 현재 텍스트를 덮어쓰게 됩니다. 진행하시겠습니까?",
"pad.impexp.convertFailed": "이 파일을 가져올 수 없습니다. 다른 문서 형식을 사용하거나 수동으로 복사하여 붙여넣으세요",
"pad.impexp.padHasData": "우리는 이 파일을 가져올수 없었습니다. 이 패드는 이미 수정되었으니, 새 패드를 가져와 주십시오",
"pad.impexp.uploadFailed": "올리기를 실패했습니다. 다시 시도하세요",
"pad.impexp.importfailed": "가져오기를 실패했습니다",
"pad.impexp.copypaste": "복사하여 붙여넣으세요",

View File

@ -14,7 +14,7 @@
"pad.toolbar.ul.title": "Leß met Pongkte (Strg+Jruhß+L)",
"pad.toolbar.indent.title": "Enjerök (TAB)",
"pad.toolbar.unindent.title": "Ußjerök (Jruhßschreff+TAB)",
"pad.toolbar.undo.title": "Retuur nämme (Strg-Z)",
"pad.toolbar.undo.title": "Retuhr nämme (Strg+Z)",
"pad.toolbar.redo.title": "Norrens (Strg-Y)",
"pad.toolbar.clearAuthorship.title": "Donn dä Schriiver ier Färve fottnämme (Strg+Jruhß+C)",
"pad.toolbar.import_export.title": "Ongerscheidlijje Dattei_Fommaate empotteere udder äxpotteere",
@ -24,7 +24,7 @@
"pad.toolbar.embed.title": "Donn dat Pädd öffentlesch maache un enbenge",
"pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije",
"pad.colorpicker.save": "Faßhallde",
"pad.colorpicker.cancel": "Ophüüre",
"pad.colorpicker.cancel": "Ophüre",
"pad.loading": "Ben aam Lahde&nbsp;…",
"pad.noCookie": "Dat Pläzje wood nit jevonge. Don dat en Dingem Brauser zohlohße!",
"pad.passwordRequired": "Do bruchs e Paßwoot för heh dat Pädd.",
@ -76,7 +76,7 @@
"pad.modals.deleted.explanation": "Dat Pädd es fottjeschmeße woode.",
"pad.modals.disconnected": "Do bes nit mih verbonge.",
"pad.modals.disconnected.explanation": "De Verbendong mem ẞööver es fott.",
"pad.modals.disconnected.cause": "Dä ẞööver künnt nit mieh loufe.\nSidd_esu jood und saad ons Bescheid, wann dadd esu bliiv.",
"pad.modals.disconnected.cause": "Dä ẞööver künnt nit mih loufe.\nSidd_esu jood und saad ons Bescheid, wann dadd esu bliiv.",
"pad.share": "Maach heh dat Pädd öffentlesch",
"pad.share.readonly": "Nor för ze Lässe",
"pad.share.link": "Lengk",
@ -85,7 +85,7 @@
"pad.chat.title": "Maach dä Klaaf för heh dat Pädd op",
"pad.chat.loadmessages": "Mih Nohreeschte lahde&nbsp;…",
"timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle",
"timeslider.toolbar.returnbutton": "Jangk retuur nohm Pädd",
"timeslider.toolbar.returnbutton": "Jangk retuhr nohm Pädd",
"timeslider.toolbar.authors": "De Schrihver:",
"timeslider.toolbar.authorsList": "Kein Schriivere",
"timeslider.toolbar.exportlink.title": "Äxpotteere",

View File

@ -4,7 +4,8 @@
"Bikarhêner",
"Dilyaramude",
"George Animal",
"Gomada"
"Gomada",
"Mehk63"
]
},
"index.newPad": "Bloknota nû",
@ -67,7 +68,7 @@
"timeslider.month.august": "gelawêj",
"timeslider.month.september": "rezber",
"timeslider.month.october": "kewçêr",
"timeslider.month.november": "sermawez",
"timeslider.month.november": "Mijdar",
"timeslider.month.december": "berfanbar",
"pad.userlist.entername": "Navê xwe têkeve",
"pad.userlist.unnamed": "nenavkirî",

View File

@ -1,57 +1,103 @@
{
"@metadata": {
"authors": [
"Hosseinblue"
"Hosseinblue",
"Arash71",
"Lakzon"
]
},
"index.newPad": ازۀpad",
"index.createOpenPad": ":ئۀ وسیلۀ نؤمpadسازین/وآز کردن یه گلۀ",
"index.createOpenPad": ":وە نۆم Pad یا سازین/واز کردن یإگلە",
"pad.toolbar.bold.title": "پررنگ-تئژ(Ctrl-B)",
"pad.toolbar.italic.title": "ایتالیک (Ctrl-I)",
"pad.toolbar.underline.title": "ژئر خطی(Ctrl-U)",
"pad.toolbar.strikethrough.title": "خط هوواردئ",
"pad.toolbar.ol.title": "فئرست رزگی-مرتب",
"pad.toolbar.ul.title": "نۀچنریا-نامرتب",
"pad.toolbar.indent.title": "تورفتگی-ئه نؤم چئن (TAB)",
"pad.toolbar.strikethrough.title": "(Ctrl+5)خط هوواردێ",
"pad.toolbar.ol.title": " (Ctrl+5)لیست مرتب بی",
"pad.toolbar.ul.title": "(Ctrl+5)لیست شؤیا/نامرتب",
"pad.toolbar.indent.title": "تورفتگی(إنۆم چێن)(TAB)",
"pad.toolbar.unindent.title": "(Shift+TAB)بیرون آمدگی-درچئن",
"pad.toolbar.undo.title": "گِلّا دائن-ئآهۀتن(Ctrl-Z)",
"pad.toolbar.redo.title": "ئۀ نوواهۀتن (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "پاکاکردن رنگۀل تالیفی",
"pad.toolbar.import_export.title": ربردن/ئه نؤم ئآووردن ئۀ/ئِِژ فرمتۀل گوناگون",
"pad.toolbar.redo.title": "وە نووآ هەتن (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "(Ctrl+Shift+C)پاک‌کردن رنگةل نویسندگی",
"pad.toolbar.import_export.title": ەربردن/إنۆم آووِردن إژ/وە قاڵبەل گوناگون",
"pad.toolbar.timeslider.title": "اسلایدر وختی-زمانی",
"pad.toolbar.savedRevision.title": "ذخیرل دسکاریۀل",
"pad.toolbar.savedRevision.title": "نسخە بِیل(ذخیره کە)",
"pad.toolbar.settings.title": "تنظیمۀل",
"pad.toolbar.embed.title": ۀشاکردن ؤ نیائن(اشتراک ونشاندن)ئۀ نؤم سایت",
"pad.toolbar.showusers.title": "نیشان دائن کاربر ئۀ نؤم ئئ\npad",
"pad.colorpicker.save": "ذخیرۀ",
"pad.colorpicker.cancel": "ئآهووسانن-لغو",
"pad.toolbar.embed.title": ەشآکردن ؤ نیائن(اشتراک ونشاندن)وە نۆم سایت",
"pad.toolbar.showusers.title": "نیشان دائن کاربەر أنۆم اێ\nیادداشتە",
"pad.colorpicker.save": "هیشتن(ذخیره)",
"pad.colorpicker.cancel": "ئآهووسانن/لغو",
"pad.loading": "...(loading)بارنیائن",
"pad.noCookie": "کوکی یافت نشد. لطفاً اجازهٔ اجرای کوکی در مروگرتان را بدهید!",
"pad.passwordRequired": "هؤمۀ رمزتؤنه گرۀکۀ-لازمۀ ئۀرا اتصال ئئ \npad",
"pad.permissionDenied": "شما اجازه‌ی دسترسی به این دفترچه یادداشت را ندارید",
"pad.wrongPassword": "رمزۀ تؤن دؤرس نیۀ",
"pad.settings.padSettings": "pad تنظیمۀل",
"pad.settings.myView": "نمایش-سئرکردن مه",
"pad.settings.stickychat": "چت همؤیشۀ ئۀ ولگۀ نمایش بوو",
"pad.settings.stickychat": "گەپ(قسە)هەمۆیشە وە وەڵگە نمایش بوو",
"pad.settings.chatandusers": "نمایش چت و کاربران",
"pad.settings.colorcheck": "رنگۀل تالیفی",
"pad.settings.linenocheck": "شؤمارۀل خطی",
"pad.settings.rtlcheck": "خواندن نۆم جِک(محتوا)أژ لآ ڕاس بە چەپ؟",
"pad.settings.fontType": ":شئؤۀ فؤنت",
"pad.settings.fontType.normal": "عادی",
"pad.settings.fontType.monospaced": "پئنی-پهنا",
"pad.settings.globalView": "نمایش جئ هانی",
"pad.settings.globalView": "نمایش جەهانی",
"pad.settings.language": ":زوون",
"pad.importExport.import_export": ر بردن/ئه نؤم ئآووردن",
"pad.importExport.import_export": ەر بردن/إنۆم آووِردن",
"pad.importExport.import": "بارنیائن هر جور نوشته یا سندئ",
"pad.importExport.importSuccessful": "! موفق بی-پیرووز بی",
"pad.importExport.export": ":برون‌ریزی این دفترچه یادداشت با قالب",
"pad.importExport.exportetherpad": "اترپد",
"pad.importExport.exporthtml": "html",
"pad.importExport.exportplain": "متن پئن-درئژ",
"pad.importExport.exportword": "مایکروسافت وورد",
"pad.importExport.exportpdf": "پی دی اف",
"pad.importExport.exportopen": " (قالب سند باز)ODF",
"pad.importExport.abiword.innerHTML": "شما تنها می‌توانید از قالب متن ساده یا اچ‌تی‌ام‌ال درون‌ریزی کنید. برای بیشتر شدن ویژگی‌های درون‌ریزی پیشرفته <a 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\">AbiWord</a> را نصب کنید.",
"pad.modals.connected": "وصل بیۀ",
"pad.modals.reconnecting": "..در حال اتصال دوباره به دفترچه یادداشت شما",
"pad.modals.forcereconnect": "واداشتن به اتصال دوباره",
"pad.modals.userdup": "ئة پنجرإ تر واز بو",
"pad.modals.userdup.explanation": "گمان می‌رود این دفترچه یادداشت در بیش از یک پنجره‌ی مرورگر باز شده‌است.",
"pad.modals.userdup.advice": "برای استفاده از این پنجره دوباره وصل شوید.",
"pad.modals.unauth": "مجاز نیة",
"pad.modals.unauth.explanation": "دسترسی شما در حین مشاهده‌ی این برگه تغییر یافته‌است. دوباره متصل شوید.",
"pad.modals.looping.explanation": "مشکلاتی ارتباطی با سرور همگام‌سازی وجود دارد.",
"pad.modals.looping.cause": "شاید شما از طریق یک فایروال یا پروکسی ناسازگار متصل شده‌اید.",
"pad.modals.initsocketfail": "سرور در دسترس نیست.",
"pad.modals.initsocketfail.explanation": ".نمی‌توان به سرور همگام سازی وصل شد",
"pad.modals.initsocketfail.cause": ".شاید این به خاطر مشکلی در مرورگر یا اتصال اینترنتی شما باشد",
"pad.modals.slowcommit.explanation": ".سرور پاسخ نمی‌دهد",
"pad.modals.slowcommit.cause": ".این می‌تواند به خاطر مشکلاتی در اتصال به شبکه باشد",
"pad.modals.badChangeset.explanation": "ویرایشی که شما انجام داده‌اید توسط سرور همگام‌سازی نادرست طیقه‌بندی شده است.",
"pad.modals.badChangeset.cause": "این می‌تواند به دلیل پیکربندی اشتباه یا سایر رفتارهای غیرمنتظره باشد. اگر فکر می‌کنید این یک خطا است لطفاً با مدیر خدمت تماس بگیرید. برای ادامهٔ ویرایش سعی کنید که دوباره متصل شوید.",
"pad.modals.corruptPad.explanation": ".پدی که شما سعی دارید دسترسی پیدا کنید خراب است",
"pad.modals.corruptPad.cause": "این احتمالاً به دلیل تنظیمات اشتباه کارساز یا سایر رفتارهای غیرمنتظره است. لطفاً با مدیر خدمت تماس حاصل کنید.",
"pad.modals.deleted": "پاک بیا-حذف بی",
"pad.share.readonly": "تنیا بخؤۀن",
"pad.modals.deleted.explanation": "این دفترچه یادداشت پاک شده‌است.",
"pad.modals.disconnected": "اتصال شما قطع شده‌است.",
"pad.modals.disconnected.explanation": ".اتصال وة سرور قطع بیة",
"pad.modals.disconnected.cause": "ممکن است سرور در دسترس نباشد. اگر این مشکل باز هم رخ داد مدیر حدمت را .آگاه کنید",
"pad.share": "به اشتراک‌گذاری این دفترچه یادداشت",
"pad.share.readonly": "تەنیا(فقط)خووەنن",
"pad.share.link": "لینک",
"pad.share.emebdcode": "جاسازی نشانی",
"pad.chat": "گپ",
"pad.chat.title": "بازکردن گفتگو برای این دفترچه یادداشت",
"pad.chat.loadmessages": "پئامۀلئ تر باره سۀر",
"timeslider.pageTitle": "لغزندهٔ زمان {{appTitle}}",
"timeslider.toolbar.returnbutton": "بازگشت به دفترچه یادداشت",
"timeslider.toolbar.authors": "نویسندگان:",
"timeslider.toolbar.authorsList": "بدون نویسنده",
"timeslider.toolbar.exportlink.title": "در بِردن",
"timeslider.exportCurrent": "برون‌ریزی نگارش کنونی به عنوان:",
"timeslider.version": "نگارش {{version}}",
"timeslider.saved": "{{month}} {{day}}، {{year}} ذخیره شد",
"timeslider.playPause": "اجرای مجدد/متوقف کردن پخش",
"timeslider.backRevision": "رفتن به نسخهٔ پیشین در این دفترچه",
"timeslider.forwardRevision": "رفتن به نسخهٔ بعدی در این دفترچه",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "دی)نورووژ)",
"timeslider.month.february": "(خاکه لێه(بهمن",
"timeslider.month.march": "(مانگ ئێد(اسفندگان",
@ -64,12 +110,22 @@
"timeslider.month.october": "(ماڵه ژێر دوماێنه(مهر",
"timeslider.month.november": "آبان)تویل ته کن)",
"timeslider.month.december": "(مانگه سێه(آذر",
"pad.userlist.entername": "نؤم تؤن وارد کۀن",
"pad.userlist.unnamed": "بئ نؤم",
"timeslider.unnamedauthors": " نویسندة بی‌ نام{{num}}",
"pad.savedrevs.marked": "این بازنویسی هم اکنون به عنوان ذخیره شده علامت‌گذاری شد",
"pad.savedrevs.timeslider": "شما می‌توانید نسخه‌های ذخیره شده را با دیدن نوار زمان ببنید",
"pad.userlist.entername": "نۆم ووژت وارد کە",
"pad.userlist.unnamed": "بێ نۆم",
"pad.userlist.guest": "مئمان",
"pad.userlist.deny": "رد کردن",
"pad.userlist.approve": "راووا داشتن-تصویب کردن",
"pad.impexp.importbutton": "ایسۀ وارد کۀ",
"pad.editbar.clearcolors": "رنگ نویسندگی از همه‌ی سند پاک شود؟",
"pad.impexp.importbutton": "ایسگە وارد کە",
"pad.impexp.importing": "...وارد مۀهه",
"pad.impexp.importfailed": "وارد نؤنئ-خطای واردکردن"
"pad.impexp.confirmimport": "با درون‌ریزی یک پرونده نوشتهٔ کنونی دفترچه پاک می‌شود. آیا می‌خواهید ادامه دهید؟",
"pad.impexp.convertFailed": "ما نمی‌توانیم این پرونده را درون‌ریزی کنیم. خواهشمندیم قالب دیگری برای سندتان انتخاب کرده یا بصورت دستی آنرا کپی کنید",
"pad.impexp.padHasData": "امکان درون‌ریز این پرونده نیست زیرا این پد تغییر کرده‌است. لطفاً در پد جدید درون‌ریزی کنید.",
"pad.impexp.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید",
"pad.impexp.importfailed": "وارد نؤنئ-خطای واردکردن",
"pad.impexp.copypaste": "کپی پیست کنید",
"pad.impexp.exportdisabled": "برون‌ریزی با قالب {{type}} از کار افتاده است. برای جزئیات بیشتر با مدیر سیستمتان تماس بگیرید."
}

View File

@ -3,7 +3,8 @@
"authors": [
"Admresdeserv.",
"Jmg.cmdi",
"Papuass"
"Papuass",
"Silraks"
]
},
"pad.toolbar.bold.title": "Treknrakstā (CTRL + B)",
@ -60,6 +61,7 @@
"pad.share": "Koplietot šo pad",
"pad.share.readonly": "Tikai lasāms",
"pad.share.link": "Saite",
"pad.chat": "Čats",
"timeslider.toolbar.authors": "Autori:",
"timeslider.toolbar.authorsList": "Nav autoru",
"timeslider.toolbar.exportlink.title": "Eksportēt",
@ -80,5 +82,6 @@
"pad.userlist.guest": "Viesis",
"pad.impexp.importbutton": "Importēt tūlīt",
"pad.impexp.importing": "Importē...",
"pad.impexp.uploadFailed": "Augšupielāde neizdevās, lūdzu, mēģiniet vēlreiz",
"pad.impexp.importfailed": "Imports neizdevās"
}

View File

@ -5,7 +5,8 @@
"Clockery",
"Hrishikesh.kb",
"Praveenp",
"Santhosh.thottingal"
"Santhosh.thottingal",
"Nesi"
]
},
"index.newPad": "പുതിയ പാഡ്",
@ -30,12 +31,14 @@
"pad.colorpicker.save": "സേവ് ചെയ്യുക",
"pad.colorpicker.cancel": "റദ്ദാക്കുക",
"pad.loading": "ശേഖരിക്കുന്നു...",
"pad.noCookie": "കുക്കി കണ്ടെത്താനായില്ല. ദയവായി താങ്കളുടെ ബ്രൗസറിൽ കുക്കികൾ അനുവദിക്കുക!",
"pad.passwordRequired": "ഈ പാഡ് ഉപയോഗിക്കുന്നതിനായി ഒരു രഹസ്യവാക്ക് നൽകേണ്ടതാണ്",
"pad.permissionDenied": "ഈ പാഡ് കാണുവാൻ താങ്കൾക്ക് അനുമതിയില്ല",
"pad.wrongPassword": "താങ്കൾ നല്കിയ രഹസ്യവാക്ക് തെറ്റായിരുന്നു",
"pad.settings.padSettings": "പാഡ് സജ്ജീകരണങ്ങൾ",
"pad.settings.myView": "എന്റെ കാഴ്ച",
"pad.settings.stickychat": "തത്സമയസംവാദം എപ്പോഴും സ്ക്രീനിൽ കാണിക്കുക",
"pad.settings.chatandusers": "ഉപയോക്താക്കളേയും ചാറ്റും കാണിക്കുക",
"pad.settings.colorcheck": "എഴുത്തുകാർക്കുള്ള നിറങ്ങൾ",
"pad.settings.linenocheck": "വരികളുടെ ക്രമസംഖ്യ",
"pad.settings.rtlcheck": "ഉള്ളടക്കം വലത്തുനിന്ന് ഇടത്തോട്ടാണോ വായിക്കേണ്ടത്?",
@ -48,6 +51,7 @@
"pad.importExport.import": "എന്തെങ്കിലും എഴുത്തു പ്രമാണമോ രേഖയോ അപ്‌ലോഡ് ചെയ്യുക",
"pad.importExport.importSuccessful": "വിജയകരം!",
"pad.importExport.export": "ഇപ്പോഴത്തെ പാഡ് ഇങ്ങനെ കയറ്റുമതി ചെയ്യുക:",
"pad.importExport.exportetherpad": "ഈതർപാഡ്",
"pad.importExport.exporthtml": "എച്ച്.റ്റി.എം.എൽ.",
"pad.importExport.exportplain": "വെറും എഴുത്ത്",
"pad.importExport.exportword": "മൈക്രോസോഫ്റ്റ് വേഡ്",
@ -93,6 +97,8 @@
"timeslider.exportCurrent": "ഈ പതിപ്പ് ഇങ്ങനെ എടുക്കുക:",
"timeslider.version": "പതിപ്പ് {{version}}",
"timeslider.saved": "സേവ് ചെയ്തത് {{month}} {{day}}, {{year}}",
"timeslider.backRevision": "ഈ പാഡിലെ ഒരു നാൾപ്പതിപ്പിലേക്ക് മടങ്ങുക",
"timeslider.forwardRevision": "ഈ പാഡിലെ അടുത്ത മാറ്റത്തിലേക്ക് പോവുക",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "ജനുവരി",
"timeslider.month.february": "ഫെബ്രുവരി",
@ -108,6 +114,7 @@
"timeslider.month.december": "ഡിസംബർ",
"timeslider.unnamedauthors": "{{num}} പേരില്ലാത്ത {[plural(num) one: രചയിതാവ്, other: രചയിതാക്കൾ }}",
"pad.savedrevs.marked": "ഈ നാൾപ്പതിപ്പ് സേവ് ചെയ്തിട്ടുള്ള നാൾപ്പതിപ്പായി അടയാളപ്പെടുത്തിയിരിക്കുന്നു",
"pad.savedrevs.timeslider": "സേവ് ചെയ്ത മറ്റു നാൾപ്പതിപ്പുകൾ സമയസൂചികയിൽ കാണാവുന്നതാണ്",
"pad.userlist.entername": "താങ്കളുടെ പേര് നൽകുക",
"pad.userlist.unnamed": "പേരില്ലാത്തവ",
"pad.userlist.guest": "അതിഥി",
@ -118,6 +125,7 @@
"pad.impexp.importing": "ഇറക്കുമതി ചെയ്യുന്നു...",
"pad.impexp.confirmimport": "ഒരു പ്രമാണം ഇറക്കുമതി ചെയ്യുന്നത് നിലവിലുള്ള എഴുത്തുകൾ നഷ്ടപ്പെടാനിടയാക്കും, തുടരണമെന്ന് ഉറപ്പാണോ?",
"pad.impexp.convertFailed": "ഈ പ്രമാണം ഇറക്കുമതി ചെയ്യാൻ സാധിച്ചില്ല. ദയവായി മറ്റൊരു ഡോക്യുമെന്റ് ഫോർമാറ്റ് ഉപയോഗിക്കുകയോ, സ്വന്തമായി പകർത്തി ചേർക്കുകയോ ചെയ്യുക",
"pad.impexp.padHasData": "ഈ പാഡിൽ ഇതിനകം തന്നെ മാറ്റങ്ങൾ നടന്നിട്ടുള്ളതിനാൽ, നൽകിയ പ്രമാണം ഇതിലേക്ക് ചേർക്കാൻ സാധിച്ചില്ല. ദയവായി പുതിയ ഒരു പാഡിലേക്ക് ചേർക്കുക",
"pad.impexp.uploadFailed": "അപ്‌‌ലോഡ് പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക",
"pad.impexp.importfailed": "ഇറക്കുമതി പരാജയപ്പെട്ടു",
"pad.impexp.copypaste": "ദയവായി പകർത്തി ചേർക്കുക",

View File

@ -5,7 +5,7 @@
"C.R."
]
},
"index.newPad": "Novo Pad",
"index.newPad": "Nuovo Pad",
"index.createOpenPad": "o crià o arape nu Pad cu 'o nomme:",
"pad.toolbar.bold.title": "Grassetto (Ctrl-B)",
"pad.toolbar.italic.title": "Cursivo (Ctrl-I)",

View File

@ -3,11 +3,12 @@
"authors": [
"Laaknor",
"Cocu",
"Chameleon222"
"Chameleon222",
"SuperPotato"
]
},
"index.newPad": "Ny blokk",
"index.createOpenPad": "eller opprette/åpne en ny blokk med dette navnet:",
"index.newPad": "Ny Pad",
"index.createOpenPad": "eller opprette/åpne en ny Pad med dette navnet:",
"pad.toolbar.bold.title": "Fet (Ctrl+B)",
"pad.toolbar.italic.title": "Kursiv (Ctrl+I)",
"pad.toolbar.underline.title": "Understreking (Ctrl+U)",
@ -23,17 +24,17 @@
"pad.toolbar.timeslider.title": "Tidslinje",
"pad.toolbar.savedRevision.title": "Lagre revisjoner",
"pad.toolbar.settings.title": "Innstillinger",
"pad.toolbar.embed.title": "Del og sett inn denne blokken",
"pad.toolbar.showusers.title": "Vis brukerne av denne blokken",
"pad.toolbar.embed.title": "Del og sett inn denne Paden",
"pad.toolbar.showusers.title": "Vis brukerne av denne Paden",
"pad.colorpicker.save": "Lagre",
"pad.colorpicker.cancel": "Avbryt",
"pad.loading": "Laster...",
"pad.noCookie": "Kunne ikke finne informasjonskapselen. Vennligst tillat informasjonskapsler (cookies) i din webleser!",
"pad.passwordRequired": "Du trenger et passord for å få tilgang til denne blokken",
"pad.permissionDenied": "Du har ikke tilgang til denne blokken",
"pad.passwordRequired": "Du trenger et passord for å få tilgang til denne Paden",
"pad.permissionDenied": "Du har ikke tilgang til denne Paden",
"pad.wrongPassword": "Feil passord",
"pad.settings.padSettings": "Blokkinnstillinger",
"pad.settings.myView": "Min visning",
"pad.settings.padSettings": "Padinnstillinger",
"pad.settings.myView": "Min Visning",
"pad.settings.stickychat": "Chat alltid synlig",
"pad.settings.chatandusers": "Vis chat og brukere",
"pad.settings.colorcheck": "Forfatterfarger",

View File

@ -3,11 +3,12 @@
"authors": [
"Siebrand",
"Macofe",
"Robin0van0der0vliet"
"Robin0van0der0vliet",
"Robin van der Vliet"
]
},
"index.newPad": "Nieuw pad",
"index.createOpenPad": "Maak of open pad met de naam:",
"index.createOpenPad": "Pad maken op openen met de naam:",
"pad.toolbar.bold.title": "Vet (Ctrl-B)",
"pad.toolbar.italic.title": "Cursief (Ctrl-I)",
"pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)",
@ -45,7 +46,7 @@
"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.import": "Tekstbestand of document uploaden",
"pad.importExport.importSuccessful": "Afgerond",
"pad.importExport.export": "Huidige pad exporteren als",
"pad.importExport.exportetherpad": "Etherpad",
@ -54,7 +55,7 @@
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "Pdf",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit platte tekst of een HTML-opmaak. <a 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\">Installeer abiword</a> om meer geavanceerde importmogelijkheden te krijgen.",
"pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit Tekst zonder opmaak of een HTML-opmaak. <a 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\">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",
@ -65,7 +66,7 @@
"pad.modals.unauth.explanation": "Uw rechten zijn gewijzigd terwijl u de pagina aan het bekijken was. Probeer opnieuw te verbinden.",
"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": "De 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.explanation": "De server reageert niet.",

View File

@ -57,7 +57,7 @@
"pad.modals.reconnecting": "Reconnexion cap a vòstre Pad...",
"pad.modals.forcereconnect": "Forçar la reconnexion.",
"pad.modals.userdup": "Dobèrt dins una autra fenèstra",
"pad.modals.userdup.explanation": "Sembla qu'aqueste Pad es dobèrt dins mai d'una fenèstra de vòstre navigador sus aqueste ordenador.",
"pad.modals.userdup.explanation": "Sembla qu'aqueste Pad es dobèrt dins mai d'una fenèstra de vòstre navigador sus aqueste ordinator.",
"pad.modals.userdup.advice": "Se reconnectar en utilizant aquesta fenèstra.",
"pad.modals.unauth": "Pas autorizat",
"pad.modals.unauth.explanation": "Vòstras permissions son estadas cambiadas al moment de l'afichatge d'aquesta pagina. Ensajatz de vos reconnectar.",

54
src/locales/olo.json Normal file
View File

@ -0,0 +1,54 @@
{
"@metadata": {
"authors": [
"Denö",
"Mashoi7",
"Ilja.mos"
]
},
"pad.toolbar.underline.title": "Alleviivua (Ctrl+U)",
"pad.toolbar.settings.title": "Azetukset",
"pad.colorpicker.save": "Tallenda",
"pad.colorpicker.cancel": "Hylgiä",
"pad.wrongPassword": "Peittosana oli viärin",
"pad.settings.linenocheck": "Riädynoumerot",
"pad.settings.rtlcheck": "Luve syväindö oigielpäi huruale?",
"pad.settings.language": "Kieli:",
"pad.importExport.import_export": "Tuo/Vie",
"pad.importExport.importSuccessful": "Ozavui!",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.modals.userdup": "Avattu toizes ikkunas",
"pad.modals.unauth": "Ei lubua",
"pad.modals.initsocketfail": "Palvelin ei ole tavattavis.",
"pad.modals.initsocketfail.explanation": "Ei suadu yhtevytty sinhronisaciipalvelimeh.",
"pad.modals.slowcommit.explanation": "Palvelin ei vastua.",
"pad.modals.disconnected.explanation": "Yhtevys palvelimeh kavotettu",
"timeslider.toolbar.authors": "Luadijat:",
"timeslider.toolbar.authorsList": "Ei luadijoi",
"timeslider.toolbar.exportlink.title": "Vie",
"timeslider.exportCurrent": "Vie nygöine versii nimel:",
"timeslider.version": "Versii {{version}}",
"timeslider.saved": "Tallendettu {{month}} {{day}}, {{year}}",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "pakkaskuudu",
"timeslider.month.february": "tuhukuudu",
"timeslider.month.march": "kevätkuudu",
"timeslider.month.april": "sulakuudu",
"timeslider.month.may": "oraskuudu",
"timeslider.month.june": "kezäkuudu",
"timeslider.month.july": "heinykuudu",
"timeslider.month.august": "elokuudu",
"timeslider.month.september": "syvyskuudu",
"timeslider.month.october": "ligakuudu",
"timeslider.month.november": "kylmykuudu",
"timeslider.month.december": "talvikuudu",
"pad.userlist.entername": "Kirjuta sinun nimi",
"pad.userlist.unnamed": "nimetöi",
"pad.userlist.guest": "Gost'u",
"pad.impexp.importbutton": "Tuo nygöi",
"pad.impexp.importing": "Tuou..."
}

View File

@ -2,7 +2,8 @@
"@metadata": {
"authors": [
"Aalam",
"Babanwalia"
"Babanwalia",
"ਪ੍ਰਚਾਰਕ"
]
},
"index.newPad": "ਨਵਾਂ ਪੈਡ",
@ -10,29 +11,31 @@
"pad.toolbar.bold.title": "ਗੂੜ੍ਹਾ (Ctrl-B)",
"pad.toolbar.italic.title": "ਤਿਰਛਾ (Ctrl-I)",
"pad.toolbar.underline.title": "ਹੇਠਾਂ-ਰੇਖਾ (Ctrl-U)",
"pad.toolbar.strikethrough.title": "ਵਿੰਨ੍ਹੋ ਵਿਨੋ",
"pad.toolbar.ol.title": "ਲੜੀਵਾਰ ਲਿਸਟ",
"pad.toolbar.strikethrough.title": "ਵਿੰਨ੍ਹੋ (Ctrl+5)",
"pad.toolbar.ol.title": "ਲੜੀਵਾਰ ਸੂਚੀ",
"pad.toolbar.ul.title": "ਬਿਨ-ਲੜੀਬੱਧ ਸੂਚੀ",
"pad.toolbar.indent.title": "ਹਾਸ਼ੀਏ ਤੋਂ ਪਰ੍ਹੇ (ਟੈਬ)",
"pad.toolbar.unindent.title": "ਹਾਸ਼ੀਏ ਵੱਲ (ਸ਼ਿਫ਼ਟ+ਟੈਬ)",
"pad.toolbar.undo.title": "ਵਾਪਸ (Ctrl-Z)",
"pad.toolbar.redo.title": "ਪਰਤਾਓ (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "ਪਰਮਾਣਕਿਤਾ ਰੰਗ ਸਾਫ਼ ਕਰੋ",
"pad.toolbar.clearAuthorship.title": "ਪਰਮਾਣਕਿਤਾ ਰੰਗ ਸਾਫ਼ ਕਰੋ (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "ਵੱਖ-ਵੱਖ ਫਾਇਲ ਫਾਰਮੈਟ ਤੋਂ/ਵਿੱਚ ਇੰਪੋਰਟ/ਐਕਸਪੋਰਟ ਕਰੋ",
"pad.toolbar.timeslider.title": "ਸਮਾਂ-ਲਕੀਰ",
"pad.toolbar.savedRevision.title": "ਰੀਵਿਜ਼ਨ ਸੰਭਾਲੋ",
"pad.toolbar.settings.title": "ਸੈਟਿੰਗ",
"pad.toolbar.embed.title": "ਇਹ ਪੈਡ ਸਾਂਝਾ ਤੇ ਇੰਬੈੱਡ ਕਰੋ",
"pad.toolbar.showusers.title": "ਇਹ ਪੈਡ ਉੱਤੇ ਯੂਜ਼ਰ ਵੇਖਾਓ",
"pad.colorpicker.save": "ਸਾਂਭੋ",
"pad.colorpicker.save": "ਸੰਭਾਲੋ",
"pad.colorpicker.cancel": "ਰੱਦ ਕਰੋ",
"pad.loading": "…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
"pad.noCookie": "ਕੂਕੀਜ਼ ਨਹੀਂ ਲੱਭੀਅਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਬ੍ਰਾੳੂਜ਼ਰ ਵਿੱਚ ਕੂਕੀਜ਼ ਲਾਗੂ ਕਰੋ।",
"pad.passwordRequired": "ਇਹ ਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਪਾਸਵਰਡ ਚਾਹੀਦਾ ਹੈ",
"pad.permissionDenied": "ਇਹ ਪੈਡ ਵਰਤਨ ਲਈ ਤੁਹਾਨੂੰ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ",
"pad.wrongPassword": "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਗਲਤੀ ਸੀ",
"pad.settings.padSettings": "ਪੈਡ ਸੈਟਿੰਗ",
"pad.settings.myView": "ਮੇਰੀ ਝਲਕ",
"pad.settings.stickychat": "ਹਮੇਸ਼ਾ ਸਕਰੀਨ ਉੱਤੇ ਗੱਲ ਕਰੋ",
"pad.settings.chatandusers": "ਗੱਲ-ਬਾਤ ਅਤੇ ਵਰਤੋਂਕਾਰ ਦਿਖਾਵੋ",
"pad.settings.colorcheck": "ਲੇਖਕੀ ਰੰਗ",
"pad.settings.linenocheck": "ਲਾਈਨ ਨੰਬਰ",
"pad.settings.rtlcheck": "ਸਮੱਗਰੀ ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਪੜ੍ਹਨੀ ਹੈ?",
@ -45,10 +48,11 @@
"pad.importExport.import": "ਕੋਈ ਵੀ ਟੈਕਸਟ ਫਾਇਲ ਜਾਂ ਦਸਤਾਵੇਜ਼ ਅੱਪਲੋਡ ਕਰੋ",
"pad.importExport.importSuccessful": "ਸਫ਼ਲ!",
"pad.importExport.export": "ਮੌਜੂਦਾ ਪੈਡ ਨੂੰ ਐਕਸਪੋਰਟ ਕਰੋ:",
"pad.importExport.exportetherpad": "ੲੈਥਰਪੈਡ",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "ਸਧਾਰਨ ਟੈਕਸਟ",
"pad.importExport.exportword": "ਮਾਈਕਰੋਸਾਫਟ ਵਰਡ",
"pad.importExport.exportpdf": "ਪੀਡੀਐਫ",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (ਓਪਨ ਡੌਕੂਮੈਂਟ ਫਾਰਮੈਟ)",
"pad.importExport.abiword.innerHTML": "ਤੁਸੀਂ ਸਿਰਫ਼ ਸਾਦੀਆਂ ਲਿਖਤੀ ਜਾਂ ਐੱਚ.ਟੀ.ਐੱਮ.ਐੱਲ. ਰੂਪ-ਰੇਖਾਵਾਂ ਤੋਂ ਦਰਾਮਦ ਕਰ ਸਕਦੇ ਹੋ। ਹੋਰ ਉੱਨਤ ਦਰਾਮਦੀ ਗੁਣਾਂ ਵਾਸਤੇ ਮਿਹਰਬਾਨੀ ਕਰਕੇ <a 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\">ਐਬੀਵਰਡ ਥਾਪੋ</a>।",
"pad.modals.connected": "ਕੁਨੈਕਟ ਹੈ।",
@ -88,8 +92,11 @@
"timeslider.toolbar.authorsList": "ਕੋਈ ਲੇਖਕ ਨਹੀਂ",
"timeslider.toolbar.exportlink.title": "ਐਕਸਪੋਰਟ",
"timeslider.exportCurrent": "ਮੌਜੂਦਾ ਵਰਜਨ ਇੰਝ ਐਕਸਪੋਰਟ ਕਰੋ:",
"timeslider.version": "ਵਰਜਨ {{version}}",
"timeslider.version": "ਵਰਜਨ {{version}}",
"timeslider.saved": "{{day}} {{month}} {{year}} ਨੂੰ ਸੰਭਾਲਿਆ",
"timeslider.playPause": "ਪੈਡ ਸਮੱਗਰੀ ਚਲਾਓ / ਵਿਰਾਮ ਕਰੋ",
"timeslider.backRevision": "ਇਸ ਪੈਡ ਵਿੱਚ ਪਿਛਲੇ ਰੀਵਿਜ਼ਨ ਤੇ ਜਾਓ",
"timeslider.forwardRevision": "ਇਸ ਪੈਡ ਵਿੱਚ ਅਗਲੇ ਰੀਵਿਜ਼ਨ ਤੇ ਜਾਓ",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "ਜਨਵਰੀ",
"timeslider.month.february": "ਫ਼ਰਵਰੀ",
@ -118,5 +125,5 @@
"pad.impexp.uploadFailed": "ਅੱਪਲੋਡ ਲਈ ਫੇਲ੍ਹ ਹੈ, ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।",
"pad.impexp.importfailed": "ਇੰਪੋਰਟ ਫੇਲ੍ਹ ਹੈ",
"pad.impexp.copypaste": "ਕਾਪੀ ਕਰੋ ਚੇਪੋ ਜੀ",
"pad.impexp.exportdisabled": "{{type}} ਰੂਪ-ਰੇਖਾ ਵਜੋਂ ਬਰਾਮਦ ਕਰਨਾ ਬੰਦ ਹੈ। ਵੇਰਵੇ ਵਾਸਤੇ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਆਪਣੇ ਸਿਸਟਮ ਦੇ ਪ੍ਰਬੰਧਕ ਨਾਲ਼ ਰਾਬਤਾ ਬਣਾਉ।"
"pad.impexp.exportdisabled": "{{type}} ਫਾਰਮੈਟ ਵਜੋਂ ਬਰਾਮਦ ਕਰਨਾ ਬੰਦ ਹੈ। ਵੇਰਵੇ ਵਾਸਤੇ ਆਪਣੇ ਸਿਸਟਮ ਦੇ ਪਰਬੰਧਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"
}

View File

@ -6,7 +6,8 @@
"WTM",
"Woytecr",
"Macofe",
"Pan Cube"
"Pan Cube",
"Mateon1"
]
},
"index.newPad": "Nowy dokument",
@ -14,9 +15,9 @@
"pad.toolbar.bold.title": "Pogrubienie (Ctrl-B)",
"pad.toolbar.italic.title": "Kursywa (Ctrl-I)",
"pad.toolbar.underline.title": "Podkreślenie (Ctrl-U)",
"pad.toolbar.strikethrough.title": "Przekreślenie",
"pad.toolbar.ol.title": "Lista uporządkowana",
"pad.toolbar.ul.title": "Lista nieuporządkowana",
"pad.toolbar.strikethrough.title": "Przekreślenie (Ctrl+5)",
"pad.toolbar.ol.title": "Lista uporządkowana (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Lista nieuporządkowana (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Wcięcie (TAB)",
"pad.toolbar.unindent.title": "Wcięcie (Shift + TAB)",
"pad.toolbar.undo.title": "Cofnij (Ctrl-Z)",
@ -31,12 +32,14 @@
"pad.colorpicker.save": "Zapisz",
"pad.colorpicker.cancel": "Anuluj",
"pad.loading": "Ładowanie...",
"pad.noCookie": "Nie znaleziono pliku cookie. Proszę zezwolić pliki cookie w przeglądarce!",
"pad.passwordRequired": "Musisz podać hasło aby uzyskać dostęp do tego dokumentu",
"pad.permissionDenied": "Nie masz uprawnień dostępu do tego dokumentu",
"pad.wrongPassword": "Nieprawidłowe hasło",
"pad.settings.padSettings": "Ustawienia dokumentu",
"pad.settings.myView": "Mój widok",
"pad.settings.stickychat": "Czat zawsze na ekranie",
"pad.settings.chatandusers": "Pokaż czat i użytkowników",
"pad.settings.colorcheck": "Kolory autorstwa",
"pad.settings.linenocheck": "Numery linii",
"pad.settings.rtlcheck": "Czytasz treść od prawej do lewej?",
@ -68,7 +71,7 @@
"pad.modals.looping.cause": "Być może jesteś połączony przez niezgodną zaporę lub serwer proxy.",
"pad.modals.initsocketfail": "Serwer jest nieosiągalny.",
"pad.modals.initsocketfail.explanation": "Nie udało się połączyć z serwerem synchronizacji.",
"pad.modals.initsocketfail.cause": "Przyczyną są prawdopodobnie problemy z przeglądarka lub połączeniem z internetem.",
"pad.modals.initsocketfail.cause": "Prawdopodobnie jest to spowodowane problemami z przeglądarką lub połączeniem internetowym.",
"pad.modals.slowcommit.explanation": "Serwer nie odpowiada.",
"pad.modals.slowcommit.cause": "Może być to spowodowane problemami z Twoim połączeniem z siecią.",
"pad.modals.badChangeset.explanation": "Edycja, którą wykonałeś, została niewłaściwie zakwalifikowana przez serwer synchronizacji.",
@ -95,6 +98,8 @@
"timeslider.exportCurrent": "Eksportuj bieżącą wersję jako:",
"timeslider.version": "Wersja {{version}}",
"timeslider.saved": "Zapisano {{day}} {{month}} {{year}}",
"timeslider.backRevision": "Przejdź do poprzedniej wersji dokumentu",
"timeslider.forwardRevision": "Przejdź do następnej wersji dokumentu",
"timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Styczeń",
"timeslider.month.february": "Luty",
@ -108,18 +113,20 @@
"timeslider.month.october": "Październik",
"timeslider.month.november": "Listopad",
"timeslider.month.december": "Grudzień",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor, other: autorów ]} bez nazw",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: nienazwany autor, other: nienazwanych autorów ]}",
"pad.savedrevs.marked": "Ta wersja została właśnie oznaczona jako zapisana.",
"pad.savedrevs.timeslider": "Możesz zobaczyć zapisane wersje na osi czasu",
"pad.userlist.entername": "Wprowadź swoją nazwę",
"pad.userlist.unnamed": "bez nazwy",
"pad.userlist.guest": "Gość",
"pad.userlist.deny": "Zabroń",
"pad.userlist.approve": "Akceptuj",
"pad.userlist.approve": "Zezwól",
"pad.editbar.clearcolors": "Wyczyścić kolory autorstwa w całym dokumencie?",
"pad.impexp.importbutton": "Importuj teraz",
"pad.impexp.importing": "Importowanie...",
"pad.impexp.confirmimport": "Importowanie pliku spowoduje zastąpienie bieżącego tekstu. Czy na pewno chcesz kontynuować?",
"pad.impexp.convertFailed": "Nie byliśmy w stanie zaimportować tego pliku. Proszę użyć innego formatu dokumentu lub skopiować i wkleić ręcznie",
"pad.impexp.padHasData": "Nie udało się zaimportować tego pliku, bo ten dokument ma już zmiany, proszę zaimportować do nowego dokumentu",
"pad.impexp.uploadFailed": "Przesyłanie nie powiodło się, proszę spróbować jeszcze raz",
"pad.impexp.importfailed": "Importowanie nie powiodło się",
"pad.impexp.copypaste": "Proszę skopiować i wkleić",

View File

@ -13,7 +13,9 @@
"Rodrigo codignoli",
"Webysther",
"Fasouzafreitas",
"Lpagliari"
"Lpagliari",
"Walesson",
"Cainamarques"
]
},
"index.newPad": "Nova Nota",
@ -104,6 +106,9 @@
"timeslider.exportCurrent": "Exportar a versão atual em formato:",
"timeslider.version": "Versão {{version}}",
"timeslider.saved": "Salvo em {{day}} de {{month}} de {{year}}",
"timeslider.playPause": "Reproduzir / Pausar conteúdo no Pad",
"timeslider.backRevision": "Voltar a uma revisão anterior neste Pad",
"timeslider.forwardRevision": "Ir a uma revisão posterior neste Pad",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Janeiro",
"timeslider.month.february": "Fevereiro",

View File

@ -7,7 +7,8 @@
"Waldir",
"Imperadeiro98",
"Macofe",
"Ti4goc"
"Ti4goc",
"Cainamarques"
]
},
"index.newPad": "Nova Nota",
@ -106,7 +107,7 @@
"pad.impexp.importbutton": "Importar agora",
"pad.impexp.importing": "Importando...",
"pad.impexp.confirmimport": "A importação de um ficheiro irá substituir o texto atual do pad. Tem certeza que deseja continuar?",
"pad.impexp.padHasData": "Não fomos capazes de importar este ficheiro porque esta Almofada já tinha alterações, consulte importar para um novo bloco",
"pad.impexp.padHasData": "Não fomos capazes de importar este arquivo porque este Pad já tinha alterações, por favor importe para um novo pad",
"pad.impexp.uploadFailed": "O upload falhou. Por favor, tente novamente",
"pad.impexp.importfailed": "A importação falhou",
"pad.impexp.copypaste": "Por favor, copie e cole"

View File

@ -3,7 +3,9 @@
"authors": [
"Hedwig",
"ImGelu",
"Minisarm"
"Minisarm",
"Strainu",
"Wintereu"
]
},
"index.newPad": "Pad nou",
@ -15,8 +17,12 @@
"pad.toolbar.ol.title": "Listă ordonată (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Listă neordonată (Ctrl+Shift+L)",
"pad.toolbar.undo.title": "Anulează (Ctrl+Z)",
"pad.toolbar.redo.title": "Refă (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Curăță culorile autorilor (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importă/Exportă din/în diferite formate",
"pad.toolbar.savedRevision.title": "Salvează revizia",
"pad.toolbar.settings.title": "Setări",
"pad.toolbar.showusers.title": "Arată utilizatorii de pe acest pad",
"pad.colorpicker.save": "Salvează",
"pad.colorpicker.cancel": "Anulează",
"pad.loading": "Se încarcă...",
@ -26,9 +32,12 @@
"pad.settings.padSettings": "Setări pentru Pad",
"pad.settings.stickychat": "Chat-ul întotdeauna pe ecran",
"pad.settings.chatandusers": "Afișează Chat-ul și Utilizatorii",
"pad.settings.colorcheck": "Culorile autorilor",
"pad.settings.linenocheck": "Numere de linie",
"pad.settings.fontType": "Tipul fontului:",
"pad.settings.globalView": "Vedere generală",
"pad.settings.language": "Limbă:",
"pad.importExport.import_export": "Import/Export",
"pad.importExport.import": "Încarcă orice fișier text sau document",
"pad.importExport.importSuccessful": "Succes!",
"pad.importExport.export": "Exportă pad-ul curent ca:",
@ -39,9 +48,10 @@
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.modals.connected": "Conectat.",
"pad.modals.reconnecting": "Se reconectează la pad-ul u..",
"pad.modals.reconnecting": "Se reconectează la pad-ul dumneavoastră..",
"pad.modals.forcereconnect": "Forțează reconectarea",
"pad.modals.userdup.advice": "Reconectează pentru a folosi această fereastră în schimb",
"pad.modals.userdup": "Deschis în altă fereastră",
"pad.modals.userdup.advice": "Reconectați-vă dacă doriți să utilizați această fereastră.",
"pad.modals.unauth": "Nu ești autorizat",
"pad.modals.initsocketfail": "Serverul nu este disponibil.",
"pad.modals.initsocketfail.explanation": "Nu s-a putut conecta la serverul de sincronizare.",
@ -53,12 +63,12 @@
"pad.share": "Distribuie acest pad",
"pad.share.readonly": "Doar în citire",
"pad.share.link": "Legătură",
"pad.share.emebdcode": "Încorporează URL-ul",
"pad.share.emebdcode": "Adresa URL încorporată",
"pad.chat": "Chat",
"pad.chat.title": "Deschide chat-ul pentru acest pad.",
"pad.chat.loadmessages": "Încarcă mai multe mesaje",
"timeslider.toolbar.returnbutton": "Înapoi la pad",
"timeslider.toolbar.authors": "Aurori:",
"timeslider.toolbar.authors": "Autori:",
"timeslider.toolbar.authorsList": "Niciun autor",
"timeslider.toolbar.exportlink.title": "Exportă",
"timeslider.exportCurrent": "Exportă versiunea curentă ca:",
@ -77,6 +87,12 @@
"timeslider.month.october": "octombrie",
"timeslider.month.november": "noiembrie",
"timeslider.month.december": "decembrie",
"pad.userlist.entername": "Introdu numele tău",
"pad.userlist.unnamed": "fără nume"
"pad.userlist.entername": "Introduceți numele dumneavoastră",
"pad.userlist.unnamed": "fără nume",
"pad.userlist.guest": "Oaspete",
"pad.userlist.deny": "Respinge",
"pad.userlist.approve": "Aprobă",
"pad.impexp.importbutton": "Importă acum",
"pad.impexp.importing": "Importare...",
"pad.impexp.importfailed": "Import eșuat"
}

View File

@ -5,7 +5,8 @@
"DCamer",
"Eleferen",
"Okras",
"Volkov"
"Volkov",
"Nzeemin"
]
},
"index.newPad": "Создать",
@ -96,6 +97,9 @@
"timeslider.exportCurrent": "Экспортировать текущую версию как:",
"timeslider.version": "Версия {{version}}",
"timeslider.saved": "Сохранено {{day}}.{{month}}.{{year}}",
"timeslider.playPause": "Воспроизведение / Пауза содержимого документа",
"timeslider.backRevision": "Назад на одну версию документа",
"timeslider.forwardRevision": "Вперёд на одну версию документа",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "январь",
"timeslider.month.february": "февраль",
@ -111,6 +115,7 @@
"timeslider.month.december": "декабрь",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: безымянный автор, few: безымянных автора, many: безымянных авторов, other: безымянных авторов]}",
"pad.savedrevs.marked": "Эта версия теперь помечена как сохраненная",
"pad.savedrevs.timeslider": "Вы можете увидеть сохранённые версии на шкале времени",
"pad.userlist.entername": "Введите ваше имя",
"pad.userlist.unnamed": "безымянный",
"pad.userlist.guest": "Гость",
@ -121,8 +126,9 @@
"pad.impexp.importing": "Импортирование…",
"pad.impexp.confirmimport": "Импорт файла перезапишет текущий текст. Вы уверены, что вы хотите продолжить?",
"pad.impexp.convertFailed": "Не удалось импортировать этот файл. Пожалуйста, используйте другой формат или скопируйте вручную",
"pad.impexp.padHasData": "Не получилось импортировать этот файл, потому что этот документ уже имеет изменения, пожалуйста, импортируйте в новый документ",
"pad.impexp.uploadFailed": "Загрузка не удалась, пожалуйста, попробуйте ещё раз",
"pad.impexp.importfailed": "Ошибка при импортировании",
"pad.impexp.importfailed": "Ошибка при импорте",
"pad.impexp.copypaste": "Пожалуйста, скопируйте",
"pad.impexp.exportdisabled": "Экспорт в формате {{type}} отключен. Для подробной информации обратитесь к системному администратору."
}

91
src/locales/sd.json Normal file
View File

@ -0,0 +1,91 @@
{
"@metadata": {
"authors": [
"Mehtab ahmed"
]
},
"index.newPad": "نئين پٽي",
"index.createOpenPad": "يا نالي سان ڪا پٽي تخليق ڪريو\\کوليو:",
"pad.toolbar.bold.title": "وزني (Ctrl+B)",
"pad.toolbar.italic.title": "اطالوي (Ctrl+I)",
"pad.toolbar.underline.title": "هيٺان سٽ ڏيو (Ctrl+U)",
"pad.toolbar.strikethrough.title": "ليڪو ڏيو (Ctrl+5)",
"pad.toolbar.ol.title": "ترتيب وار فهرست (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "ٻي ترتيب فهرست (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "وڌايو (TAB)",
"pad.toolbar.unindent.title": "گھٽايو (Shift+TAB)",
"pad.toolbar.undo.title": "اڻ ڪريو (Ctrl+Z)",
"pad.toolbar.redo.title": "ٻيهر ڪريو (Ctrl+Y)",
"pad.toolbar.timeslider.title": "وقت ڦيرڻو",
"pad.toolbar.savedRevision.title": "نظرثاني سانڍيو",
"pad.toolbar.settings.title": "ترتيبون",
"pad.colorpicker.save": "سانڍيو",
"pad.colorpicker.cancel": "رد",
"pad.loading": "لاهيندي...",
"pad.wrongPassword": "توهان جو ڳجھو لفظ غلط هيو",
"pad.settings.padSettings": "پٽي جو ترتيبون",
"pad.settings.myView": "منهنجو نظارو",
"pad.settings.stickychat": "ڳالھ ٻولھ هميشه پردي تي ڪريو",
"pad.settings.chatandusers": "ڳالھ ٻولھ ۽ يوزر ڏيکاريو",
"pad.settings.linenocheck": "سٽ جا انگ",
"pad.settings.rtlcheck": "مواد ساڄي کان کاٻي طرف پڙهندئو؟",
"pad.settings.fontType": "اکرن جو قسم:",
"pad.settings.globalView": "عالمي نظارو",
"pad.settings.language": "ٻولي:",
"pad.importExport.import_export": "درآمد ڪريو\\برآمد ڪريو",
"pad.importExport.import": "ڪو به متن وارو فائيل يا دستاويز چاڙهيو",
"pad.importExport.importSuccessful": "ڪامياب!",
"pad.importExport.export": "هاڻوڪي پٽي برآمد ڪريو جي طور:",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "سادو متن",
"pad.importExport.exportword": "مائيڪرسافٽ ورڊ",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (کليل دستاويز فارميٽ)",
"pad.modals.connected": "ڳنڍيل.",
"pad.modals.reconnecting": "توهان جي پٽي سان ٻيهر ڳنڍي رهيو آهي...",
"pad.modals.forcereconnect": "جبري طور ٻيهر ڳنڍيو",
"pad.modals.userdup": "هڪ ٻي دري ۾ کليل",
"pad.modals.unauth": "اختيار نه آهي",
"pad.modals.initsocketfail": "سَروَرَ کي پڄي نٿو سگھجي.",
"pad.modals.slowcommit.explanation": "سَروَر جواب نٿو ڏي.",
"pad.modals.corruptPad.explanation": "جيڪا پٽي توهان حاصل ڪرڻ چاهيو ٿا اها بدعنوان آهي.",
"pad.modals.deleted": "ختم ڪيل.",
"pad.modals.deleted.explanation": "هي پٽي هٽائجي چڪي آهي.",
"pad.modals.disconnected": "توهان سان ڳانڍاپو ختم ڪيو ويو آهي.",
"pad.share": "هي پٽي ونڊيو",
"pad.share.readonly": "صرف پڙهو",
"pad.share.link": "ڳنڍڻو",
"pad.chat": "ڳالھ ٻولھ",
"pad.chat.title": "هن پٽي لاءِ ڳالھ ٻولھ کوليو.",
"pad.chat.loadmessages": "وڌيڪ پيغام لوڊ ڪريو",
"timeslider.pageTitle": "{{appTitle}} وقت ڦيرڻو",
"timeslider.toolbar.returnbutton": "پٽي ڏانهن ورو",
"timeslider.toolbar.authors": "ليکڪ:",
"timeslider.toolbar.authorsList": "ڪوبه ليکڪ ناهي",
"timeslider.toolbar.exportlink.title": "برآمد ڪريو",
"timeslider.version": "ورزن {{version}}",
"timeslider.saved": "شانڍيل {{مهينو}} {{ڏينهن}}, {{سال}}",
"timeslider.dateformat": "{{مهينو}}/{{ڏينهن}}/{{سال}} {{ڪلاڪ}}:{{منٽ}}:{{سيڪنڊ}}",
"timeslider.month.january": "جنوري",
"timeslider.month.february": "فيبروري",
"timeslider.month.march": "مارچ",
"timeslider.month.april": "اپريل",
"timeslider.month.may": "مئي",
"timeslider.month.june": "جون",
"timeslider.month.july": "جولاءِ",
"timeslider.month.august": "آگسٽ",
"timeslider.month.september": "سيپٽمبر",
"timeslider.month.october": "آڪٽوبر",
"timeslider.month.november": "نومبر",
"timeslider.month.december": "ڊسمبر",
"pad.userlist.entername": "پنهنجو نالو داخل ڪريو",
"pad.userlist.unnamed": "بينام",
"pad.userlist.guest": "مهمان",
"pad.userlist.deny": "انڪار ڪريو",
"pad.userlist.approve": "قبول ڪريو",
"pad.impexp.importbutton": "هاڻي درآمد ڪريو",
"pad.impexp.importing": "درآمد ڪندي...",
"pad.impexp.uploadFailed": "چاڙھ ناڪام ويو، براءِ مهرباني ٻيهر ڪوشش ڪريو",
"pad.impexp.importfailed": "درآمد ناڪام",
"pad.impexp.copypaste": "براءِ مهرباني ڪاپي ڪري لڳايو"
}

126
src/locales/shn.json Normal file
View File

@ -0,0 +1,126 @@
{
"@metadata": {
"authors": [
"Saosukham"
]
},
"index.newPad": "ၽႅတ်ႉမႂ်ႇ",
"index.createOpenPad": "ဢမ်ႇၼၼ် ၶူင်မႂ်ႇ/ပိုတ်ႇၽႅတ်ႉၵိုၵ်းၸိုဝ်ႈ",
"pad.toolbar.bold.title": "လမ် (Ctrl+B)",
"pad.toolbar.italic.title": "ၵိူင်း (Ctrl+I)",
"pad.toolbar.underline.title": "ထတ်းထႅဝ်တႂ်ႈ (Ctrl+U)",
"pad.toolbar.strikethrough.title": "လတ်းၵၢင် (Ctrl+5)",
"pad.toolbar.ol.title": "ၵုမ်းသဵၼ်ႈ (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "ဢမ်ႇၵုမ်းသဵၼ်ႈ (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "ၶၼ်ႈ (TAB)",
"pad.toolbar.unindent.title": "ၶၼ်ႈႁၢင်ႇ (Shift+TAB)",
"pad.toolbar.undo.title": "ၶိုၼ်းဢမ်ႇႁဵတ်း (Ctrl+Z)",
"pad.toolbar.redo.title": "ၶိုၼ်းႁဵတ်း (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "သၢင်းလၢင်းပႅတ်ႈ သီဢၼ်မီးဝႆႉၵဝ်ႇ (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "သူင်ႇၶဝ်ႈ/သူင်ႇဢွၵ်ႇ တမ်ႈတီႈ/ထိုင် ၾၢႆႇၾေႃးမိတ်ႉ ဢၼ်ဢမ်ႇမိူၼ်ၵၼ်ၸိူဝ်းၼၼ်ႉ",
"pad.toolbar.timeslider.title": "ၶၢဝ်းယၢမ်းထွၵ်ႇလၢႆႈ",
"pad.toolbar.savedRevision.title": "သိမ်းလွင်ႈၶိုၼ်းမႄး",
"pad.toolbar.settings.title": "ပိူင်ႁႅၼ်း",
"pad.toolbar.embed.title": "ၽႄပၼ်ၽႅတ်ႉဢၼ်ၼႆႉသေ ၽိူမ်ႉပၼ်",
"pad.toolbar.showusers.title": "ၼႄပၼ်ၵေႃႉၸႂ်ႉ တီႈၼိူဝ်ၽႅတ်ႉၼႆႉ",
"pad.colorpicker.save": "ၵဵပ်းသိမ်း",
"pad.colorpicker.cancel": "ဢမ်ႇႁဵတ်း",
"pad.loading": "တိုၵ်ႉလူတ်ႇ",
"pad.noCookie": "ၶုၵ်းၶီး ဢမ်ႇႁၼ်လႆႈ။ ၶႅၼ်းတေႃႈ ၶႂၢင်းပၼ် ၶုၵ်းၶီး တီႈၼႂ်း ပရၢဝ်ႇသႃႇၸဝ်ႈၵဝ်ႇ",
"pad.passwordRequired": "တႃႇၶဝ်ႈတီႈၽႅတ်ႉၼႆႉ ၸဝ်ႈၵဝ်ႇ လူဝ်ႇမီး မၢႆလပ်ႉ",
"pad.permissionDenied": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးၶေႃႈၶႂၢင်ႉ တႃႇၶဝ်ႈၼႂ်းၽႅတ်ႉၼႆႉ",
"pad.wrongPassword": "မၢႆလပ်ႉၸဝ်ႈၵဝ်ႇ ၽိတ်း",
"pad.settings.padSettings": "ပိူင်သၢင်ႈၽႅတ်ႉ",
"pad.settings.myView": "ဝိဝ်းၵဝ်",
"pad.settings.stickychat": "ၶျၢတ်ႉၼိူဝ်ၼႃႈၽိဝ် တႃႇသေႇ",
"pad.settings.chatandusers": "ၼႄၶျၢတ်ႉဢိၵ်ႇၵေႃႉၸႂ်ႉ",
"pad.settings.colorcheck": "သီၸိူဝ်းမီးဝႆႉၵဝ်ႇၵဝ်ႇ",
"pad.settings.linenocheck": "တူဝ်လိၵ်ႈႁေႈႁၢႆး",
"pad.settings.rtlcheck": "လူၵႂၢမ်းၼၢမ်း တႄႇၶႂႃတေႃႇသၢႆႉ",
"pad.settings.fontType": "ၾွၼ်ႉတူဝ်လိၵ်ႈ",
"pad.settings.globalView": "ဝိဝ်းတင်းလူၵ်ႈ",
"pad.settings.language": "ၽႃႇသႃႇၵႂၢမ်း:",
"pad.importExport.import_export": "သူင်ႇၶဝ်/သူင်ႇဢွၵ်ႇ",
"pad.importExport.import": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇလိၵ်ႈၵမ်ႈၽွင်ႈ ဢမ်ႇၼၼ် ပွင်ႈလိၵ်ႈ",
"pad.importExport.importSuccessful": "ဢွင်ႇယဝ်ႉ!",
"pad.importExport.export": "ဢဝ်ဢွၵ်ႇၽႅတ်ႉဢၼ်ပိူၼ်ႈသူင် ၸိူင်ႉၼင်ႇ:",
"pad.importExport.exportetherpad": "ၽႅတ်ႉပဝ်ႇ",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "တူဝ်လိၵ်ႈပဝ်ႇ",
"pad.importExport.exportword": "မၢႆႇၶရူဝ်ႇသွပ်ႉဝၢတ်ႉ",
"pad.importExport.exportpdf": "ၽီႇတီႇဢႅပ်ႉၾ်",
"pad.importExport.exportopen": "ဢူဝ်တီႇဢႅပ်ႉၾ် (Open Document Format)",
"pad.importExport.abiword.innerHTML": "ၸဝ်ႈၵဝ်ႇၸၢင်ႈလုၵ်ႉတီႈ လိၵ်ႈပဝ်ႇသေ သူင်ႇၶဝ်ႈၵႂႃႇ ဢမ်ႇၼၼ် ပိူင်လၢႆႈ HTML. ပုၼ်ႈတႃႇ ၸိူဝ်းပိူင်မႂ်ႇ ဢၼ်သူင်ႇၶဝ်ႈမႃးၼၼ်ႉ ၶွပ်ႈၸႂ်သေ <a 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\">install abiword</a>.",
"pad.modals.connected": "ၵွင်ႉသၢၼ်ယဝ်ႉ",
"pad.modals.reconnecting": "ၶိုၼ်းၵွင်ႉသၢၼ်ၸူး ၽႅတ်ႉၸဝ်ႈၵဝ်ႇယူႇ",
"pad.modals.forcereconnect": "တဵၵ်းၸႂ်ႉ ၶိုၼ်းၵွင်ႉသၢၼ်",
"pad.modals.userdup": "ပိုတ်ႇတမ်ႈတီႈ ၼႃႈတူမႂ်ႇ",
"pad.modals.userdup.explanation": "တမ်ႈတီႈၼႂ်းၶွမ်းတၢင်ႇဢၼ်ၼၼ်ႉ ၽႅတ်ႉဢၼ်ၼႆႉ လႅပ်ႉပိုတ်ႇဝႆႉ တမ်ႈတီႈ ပရၢဝ်ႇသႃႇတၢင်ႇတီႈယူႇ",
"pad.modals.userdup.advice": "ၶိုၼ်းၵွင်ႉသၢၼ်တၢင် တမ်ႈတီႈ ဝိၼ်းတူဝ်းၼႆႉ",
"pad.modals.unauth": "ဢမ်ႇမီးသုၼ်ႇႁဵတ်း",
"pad.modals.unauth.explanation": "ၽွင်းၼႄၼႃႈလိၵ်ႈၼႆႉယူႇၼၼ်ႉ ၶေႃႈၶႂၢင်းၸဝ်ႈၵဝ်ႇ လႅၵ်ႈလၢႆႉယဝ်ႉယဝ်ႉ။ ၶတ်းၸႂ် ၶိုၼ်းၵွင်ႉသၢၼ်တႅင်ႈ",
"pad.modals.looping.explanation": "ၸိူဝ်းၼႆႉ မီးဝႆႉပၼ်ႁႃ သၢႆတိတ်းတေႃႇ ၵိုၵ်းလူၺ်ႈ သႃႇဝႃႇ ဢၼ်ၸၼ်ထိင်းဝႆႉ",
"pad.modals.looping.cause": "သင်ပဵၼ်လႆႈ မႂ်းၶဝ်ႈၵွင်ႉသၢၼ် ၾၢႆးယႃးဝေႃး ဢမ်ႇၼၼ် ပရွၵ်ႉသီႇ ဢၼ်ဢမ်ႇငၢမ်ႇၵၼ်",
"pad.modals.initsocketfail": "သႃႇဝႃႇ ဢမ်ႇၵွင်ႉလႆႈ",
"pad.modals.initsocketfail.explanation": "ဢမ်ႇၵွင်ႉၸူးလႆႈ သႃႇဝႃႇဢၼ်ၸၼ်ထိင်းဝႆႉ",
"pad.modals.initsocketfail.cause": "ၼႆႉပဵၼ်ပၼ်ႁႃၶိုၵ်ႉလူင် ၵိုၵ်းလူၺ်ႈ ပရၢဝ်ႇသႃႇၸဝ်ႈၵဝ်ႇ ဢမ်ႇၼၼ် သၢႆၼႅင်ႈၸဝ်ႈၵဝ်ႇ",
"pad.modals.slowcommit.explanation": "သႃႇဝႃႇ ဢမ်ႇတွပ်ႇပၼ်",
"pad.modals.slowcommit.cause": "ၼႆႉပူပ်ႉၺႃး ပၼ်ႁႃ ၵိုၵ်းလူၺ်ႈ သၢႆၼႅင်ႈၵွင်ႉသၢၼ်",
"pad.modals.badChangeset.explanation": "ၶေႃႈထတ်း ဢၼ်ၸဝ်ႈၵဝ်ႇႁဵတ်းၼၼ်ႉ မၼ်းဢမ်ႇႁူမ်ႈၶဝ်ႈၶႂၢင်ႇ ၸွမ်းၼင်ႇ သႃႇဝႃႇဢၼ် ၸၼ်ထိင်းဝႆႉ",
"pad.modals.corruptPad.explanation": "ၽႅတ်ႉဢၼ်ၸဝ်ႈၵဝ်ႇပေႃႉၼၼ်ႉ ၶဝ်ႈၽိတ်းဝႆႉ",
"pad.modals.corruptPad.cause": "ဢၼ်ၼႆႉ သႃႇဝႃႇဢၼ်ၸၼ်ထိင်းမၼ်း ၽိတ်းဝႆႉ ဢမ်ႇၼၼ် ဢမ်ႇမုင်ႈမွင်းသေ ၽိတ်းပိူင်ႈဝႆႉယဝ်ႉ။ ၶႅၼ်းတေႃႈ ၵပ်းသိုပ်ႇတမ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်.",
"pad.modals.deleted": "ယႃႉ",
"pad.modals.deleted.explanation": "ၽႅတ်ႉဢၼ်ၼႆႉ ၶၢႆႉပႅတ်ႈယဝ်ႉ",
"pad.modals.disconnected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇၵွင်ႉသၢၼ်ဝႆႉ",
"pad.modals.disconnected.explanation": "လွင်ႈၵွင်ႉသၢၼ် ၵႂႃႇၸူးသႃႇဝႃႇၼၼ်ႉ ႁၢႆဝႆႉ",
"pad.modals.disconnected.cause": "သႃႇဝႃႇတေဢမ်ႇၸၢင်ႈယိပ်းတိုဝ်း။ တႃႇႁႂ်ႈသိုပ်ႇပဵၼ်ၵၢၼ်ၵႂႃႇၼၼ်ႉ ၶႅၼ်းတေႃႈ ပွင်ႇၶၢဝ်ႇ တမ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်",
"pad.share": "ၽႄၽႅတ်ႉၼႆႉ",
"pad.share.readonly": "လူလၢႆလၢႆ",
"pad.share.link": "ၵွင်ႉ",
"pad.share.emebdcode": "သႂ်ႇ URL",
"pad.chat": "ၶျၢတ်ႉ",
"pad.chat.title": "ပိုတ်ႇၶျၢတ်ႉ တႃႇၽႅတ်ႉၼႆႉ",
"pad.chat.loadmessages": "လူတ်ႇၶေႃႈၶၢဝ်ႇ လိူဝ်",
"timeslider.pageTitle": "{{appTitle}} ၶၢဝ်းယၢမ်းထေႃပူၼ်ႉ",
"timeslider.toolbar.returnbutton": "ၶိုၼ်းၵႂႃႇၸူး ၽႅတ်ႉ",
"timeslider.toolbar.authors": "ၽူႈတႅမ်ႈလိၵ်ႈ",
"timeslider.toolbar.authorsList": "ဢမ်ႇၸႂ်ႈ ၽူႈတႅမ်ႈလိၵ်ႈ",
"timeslider.toolbar.exportlink.title": "သူင်ႇဢွၵ်ႇ",
"timeslider.exportCurrent": "သူင်ႇဢွၵ်ႇ လုၼ်ႈပၢၼ်မႂ်ႇ ၼင်ႇ:",
"timeslider.version": "လုၼ်ႈ {{version}}",
"timeslider.saved": "သိမ်းယဝ်ႉ{{month}} {{day}}, {{year}}",
"timeslider.playPause": "လဵၼ်ႈလင်/ၵိုတ်းသဝ်း ၵႂၢမ်းၼၢမ်း ၽႅတ်ႉ",
"timeslider.backRevision": "ႁူၼ်လင် ၶိုၼ်းမႄး ၽႅတ်ႉၼႆႉ",
"timeslider.forwardRevision": "ၵႂႃႇၼႃႈ ၶိုၼ်းမႄး ၽႅတ်ႉၼႆႉ",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "ၵျၼ်ႇၼိဝ်ႇရီႇ",
"timeslider.month.february": "ၾႅပ်ႇဝႃႇရီႇ",
"timeslider.month.march": "မၢတ်ႉၶျ်",
"timeslider.month.april": "ဢေႇပရႄႇ",
"timeslider.month.may": "မေႇ",
"timeslider.month.june": "ၵျုၼ်ႇ",
"timeslider.month.july": "ၵျူႇလၢႆႇ",
"timeslider.month.august": "ဢေႃးၵၢတ်ႉ",
"timeslider.month.september": "သႅပ်ႉထိမ်ႇပႃႇ",
"timeslider.month.october": "ဢွၵ်ႇထူဝ်ႇပႃႇ",
"timeslider.month.november": "ၼူဝ်ႇ​ဝႅမ်ႇ​ပႃႇ",
"timeslider.month.december": "တီႇသႅမ်ႇပႃႇ",
"timeslider.unnamedauthors": "{{num}} ဢမ်ႇသႂ်ႇၸိုဝ်ႈ {[plural(num) ၼိုင်ႈ: ၽူႈတႅမ်ႈလိၵ်ႈ, တၢင်ႇၸိူဝ်း: ၽူႈတႅမ်ႈလိၵ်ႈၶဝ် ]}",
"pad.savedrevs.marked": "ဢၼ်မႄးဝႆႉၼႆႉ ယၢမ်းလဵဝ် ၶိုၼ်းမႄး ၵဵပ်းသိမ်းဝႆႉ ၸိူင်ႉၼင်ႇဢၼ်ၼိုင်ႈ",
"pad.savedrevs.timeslider": "ၸဝ်ႈၵဝ်ႇတေတူၺ်းလႆႈ ဢၼ်ၶိုၼ်းမႄးသိမ်းဝႆႉၼၼ်ႉယူႇ ပေႃးၶဝ်ႈတူၺ်းတီႈ ၶၢဝ်းယၢမ်းထေႃပူၼ်ႉ",
"pad.userlist.entername": "ပေႃႇသႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ၸဝ်ႈၵဝ်ႇ",
"pad.userlist.unnamed": "ဢမ်ႇသႂ်ႇၸိုဝ်ႈ",
"pad.userlist.guest": "ၶႅၵ်ႇ",
"pad.userlist.deny": "ထဵင်",
"pad.userlist.approve": "ၵမ်ႉထႅမ်",
"pad.editbar.clearcolors": "လၢင်ႉပႅတ်ႈသီၵဝ်ႇ တမ်ႈတီႈ ၼိူဝ်ၶေႃႈလိၵ်ႈတင်းသဵင်ႈ",
"pad.impexp.importbutton": "သူင်ႇၶဝ်ႈယၢမ်းလဵဝ်",
"pad.impexp.importing": "တိုၵ်ႉသူင်ႇၶဝ်ႈယူႇ",
"pad.impexp.confirmimport": "ဢဝ်ၾၢႆႇၶဝ်ႈမႃးၼႆႉ တေမႃး တဵင်သႂ်ႇ လိၵ်ႈဢၼ်မီးဝႆႉ တီႈၼႂ်းၽႅတ်ႉၼႆႉယဝ်ႉ။ ၸွင်ႇၸဝ်ႈၵဝ်ႇ လပ်ႉလွင်းဝႃႈ ၸဝ်ႈၵဝ်ႇ တေၶႂ်ႈ ငူပ်ႉငိႁိုဝ်?",
"pad.impexp.convertFailed": "ႁဝ်းဢမ်ႇၸၢင်းႁဵတ်းႁိုဝ် ဢဝ်ၾၢႆႇၼႆႉ သူင်ႇၶဝ်ႈၵႂႃႇ။ ၶႅၼ်းတေႃႈ ၸႂ်ႉတိုဝ်း ၶေႃႈလိၵ်ႈ ဢၼ်ပႅၵ်ႇပိူင်ႈၵၼ် ဢမ်ႇၼၼ် ၵူးထုတ်ႇဝႆႉလႄႈ",
"pad.impexp.padHasData": "ႁဝ်းဢမ်ႇၸၢင်းႁဵတ်းႁိုဝ် ဢဝ်ၾၢႆႇၼႆႉ သူင်ႇၶဝ်ႈၵႂႃႇ ၵွပ်ႈပိူဝ်ႈဝႃႈ ၽႅတ်ႉဢၼ်ၼႆႉ မၼ်းလႅၵ်ႈလၢႆႈၵႂႃႇယဝ်ႉယဝ်ႈ။ ၶွပ်ႈၸႂ် သူင်ႇၶႂ်ႈၼႂ်း ၽႅတ်ႉမႂ်ႇလႄႈ",
"pad.impexp.uploadFailed": "ဢၼ်လူတ်ႇၶိုၼ်ႈ ၶၢတ်ႇတူၵ်းယဝ်ႉ။ ၶႅၼ်းတေႃႈ ၶတ်းၸႂ်ထႅင်ႈ",
"pad.impexp.importfailed": "ဢၼ်သူင်ႇၶဝ်ႈ ၶၢတ်ႇတူၵ်းယဝ်ႉ",
"pad.impexp.copypaste": "ၶႅၼ်းတေႃႈ ၵူးသေ ဢဝ်ဝႆႉတ",
"pad.impexp.exportdisabled": "ၸိူင်ႉၼင်ႇ {{type}} သူင်ႇဢွၵ်ႇ ၾေႃးမဵတ်ႉ ၼၼ်ႉ ဢမ်ႇၸၢင်ႈ။ ၶႅၼ်းတေႃႈ ၵပ်းသိုပ်ႇ ၽူႈၵုမ်းၵၢၼ်ၸၢၵ်ႈ တႃႇႁူဝ်ယွႆႈမၼ်းတ"
}

View File

@ -3,7 +3,8 @@
"authors": [
"Teslaton",
"Kusavica",
"Rudko"
"Rudko",
"Mark"
]
},
"index.newPad": "Nový Pad",
@ -11,14 +12,14 @@
"pad.toolbar.bold.title": "Tučné (Ctrl-B)",
"pad.toolbar.italic.title": "Kurzíva (Ctrl-I)",
"pad.toolbar.underline.title": "Podčiarknuté (Ctrl-U)",
"pad.toolbar.strikethrough.title": "Prečiarknuté",
"pad.toolbar.ol.title": "Číslovaný zoznam",
"pad.toolbar.ul.title": "Odrážkový zoznam",
"pad.toolbar.strikethrough.title": "Prečiarknuté (Ctrl+5)",
"pad.toolbar.ol.title": "Usporiadaný zoznam (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Nezoradený zoznam (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Zväčšiť odsadenie (TAB)",
"pad.toolbar.unindent.title": "Zmenšiť odsadenie (Shift+TAB)",
"pad.toolbar.undo.title": "Späť (Ctrl-Z)",
"pad.toolbar.redo.title": "Znova (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "Odstrániť farby autorstva",
"pad.toolbar.clearAuthorship.title": "Odstrániť farby autorstva (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Import/export z/do rôznych formátov súborov",
"pad.toolbar.timeslider.title": "Časová os",
"pad.toolbar.savedRevision.title": "Uložiť revíziu",
@ -46,6 +47,7 @@
"pad.importExport.import": "Nahrať ľubovoľný textový súbor alebo dokument",
"pad.importExport.importSuccessful": "Import úspešný!",
"pad.importExport.export": "Exportovať aktuálny Pad ako:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Čistý text",
"pad.importExport.exportword": "Microsoft Word",

View File

@ -1,55 +1,59 @@
{
"@metadata": {
"authors": [
"Besnik b"
"Besnik b",
"Kosovastar"
]
},
"index.newPad": "Bllok i Ri",
"index.createOpenPad": "ose krijoni/hapni një Bllok me emrin:",
"index.newPad": "Bllok i ri",
"index.createOpenPad": "ose krijoni/hapni një bllok me emrin:",
"pad.toolbar.bold.title": "Të trasha (Ctrl-B)",
"pad.toolbar.italic.title": "Të pjerrëta (Ctrl-I)",
"pad.toolbar.underline.title": "Të nënvizuara (Ctrl-U)",
"pad.toolbar.strikethrough.title": "Hequrvije (Ctrl+5)",
"pad.toolbar.strikethrough.title": "Mbivijëzuar (Ctrl+5)",
"pad.toolbar.ol.title": "Listë e renditur (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Listë e parenditur (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Brendazi (TAB)",
"pad.toolbar.indent.title": "E dhëmbëzuar (TAB)",
"pad.toolbar.unindent.title": "Jashtazi (Shift+TAB)",
"pad.toolbar.undo.title": "Zhbëje (Ctrl-Z)",
"pad.toolbar.redo.title": "Ribëje (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "Hiqju Ngjyra Autorësish (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importoni/Eksportoni nga/në formate të tjera kartelash",
"pad.toolbar.timeslider.title": "Rrjedha kohore",
"pad.toolbar.savedRevision.title": "Ruaje Rishikimin",
"pad.toolbar.savedRevision.title": "Ruaje rishikimin",
"pad.toolbar.settings.title": "Rregullime",
"pad.toolbar.embed.title": "Ndajeni me të tjerët dhe Trupëzojeni këtë bllok",
"pad.toolbar.embed.title": "Ndajeni me të tjerët dhe trupëzojeni këtë bllok",
"pad.toolbar.showusers.title": "Shfaq përdoruesit në këtë bllok",
"pad.colorpicker.save": "Ruaje",
"pad.colorpicker.cancel": "Anuloje",
"pad.loading": "Po ngarkohet...",
"pad.loading": "Po ngarkohet…",
"pad.noCookie": "Su gjet dot cookie. Ju lutemi, lejoni cookie-t te shfletuesi juaj!",
"pad.passwordRequired": "Ju duhet një fjalëkalim që të mund të përdorni këtë bllok",
"pad.permissionDenied": "Nuk keni leje të hyni në këtë bllok",
"pad.permissionDenied": "Ju nuk keni leje t'i qaseni këtij blloku",
"pad.wrongPassword": "Fjalëkalimi juaj qe gabim",
"pad.settings.padSettings": "Rregullime blloku",
"pad.settings.myView": "Pamja Ime",
"pad.settings.myView": "Pamja ime",
"pad.settings.stickychat": "Fjalosje përherë në ekran",
"pad.settings.chatandusers": "Shfaq fjalosje dhe përdorues",
"pad.settings.colorcheck": "Ngjyra autorësish",
"pad.settings.linenocheck": "Numra rreshtash",
"pad.settings.rtlcheck": "Të lexohet lënda nga e djathta në të majtë?",
"pad.settings.fontType": "Lloj shkronjash:",
"pad.settings.fontType.normal": "Normale",
"pad.settings.fontType.monospaced": "Monospace",
"pad.settings.globalView": "Pamje Globale",
"pad.settings.language": "Gjuhë:",
"pad.settings.globalView": "Pamje e përgjithshme",
"pad.settings.language": "Gjuha:",
"pad.importExport.import_export": "Import/Eksport",
"pad.importExport.import": "Ngarkoni cilëndo kartelë teksti ose dokument",
"pad.importExport.importSuccessful": "Me sukses!",
"pad.importExport.export": "Eksportojeni bllokun e tanishëm si:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Tekst të thjeshtë",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Mund të importoni vetëm prej formati tekst i thjeshtë ose html. Për veçori më të përparuara importimi, ju lutemi, <a 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\">instaloni Abiword-in</a>.",
"pad.importExport.abiword.innerHTML": "Mund të importoni vetëm prej formati tekst i thjeshtë ose html. Për veçori më të thelluara importimi, ju lutemi, <a 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\">instaloni Abiword-in</a>.",
"pad.modals.connected": "I lidhur.",
"pad.modals.reconnecting": "Po rilidheni te blloku juaj..",
"pad.modals.forcereconnect": "Rilidhje e detyruar",
@ -57,11 +61,11 @@
"pad.modals.userdup.explanation": "Ky bllok duket se gjendet i hapur në më shumë se një dritare shfletuesi në këtë kompjuter.",
"pad.modals.userdup.advice": "Rilidhuni që të përdoret kjo dritare.",
"pad.modals.unauth": "I paautorizuar",
"pad.modals.unauth.explanation": "Ndërkohë që shihnit këtë dritare, lejet tuaja kanë ndryshuar. Provoni të rilidheni.",
"pad.modals.unauth.explanation": "Lejet tuaja ndryshuan teksa shihnit këtë dritare. Provoni të rilidheni.",
"pad.modals.looping.explanation": "Ka probleme komunikimi me shërbyesin e njëkohësimit.",
"pad.modals.looping.cause": "Ndoshta jeni lidhur përmes një firewall-i ose ndërmjetësi të papërputhshëm.",
"pad.modals.initsocketfail": "Nuk kapet dot shërbyesi.",
"pad.modals.initsocketfail.explanation": "Nuk u lidh dot te shërbyesi i njëkohësimit.",
"pad.modals.initsocketfail": "Shërbyesi (serveri) është i pakapshëm.",
"pad.modals.initsocketfail.explanation": "Nuk u lidh dot te shërbyesi (serveri) i sinkronizimit.",
"pad.modals.initsocketfail.cause": "Ka gjasa që kjo vjen për shkak të një problemi me shfletuesin tuaj ose lidhjen tuaj në internet.",
"pad.modals.slowcommit.explanation": "Shërbyesi nuk po përgjigjet.",
"pad.modals.slowcommit.cause": "Kjo mund të vijë për shkak problemesh lidhjeje me rrjetin.",
@ -84,11 +88,14 @@
"timeslider.pageTitle": "Rrjedhë kohore e {{appTitle}}",
"timeslider.toolbar.returnbutton": "Rikthehuni te blloku",
"timeslider.toolbar.authors": "Autorë:",
"timeslider.toolbar.authorsList": "Pa Autorë",
"timeslider.toolbar.authorsList": "Nuk ka autorë",
"timeslider.toolbar.exportlink.title": "Eksportoni",
"timeslider.exportCurrent": "Eksportojeni versionin e tanishëm si:",
"timeslider.version": "Versioni {{version}}",
"timeslider.saved": "Ruajtur më {{month}} {{day}}, {{year}}",
"timeslider.playPause": "Riluaj / Pusho përmbajtjet e bllokut",
"timeslider.backRevision": "Kalo një rishikim mbrapsht te ky bllok",
"timeslider.forwardRevision": "Kalo një rishikim përpara në këtë bllok",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Janar",
"timeslider.month.february": "Shkurt",
@ -104,16 +111,18 @@
"timeslider.month.december": "Dhjetor",
"timeslider.unnamedauthors": "{{num}} i paemërt {[plural(num) një: autor, tjetër: autorë ]}",
"pad.savedrevs.marked": "Ky rishikim tani është shënuar si rishikim i ruajtur",
"pad.savedrevs.timeslider": "Rishikimet e ruajtura mund ti shihni duke vizituar rrjedhjen kohore",
"pad.userlist.entername": "Jepni emrin tuaj",
"pad.userlist.unnamed": "pa emër",
"pad.userlist.guest": "Vizitor",
"pad.userlist.deny": "Hidheni Tej",
"pad.userlist.deny": "Refuzo",
"pad.userlist.approve": "Miratoje",
"pad.editbar.clearcolors": "Të hiqen ngjyra autorësish në krejt dokumentin?",
"pad.impexp.importbutton": "Importoje Tani",
"pad.impexp.importing": "Po importohet...",
"pad.impexp.importbutton": "Importoje tani",
"pad.impexp.importing": "Po importohet",
"pad.impexp.confirmimport": "Importimi i një kartele do të mbishkruajë tekstin e tanishëm të bllokut. Jeni i sigurt se doni të vazhdohet?",
"pad.impexp.convertFailed": "Nuk qemë në gjendje ta importonim këtë kartelë. Ju lutemi, përdorni një format tjetër dokumentesh ose kopjojeni dhe hidheni dorazi",
"pad.impexp.padHasData": "Ne nuk ishim në gjendje për të importuar këtë skedë, sepse ky bllok tashmë ka pasur ndryshime, ju lutem importojeni tek një bllok i ri",
"pad.impexp.uploadFailed": "Ngarkimi dështoi, ju lutemi, riprovoni",
"pad.impexp.importfailed": "Importimi dështoi",
"pad.impexp.copypaste": "Ju lutemi, kopjojeni dhe ngjiteni",

View File

@ -3,24 +3,43 @@
"authors": [
"Aktron",
"Milicevic01",
"Милан Јелисавчић"
"Милан Јелисавчић",
"Srdjan m"
]
},
"index.newPad": "Нови Пад",
"index.createOpenPad": "или направите/отворите пад следећег назива:",
"pad.toolbar.bold.title": "Подебљано (Ctrl-B)",
"pad.toolbar.italic.title": "Искошено (Ctrl-I)",
"pad.toolbar.underline.title": "Подвучено (Ctrl-U)",
"pad.toolbar.strikethrough.title": "Прецртано",
"pad.toolbar.ol.title": "Уређен списак",
"pad.toolbar.ul.title": "Неуређен списак",
"pad.toolbar.strikethrough.title": "Прецртано (Ctrl+5)",
"pad.toolbar.ol.title": "Уређен списак (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Неуређен списак (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Увлачење (TAB)",
"pad.toolbar.unindent.title": "Извлачење (Shift+TAB)",
"pad.toolbar.undo.title": "Опозови (Ctrl+Z)",
"pad.toolbar.redo.title": "Опозови (Ctrl+Z)",
"pad.toolbar.clearAuthorship.title": "Очисти ауторске боје (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Увези/извези из/на друге датотечне формате",
"pad.toolbar.timeslider.title": "Временска линија",
"pad.toolbar.savedRevision.title": "Сачувај верзију",
"pad.toolbar.settings.title": "Подешавања",
"pad.toolbar.embed.title": "Сачувај и угради овај пад",
"pad.toolbar.showusers.title": "Прикажи кориснике на овом паду",
"pad.colorpicker.save": "Сачувај",
"pad.colorpicker.cancel": "Откажи",
"pad.loading": "Учитавање...",
"pad.noCookie": "Колачић није пронађен. Молимо да укључите колачиће у вашем прегледавачу!",
"pad.passwordRequired": "Требате лозинку како бисте приступили овом паду",
"pad.permissionDenied": "Немате дозволу да приступите овом паду",
"pad.wrongPassword": "Ваша лозинка није исправна",
"pad.settings.padSettings": "Подешавања пада",
"pad.settings.myView": "Мој приказ",
"pad.settings.stickychat": "Ћаскање увек на екрану",
"pad.settings.chatandusers": "Прикажи ћаскање и кориснике",
"pad.settings.colorcheck": "Ауторске боје",
"pad.settings.linenocheck": "Бројеви редова",
"pad.settings.rtlcheck": "Читај садржај с десна на лево?",
"pad.settings.fontType": "Врста фонта:",
"pad.settings.fontType.normal": "Нормално",
"pad.settings.fontType.monospaced": "Monospace",
@ -29,18 +48,57 @@
"pad.importExport.import_export": "Увоз/извоз",
"pad.importExport.import": "Отпремите било коју текстуалну датотеку или документ",
"pad.importExport.importSuccessful": "Успело!",
"pad.importExport.export": "Извези тренутни пад као:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "чист текст",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Једино можете увести са једноставног текстуалног формата или HTML формата. За компликованије функције о увозу, молимо да <a 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\">инсталирате AbiWord</a>.",
"pad.modals.connected": "Повезано.",
"pad.modals.reconnecting": "Поново се повезујем на ваш пад..",
"pad.modals.forcereconnect": "Присилно се поново повежи",
"pad.modals.userdup": "Отворено у другом прозору",
"pad.modals.userdup.explanation": "Изгледа да је овај пад отворен у два или више прозора на овом рачунару.",
"pad.modals.userdup.advice": "Поново се повежите на овој прозор.",
"pad.modals.unauth": "Нисте овлашћени",
"pad.modals.unauth.explanation": "Ваша допуштења се се променила док сте прегледавали страницу. Покушајте се поново повезати.",
"pad.modals.looping.explanation": "Постоје комуникацијски проблеми са синхронизационим сервером.",
"pad.modals.looping.cause": "Можда сте се повезали преко неподржаног заштитног зида или проксија.",
"pad.modals.initsocketfail": "Сервер је недоступан.",
"pad.modals.initsocketfail.explanation": "Не могу се повезати на синхронизациони сервер.",
"pad.modals.initsocketfail.cause": "Највероватније је дошло до проблем са вашим прегледачем или вашом интернетском везом.",
"pad.modals.slowcommit.explanation": "Сервер не одговара.",
"pad.modals.slowcommit.cause": "Највероватније је дошло до проблема са мрежном повезаношћу.",
"pad.modals.badChangeset.explanation": "Синхронизациони сервер је уређивање које сте начили означио као неисправно.",
"pad.modals.badChangeset.cause": "Могуће да је дошло до погрешне конфигурације сервера или неког другог неочекиваног догађаја. Молимо вас да контактирате сервисног администратора ако мислите да је ово грешка. Покушајте се поново повезати како бисте наставили с уређивањем.",
"pad.modals.corruptPad.explanation": "Пад којем покушавате приступити је оштећен.",
"pad.modals.corruptPad.cause": "Могуће да је дошло до погрешне конфигурације сервера или неког другог неочекиваног догађаја. Молимо вас да контактирате сервисног администратора.",
"pad.modals.deleted": "Обрисано.",
"pad.modals.deleted.explanation": "Овај пад је уклоњен.",
"pad.modals.disconnected": "Веза је прекинута.",
"pad.modals.disconnected.explanation": "Изгубљена је веза са сервером",
"pad.modals.disconnected.cause": "Сервер није доступан. Обавестите сервисног администратора ако се ово настави дешавати.",
"pad.share": "Дели овај пад",
"pad.share.readonly": "Само за читање",
"pad.share.link": "Веза",
"pad.share.emebdcode": "Угради везу",
"pad.chat": "Ћаскање",
"pad.chat.title": "Отворите ћаскање за овај пад.",
"pad.chat.loadmessages": "Учитајте више порука.",
"timeslider.pageTitle": "{{appTitle}} временска линија",
"timeslider.toolbar.returnbutton": "Врати се на пад",
"timeslider.toolbar.authors": "Аутори:",
"timeslider.toolbar.authorsList": "Нема аутора",
"timeslider.toolbar.exportlink.title": "Извези",
"timeslider.exportCurrent": "Извези тренутну верзију као:",
"timeslider.version": "Верзија {{version}}",
"timeslider.saved": "Сачувано на {{day}}. {{month}}. {{year}}",
"timeslider.playPause": "Пусти/паузирај садржај пада",
"timeslider.backRevision": "Иди на претходну верзију овог пада",
"timeslider.forwardRevision": "Иди на следећу верзију овог пада",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "јануар",
"timeslider.month.february": "фебруар",
"timeslider.month.march": "март",
@ -53,7 +111,22 @@
"timeslider.month.october": "октобар",
"timeslider.month.november": "новембар",
"timeslider.month.december": "децембар",
"timeslider.unnamedauthors": "{{num}} неименован(и) {[plural(num) one: аутор, other: аутори ]}",
"pad.savedrevs.marked": "Ова верзија је сада означена као сачувана",
"pad.savedrevs.timeslider": "Можете видети сачуване измене користећи се временском линијом",
"pad.userlist.entername": "Упишите своје име",
"pad.userlist.unnamed": "нема имена",
"pad.userlist.guest": "Гост",
"pad.userlist.deny": "Одбиј",
"pad.userlist.approve": "одобрено",
"pad.editbar.clearcolors": "Очисти ауторске боје за цели документ?",
"pad.impexp.importbutton": "Увези одмах",
"pad.impexp.importing": "Увожење..."
"pad.impexp.importing": "Увожење...",
"pad.impexp.confirmimport": "Увоз датотеке ће преписати тренутни текст пада. Да ли сте сигурни да желите наставити?",
"pad.impexp.convertFailed": "Не можемо увести ову датотеку. Молимо да користите други формат документа или да документ копирате ручно",
"pad.impexp.padHasData": "Не можемо да увеземо ову датотеку зато што је већ било промена на овом паду, молимо да увезете нови пад",
"pad.impexp.uploadFailed": "Отпремање није успело, молимо да покушате поново",
"pad.impexp.importfailed": "Увоз неуспешан",
"pad.impexp.copypaste": "Молимо да ручно копирате",
"pad.impexp.exportdisabled": "Извоз у формату {{type}} није дозвољен. Контактирајте системског администратора за детаље."
}

View File

@ -5,7 +5,8 @@
"Erdemaslancan",
"Joseph",
"Meelo",
"Trockya"
"Trockya",
"McAang"
]
},
"index.newPad": "Yeni Bloknot",

View File

@ -6,7 +6,8 @@
"Olvin",
"Steve.rusyn",
"SteveR",
"Lxlalexlxl"
"Lxlalexlxl",
"Григорій Пугач"
]
},
"index.newPad": "Створити",
@ -97,6 +98,9 @@
"timeslider.exportCurrent": "Експортувати поточну версію як:",
"timeslider.version": "Версія {{version}}",
"timeslider.saved": "Збережено {{month}} {{day}}, {{year}}",
"timeslider.playPause": "Відтворення / Пауза Панель Зміст",
"timeslider.backRevision": "Переглянути попередню ревізію цієї панелі",
"timeslider.forwardRevision": "Переглянути наступну ревізію цієї панелі",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Січень",
"timeslider.month.february": "Лютий",
@ -112,6 +116,7 @@
"timeslider.month.december": "Грудень",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: безіменний автор, few: безіменні автори, many: безіменних авторів, other: безіменних авторів]}",
"pad.savedrevs.marked": "Цю версію помічено збереженою версією",
"pad.savedrevs.timeslider": "Ви можете побачити збережені ревізії, відвідавши \"Слайдер Змін Ревізій\"",
"pad.userlist.entername": "Введіть Ваше ім'я",
"pad.userlist.unnamed": "безіменний",
"pad.userlist.guest": "Гість",
@ -122,6 +127,7 @@
"pad.impexp.importing": "Імпорт...",
"pad.impexp.confirmimport": "Імпортування файлу перезапише поточний текст документу. Ви дійсно хочете продовжити?",
"pad.impexp.convertFailed": "Ми не можемо імпортувати цей файл. Будь ласка, використайте інший формат документу, або прямо скопіюйте та вставте",
"pad.impexp.padHasData": "Ми були не в стані імпортувати цей файл, тому що ця панель, вже відредактована, будь ласка, імпортуйте на нову панель",
"pad.impexp.uploadFailed": "Завантаження не вдалось, будь ласка, спробуйте знову",
"pad.impexp.importfailed": "Помилка при імпортуванні",
"pad.impexp.copypaste": "Будь ласка, скопіюйте та вставте",

View File

@ -82,7 +82,7 @@
"pad.modals.badChangeset.cause": "这可能是因为服务器配置的错误或者其他未预料到的行为。如果您认为这是错误,请联系服务管理员。要继续编辑,请尝试重新连接。",
"pad.modals.corruptPad.explanation": "您试图连接的记事本已损坏。",
"pad.modals.corruptPad.cause": "这可能是因为服务器配置的错误或者其他未预料到的行为。请联系服务管理员。",
"pad.modals.deleted": "已除。",
"pad.modals.deleted": "已除。",
"pad.modals.deleted.explanation": "此记事本已被移除。",
"pad.modals.disconnected": "您已断开连接。",
"pad.modals.disconnected.explanation": "到服务器的连接已丢失",

View File

@ -21,7 +21,7 @@
"pad.toolbar.indent.title": "縮排TAB",
"pad.toolbar.unindent.title": "凸排Shift+TAB",
"pad.toolbar.undo.title": "撤銷Ctrl-Z",
"pad.toolbar.redo.title": "重做Ctrl-Y",
"pad.toolbar.redo.title": "重做 (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "清除協作者顏色區別 (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "以其他檔案格式匯入/匯出",
"pad.toolbar.timeslider.title": "時間軸",

View File

@ -307,6 +307,38 @@ exports.setText = function(padID, text, callback)
});
}
/**
appendText(padID, text) appends text to 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}
*/
exports.appendText = function(padID, text, callback)
{
//text is required
if(typeof text != "string")
{
callback(new customError("text is no string","apierror"));
return;
}
//get the pad
getPadSafe(padID, true, function(err, pad)
{
if(ERR(err, callback)) return;
pad.appendText(text);
//update the clients on the pad
padMessageHandler.updatePadClients(pad, callback);
});
};
/**
getHTML(padID, [rev]) returns the html of a pad
@ -473,9 +505,9 @@ exports.getChatHistory = function(padID, start, end, callback)
end = pad.chatHead;
}
if(start >= chatHead && chatHead > 0)
if(start > chatHead)
{
callback(new customError("start is higher or equal to the current chatHead","apierror"));
callback(new customError("start is higher than the current chatHead","apierror"));
return;
}
if(end > chatHead)
@ -499,7 +531,7 @@ appendChatMessage(padID, text, authorID, time), creates a chat message for the p
Example returns:
{code: 0, message:"ok", data: null
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
*/
exports.appendChatMessage = function(padID, text, authorID, time, callback)
@ -510,15 +542,19 @@ exports.appendChatMessage = function(padID, text, authorID, time, callback)
callback(new customError("text is no string","apierror"));
return;
}
//get the pad
getPadSafe(padID, true, function(err, pad)
// if time is not an integer value
if(time === undefined || !is_int(time))
{
if(ERR(err, callback)) return;
pad.appendChatMessage(text, authorID, parseInt(time));
callback();
});
// set time to current timestamp
time = new Date().getTime();
}
var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js");
// save chat message to database and send message to all connected clients
padMessage.sendChatMessageToPadClients(parseInt(time), authorID, text, padID);
callback();
}
/*****************/

View File

@ -127,7 +127,7 @@ exports.createAuthor = function(name, callback)
var author = "a." + randomString(16);
//create the globalAuthors db entry
var authorObj = {"colorId" : Math.floor(Math.random()*32), "name": name, "timestamp": new Date().getTime()};
var authorObj = {"colorId" : Math.floor(Math.random()*(exports.getColorPalette().length)), "name": name, "timestamp": new Date().getTime()};
//set the global author db entry
db.set("globalAuthor:" + author, authorObj);

View File

@ -19,7 +19,7 @@
* limitations under the License.
*/
var ueberDB = require("ueberDB");
var ueberDB = require("ueberdb2");
var settings = require("../utils/Settings");
var log4js = require('log4js');

View File

@ -188,7 +188,12 @@ Pad.prototype.getInternalRevisionAText = function getInternalRevisionAText(targe
db.getSub("pad:"+_this.id+":revs:"+keyRev, ["meta", "atext"], function(err, _atext)
{
if(ERR(err, callback)) return;
atext = Changeset.cloneAText(_atext);
try {
atext = Changeset.cloneAText(_atext);
} catch (e) {
return callback(e);
}
callback();
});
},
@ -303,6 +308,19 @@ Pad.prototype.setText = function setText(newText) {
this.appendRevision(changeset);
};
Pad.prototype.appendText = function appendText(newText) {
//clean the new text
newText = exports.cleanText(newText);
var oldText = this.text();
//create the changeset
var changeset = Changeset.makeSplice(oldText, oldText.length, 0, newText);
//append the changeset
this.appendRevision(changeset);
};
Pad.prototype.appendChatMessage = function appendChatMessage(text, userId, time) {
this.chatHead++;
//save the chat entry in the database

View File

@ -444,10 +444,61 @@ var version =
, "getChatHead" : ["padID"]
, "restoreRevision" : ["padID", "rev"]
}
, "1.2.13":
{ "createGroup" : []
, "createGroupIfNotExistsFor" : ["groupMapper"]
, "deleteGroup" : ["groupID"]
, "listPads" : ["groupID"]
, "listAllPads" : []
, "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"]
, "getAttributePool" : ["padID"]
, "getRevisionsCount" : ["padID"]
, "getSavedRevisionsCount" : ["padID"]
, "listSavedRevisions" : ["padID"]
, "saveRevision" : ["padID", "rev"]
, "getRevisionChangeset" : ["padID", "rev"]
, "getLastEdited" : ["padID"]
, "deletePad" : ["padID"]
, "copyPad" : ["sourceID", "destinationID", "force"]
, "movePad" : ["sourceID", "destinationID", "force"]
, "getReadOnlyID" : ["padID"]
, "getPadID" : ["roID"]
, "setPublicStatus" : ["padID", "publicStatus"]
, "getPublicStatus" : ["padID"]
, "setPassword" : ["padID", "password"]
, "isPasswordProtected" : ["padID"]
, "listAuthorsOfPad" : ["padID"]
, "padUsersCount" : ["padID"]
, "getAuthorName" : ["authorID"]
, "padUsers" : ["padID"]
, "sendClientsMessage" : ["padID", "msg"]
, "listAllGroups" : []
, "checkToken" : []
, "appendChatMessage" : ["padID", "text", "authorID", "time"]
, "getChatHistory" : ["padID"]
, "getChatHistory" : ["padID", "start", "end"]
, "getChatHead" : ["padID"]
, "restoreRevision" : ["padID", "rev"]
, "appendText" : ["padID", "text"]
}
};
// set the latest available API version here
exports.latestApiVersion = '1.2.12';
exports.latestApiVersion = '1.2.13';
// exports the versions so it can be used by the new Swagger endpoint
exports.version = version;

View File

@ -30,9 +30,15 @@ var os = require('os');
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
var TidyHtml = require('../utils/TidyHtml');
var convertor = null;
//load abiword only if its enabled
if(settings.abiword != null)
var abiword = require("../utils/Abiword");
convertor = require("../utils/Abiword");
// Use LibreOffice if an executable has been defined in the settings
if(settings.soffice != null)
convertor = require("../utils/LibreOffice");
var tempDirectory = "/tmp";
@ -70,71 +76,11 @@ exports.doExport = function(req, res, padId, type)
}
else if(type == "txt")
{
var txt;
var randNum;
var srcFile, destFile;
async.series([
//render the txt document
function(callback)
{
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 + "/etherpad_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)
exporttxt.getPadTXTDocument(padId, req.params.rev, false, function(err, txt)
{
if(err && err != "stop") ERR(err);
})
if(ERR(err)) return;
res.send(txt);
});
}
else
{
@ -159,7 +105,7 @@ exports.doExport = function(req, res, padId, type)
//if this is a html export, we can send this from here directly
if(type == "html")
{
// do any final changes the plugin might want to make cake
// do any final changes the plugin might want to make
hooks.aCallFirst("exportHTMLSend", html, function(err, newHTML){
if(newHTML.length) html = newHTML;
res.send(html);
@ -183,11 +129,22 @@ exports.doExport = function(req, res, padId, type)
TidyHtml.tidy(srcFile, callback);
},
//send the convert job to abiword
//send the convert job to the convertor (abiword, libreoffice, ..)
function(callback)
{
destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type;
abiword.convertFile(srcFile, destFile, type, callback);
// Allow plugins to overwrite the convert in export process
hooks.aCallAll("exportConvert", {srcFile: srcFile, destFile: destFile, req: req, res: res}, function(err, result){
if(!err && result.length > 0){
// console.log("export handled by plugin", destFile);
handledByPlugin = true;
callback();
}else{
convertor.convertFile(srcFile, destFile, type, callback);
}
});
},
//send the file
function(callback)

View File

@ -291,9 +291,6 @@ exports.doImport = function(req, res, padId)
</head> \
<script> \
$(window).load(function(){ \
if(navigator.userAgent.indexOf('MSIE') === -1){ \
document.domain = document.domain; \
} \
var impexp = window.parent.padimpexp.handleFrameCall('" + directDatabaseAccess +"', '" + status + "'); \
}) \
</script>"

View File

@ -375,6 +375,17 @@ function handleChatMessage(client, message)
var text = message.data.text;
var padId = sessioninfos[client.id].padId;
exports.sendChatMessageToPadClients(time, userId, text, padId);
}
/**
* Sends a chat message to all clients of this pad
* @param time the timestamp of the chat message
* @param userId the author id of the chat message
* @param text the text of the chat message
* @param padId the padId to send the chat message to
*/
exports.sendChatMessageToPadClients = function (time, userId, text, padId) {
var pad;
var userName;
@ -555,6 +566,13 @@ function handleUserInfoUpdate(client, message)
//Find out the author name of this session
var author = session.author;
// Check colorId is a Hex color
var isColor = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(message.data.userInfo.colorId) // for #f00 (Thanks Smamatti)
if(!isColor){
messageLogger.warn("Dropped message, USERINFO_UPDATE Color is malformed." + message.data);
return;
}
//Tell the authorManager about the new attributes
authorManager.setAuthorColorId(author, message.data.userInfo.colorId);
authorManager.setAuthorName(author, message.data.userInfo.name);
@ -619,8 +637,8 @@ function handleUserChanges(data, cb)
messageLogger.warn("Dropped message, USER_CHANGES Message has no changeset!");
return cb();
}
//TODO: this might happen with other messages too => find one place to copy the session
//and always use the copy. atm a message will be ignored if the session is gone even
//TODO: this might happen with other messages too => find one place to copy the session
//and always use the copy. atm a message will be ignored if the session is gone even
//if the session was valid when the message arrived in the first place
if(!sessioninfos[client.id])
{
@ -949,7 +967,7 @@ function handleSwitchToPad(client, message)
roomClients[i].leave(padId);
}
}
// start up the new pad
createSessionInfo(client, message);
handleClientReady(client, message);
@ -1009,6 +1027,8 @@ function handleClientReady(client, message)
var currentTime;
var padIds;
hooks.callAll("clientReady", message);
async.series([
//Get ro/rw id:s
function (callback)
@ -1214,10 +1234,13 @@ function handleClientReady(client, message)
"serverTimestamp": new Date().getTime(),
"userId": author,
"abiwordAvailable": settings.abiwordAvailable(),
"sofficeAvailable": settings.sofficeAvailable(),
"exportAvailable": settings.exportAvailable(),
"plugins": {
"plugins": plugins.plugins,
"parts": plugins.parts,
},
"indentationOnNewLine": settings.indentationOnNewLine,
"initialChangesets": [] // FIXME: REMOVE THIS SHIT
}
@ -1354,6 +1377,12 @@ function handleChangesetRequest(client, message)
messageLogger.warn("Dropped message, changeset request has no granularity!");
return;
}
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger#Polyfill
if(Math.floor(message.data.granularity) !== message.data.granularity)
{
messageLogger.warn("Dropped message, changeset request granularity is not an integer!");
return;
}
if(message.data.start == null)
{
messageLogger.warn("Dropped message, changeset request has no start!");

View File

@ -13,9 +13,9 @@ exports.expressCreateServer = function (hook_name, args, cb) {
}
//if abiword is disabled, and this is a format we only support with abiword, output a message
if (settings.abiword == null &&
if (settings.exportAvailable() == "no" &&
["odt", "pdf", "doc"].indexOf(req.params.type) !== -1) {
res.send("Abiword is not enabled at this Etherpad instance. Set the path to Abiword in settings.json to enable this feature");
res.send("This export is not enabled at this Etherpad instance. Set the path to Abiword or SOffice in settings.json to enable this feature");
return;
}

View File

@ -16,6 +16,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
if(sanitizedPadId != padId)
{
var real_url = sanitizedPadId;
real_url = encodeURIComponent(real_url);
var query = url.parse(req.url).query;
if ( query ) real_url += '?' + query;
res.header('Location', real_url);

View File

@ -2,6 +2,7 @@ var path = require('path');
var eejs = require('ep_etherpad-lite/node/eejs');
var toolbar = require("ep_etherpad-lite/node/utils/toolbar");
var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks');
var settings = require('../../utils/Settings');
exports.expressCreateServer = function (hook_name, args, cb) {
// expose current stats
@ -33,6 +34,13 @@ exports.expressCreateServer = function (hook_name, args, cb) {
//serve pad.html under /p
args.app.get('/p/:pad', function(req, res, next)
{
// Set language for pad editor for the first time
// Or if language cookie doesn't exist
if (req.cookies.language === undefined)
{
res.cookie('language', settings.padOptions.lang);
}
// The below might break for pads being rewritten
var isReadOnly = req.url.indexOf("/p/r.") === 0;
@ -54,7 +62,7 @@ exports.expressCreateServer = function (hook_name, args, cb) {
hooks.callAll("padInitToolbar", {
toolbar: toolbar
});
res.send(eejs.require("ep_etherpad-lite/templates/timeslider.html", {
req: req,
toolbar: toolbar

View File

@ -45,7 +45,7 @@ async.waterfall([
callback(er)
})
},
// load everything
function(callback) {
settings = require('./utils/Settings');
@ -55,7 +55,7 @@ async.waterfall([
hooks.plugins = plugins;
callback();
},
//initalize the database
function (callback)
{
@ -73,7 +73,6 @@ async.waterfall([
// Call loadSettings hook
hooks.aCallAll("loadSettings", { settings: settings });
callback();
},
@ -81,6 +80,6 @@ async.waterfall([
function (callback)
{
hooks.callAll("createServer", {});
callback(null);
callback(null);
}
]);

View File

@ -19,6 +19,7 @@ var async = require("async");
var Changeset = require("ep_etherpad-lite/static/js/Changeset");
var padManager = require("../db/PadManager");
var ERR = require("async-stacktrace");
var _ = require('underscore');
var Security = require('ep_etherpad-lite/static/js/security');
var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks');
var _analyzeLine = require('./ExportHelper')._analyzeLine;
@ -77,12 +78,21 @@ function getHTMLFromAtext(pad, atext, authorColors)
var tags = ['h1', 'h2', 'strong', 'em', 'u', 's'];
var props = ['heading1', 'heading2', 'bold', 'italic', 'underline', 'strikethrough'];
// prepare tags stored as ['tag', true] to be exported
hooks.aCallAll("exportHtmlAdditionalTags", pad, function(err, newProps){
newProps.forEach(function (propName, i){
tags.push(propName);
props.push(propName);
});
});
// prepare tags stored as ['tag', 'value'] to be exported. This will generate HTML
// with tags like <span data-tag="value">
hooks.aCallAll("exportHtmlAdditionalTagsWithData", pad, function(err, newProps){
newProps.forEach(function (propName, i){
tags.push('span data-' + propName[0] + '="' + propName[1] + '"');
props.push(propName);
});
});
// holds a map of used styling attributes (*1, *2, etc) in the apool
// and maps them to an index in props
@ -115,8 +125,8 @@ function getHTMLFromAtext(pad, atext, authorColors)
var newLength = props.push(propName);
anumMap[a] = newLength -1;
css+=".removed {text-decoration: line-through; " +
"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; "+
css+=".removed {text-decoration: line-through; " +
"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; "+
"filter: alpha(opacity=80); "+
"opacity: 0.8; "+
"}\n";
@ -130,7 +140,13 @@ function getHTMLFromAtext(pad, atext, authorColors)
// this pad, and if yes puts its attrib id->props value into anumMap
props.forEach(function (propName, i)
{
var propTrueNum = apool.putAttrib([propName, true], true);
var attrib = [propName, true];
if (_.isArray(propName)) {
// propName can be in the form of ['color', 'red'],
// see hook exportHtmlAdditionalTagsWithData
attrib = propName;
}
var propTrueNum = apool.putAttrib(attrib, true);
if (propTrueNum >= 0)
{
anumMap[propTrueNum] = i;
@ -154,6 +170,12 @@ function getHTMLFromAtext(pad, atext, authorColors)
var property = props[i];
// we are not insterested on properties in the form of ['color', 'red'],
// see hook exportHtmlAdditionalTagsWithData
if (_.isArray(property)) {
return false;
}
if(property.substr(0,6) === "author"){
return stripDotFromAuthorID(property);
}
@ -165,6 +187,13 @@ function getHTMLFromAtext(pad, atext, authorColors)
return false;
}
// tags added by exportHtmlAdditionalTagsWithData will be exported as <span> with
// data attributes
function isSpanWithData(i){
var property = props[i];
return _.isArray(property);
}
function emitOpenTag(i)
{
openTags.unshift(i);
@ -186,8 +215,9 @@ function getHTMLFromAtext(pad, atext, authorColors)
{
openTags.shift();
var spanClass = getSpanClassFor(i);
var spanWithData = isSpanWithData(i);
if(spanClass){
if(spanClass || spanWithData){
assem.append('</span>');
} else {
assem.append('</');
@ -263,7 +293,7 @@ function getHTMLFromAtext(pad, atext, authorColors)
var s = taker.take(chars);
//removes the characters with the code 12. Don't know where they come
//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), "");
@ -377,7 +407,7 @@ function getHTMLFromAtext(pad, atext, authorColors)
pieces.push('<br><br>');
}
}*/
else//means we are getting closer to the lowest level of indentation or are at the same level
else//means we are getting closer to the lowest level of indentation or are at the same level
{
var toClose = lists.length > 0 ? listLevels[listLevels.length - 2] - line.listLevel : 0
if( toClose > 0){
@ -416,7 +446,8 @@ function getHTMLFromAtext(pad, atext, authorColors)
lineContent: lineContent,
apool: apool,
attribLine: attribLines[i],
text: textLines[i]
text: textLines[i],
padId: pad.id
}
var lineContentFromHook = hooks.callAllStr("getLineHTMLForExport", context, " ", " ", "");
@ -431,7 +462,7 @@ function getHTMLFromAtext(pad, atext, authorColors)
}
}
}
for (var k = lists.length - 1; k >= 0; k--)
{
if(lists[k][1] == "number")
@ -460,14 +491,17 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback)
stylesForExportCSS += css;
});
// Core inclusion of head etc.
var head =
(noDocType ? '' : '<!doctype html>\n') +
'<html lang="en">\n' + (noDocType ? '' : '<head>\n' +
var head =
(noDocType ? '' : '<!doctype html>\n') +
'<html lang="en">\n' + (noDocType ? '' : '<head>\n' +
'<title>' + Security.escapeHTML(padId) + '</title>\n' +
'<meta charset="utf-8">\n' +
'<style> * { font-family: arial, sans-serif;\n' +
'font-size: 13px;\n' +
'line-height: 17px; }' +
'<meta name="generator" content="Etherpad">\n' +
'<meta name="author" content="Etherpad">\n' +
'<meta name="changedby" content="Etherpad">\n' +
'<meta charset="utf-8">\n' +
'<style> * { font-family: arial, sans-serif;\n' +
'font-size: 13px;\n' +
'line-height: 17px; }' +
'ul.indent { list-style-type: none; }' +
'ol { list-style-type: none; padding-left:0;}' +
@ -553,8 +587,8 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback)
'ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol{ text-indent: 140px; }' +
'ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol{ text-indent: 150px; }' +
stylesForExportCSS +
'</style>\n' + '</head>\n') +
stylesForExportCSS +
'</style>\n' + '</head>\n') +
'<body>';
var foot = '</body>\n</html>\n';

View File

@ -0,0 +1,93 @@
/**
* Controls the communication with LibreOffice
*/
/*
* 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 fs = require("fs");
var os = require("os");
var path = require("path");
var settings = require("./Settings");
var spawn = require("child_process").spawn;
// Conversion tasks will be queued up, so we don't overload the system
var queue = async.queue(doConvertTask, 1);
/**
* Convert a file from one type to another
*
* @param {String} srcFile The path on disk to convert
* @param {String} destFile The path on disk where the converted file should be stored
* @param {String} type The type to convert into
* @param {Function} callback Standard callback function
*/
exports.convertFile = function(srcFile, destFile, type, callback) {
queue.push({"srcFile": srcFile, "destFile": destFile, "type": type, "callback": callback});
};
function doConvertTask(task, callback) {
var tmpDir = os.tmpdir();
async.series([
// Generate a PDF file with LibreOffice
function(callback) {
var soffice = spawn(settings.soffice, [
'--headless',
'--invisible',
'--nologo',
'--nolockcheck',
'--convert-to', task.type,
task.srcFile,
'--outdir', tmpDir
]);
var stdoutBuffer = '';
// Delegate the processing of stdout to another function
soffice.stdout.on('data', function(data) {
stdoutBuffer += data.toString();
});
// Append error messages to the buffer
soffice.stderr.on('data', function(data) {
stdoutBuffer += data.toString();
});
// Throw an exception if libreoffice failed
soffice.on('exit', function(code) {
if (code != 0) {
return callback("LibreOffice died with exit code " + code + " and message: " + stdoutBuffer);
}
callback();
})
},
// Move the PDF file to the correct place
function(callback) {
var filename = path.basename(task.srcFile);
var pdfFilename = filename.substr(0, filename.lastIndexOf('.')) + '.' + task.type;
var pdfPath = path.join(tmpDir, pdfFilename);
fs.rename(pdfPath, task.destFile, callback);
}
], function(err) {
// Invoke the callback for the local queue
callback();
// Invoke the callback for the task
task.callback(err);
});
}

View File

@ -152,6 +152,11 @@ exports.minify = true;
*/
exports.abiword = null;
/**
* The path of the libreoffice executable
*/
exports.soffice = null;
/**
* The path of the tidy executable
*/
@ -177,6 +182,11 @@ exports.disableIPlogging = false;
*/
exports.loadTest = false;
/**
* Enable indentation on new lines
*/
exports.indentationOnNewLine = true;
/*
* log4js appender configuration
*/
@ -212,14 +222,41 @@ exports.abiwordAvailable = function()
}
};
exports.sofficeAvailable = function () {
if(exports.soffice != null) {
return os.type().indexOf("Windows") != -1 ? "withoutPDF": "yes";
} else {
return "no";
}
};
exports.exportAvailable = function () {
var abiword = exports.abiwordAvailable();
var soffice = exports.sofficeAvailable();
if(abiword == "no" && soffice == "no") {
return "no";
} else if ((abiword == "withoutPDF" && soffice == "no") || (abiword == "no" && soffice == "withoutPDF")) {
return "withoutPDF";
} else {
return "yes";
}
};
// Provide git version if available
exports.getGitCommit = function() {
var version = "";
try
{
var rootPath = path.resolve(npm.dir, '..');
var ref = fs.readFileSync(rootPath + "/.git/HEAD", "utf-8");
var refPath = rootPath + "/.git/" + ref.substring(5, ref.indexOf("\n"));
if (fs.lstatSync(rootPath + '/.git').isFile()) {
rootPath = fs.readFileSync(rootPath + '/.git', "utf8");
rootPath = rootPath.split(' ').pop().trim();
} else {
rootPath += '/.git';
}
var ref = fs.readFileSync(rootPath + "/HEAD", "utf-8");
var refPath = rootPath + "/" + ref.substring(5, ref.indexOf("\n"));
version = fs.readFileSync(refPath, "utf-8");
version = version.substring(0, 7);
}
@ -239,13 +276,20 @@ exports.reloadSettings = function reloadSettings() {
// Discover where the settings file lives
var settingsFilename = argv.settings || "settings.json";
// Discover if a credential file exists
var credentialsFilename = argv.credentials || "credentials.json";
if (path.resolve(settingsFilename)===settingsFilename) {
settingsFilename = path.resolve(settingsFilename);
} else {
settingsFilename = path.resolve(path.join(exports.root, settingsFilename));
}
var settingsStr;
if (path.resolve(credentialsFilename)===credentialsFilename) {
credentialsFilename = path.resolve(credentialsFilename);
}
var settingsStr, credentialsStr;
try{
//read the settings sync
settingsStr = fs.readFileSync(settingsFilename).toString();
@ -253,8 +297,16 @@ exports.reloadSettings = function reloadSettings() {
console.warn('No settings file found. Continuing using defaults!');
}
try{
//read the credentials sync
credentialsStr = fs.readFileSync(credentialsFilename).toString();
} catch(e){
// Doesn't matter if no credentials file found..
}
// try to parse the settings
var settings;
var credentials;
try {
if(settingsStr) {
settingsStr = jsonminify(settingsStr).replace(",]","]").replace(",}","}");
@ -265,6 +317,11 @@ exports.reloadSettings = function reloadSettings() {
process.exit(1);
}
if(credentialsStr) {
credentialsStr = jsonminify(credentialsStr).replace(",]","]").replace(",}","}");
credentials = JSON.parse(credentialsStr);
}
//loop trough the settings
for(var i in settings)
{
@ -291,6 +348,32 @@ exports.reloadSettings = function reloadSettings() {
}
}
//loop trough the settings
for(var i in credentials)
{
//test if the setting start with a low character
if(i.charAt(0).search("[a-z]") !== 0)
{
console.warn("Settings should start with a low character: '" + i + "'");
}
//we know this setting, so we overwrite it
//or it's a settings hash, specific to a plugin
if(exports[i] !== undefined || i.indexOf('ep_')==0)
{
if (_.isObject(credentials[i]) && !_.isArray(credentials[i])) {
exports[i] = _.defaults(credentials[i], exports[i]);
} else {
exports[i] = credentials[i];
}
}
//this setting is unkown, output a warning and throw it away
else
{
console.warn("Unknown Setting: '" + i + "'. This setting doesn't exist or it was removed");
}
}
log4js.configure(exports.logconfig);//Configure the logging appenders
log4js.setGlobalLogLevel(exports.loglevel);//set loglevel
process.env['DEBUG'] = 'socket.io:' + exports.loglevel; // Used by SocketIO for Debug
@ -313,6 +396,20 @@ exports.reloadSettings = function reloadSettings() {
}
}
if(exports.soffice) {
fs.exists(exports.soffice, function (exists) {
if(!exists) {
var sofficeError = "SOffice does not exist at this path, check your settings file";
if(!exports.suppressErrorsInPadText) {
exports.defaultPadText = exports.defaultPadText + "\nError: " + sofficeError + suppressDisableMsg;
}
console.error(sofficeError);
exports.soffice = null;
}
});
}
if (!exports.sessionKey) {
try {
exports.sessionKey = fs.readFileSync("./SESSIONKEY.txt","utf8");

View File

@ -16,8 +16,8 @@
"request" : "2.55.0",
"etherpad-require-kernel" : "1.0.9",
"resolve" : "1.1.6",
"socket.io" : "1.3.5",
"ueberDB" : "0.2.15",
"socket.io" : "1.3.7",
"ueberdb2" : "0.3.0",
"express" : "4.12.3",
"express-session" : "1.11.1",
"cookie-parser" : "1.3.4",
@ -55,5 +55,6 @@
"repository" : { "type" : "git",
"url" : "http://github.com/ether/etherpad-lite.git"
},
"version" : "1.5.7"
"version" : "1.6.0",
"license" : "Apache-2.0"
}

View File

@ -95,6 +95,8 @@ body.grayedout { background-color: #eee !important }
font-size: 12px; /* overridden by body.style */
font-family:Arial, sans-serif; /* overridden by body.style */
line-height: 16px; /* overridden by body.style */
background-color: white;
color: black;
}
body.doesWrap {

View File

@ -217,8 +217,7 @@ li[data-key=showusers] > a #online_count {
bottom: 0px;
z-index: 1;
/* Required to fix toolbar on top/bottom of the screen on iOS: */
overflow: scroll;
/* Required to be able to scroll on iOS: */
-webkit-overflow-scrolling: touch;
}
#editorcontainer iframe {

View File

@ -232,7 +232,7 @@ stepper:active{
.timeslider-bar #editbar {
border-bottom: none;
float: right;
width: 180px;
width: auto;
}
.timeslider-bar h1 {
margin: 5px

View File

@ -4,23 +4,23 @@ var _ = require('./underscore');
var lineMarkerAttribute = 'lmkr';
// If one of these attributes are set to the first character of a
// If one of these attributes are set to the first character of a
// line it is considered as a line attribute marker i.e. attributes
// set on this marker are applied to the whole line.
// set on this marker are applied to the whole line.
// The list attribute is only maintained for compatibility reasons
var lineAttributes = [lineMarkerAttribute,'list'];
/*
The Attribute manager builds changesets based on a document
The Attribute manager builds changesets based on a document
representation for setting and removing range or line-based attributes.
@param rep the document representation to be used
@param applyChangesetCallback this callback will be called
@param applyChangesetCallback this callback will be called
once a changeset has been built.
A document representation contains
- an array `alines` containing 1 attributes string for each line
A document representation contains
- an array `alines` containing 1 attributes string for each line
- an Attribute pool `apool`
- a SkipList `lines` containing the text lines of the document.
*/
@ -30,7 +30,7 @@ var AttributeManager = function(rep, applyChangesetCallback)
this.rep = rep;
this.applyChangesetCallback = applyChangesetCallback;
this.author = '';
// If the first char in a line has one of the following attributes
// it will be considered as a line marker
};
@ -38,49 +38,106 @@ var AttributeManager = function(rep, applyChangesetCallback)
AttributeManager.lineAttributes = lineAttributes;
AttributeManager.prototype = _(AttributeManager.prototype).extend({
applyChangeset: function(changeset){
if(!this.applyChangesetCallback) return changeset;
var cs = changeset.toString();
if (!Changeset.isIdentity(cs))
{
this.applyChangesetCallback(cs);
}
return changeset;
},
/*
Sets attributes on a range
@param start [row, col] tuple pointing to the start of the range
@param end [row, col] tuple pointing to the end of the range
@param attribute: an array of attributes
@param attribs: an array of attributes
*/
setAttributesOnRange: function(start, end, attribs)
{
var builder = Changeset.builder(this.rep.lines.totalWidth());
ChangesetUtils.buildKeepToStartOfRange(this.rep, builder, start);
ChangesetUtils.buildKeepRange(this.rep, builder, start, end, attribs, this.rep.apool);
return this.applyChangeset(builder);
// instead of applying the attributes to the whole range at once, we need to apply them
// line by line, to be able to disregard the "*" used as line marker. For more details,
// see https://github.com/ether/etherpad-lite/issues/2772
var allChangesets;
for(var row = start[0]; row <= end[0]; row++) {
var rowRange = this._findRowRange(row, start, end);
var startCol = rowRange[0];
var endCol = rowRange[1];
var rowChangeset = this._setAttributesOnRangeByLine(row, startCol, endCol, attribs);
// compose changesets of all rows into a single changeset, as the range might not be continuous
// due to the presence of line markers on the rows
if (allChangesets) {
allChangesets = Changeset.compose(allChangesets.toString(), rowChangeset.toString(), this.rep.apool);
} else {
allChangesets = rowChangeset;
}
}
return this.applyChangeset(allChangesets);
},
/*
_findRowRange: function(row, start, end)
{
var startCol, endCol;
var startLineOffset = this.rep.lines.offsetOfIndex(row);
var endLineOffset = this.rep.lines.offsetOfIndex(row+1);
var lineLength = endLineOffset - startLineOffset;
// find column where range on this row starts
if (row === start[0]) { // are we on the first row of range?
startCol = start[1];
} else {
startCol = this.lineHasMarker(row) ? 1 : 0; // remove "*" used as line marker
}
// find column where range on this row ends
if (row === end[0]) { // are we on the last row of range?
endCol = end[1]; // if so, get the end of range, not end of row
} else {
endCol = lineLength - 1; // remove "\n"
}
return [startCol, endCol];
},
/*
Sets attributes on a range, by line
@param row the row where range is
@param startCol column where range starts
@param endCol column where range ends
@param attribs: an array of attributes
*/
_setAttributesOnRangeByLine: function(row, startCol, endCol, attribs)
{
var builder = Changeset.builder(this.rep.lines.totalWidth());
ChangesetUtils.buildKeepToStartOfRange(this.rep, builder, [row, startCol]);
ChangesetUtils.buildKeepRange(this.rep, builder, [row, startCol], [row, endCol], attribs, this.rep.apool);
return builder;
},
/*
Returns if the line already has a line marker
@param lineNum: the number of the line
*/
lineHasMarker: function(lineNum){
var that = this;
return _.find(lineAttributes, function(attribute){
return that.getAttributeOnLine(lineNum, attribute) != '';
return that.getAttributeOnLine(lineNum, attribute) != '';
}) !== undefined;
},
/*
Gets a specified attribute on a line
@param lineNum: the number of the line to set the attribute for
@param attributeKey: the name of the attribute to get, e.g. list
@param attributeKey: the name of the attribute to get, e.g. list
*/
getAttributeOnLine: function(lineNum, attributeName){
// get `attributeName` attribute of first char of line
@ -95,10 +152,10 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
}
return '';
},
/*
Gets all attributes on a line
@param lineNum: the number of the line to get the attribute for
@param lineNum: the number of the line to get the attribute for
*/
getAttributesOnLine: function(lineNum){
// get attributes of first char of line
@ -112,7 +169,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
{
op = opIter.next()
if(!op.attribs) return []
Changeset.eachAttribNumber(op.attribs, function(n) {
attributes.push([this.rep.apool.getAttribKey(n), this.rep.apool.getAttribValue(n)])
}.bind(this))
@ -121,33 +178,116 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
}
return [];
},
/*
Gets a given attribute on a selection
@param attributeName
@param prevChar
returns true or false if an attribute is visible in range
*/
getAttributeOnSelection: function(attributeName, prevChar){
var rep = this.rep;
if (!(rep.selStart && rep.selEnd)) return
// If we're looking for the caret attribute not the selection
// has the user already got a selection or is this purely a caret location?
var isNotSelection = (rep.selStart[0] == rep.selEnd[0] && rep.selEnd[1] === rep.selStart[1]);
if(isNotSelection){
if(prevChar){
// If it's not the start of the line
if(rep.selStart[1] !== 0){
rep.selStart[1]--;
}
}
}
var withIt = Changeset.makeAttribsString('+', [
[attributeName, 'true']
], rep.apool);
var withItRegex = new RegExp(withIt.replace(/\*/g, '\\*') + "(\\*|$)");
function hasIt(attribs)
{
return withItRegex.test(attribs);
}
return rangeHasAttrib(rep.selStart, rep.selEnd)
function rangeHasAttrib(selStart, selEnd) {
// if range is collapsed -> no attribs in range
if(selStart[1] == selEnd[1] && selStart[0] == selEnd[0]) return false
if(selStart[0] != selEnd[0]) { // -> More than one line selected
var hasAttrib = true
// from selStart to the end of the first line
hasAttrib = hasAttrib && rangeHasAttrib(selStart, [selStart[0], rep.lines.atIndex(selStart[0]).text.length])
// for all lines in between
for(var n=selStart[0]+1; n < selEnd[0]; n++) {
hasAttrib = hasAttrib && rangeHasAttrib([n, 0], [n, rep.lines.atIndex(n).text.length])
}
// for the last, potentially partial, line
hasAttrib = hasAttrib && rangeHasAttrib([selEnd[0], 0], [selEnd[0], selEnd[1]])
return hasAttrib
}
// Logic tells us we now have a range on a single line
var lineNum = selStart[0]
, start = selStart[1]
, end = selEnd[1]
, hasAttrib = true
// Iterate over attribs on this line
var opIter = Changeset.opIterator(rep.alines[lineNum])
, indexIntoLine = 0
while (opIter.hasNext()) {
var op = opIter.next();
var opStartInLine = indexIntoLine;
var opEndInLine = opStartInLine + op.chars;
if (!hasIt(op.attribs)) {
// does op overlap selection?
if (!(opEndInLine <= start || opStartInLine >= end)) {
hasAttrib = false; // since it's overlapping but hasn't got the attrib -> range hasn't got it
break;
}
}
indexIntoLine = opEndInLine;
}
return hasAttrib
}
},
/*
Gets all attributes at a position containing line number and column
@param lineNumber starting with zero
@param column starting with zero
returns a list of attributes in the format
returns a list of attributes in the format
[ ["key","value"], ["key","value"], ... ]
*/
getAttributesOnPosition: function(lineNumber, column){
// get all attributes of the line
var aline = this.rep.alines[lineNumber];
if (!aline) {
return [];
}
// iterate through all operations of a line
var opIter = Changeset.opIterator(aline);
// we need to sum up how much characters each operations take until the wanted position
var currentPointer = 0;
var attributes = [];
var attributes = [];
var currentOperation;
while (opIter.hasNext()) {
currentOperation = opIter.next();
currentPointer = currentPointer + currentOperation.chars;
currentPointer = currentPointer + currentOperation.chars;
if (currentPointer > column) {
// we got the operation of the wanted position, now collect all its attributes
Changeset.eachAttribNumber(currentOperation.attribs, function (n) {
@ -156,44 +296,44 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
this.rep.apool.getAttribValue(n)
]);
}.bind(this));
// skip the loop
return attributes;
}
}
return attributes;
},
/*
Gets all attributes at caret position
Gets all attributes at caret position
if the user selected a range, the start of the selection is taken
returns a list of attributes in the format
returns a list of attributes in the format
[ ["key","value"], ["key","value"], ... ]
*/
getAttributesOnCaret: function(){
return this.getAttributesOnPosition(this.rep.selStart[0], this.rep.selStart[1]);
},
/*
Sets a specified attribute on a line
@param lineNum: the number of the line to set the attribute for
@param attributeKey: the name of the attribute to set, e.g. list
@param attributeValue: an optional parameter to pass to the attribute (e.g. indention level)
*/
setAttributeOnLine: function(lineNum, attributeName, attributeValue){
var loc = [0,0];
var builder = Changeset.builder(this.rep.lines.totalWidth());
var hasMarker = this.lineHasMarker(lineNum);
ChangesetUtils.buildKeepRange(this.rep, builder, loc, (loc = [lineNum, 0]));
if(hasMarker){
ChangesetUtils.buildKeepRange(this.rep, builder, loc, (loc = [lineNum, 1]), [
[attributeName, attributeValue]
], this.rep.apool);
}else{
}else{
// add a line marker
builder.insert('*', [
['author', this.author],
@ -202,10 +342,10 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
[attributeName, attributeValue]
], this.rep.apool);
}
return this.applyChangeset(builder);
},
/**
* Removes a specified attribute on a line
* @param lineNum the number of the affected line
@ -221,6 +361,9 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
if (attrib[0] === attributeName && (!attributeValue || attrib[0] === attributeValue)){
found = true;
return [attributeName, ''];
}else if (attrib[0] === 'author'){
// update last author to make changes to line attributes on this line
return [attributeName, this.author];
}
return attrib;
});
@ -243,7 +386,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
return this.applyChangeset(builder);
},
/*
Toggles a line attribute for the specified line number
If a line attribute with the specified name exists with any value it will be removed
@ -256,7 +399,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
return this.getAttributeOnLine(lineNum, attributeName) ?
this.removeAttributeOnLine(lineNum, attributeName) :
this.setAttributeOnLine(lineNum, attributeName, attributeValue);
}
});

View File

@ -1628,10 +1628,12 @@ exports.applyToAText = function (cs, atext, pool) {
* @param atext {AText}
*/
exports.cloneAText = function (atext) {
return {
text: atext.text,
attribs: atext.attribs
};
if (atext) {
return {
text: atext.text,
attribs: atext.attribs
}
} else exports.error("atext is null");
};
/**

View File

@ -229,7 +229,12 @@ function Ace2Editor()
$$INCLUDE_CSS("../static/css/pad.css");
$$INCLUDE_CSS("../static/custom/pad.css");
var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path });
var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){
if (path.match(/\/\//)) { // Allow urls to external CSS - http(s):// and //some/path.css
return path;
}
return '../static/plugins/' + path;
});
includedCSS = includedCSS.concat(additionalCSS);
pushStyleTagsFor(iframeHTML, includedCSS);
@ -265,7 +270,7 @@ plugins.ensure(function () {\n\
iframeHTML: iframeHTML
});
iframeHTML.push('</head><body id="innerdocbody" role="application" class="syntax" spellcheck="false">&nbsp;</body></html>');
iframeHTML.push('</head><body id="innerdocbody" class="innerdocbody" role="application" class="syntax" spellcheck="false">&nbsp;</body></html>');
// Expose myself to global for my child frame.
var thisFunctionsName = "ChildAccessibleAce2Editor";
@ -308,14 +313,19 @@ window.onload = function () {\n\
$$INCLUDE_CSS("../static/custom/pad.css");
var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path });
var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){
if (path.match(/\/\//)) { // Allow urls to external CSS - http(s):// and //some/path.css
return path;
}
return '../static/plugins/' + path }
);
includedCSS = includedCSS.concat(additionalCSS);
pushStyleTagsFor(outerHTML, includedCSS);
// bizarrely, in FF2, a file with no "external" dependencies won't finish loading properly
// (throbs busy while typing)
outerHTML.push('<style type="text/css" title="dynamicsyntax"></style>', '<link rel="stylesheet" type="text/css" href="data:text/css,"/>', scriptTag(outerScript), '</head><body id="outerdocbody"><div id="sidediv"><!-- --></div><div id="linemetricsdiv">x</div></body></html>');
outerHTML.push('<style type="text/css" title="dynamicsyntax"></style>', '<link rel="stylesheet" type="text/css" href="data:text/css,"/>', scriptTag(outerScript), '</head><body id="outerdocbody" class="outerdocbody"><div id="sidediv" class="sidediv"><!-- --></div><div id="linemetricsdiv">x</div></body></html>');
var outerFrame = document.createElement("IFRAME");
outerFrame.name = "ace_outer";

View File

@ -21,7 +21,7 @@
*/
var _, $, jQuery, plugins, Ace2Common;
var browser = require('./browser').browser;
var browser = require('./browser');
if(browser.msie){
// Honestly fuck IE royally.
// Basically every hack we have since V11 causes a problem
@ -1894,7 +1894,11 @@ function Ace2Inner(){
var prevLine = rep.lines.prev(thisLine);
var prevLineText = prevLine.text;
var theIndent = /^ *(?:)/.exec(prevLineText)[0];
if (/[\[\(\:\{]\s*$/.exec(prevLineText)) theIndent += THE_TAB;
var shouldIndent = parent.parent.clientVars.indentationOnNewLine;
if (shouldIndent && /[\[\(\:\{]\s*$/.exec(prevLineText))
{
theIndent += THE_TAB;
}
var cs = Changeset.builder(rep.lines.totalWidth()).keep(
rep.lines.offsetOfIndex(lineNum), lineNum).insert(
theIndent, [
@ -2334,9 +2338,18 @@ function Ace2Inner(){
editorInfo.ace_setAttributeOnSelection = setAttributeOnSelection;
function getAttributeOnSelection(attributeName){
function getAttributeOnSelection(attributeName, prevChar){
if (!(rep.selStart && rep.selEnd)) return
var isNotSelection = (rep.selStart[0] == rep.selEnd[0] && rep.selEnd[1] === rep.selStart[1]);
if(isNotSelection){
if(prevChar){
// If it's not the start of the line
if(rep.selStart[1] !== 0){
rep.selStart[1]--;
}
}
}
var withIt = Changeset.makeAttribsString('+', [
[attributeName, 'true']
], rep.apool);
@ -2347,14 +2360,14 @@ function Ace2Inner(){
}
return rangeHasAttrib(rep.selStart, rep.selEnd)
function rangeHasAttrib(selStart, selEnd) {
// if range is collapsed -> no attribs in range
if(selStart[1] == selEnd[1] && selStart[0] == selEnd[0]) return false
if(selStart[0] != selEnd[0]) { // -> More than one line selected
var hasAttrib = true
// from selStart to the end of the first line
hasAttrib = hasAttrib && rangeHasAttrib(selStart, [selStart[0], rep.lines.atIndex(selStart[0]).text.length])
@ -2365,22 +2378,22 @@ function Ace2Inner(){
// for the last, potentially partial, line
hasAttrib = hasAttrib && rangeHasAttrib([selEnd[0], 0], [selEnd[0], selEnd[1]])
return hasAttrib
}
// Logic tells us we now have a range on a single line
var lineNum = selStart[0]
, start = selStart[1]
, end = selEnd[1]
, hasAttrib = true
// Iterate over attribs on this line
var opIter = Changeset.opIterator(rep.alines[lineNum])
, indexIntoLine = 0
while (opIter.hasNext()) {
var op = opIter.next();
var opStartInLine = indexIntoLine;
@ -2394,11 +2407,11 @@ function Ace2Inner(){
}
indexIntoLine = opEndInLine;
}
return hasAttrib
}
}
editorInfo.ace_getAttributeOnSelection = getAttributeOnSelection;
function toggleAttributeOnSelection(attributeName)
@ -2423,6 +2436,9 @@ function Ace2Inner(){
var opIter = Changeset.opIterator(rep.alines[n]);
var indexIntoLine = 0;
var selectionStartInLine = 0;
if (documentAttributeManager.lineHasMarker(n)) {
selectionStartInLine = 1; // ignore "*" used as line marker
}
var selectionEndInLine = rep.lines.atIndex(n).text.length; // exclude newline
if (n == selStartLine)
{
@ -2894,6 +2910,12 @@ function Ace2Inner(){
rep.selFocusAtStart = newSelFocusAtStart;
currentCallStack.repChanged = true;
hooks.callAll('aceSelectionChanged', {
rep: rep,
callstack: currentCallStack,
documentAttributeManager: documentAttributeManager,
});
return true;
//console.log("selStart: %o, selEnd: %o, focusAtStart: %s", rep.selStart, rep.selEnd,
//String(!!rep.selFocusAtStart));
@ -3629,16 +3651,10 @@ function Ace2Inner(){
var altKey = evt.altKey;
var shiftKey = evt.shiftKey;
// prevent ESC key
if (keyCode == 27)
{
evt.preventDefault();
return;
}
// Is caret potentially hidden by the chat button?
var myselection = document.getSelection(); // get the current caret selection
var caretOffsetTop = myselection.focusNode.parentNode.offsetTop | myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214
if(myselection.focusNode.wholeText){ // Is there any content? If not lineHeight will report wrong..
var lineHeight = myselection.focusNode.parentNode.offsetHeight; // line height of populated links
}else{
@ -3703,20 +3719,25 @@ function Ace2Inner(){
documentAttributeManager: documentAttributeManager,
evt:evt
});
specialHandled = (specialHandledInHook&&specialHandledInHook.length>0)?specialHandledInHook[0]:specialHandled;
// if any hook returned true, set specialHandled with true
if (specialHandledInHook) {
specialHandled = _.contains(specialHandledInHook, true);
}
if ((!specialHandled) && altKey && isTypeForSpecialKey && keyCode == 120){
// Alt F9 focuses on the File Menu and/or editbar.
// Note that while most editors use Alt F10 this is not desirable
// As ubuntu cannot use Alt F10....
// Focus on the editbar. -- TODO: Move Focus back to previous state (we know it so we can use it)
var firstEditbarElement = parent.parent.$('#editbar').children("ul").first().children().first().children().first().children().first();
$(this).blur();
$(this).blur();
firstEditbarElement.focus();
evt.preventDefault();
}
if ((!specialHandled) && altKey && keyCode == 67 && type === "keydown"){
// Alt c focuses on the Chat window
$(this).blur();
$(this).blur();
parent.parent.chat.show();
parent.parent.$("#chatinput").focus();
evt.preventDefault();
@ -3827,6 +3848,15 @@ function Ace2Inner(){
}, 0);
specialHandled = true;
}
if ((!specialHandled) && isTypeForSpecialKey && keyCode == 27)
{
// prevent esc key;
// in mozilla versions 14-19 avoid reconnecting pad.
fastIncorp(4);
evt.preventDefault();
specialHandled = true;
}
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "s" && (evt.metaKey || evt.ctrlKey) && !evt.altKey) /* Do a saved revision on ctrl S */
{
evt.preventDefault();
@ -4955,10 +4985,9 @@ function Ace2Inner(){
$(document).on("keypress", handleKeyEvent);
$(document).on("keyup", handleKeyEvent);
$(document).on("click", handleClick);
// Disabled: https://github.com/ether/etherpad-lite/issues/2546
// Will break OL re-numbering: https://github.com/ether/etherpad-lite/pull/2533
// $(document).on("cut", handleCut);
// $(document).on("cut", handleCut);
$(root).on("blur", handleBlur);
if (browser.msie)
@ -4969,14 +4998,38 @@ function Ace2Inner(){
// Don't paste on middle click of links
$(root).on("paste", function(e){
// TODO: this breaks pasting strings into URLS when using
// TODO: this breaks pasting strings into URLS when using
// Control C and Control V -- the Event is never available
// here.. :(
if(e.target.a || e.target.localName === "a"){
e.preventDefault();
}
// Call paste hook
hooks.callAll('acePaste', {
editorInfo: editorInfo,
rep: rep,
documentAttributeManager: documentAttributeManager,
e: e
});
})
// We reference document here, this is because if we don't this will expose a bug
// in Google Chrome. This bug will cause the last character on the last line to
// not fire an event when dropped into..
$(document).on("drop", function(e){
if(e.target.a || e.target.localName === "a"){
e.preventDefault();
}
// Call drop hook
hooks.callAll('aceDrop', {
editorInfo: editorInfo,
rep: rep,
documentAttributeManager: documentAttributeManager,
e: e
});
});
// CompositionEvent is not implemented below IE version 8
if ( !(browser.msie && parseInt(browser.version <= 9)) && document.documentElement)
{
@ -5321,6 +5374,12 @@ function Ace2Inner(){
level = Number(listType[2]);
}
var t = getLineListType(n);
// if already a list, deindent
if (allLinesAreList && level != 1) { level = level - 1; }
// if already indented, then add a level of indentation to the list
else if (t && !allLinesAreList) { level = level + 1; }
mods.push([n, allLinesAreList ? 'indent' + level : (t ? type + level : type + '1')]);
}
@ -5344,8 +5403,9 @@ function Ace2Inner(){
function initLineNumbers()
{
lineNumbersShown = 1;
sideDiv.innerHTML = '<table border="0" cellpadding="0" cellspacing="0" align="right"><tr><td id="sidedivinner"><div>1</div></td></tr></table>';
sideDiv.innerHTML = '<table border="0" cellpadding="0" cellspacing="0" align="right"><tr><td id="sidedivinner" class="sidedivinner"><div>1</div></td></tr></table>';
sideDivInner = outerWin.document.getElementById("sidedivinner");
$(sideDiv).addClass("sidediv");
}
function updateLineNumbers()

View File

@ -11,7 +11,7 @@ $(document).ready(function () {
//connect
var room = url + "pluginfw/installer";
socket = io.connect(room, {resource : resource});
socket = io.connect(room, {path: baseURL + "socket.io", resource : resource});
function search(searchTerm, limit) {
if(search.searchTerm != searchTerm) {

View File

@ -10,7 +10,7 @@ $(document).ready(function () {
//connect
var room = url + "settings";
socket = io.connect(room, {resource : resource});
socket = io.connect(room, {path: baseURL + "socket.io", resource : resource});
socket.on('settings', function (settings) {

View File

@ -1,11 +1,11 @@
/*!
* Bowser - a browser detector
* https://github.com/ded/bowser
* MIT License | (c) Dustin Diaz 2014
* MIT License | (c) Dustin Diaz 2015
*/
!function (name, definition) {
if (typeof module != 'undefined' && module.exports) module.exports['browser'] = definition()
if (typeof module != 'undefined' && module.exports) module.exports = definition()
else if (typeof define == 'function' && define.amd) define(definition)
else this[name] = definition()
}('bowser', function () {
@ -22,9 +22,24 @@
return (match && match.length > 1 && match[1]) || '';
}
function getSecondMatch(regex) {
var match = ua.match(regex);
return (match && match.length > 1 && match[2]) || '';
}
var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
, likeAndroid = /like android/i.test(ua)
, android = !likeAndroid && /android/i.test(ua)
, chromeos = /CrOS/.test(ua)
, silk = /silk/i.test(ua)
, sailfish = /sailfish/i.test(ua)
, tizen = /tizen/i.test(ua)
, webos = /(web|hpw)os/i.test(ua)
, windowsphone = /windows phone/i.test(ua)
, windows = !windowsphone && /windows/i.test(ua)
, mac = !iosdevice && !silk && /macintosh/i.test(ua)
, linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
, edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i)
, versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
, tablet = /tablet/i.test(ua)
, mobile = !tablet && /[^-]mobi/i.test(ua)
@ -37,12 +52,25 @@
, version: versionIdentifier || getFirstMatch(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (/windows phone/i.test(ua)) {
else if (/yabrowser/i.test(ua)) {
result = {
name: 'Yandex Browser'
, yandexbrowser: t
, version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
}
}
else if (windowsphone) {
result = {
name: 'Windows Phone'
, windowsphone: t
, msie: t
, version: getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
}
if (edgeVersion) {
result.msedge = t
result.version = edgeVersion
}
else {
result.msie = t
result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
}
}
else if (/msie|trident/i.test(ua)) {
@ -51,6 +79,20 @@
, msie: t
, version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
}
} else if (chromeos) {
result = {
name: 'Chrome'
, chromeos: t
, chromeBook: t
, chrome: t
, version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
}
} else if (/chrome.+? edge/i.test(ua)) {
result = {
name: 'Microsoft Edge'
, msedge: t
, version: edgeVersion
}
}
else if (/chrome|crios|crmo/i.test(ua)) {
result = {
@ -68,7 +110,7 @@
result.version = versionIdentifier
}
}
else if (/sailfish/i.test(ua)) {
else if (sailfish) {
result = {
name: 'Sailfish'
, sailfish: t
@ -92,7 +134,7 @@
result.firefoxos = t
}
}
else if (/silk/i.test(ua)) {
else if (silk) {
result = {
name: 'Amazon Silk'
, silk: t
@ -119,7 +161,7 @@
, version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
}
}
else if (/(web|hpw)os/i.test(ua)) {
else if (webos) {
result = {
name: 'WebOS'
, webos: t
@ -134,7 +176,7 @@
, version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
};
}
else if (/tizen/i.test(ua)) {
else if (tizen) {
result = {
name: 'Tizen'
, tizen: t
@ -148,10 +190,15 @@
, version: versionIdentifier
}
}
else result = {}
else {
result = {
name: getFirstMatch(/^(.*)\/(.*) /),
version: getSecondMatch(/^(.*)\/(.*) /)
};
}
// set webkit or gecko flag for browsers based on these engines
if (/(apple)?webkit/i.test(ua)) {
if (!result.msedge && /(apple)?webkit/i.test(ua)) {
result.name = result.name || "Webkit"
result.webkit = t
if (!result.version && versionIdentifier) {
@ -164,22 +211,28 @@
}
// set OS flags for platforms that have multiple browsers
if (android || result.silk) {
if (!result.msedge && (android || result.silk)) {
result.android = t
} else if (iosdevice) {
result[iosdevice] = t
result.ios = t
} else if (windows) {
result.windows = t
} else if (mac) {
result.mac = t
} else if (linux) {
result.linux = t
}
// OS version extraction
var osVersion = '';
if (iosdevice) {
if (result.windowsphone) {
osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
} else if (iosdevice) {
osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
osVersion = osVersion.replace(/[_\s]/g, '.');
} else if (android) {
osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
} else if (result.windowsphone) {
osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
} else if (result.webos) {
osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
} else if (result.blackberry) {
@ -203,7 +256,9 @@
// Graded Browser Support
// http://developer.yahoo.com/yui/articles/gbs
if ((result.msie && result.version >= 10) ||
if (result.msedge ||
(result.msie && result.version >= 10) ||
(result.yandexbrowser && result.version >= 15) ||
(result.chrome && result.version >= 20) ||
(result.firefox && result.version >= 20.0) ||
(result.safari && result.version >= 6) ||
@ -228,6 +283,17 @@
var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')
bowser.test = function (browserList) {
for (var i = 0; i < browserList.length; ++i) {
var browserItem = browserList[i];
if (typeof browserItem=== 'string') {
if (browserItem in bowser) {
return true;
}
}
}
return false;
}
/*
* Set our detect method to the main bowser object so we can
@ -237,4 +303,4 @@
bowser._detect = detect;
return bowser
});
});

View File

@ -1,5 +1,5 @@
/**
* This code is mostly from the old Etherpad. Please help us to comment this code.
* 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
*/
@ -351,7 +351,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
msg.userInfo.colorId = initialUserInfo.globalUserColor;
}
if (userSet[id])
{
userSet[id] = userInfo;
@ -405,7 +405,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
$("#chatloadmessagesball").css("display", "none");
// there are less than 100 messages or we reached the top
if(chat.historyPointer <= 0)
if(chat.historyPointer <= 0)
$("#chatloadmessagesbutton").css("display", "none");
else // there are still more messages, re-show the load-button
$("#chatloadmessagesbutton").css("display", "block");
@ -414,6 +414,12 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
{
callbacks.onServerMessage(msg.payload);
}
//HACKISH: User messages do not have "payload" but "userInfo", so that all "handleClientMessage_USER_" hooks would work, populate payload
//FIXME: USER_* messages to have "payload" property instead of "userInfo", seems like a quite a big work
if(msg.type.indexOf("USER_") > -1) {
msg.payload = msg.userInfo;
}
hooks.callAll('handleClientMessage_' + msg.type, {payload: msg.payload});
}
@ -441,7 +447,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad)
{
colorId = clientVars.colorPalette[colorId];
}
var cssColor = colorId;
if (inactive)
{

View File

@ -100,7 +100,7 @@ function makeContentCollector(collectStyles, abrowser, apool, domInterface, clas
function textify(str)
{
return sanitizeUnicode(
str.replace(/\n/g, '').replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' '));
str.replace(/(\n | \n)/g, ' ').replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' '));
}
function getAssoc(node, name)

View File

@ -80,7 +80,7 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument)
}
var html = [];
var preHtml = '',
var preHtml = '',
postHtml = '';
var curHTML = null;
@ -193,7 +193,8 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument)
{
if (href)
{
if(!~href.indexOf("://") && !~href.indexOf("mailto:")) // if the url doesn't include a protocol prefix, assume http
urn_schemes = new RegExp("^(about|geo|mailto|tel):");
if(!~href.indexOf("://") && !urn_schemes.test(href)) // if the url doesn't include a protocol prefix, assume http
{
href = "http://"+href;
}

View File

@ -266,7 +266,7 @@ linestylefilter.getRegexpFilter = function(regExp, tag)
linestylefilter.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]/;
linestylefilter.REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#!;()\[\]$]/.source + '|' + linestylefilter.REGEX_WORDCHAR.source + ')');
linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|mailto:|www\.)/.source + linestylefilter.REGEX_URLCHAR.source + '*(?![:.,;])' + linestylefilter.REGEX_URLCHAR.source, 'g');
linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|(about|geo|mailto|tel):|www\.)/.source + linestylefilter.REGEX_URLCHAR.source + '*(?![:.,;])' + linestylefilter.REGEX_URLCHAR.source, 'g');
linestylefilter.getURLFilter = linestylefilter.getRegexpFilter(
linestylefilter.REGEX_URL, 'url');

View File

@ -121,7 +121,7 @@ var getParameters = [
{ name: "rtl", checkVal: "true", callback: function(val) { settings.rtlIsTrue = true } },
{ name: "alwaysShowChat", checkVal: "true", callback: function(val) { chat.stickToScreen(); } },
{ name: "chatAndUsers", checkVal: "true", callback: function(val) { chat.chatAndUsers(); } },
{ name: "lang", checkVal: null, callback: function(val) { window.html10n.localize([val, 'en']); } }
{ name: "lang", checkVal: null, callback: function(val) { window.html10n.localize([val, 'en']); createCookie('language', val); } }
];
function getParams()
@ -513,7 +513,6 @@ var pad = {
_afterHandshake: function()
{
pad.clientTimeOffset = new Date().getTime() - clientVars.serverTimestamp;
//initialize the chat
chat.init(this);
getParams();
@ -522,11 +521,6 @@ var pad = {
pad.initTime = +(new Date());
pad.padOptions = clientVars.initialOptions;
if ((!browser.msie) && (!(browser.firefox && browser.version.indexOf("1.8.") == 0)))
{
document.domain = document.domain; // for comet
}
// for IE
if (browser.msie)
{

View File

@ -315,13 +315,13 @@ var padeditbar = (function()
{
var basePath = document.location.href.substring(0, document.location.href.indexOf("/p/"));
var readonlyLink = basePath + "/p/" + clientVars.readOnlyId;
$('#embedinput').val("<iframe name='embed_readonly' src='" + readonlyLink + "?showControls=true&showChat=true&showLineNumbers=true&useMonospaceFont=false' width=600 height=400></iframe>");
$('#embedinput').val('<iframe name="embed_readonly" src="' + readonlyLink + '?showControls=true&showChat=true&showLineNumbers=true&useMonospaceFont=false" width=600 height=400></iframe>');
$('#linkinput').val(readonlyLink);
}
else
{
var padurl = window.location.href.split("?")[0];
$('#embedinput').val("<iframe name='embed_readwrite' src='" + padurl + "?showControls=true&showChat=true&showLineNumbers=true&useMonospaceFont=false' width=600 height=400></iframe>");
$('#embedinput').val('<iframe name="embed_readwrite" src="' + padurl + '?showControls=true&showChat=true&showLineNumbers=true&useMonospaceFont=false" width=600 height=400></iframe>');
$('#linkinput').val(padurl);
}
}

View File

@ -1,5 +1,5 @@
/**
* This code is mostly from the old Etherpad. Please help us to comment this code.
* 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
*/
@ -46,7 +46,7 @@ var padimpexp = (function()
$('#importmessagefail').fadeOut("fast");
var ret = window.confirm(html10n.get("pad.impexp.confirmimport"));
if (ret)
{
{
currentImportTimer = window.setTimeout(function()
{
if (!currentImportTimer)
@ -61,7 +61,7 @@ var padimpexp = (function()
{
disabled: true
}).val(html10n.get("pad.impexp.importing"));
window.setTimeout(function()
{
$('#importfileinput').attr(
@ -104,7 +104,7 @@ var padimpexp = (function()
function importErrorMessage(status)
{
var msg="";
if(status === "convertFailed"){
msg = html10n.get("pad.impexp.convertFailed");
} else if(status === "uploadFailed"){
@ -112,7 +112,7 @@ var padimpexp = (function()
} else if(status === "padHasData"){
msg = html10n.get("pad.impexp.padHasData");
}
function showError(fade)
{
$('#importmessagefail').html('<strong style="color: red">'+html10n.get('pad.impexp.importfailed')+':</strong> ' + (msg || html10n.get('pad.impexp.copypaste','')))[(fade ? "fadeIn" : "show")]();
@ -206,9 +206,9 @@ var padimpexp = (function()
// activate action to import in the form
$("#importform").attr('action', pad_root_url + "/import");
//hide stuff thats not avaible if abiword is disabled
if(clientVars.abiwordAvailable == "no")
//hide stuff thats not avaible if abiword/soffice is disabled
if(clientVars.exportAvailable == "no")
{
$("#exportworda").remove();
$("#exportpdfa").remove();
@ -216,13 +216,13 @@ var padimpexp = (function()
$("#importmessageabiword").show();
}
else if(clientVars.abiwordAvailable == "withoutPDF")
else if(clientVars.exportAvailable == "withoutPDF")
{
$("#exportpdfa").remove();
$("#exportworda").attr("href", pad_root_path + "/export/doc");
$("#exportopena").attr("href", pad_root_path + "/export/odt");
$("#importexport").css({"height":"142px"});
$("#importexportline").css({"height":"142px"});
}
@ -232,7 +232,7 @@ var padimpexp = (function()
$("#exportpdfa").attr("href", pad_root_path + "/export/pdf");
$("#exportopena").attr("href", pad_root_path + "/export/odt");
}
addImportFrames();
$("#importfileinput").change(fileInputUpdated);
$('#importform').unbind("submit").submit(fileInputSubmit);

View File

@ -508,12 +508,18 @@ var paduserlist = (function()
});
//
},
users: function(){
// Returns an object of users who have been on this pad
// Firstly we have to get live data..
var userList = otherUsersInfo;
usersOnline: function()
{
// Returns an object of users who are currently online on this pad
var userList = [].concat(otherUsersInfo); // Make a copy of the otherUsersInfo, otherwise every call to users modifies the referenced array
// Now we need to add ourselves..
userList.push(myUserInfo);
return userList;
},
users: function(){
// Returns an object of users who have been on this pad
var userList = self.usersOnline();
// Now we add historical authors
var historical = clientVars.collab_client_vars.historicalAuthorData;
for (var key in historical){
@ -528,7 +534,6 @@ var paduserlist = (function()
if(exists === false){
userList.push(historical[key]);
}
}
return userList;
},

View File

@ -176,7 +176,7 @@ var padutils = {
// 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_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/?=&#;()$]/.source + '|' + _REGEX_WORDCHAR.source + ')');
var _REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|mailto:)/.source + _REGEX_URLCHAR.source + '*(?![:.,;])' + _REGEX_URLCHAR.source, 'g');
var _REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|(about|geo|mailto|tel):)/.source + _REGEX_URLCHAR.source + '*(?![:.,;])' + _REGEX_URLCHAR.source, 'g');
// returns null if no URLs, or [[startIndex1, url1], [startIndex2, url2], ...]

View File

@ -163,7 +163,7 @@
<buttOn id="button" onclick="go2Random()" data-l10n-id="index.newPad"></button>
<label id="label" for="padname" data-l10n-id="index.createOpenPad"></label>
<form action="#" onsubmit="go2Name();return false;">
<input type="text" id="padname" autofocus x-webkit-speech>
<input type="text" id="padname" maxlength="50" autofocus x-webkit-speech>
<button type="submit">OK</button>
</form>
</div>

View File

@ -100,7 +100,7 @@
</div>
<div id="editorcontainerbox">
<div id="editorcontainer"></div>
<div id="editorcontainer" class="editorcontainer"></div>
<div id="editorloadingbox">
<div id="passwordRequired">
<p data-l10n-id="pad.passwordRequired">You need a password to access this pad</p>
@ -390,10 +390,7 @@
require.setGlobalKeyPath("require");
$ = jQuery = require('ep_etherpad-lite/static/js/rjquery').jQuery; // Expose jQuery #HACK
browser = require('ep_etherpad-lite/static/js/browser').browser;
if ((!browser.msie) && (!(browser.mozilla && browser.version.indexOf("1.8.") == 0))) {
document.domain = document.domain; // for comet
}
browser = require('ep_etherpad-lite/static/js/browser');
var plugins = require('ep_etherpad-lite/static/js/pluginfw/client_plugins');
var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks');

View File

@ -68,7 +68,7 @@
<button class="stepper" id="rightstep"></button>
</div>
</div>
<div id="overlay">
<div id="overlay-inner">
<!-- -->
@ -231,30 +231,26 @@
<!-- Bootstrap -->
<script type="text/javascript" >
var clientVars = {};
var BroadcastSlider;
var BroadcastSlider;
(function () {
var pathComponents = location.pathname.split('/');
// Strip 'p', the padname and 'timeslider' from the pathname and set as baseURL
var baseURL = pathComponents.slice(0,pathComponents.length-3).join('/') + '/';
require.setRootURI(baseURL + "javascripts/src");
require.setLibraryURI(baseURL + "javascripts/lib");
require.setGlobalKeyPath("require");
$ = jQuery = require('ep_etherpad-lite/static/js/rjquery').jQuery; // Expose jQuery #HACK
browser = require('ep_etherpad-lite/static/js/browser').browser;
if ((!browser.msie) && (!(browser.mozilla && browser.version.indexOf("1.8.") == 0))) {
document.domain = document.domain; // for comet
}
browser = require('ep_etherpad-lite/static/js/browser');
var plugins = require('ep_etherpad-lite/static/js/pluginfw/client_plugins');
var socket = require('ep_etherpad-lite/static/js/timeslider').socket;
BroadcastSlider = require('ep_etherpad-lite/static/js/timeslider').BroadcastSlider;
plugins.baseURL = baseURL;
plugins.update(function () {
var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks');
hooks.plugins = plugins;

View File

@ -79,6 +79,8 @@ describe('Permission', function(){
-> movePad(newPadID, originalPadId) -- Should provide consistant pad data
-> getText(originalPadId) -- Should be "hello world"
-> getLastEdited(padID) -- Should not be 0
-> appendText(padID, "hello")
-> getText(padID) -- Should be "hello worldhello"
-> setHTML(padID) -- Should fail on invalid HTML
-> setHTML(padID) *3 -- Should fail on invalid HTML
-> getHTML(padID) -- Should return HTML close to posted HTML
@ -483,6 +485,30 @@ describe('getLastEdited', function(){
});
})
describe('appendText', function(){
it('Append text to a pad Id', function(done) {
api.get(endPoint('appendText', '1.2.13')+"&padID="+testPadId+"&text=hello")
.expect(function(res){
if(res.body.code !== 0) throw new Error("Pad Append Text failed");
})
.expect('Content-Type', /json/)
.expect(200, done);
});
});
describe('getText', function(){
it('Gets text on a pad Id', function(done) {
api.get(endPoint('getText')+"&padID="+testPadId)
.expect(function(res){
if(res.body.code !== 0) throw new Error("Pad Get Text failed");
if(res.body.data.text !== text+"hello\n") throw new Error("Pad Text not set properly");
})
.expect('Content-Type', /json/)
.expect(200, done);
});
});
describe('setHTML', function(){
it('Sets the HTML of a Pad attempting to pass ugly HTML', function(done) {
var html = "<div><b>Hello HTML</title></head></div>";
@ -542,8 +568,9 @@ describe('createPad', function(){
*/
var endPoint = function(point){
return '/api/'+apiVersion+'/'+point+'?apikey='+apiKey;
var endPoint = function(point, version){
version = version || apiVersion;
return '/api/'+version+'/'+point+'?apikey='+apiKey;
}
function makeid()

View File

@ -161,12 +161,6 @@ $(function(){
}
}
//allow cross iframe access
var browser = bowser;
if ((!browser.msie) && (!(browser.mozilla && browser.version.indexOf("1.8.") == 0))) {
document.domain = document.domain; // for comet
}
//http://stackoverflow.com/questions/1403888/get-url-parameter-with-jquery
var getURLParameter = function (name) {
return decodeURI(

View File

@ -15,7 +15,7 @@ describe("indentation button", function(){
//select this text element
$firstTextElement.sendkeys('{selectall}');
if(inner$(window)[0].bowser.firefox || inner$(window)[0].bowser.modernIE){ // if it's a mozilla or IE
if(inner$(window)[0].bowser.firefox || inner$(window)[0].bowser.modernIE){ // if it's a mozilla or IE
var evtType = "keypress";
}else{
var evtType = "keydown";
@ -31,7 +31,7 @@ describe("indentation button", function(){
});
it("indent text with button", function(done){
var inner$ = helper.padInner$;
var inner$ = helper.padInner$;
var chrome$ = helper.padChrome$;
var $indentButton = chrome$(".buttonicon-indent");
@ -43,7 +43,7 @@ describe("indentation button", function(){
});
it("keeps the indent on enter for the new line", function(done){
var inner$ = helper.padInner$;
var inner$ = helper.padInner$;
var chrome$ = helper.padChrome$;
var $indentButton = chrome$(".buttonicon-indent");
@ -51,9 +51,9 @@ describe("indentation button", function(){
//type a bit, make a line break and type again
var $firstTextElement = inner$("div span").first();
$firstTextElement.sendkeys('line 1');
$firstTextElement.sendkeys('{enter}');
$firstTextElement.sendkeys('line 2');
$firstTextElement.sendkeys('line 1');
$firstTextElement.sendkeys('{enter}');
$firstTextElement.sendkeys('line 2');
$firstTextElement.sendkeys('{enter}');
helper.waitFor(function(){
@ -68,13 +68,87 @@ describe("indentation button", function(){
});
});
it("indents text with spaces on enter if previous line ends with ':', '[', '(', or '{'", function(done){
var inner$ = helper.padInner$;
var chrome$ = helper.padChrome$;
//type a bit, make a line break and type again
var $firstTextElement = inner$("div").first();
$firstTextElement.sendkeys("line with ':'{enter}");
$firstTextElement.sendkeys("line with '['{enter}");
$firstTextElement.sendkeys("line with '('{enter}");
$firstTextElement.sendkeys("line with '{{}'{enter}");
helper.waitFor(function(){
// wait for Etherpad to split four lines into separated divs
var $fourthLine = inner$("div").first().next().next().next();
return $fourthLine.text().indexOf("line with '{'") === 0;
}).done(function(){
// we validate bottom to top for easier implementation
// curly braces
var $lineWithCurlyBraces = inner$("div").first().next().next().next();
$lineWithCurlyBraces.sendkeys('{{}');
pressEnter(); // cannot use sendkeys('{enter}') here, browser does not read the command properly
var $lineAfterCurlyBraces = inner$("div").first().next().next().next().next();
expect($lineAfterCurlyBraces.text()).to.match(/\s{4}/); // tab === 4 spaces
// parenthesis
var $lineWithParenthesis = inner$("div").first().next().next();
$lineWithParenthesis.sendkeys('(');
pressEnter();
var $lineAfterParenthesis = inner$("div").first().next().next().next();
expect($lineAfterParenthesis.text()).to.match(/\s{4}/);
// bracket
var $lineWithBracket = inner$("div").first().next();
$lineWithBracket.sendkeys('[');
pressEnter();
var $lineAfterBracket = inner$("div").first().next().next();
expect($lineAfterBracket.text()).to.match(/\s{4}/);
// colon
var $lineWithColon = inner$("div").first();
$lineWithColon.sendkeys(':');
pressEnter();
var $lineAfterColon = inner$("div").first().next();
expect($lineAfterColon.text()).to.match(/\s{4}/);
done();
});
});
it("appends indentation to the indent of previous line if previous line ends with ':', '[', '(', or '{'", function(done){
var inner$ = helper.padInner$;
var chrome$ = helper.padChrome$;
//type a bit, make a line break and type again
var $firstTextElement = inner$("div").first();
$firstTextElement.sendkeys(" line with some indentation and ':'{enter}");
$firstTextElement.sendkeys("line 2{enter}");
helper.waitFor(function(){
// wait for Etherpad to split two lines into separated divs
var $secondLine = inner$("div").first().next();
return $secondLine.text().indexOf("line 2") === 0;
}).done(function(){
var $lineWithColon = inner$("div").first();
$lineWithColon.sendkeys(':');
pressEnter();
var $lineAfterColon = inner$("div").first().next();
expect($lineAfterColon.text()).to.match(/\s{6}/); // previous line indentation + regular tab (4 spaces)
done();
});
});
/*
it("makes text indented and outdented", function() {
//get the inner iframe
var $inner = testHelper.$getPadInner();
//get the first text element out of the inner iframe
var firstTextElement = $inner.find("div").first();
@ -87,7 +161,7 @@ describe("indentation button", function(){
//ace creates a new dom element when you press a button, so just get the first text element again
var newFirstTextElement = $inner.find("div").first();
// is there a list-indent class element now?
var firstChild = newFirstTextElement.children(":first");
var isUL = firstChild.is('ul');
@ -160,12 +234,12 @@ describe("indentation button", function(){
/* this test creates the below content, both should have double indentation
line1
line2
firstTextElement.sendkeys('{rightarrow}'); // simulate a keypress of enter
firstTextElement.sendkeys('{enter}'); // simulate a keypress of enter
firstTextElement.sendkeys('line 1'); // simulate writing the first line
firstTextElement.sendkeys('{enter}'); // simulate a keypress of enter
firstTextElement.sendkeys('{enter}'); // simulate a keypress of enter
firstTextElement.sendkeys('line 2'); // simulate writing the second line
//get the second text element out of the inner iframe
@ -203,3 +277,15 @@ describe("indentation button", function(){
});*/
});
function pressEnter(){
var inner$ = helper.padInner$;
if(inner$(window)[0].bowser.firefox || inner$(window)[0].bowser.modernIE){ // if it's a mozilla or IE
var evtType = "keypress";
}else{
var evtType = "keydown";
}
var e = inner$.Event(evtType);
e.keyCode = 13; // enter :|
inner$("#innerdocbody").trigger(e);
}