merging
This commit is contained in:
commit
4986dd11ee
|
@ -74,6 +74,10 @@ You can initially modify the settings in `settings.json`. (If you need to handle
|
||||||
|
|
||||||
You should use a dedicated database such as "mysql", if you are planning on using etherpad-in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes.
|
You should use a dedicated database such as "mysql", if you are planning on using etherpad-in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes.
|
||||||
|
|
||||||
|
## Plugins and themes
|
||||||
|
|
||||||
|
Etherpad is very customizable through plugins. Instructions for installing themes and plugins can be found in [the plugin wiki article](https://github.com/ether/etherpad-lite/wiki/Available-Plugins).
|
||||||
|
|
||||||
## Helpful resources
|
## Helpful resources
|
||||||
The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages.
|
The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
{
|
||||||
|
"@metadata": {
|
||||||
|
"authors": [
|
||||||
|
"Baloch Afghanistan"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"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.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.timeslider.title": "لغزندهٔ زمان",
|
||||||
|
"pad.toolbar.savedRevision.title": "ذخیرهسازی نسخه",
|
||||||
|
"pad.toolbar.settings.title": "تنظیمات",
|
||||||
|
"pad.toolbar.embed.title": "اشتراک و جاسازی این دفترچه یادداشت",
|
||||||
|
"pad.toolbar.showusers.title": "نمایش کاربران در این دفترچه یادداشت",
|
||||||
|
"pad.colorpicker.save": "زاپاس کورتین",
|
||||||
|
"pad.colorpicker.cancel": "کنسیل",
|
||||||
|
"pad.loading": "...بار بیت",
|
||||||
|
"pad.passwordRequired": "برای دسترسی به این دفترچه یادداشت نیاز به یک گذرواژه دارید",
|
||||||
|
"pad.permissionDenied": "شرمنده، شما را اجازت په دسترسی ای صفحه نیست.",
|
||||||
|
"pad.wrongPassword": "گذرواژهی شما درست نیست",
|
||||||
|
"pad.settings.padSettings": "تنظیمات دفترچه یادداشت",
|
||||||
|
"pad.settings.myView": "نمای من",
|
||||||
|
"pad.settings.stickychat": "گفتگو همیشه روی صفحه نمایش باشد",
|
||||||
|
"pad.settings.colorcheck": "رنگهای نویسندگی",
|
||||||
|
"pad.settings.linenocheck": "شمارهی خطوط",
|
||||||
|
"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.importSuccessful": "موفقیت آمیز بود!",
|
||||||
|
"pad.importExport.export": "برونریزی این دفترچه یادداشت با قالب:",
|
||||||
|
"pad.importExport.exporthtml": "HTML",
|
||||||
|
"pad.importExport.exportplain": "سادگین متن",
|
||||||
|
"pad.importExport.exportword": "Microsoft Word",
|
||||||
|
"pad.importExport.exportpdf": "PDF",
|
||||||
|
"pad.importExport.exportopen": "ODF (قالب سند باز)",
|
||||||
|
"pad.importExport.exportdokuwiki": "DokuWiki",
|
||||||
|
"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.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.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}} نویسندهٔ بینام",
|
||||||
|
"pad.savedrevs.marked": "این بازنویسی هم اکنون به عنوان ذخیره شده علامتگذاری شد",
|
||||||
|
"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.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید",
|
||||||
|
"pad.impexp.importfailed": "درونریزی انجام نشد",
|
||||||
|
"pad.impexp.copypaste": "کپی پیست کنید",
|
||||||
|
"pad.impexp.exportdisabled": "برونریزی با قالب {{type}} از کار افتاده است. برای جزئیات بیشتر با مدیر سیستمتان تماس بگیرید."
|
||||||
|
}
|
|
@ -12,9 +12,9 @@
|
||||||
"pad.toolbar.bold.title": "Fett (Strg-B)",
|
"pad.toolbar.bold.title": "Fett (Strg-B)",
|
||||||
"pad.toolbar.italic.title": "Kursiv (Strg-I)",
|
"pad.toolbar.italic.title": "Kursiv (Strg-I)",
|
||||||
"pad.toolbar.underline.title": "Unterstrichen (Strg-U)",
|
"pad.toolbar.underline.title": "Unterstrichen (Strg-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Durchgestrichen",
|
"pad.toolbar.strikethrough.title": "Durchgestrichen (Strg+5)",
|
||||||
"pad.toolbar.ol.title": "Nummerierte Liste",
|
"pad.toolbar.ol.title": "Nummerierte Liste (Strg+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Ungeordnete Liste",
|
"pad.toolbar.ul.title": "Ungeordnete Liste (Strg+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Einrücken (TAB)",
|
"pad.toolbar.indent.title": "Einrücken (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Ausrücken (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Ausrücken (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Rückgängig (Strg-Z)",
|
"pad.toolbar.undo.title": "Rückgängig (Strg-Z)",
|
||||||
|
|
|
@ -2,17 +2,17 @@
|
||||||
"index.newPad": "New Pad",
|
"index.newPad": "New Pad",
|
||||||
"index.createOpenPad": "or create/open a Pad with the name:",
|
"index.createOpenPad": "or create/open a Pad with the name:",
|
||||||
|
|
||||||
"pad.toolbar.bold.title": "Bold (Ctrl-B)",
|
"pad.toolbar.bold.title": "Bold (Ctrl+B)",
|
||||||
"pad.toolbar.italic.title": "Italic (Ctrl-I)",
|
"pad.toolbar.italic.title": "Italic (Ctrl+I)",
|
||||||
"pad.toolbar.underline.title": "Underline (Ctrl-U)",
|
"pad.toolbar.underline.title": "Underline (Ctrl+U)",
|
||||||
"pad.toolbar.strikethrough.title": "Strikethrough (Ctrl-5)",
|
"pad.toolbar.strikethrough.title": "Strikethrough (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Ordered list (Ctrl-Shift-N)",
|
"pad.toolbar.ol.title": "Ordered list (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Unordered List (Ctrl-Shift-L)",
|
"pad.toolbar.ul.title": "Unordered List (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Indent (TAB)",
|
"pad.toolbar.indent.title": "Indent (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Outdent (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Outdent (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Undo (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Undo (Ctrl+Z)",
|
||||||
"pad.toolbar.redo.title": "Redo (Ctrl-Y)",
|
"pad.toolbar.redo.title": "Redo (Ctrl+Y)",
|
||||||
"pad.toolbar.clearAuthorship.title": "Clear Authorship Colors",
|
"pad.toolbar.clearAuthorship.title": "Clear Authorship Colors (Ctrl+Shift+C)",
|
||||||
"pad.toolbar.import_export.title": "Import/Export from/to different file formats",
|
"pad.toolbar.import_export.title": "Import/Export from/to different file formats",
|
||||||
"pad.toolbar.timeslider.title": "Timeslider",
|
"pad.toolbar.timeslider.title": "Timeslider",
|
||||||
"pad.toolbar.savedRevision.title": "Save Revision",
|
"pad.toolbar.savedRevision.title": "Save Revision",
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
"pad.toolbar.bold.title": "Negrita (Ctrl-B)",
|
"pad.toolbar.bold.title": "Negrita (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Cursiva (Ctrl-I)",
|
"pad.toolbar.italic.title": "Cursiva (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Subrayado (Ctrl-U)",
|
"pad.toolbar.underline.title": "Subrayado (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Tachado",
|
"pad.toolbar.strikethrough.title": "Tachado (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Lista ordenada",
|
"pad.toolbar.ol.title": "Lista ordenada (Ctrl+Mayús+N)",
|
||||||
"pad.toolbar.ul.title": "Lista desordenada",
|
"pad.toolbar.ul.title": "Lista desordenada (Ctrl+Mayús+L)",
|
||||||
"pad.toolbar.indent.title": "Sangría (TAB)",
|
"pad.toolbar.indent.title": "Sangría (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Eliminar sangría (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Eliminar sangría (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Deshacer (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Deshacer (Ctrl-Z)",
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
"Rastus Vernon",
|
"Rastus Vernon",
|
||||||
"Stephane Cottin",
|
"Stephane Cottin",
|
||||||
"Tux-tn",
|
"Tux-tn",
|
||||||
"Maxim21"
|
"Maxim21",
|
||||||
|
"Boniface"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.newPad": "Nouveau pad",
|
"index.newPad": "Nouveau pad",
|
||||||
|
@ -24,9 +25,9 @@
|
||||||
"pad.toolbar.bold.title": "Gras (Ctrl-B)",
|
"pad.toolbar.bold.title": "Gras (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Italique (Ctrl-I)",
|
"pad.toolbar.italic.title": "Italique (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Souligné (Ctrl-U)",
|
"pad.toolbar.underline.title": "Souligné (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Barré",
|
"pad.toolbar.strikethrough.title": "Barré (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Liste ordonnée",
|
"pad.toolbar.ol.title": "Liste ordonnée (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Liste non ordonnée",
|
"pad.toolbar.ul.title": "Liste non ordonnée (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Indenter (TAB)",
|
"pad.toolbar.indent.title": "Indenter (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Désindenter (Maj+TAB)",
|
"pad.toolbar.unindent.title": "Désindenter (Maj+TAB)",
|
||||||
"pad.toolbar.undo.title": "Annuler (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Annuler (Ctrl-Z)",
|
||||||
|
@ -49,7 +50,7 @@
|
||||||
"pad.settings.stickychat": "Toujours afficher le chat",
|
"pad.settings.stickychat": "Toujours afficher le chat",
|
||||||
"pad.settings.colorcheck": "Couleurs d’identification",
|
"pad.settings.colorcheck": "Couleurs d’identification",
|
||||||
"pad.settings.linenocheck": "Numéros de lignes",
|
"pad.settings.linenocheck": "Numéros de lignes",
|
||||||
"pad.settings.rtlcheck": "Lecture de droite à gauche",
|
"pad.settings.rtlcheck": "Le contenu doit-il être lu de droite à gauche ?",
|
||||||
"pad.settings.fontType": "Police :",
|
"pad.settings.fontType": "Police :",
|
||||||
"pad.settings.fontType.normal": "Normal",
|
"pad.settings.fontType.normal": "Normal",
|
||||||
"pad.settings.fontType.monospaced": "Monospace",
|
"pad.settings.fontType.monospaced": "Monospace",
|
||||||
|
@ -57,7 +58,7 @@
|
||||||
"pad.settings.language": "Langue :",
|
"pad.settings.language": "Langue :",
|
||||||
"pad.importExport.import_export": "Importer/Exporter",
|
"pad.importExport.import_export": "Importer/Exporter",
|
||||||
"pad.importExport.import": "Charger un texte ou un document",
|
"pad.importExport.import": "Charger un texte ou un document",
|
||||||
"pad.importExport.importSuccessful": "Réussi!",
|
"pad.importExport.importSuccessful": "Réussi !",
|
||||||
"pad.importExport.export": "Exporter le pad actuel comme :",
|
"pad.importExport.export": "Exporter le pad actuel comme :",
|
||||||
"pad.importExport.exporthtml": "HTML",
|
"pad.importExport.exporthtml": "HTML",
|
||||||
"pad.importExport.exportplain": "Texte brut",
|
"pad.importExport.exportplain": "Texte brut",
|
||||||
|
@ -83,7 +84,7 @@
|
||||||
"pad.modals.slowcommit.cause": "Ce problème peut venir d'une mauvaise connectivité au réseau.",
|
"pad.modals.slowcommit.cause": "Ce problème peut venir d'une mauvaise connectivité au réseau.",
|
||||||
"pad.modals.badChangeset.explanation": "Une modification que vous avez effectuée a été classée comme illégale par le serveur de synchronisation.",
|
"pad.modals.badChangeset.explanation": "Une modification que vous avez effectuée a été classée comme illégale par le serveur de synchronisation.",
|
||||||
"pad.modals.badChangeset.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service, si vous pensez que c’est une erreur. Essayez de vous reconnecter pour continuer à modifier.",
|
"pad.modals.badChangeset.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service, si vous pensez que c’est une erreur. Essayez de vous reconnecter pour continuer à modifier.",
|
||||||
"pad.modals.corruptPad.explanation": "Le bloc auquel vous essayez d’accéder est corrompu.",
|
"pad.modals.corruptPad.explanation": "Le pad auquel vous essayez d’accéder est corrompu.",
|
||||||
"pad.modals.corruptPad.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service.",
|
"pad.modals.corruptPad.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service.",
|
||||||
"pad.modals.deleted": "Supprimé.",
|
"pad.modals.deleted": "Supprimé.",
|
||||||
"pad.modals.deleted.explanation": "Ce pad a été supprimé.",
|
"pad.modals.deleted.explanation": "Ce pad a été supprimé.",
|
||||||
|
@ -102,22 +103,22 @@
|
||||||
"timeslider.toolbar.authors": "Auteurs :",
|
"timeslider.toolbar.authors": "Auteurs :",
|
||||||
"timeslider.toolbar.authorsList": "Aucun auteur",
|
"timeslider.toolbar.authorsList": "Aucun auteur",
|
||||||
"timeslider.toolbar.exportlink.title": "Exporter",
|
"timeslider.toolbar.exportlink.title": "Exporter",
|
||||||
"timeslider.exportCurrent": "Exporter la version actuelle en :",
|
"timeslider.exportCurrent": "Exporter la version actuelle sous :",
|
||||||
"timeslider.version": "Version {{version}}",
|
"timeslider.version": "Version {{version}}",
|
||||||
"timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}",
|
"timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}",
|
||||||
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
|
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
|
||||||
"timeslider.month.january": "Janvier",
|
"timeslider.month.january": "janvier",
|
||||||
"timeslider.month.february": "Février",
|
"timeslider.month.february": "février",
|
||||||
"timeslider.month.march": "Mars",
|
"timeslider.month.march": "mars",
|
||||||
"timeslider.month.april": "Avril",
|
"timeslider.month.april": "avril",
|
||||||
"timeslider.month.may": "Mai",
|
"timeslider.month.may": "mai",
|
||||||
"timeslider.month.june": "Juin",
|
"timeslider.month.june": "juin",
|
||||||
"timeslider.month.july": "Juillet",
|
"timeslider.month.july": "juillet",
|
||||||
"timeslider.month.august": "Août",
|
"timeslider.month.august": "août",
|
||||||
"timeslider.month.september": "Septembre",
|
"timeslider.month.september": "septembre",
|
||||||
"timeslider.month.october": "Octobre",
|
"timeslider.month.october": "octobre",
|
||||||
"timeslider.month.november": "Novembre",
|
"timeslider.month.november": "novembre",
|
||||||
"timeslider.month.december": "Décembre",
|
"timeslider.month.december": "décembre",
|
||||||
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: auteur anonyme, other: auteurs anonymes ]}",
|
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: auteur anonyme, other: auteurs anonymes ]}",
|
||||||
"pad.savedrevs.marked": "Cette révision est maintenant marquée comme révision enregistrée",
|
"pad.savedrevs.marked": "Cette révision est maintenant marquée comme révision enregistrée",
|
||||||
"pad.userlist.entername": "Entrez votre nom",
|
"pad.userlist.entername": "Entrez votre nom",
|
||||||
|
@ -128,10 +129,10 @@
|
||||||
"pad.editbar.clearcolors": "Effacer les couleurs de paternité dans tout le document ?",
|
"pad.editbar.clearcolors": "Effacer les couleurs de paternité dans tout le document ?",
|
||||||
"pad.impexp.importbutton": "Importer maintenant",
|
"pad.impexp.importbutton": "Importer maintenant",
|
||||||
"pad.impexp.importing": "Import en cours...",
|
"pad.impexp.importing": "Import en cours...",
|
||||||
"pad.impexp.confirmimport": "Importer un fichier écrasera le texte actuel du pad. Êtes-vous sûr de vouloir le faire?",
|
"pad.impexp.confirmimport": "Importer un fichier écrasera le texte actuel du pad. Êtes-vous sûr de vouloir le faire ?",
|
||||||
"pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire un copier/coller manuel",
|
"pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire un copier/coller manuel",
|
||||||
"pad.impexp.uploadFailed": "Le téléchargement a échoué, veuillez réessayer",
|
"pad.impexp.uploadFailed": "Le téléchargement a échoué, veuillez réessayer",
|
||||||
"pad.impexp.importfailed": "Échec de l'importation",
|
"pad.impexp.importfailed": "Échec de l'importation",
|
||||||
"pad.impexp.copypaste": "Veuillez copier/coller",
|
"pad.impexp.copypaste": "Veuillez copier/coller",
|
||||||
"pad.impexp.exportdisabled": "Exporter au format {{type}} est désactivé. Veuillez contacter votre administrateur système pour plus de détails."
|
"pad.impexp.exportdisabled": "L'option d'export au format {{type}} est désactivée. Veuillez contacter votre administrateur système pour plus de détails."
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
"pad.toolbar.bold.title": "בולט (Ctrl-B)",
|
"pad.toolbar.bold.title": "בולט (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "נטוי (Ctrl-I)",
|
"pad.toolbar.italic.title": "נטוי (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "קו תחתי (Ctrl-U)",
|
"pad.toolbar.underline.title": "קו תחתי (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "קו מוחק",
|
"pad.toolbar.strikethrough.title": "קו מוחק (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "רשימה ממוספרת",
|
"pad.toolbar.ol.title": "רשימה ממוספרת (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "רשימה",
|
"pad.toolbar.ul.title": "רשימת תבליטים (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "הזחה (טאב)",
|
"pad.toolbar.indent.title": "הזחה (טאב)",
|
||||||
"pad.toolbar.unindent.title": "צמצום הזחה (שיפט–טאב)",
|
"pad.toolbar.unindent.title": "צמצום הזחה (שיפט–טאב)",
|
||||||
"pad.toolbar.undo.title": "ביטול (Ctrl-Z)",
|
"pad.toolbar.undo.title": "ביטול (Ctrl-Z)",
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"Beta16",
|
"Beta16",
|
||||||
"Gianfranco",
|
"Gianfranco",
|
||||||
"Muxator",
|
"Muxator",
|
||||||
"Vituzzu"
|
"Vituzzu",
|
||||||
|
"Macofe"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.newPad": "Nuovo Pad",
|
"index.newPad": "Nuovo Pad",
|
||||||
|
@ -12,9 +13,9 @@
|
||||||
"pad.toolbar.bold.title": "Grassetto (Ctrl-B)",
|
"pad.toolbar.bold.title": "Grassetto (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Corsivo (Ctrl-I)",
|
"pad.toolbar.italic.title": "Corsivo (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Sottolineato (Ctrl-U)",
|
"pad.toolbar.underline.title": "Sottolineato (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Barrato",
|
"pad.toolbar.strikethrough.title": "Barrato (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Elenco numerato",
|
"pad.toolbar.ol.title": "Elenco numerato (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Elenco puntato",
|
"pad.toolbar.ul.title": "Elenco puntato (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Rientro (TAB)",
|
"pad.toolbar.indent.title": "Rientro (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Riduci rientro (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Riduci rientro (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Annulla (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Annulla (Ctrl-Z)",
|
||||||
|
|
|
@ -6,16 +6,16 @@
|
||||||
},
|
},
|
||||||
"index.newPad": "新規作成",
|
"index.newPad": "新規作成",
|
||||||
"index.createOpenPad": "または作成/編集するパッド名を入力:",
|
"index.createOpenPad": "または作成/編集するパッド名を入力:",
|
||||||
"pad.toolbar.bold.title": "太字 (Ctrl-B)",
|
"pad.toolbar.bold.title": "太字 (Ctrl+B)",
|
||||||
"pad.toolbar.italic.title": "斜体 (Ctrl-I)",
|
"pad.toolbar.italic.title": "斜体 (Ctrl+I)",
|
||||||
"pad.toolbar.underline.title": "下線 (Ctrl-U)",
|
"pad.toolbar.underline.title": "下線 (Ctrl+U)",
|
||||||
"pad.toolbar.strikethrough.title": "取り消し線",
|
"pad.toolbar.strikethrough.title": "取り消し線 (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "番号付きリスト",
|
"pad.toolbar.ol.title": "番号付きリスト (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "番号なしリスト",
|
"pad.toolbar.ul.title": "番号なしリスト (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "インデント (Tab)",
|
"pad.toolbar.indent.title": "インデント (Tab)",
|
||||||
"pad.toolbar.unindent.title": "インデント解除 (Shift+Tab)",
|
"pad.toolbar.unindent.title": "インデント解除 (Shift+Tab)",
|
||||||
"pad.toolbar.undo.title": "元に戻す (Ctrl-Z)",
|
"pad.toolbar.undo.title": "元に戻す (Ctrl+Z)",
|
||||||
"pad.toolbar.redo.title": "やり直し (Ctrl-Y)",
|
"pad.toolbar.redo.title": "やり直し (Ctrl+Y)",
|
||||||
"pad.toolbar.clearAuthorship.title": "作者の色分けを消去",
|
"pad.toolbar.clearAuthorship.title": "作者の色分けを消去",
|
||||||
"pad.toolbar.import_export.title": "他の形式のファイルのインポート/エクスポート",
|
"pad.toolbar.import_export.title": "他の形式のファイルのインポート/エクスポート",
|
||||||
"pad.toolbar.timeslider.title": "タイムスライダー",
|
"pad.toolbar.timeslider.title": "タイムスライダー",
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.newPad": "Neie Pad",
|
"index.newPad": "Neie Pad",
|
||||||
"pad.toolbar.ol.title": "Numeréiert Lëscht",
|
"pad.toolbar.ol.title": "Numeréiert Lëscht (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Net-numeréiert Lëscht",
|
"pad.toolbar.ul.title": "Net-numeréiert Lëscht (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.undo.title": "Réckgängeg (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Réckgängeg (Ctrl-Z)",
|
||||||
"pad.toolbar.redo.title": "Widderhuelen (Ctrl-Y)",
|
"pad.toolbar.redo.title": "Widderhuelen (Ctrl-Y)",
|
||||||
"pad.toolbar.savedRevision.title": "Versioun späicheren",
|
"pad.toolbar.savedRevision.title": "Versioun späicheren",
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
{
|
||||||
|
"@metadata": {
|
||||||
|
"authors": [
|
||||||
|
"Hosseinblue"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"index.newPad": "تازۀ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.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.timeslider.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.loading": "...(loading)بارنیائن",
|
||||||
|
"pad.passwordRequired": "هؤمۀ رمزتؤنه گرۀکۀ-لازمۀ ئۀرا اتصال ئئ \npad",
|
||||||
|
"pad.wrongPassword": "رمزۀ تؤن دؤرس نیۀ",
|
||||||
|
"pad.settings.padSettings": "pad تنظیمۀل",
|
||||||
|
"pad.settings.myView": "نمایش-سئرکردن مه",
|
||||||
|
"pad.settings.stickychat": "چت همؤیشۀ ئۀ ولگۀ نمایش بوو",
|
||||||
|
"pad.settings.colorcheck": "رنگۀل تالیفی",
|
||||||
|
"pad.settings.linenocheck": "شؤمارۀل خطی",
|
||||||
|
"pad.settings.fontType": ":شئؤۀ فؤنت",
|
||||||
|
"pad.settings.fontType.normal": "عادی",
|
||||||
|
"pad.settings.fontType.monospaced": "پئنی-پهنا",
|
||||||
|
"pad.settings.globalView": "نمایش جئ هانی",
|
||||||
|
"pad.settings.language": ":زوون",
|
||||||
|
"pad.importExport.import_export": "در بردن/ئه نؤم ئآووردن",
|
||||||
|
"pad.importExport.import": "بارنیائن هر جور نوشته یا سندئ",
|
||||||
|
"pad.importExport.importSuccessful": "! موفق بی-پیرووز بی",
|
||||||
|
"pad.importExport.exporthtml": "html",
|
||||||
|
"pad.importExport.exportplain": "متن پئن-درئژ",
|
||||||
|
"pad.importExport.exportword": "مایکروسافت وورد",
|
||||||
|
"pad.importExport.exportpdf": "پی دی اف",
|
||||||
|
"pad.modals.connected": "وصل بیۀ",
|
||||||
|
"pad.modals.deleted": "پاک بیا-حذف بی",
|
||||||
|
"pad.share.readonly": "تنیا بخؤۀن",
|
||||||
|
"pad.share.link": "لینک",
|
||||||
|
"pad.chat": "گپ",
|
||||||
|
"pad.chat.loadmessages": "پئامۀلئ تر باره سۀر",
|
||||||
|
"timeslider.toolbar.exportlink.title": "در بِردن",
|
||||||
|
"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.importfailed": "وارد نؤنئ-خطای واردکردن"
|
||||||
|
}
|
|
@ -10,9 +10,9 @@
|
||||||
"pad.toolbar.bold.title": "Задебелено (Ctrl-B)",
|
"pad.toolbar.bold.title": "Задебелено (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Косо (Ctrl-I)",
|
"pad.toolbar.italic.title": "Косо (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Подвлечено (Ctrl-U)",
|
"pad.toolbar.underline.title": "Подвлечено (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Прецртано",
|
"pad.toolbar.strikethrough.title": "Прецртано (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Подреден список",
|
"pad.toolbar.ol.title": "Подреден список (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Неподреден список",
|
"pad.toolbar.ul.title": "Неподреден список (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Вовлекување (TAB)",
|
"pad.toolbar.indent.title": "Вовлекување (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Отстап (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Отстап (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Врати (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Врати (Ctrl-Z)",
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
"Luckas",
|
"Luckas",
|
||||||
"Tuliouel",
|
"Tuliouel",
|
||||||
"Waldir",
|
"Waldir",
|
||||||
"Imperadeiro98"
|
"Imperadeiro98",
|
||||||
|
"Macofe"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.newPad": "Nova Nota",
|
"index.newPad": "Nova Nota",
|
||||||
|
@ -13,9 +14,9 @@
|
||||||
"pad.toolbar.bold.title": "Negrito (Ctrl-B)",
|
"pad.toolbar.bold.title": "Negrito (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Itálico (Ctrl-I)",
|
"pad.toolbar.italic.title": "Itálico (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Sublinhado (Ctrl-U)",
|
"pad.toolbar.underline.title": "Sublinhado (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Riscar",
|
"pad.toolbar.strikethrough.title": "Riscar (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Lista ordenada",
|
"pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Lista desordenada",
|
"pad.toolbar.ul.title": "Lista desordenada (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Avançar (TAB)",
|
"pad.toolbar.indent.title": "Avançar (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Recuar (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Recuar (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Desfazer (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Desfazer (Ctrl-Z)",
|
||||||
|
@ -71,6 +72,7 @@
|
||||||
"pad.modals.disconnected.cause": "O servidor pode estar indisponível. Por favor, notifique o administrador de serviço se isto continuar a acontecer.",
|
"pad.modals.disconnected.cause": "O servidor pode estar indisponível. Por favor, notifique o administrador de serviço se isto continuar a acontecer.",
|
||||||
"pad.share": "Compartilhar este pad",
|
"pad.share": "Compartilhar este pad",
|
||||||
"pad.share.readonly": "Somente para leitura",
|
"pad.share.readonly": "Somente para leitura",
|
||||||
|
"pad.share.link": "Ligação",
|
||||||
"pad.chat": "Bate-papo",
|
"pad.chat": "Bate-papo",
|
||||||
"pad.chat.title": "Abrir o bate-papo para este pad.",
|
"pad.chat.title": "Abrir o bate-papo para este pad.",
|
||||||
"pad.chat.loadmessages": "Carregar mais mensagens",
|
"pad.chat.loadmessages": "Carregar mais mensagens",
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
"pad.toolbar.bold.title": "Fet (Ctrl-B)",
|
"pad.toolbar.bold.title": "Fet (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Kursiv (Ctrl-I)",
|
"pad.toolbar.italic.title": "Kursiv (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Understruken (Ctrl-U)",
|
"pad.toolbar.underline.title": "Understruken (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Genomstruken",
|
"pad.toolbar.strikethrough.title": "Genomstruken (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Numrerad lista",
|
"pad.toolbar.ol.title": "Numrerad lista (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Osorterad lista",
|
"pad.toolbar.ul.title": "Onumrerad lista (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Öka indrag (TABB)",
|
"pad.toolbar.indent.title": "Öka indrag (TABB)",
|
||||||
"pad.toolbar.unindent.title": "Minska indrag (Shift+TABB)",
|
"pad.toolbar.unindent.title": "Minska indrag (Shift+TABB)",
|
||||||
"pad.toolbar.undo.title": "Ångra (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Ångra (Ctrl-Z)",
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
"pad.importExport.exportpdf": "PDF",
|
"pad.importExport.exportpdf": "PDF",
|
||||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||||
"pad.importExport.exportdokuwiki": "DokuWiki",
|
"pad.importExport.exportdokuwiki": "DokuWiki",
|
||||||
"pad.importExport.abiword.innerHTML": "Du kan endast importera från oformaterad text eller html-format. För mer avancerade importeringsfunktioner, var god <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\">installera abiword</a>.",
|
"pad.importExport.abiword.innerHTML": "Du kan endast importera från oformaterad text eller HTML-format. För mer avancerade importeringsfunktioner, var god <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\">installera abiword</a>.",
|
||||||
"pad.modals.connected": "Ansluten.",
|
"pad.modals.connected": "Ansluten.",
|
||||||
"pad.modals.reconnecting": "Återansluter till ditt block...",
|
"pad.modals.reconnecting": "Återansluter till ditt block...",
|
||||||
"pad.modals.forcereconnect": "Tvinga återanslutning",
|
"pad.modals.forcereconnect": "Tvinga återanslutning",
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
"pad.modals.userdup.explanation": "Detta block verkar vara öppet i mer än ett fönster på denna dator.",
|
"pad.modals.userdup.explanation": "Detta block verkar vara öppet i mer än ett fönster på denna dator.",
|
||||||
"pad.modals.userdup.advice": "Återanslut för att använda detta fönster istället.",
|
"pad.modals.userdup.advice": "Återanslut för att använda detta fönster istället.",
|
||||||
"pad.modals.unauth": "Inte godkänd",
|
"pad.modals.unauth": "Inte godkänd",
|
||||||
"pad.modals.unauth.explanation": "Din behörighet ändrades medan du visar denna sida. Försök att återansluta.",
|
"pad.modals.unauth.explanation": "Din behörighet ändrades medan du visade denna sida. Försök att återansluta.",
|
||||||
"pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppstått.",
|
"pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppstått.",
|
||||||
"pad.modals.looping.cause": "Kanske du är ansluten via en inkompatibel brandvägg eller proxy.",
|
"pad.modals.looping.cause": "Kanske du är ansluten via en inkompatibel brandvägg eller proxy.",
|
||||||
"pad.modals.initsocketfail": "Servern kan inte nås.",
|
"pad.modals.initsocketfail": "Servern kan inte nås.",
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
"pad.modals.slowcommit.explanation": "Servern svarar inte.",
|
"pad.modals.slowcommit.explanation": "Servern svarar inte.",
|
||||||
"pad.modals.slowcommit.cause": "Detta kan bero på problem med nätverksanslutningen.",
|
"pad.modals.slowcommit.cause": "Detta kan bero på problem med nätverksanslutningen.",
|
||||||
"pad.modals.badChangeset.explanation": "En redigering som du gjort klassificerades som otillåten av synkroniseringsservern.",
|
"pad.modals.badChangeset.explanation": "En redigering som du gjort klassificerades som otillåten av synkroniseringsservern.",
|
||||||
"pad.modals.badChangeset.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören om du anser att detta är ett fel. Försök ansluta igen för att fortsätta redigera.",
|
"pad.modals.badChangeset.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänsteadministratören om du upplever att detta är ett fel. Försök att ansluta igen för att fortsätta redigera.",
|
||||||
"pad.modals.corruptPad.explanation": "Blocket du försöker komma åt är skadat.",
|
"pad.modals.corruptPad.explanation": "Blocket du försöker komma åt är skadat.",
|
||||||
"pad.modals.corruptPad.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören.",
|
"pad.modals.corruptPad.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören.",
|
||||||
"pad.modals.deleted": "Raderad.",
|
"pad.modals.deleted": "Raderad.",
|
||||||
|
@ -84,7 +84,7 @@
|
||||||
"pad.chat": "Chatt",
|
"pad.chat": "Chatt",
|
||||||
"pad.chat.title": "Öppna chatten för detta block.",
|
"pad.chat.title": "Öppna chatten för detta block.",
|
||||||
"pad.chat.loadmessages": "Läs in fler meddelanden",
|
"pad.chat.loadmessages": "Läs in fler meddelanden",
|
||||||
"timeslider.pageTitle": "Tidsreglage för {{appTitle}}",
|
"timeslider.pageTitle": "{{appTitle}} tidsreglage",
|
||||||
"timeslider.toolbar.returnbutton": "Återvänd till blocket",
|
"timeslider.toolbar.returnbutton": "Återvänd till blocket",
|
||||||
"timeslider.toolbar.authors": "Författare:",
|
"timeslider.toolbar.authors": "Författare:",
|
||||||
"timeslider.toolbar.authorsList": "Inga författare",
|
"timeslider.toolbar.authorsList": "Inga författare",
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"Emperyan",
|
"Emperyan",
|
||||||
"Erdemaslancan",
|
"Erdemaslancan",
|
||||||
"Joseph",
|
"Joseph",
|
||||||
"Meelo"
|
"Meelo",
|
||||||
|
"Trockya"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.newPad": "Yeni Bloknot",
|
"index.newPad": "Yeni Bloknot",
|
||||||
|
@ -12,13 +13,13 @@
|
||||||
"pad.toolbar.bold.title": "Kalın (Ctrl-B)",
|
"pad.toolbar.bold.title": "Kalın (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "Eğik (Ctrl-I)",
|
"pad.toolbar.italic.title": "Eğik (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Altı Çizili (Ctrl-U)",
|
"pad.toolbar.underline.title": "Altı Çizili (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Üstü Çizili",
|
"pad.toolbar.strikethrough.title": "Üstü Çizili (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Sıralı liste",
|
"pad.toolbar.ol.title": "Sıralı liste (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Sırasız Liste",
|
"pad.toolbar.ul.title": "Sırasız Liste (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Girintiyi arttır (TAB)",
|
"pad.toolbar.indent.title": "Girintiyi arttır (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Girintiyi azalt (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Girintiyi azalt (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Geri Al (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Geri Al (Ctrl-Z)",
|
||||||
"pad.toolbar.redo.title": "Yenile (Ctrl-Y)",
|
"pad.toolbar.redo.title": "Yinele (Ctrl+Y)",
|
||||||
"pad.toolbar.clearAuthorship.title": "Yazarlık Renklerini Temizle",
|
"pad.toolbar.clearAuthorship.title": "Yazarlık Renklerini Temizle",
|
||||||
"pad.toolbar.import_export.title": "Farklı dosya biçimlerini içeri/dışarı aktar",
|
"pad.toolbar.import_export.title": "Farklı dosya biçimlerini içeri/dışarı aktar",
|
||||||
"pad.toolbar.timeslider.title": "Zaman Çizelgesi",
|
"pad.toolbar.timeslider.title": "Zaman Çizelgesi",
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
"Baonguyen21022003",
|
"Baonguyen21022003",
|
||||||
"Minh Nguyen",
|
"Minh Nguyen",
|
||||||
"Tuankiet65"
|
"Tuankiet65",
|
||||||
|
"Max20091"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.newPad": "Tạo một Pad mới",
|
"index.newPad": "Tạo một Pad mới",
|
||||||
|
@ -11,9 +12,9 @@
|
||||||
"pad.toolbar.bold.title": "In đậm (Ctrl-B)",
|
"pad.toolbar.bold.title": "In đậm (Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "In nghiêng (Ctrl-I)",
|
"pad.toolbar.italic.title": "In nghiêng (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "Gạch chân (Ctrl-U)",
|
"pad.toolbar.underline.title": "Gạch chân (Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "Gạch ngang",
|
"pad.toolbar.strikethrough.title": "Gạch ngang (Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "Danh sách Có Đánh số",
|
"pad.toolbar.ol.title": "Danh sách Có Đánh số (Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "Danh sách Không Đánh số",
|
"pad.toolbar.ul.title": "Danh sách Không Đánh số (Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "Tăng lề (TAB)",
|
"pad.toolbar.indent.title": "Tăng lề (TAB)",
|
||||||
"pad.toolbar.unindent.title": "Giảm lề (Shift+TAB)",
|
"pad.toolbar.unindent.title": "Giảm lề (Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "Hoàn tác (Ctrl-Z)",
|
"pad.toolbar.undo.title": "Hoàn tác (Ctrl-Z)",
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
"pad.toolbar.bold.title": "粗体(Ctrl-B)",
|
"pad.toolbar.bold.title": "粗体(Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "斜体 (Ctrl-I)",
|
"pad.toolbar.italic.title": "斜体 (Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "下划线(Ctrl-U)",
|
"pad.toolbar.underline.title": "下划线(Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "删除线",
|
"pad.toolbar.strikethrough.title": "删除线(Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "有序列表",
|
"pad.toolbar.ol.title": "有序列表(Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "无序列表",
|
"pad.toolbar.ul.title": "无序列表(Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "增加缩进(TAB)",
|
"pad.toolbar.indent.title": "增加缩进(TAB)",
|
||||||
"pad.toolbar.unindent.title": "减少缩进(Shift+TAB)",
|
"pad.toolbar.unindent.title": "减少缩进(Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "撤消 (Ctrl-Z)",
|
"pad.toolbar.undo.title": "撤消 (Ctrl-Z)",
|
||||||
|
|
|
@ -14,9 +14,9 @@
|
||||||
"pad.toolbar.bold.title": "粗體(Ctrl-B)",
|
"pad.toolbar.bold.title": "粗體(Ctrl-B)",
|
||||||
"pad.toolbar.italic.title": "斜體(Ctrl-I)",
|
"pad.toolbar.italic.title": "斜體(Ctrl-I)",
|
||||||
"pad.toolbar.underline.title": "底線(Ctrl-U)",
|
"pad.toolbar.underline.title": "底線(Ctrl-U)",
|
||||||
"pad.toolbar.strikethrough.title": "刪除線",
|
"pad.toolbar.strikethrough.title": "刪除線(Ctrl+5)",
|
||||||
"pad.toolbar.ol.title": "有序清單",
|
"pad.toolbar.ol.title": "有序清單(Ctrl+Shift+N)",
|
||||||
"pad.toolbar.ul.title": "無序清單",
|
"pad.toolbar.ul.title": "無序清單(Ctrl+Shift+L)",
|
||||||
"pad.toolbar.indent.title": "縮排(TAB)",
|
"pad.toolbar.indent.title": "縮排(TAB)",
|
||||||
"pad.toolbar.unindent.title": "凸排(Shift+TAB)",
|
"pad.toolbar.unindent.title": "凸排(Shift+TAB)",
|
||||||
"pad.toolbar.undo.title": "撤銷(Ctrl-Z)",
|
"pad.toolbar.undo.title": "撤銷(Ctrl-Z)",
|
||||||
|
@ -94,7 +94,7 @@
|
||||||
"timeslider.toolbar.exportlink.title": "匯出",
|
"timeslider.toolbar.exportlink.title": "匯出",
|
||||||
"timeslider.exportCurrent": "匯出當前版本為:",
|
"timeslider.exportCurrent": "匯出當前版本為:",
|
||||||
"timeslider.version": "版本{{version}}",
|
"timeslider.version": "版本{{version}}",
|
||||||
"timeslider.saved": "{{year}}年{{month}}月{{day}}日儲存",
|
"timeslider.saved": "{{year}}年{{month}}{{day}}日儲存",
|
||||||
"timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}:{{minutes}}:{{seconds}}",
|
"timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}:{{minutes}}:{{seconds}}",
|
||||||
"timeslider.month.january": "1月",
|
"timeslider.month.january": "1月",
|
||||||
"timeslider.month.february": "2月",
|
"timeslider.month.february": "2月",
|
||||||
|
|
|
@ -575,6 +575,117 @@ exports.deletePad = function(padID, callback)
|
||||||
pad.remove(callback);
|
pad.remove(callback);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
restoreRevision(padID, [rev]) Restores revision from past as new changeset
|
||||||
|
|
||||||
|
Example returns:
|
||||||
|
|
||||||
|
{code:0, message:"ok", data:null}
|
||||||
|
{code: 1, message:"padID does not exist", data: null}
|
||||||
|
*/
|
||||||
|
exports.restoreRevision = function (padID, rev, callback)
|
||||||
|
{
|
||||||
|
var Changeset = require("ep_etherpad-lite/static/js/Changeset");
|
||||||
|
var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js");
|
||||||
|
|
||||||
|
//check if rev is a number
|
||||||
|
if (rev !== undefined && typeof rev != "number")
|
||||||
|
{
|
||||||
|
//try to parse the number
|
||||||
|
if (!isNaN(parseInt(rev)))
|
||||||
|
{
|
||||||
|
rev = parseInt(rev);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
callback(new customError("rev is not a number", "apierror"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//ensure this is not a negativ number
|
||||||
|
if (rev !== undefined && rev < 0)
|
||||||
|
{
|
||||||
|
callback(new customError("rev is a negativ number", "apierror"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//ensure this is not a float value
|
||||||
|
if (rev !== undefined && !is_int(rev))
|
||||||
|
{
|
||||||
|
callback(new customError("rev is a float value", "apierror"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//get the pad
|
||||||
|
getPadSafe(padID, true, function (err, pad)
|
||||||
|
{
|
||||||
|
if (ERR(err, callback)) return;
|
||||||
|
|
||||||
|
|
||||||
|
//check if this is a valid revision
|
||||||
|
if (rev > pad.getHeadRevisionNumber())
|
||||||
|
{
|
||||||
|
callback(new customError("rev is higher than the head revision of the pad", "apierror"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pad.getInternalRevisionAText(rev, function (err, atext)
|
||||||
|
{
|
||||||
|
if (ERR(err, callback)) return;
|
||||||
|
|
||||||
|
var oldText = pad.text();
|
||||||
|
atext.text += "\n";
|
||||||
|
function eachAttribRun(attribs, func)
|
||||||
|
{
|
||||||
|
var attribsIter = Changeset.opIterator(attribs);
|
||||||
|
var textIndex = 0;
|
||||||
|
var newTextStart = 0;
|
||||||
|
var newTextEnd = atext.text.length;
|
||||||
|
while (attribsIter.hasNext())
|
||||||
|
{
|
||||||
|
var op = attribsIter.next();
|
||||||
|
var nextIndex = textIndex + op.chars;
|
||||||
|
if (!(nextIndex <= newTextStart || textIndex >= newTextEnd))
|
||||||
|
{
|
||||||
|
func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs);
|
||||||
|
}
|
||||||
|
textIndex = nextIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a new changeset with a helper builder object
|
||||||
|
var builder = Changeset.builder(oldText.length);
|
||||||
|
|
||||||
|
// assemble each line into the builder
|
||||||
|
eachAttribRun(atext.attribs, function (start, end, attribs)
|
||||||
|
{
|
||||||
|
builder.insert(atext.text.substring(start, end), attribs);
|
||||||
|
});
|
||||||
|
|
||||||
|
var lastNewlinePos = oldText.lastIndexOf('\n');
|
||||||
|
if (lastNewlinePos < 0)
|
||||||
|
{
|
||||||
|
builder.remove(oldText.length - 1, 0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
builder.remove(lastNewlinePos, oldText.match(/\n/g).length - 1);
|
||||||
|
builder.remove(oldText.length - lastNewlinePos - 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
var changeset = builder.toString();
|
||||||
|
|
||||||
|
//append the changeset
|
||||||
|
pad.appendRevision(changeset);
|
||||||
|
//
|
||||||
|
padMessage.updatePadClients(pad, function ()
|
||||||
|
{
|
||||||
|
});
|
||||||
|
callback(null, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
copyPad(sourceID, destinationID[, force=false]) copies a pad. If force is true,
|
copyPad(sourceID, destinationID[, force=false]) copies a pad. If force is true,
|
||||||
|
|
|
@ -345,10 +345,56 @@ var version =
|
||||||
, "getChatHistory" : ["padID", "start", "end"]
|
, "getChatHistory" : ["padID", "start", "end"]
|
||||||
, "getChatHead" : ["padID"]
|
, "getChatHead" : ["padID"]
|
||||||
}
|
}
|
||||||
|
, "1.2.11":
|
||||||
|
{ "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"]
|
||||||
|
, "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" : []
|
||||||
|
, "getChatHistory" : ["padID"]
|
||||||
|
, "getChatHistory" : ["padID", "start", "end"]
|
||||||
|
, "getChatHead" : ["padID"]
|
||||||
|
, "restoreRevision" : ["padID", "rev"]
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// set the latest available API version here
|
// set the latest available API version here
|
||||||
exports.latestApiVersion = '1.2.10';
|
exports.latestApiVersion = '1.2.11';
|
||||||
|
|
||||||
// exports the versions so it can be used by the new Swagger endpoint
|
// exports the versions so it can be used by the new Swagger endpoint
|
||||||
exports.version = version;
|
exports.version = version;
|
||||||
|
|
|
@ -37,6 +37,7 @@ var _ = require('underscore');
|
||||||
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js");
|
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js");
|
||||||
var channels = require("channels");
|
var channels = require("channels");
|
||||||
var stats = require('../stats');
|
var stats = require('../stats');
|
||||||
|
var remoteAddress = require("../utils/RemoteAddress").remoteAddress;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A associative array that saves informations about a session
|
* A associative array that saves informations about a session
|
||||||
|
@ -115,14 +116,16 @@ exports.handleDisconnect = function(client)
|
||||||
//if this connection was already etablished with a handshake, send a disconnect message to the others
|
//if this connection was already etablished with a handshake, send a disconnect message to the others
|
||||||
if(session && session.author)
|
if(session && session.author)
|
||||||
{
|
{
|
||||||
client.get('remoteAddress', function(er, ip) {
|
|
||||||
//Anonymize the IP address if IP logging is disabled
|
|
||||||
if(settings.disableIPlogging) {
|
|
||||||
ip = 'ANONYMOUS';
|
|
||||||
}
|
|
||||||
|
|
||||||
accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad')
|
// Get the IP address from our persistant object
|
||||||
})
|
var ip = remoteAddress[client.id];
|
||||||
|
|
||||||
|
// Anonymize the IP address if IP logging is disabled
|
||||||
|
if(settings.disableIPlogging) {
|
||||||
|
ip = 'ANONYMOUS';
|
||||||
|
}
|
||||||
|
|
||||||
|
accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad')
|
||||||
|
|
||||||
//get the author color out of the db
|
//get the author color out of the db
|
||||||
authorManager.getAuthorColorId(session.author, function(err, color)
|
authorManager.getAuthorColorId(session.author, function(err, color)
|
||||||
|
@ -753,7 +756,13 @@ function handleUserChanges(data, cb)
|
||||||
exports.updatePadClients = function(pad, callback)
|
exports.updatePadClients = function(pad, callback)
|
||||||
{
|
{
|
||||||
//skip this step if noone is on this pad
|
//skip this step if noone is on this pad
|
||||||
var roomClients = socketio.sockets.clients(pad.id);
|
var roomClients = [], room = socketio.sockets.adapter.rooms[pad.id];
|
||||||
|
if (room) {
|
||||||
|
for (var id in room) {
|
||||||
|
roomClients.push(socketio.sockets.adapter.nsp.connected[id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(roomClients.length==0)
|
if(roomClients.length==0)
|
||||||
return callback();
|
return callback();
|
||||||
|
|
||||||
|
@ -766,10 +775,8 @@ exports.updatePadClients = function(pad, callback)
|
||||||
var revCache = {};
|
var revCache = {};
|
||||||
|
|
||||||
//go trough all sessions on this pad
|
//go trough all sessions on this pad
|
||||||
async.forEach(roomClients, function(client, callback)
|
async.forEach(roomClients, function(client, callback){
|
||||||
{
|
|
||||||
var sid = client.id;
|
var sid = client.id;
|
||||||
|
|
||||||
//https://github.com/caolan/async#whilst
|
//https://github.com/caolan/async#whilst
|
||||||
//send them all new changesets
|
//send them all new changesets
|
||||||
async.whilst(
|
async.whilst(
|
||||||
|
@ -1015,7 +1022,13 @@ function handleClientReady(client, message)
|
||||||
return callback();
|
return callback();
|
||||||
|
|
||||||
//Check if this author is already on the pad, if yes, kick the other sessions!
|
//Check if this author is already on the pad, if yes, kick the other sessions!
|
||||||
var roomClients = socketio.sockets.clients(padIds.padId);
|
var roomClients = [], room = socketio.sockets.adapter.rooms[pad.id];
|
||||||
|
if (room) {
|
||||||
|
for (var id in room) {
|
||||||
|
roomClients.push(socketio.sockets.adapter.nsp.connected[id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(var i = 0; i < roomClients.length; i++) {
|
for(var i = 0; i < roomClients.length; i++) {
|
||||||
var sinfo = sessioninfos[roomClients[i].id];
|
var sinfo = sessioninfos[roomClients[i].id];
|
||||||
if(sinfo && sinfo.author == author) {
|
if(sinfo && sinfo.author == author) {
|
||||||
|
@ -1032,19 +1045,19 @@ function handleClientReady(client, message)
|
||||||
sessioninfos[client.id].readonly = padIds.readonly;
|
sessioninfos[client.id].readonly = padIds.readonly;
|
||||||
|
|
||||||
//Log creation/(re-)entering of a pad
|
//Log creation/(re-)entering of a pad
|
||||||
client.get('remoteAddress', function(er, ip) {
|
var ip = remoteAddress[client.id];
|
||||||
//Anonymize the IP address if IP logging is disabled
|
|
||||||
if(settings.disableIPlogging) {
|
|
||||||
ip = 'ANONYMOUS';
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pad.head > 0) {
|
//Anonymize the IP address if IP logging is disabled
|
||||||
accessLogger.info('[ENTER] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" entered the pad');
|
if(settings.disableIPlogging) {
|
||||||
}
|
ip = 'ANONYMOUS';
|
||||||
else if(pad.head == 0) {
|
}
|
||||||
accessLogger.info('[CREATE] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" created the pad');
|
|
||||||
}
|
if(pad.head > 0) {
|
||||||
})
|
accessLogger.info('[ENTER] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" entered the pad');
|
||||||
|
}
|
||||||
|
else if(pad.head == 0) {
|
||||||
|
accessLogger.info('[CREATE] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" created the pad');
|
||||||
|
}
|
||||||
|
|
||||||
//If this is a reconnect, we don't have to send the client the ClientVars again
|
//If this is a reconnect, we don't have to send the client the ClientVars again
|
||||||
if(message.reconnect == true)
|
if(message.reconnect == true)
|
||||||
|
@ -1165,7 +1178,14 @@ function handleClientReady(client, message)
|
||||||
client.broadcast.to(padIds.padId).json.send(messageToTheOtherUsers);
|
client.broadcast.to(padIds.padId).json.send(messageToTheOtherUsers);
|
||||||
|
|
||||||
//Run trough all sessions of this pad
|
//Run trough all sessions of this pad
|
||||||
async.forEach(socketio.sockets.clients(padIds.padId), function(roomClient, callback)
|
var roomClients = [], room = socketio.sockets.adapter.rooms[pad.id];
|
||||||
|
if (room) {
|
||||||
|
for (var id in room) {
|
||||||
|
roomClients.push(socketio.sockets.adapter.nsp.connected[id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async.forEach(roomClients, function(roomClient, callback)
|
||||||
{
|
{
|
||||||
var author;
|
var author;
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ var log4js = require('log4js');
|
||||||
var messageLogger = log4js.getLogger("message");
|
var messageLogger = log4js.getLogger("message");
|
||||||
var securityManager = require("../db/SecurityManager");
|
var securityManager = require("../db/SecurityManager");
|
||||||
var readOnlyManager = require("../db/ReadOnlyManager");
|
var readOnlyManager = require("../db/ReadOnlyManager");
|
||||||
|
var remoteAddress = require("../utils/RemoteAddress").remoteAddress;
|
||||||
var settings = require('../utils/Settings');
|
var settings = require('../utils/Settings');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,11 +57,15 @@ exports.setSocketIO = function(_socket) {
|
||||||
|
|
||||||
socket.sockets.on('connection', function(client)
|
socket.sockets.on('connection', function(client)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Broken: See http://stackoverflow.com/questions/4647348/send-message-to-specific-client-with-socket-io-and-node-js
|
||||||
|
// Fixed by having a persistant object, ideally this would actually be in the database layer
|
||||||
|
// TODO move to database layer
|
||||||
if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){
|
if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){
|
||||||
client.set('remoteAddress', client.handshake.headers['x-forwarded-for']);
|
remoteAddress[client.id] = client.handshake.headers['x-forwarded-for'];
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
client.set('remoteAddress', client.handshake.address.address);
|
remoteAddress[client.id] = client.handshake.address;
|
||||||
}
|
}
|
||||||
var clientAuthorized = false;
|
var clientAuthorized = false;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,17 @@
|
||||||
var log4js = require('log4js');
|
var log4js = require('log4js');
|
||||||
var socketio = require('socket.io');
|
|
||||||
var settings = require('../../utils/Settings');
|
var settings = require('../../utils/Settings');
|
||||||
var socketIORouter = require("../../handler/SocketIORouter");
|
var socketIORouter = require("../../handler/SocketIORouter");
|
||||||
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
|
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
|
||||||
var webaccess = require("ep_etherpad-lite/node/hooks/express/webaccess");
|
var webaccess = require("ep_etherpad-lite/node/hooks/express/webaccess");
|
||||||
|
|
||||||
|
// there shouldn't be a browser that isn't compatible to all
|
||||||
|
// transports in this list at once
|
||||||
|
// e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling
|
||||||
|
|
||||||
|
var socketio = require('socket.io')({
|
||||||
|
transports: settings.socketTransportProtocols
|
||||||
|
});
|
||||||
|
|
||||||
var padMessageHandler = require("../../handler/PadMessageHandler");
|
var padMessageHandler = require("../../handler/PadMessageHandler");
|
||||||
|
|
||||||
var connect = require('connect');
|
var connect = require('connect');
|
||||||
|
@ -16,7 +23,9 @@ exports.expressCreateServer = function (hook_name, args, cb) {
|
||||||
/* Require an express session cookie to be present, and load the
|
/* Require an express session cookie to be present, and load the
|
||||||
* session. See http://www.danielbaulig.de/socket-ioexpress for more
|
* session. See http://www.danielbaulig.de/socket-ioexpress for more
|
||||||
* info */
|
* info */
|
||||||
io.set('authorization', function (data, accept) {
|
|
||||||
|
io.use(function(socket, accept) {
|
||||||
|
var data = socket.request;
|
||||||
if (!data.headers.cookie) return accept('No session cookie transmitted.', false);
|
if (!data.headers.cookie) return accept('No session cookie transmitted.', false);
|
||||||
|
|
||||||
// Use connect's cookie parser, because it knows how to parse signed cookies
|
// Use connect's cookie parser, because it knows how to parse signed cookies
|
||||||
|
@ -36,35 +45,17 @@ exports.expressCreateServer = function (hook_name, args, cb) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// there shouldn't be a browser that isn't compatible to all
|
// var socketIOLogger = log4js.getLogger("socket.io");
|
||||||
// transports in this list at once
|
// Debug logging now has to be set at an environment level, this is stupid.
|
||||||
// e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling
|
// https://github.com/Automattic/socket.io/wiki/Migrating-to-1.0
|
||||||
io.set('transports', settings.socketTransportProtocols );
|
// This debug logging environment is set in Settings.js
|
||||||
|
|
||||||
var socketIOLogger = log4js.getLogger("socket.io");
|
|
||||||
io.set('logger', {
|
|
||||||
debug: function (str)
|
|
||||||
{
|
|
||||||
socketIOLogger.debug.apply(socketIOLogger, arguments);
|
|
||||||
},
|
|
||||||
info: function (str)
|
|
||||||
{
|
|
||||||
socketIOLogger.info.apply(socketIOLogger, arguments);
|
|
||||||
},
|
|
||||||
warn: function (str)
|
|
||||||
{
|
|
||||||
socketIOLogger.warn.apply(socketIOLogger, arguments);
|
|
||||||
},
|
|
||||||
error: function (str)
|
|
||||||
{
|
|
||||||
socketIOLogger.error.apply(socketIOLogger, arguments);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
//minify socket.io javascript
|
//minify socket.io javascript
|
||||||
if(settings.minify)
|
// Due to a shitty decision by the SocketIO team minification is
|
||||||
io.enable('browser client minification');
|
// no longer available, details available at:
|
||||||
|
// http://stackoverflow.com/questions/23981741/minify-socket-io-socket-io-js-with-1-0
|
||||||
|
// if(settings.minify) io.enable('browser client minification');
|
||||||
|
|
||||||
//Initalize the Socket.IO Router
|
//Initalize the Socket.IO Router
|
||||||
socketIORouter.setSocketIO(io);
|
socketIORouter.setSocketIO(io);
|
||||||
socketIORouter.addComponent("pad", padMessageHandler);
|
socketIORouter.addComponent("pad", padMessageHandler);
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
|
|
||||||
var jsdom = require('jsdom-nocontextifiy').jsdom;
|
var jsdom = require('jsdom-nocontextifiy').jsdom;
|
||||||
var log4js = require('log4js');
|
var log4js = require('log4js');
|
||||||
|
|
||||||
|
|
||||||
var Changeset = require("ep_etherpad-lite/static/js/Changeset");
|
var Changeset = require("ep_etherpad-lite/static/js/Changeset");
|
||||||
var contentcollector = require("ep_etherpad-lite/static/js/contentcollector");
|
var contentcollector = require("ep_etherpad-lite/static/js/contentcollector");
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
exports.remoteAddress = {};
|
|
@ -228,6 +228,7 @@ exports.reloadSettings = function reloadSettings() {
|
||||||
|
|
||||||
log4js.configure(exports.logconfig);//Configure the logging appenders
|
log4js.configure(exports.logconfig);//Configure the logging appenders
|
||||||
log4js.setGlobalLogLevel(exports.loglevel);//set loglevel
|
log4js.setGlobalLogLevel(exports.loglevel);//set loglevel
|
||||||
|
process.env['DEBUG'] = 'socket.io:' + exports.loglevel; // Used by SocketIO for Debug
|
||||||
log4js.replaceConsole();
|
log4js.replaceConsole();
|
||||||
|
|
||||||
if(!exports.sessionKey){ // If the secretKey isn't set we also create yet another unique value here
|
if(!exports.sessionKey){ // If the secretKey isn't set we also create yet another unique value here
|
||||||
|
|
|
@ -15,9 +15,9 @@
|
||||||
"request" : "2.9.100",
|
"request" : "2.9.100",
|
||||||
"require-kernel" : "1.0.5",
|
"require-kernel" : "1.0.5",
|
||||||
"resolve" : ">=1.0.0",
|
"resolve" : ">=1.0.0",
|
||||||
"socket.io" : "0.9.x",
|
"socket.io" : ">=1.2.0",
|
||||||
"ueberDB" : ">=0.2.2",
|
"ueberDB" : ">=0.2.9",
|
||||||
"express" : "3.1.0",
|
"express" : ">3.1.0 <3.9.0",
|
||||||
"async" : "0.1.x",
|
"async" : "0.1.x",
|
||||||
"connect" : "2.7.x",
|
"connect" : "2.7.x",
|
||||||
"clean-css" : "0.3.2",
|
"clean-css" : "0.3.2",
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
"semver" : ">2.3.0",
|
"semver" : ">2.3.0",
|
||||||
"security" : "1.0.0",
|
"security" : "1.0.0",
|
||||||
"tinycon" : "0.0.1",
|
"tinycon" : "0.0.1",
|
||||||
"underscore" : "1.3.1",
|
"underscore" : "1.5.1",
|
||||||
"unorm" : "1.0.0",
|
"unorm" : "1.0.0",
|
||||||
"languages4translatewiki" : "0.1.3",
|
"languages4translatewiki" : "0.1.3",
|
||||||
"swagger-node-express" : ">=2.1.0",
|
"swagger-node-express" : ">=2.1.0",
|
||||||
|
|
|
@ -59,7 +59,7 @@ a img {
|
||||||
height: 32px;
|
height: 32px;
|
||||||
}
|
}
|
||||||
.toolbar ul {
|
.toolbar ul {
|
||||||
position: relative;
|
position: absolute;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding-right: 3px;
|
padding-right: 3px;
|
||||||
padding-left: 1px;
|
padding-left: 1px;
|
||||||
|
@ -67,9 +67,6 @@ a img {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
float: left
|
float: left
|
||||||
}
|
}
|
||||||
.toolbar ul.menu_right {
|
|
||||||
float: right
|
|
||||||
}
|
|
||||||
.toolbar ul li {
|
.toolbar ul li {
|
||||||
float: left;
|
float: left;
|
||||||
margin-left: 2px;
|
margin-left: 2px;
|
||||||
|
@ -84,6 +81,7 @@ a img {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
width: 0px;
|
width: 0px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
height:20px;
|
||||||
}
|
}
|
||||||
.toolbar ul li a:hover {
|
.toolbar ul li a:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -164,6 +162,15 @@ a img {
|
||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
.toolbar ul.menu_left {
|
||||||
|
left:0px;
|
||||||
|
right:250px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar ul.menu_right {
|
||||||
|
right:0px;
|
||||||
|
}
|
||||||
|
|
||||||
li[data-key=showusers] > a {
|
li[data-key=showusers] > a {
|
||||||
min-width: 30px;
|
min-width: 30px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
@ -175,6 +182,9 @@ li[data-key=showusers] > a #online_count {
|
||||||
top: 2px;
|
top: 2px;
|
||||||
padding-left: 2px;
|
padding-left: 2px;
|
||||||
}
|
}
|
||||||
|
#editbar{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
#editorcontainer {
|
#editorcontainer {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 37px; /* + 1px border */
|
top: 37px; /* + 1px border */
|
||||||
|
@ -843,12 +853,16 @@ input[type=checkbox] {
|
||||||
width: 185px !important;
|
width: 185px !important;
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 600px) {
|
@media screen and (max-width: 600px) {
|
||||||
.toolbar ul li.separator {
|
.toolbar ul li.separator {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.toolbar ul li a {
|
.toolbar ul li a {
|
||||||
padding: 4px 1px
|
padding: 4px 1px
|
||||||
}
|
}
|
||||||
|
.toolbar ul.menu_left {
|
||||||
|
left:0px;
|
||||||
|
right:150px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@media all and (max-width: 400px){
|
@media all and (max-width: 400px){
|
||||||
#gritter-notice-wrapper{
|
#gritter-notice-wrapper{
|
||||||
|
@ -894,9 +908,13 @@ input[type=checkbox] {
|
||||||
#editbar {
|
#editbar {
|
||||||
height: 62px;
|
height: 62px;
|
||||||
}
|
}
|
||||||
|
.toolbar ul.menu_left {
|
||||||
|
left:0px;
|
||||||
|
right:100px;
|
||||||
|
}
|
||||||
|
|
||||||
.toolbar ul.menu_right {
|
.toolbar ul.menu_right {
|
||||||
float: left;
|
right:0px;
|
||||||
margin-top:2px;
|
|
||||||
}
|
}
|
||||||
.popup {
|
.popup {
|
||||||
width:100%;
|
width:100%;
|
||||||
|
@ -917,6 +935,9 @@ input[type=checkbox] {
|
||||||
#editorcontainer {
|
#editorcontainer {
|
||||||
margin-bottom: 33px
|
margin-bottom: 33px
|
||||||
}
|
}
|
||||||
|
.toolbar ul.menu_left {
|
||||||
|
right:0px;
|
||||||
|
}
|
||||||
.toolbar ul.menu_right {
|
.toolbar ul.menu_right {
|
||||||
background: #f7f7f7;
|
background: #f7f7f7;
|
||||||
background: -webkit-linear-gradient(#f7f7f7, #f1f1f1 80%);
|
background: -webkit-linear-gradient(#f7f7f7, #f1f1f1 80%);
|
||||||
|
@ -1076,4 +1097,4 @@ input[type=checkbox] {
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of gritter stuff */
|
/* End of gritter stuff */
|
||||||
|
|
|
@ -173,6 +173,7 @@
|
||||||
#import_export {
|
#import_export {
|
||||||
top: 115px;
|
top: 115px;
|
||||||
width: 185px;
|
width: 185px;
|
||||||
|
position: fixed;
|
||||||
}
|
}
|
||||||
.timeslider-bar {
|
.timeslider-bar {
|
||||||
background: #f7f7f7;
|
background: #f7f7f7;
|
||||||
|
|
|
@ -152,7 +152,6 @@ function Ace2Inner(){
|
||||||
var dmesg = noop;
|
var dmesg = noop;
|
||||||
window.dmesg = noop;
|
window.dmesg = noop;
|
||||||
|
|
||||||
|
|
||||||
var scheduler = parent; // hack for opera required
|
var scheduler = parent; // hack for opera required
|
||||||
|
|
||||||
var textFace = 'monospace';
|
var textFace = 'monospace';
|
||||||
|
@ -597,6 +596,13 @@ function Ace2Inner(){
|
||||||
fixView();
|
fixView();
|
||||||
});
|
});
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
|
// Chrome can't handle the truth.. If CSS rule white-space:pre-wrap
|
||||||
|
// is true then any paste event will insert two lines..
|
||||||
|
if(browser.chrome){
|
||||||
|
$("#innerdocbody").css({"white-space":"normal"});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setStyled(newVal)
|
function setStyled(newVal)
|
||||||
|
@ -3749,7 +3755,7 @@ function Ace2Inner(){
|
||||||
toggleAttributeOnSelection('strikethrough');
|
toggleAttributeOnSelection('strikethrough');
|
||||||
specialHandled = true;
|
specialHandled = true;
|
||||||
}
|
}
|
||||||
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which) == "L" && (evt.metaKey || evt.ctrlKey))
|
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "l" && (evt.metaKey || evt.ctrlKey) && evt.shiftKey)
|
||||||
{
|
{
|
||||||
// cmd-shift-L (unorderedlist)
|
// cmd-shift-L (unorderedlist)
|
||||||
fastIncorp(9);
|
fastIncorp(9);
|
||||||
|
@ -3757,7 +3763,7 @@ function Ace2Inner(){
|
||||||
doInsertUnorderedList()
|
doInsertUnorderedList()
|
||||||
specialHandled = true;
|
specialHandled = true;
|
||||||
}
|
}
|
||||||
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which) == "N" && (evt.metaKey || evt.ctrlKey))
|
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "n" && (evt.metaKey || evt.ctrlKey) && evt.shiftKey)
|
||||||
{
|
{
|
||||||
// cmd-shift-N (orderedlist)
|
// cmd-shift-N (orderedlist)
|
||||||
fastIncorp(9);
|
fastIncorp(9);
|
||||||
|
@ -3765,6 +3771,12 @@ function Ace2Inner(){
|
||||||
doInsertOrderedList()
|
doInsertOrderedList()
|
||||||
specialHandled = true;
|
specialHandled = true;
|
||||||
}
|
}
|
||||||
|
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "c" && (evt.metaKey || evt.ctrlKey) && evt.shiftKey) {
|
||||||
|
// cmd-shift-C (clearauthorship)
|
||||||
|
fastIncorp(9);
|
||||||
|
evt.preventDefault();
|
||||||
|
CMDS.clearauthorship();
|
||||||
|
}
|
||||||
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "h" && (evt.ctrlKey))
|
if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "h" && (evt.ctrlKey))
|
||||||
{
|
{
|
||||||
// cmd-H (backspace)
|
// cmd-H (backspace)
|
||||||
|
@ -3816,7 +3828,7 @@ function Ace2Inner(){
|
||||||
}
|
}
|
||||||
updateBrowserSelectionFromRep();
|
updateBrowserSelectionFromRep();
|
||||||
var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current
|
var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current
|
||||||
var caretOffsetTop = myselection.focusNode.parentNode.offsetTop | myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214
|
var caretOffsetTop = myselection.focusNode.parentNode.offsetTop || myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214
|
||||||
// top.console.log(caretOffsetTop);
|
// top.console.log(caretOffsetTop);
|
||||||
setScrollY(caretOffsetTop); // set the scrollY offset of the viewport on the document
|
setScrollY(caretOffsetTop); // set the scrollY offset of the viewport on the document
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, class
|
||||||
function textify(str)
|
function textify(str)
|
||||||
{
|
{
|
||||||
return sanitizeUnicode(
|
return sanitizeUnicode(
|
||||||
str.replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' '));
|
str.replace(/\n/g, '').replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' '));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAssoc(node, name)
|
function getAssoc(node, name)
|
||||||
|
|
|
@ -67,7 +67,7 @@ function createCookie(name, value, days, path){ /* Warning Internet Explorer doe
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if the browser is IE and if so make sure the full path is set in the cookie
|
//Check if the browser is IE and if so make sure the full path is set in the cookie
|
||||||
if(navigator.appName=='Microsoft Internet Explorer'){
|
if((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))){
|
||||||
document.cookie = name + "=" + value + expires + "; path="+document.location;
|
document.cookie = name + "=" + value + expires + "; path="+document.location;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
@ -937,4 +937,3 @@ exports.handshake = handshake;
|
||||||
exports.pad = pad;
|
exports.pad = pad;
|
||||||
exports.init = init;
|
exports.init = init;
|
||||||
exports.alertBar = alertBar;
|
exports.alertBar = alertBar;
|
||||||
|
|
||||||
|
|
|
@ -140,7 +140,12 @@ var padeditbar = (function()
|
||||||
init: function() {
|
init: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
self.dropdowns = [];
|
self.dropdowns = [];
|
||||||
|
// Listen for resize events (sucks but needed as iFrame ace_inner has to be position absolute
|
||||||
|
// A CSS fix for this would be nice but I'm not sure how we'd do it.
|
||||||
|
$(window).resize(function(){
|
||||||
|
self.redrawHeight();
|
||||||
|
});
|
||||||
|
|
||||||
$("#editbar .editbarbutton").attr("unselectable", "on"); // for IE
|
$("#editbar .editbarbutton").attr("unselectable", "on"); // for IE
|
||||||
$("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar");
|
$("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar");
|
||||||
$("#editbar [data-key]").each(function () {
|
$("#editbar [data-key]").each(function () {
|
||||||
|
@ -149,6 +154,10 @@ var padeditbar = (function()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#editbar').show();
|
||||||
|
|
||||||
|
this.redrawHeight();
|
||||||
|
|
||||||
registerDefaultCommands(self);
|
registerDefaultCommands(self);
|
||||||
|
|
||||||
hooks.callAll("postToolbarInit", {
|
hooks.callAll("postToolbarInit", {
|
||||||
|
@ -170,6 +179,12 @@ var padeditbar = (function()
|
||||||
this.commands[cmd] = callback;
|
this.commands[cmd] = callback;
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
redrawHeight: function(){
|
||||||
|
var editbarHeight = $('.menu_left').height() + 2 + "px";
|
||||||
|
var containerTop = $('.menu_left').height() + 5 + "px";
|
||||||
|
$('#editbar').css("height", editbarHeight);
|
||||||
|
$('#editorcontainer').css("top", containerTop);
|
||||||
|
},
|
||||||
registerDropdownCommand: function (cmd, dropdown) {
|
registerDropdownCommand: function (cmd, dropdown) {
|
||||||
dropdown = dropdown || cmd;
|
dropdown = dropdown || cmd;
|
||||||
self.dropdowns.push(dropdown)
|
self.dropdowns.push(dropdown)
|
||||||
|
|
|
@ -55,7 +55,7 @@ function createCookie(name, value, days, path){ /* Used by IE */
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if the browser is IE and if so make sure the full path is set in the cookie
|
//Check if the browser is IE and if so make sure the full path is set in the cookie
|
||||||
if(navigator.appName=='Microsoft Internet Explorer'){
|
if((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))){
|
||||||
document.cookie = name + "=" + value + expires + "; path=/"; /* Note this bodge fix for IE is temporary until auth is rewritten */
|
document.cookie = name + "=" + value + expires + "; path=/"; /* Note this bodge fix for IE is temporary until auth is rewritten */
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
@ -482,7 +482,7 @@ var padutils = {
|
||||||
},
|
},
|
||||||
bindCheckboxChange: function(node, func)
|
bindCheckboxChange: function(node, func)
|
||||||
{
|
{
|
||||||
$(node).bind("click change", func);
|
$(node).change(func);
|
||||||
},
|
},
|
||||||
encodeUserId: function(userId)
|
encodeUserId: function(userId)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
|
var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
|
||||||
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
|
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
|
||||||
var npm = require("npm");
|
var npm = require("npm");
|
||||||
|
var request = require("request");
|
||||||
|
|
||||||
var npmIsLoaded = false;
|
var npmIsLoaded = false;
|
||||||
var withNpm = function (npmfn) {
|
var withNpm = function (npmfn) {
|
||||||
|
@ -60,17 +61,15 @@ exports.availablePlugins = null;
|
||||||
var cacheTimestamp = 0;
|
var cacheTimestamp = 0;
|
||||||
|
|
||||||
exports.getAvailablePlugins = function(maxCacheAge, cb) {
|
exports.getAvailablePlugins = function(maxCacheAge, cb) {
|
||||||
withNpm(function (er) {
|
request("http://etherpad.org/plugins.json", function(er, response, plugins){
|
||||||
if (er) return cb && cb(er);
|
if (er) return cb && cb(er);
|
||||||
if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) {
|
if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) {
|
||||||
return cb && cb(null, exports.availablePlugins)
|
return cb && cb(null, exports.availablePlugins)
|
||||||
}
|
}
|
||||||
npm.commands.search(['ep_'], /*silent?*/true, function(er, results) {
|
plugins = JSON.parse(plugins);
|
||||||
if(er) return cb && cb(er);
|
exports.availablePlugins = plugins;
|
||||||
exports.availablePlugins = results;
|
cacheTimestamp = Math.round(+new Date/1000);
|
||||||
cacheTimestamp = Math.round(+new Date/1000);
|
cb && cb(null, plugins)
|
||||||
cb && cb(null, results)
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,31 +11,31 @@ describe("Language select and change", function(){
|
||||||
helper.newPad(cb);
|
helper.newPad(cb);
|
||||||
this.timeout(60000);
|
this.timeout(60000);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Destroy language cookies
|
// Destroy language cookies
|
||||||
it("makes text german", function(done) {
|
it("makes text german", function(done) {
|
||||||
var inner$ = helper.padInner$;
|
var inner$ = helper.padInner$;
|
||||||
var chrome$ = helper.padChrome$;
|
var chrome$ = helper.padChrome$;
|
||||||
|
|
||||||
//click on the settings button to make settings visible
|
//click on the settings button to make settings visible
|
||||||
var $settingsButton = chrome$(".buttonicon-settings");
|
var $settingsButton = chrome$(".buttonicon-settings");
|
||||||
$settingsButton.click();
|
$settingsButton.click();
|
||||||
|
|
||||||
//click the language button
|
//click the language button
|
||||||
var $language = chrome$("#languagemenu");
|
var $language = chrome$("#languagemenu");
|
||||||
var $languageoption = $language.find("[value=de]");
|
var $languageoption = $language.find("[value=de]");
|
||||||
|
|
||||||
//select german
|
//select german
|
||||||
$languageoption.attr('selected','selected');
|
$languageoption.attr('selected','selected');
|
||||||
$language.change();
|
$language.change();
|
||||||
|
|
||||||
helper.waitFor(function() {
|
helper.waitFor(function() {
|
||||||
return chrome$(".buttonicon-bold").parent()[0]["title"] == "Fett (Strg-B)";
|
return chrome$(".buttonicon-bold").parent()[0]["title"] == "Fett (Strg-B)";
|
||||||
})
|
})
|
||||||
.done(function(){
|
.done(function(){
|
||||||
//get the value of the bold button
|
//get the value of the bold button
|
||||||
var $boldButton = chrome$(".buttonicon-bold").parent();
|
var $boldButton = chrome$(".buttonicon-bold").parent();
|
||||||
|
|
||||||
//get the title of the bold button
|
//get the title of the bold button
|
||||||
var boldButtonTitle = $boldButton[0]["title"];
|
var boldButtonTitle = $boldButton[0]["title"];
|
||||||
|
|
||||||
|
@ -44,58 +44,58 @@ describe("Language select and change", function(){
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("makes text English", function(done) {
|
it("makes text English", function(done) {
|
||||||
var inner$ = helper.padInner$;
|
var inner$ = helper.padInner$;
|
||||||
var chrome$ = helper.padChrome$;
|
var chrome$ = helper.padChrome$;
|
||||||
|
|
||||||
//click on the settings button to make settings visible
|
//click on the settings button to make settings visible
|
||||||
var $settingsButton = chrome$(".buttonicon-settings");
|
var $settingsButton = chrome$(".buttonicon-settings");
|
||||||
$settingsButton.click();
|
$settingsButton.click();
|
||||||
|
|
||||||
//click the language button
|
//click the language button
|
||||||
var $language = chrome$("#languagemenu");
|
var $language = chrome$("#languagemenu");
|
||||||
//select english
|
//select english
|
||||||
$language.val("en");
|
$language.val("en");
|
||||||
$language.change();
|
$language.change();
|
||||||
|
|
||||||
//get the value of the bold button
|
//get the value of the bold button
|
||||||
var $boldButton = chrome$(".buttonicon-bold").parent();
|
var $boldButton = chrome$(".buttonicon-bold").parent();
|
||||||
|
|
||||||
helper.waitFor(function() { return $boldButton[0]["title"] != "Fett (Strg-B)";})
|
helper.waitFor(function() { return $boldButton[0]["title"] != "Fett (Strg+B)";})
|
||||||
.done(function(){
|
.done(function(){
|
||||||
|
|
||||||
//get the value of the bold button
|
//get the value of the bold button
|
||||||
var $boldButton = chrome$(".buttonicon-bold").parent();
|
var $boldButton = chrome$(".buttonicon-bold").parent();
|
||||||
|
|
||||||
//get the title of the bold button
|
//get the title of the bold button
|
||||||
var boldButtonTitle = $boldButton[0]["title"];
|
var boldButtonTitle = $boldButton[0]["title"];
|
||||||
|
|
||||||
//check if the language is now English
|
//check if the language is now English
|
||||||
expect(boldButtonTitle).to.be("Bold (Ctrl-B)");
|
expect(boldButtonTitle).to.be("Bold (Ctrl+B)");
|
||||||
done();
|
done();
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("changes direction when picking an rtl lang", function(done) {
|
it("changes direction when picking an rtl lang", function(done) {
|
||||||
var inner$ = helper.padInner$;
|
var inner$ = helper.padInner$;
|
||||||
var chrome$ = helper.padChrome$;
|
var chrome$ = helper.padChrome$;
|
||||||
|
|
||||||
//click on the settings button to make settings visible
|
//click on the settings button to make settings visible
|
||||||
var $settingsButton = chrome$(".buttonicon-settings");
|
var $settingsButton = chrome$(".buttonicon-settings");
|
||||||
$settingsButton.click();
|
$settingsButton.click();
|
||||||
|
|
||||||
//click the language button
|
//click the language button
|
||||||
var $language = chrome$("#languagemenu");
|
var $language = chrome$("#languagemenu");
|
||||||
var $languageoption = $language.find("[value=ar]");
|
var $languageoption = $language.find("[value=ar]");
|
||||||
|
|
||||||
//select arabic
|
//select arabic
|
||||||
// $languageoption.attr('selected','selected'); // Breaks the test..
|
// $languageoption.attr('selected','selected'); // Breaks the test..
|
||||||
$language.val("ar");
|
$language.val("ar");
|
||||||
$languageoption.change();
|
$languageoption.change();
|
||||||
|
|
||||||
helper.waitFor(function() {
|
helper.waitFor(function() {
|
||||||
return chrome$("html")[0]["dir"] != 'ltr';
|
return chrome$("html")[0]["dir"] != 'ltr';
|
||||||
})
|
})
|
||||||
.done(function(){
|
.done(function(){
|
||||||
|
|
Loading…
Reference in New Issue