Commit dcfb2879 authored by Stefan's avatar Stefan

Merge new release into master branch!

parents 83597562 ebe44b0e
......@@ -17,3 +17,4 @@ npm-debug.log
*.crt
*.key
bin/etherpad-1.deb
credentials.json
......@@ -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.
......
#!/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"
......@@ -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
......
......@@ -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
......
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);
});
});
});
});
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.");
});
});
});
......@@ -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);
......
......@@ -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 $*
......@@ -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(?)
......
......@@ -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.
......@@ -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);
};
```
......@@ -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.
......
......@@ -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": [
......
......@@ -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": "فبراير",
......
......@@ -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",
......
......@@ -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": "مارس",
......
......@@ -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": "আমদানি/রপ্তানি",