diff --git a/.travis.yml b/.travis.yml index 9060d94f7..74f68f862 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,20 +4,17 @@ node_js: install: - "bin/installDeps.sh" - "export GIT_HASH=$(cat .git/HEAD | head -c 7)" -before_script: +before_script: - "tests/frontend/travis/sauce_tunnel.sh" script: - "tests/frontend/travis/runner.sh" env: global: - - secure: "OxZ2s724S96xu02746LUN+4lBckAe1BOICJjfA4jnFPNpiNU6XoMH52f+LgG\nZzAwu6xMTv+NsaLGp6Avm3cx4GZ+jIiHe4NB9XOgYPa0r0TBIi3ueWYPDyVv\nCniS/4qX68DoFNV4lh7zMBXn0IIPxT4Wppm3desBpjWDP/SdoRs=" - - SAUCE_USER=etherpad + - secure: "WMGxFkOeTTlhWB+ChMucRtIqVmMbwzYdNHuHQjKCcj8HBEPdZLfCuK/kf4rG\nVLcLQiIsyllqzNhBGVHG1nyqWr0/LTm8JRqSCDDVIhpyzp9KpCJQQJG2Uwjk\n6/HIJJh/wbxsEdLNV2crYU/EiVO3A4Bq0YTHUlbhUqG3mSCr5Ec=" + - secure: "gejXUAHYscbR6Bodw35XexpToqWkv2ifeECsbeEmjaLkYzXmUUNWJGknKSu7\nEUsSfQV8w+hxApr1Z+jNqk9aX3K1I4btL3cwk2trnNI8XRAvu1c1Iv60eerI\nkE82Rsd5lwUaMEh+/HoL8ztFCZamVndoNgX7HWp5J/NRZZMmh4g=" jdk: - oraclejdk6 notifications: - email: - - petermartischka@googlemail.com - - contact@etherpad.org irc: channels: - "irc.freenode.org#etherpad-lite-dev" diff --git a/CHANGELOG.md b/CHANGELOG.md index 8abebf814..0d25d5b44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# 1.2.11 + * NEW: New Hook for outer_ace dynamic css manager and author style hook + * NEW: Bump log4js for improved logging + * Fix: Remove URL schemes which don't have RFC standard + * Fix: Fix safeRun subsequent restarts issue + * Fix: Allow safeRun to pass arguements to run.sh + * Fix: Include script for more efficient import + * Fix: Fix sysv comptibile script + * Fix: Fix client side changeset spamming + * Fix: Don't crash on no-auth + * Fix: Fix some IE8 errors + * Fix: Fix authorship sanitation + # 1.2.10 * NEW: Broadcast slider is exposed in timeslider so plugins can interact with it * Fix: IE issue where pads wouldn't load due to missing console from i18n diff --git a/README.md b/README.md index a42c94bd3..75be57534 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**, # Installation -Etherpad works with node v0.8 and v0.10, only. (We don't suppot v0.6) +Etherpad works with node v0.8 and v0.10, only. (We don't support v0.6) ## Windows @@ -81,7 +81,7 @@ Documentation can be found in `docs/`. # Development ## Things you should know -Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Development](http://youtu.be/67-Q26YH97E). +Read this [git guide](http://learn.github.com/p/index.html) and watch this [video on getting started with Etherpad Development](http://youtu.be/67-Q26YH97E). If you're new to node.js, start with Ryan Dahl's [Introduction to Node.js](http://youtu.be/jo_B4LTHi3I). diff --git a/bin/safeRun.sh b/bin/safeRun.sh index b060f5d19..4b3485ba4 100755 --- a/bin/safeRun.sh +++ b/bin/safeRun.sh @@ -16,6 +16,7 @@ TIME_BETWEEN_EMAILS=600 # 10 minutes # DON'T EDIT AFTER THIS LINE LAST_EMAIL_SEND=0 +LOG="$1" #Move to the folder where ep-lite is installed cd `dirname $0` @@ -26,26 +27,27 @@ if [ -d "../bin" ]; then fi #check if a logfile parameter is set -if [ -z "$1" ]; then +if [ -z "${LOG}" ]; then echo "Set a logfile as the first parameter" exit 1 fi +shift while [ 1 ] do #try to touch the file if it doesn't exist - if [ ! -f $1 ]; then - touch $1 || ( echo "Logfile '$1' is not writeable" && exit 1 ) + if [ ! -f ${LOG} ]; then + touch ${LOG} || ( echo "Logfile '${LOG}' is not writeable" && exit 1 ) fi #check if the file is writeable - if [ ! -w $1 ]; then - echo "Logfile '$1' is not writeable" + if [ ! -w ${LOG} ]; then + echo "Logfile '${LOG}' is not writeable" exit 1 fi #start the application - bin/run.sh >>$1 2>>$1 + bin/run.sh $@ >>${LOG} 2>>${LOG} #Send email if [ $ERROR_HANDLING = 1 ]; then @@ -53,13 +55,13 @@ do TIME_SINCE_LAST_SEND=$(($TIME_NOW - $LAST_EMAIL_SEND)) if [ $TIME_SINCE_LAST_SEND -gt $TIME_BETWEEN_EMAILS ]; then - printf "Server was restared at: $(date)\nThe last 50 lines of the log before the error happens:\n $(tail -n 50 $1)" | mail -s "Pad Server was restarted" $EMAIL_ADDRESS + printf "Server was restared at: $(date)\nThe last 50 lines of the log before the error happens:\n $(tail -n 50 ${LOG})" | mail -s "Pad Server was restarted" $EMAIL_ADDRESS LAST_EMAIL_SEND=$TIME_NOW fi fi - echo "RESTART!" >>$1 + echo "RESTART!" >>${LOG} #Sleep 10 seconds before restart sleep 10 diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index 919859417..80dcc52ac 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -261,3 +261,18 @@ This hook is provided to allow whether a given line should be deliniated with mu Multiple authors in one line cause the creation of magic span lines. This might not suit you and now you can disable it and handle your own deliniation. The return value should be either true(disable) or false. + +## aceSetAuthorStyle +Called from: src/static/js/ace2_inner.js + +Things in context: + +1. dynamicCSS - css manger for inner ace +2. outerDynamicCSS - css manager for outer ace +3. parentDynamicCSS - css manager for parent document +4. info - author style info +5. author - author info +6. authorSelector - css selector for author span in inner ace + +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. diff --git a/src/locales/ar.json b/src/locales/ar.json index 43d3bb07f..339a7fde8 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -5,6 +5,8 @@ "Tux-tn" ] }, + "index.newPad": "\u0628\u0627\u062f \u062c\u062f\u064a\u062f", + "index.createOpenPad": "\u0623\u0648 \u0635\u0646\u0639/\u0641\u062a\u062d \u0628\u0627\u062f \u0628\u0648\u0636\u0639 \u0625\u0633\u0645\u0647:", "pad.toolbar.bold.title": "\u0633\u0645\u064a\u0643 (Ctrl-B)", "pad.toolbar.italic.title": "\u0645\u0627\u0626\u0644 (Ctrl-I)", "pad.toolbar.underline.title": "\u062a\u0633\u0637\u064a\u0631 (Ctrl-U)", @@ -17,20 +19,31 @@ "pad.toolbar.redo.title": "\u062a\u0643\u0631\u0627\u0631 (Ctrl-Y)", "pad.toolbar.import_export.title": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f/\u062a\u0635\u062f\u064a\u0631 \u0645\u0646/\u0625\u0644\u0649 \u062a\u0646\u0633\u064a\u0642\u0627\u062a \u0645\u0644\u0641\u0627\u062a \u0645\u062e\u062a\u0644\u0641\u0629", "pad.toolbar.timeslider.title": "\u0645\u062a\u0635\u0641\u062d \u0627\u0644\u062a\u0627\u0631\u064a\u062e", - "pad.toolbar.savedRevision.title": "\u0627\u0644\u062a\u0646\u0642\u064a\u062d\u0627\u062a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629", + "pad.toolbar.savedRevision.title": "\u062d\u0641\u0638 \u0627\u0644\u0645\u0631\u0627\u062c\u0639\u0629", "pad.toolbar.settings.title": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a", + "pad.toolbar.embed.title": "\u062a\u0628\u0627\u062f\u0644 \u0648 \u062a\u0636\u0645\u064a\u0646 \u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f", + "pad.toolbar.showusers.title": "\u0639\u0631\u0636 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f", "pad.colorpicker.save": "\u062a\u0633\u062c\u064a\u0644", "pad.colorpicker.cancel": "\u0625\u0644\u063a\u0627\u0621", "pad.loading": "\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...", + "pad.passwordRequired": "\u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f", + "pad.permissionDenied": "\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0625\u0630\u0646 \u0644\u062f\u062e\u0648\u0644 \u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f", + "pad.wrongPassword": "\u0643\u0627\u0646\u062a \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u062e\u0627\u0637\u0626\u0629", + "pad.settings.padSettings": "\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0628\u0627\u062f", + "pad.settings.myView": "\u0631\u0624\u064a\u062a\u064a", "pad.settings.stickychat": "\u0627\u0644\u062f\u0631\u062f\u0634\u0629 \u062f\u0627\u0626\u0645\u0627 \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629", + "pad.settings.colorcheck": "\u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u062a\u0623\u0644\u064a\u0641", "pad.settings.linenocheck": "\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0623\u0633\u0637\u0631", + "pad.settings.rtlcheck": "\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u062d\u062a\u0648\u064a\u0627\u062a \u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0625\u0644\u0649 \u0627\u0644\u064a\u0633\u0627\u0631\u061f", "pad.settings.fontType": "\u0646\u0648\u0639 \u0627\u0644\u062e\u0637:", "pad.settings.fontType.normal": "\u0639\u0627\u062f\u064a", "pad.settings.fontType.monospaced": "\u062b\u0627\u0628\u062a \u0627\u0644\u0639\u0631\u0636", + "pad.settings.globalView": "\u0627\u0644\u0631\u0624\u064a\u0629 \u0627\u0644\u0634\u0627\u0645\u0644\u0629", "pad.settings.language": "\u0627\u0644\u0644\u063a\u0629:", "pad.importExport.import_export": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f/\u062a\u0635\u062f\u064a\u0631", "pad.importExport.import": "\u062a\u062d\u0645\u064a\u0644 \u0623\u064a \u0645\u0644\u0641 \u0646\u0635\u064a \u0623\u0648 \u0648\u062b\u064a\u0642\u0629", "pad.importExport.importSuccessful": "\u0646\u0627\u062c\u062d!", + "pad.importExport.export": "\u062a\u0635\u062f\u064a\u0631 \u0627\u0644\u0628\u0627\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0628\u0635\u0641\u0629:", "pad.importExport.exporthtml": "\u0625\u062a\u0634 \u062a\u064a \u0625\u0645 \u0625\u0644", "pad.importExport.exportplain": "\u0646\u0635 \u0639\u0627\u062f\u064a", "pad.importExport.exportword": "\u0645\u0627\u064a\u0643\u0631\u0648\u0633\u0648\u0641\u062a \u0648\u0648\u0631\u062f", @@ -38,7 +51,11 @@ "pad.importExport.exportopen": "ODF (\u0646\u0633\u0642 \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u0645\u0641\u062a\u0648\u062d)", "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648\u0648\u064a\u0643\u064a", "pad.modals.connected": "\u0645\u062a\u0635\u0644.", + "pad.modals.reconnecting": "\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0628\u0627\u062f\u0643", "pad.modals.forcereconnect": "\u0641\u0631\u0636 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644", + "pad.modals.userdup": "\u0645\u0641\u062a\u0648\u062d \u0641\u064a \u0646\u0627\u0641\u0630\u0629 \u0623\u062e\u0631\u0649", + "pad.modals.userdup.explanation": "\u064a\u0628\u062f\u0648 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f \u062a\u0645 \u0641\u062a\u062d\u0647 \u0641\u064a \u0623\u0643\u062b\u0631 \u0645\u0646 \u0646\u0627\u0641\u0630\u0629 \u0645\u062a\u0635\u0641\u062d \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062d\u0627\u0633\u0648\u0628.", + "pad.modals.userdup.advice": "\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0644\u0625\u0633\u062a\u0639\u0645\u0627\u0644 \u0647\u0630\u0647 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0627\u0644\u0627\u062e\u0631\u0649.", "pad.modals.unauth": "\u063a\u064a\u0631 \u0645\u062e\u0648\u0644", "pad.modals.looping": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", "pad.modals.initsocketfail": "\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645", @@ -47,16 +64,24 @@ "pad.modals.slowcommit.explanation": "\u0627\u0644\u062e\u0627\u062f\u0645 \u0644\u0627 \u064a\u0633\u062a\u062c\u064a\u0628.", "pad.modals.slowcommit.cause": "\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0647\u0630\u0627 \u0628\u0633\u0628\u0628 \u0645\u0634\u0627\u0643\u0644 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u0634\u0628\u0643\u0629.", "pad.modals.deleted": "\u0645\u062d\u0630\u0648\u0641.", + "pad.modals.deleted.explanation": "\u062a\u0645\u062a \u0625\u0632\u0627\u0644\u0629 \u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f", "pad.modals.disconnected": "\u0644\u0645 \u062a\u0639\u062f \u0645\u062a\u0651\u0635\u0644.", "pad.modals.disconnected.explanation": "\u062a\u0645 \u0641\u0642\u062f\u0627\u0646 \u0627\u0644\u0625\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645", "pad.modals.disconnected.cause": "\u0642\u062f \u064a\u0643\u0648\u0646 \u0627\u0644\u062e\u0627\u062f\u0645 \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0644\u0627\u0645\u0646\u0627 \u0625\u0630\u0627 \u062a\u0643\u0631\u0631 \u0647\u0630\u0627.", "pad.share.readonly": "\u0644\u0644\u0642\u0631\u0627\u0621\u0629 \u0641\u0642\u0637", "pad.share.link": "\u0631\u0627\u0628\u0637", + "pad.share.emebdcode": "URL \u0644\u0644\u062a\u0636\u0645\u064a\u0646", "pad.chat": "\u062f\u0631\u062f\u0634\u0629", + "pad.chat.title": "\u0641\u062a\u062d \u0627\u0644\u062f\u0631\u062f\u0634\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0628\u0627\u062f", + "pad.chat.loadmessages": "\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0631\u0633\u0627\u0626\u0644", + "timeslider.toolbar.returnbutton": "\u0627\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0628\u0627\u062f", "timeslider.toolbar.authors": "\u0627\u0644\u0645\u0624\u0644\u0641\u0648\u0646:", "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0645\u0624\u0644\u0641\u064a\u0646", + "timeslider.toolbar.exportlink.title": "\u062a\u0635\u062f\u064a\u0631", "timeslider.exportCurrent": "\u062a\u0635\u062f\u064a\u0631 \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0643:", "timeslider.version": "\u0625\u0635\u062f\u0627\u0631 {{version}}", + "timeslider.saved": "\u0645\u062d\u0641\u0648\u0638 {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "\u064a\u0646\u0627\u064a\u0631", "timeslider.month.february": "\u0641\u0628\u0631\u0627\u064a\u0631", "timeslider.month.march": "\u0645\u0627\u0631\u0633", @@ -73,5 +98,10 @@ "pad.userlist.unnamed": "\u063a\u064a\u0631 \u0645\u0633\u0645\u0649", "pad.userlist.guest": "\u0636\u064a\u0641", "pad.userlist.deny": "\u0631\u0641\u0636", - "pad.userlist.approve": "\u0645\u0648\u0627\u0641\u0642\u0629" + "pad.userlist.approve": "\u0645\u0648\u0627\u0641\u0642\u0629", + "pad.impexp.importbutton": "\u0627\u0644\u0627\u0633\u062a\u064a\u0631\u0627\u062f \u0627\u0644\u0622\u0646", + "pad.impexp.importing": "\u0627\u0644\u0627\u0633\u062a\u064a\u0631\u0627\u062f...", + "pad.impexp.uploadFailed": "\u0641\u0634\u0644 \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649", + "pad.impexp.importfailed": "\u0641\u0634\u0644 \u0627\u0644\u0627\u0633\u062a\u064a\u0631\u0627\u062f", + "pad.impexp.copypaste": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0646\u0633\u062e/\u0644\u0635\u0642" } \ No newline at end of file diff --git a/src/locales/ca.json b/src/locales/ca.json index 17a022087..6771730fe 100644 --- a/src/locales/ca.json +++ b/src/locales/ca.json @@ -23,7 +23,7 @@ "pad.toolbar.timeslider.title": "L\u00ednia temporal", "pad.toolbar.savedRevision.title": "Desa la revisi\u00f3", "pad.toolbar.settings.title": "Configuraci\u00f3", - "pad.toolbar.embed.title": "Incrusta aquest pad", + "pad.toolbar.embed.title": "Comparteix i incrusta aquest pad", "pad.toolbar.showusers.title": "Mostra els usuaris d\u2019aquest pad", "pad.colorpicker.save": "Desa", "pad.colorpicker.cancel": "Cancel\u00b7la", diff --git a/src/locales/cs.json b/src/locales/cs.json index 905ccf367..bd2b99d67 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Jezevec", "Quinn" ] }, @@ -19,9 +20,9 @@ "pad.toolbar.clearAuthorship.title": "Vymazat barvy autorstv\u00ed", "pad.toolbar.import_export.title": "Importovat/Exportovat z/do jin\u00fdch form\u00e1t\u016f", "pad.toolbar.timeslider.title": "Osa \u010dasu", - "pad.toolbar.savedRevision.title": "Ulo\u017een\u00e9 revize", + "pad.toolbar.savedRevision.title": "Ulo\u017eit revizi", "pad.toolbar.settings.title": "Nastaven\u00ed", - "pad.toolbar.embed.title": "Um\u00edstit tento Pad", + "pad.toolbar.embed.title": "Um\u00edstit a nasd\u00edlet tento Pad", "pad.toolbar.showusers.title": "Zobrazit u\u017eivatele u tohoto Padu", "pad.colorpicker.save": "Ulo\u017eit", "pad.colorpicker.cancel": "Zru\u0161it", @@ -34,6 +35,7 @@ "pad.settings.stickychat": "Chat v\u017edy na obrazovce", "pad.settings.colorcheck": "Barvy autorstv\u00ed", "pad.settings.linenocheck": "\u010c\u00edsla \u0159\u00e1dk\u016f", + "pad.settings.rtlcheck": "\u010c\u00edst obsah zprava doleva?", "pad.settings.fontType": "Typ p\u00edsma:", "pad.settings.fontType.normal": "Norm\u00e1ln\u00ed", "pad.settings.fontType.monospaced": "Monospace", @@ -41,6 +43,7 @@ "pad.settings.language": "Jazyk:", "pad.importExport.import_export": "Import/Export", "pad.importExport.import": "Nahr\u00e1t libovoln\u00fd textov\u00fd soubor nebo dokument", + "pad.importExport.importSuccessful": "\u00dasp\u011bch!", "pad.importExport.export": "Exportovat st\u00e1vaj\u00edc\u00ed Pad jako:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Prost\u00fd text", @@ -52,6 +55,7 @@ "pad.modals.connected": "P\u0159ipojeno.", "pad.modals.reconnecting": "Znovup\u0159ipojov\u00e1n\u00ed k tv\u00e9mu Padu\u2026", "pad.modals.forcereconnect": "Vynutit znovup\u0159ipojen\u00ed", + "pad.modals.userdup": "Otev\u0159eno v jin\u00e9m okn\u011b", "pad.modals.userdup.explanation": "Zd\u00e1 se, \u017ee tento Pad je na tomto po\u010d\u00edta\u010di otev\u0159en ve v\u00edce ne\u017e jednom okn\u011b.", "pad.modals.userdup.advice": "Pro pou\u017eit\u00ed tohoto okna se mus\u00ed\u0161 znovu p\u0159ipojit.", "pad.modals.unauth": "Nem\u00e1te autorizaci", @@ -76,10 +80,12 @@ "pad.share.emebdcode": "Vlo\u017eit URL", "pad.chat": "Chat", "pad.chat.title": "Otev\u0159\u00edt chat tohoto Padu.", + "pad.chat.loadmessages": "Na\u010d\u00edst v\u00edce zpr\u00e1v", "timeslider.pageTitle": "Osa \u010dasu {{appTitle}}", "timeslider.toolbar.returnbutton": "N\u00e1vrat do Padu", "timeslider.toolbar.authors": "Auto\u0159i:", "timeslider.toolbar.authorsList": "Bez autor\u016f", + "timeslider.toolbar.exportlink.title": "Exportovat", "timeslider.exportCurrent": "Exportovat nyn\u011bj\u0161\u00ed verzi jako:", "timeslider.version": "Verze {{version}}", "timeslider.saved": "Ulo\u017eeno {{day}} {{month}} {{year}}", @@ -95,5 +101,22 @@ "timeslider.month.september": "z\u00e1\u0159\u00ed", "timeslider.month.october": "\u0159\u00edjen", "timeslider.month.november": "listopad", - "timeslider.month.december": "prosinec" + "timeslider.month.december": "prosinec", + "timeslider.unnamedauthor": "{{num}} nejmenovan\u00fd autor", + "timeslider.unnamedauthors": "{{num}} nejmenovan\u00fdch autor\u016f", + "pad.savedrevs.marked": "Tato revize je nyn\u00ed ozna\u010dena jako ulo\u017een\u00e1", + "pad.userlist.entername": "Zadejte sv\u00e9 jm\u00e9no", + "pad.userlist.unnamed": "nejmenovan\u00fd", + "pad.userlist.guest": "Host", + "pad.userlist.deny": "Zak\u00e1zat", + "pad.userlist.approve": "Povolit", + "pad.editbar.clearcolors": "Odstranit autorsk\u00e9 barvy z cel\u00e9ho dokumentu?", + "pad.impexp.importbutton": "Importovat", + "pad.impexp.importing": "Importov\u00e1n\u00ed\u2026", + "pad.impexp.confirmimport": "Import souboru p\u0159ep\u00ed\u0161e aktu\u00e1ln\u00ed text v padu. Opravdu chcete tuto akci prov\u00e9st?", + "pad.impexp.convertFailed": "Tento soubor nelze importovat. Pou\u017eijte pros\u00edm jin\u00fd form\u00e1t dokumentu nebo nakop\u00edrujte text ru\u010dn\u011b", + "pad.impexp.uploadFailed": "Nahr\u00e1v\u00e1n\u00ed selhalo, zkuste to znovu", + "pad.impexp.importfailed": "Import selhal", + "pad.impexp.copypaste": "Vlo\u017ete pros\u00edm kopii", + "pad.impexp.exportdisabled": "Export do form\u00e1tu {{type}} je zak\u00e1z\u00e1n. Kontaktujte sv\u00e9ho administr\u00e1tora pro zji\u0161t\u011bn\u00ed detail\u016f." } \ No newline at end of file diff --git a/src/locales/de.json b/src/locales/de.json index 380ee625e..d7be7b901 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -24,7 +24,7 @@ "pad.toolbar.timeslider.title": "Pad-Versionsgeschichte anzeigen", "pad.toolbar.savedRevision.title": "Version speichern", "pad.toolbar.settings.title": "Einstellungen", - "pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten", + "pad.toolbar.embed.title": "Dieses Pad teilen und einbetten", "pad.toolbar.showusers.title": "Aktuell verbundene Benutzer anzeigen", "pad.colorpicker.save": "Speichern", "pad.colorpicker.cancel": "Abbrechen", diff --git a/src/locales/el.json b/src/locales/el.json index 78b8a7535..4dd3067ac 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -24,7 +24,7 @@ "pad.toolbar.timeslider.title": "\u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", "pad.toolbar.savedRevision.title": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u0391\u03bd\u03b1\u03b8\u03b5\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2", "pad.toolbar.settings.title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2", - "pad.toolbar.embed.title": "\u0395\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 pad", + "pad.toolbar.embed.title": "\u0394\u03b9\u03b1\u03bc\u03bf\u03af\u03c1\u03b1\u03c3\u03b7 \u03ba\u03b1\u03b9 \u0395\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 pad", "pad.toolbar.showusers.title": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 pad", "pad.colorpicker.save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", "pad.colorpicker.cancel": "\u0386\u03ba\u03c5\u03c1\u03bf", diff --git a/src/locales/eu.json b/src/locales/eu.json new file mode 100644 index 000000000..99a76e0d1 --- /dev/null +++ b/src/locales/eu.json @@ -0,0 +1,121 @@ +{ + "@metadata": { + "authors": [ + "Theklan" + ] + }, + "index.newPad": "Pad berria", + "index.createOpenPad": "edo sortu/ireki Pad bat honako izenarekin:", + "pad.toolbar.bold.title": "Lodia (Ctrl-B)", + "pad.toolbar.italic.title": "Etzana (Ctrl-I)", + "pad.toolbar.underline.title": "Azpimarratua (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Ezabatua", + "pad.toolbar.ol.title": "Zerrenda ordenatua", + "pad.toolbar.ul.title": "Zerrenda ez-ordenatua", + "pad.toolbar.indent.title": "Koska", + "pad.toolbar.unindent.title": "Koska kendu", + "pad.toolbar.undo.title": "Desegin (Ctrl-Z)", + "pad.toolbar.redo.title": "Berregin (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Ezabatu Egiletza Koloreak", + "pad.toolbar.import_export.title": "Inportatu/Esportatu fitxategi formatu ezberdinetara/ezberdinetatik", + "pad.toolbar.timeslider.title": "Denbora lerroa", + "pad.toolbar.savedRevision.title": "Gorde berrikuspena", + "pad.toolbar.settings.title": "Hobespenak", + "pad.toolbar.embed.title": "Partekatu eta Txertatu pad hau", + "pad.toolbar.showusers.title": "Erakutsi pad honetako erabiltzaileak", + "pad.colorpicker.save": "Gorde", + "pad.colorpicker.cancel": "Utzi", + "pad.loading": "Kargatzen...", + "pad.passwordRequired": "Pasahitza behar duzu pad honetara sartzeko", + "pad.permissionDenied": "Ez duzu bamienik pad honetara sartzeko", + "pad.wrongPassword": "Zure pasahitza oker zegoen", + "pad.settings.padSettings": "Pad hobespenak", + "pad.settings.myView": "Nire ikusmoldea", + "pad.settings.stickychat": "Txata beti pantailan", + "pad.settings.colorcheck": "Egiletzaren koloreak", + "pad.settings.linenocheck": "Lerro zenbakiak", + "pad.settings.rtlcheck": "Edukia eskubitik ezkerrera irakurri?", + "pad.settings.fontType": "Tipografia:", + "pad.settings.fontType.normal": "Arrunta", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Ikuspegi Globala", + "pad.settings.language": "Hizkuntza:", + "pad.importExport.import_export": "Inportatu/Esportatu", + "pad.importExport.import": "Igo edozein testu fitxategi edo dokumentu", + "pad.importExport.importSuccessful": "Arrakastatsua!", + "pad.importExport.export": "Oraingo pad hau honela esportatu:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Testu laua", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DocuWiki", + "pad.importExport.abiword.innerHTML": "Testu laua edo html formatudun testuak bakarrik inporta ditzakezu. Aurreratuagoak diren inportazio aukerak izateko \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eabiword instala ezazu\u003C/a\u003E.", + "pad.modals.connected": "Konektatuta.", + "pad.modals.reconnecting": "Zure pad-era birkonektatu...", + "pad.modals.forcereconnect": "Berkonexioa fortzatu", + "pad.modals.userdup": "Beste leiho batean ireki da", + "pad.modals.userdup.explanation": "Pad hau zure nabigatzailearen beste leiho batean irekita dagoela ematen du.", + "pad.modals.userdup.advice": "Berriro konektatu beste leiho hau erabiltzeko.", + "pad.modals.unauth": "Baimenik gabe", + "pad.modals.unauth.explanation": "Orrialdea ikusten ari zinela zure baimenak aldatu dira. Saia zaitez berriro konektatzen.", + "pad.modals.looping": "Deskonektatua.", + "pad.modals.looping.explanation": "Sinkronizazio zerbitzariarekin komunikazioa arazoak daude.", + "pad.modals.looping.cause": "Agian firewall edo proxy ez-bateragarri baten bidez konektatu zara.", + "pad.modals.initsocketfail": "Zerbitzarira ezin da iritsi.", + "pad.modals.initsocketfail.explanation": "Ezin izan da konektatu sinkronizazio zerbitzarira.", + "pad.modals.initsocketfail.cause": "Ziurrenik hau zure nabigatzailea edo internet konexioaren arazo bat dela eta izango da.", + "pad.modals.slowcommit": "Deskonektatu.", + "pad.modals.slowcommit.explanation": "Zerbitzariak ez du erantzuten.", + "pad.modals.slowcommit.cause": "Baliteke hau sarearen konexio arazoak direla eta izatea.", + "pad.modals.deleted": "Ezabatua.", + "pad.modals.deleted.explanation": "Pad hau ezabatua izan da.", + "pad.modals.disconnected": "Deskonektatua izan zara.", + "pad.modals.disconnected.explanation": "Zerbitzariaren konexioa galdu da", + "pad.modals.disconnected.cause": "Baliteke zerbitzaria irisgarria ez izatea. Mesedez, esaiguzu hau gertatzen jarraitzen badu.", + "pad.share": "Pad hau partekatu", + "pad.share.readonly": "Irakurtzeko bakarrik", + "pad.share.link": "Lotura", + "pad.share.emebdcode": "URLa txertatu", + "pad.chat": "Txata", + "pad.chat.title": "Pad honetarako txata ireki.", + "pad.chat.loadmessages": "Mezu gehiago kargatu", + "timeslider.pageTitle": "{{appTitle}} denbora lerroa", + "timeslider.toolbar.returnbutton": "Padera itzuli", + "timeslider.toolbar.authors": "Egileak:", + "timeslider.toolbar.authorsList": "Egilerik gabe", + "timeslider.toolbar.exportlink.title": "Esportatu", + "timeslider.exportCurrent": "Gorde bertsio hau honela:", + "timeslider.version": "Bertsioa {{version}}", + "timeslider.saved": "{{year}}ko {{month}}ren {{day}}an gordeta", + "timeslider.dateformat": "{{year}}/{{month}}/{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Urtarrila", + "timeslider.month.february": "Otsaila", + "timeslider.month.march": "Martxoa", + "timeslider.month.april": "Apirila", + "timeslider.month.may": "Maiatza", + "timeslider.month.june": "Ekaina", + "timeslider.month.july": "Uztaila", + "timeslider.month.august": "Abuztua", + "timeslider.month.september": "Iraila", + "timeslider.month.october": "Urria", + "timeslider.month.november": "Azaroa", + "timeslider.month.december": "Abendua", + "timeslider.unnamedauthor": "{{num}} izenik gabeko egilea", + "timeslider.unnamedauthors": "{{num}} izenik gabeko egileak", + "pad.savedrevs.marked": "Berrikuspen hau markatua dago gordetako berrikuspen gisa", + "pad.userlist.entername": "Sartu zure erabiltzaile izena", + "pad.userlist.unnamed": "izenik gabe", + "pad.userlist.guest": "Gonbidatua", + "pad.userlist.deny": "Ukatu", + "pad.userlist.approve": "Onartu", + "pad.editbar.clearcolors": "Ezabatu egile koloreak dokumentu osoan?", + "pad.impexp.importbutton": "Inportatu orain", + "pad.impexp.importing": "Inportatzen...", + "pad.impexp.confirmimport": "Fitxategi bat inportatzen baduzu oraingo pad honen testua ezabatuko da. Ziur zaude jarraitu nahi duzula?", + "pad.impexp.convertFailed": "Ez gara gai fitxategi hau inportatzeko. Erabil ezazu, mesedez, beste dokumentu formatu bat edo kopiatu eta itsasi eskuz.", + "pad.impexp.uploadFailed": "Igotzean akatsa egon da, saia zaitez berriro", + "pad.impexp.importfailed": "Inportazioak akatsa egin du", + "pad.impexp.copypaste": "Mesedez kopiatu eta pegatu", + "pad.impexp.exportdisabled": "{{type}} formatuarekin esportatzea desgaituta dago. Kontakta ezazu administratzailea detaile gehiagorako." +} \ No newline at end of file diff --git a/src/locales/fa.json b/src/locales/fa.json index 4d2c448f3..48220dab4 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -3,8 +3,9 @@ "authors": { "0": "BMRG14", "1": "Dalba", - "3": "ZxxZxxZ", - "4": "\u0627\u0644\u0646\u0627\u0632" + "2": "Ebraminio", + "4": "ZxxZxxZ", + "5": "\u0627\u0644\u0646\u0627\u0632" } }, "index.newPad": "\u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062a\u0627\u0632\u0647", @@ -22,7 +23,7 @@ "pad.toolbar.clearAuthorship.title": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", "pad.toolbar.import_export.title": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0632/\u0628\u0647 \u0642\u0627\u0644\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641", "pad.toolbar.timeslider.title": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646", - "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u06cc \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc", + "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0633\u062e\u0647", "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a", "pad.toolbar.embed.title": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", "pad.toolbar.showusers.title": "\u0646\u0645\u0627\u06cc\u0634 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", diff --git a/src/locales/fo.json b/src/locales/fo.json new file mode 100644 index 000000000..93b467888 --- /dev/null +++ b/src/locales/fo.json @@ -0,0 +1,97 @@ +{ + "@metadata": { + "authors": [ + "EileenSanda" + ] + }, + "index.newPad": "N\u00fdggjur teldil", + "pad.toolbar.bold.title": "Vi\u00f0 feitum (Ctrl-B)", + "pad.toolbar.italic.title": "Skr\u00e1skrift (Ctrl-I)", + "pad.toolbar.underline.title": "Undirstrika\u00f0 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Gj\u00f8gnumstrika\u00f0", + "pad.toolbar.ol.title": "B\u00edleggingarlisti", + "pad.toolbar.undo.title": "Angra (Ctrl-Z)", + "pad.toolbar.redo.title": "Ger umaftur (Ctrl-Y)", + "pad.toolbar.import_export.title": "Innflyt/\u00datflyt fr\u00e1/til ymiskar f\u00edlust\u00f8ddir", + "pad.toolbar.savedRevision.title": "Goym Endursko\u00f0an", + "pad.toolbar.settings.title": "Innstillingar", + "pad.toolbar.embed.title": "Deil og Innset henda pad'in", + "pad.toolbar.showusers.title": "V\u00eds br\u00fakarar \u00e1 hesum paddi", + "pad.colorpicker.save": "Goym", + "pad.colorpicker.cancel": "\u00d3gilda", + "pad.loading": "L\u00f8\u00f0ir...", + "pad.passwordRequired": "T\u00fa hevur br\u00fak fyri einum loynior\u00f0i fyri at f\u00e1a atgongd til henda paddin", + "pad.permissionDenied": "T\u00fa hevur ikki loyvi til at f\u00e1a atgongd til henda paddin", + "pad.wrongPassword": "T\u00edtt loynior\u00f0 var skeivt", + "pad.settings.padSettings": "Pad innstillingar", + "pad.settings.myView": "M\u00edn s\u00fdning", + "pad.settings.stickychat": "Kjatta alt\u00ed\u00f0 \u00e1 skerminum", + "pad.settings.colorcheck": "Litir hj\u00e1 rith\u00f8vundaskapinum", + "pad.settings.linenocheck": "Linjunummur", + "pad.settings.rtlcheck": "Vil t\u00fa lesa innihaldi\u00f0 fr\u00e1 h\u00f8gru til vinstu?", + "pad.settings.fontType": "Skriftslag:", + "pad.settings.fontType.normal": "Vanligt", + "pad.settings.fontType.monospaced": "F\u00f8st breidd", + "pad.settings.globalView": "Global s\u00fdning", + "pad.settings.language": "M\u00e1l:", + "pad.importExport.import_export": "Innflyt/\u00datflyt", + "pad.importExport.import": "Legg \u00fat onkra tekstf\u00edlu ella dokument", + "pad.importExport.importSuccessful": "Ta\u00f0 eydna\u00f0ist!", + "pad.importExport.export": "\u00datflyt verandi pad sum:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Einfaldur tekstur", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Opi\u00f0 Dokument Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "T\u00fa kanst bert innflyta fr\u00e1 einf\u00f8ldum teksti ella html formatum. Fyri funksj\u00f3nir til innflytan fyri v\u00ed\u00f0arikomin vinarliga \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstallera abiword\u003C/a\u003E.", + "pad.modals.connected": "T\u00fa hevur samband.", + "pad.modals.reconnecting": "Roynir aftur at f\u00e1a samband vi\u00f0 t\u00edn pad..", + "pad.modals.forcereconnect": "Tvinga endurstovnan av sambandi.", + "pad.modals.userdup": "Er lati\u00f0 upp \u00ed \u00f8\u00f0rum vindeyga", + "pad.modals.userdup.explanation": "Ta\u00f0 s\u00e6r \u00fat til at hesin paddurin er latin upp \u00ed meira enn einum brovsara vindeyga \u00e1 hesari telduni.", + "pad.modals.userdup.advice": "Endurstovna sambandi fyri at n\u00fdta hetta vindeyga \u00ed sta\u00f0in.", + "pad.modals.unauth": "Er ikki loyvt", + "pad.modals.unauth.explanation": "T\u00edni loyvi eru broytt, me\u00f0an t\u00fa hevur hugt at hesi s\u00ed\u00f0uni. Royn og endurstovna sambandi.", + "pad.modals.looping": "T\u00fa misti sambandi.", + "pad.modals.initsocketfail": "Amb\u00e6tarin er \u00f3atkomuligur.", + "pad.modals.initsocketfail.cause": "Hetta skyldast mest sannl\u00edkt ein trupulleika vi\u00f0 t\u00ednum kaga/brovsara ella vi\u00f0 t\u00ednum internetsambandi.", + "pad.modals.slowcommit": "T\u00fa misti sambandi.", + "pad.modals.slowcommit.explanation": "Amb\u00e6tarin (servarin) svarar ikki.", + "pad.modals.slowcommit.cause": "Hetta kann skyldast trupulleikar vi\u00f0 netverkssambandinum.", + "pad.modals.deleted": "Er strika\u00f0.", + "pad.modals.deleted.explanation": "Hesin paddurin er fluttur.", + "pad.modals.disconnected": "T\u00fa hevur mist sambandi.", + "pad.modals.disconnected.explanation": "Sambandi\u00f0 til amb\u00e6tarin er avbroti\u00f0", + "pad.share": "Deil henda paddin", + "pad.share.readonly": "Vart fyri skriving", + "pad.share.link": "Sl\u00f3\u00f0", + "timeslider.toolbar.returnbutton": "Vend aftur til pad'in", + "timeslider.toolbar.authors": "H\u00f8vundar:", + "timeslider.toolbar.authorsList": "Ongir h\u00f8vundar", + "timeslider.toolbar.exportlink.title": "\u00datflyt", + "timeslider.exportCurrent": "\u00datflyt hesa versj\u00f3na sum:", + "timeslider.version": "Versj\u00f3n {{version}}", + "timeslider.saved": "Goymt {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januar", + "timeslider.month.february": "Februar", + "timeslider.month.march": "Mars", + "timeslider.month.april": "Apr\u00edl", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juni", + "timeslider.month.july": "Juli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "October", + "timeslider.month.november": "November", + "timeslider.month.december": "Desember", + "timeslider.unnamedauthor": "{{num}} \u00f3nevndur h\u00f8vundur", + "timeslider.unnamedauthors": "{{num}} \u00f3nevndir h\u00f8vundar", + "pad.savedrevs.marked": "Henda endursko\u00f0anin er n\u00fa merkt sum ein goymd endursko\u00f0an", + "pad.userlist.entername": "Skriva t\u00edtt navn", + "pad.userlist.unnamed": "ikki-navngivi\u00f0", + "pad.userlist.guest": "Gestur", + "pad.userlist.deny": "Nokta", + "pad.userlist.approve": "G\u00f3\u00f0kenn" +} \ No newline at end of file diff --git a/src/locales/fr.json b/src/locales/fr.json index 703f1da2b..272faf93f 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -9,9 +9,12 @@ "5": "Jean-Fr\u00e9d\u00e9ric", "6": "Leviathan", "7": "McDutchie", - "8": "Od1n", - "9": "Peter17", - "11": "Tux-tn" + "8": "Metroitendo", + "9": "Od1n", + "10": "Peter17", + "11": "Quenenni", + "13": "Stephane Cottin", + "14": "Tux-tn" } }, "index.newPad": "Nouveau Pad", @@ -44,8 +47,8 @@ "pad.settings.stickychat": "Toujours afficher le chat", "pad.settings.colorcheck": "Couleurs d\u2019identification", "pad.settings.linenocheck": "Num\u00e9ros de lignes", - "pad.settings.rtlcheck": "Lire le contenu de la droite vers la gauche ?", - "pad.settings.fontType": "Type de police :", + "pad.settings.rtlcheck": "Lecture de droite \u00e0 gauche", + "pad.settings.fontType": "Police :", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Vue d\u2019ensemble", @@ -82,7 +85,7 @@ "pad.modals.deleted.explanation": "Ce Pad a \u00e9t\u00e9 supprim\u00e9.", "pad.modals.disconnected": "Vous avez \u00e9t\u00e9 d\u00e9connect\u00e9.", "pad.modals.disconnected.explanation": "La connexion au serveur a \u00e9chou\u00e9.", - "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Veuillez nous en informer si le probl\u00e8me persiste.", + "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Si le probl\u00e8me persiste, veuillez nous en informer.", "pad.share": "Partager ce Pad", "pad.share.readonly": "Lecture seule", "pad.share.link": "Lien", @@ -91,14 +94,14 @@ "pad.chat.title": "Ouvrir le chat associ\u00e9 \u00e0 ce pad.", "pad.chat.loadmessages": "Charger davantage de messages", "timeslider.pageTitle": "Historique dynamique de {{appTitle}}", - "timeslider.toolbar.returnbutton": "Retour \u00e0 ce Pad.", + "timeslider.toolbar.returnbutton": "Retour au Pad.", "timeslider.toolbar.authors": "Auteurs :", "timeslider.toolbar.authorsList": "Aucun auteur", "timeslider.toolbar.exportlink.title": "Exporter", "timeslider.exportCurrent": "Exporter la version actuelle en\u00a0:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Enregistr\u00e9 le {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{secondes}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janvier", "timeslider.month.february": "F\u00e9vrier", "timeslider.month.march": "Mars", @@ -115,7 +118,7 @@ "timeslider.unnamedauthors": "{{num}} auteurs anonymes", "pad.savedrevs.marked": "Cette r\u00e9vision est maintenant marqu\u00e9e comme r\u00e9vision enregistr\u00e9e", "pad.userlist.entername": "Entrez votre nom", - "pad.userlist.unnamed": "sans nom", + "pad.userlist.unnamed": "anonyme", "pad.userlist.guest": "Invit\u00e9", "pad.userlist.deny": "Refuser", "pad.userlist.approve": "Approuver", diff --git a/src/locales/km.json b/src/locales/km.json new file mode 100644 index 000000000..095a8b53e --- /dev/null +++ b/src/locales/km.json @@ -0,0 +1,52 @@ +{ + "@metadata": { + "authors": [ + "\u179c\u17d0\u178e\u1790\u17b6\u179a\u17b7\u1791\u17d2\u1792" + ] + }, + "index.newPad": "\u1795\u17c1\u178f\u1790\u17d2\u1798\u17b8", + "index.createOpenPad": "\u17ac\u1794\u1784\u17d2\u1780\u17be\u178f/\u1794\u17be\u1780\u1795\u17c1\u178f\u178a\u17c2\u179b\u1798\u17b6\u1793\u1788\u17d2\u1798\u17c4\u17c7\u17d6", + "pad.toolbar.bold.title": "\u178a\u17b7\u178f (Ctrl-B)", + "pad.toolbar.italic.title": "\u1791\u17d2\u179a\u17c1\u178f (Ctrl-I)", + "pad.toolbar.underline.title": "\u1782\u17bc\u179f\u1794\u1793\u17d2\u1791\u17b6\u178f\u17cb (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u1786\u17bc\u178f\u1785\u17c4\u179b", + "pad.toolbar.ol.title": "\u1794\u1789\u17d2\u1787\u17b8\u178f\u17b6\u1798\u178f\u1798\u17d2\u179a\u17c0\u1794", + "pad.toolbar.ul.title": "\u1794\u1789\u17d2\u1787\u17b8\u1798\u17b7\u1793\u178f\u17b6\u1798\u178f\u1798\u17d2\u179a\u17c0\u1794", + "pad.toolbar.indent.title": "\u1781\u17b7\u178f\u1785\u17bc\u179b\u1780\u17d2\u1793\u17bb\u1784", + "pad.toolbar.unindent.title": "\u1781\u17b7\u178f\u1785\u17c1\u1789\u1780\u17d2\u179a\u17c5", + "pad.toolbar.undo.title": "\u17a2\u17b6\u1793\u17cb\u178c\u17bc (Ctrl-Z)", + "pad.toolbar.redo.title": "\u179a\u17b8\u178c\u17bc (Ctrl-Y)", + "pad.toolbar.import_export.title": "\u1793\u17b6\u17c6\u1785\u17bc\u179b/\u1793\u17b6\u17c6\u1785\u17c1\u1789 \u1796\u17b8/\u1791\u17c5\u1794\u17d2\u179a\u1797\u17c1\u1791\u17af\u1780\u179f\u17b6\u179a\u1795\u17d2\u179f\u17c1\u1784\u1791\u17c0\u178f", + "pad.toolbar.settings.title": "\u1780\u17b6\u179a\u1780\u17c6\u178e\u178f\u17cb\u200b", + "pad.colorpicker.save": "\u179a\u1780\u17d2\u179f\u17b6\u1791\u17bb\u1780", + "pad.colorpicker.cancel": "\u1794\u17c4\u17c7\u1794\u1784\u17cb", + "pad.loading": "\u1780\u17c6\u1796\u17bb\u1784\u1795\u17d2\u1791\u17bb\u1780\u2026", + "pad.settings.fontType": "\u1794\u17d2\u179a\u1797\u17c1\u1791\u1796\u17bb\u1798\u17d2\u1796\u17a2\u1780\u17d2\u179f\u179a\u17d6", + "pad.settings.fontType.normal": "\u1792\u1798\u17d2\u1798\u178f\u17b6", + "pad.settings.language": "\u1797\u17b6\u179f\u17b6\u17d6", + "pad.importExport.import_export": "\u1793\u17b6\u17c6\u1785\u17bc\u179b/\u1793\u17b6\u17c6\u1785\u17c1\u1789", + "pad.importExport.importSuccessful": "\u178a\u17c4\u1799\u1787\u17c4\u1782\u1787\u17d0\u1799!", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Plain text", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u1794\u17b6\u1793\u200b\u178f\u1797\u17d2\u1787\u17b6\u1794\u17cb\u200b\u17d4", + "pad.share.link": "\u178f\u17c6\u178e\u200b\u1797\u17d2\u1787\u17b6\u1794\u17cb", + "timeslider.month.january": "\u1798\u1780\u179a\u17b6", + "timeslider.month.february": "\u1780\u17bb\u1798\u17d2\u1797\u17c8", + "timeslider.month.march": "\u1798\u17b7\u1793\u17b6", + "timeslider.month.april": "\u1798\u17c1\u179f\u17b6", + "timeslider.month.may": "\u17a7\u179f\u1797\u17b6", + "timeslider.month.june": "\u1798\u17b7\u1790\u17bb\u1793\u17b6\u200b", + "timeslider.month.july": "\u1780\u1780\u17d2\u178a\u178a\u17b6\u200b", + "timeslider.month.august": "\u179f\u17b8\u17a0\u17b6", + "timeslider.month.september": "\u1780\u1789\u17d2\u1789\u17b6", + "timeslider.month.october": "\u178f\u17bb\u179b\u17b6", + "timeslider.month.november": "\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6", + "timeslider.month.december": "\u1792\u17d2\u1793\u17bc", + "pad.userlist.guest": "\u1797\u17d2\u1789\u17c0\u179c", + "pad.impexp.importbutton": "\u1793\u17b6\u17c6\u1785\u17bc\u179b\u17a5\u17a1\u17bc\u179c\u1793\u17c1\u17c7", + "pad.impexp.importing": "\u1780\u17c6\u1796\u17bb\u1784\u1793\u17b6\u17c6\u1785\u17bc\u179b\u200b..." +} \ No newline at end of file diff --git a/src/locales/lb.json b/src/locales/lb.json index 27a43fcfd..bd73d7ecd 100644 --- a/src/locales/lb.json +++ b/src/locales/lb.json @@ -1,4 +1,9 @@ { + "@metadata": { + "authors": [ + "Robby" + ] + }, "index.newPad": "Neie Pad", "pad.toolbar.ol.title": "Numer\u00e9iert L\u00ebscht", "pad.toolbar.ul.title": "Net-numer\u00e9iert L\u00ebscht", @@ -44,10 +49,5 @@ "pad.userlist.entername": "Gitt \u00c4ren Numm an", "pad.userlist.guest": "Gaascht", "pad.impexp.importbutton": "Elo import\u00e9ieren", - "pad.impexp.importing": "Import\u00e9ieren...", - "@metadata": { - "authors": [ - "Robby" - ] - } + "pad.impexp.importing": "Import\u00e9ieren..." } \ No newline at end of file diff --git a/src/locales/lt.json b/src/locales/lt.json new file mode 100644 index 000000000..f75ff214a --- /dev/null +++ b/src/locales/lt.json @@ -0,0 +1,72 @@ +{ + "@metadata": { + "authors": [ + "Mantak111" + ] + }, + "pad.toolbar.bold.title": "Pary\u0161kintasis (Ctrl-B)", + "pad.toolbar.italic.title": "Pasvirasis (Ctrl-I)", + "pad.toolbar.underline.title": "Pabraukimas (Ctrl-U)", + "pad.toolbar.undo.title": "Anuliuoti (Ctrl-Z)", + "pad.toolbar.redo.title": "Perdaryti (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Tvarkyti autoryst\u0117s spalvas", + "pad.toolbar.settings.title": "Nustatymai", + "pad.colorpicker.save": "I\u0161saugoti", + "pad.colorpicker.cancel": "At\u0161aukti", + "pad.loading": "\u012ekraunama...", + "pad.settings.fontType.normal": "Normalus", + "pad.settings.language": "Kalba:", + "pad.importExport.import_export": "Importuoti/Eksportuoti", + "pad.importExport.import": "\u012ekelkite bet kok\u012f tekstin\u012f fail\u0105 arba dokument\u0105", + "pad.importExport.importSuccessful": "Pavyko!", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Paprastasis tekstas", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Atvirasis dokumento formatas)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "Prisijungta.", + "pad.modals.unauth": "Neleid\u017eiama", + "pad.modals.looping": "Atjungtas.", + "pad.modals.initsocketfail": "Serveris yra nepasiekiamas.", + "pad.modals.slowcommit": "Atjungtas.", + "pad.modals.slowcommit.explanation": "Serveris neatsako.", + "pad.modals.deleted": "I\u0161trintas.", + "pad.modals.disconnected": "J\u016bs atsijung\u0117te.", + "pad.share.readonly": "Tik skaityti", + "pad.share.link": "Nuoroda", + "pad.share.emebdcode": "\u012eterptasis URL", + "pad.chat": "Pokalbiai", + "pad.chat.loadmessages": "\u012ekrauti daugiau prane\u0161im\u0173", + "timeslider.toolbar.authors": "Autoriai:", + "timeslider.toolbar.authorsList": "N\u0117ra autori\u0173", + "timeslider.toolbar.exportlink.title": "Eksportuoti", + "timeslider.exportCurrent": "Eksportuoti dabartin\u0119 versij\u0105 kaip:", + "timeslider.version": "Versija {{version}}", + "timeslider.saved": "I\u0161saugota {{year}},{{month}} {{day}}", + "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Sausis", + "timeslider.month.february": "Vasaris", + "timeslider.month.march": "Kovas", + "timeslider.month.april": "Balandis", + "timeslider.month.may": "Gegu\u017e\u0117", + "timeslider.month.june": "Bir\u017eelis", + "timeslider.month.july": "Liepa", + "timeslider.month.august": "Rugpj\u016btis", + "timeslider.month.september": "Rugs\u0117jis", + "timeslider.month.october": "Spalis", + "timeslider.month.november": "Lapkritis", + "timeslider.month.december": "Gruodis", + "timeslider.unnamedauthor": "{{num}} bevardis autorius", + "timeslider.unnamedauthors": "{{num}} bevard\u017eiai(-i\u0173) autoriai(-i\u0173)", + "pad.userlist.entername": "\u012eveskite savo vard\u0105", + "pad.userlist.unnamed": "bevardis", + "pad.userlist.guest": "Sve\u010dias", + "pad.userlist.deny": "Neigti", + "pad.userlist.approve": "Patvirtinti", + "pad.impexp.importbutton": "Importuoti dabar", + "pad.impexp.importing": "Importuojama...", + "pad.impexp.uploadFailed": "\u012ek\u0117limas nepavyko, bandykite dar kart\u0105", + "pad.impexp.importfailed": "Importuoti nepavyko", + "pad.impexp.copypaste": "Pra\u0161ome nukopijuoti ir \u012fklijuoti" +} \ No newline at end of file diff --git a/src/locales/lv.json b/src/locales/lv.json new file mode 100644 index 000000000..32d178d8f --- /dev/null +++ b/src/locales/lv.json @@ -0,0 +1,54 @@ +{ + "@metadata": { + "authors": [ + "Admresdeserv." + ] + }, + "pad.toolbar.bold.title": "Treknrakst\u0101 (CTRL + B)", + "pad.toolbar.italic.title": "Sl\u012bpraksta (Ctrl-es)", + "pad.toolbar.underline.title": "Pasv\u012btrojuma (CTRL + U)", + "pad.toolbar.strikethrough.title": "P\u0101rsv\u012btrojums", + "pad.toolbar.ol.title": "Sak\u0101rtots saraksts", + "pad.toolbar.ul.title": "Nesak\u0101rtots saraksts", + "pad.toolbar.indent.title": "Atk\u0101pe", + "pad.toolbar.unindent.title": "Izk\u0101pe", + "pad.toolbar.undo.title": "Atsaukt (CTRL + Z)", + "pad.toolbar.redo.title": "Atcelt atsauk\u0161anu (CTRL + Y)", + "pad.toolbar.clearAuthorship.title": "Not\u012brit autoru kr\u0101sas", + "pad.toolbar.import_export.title": "Import\u0113\u0161anas/eksport\u0113\u0161anas no un uz citu failu form\u0101tiem", + "pad.toolbar.settings.title": "Iestat\u012bjumi", + "pad.colorpicker.save": "Saglab\u0101t", + "pad.colorpicker.cancel": "Atcelt", + "pad.loading": "Iel\u0101d\u0113\u2026", + "pad.passwordRequired": "Ir nepiecie\u0161ama parole, lai piek\u013c\u016btu \u0161im pad", + "pad.permissionDenied": "Atvaino, bet tev nav pieejas \u0161im pad.", + "pad.wrongPassword": "J\u016bsu parole bija nepareiza", + "pad.settings.linenocheck": "Rindi\u0146u numurus", + "pad.settings.rtlcheck": "Las\u012bt saturu no lab\u0101s puses uz kreiso?", + "pad.settings.fontType": "Fonta tips:", + "pad.settings.fontType.normal": "Norm\u0101ls", + "pad.settings.globalView": "Glob\u0101lu skat\u012bjumu", + "pad.settings.language": "Valoda:", + "pad.importExport.importSuccessful": "Veiksm\u012bgi!", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Vienk\u0101r\u0161a teksta", + "pad.importExport.exportword": "Programma Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open dokumenta form\u0101ts)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.userdup": "Atv\u0113rts cit\u0101 log\u0101", + "pad.modals.unauth": "Nav at\u013cauts", + "pad.modals.looping": "Atvienots.", + "pad.modals.looping.explanation": "Past\u0101v sakaru probl\u0113mas ar sinhroniz\u0101cijas servera.", + "pad.modals.initsocketfail": "Serveris nav sasniedzams.", + "pad.modals.initsocketfail.explanation": "Nevar\u0113ja izveidot savienojumu ar sinhroniz\u0101cijas serveri.", + "pad.modals.slowcommit": "Atvienots.", + "pad.modals.slowcommit.explanation": "Serveris nerea\u0123\u0113.", + "pad.modals.deleted": "Dz\u0113sts", + "pad.modals.disconnected": "J\u016bs esat atvienots.", + "pad.modals.disconnected.explanation": "Tika zaud\u0113ts savienojums ar serveri", + "pad.modals.disconnected.cause": "Iesp\u0113jams, ka serveris nav pieejams. L\u016bgums pazi\u0146ot mums, ja tas turpina notikt.", + "pad.share": "Koplietot \u0161o pad", + "pad.share.readonly": "Tikai las\u0101ms", + "pad.share.link": "Saite" +} \ No newline at end of file diff --git a/src/locales/mk.json b/src/locales/mk.json index c95e69402..b0f9b848a 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -22,7 +22,7 @@ "pad.toolbar.timeslider.title": "\u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", "pad.toolbar.savedRevision.title": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430", "pad.toolbar.settings.title": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438", - "pad.toolbar.embed.title": "\u0412\u043c\u0435\u0442\u043d\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", + "pad.toolbar.embed.title": "\u0421\u043f\u043e\u0434\u0435\u043b\u0435\u0442\u0435 \u0438 \u0432\u043c\u0435\u0442\u043d\u0435\u0442\u0435 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", "pad.toolbar.showusers.title": "\u041f\u0440\u0438\u043a\u0430\u0436. \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", "pad.colorpicker.save": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458", "pad.colorpicker.cancel": "\u041e\u0442\u043a\u0430\u0436\u0438", diff --git a/src/locales/ml.json b/src/locales/ml.json index be71c23be..4567dc7c2 100644 --- a/src/locales/ml.json +++ b/src/locales/ml.json @@ -23,7 +23,7 @@ "pad.toolbar.timeslider.title": "\u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", "pad.toolbar.savedRevision.title": "\u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", "pad.toolbar.settings.title": "\u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", - "pad.toolbar.embed.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "pad.toolbar.embed.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d4d \u0d35\u0d46\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15, \u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", "pad.toolbar.showusers.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d09\u0d2a\u0d2f\u0d4b\u0d15\u0d4d\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d2a\u0d4d\u0d30\u0d26\u0d7c\u0d36\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", "pad.colorpicker.save": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", "pad.colorpicker.cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", @@ -107,7 +107,7 @@ "timeslider.unnamedauthors": "{{num}} \u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e", "pad.savedrevs.marked": "\u0d08 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d3e\u0d2f\u0d3f \u0d05\u0d1f\u0d2f\u0d3e\u0d33\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", "pad.userlist.entername": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", - "pad.userlist.unnamed": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24", + "pad.userlist.unnamed": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24\u0d35", "pad.userlist.guest": "\u0d05\u0d24\u0d3f\u0d25\u0d3f", "pad.userlist.deny": "\u0d28\u0d3f\u0d30\u0d38\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", "pad.userlist.approve": "\u0d05\u0d02\u0d17\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", diff --git a/src/locales/oc.json b/src/locales/oc.json index be4da3cd7..46979150d 100644 --- a/src/locales/oc.json +++ b/src/locales/oc.json @@ -19,9 +19,9 @@ "pad.toolbar.clearAuthorship.title": "Escafar las colors qu'identifican los autors", "pad.toolbar.import_export.title": "Importar/Exportar de/cap a un format de fichi\u00e8r diferent", "pad.toolbar.timeslider.title": "Istoric dinamic", - "pad.toolbar.savedRevision.title": "Versions enregistradas", + "pad.toolbar.savedRevision.title": "Enregistrar la revision", "pad.toolbar.settings.title": "Param\u00e8tres", - "pad.toolbar.embed.title": "Integrar aqueste Pad", + "pad.toolbar.embed.title": "Partejar e integrar aqueste Pad", "pad.toolbar.showusers.title": "Afichar los utilizaires del Pad", "pad.colorpicker.save": "Enregistrar", "pad.colorpicker.cancel": "Anullar", @@ -34,6 +34,7 @@ "pad.settings.stickychat": "Afichar totjorn lo chat", "pad.settings.colorcheck": "Colors d\u2019identificacion", "pad.settings.linenocheck": "Num\u00e8ros de linhas", + "pad.settings.rtlcheck": "Lectura de drecha a esqu\u00e8rra", "pad.settings.fontType": "Tipe de poli\u00e7a :", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", @@ -100,6 +101,8 @@ "timeslider.month.october": "Octobre", "timeslider.month.november": "Novembre", "timeslider.month.december": "Decembre", + "timeslider.unnamedauthor": "{{num}} autor anonime", + "timeslider.unnamedauthors": "{{num}} autors anonimes", "pad.savedrevs.marked": "Aquesta revision es ara marcada coma revision enregistrada", "pad.userlist.entername": "Entratz v\u00f2stre nom", "pad.userlist.unnamed": "sens nom", diff --git a/src/locales/os.json b/src/locales/os.json index 3f6d0d24a..209f7f558 100644 --- a/src/locales/os.json +++ b/src/locales/os.json @@ -21,7 +21,7 @@ "pad.toolbar.timeslider.title": "\u0420\u04d5\u0441\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", "pad.toolbar.savedRevision.title": "\u0424\u04d5\u043b\u0442\u04d5\u0440 \u0431\u0430\u0432\u04d5\u0440\u044b\u043d\u04d5\u043d", "pad.toolbar.settings.title": "\u0423\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u04d5", - "pad.toolbar.embed.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0444\u0442\u0430\u0443\u044b\u043d", + "pad.toolbar.embed.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0444\u0442\u0430\u0443 \u00e6\u043c\u00e6 \u0439\u00e6 \u0442\u044b\u0445\u0445\u00e6\u0439 \u0430\u0445\u044a\u00e6\u0440 \u043a\u00e6\u043d", "pad.toolbar.showusers.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0440\u0445\u0430\u0439\u0434\u0436\u044b\u0442\u044b \u0440\u0430\u0432\u0434\u0438\u0441\u044b\u043d", "pad.colorpicker.save": "\u041d\u044b\u0432\u00e6\u0440\u044b\u043d", "pad.colorpicker.cancel": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", diff --git a/src/locales/pa.json b/src/locales/pa.json new file mode 100644 index 000000000..03f2b1adf --- /dev/null +++ b/src/locales/pa.json @@ -0,0 +1,107 @@ +{ + "@metadata": { + "authors": [ + "Aalam" + ] + }, + "index.newPad": "\u0a28\u0a35\u0a3e\u0a02 \u0a2a\u0a48\u0a21", + "index.createOpenPad": "\u0a1c\u0a3e\u0a02 \u0a28\u0a3e\u0a02 \u0a28\u0a3e\u0a32 \u0a28\u0a35\u0a3e\u0a02 \u0a2a\u0a48\u0a21 \u0a2c\u0a23\u0a3e\u0a13/\u0a16\u0a4b\u0a32\u0a4d\u0a39\u0a4b:", + "pad.toolbar.bold.title": "\u0a17\u0a42\u0a5c\u0a4d\u0a39\u0a3e (Ctrl-B)", + "pad.toolbar.italic.title": "\u0a24\u0a3f\u0a30\u0a1b\u0a3e (Ctrl-I)", + "pad.toolbar.underline.title": "\u0a39\u0a47\u0a20\u0a3e\u0a02-\u0a30\u0a47\u0a16\u0a3e (Ctrl-U)", + "pad.toolbar.strikethrough.title": "\u0a35\u0a3f\u0a70\u0a28\u0a4d\u0a39\u0a4b \u0a35\u0a3f\u0a28\u0a4b", + "pad.toolbar.ol.title": "\u0a32\u0a5c\u0a40\u0a35\u0a3e\u0a30 \u0a32\u0a3f\u0a38\u0a1f", + "pad.toolbar.ul.title": "\u0a2c\u0a3f\u0a28-\u0a32\u0a5c\u0a40\u0a2c\u0a71\u0a27 \u0a38\u0a42\u0a1a\u0a40", + "pad.toolbar.indent.title": "\u0a39\u0a3e\u0a38\u0a3c\u0a40\u0a0f \u0a24\u0a4b\u0a02 \u0a26\u0a42\u0a30", + "pad.toolbar.undo.title": "\u0a35\u0a3e\u0a2a\u0a38 (Ctrl-Z)", + "pad.toolbar.redo.title": "\u0a2a\u0a30\u0a24\u0a3e\u0a13 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u0a2a\u0a30\u0a2e\u0a3e\u0a23\u0a15\u0a3f\u0a24\u0a3e \u0a30\u0a70\u0a17 \u0a38\u0a3e\u0a2b\u0a3c \u0a15\u0a30\u0a4b", + "pad.toolbar.import_export.title": "\u0a35\u0a71\u0a16-\u0a35\u0a71\u0a16 \u0a2b\u0a3e\u0a07\u0a32 \u0a2b\u0a3e\u0a30\u0a2e\u0a48\u0a1f \u0a24\u0a4b\u0a02/\u0a35\u0a3f\u0a71\u0a1a \u0a07\u0a70\u0a2a\u0a4b\u0a30\u0a1f/\u0a10\u0a15\u0a38\u0a2a\u0a4b\u0a30\u0a1f \u0a15\u0a30\u0a4b", + "pad.toolbar.timeslider.title": "\u0a38\u0a2e\u0a3e\u0a02-\u0a32\u0a15\u0a40\u0a30", + "pad.toolbar.savedRevision.title": "\u0a30\u0a40\u0a35\u0a3f\u0a1c\u0a3c\u0a28 \u0a38\u0a70\u0a2d\u0a3e\u0a32\u0a4b", + "pad.toolbar.settings.title": "\u0a38\u0a48\u0a1f\u0a3f\u0a70\u0a17", + "pad.toolbar.embed.title": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a38\u0a3e\u0a02\u0a1d\u0a3e \u0a24\u0a47 \u0a07\u0a70\u0a2c\u0a48\u0a71\u0a21 \u0a15\u0a30\u0a4b", + "pad.toolbar.showusers.title": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a09\u0a71\u0a24\u0a47 \u0a2f\u0a42\u0a1c\u0a3c\u0a30 \u0a35\u0a47\u0a16\u0a3e\u0a13", + "pad.colorpicker.save": "\u0a38\u0a70\u0a2d\u0a3e\u0a32\u0a4b", + "pad.colorpicker.cancel": "\u0a30\u0a71\u0a26 \u0a15\u0a30\u0a4b", + "pad.loading": "\u2026\u0a32\u0a4b\u0a21 \u0a15\u0a40\u0a24\u0a3e \u0a1c\u0a3e \u0a30\u0a3f\u0a39\u0a3e \u0a39\u0a48", + "pad.passwordRequired": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a26\u0a40 \u0a35\u0a30\u0a24\u0a4b\u0a02 \u0a15\u0a30\u0a28 \u0a32\u0a08 \u0a24\u0a41\u0a39\u0a3e\u0a28\u0a42\u0a70 \u0a2a\u0a3e\u0a38\u0a35\u0a30\u0a21 \u0a1a\u0a3e\u0a39\u0a40\u0a26\u0a3e \u0a39\u0a48", + "pad.permissionDenied": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a35\u0a30\u0a24\u0a28 \u0a32\u0a08 \u0a24\u0a41\u0a39\u0a3e\u0a28\u0a42\u0a70 \u0a05\u0a27\u0a3f\u0a15\u0a3e\u0a30 \u0a28\u0a39\u0a40\u0a02 \u0a39\u0a28", + "pad.wrongPassword": "\u0a24\u0a41\u0a39\u0a3e\u0a21\u0a3e \u0a2a\u0a3e\u0a38\u0a35\u0a30\u0a21 \u0a17\u0a32\u0a24\u0a40 \u0a38\u0a40", + "pad.settings.padSettings": "\u0a2a\u0a48\u0a21 \u0a38\u0a48\u0a1f\u0a3f\u0a70\u0a17", + "pad.settings.myView": "\u0a2e\u0a47\u0a30\u0a40 \u0a1d\u0a32\u0a15", + "pad.settings.stickychat": "\u0a39\u0a2e\u0a47\u0a38\u0a3c\u0a3e \u0a38\u0a15\u0a30\u0a40\u0a28 \u0a09\u0a71\u0a24\u0a47 \u0a17\u0a71\u0a32 \u0a15\u0a30\u0a4b", + "pad.settings.linenocheck": "\u0a32\u0a3e\u0a08\u0a28 \u0a28\u0a70\u0a2c\u0a30", + "pad.settings.rtlcheck": "\u0a38\u0a2e\u0a71\u0a17\u0a30\u0a40 \u0a38\u0a71\u0a1c\u0a47 \u0a24\u0a4b\u0a02 \u0a16\u0a71\u0a2c\u0a47 \u0a2a\u0a5c\u0a4d\u0a39\u0a28\u0a40 \u0a39\u0a48?", + "pad.settings.fontType": "\u0a2b\u0a4b\u0a02\u0a1f \u0a15\u0a3f\u0a38\u0a2e:", + "pad.settings.fontType.normal": "\u0a38\u0a27\u0a3e\u0a30\u0a28", + "pad.settings.fontType.monospaced": "\u0a2e\u0a4b\u0a28\u0a4b\u0a38\u0a2a\u0a47\u0a38", + "pad.settings.globalView": "\u0a17\u0a32\u0a4b\u0a2c\u0a32 \u0a1d\u0a32\u0a15", + "pad.settings.language": "\u0a2d\u0a3e\u0a38\u0a3c\u0a3e:", + "pad.importExport.import_export": "\u0a07\u0a70\u0a2a\u0a4b\u0a30\u0a1f/\u0a10\u0a15\u0a38\u0a2a\u0a4b\u0a30\u0a1f", + "pad.importExport.import": "\u0a15\u0a4b\u0a08 \u0a35\u0a40 \u0a1f\u0a48\u0a15\u0a38\u0a1f \u0a2b\u0a3e\u0a07\u0a32 \u0a1c\u0a3e\u0a02 \u0a26\u0a38\u0a24\u0a3e\u0a35\u0a47\u0a1c\u0a3c \u0a05\u0a71\u0a2a\u0a32\u0a4b\u0a21 \u0a15\u0a30\u0a4b", + "pad.importExport.importSuccessful": "\u0a38\u0a2b\u0a3c\u0a32!", + "pad.importExport.export": "\u0a2e\u0a4c\u0a1c\u0a42\u0a26\u0a3e \u0a2a\u0a48\u0a21 \u0a28\u0a42\u0a70 \u0a10\u0a15\u0a38\u0a2a\u0a4b\u0a30\u0a1f \u0a15\u0a30\u0a4b:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "\u0a38\u0a27\u0a3e\u0a30\u0a28 \u0a1f\u0a48\u0a15\u0a38\u0a1f", + "pad.importExport.exportword": "\u0a2e\u0a3e\u0a08\u0a15\u0a30\u0a4b\u0a38\u0a3e\u0a2b\u0a1f \u0a35\u0a30\u0a21", + "pad.importExport.exportpdf": "\u0a2a\u0a40\u0a21\u0a40\u0a10\u0a2b", + "pad.importExport.exportopen": "ODF (\u0a13\u0a2a\u0a28 \u0a21\u0a4c\u0a15\u0a42\u0a2e\u0a48\u0a02\u0a1f \u0a2b\u0a3e\u0a30\u0a2e\u0a48\u0a1f)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "\u0a15\u0a41\u0a28\u0a48\u0a15\u0a1f \u0a39\u0a48\u0964", + "pad.modals.reconnecting": "..\u0a24\u0a41\u0a39\u0a3e\u0a21\u0a47 \u0a2a\u0a48\u0a21 \u0a28\u0a3e\u0a32 \u0a2e\u0a41\u0a5c-\u0a15\u0a41\u0a28\u0a48\u0a15\u0a1f \u0a15\u0a40\u0a24\u0a3e \u0a1c\u0a3e \u0a30\u0a3f\u0a39\u0a3e \u0a39\u0a48", + "pad.modals.forcereconnect": "\u0a27\u0a71\u0a15\u0a47 \u0a28\u0a3e\u0a32 \u0a2e\u0a41\u0a5c-\u0a15\u0a41\u0a28\u0a48\u0a15\u0a1f \u0a15\u0a30\u0a4b", + "pad.modals.userdup": "\u0a39\u0a4b\u0a30 \u0a35\u0a3f\u0a70\u0a21\u0a4b \u0a35\u0a3f\u0a71\u0a1a \u0a16\u0a41\u0a71\u0a32\u0a4d\u0a39\u0a3f\u0a06 \u0a39\u0a48", + "pad.modals.unauth": "\u0a2a\u0a30\u0a2e\u0a3e\u0a23\u0a3f\u0a24 \u0a28\u0a39\u0a40\u0a02 \u0a39\u0a48", + "pad.modals.looping": "\u0a15\u0a41\u0a28\u0a15\u0a48\u0a1f \u0a16\u0a24\u0a2e \u0a39\u0a4b\u0a07\u0a06\u0964", + "pad.modals.initsocketfail": "\u0a38\u0a30\u0a35\u0a30 \u0a2a\u0a39\u0a41\u0a70\u0a1a \u0a35\u0a3f\u0a71\u0a1a \u0a28\u0a39\u0a40\u0a02 \u0a39\u0a48\u0964", + "pad.modals.slowcommit": "\u0a15\u0a41\u0a28\u0a15\u0a48\u0a1f \u0a16\u0a24\u0a2e \u0a39\u0a4b\u0a07\u0a06\u0964", + "pad.modals.slowcommit.explanation": "\u0a38\u0a30\u0a35\u0a30 \u0a1c\u0a35\u0a3e\u0a2c \u0a28\u0a39\u0a40\u0a02 \u0a26\u0a47 \u0a30\u0a3f\u0a39\u0a3e \u0a39\u0a48\u0964", + "pad.modals.slowcommit.cause": "\u0a07\u0a39 \u0a28\u0a48\u0a71\u0a1f\u0a35\u0a30\u0a15 \u0a15\u0a41\u0a28\u0a48\u0a15\u0a38\u0a3c\u0a28 \u0a28\u0a3e\u0a32 \u0a38\u0a2e\u0a71\u0a38\u0a3f\u0a06 \u0a15\u0a30\u0a15\u0a47 \u0a39\u0a4b \u0a38\u0a15\u0a26\u0a3e \u0a39\u0a48\u0964", + "pad.modals.deleted": "\u0a39\u0a1f\u0a3e\u0a07\u0a06\u0964", + "pad.modals.deleted.explanation": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a39\u0a1f\u0a3e\u0a07\u0a06 \u0a1c\u0a3e \u0a1a\u0a41\u0a71\u0a15\u0a3e \u0a39\u0a48\u0964", + "pad.modals.disconnected": "\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a21\u0a3f\u0a38-\u0a15\u0a41\u0a28\u0a48\u0a15\u0a1f \u0a39\u0a4b \u0a1a\u0a41\u0a71\u0a15\u0a47 \u0a39\u0a4b\u0964", + "pad.modals.disconnected.explanation": "\u0a38\u0a30\u0a35\u0a30 \u0a28\u0a3e\u0a32 \u0a15\u0a41\u0a28\u0a48\u0a15\u0a38\u0a3c\u0a28 \u0a16\u0a24\u0a2e \u0a39\u0a4b\u0a07\u0a06 \u0a39\u0a48", + "pad.share": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a38\u0a3e\u0a02\u0a1d\u0a3e \u0a15\u0a30\u0a4b", + "pad.share.readonly": "\u0a15\u0a47\u0a35\u0a32 \u0a2a\u0a5c\u0a4d\u0a39\u0a28 \u0a32\u0a08", + "pad.share.link": "\u0a32\u0a3f\u0a70\u0a15", + "pad.share.emebdcode": "\u0a07\u0a70\u0a2c\u0a48\u0a71\u0a21 URL", + "pad.chat": "\u0a17\u0a71\u0a32\u0a2c\u0a3e\u0a24", + "pad.chat.title": "\u0a07\u0a39 \u0a2a\u0a48\u0a21 \u0a32\u0a08 \u0a17\u0a71\u0a32\u0a2c\u0a3e\u0a24 \u0a16\u0a4b\u0a32\u0a4d\u0a39\u0a4b\u0964", + "pad.chat.loadmessages": "\u0a39\u0a4b\u0a30 \u0a38\u0a41\u0a28\u0a47\u0a39\u0a47 \u0a32\u0a4b\u0a21 \u0a15\u0a30\u0a4b", + "timeslider.pageTitle": "{{appTitle}} \u0a38\u0a2e\u0a3e\u0a02-\u0a32\u0a15\u0a40\u0a30", + "timeslider.toolbar.returnbutton": "\u0a2a\u0a48\u0a21 \u0a09\u0a71\u0a24\u0a47 \u0a35\u0a3e\u0a2a\u0a38", + "timeslider.toolbar.authors": "\u0a32\u0a47\u0a16\u0a15:", + "timeslider.toolbar.authorsList": "\u0a15\u0a4b\u0a08 \u0a32\u0a47\u0a16\u0a15 \u0a28\u0a39\u0a40\u0a02", + "timeslider.toolbar.exportlink.title": "\u0a10\u0a15\u0a38\u0a2a\u0a4b\u0a30\u0a1f", + "timeslider.exportCurrent": "\u0a2e\u0a4c\u0a1c\u0a42\u0a26\u0a3e \u0a35\u0a30\u0a1c\u0a28 \u0a07\u0a70\u0a1d \u0a10\u0a15\u0a38\u0a2a\u0a4b\u0a30\u0a1f \u0a15\u0a30\u0a4b:", + "timeslider.version": "\u0a35\u0a30\u0a1c\u0a28 {{version}}", + "timeslider.saved": "{{day}} {{month}} {{year}} \u0a28\u0a42\u0a70 \u0a38\u0a70\u0a2d\u0a3e\u0a32\u0a3f\u0a06", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "\u0a1c\u0a28\u0a35\u0a30\u0a40", + "timeslider.month.february": "\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40", + "timeslider.month.march": "\u0a2e\u0a3e\u0a30\u0a1a", + "timeslider.month.april": "\u0a05\u0a2a\u0a30\u0a48\u0a32", + "timeslider.month.may": "\u0a2e\u0a08", + "timeslider.month.june": "\u0a1c\u0a42\u0a28", + "timeslider.month.july": "\u0a1c\u0a41\u0a32\u0a3e\u0a08", + "timeslider.month.august": "\u0a05\u0a17\u0a38\u0a24", + "timeslider.month.september": "\u0a38\u0a24\u0a70\u0a2c\u0a30", + "timeslider.month.october": "\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30", + "timeslider.month.november": "\u0a28\u0a35\u0a70\u0a2c\u0a30", + "timeslider.month.december": "\u0a26\u0a38\u0a70\u0a2c\u0a30", + "timeslider.unnamedauthor": "{{num}} \u0a2c\u0a47\u0a28\u0a3e\u0a2e \u0a32\u0a47\u0a16\u0a15", + "timeslider.unnamedauthors": "{{num}} \u0a2c\u0a47\u0a28\u0a3e\u0a2e \u0a32\u0a47\u0a16\u0a15", + "pad.savedrevs.marked": "\u0a07\u0a39 \u0a30\u0a40\u0a35\u0a3f\u0a1c\u0a3c\u0a28 \u0a28\u0a42\u0a70 \u0a39\u0a41\u0a23 \u0a38\u0a70\u0a2d\u0a3e\u0a32\u0a47 \u0a39\u0a4b\u0a0f \u0a30\u0a40\u0a35\u0a3f\u0a1c\u0a3c\u0a28 \u0a35\u0a1c\u0a4b\u0a02 \u0a2e\u0a70\u0a28\u0a3f\u0a06 \u0a17\u0a3f\u0a06 \u0a39\u0a48", + "pad.userlist.entername": "\u0a06\u0a2a\u0a23\u0a3e \u0a28\u0a3e\u0a02 \u0a26\u0a3f\u0a09", + "pad.userlist.unnamed": "\u0a2c\u0a47\u0a28\u0a3e\u0a2e", + "pad.userlist.guest": "\u0a2e\u0a39\u0a3f\u0a2e\u0a3e\u0a28", + "pad.userlist.deny": "\u0a2a\u0a3e\u0a2c\u0a70\u0a26\u0a40", + "pad.userlist.approve": "\u0a2e\u0a28\u0a1c\u0a3c\u0a42\u0a30", + "pad.editbar.clearcolors": "\u0a2a\u0a42\u0a30\u0a47 \u0a26\u0a38\u0a3e\u0a24\u0a35\u0a47\u0a1c\u0a3c \u0a09\u0a71\u0a24\u0a47 \u0a2a\u0a30\u0a2e\u0a3e\u0a23\u0a15\u0a3f\u0a24\u0a3e \u0a30\u0a70\u0a17 \u0a38\u0a3e\u0a2b\u0a3c \u0a15\u0a30\u0a28\u0a47 \u0a39\u0a28?", + "pad.impexp.importbutton": "\u0a39\u0a41\u0a23\u0a47 \u0a07\u0a70\u0a2a\u0a4b\u0a30\u0a1f \u0a15\u0a30\u0a4b", + "pad.impexp.importing": "...\u0a07\u0a70\u0a2a\u0a4b\u0a30\u0a1f \u0a15\u0a40\u0a24\u0a3e \u0a1c\u0a3e \u0a30\u0a3f\u0a39\u0a3e \u0a39\u0a48", + "pad.impexp.uploadFailed": "\u0a05\u0a71\u0a2a\u0a32\u0a4b\u0a21 \u0a32\u0a08 \u0a2b\u0a47\u0a32\u0a4d\u0a39 \u0a39\u0a48, \u0a2b\u0a47\u0a30 \u0a15\u0a4b\u0a38\u0a3c\u0a3f\u0a38\u0a3c \u0a15\u0a30\u0a4b \u0a1c\u0a40\u0964", + "pad.impexp.importfailed": "\u0a07\u0a70\u0a2a\u0a4b\u0a30\u0a1f \u0a2b\u0a47\u0a32\u0a4d\u0a39 \u0a39\u0a48", + "pad.impexp.copypaste": "\u0a15\u0a3e\u0a2a\u0a40 \u0a15\u0a30\u0a4b \u0a1a\u0a47\u0a2a\u0a4b \u0a1c\u0a40" +} \ No newline at end of file diff --git a/src/locales/pl.json b/src/locales/pl.json index 0b285b2e9..c16fd5a85 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -79,7 +79,7 @@ "pad.share": "Udost\u0119pnij ten dokument", "pad.share.readonly": "Tylko do odczytu", "pad.share.link": "Link", - "pad.share.emebdcode": "Kod do umieszczenia", + "pad.share.emebdcode": "URL do umieszczenia", "pad.chat": "Czat", "pad.chat.title": "Otw\u00f3rz czat dla tego dokumentu.", "pad.chat.loadmessages": "Za\u0142aduj wi\u0119cej wiadomo\u015bci", diff --git a/src/locales/ps.json b/src/locales/ps.json index 07dd4375c..2de36396b 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -4,16 +4,23 @@ "Ahmed-Najib-Biabani-Ibrahimkhel" ] }, + "index.newPad": "\u0646\u0648\u06d0 \u0644\u064a\u06a9\u0686\u0647", + "index.createOpenPad": "\u064a\u0627 \u067e\u0647 \u0647\u0645\u062f\u06d0 \u0646\u0648\u0645 \u064a\u0648\u0647 \u0646\u0648\u06d0 \u0644\u064a\u06a9\u0686\u0647 \u062c\u0648\u0693\u0648\u0644/\u067e\u0631\u0627\u0646\u064a\u0633\u062a\u0644:", "pad.toolbar.bold.title": "\u0632\u063a\u0631\u062f (Ctrl-B)", "pad.toolbar.italic.title": "\u0631\u06d0\u0648\u0646\u062f (Ctrl-I)", "pad.toolbar.undo.title": "\u0646\u0627\u06a9\u0693\u0644 (Ctrl-Z)", "pad.toolbar.redo.title": "\u0628\u064a\u0627\u06a9\u0693\u0644 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "\u062f \u0644\u064a\u06a9\u0648\u0627\u0644\u06cd \u0631\u0646\u06ab\u0648\u0646\u0647 \u0633\u067e\u064a\u0646\u0648\u0644", + "pad.toolbar.savedRevision.title": "\u0645\u062e\u06a9\u062a\u0646\u0647 \u062e\u0648\u0646\u062f\u064a \u06a9\u0648\u0644", "pad.toolbar.settings.title": "\u0627\u0645\u0633\u062a\u0646\u06d0", "pad.colorpicker.save": "\u062e\u0648\u0646\u062f\u064a \u06a9\u0648\u0644", "pad.colorpicker.cancel": "\u0646\u0627\u06ab\u0627\u0631\u0644", "pad.loading": "\u0628\u0631\u0633\u06d0\u0631\u06d0\u062f\u0646\u06d0 \u06a9\u06d0 \u062f\u06cc...", + "pad.passwordRequired": "\u062f\u06d0 \u0644\u064a\u06a9\u0686\u06d0 \u062a\u0647 \u062f \u0644\u0627\u0633\u0631\u0633\u064a \u0644\u067e\u0627\u0631\u0647 \u062a\u0627\u0633\u06d0 \u064a\u0648 \u067e\u067c\u0646\u0648\u0645 \u062a\u0647 \u0627\u0693\u062a\u064a\u0627 \u0644\u0631\u06cd", "pad.wrongPassword": "\u067e\u067c\u0646\u0648\u0645 \u0645\u0648 \u0633\u0645 \u0646\u0647 \u0648", + "pad.settings.padSettings": "\u062f \u0644\u064a\u06a9\u0686\u06d0 \u0627\u0645\u0633\u062a\u0646\u06d0", "pad.settings.myView": "\u0632\u0645\u0627 \u06a9\u062a\u0646\u0647", + "pad.settings.colorcheck": "\u062f \u0644\u064a\u06a9\u0648\u0627\u0644\u06cd \u0631\u0646\u06ab\u0648\u0646\u0647", "pad.settings.fontType": "\u0644\u064a\u06a9\u0628\u06bc\u06d0 \u0689\u0648\u0644:", "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648\u0633\u067e\u06d0\u0633", @@ -33,6 +40,10 @@ "pad.chat.loadmessages": "\u0646\u0648\u0631 \u067e\u064a\u063a\u0627\u0645\u0648\u0646\u0647 \u0628\u0631\u0633\u06d0\u0631\u0648\u0644", "timeslider.toolbar.authors": "\u0644\u064a\u06a9\u0648\u0627\u0644:", "timeslider.toolbar.authorsList": "\u0628\u06d0 \u0644\u064a\u06a9\u0648\u0627\u0644\u0647", + "timeslider.toolbar.exportlink.title": "\u0635\u0627\u062f\u0631\u0648\u0644", + "timeslider.version": "\u0628\u06bc\u0647 {{version}}", + "timeslider.saved": "\u062e\u0648\u0646\u062f\u064a \u0634\u0648 {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "\u062c\u0646\u0648\u0631\u064a", "timeslider.month.february": "\u0641\u0628\u0631\u0648\u0631\u064a", "timeslider.month.march": "\u0645\u0627\u0631\u0686", @@ -45,6 +56,9 @@ "timeslider.month.october": "\u0627\u06a9\u062a\u0648\u0628\u0631", "timeslider.month.november": "\u0646\u0648\u0645\u0628\u0631", "timeslider.month.december": "\u0689\u064a\u0633\u0645\u0628\u0631", + "timeslider.unnamedauthor": "{{num}} \u0628\u06d0\u0646\u0648\u0645 \u0644\u064a\u06a9\u0648\u0627\u0644", + "timeslider.unnamedauthors": "{{num}} \u0628\u06d0\u0646\u0648\u0645\u0647 \u0644\u064a\u06a9\u0648\u0627\u0644\u0627\u0646", + "pad.savedrevs.marked": "\u0627\u0648\u0633 \u062f\u0627 \u0645\u062e\u06a9\u062a\u0646\u0647 \u062f \u064a\u0648\u06d0 \u062e\u0648\u0646\u062f\u064a \u0634\u0648\u06d0 \u0645\u062e\u06a9\u062a\u0646\u06d0 \u067e\u0647 \u062a\u0648\u06ab\u0647 \u067e\u0647 \u0646\u069a\u0647 \u0634\u0648\u0647", "pad.userlist.entername": "\u0646\u0648\u0645 \u0645\u0648 \u0648\u0631\u06a9\u0693\u06cd", "pad.userlist.unnamed": "\u0628\u06d0 \u0646\u0648\u0645\u0647", "pad.userlist.guest": "\u0645\u06d0\u0644\u0645\u0647", diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 6ea65f476..55ea017e2 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -2,6 +2,8 @@ "@metadata": { "authors": [ "Gusta", + "Luckas", + "TheGabrielZaum", "Tuliouel" ] }, @@ -22,7 +24,7 @@ "pad.toolbar.timeslider.title": "Linha do tempo", "pad.toolbar.savedRevision.title": "Salvar revis\u00e3o", "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", - "pad.toolbar.embed.title": "Compartilhar e mencionar esta nota", + "pad.toolbar.embed.title": "Compartilhar e incorporar esta nota", "pad.toolbar.showusers.title": "Mostrar os usuarios nesta Nota", "pad.colorpicker.save": "Salvar", "pad.colorpicker.cancel": "Cancelar", @@ -60,7 +62,7 @@ "pad.modals.userdup.advice": "Reconectar para usar esta janela.", "pad.modals.unauth": "N\u00e3o autorizado", "pad.modals.unauth.explanation": "Suas permiss\u00f5es foram mudadas enquanto visualizava esta p\u00e1gina. Tente reconectar.", - "pad.modals.looping": "Reconectado.", + "pad.modals.looping": "Desconectado.", "pad.modals.looping.explanation": "H\u00e1 problemas de comunica\u00e7\u00e3o com o servidor de sincroniza\u00e7\u00e3o.", "pad.modals.looping.cause": "Talvez voc\u00ea tenha conectado por um firewall ou proxy incompat\u00edvel.", "pad.modals.initsocketfail": "Servidor \u00e9 inalcan\u00e7\u00e1vel.", diff --git a/src/locales/pt.json b/src/locales/pt.json index bb6724624..472fa69a8 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -1,11 +1,13 @@ { "@metadata": { "authors": { - "1": "Waldir" + "0": "Luckas", + "2": "Tuliouel", + "3": "Waldir" } }, - "index.newPad": "Novo Pad", - "index.createOpenPad": "ou criar/abrir um Pad com o nome:", + "index.newPad": "Nova Nota", + "index.createOpenPad": "ou crie/abra uma Nota com o nome:", "pad.toolbar.bold.title": "Negrito (Ctrl-B)", "pad.toolbar.italic.title": "It\u00e1lico (Ctrl-I)", "pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", @@ -19,14 +21,14 @@ "pad.toolbar.clearAuthorship.title": "Limpar cores de autoria", "pad.toolbar.import_export.title": "Importar/exportar de/para diferentes formatos de ficheiro", "pad.toolbar.timeslider.title": "Linha de tempo", - "pad.toolbar.savedRevision.title": "Vers\u00f5es gravadas", + "pad.toolbar.savedRevision.title": "Salvar revis\u00e3o", "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", "pad.toolbar.embed.title": "Incorporar este Pad", - "pad.toolbar.showusers.title": "Mostrar os utilizadores neste Pad", + "pad.toolbar.showusers.title": "Mostrar os utilizadores nesta Nota", "pad.colorpicker.save": "Gravar", "pad.colorpicker.cancel": "Cancelar", "pad.loading": "A carregar\u2026", - "pad.settings.padSettings": "Configura\u00e7\u00f5es do Pad", + "pad.settings.padSettings": "Configura\u00e7\u00f5es da Nota", "pad.settings.myView": "Minha vista", "pad.settings.colorcheck": "Cores de autoria", "pad.settings.linenocheck": "N\u00fameros de linha", @@ -37,7 +39,7 @@ "pad.settings.language": "L\u00edngua:", "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Carregar qualquer ficheiro de texto ou documento", - "pad.importExport.export": "Exportar o Pad actual como:", + "pad.importExport.export": "Exportar a Nota atual como:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto simples", "pad.importExport.exportword": "Microsoft Word", @@ -47,6 +49,12 @@ "pad.modals.connected": "Ligado.", "pad.modals.reconnecting": "Reconectando-se ao seu bloco\u2026", "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", + "pad.modals.unauth": "N\u00e3o autorizado", + "pad.modals.looping": "Desconectado.", + "pad.modals.slowcommit": "Desconectado.", + "pad.modals.slowcommit.explanation": "O servidor n\u00e3o est\u00e1 respondendo.", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.exportlink.title": "Exportar", "timeslider.month.january": "Janeiro", "timeslider.month.february": "Fevereiro", "timeslider.month.march": "Mar\u00e7o", @@ -58,5 +66,12 @@ "timeslider.month.september": "Setembro", "timeslider.month.october": "Outubro", "timeslider.month.november": "Novembro", - "timeslider.month.december": "Dezembro" + "timeslider.month.december": "Dezembro", + "pad.userlist.entername": "Insira o seu nome", + "pad.userlist.unnamed": "sem nome", + "pad.userlist.guest": "Convidado", + "pad.userlist.deny": "Negar", + "pad.userlist.approve": "Aprovar", + "pad.impexp.importbutton": "Importar agora", + "pad.impexp.importing": "Importando..." } \ No newline at end of file diff --git a/src/locales/vi.json b/src/locales/vi.json new file mode 100644 index 000000000..5abbb1a0a --- /dev/null +++ b/src/locales/vi.json @@ -0,0 +1,121 @@ +{ + "@metadata": { + "authors": [ + "Tuankiet65" + ] + }, + "index.newPad": "T\u1ea1o m\u1ed9t Pad m\u1edbi", + "index.createOpenPad": "hay t\u1ea1o/m\u1edf m\u1ed9t Pad v\u1edbi t\u00ean:", + "pad.toolbar.bold.title": "In \u0111\u1eadm (Ctrl-B)", + "pad.toolbar.italic.title": "In nghi\u00eang (Ctrl-I)", + "pad.toolbar.underline.title": "G\u1ea1ch ch\u00e2n (Ctrl-U)", + "pad.toolbar.strikethrough.title": "G\u1ea1ch b\u1ecf", + "pad.toolbar.ol.title": "Danh s\u00e1ch C\u00f3 \u0110\u00e1nh s\u1ed1", + "pad.toolbar.ul.title": "Danh s\u00e1ch Kh\u00f4ng \u0110\u00e1nh s\u1ed1", + "pad.toolbar.indent.title": "T\u0103ng l\u1ec1", + "pad.toolbar.unindent.title": "Gi\u1ea3m l\u1ec1", + "pad.toolbar.undo.title": "Ho\u00e0n t\u00e1c (Ctrl-Z)", + "pad.toolbar.redo.title": "L\u00e0m l\u1ea1i (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "X\u00f3a M\u00e0u ch\u1ec9 T\u00e1c gi\u1ea3", + "pad.toolbar.import_export.title": "Xu\u1ea5t/Nh\u1eadp t\u1eeb/\u0111\u1ebfn c\u00e1c \u0111\u1ecbnh d\u1ea1ng file kh\u00e1c nhau", + "pad.toolbar.timeslider.title": "Thanh th\u1eddi gian", + "pad.toolbar.savedRevision.title": "L\u01b0u Phi\u00ean b\u1ea3n", + "pad.toolbar.settings.title": "Thi\u1ebft l\u1eadp", + "pad.toolbar.embed.title": "Chia s\u1ebb v\u00e0 Nh\u00fang pad n\u00e0y", + "pad.toolbar.showusers.title": "Hi\u1ec7n c\u00e1c ng\u01b0\u1eddi d\u00f9ng tr\u00ean pad n\u00e0y", + "pad.colorpicker.save": "L\u01b0u", + "pad.colorpicker.cancel": "H\u1ee7y b\u1ecf", + "pad.loading": "\u0110ang t\u1ea3i\u2026", + "pad.passwordRequired": "B\u1ea1n c\u1ea7n m\u1eadt kh\u1ea9u \u0111\u1ec3 truy c\u1eadp pad n\u00e0y", + "pad.permissionDenied": "B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp pad n\u00e0y.", + "pad.wrongPassword": "B\u1ea1n \u0111\u00e3 nh\u1eadp sai m\u1eadt kh\u1ea9u", + "pad.settings.padSettings": "T\u00f9y ch\u1ecdn Pad", + "pad.settings.myView": "Ch\u1ec9 c\u00f3 t\u00f4i", + "pad.settings.stickychat": "Lu\u00e2n hi\u1ec7n c\u1eeda s\u1ed5 tr\u00f2 chuy\u1ec7n tr\u00ean m\u00e0n h\u00ecnh", + "pad.settings.colorcheck": "M\u00e0u ch\u1ec9 t\u00e1c gi\u1ea3", + "pad.settings.linenocheck": "S\u1ed1 d\u00f2ng", + "pad.settings.rtlcheck": "\u0110\u1ecdc n\u1ed9i dung t\u1eeb ph\u1ea3i sang tr\u00e1i?", + "pad.settings.fontType": "Ki\u1ec3u ph\u00f4ng ch\u1eef:", + "pad.settings.fontType.normal": "Th\u01b0\u1eddng", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "To\u00e0n c\u1ea7u", + "pad.settings.language": "Ng\u00f4n ng\u1eef:", + "pad.importExport.import_export": "Xu\u1ea5t/Nh\u1eadp", + "pad.importExport.import": "T\u1ea3i l\u00ean b\u1ea5t k\u1ef3 t\u1eadp tin v\u0103n b\u1ea3n ho\u1eb7c t\u00e0i li\u1ec7u", + "pad.importExport.importSuccessful": "Th\u00e0nh c\u00f4ng!", + "pad.importExport.export": "Xu\u1ea5t pad hi\u1ec7n t\u1ea1i ra \u0111\u1ecbnh d\u1ea1ng:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "V\u0103n b\u1ea3n thu\u1ea7n t\u00fay", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "B\u1ea1n ch\u1ec9 c\u00f3 th\u1ec3 nh\u1eadp v\u00e0o t\u1eeb v\u0103n b\u1ea3n thu\u1ea7n t\u00fay hay \u0111\u1ecbnh d\u1ea1ng HTML. N\u1ebfu mu\u1ed1n c\u00f3 nhi\u1ec1u ch\u1ee9c n\u0103ng nh\u1eadp h\u01a1n xin h\u00e3y \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Ec\u00e0i \u0111\u1eb7t abiword\u003C/a\u003E.", + "pad.modals.connected": "\u0110\u00e3 k\u1ebft n\u1ed1i l\u1ea1i.", + "pad.modals.reconnecting": "K\u1ebft n\u1ed1i l\u1ea1i t\u1edbi pad c\u1ee7a b\u1ea1n", + "pad.modals.forcereconnect": "\u00c9p k\u1ebft n\u1ed1i l\u1ea1i", + "pad.modals.userdup": "M\u1edf trong c\u1eeda s\u1ed5 kh\u00e1c", + "pad.modals.userdup.explanation": "Pad n\u00e0y d\u01b0\u1eddng nh\u01b0 \u0111\u01b0\u1ee3c m\u1edf tr\u00ean h\u01a1n m\u1ed9t c\u1eeda s\u1ed5 tr\u00ecnh duy\u1ec7t tr\u00ean m\u00e1y t\u00ednh n\u00e0y.", + "pad.modals.userdup.advice": "K\u1ebft n\u1ed1i l\u1ea1i \u0111\u1ec3 s\u1eed d\u1ee5ng c\u1eeda s\u1ed5 n\u00e0y.", + "pad.modals.unauth": "Kh\u00f4ng c\u00f3 quy\u1ec1n", + "pad.modals.unauth.explanation": "Quy\u1ec1n c\u1ee7a b\u1ea1n \u0111\u00e3 thay \u0111\u1ed5i trong khi b\u1ea1n \u0111ang xem trang n\u00e0y. H\u00e3y th\u1eed k\u1ebft n\u1ed1i l\u1ea1i.", + "pad.modals.looping": "\u0110\u00e3 ng\u1eaft k\u1ebft n\u1ed1i", + "pad.modals.looping.explanation": "C\u00f3 v\u1ea5n \u0111\u1ec1 khi giao ti\u1ebfp v\u1edbi m\u00e1y ch\u1ee7 \u0111\u1ed3ng b\u1ed9", + "pad.modals.looping.cause": "C\u00f3 th\u1ec3 b\u1ea1n \u0111\u00e3 k\u1ebft n\u1ed1i th\u00f4ng qua m\u1ed9t t\u01b0\u1eddng l\u1eeda hay proxy kh\u00f4ng th\u00edch h\u1ee3p", + "pad.modals.initsocketfail": "Kh\u00f4ng th\u1ec3 ti\u1ebfp c\u1eadn m\u00e1y ch\u1ee7", + "pad.modals.initsocketfail.explanation": "Kh\u00f4ng th\u1ec3 k\u1ebft n\u1ed1i \u0111\u1ebfn m\u00e1y ch\u1ee7 \u0111\u1ed3ng b\u1ed9.", + "pad.modals.initsocketfail.cause": "\u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 l\u00e0 do m\u1ed9t v\u1ea5n \u0111\u1ec1 v\u1edbi tr\u00ecnh duy\u1ec7t c\u1ee7a b\u1ea1n hay \u0111\u01b0\u1eddng truy\u1ec1n internet c\u1ee7a b\u1ea1n.", + "pad.modals.slowcommit": "\u0110\u00e3 ng\u1eaft k\u1ebft n\u1ed1i", + "pad.modals.slowcommit.explanation": "M\u00e1y ch\u1ee7 kh\u00f4ng ph\u1ea3n h\u1ed3i.", + "pad.modals.slowcommit.cause": "\u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 l\u00e0 do v\u1ea5n \u0111\u1ec1 v\u1ec1 k\u1ebft n\u1ed1i m\u1ea1ng.", + "pad.modals.deleted": "\u0110\u00e3 x\u00f3a", + "pad.modals.deleted.explanation": "Pad n\u00e0y \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1ee1", + "pad.modals.disconnected": "B\u1ea1n \u0111\u00e3 ng\u1eaft k\u1ebft n\u1ed1i", + "pad.modals.disconnected.explanation": "K\u1ebft n\u1ed1i t\u1edbi m\u00e1y ch\u1ee7 \u0111\u00e3 b\u1ecb m\u1ea5t", + "pad.modals.disconnected.cause": "C\u00e1c m\u00e1y ch\u1ee7 c\u00f3 th\u1ec3 kh\u00f4ng s\u1eb5n d\u00f9ng. Xin vui l\u00f2ng th\u00f4ng b\u00e1o cho ch\u00fang t\u00f4i n\u1ebfu \u0111i\u1ec1u n\u00e0y ti\u1ebfp t\u1ee5c x\u1ea3y ra.", + "pad.share": "Chia s\u1ebb pad n\u00e0y", + "pad.share.readonly": "Ch\u1ec9 \u0111\u1ecdc", + "pad.share.link": "Li\u00ean k\u1ebft", + "pad.share.emebdcode": "URL nh\u00fang", + "pad.chat": "Tr\u00f2 chuy\u1ec7n", + "pad.chat.title": "M\u1edf tr\u00f2 chuy\u1ec7n cho pad n\u00e0y.", + "pad.chat.loadmessages": "T\u1ea3i th\u00eam tin nh\u1eafn", + "timeslider.pageTitle": "Thanh th\u1eddi gian c\u1ee7a {{appTitle}}", + "timeslider.toolbar.returnbutton": "Tr\u1edf v\u1ec1 pad", + "timeslider.toolbar.authors": "T\u00e1c gi\u1ea3:", + "timeslider.toolbar.authorsList": "Kh\u00f4ng c\u00f3 t\u00e1c gi\u1ea3", + "timeslider.toolbar.exportlink.title": "Xu\u1ea5t", + "timeslider.exportCurrent": "Xu\u1ea5t phi\u00ean b\u1ea3n hi\u1ec7n t\u1ea1i th\u00e0nh:", + "timeslider.version": "Phi\u00ean b\u1ea3n {{version}}", + "timeslider.saved": "\u0110\u00e3 l\u01b0u v\u00e0o ng\u00e0y {{day}} {{month}} n\u0103m {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Th\u00e1ng Gi\u00eang", + "timeslider.month.february": "Th\u00e1ng Hai", + "timeslider.month.march": "Th\u00e1ng Ba", + "timeslider.month.april": "Th\u00e1ng T\u01b0", + "timeslider.month.may": "Th\u00e1ng N\u0103m", + "timeslider.month.june": "Th\u00e1ng S\u00e1u", + "timeslider.month.july": "Th\u00e1ng B\u1ea3y", + "timeslider.month.august": "Th\u00e1ng T\u00e1m", + "timeslider.month.september": "Th\u00e1ng Ch\u00edn", + "timeslider.month.october": "Th\u00e1ng M\u01b0\u1eddi", + "timeslider.month.november": "Th\u00e1ng M\u01b0\u1eddi M\u1ed9t", + "timeslider.month.december": "Th\u00e1ng M\u01b0\u1eddi Hai", + "timeslider.unnamedauthor": "{{num}} t\u00e1c gi\u1ea3 kh\u00f4ng t\u00ean", + "timeslider.unnamedauthors": "{{num}} t\u00e1c gi\u1ea3 kh\u00f4ng t\u00ean", + "pad.savedrevs.marked": "Phi\u00ean b\u1ea3n n\u00e0y \u0111\u00e3 \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u l\u00e0 m\u1ed9t phi\u00ean b\u1ea3n \u0111\u00e3 l\u01b0u", + "pad.userlist.entername": "Nh\u1eadp t\u00ean c\u1ee7a b\u1ea1n", + "pad.userlist.unnamed": "Kh\u00f4ng t\u00ean", + "pad.userlist.guest": "Kh\u00e1ch", + "pad.userlist.deny": "Ch\u1eb7n", + "pad.userlist.approve": "Ch\u1ea5p nh\u1eadn", + "pad.editbar.clearcolors": "X\u00f3a m\u00e0u ch\u1ec9 t\u00e1c gi\u1ea3 tr\u00ean to\u00e0n b\u1ed9 t\u00e0i li\u1ec7u?", + "pad.impexp.importbutton": "Nh\u1eadp ngay b\u00e2y gi\u1edd", + "pad.impexp.importing": "\u0110ang nh\u1eadp\u2026", + "pad.impexp.confirmimport": "Nh\u1eadp m\u1ed9t t\u1eadp tin s\u1ebd ghi \u0111\u00e8 n\u1ed9i dung hi\u1ec7n t\u1ea1i c\u1ee7a pad. B\u1ea1n c\u00f3 mu\u1ed1n l\u00e0m nh\u01b0 v\u1eady kh\u00f4ng?", + "pad.impexp.convertFailed": "Ch\u00fang t\u00f4i kh\u00f4ng th\u1ec3 nh\u1eadp t\u1eadp tin n\u00e0y. H\u00e3y s\u1eed d\u1ee5ng \u0111\u1ecbnh d\u1ea1ng t\u1eadp tin kh\u00e1c hay sao ch\u00e9o v\u00e0 d\u00e1n m\u1ed9t c\u00e1ch th\u1ee7 c\u00f4ng.", + "pad.impexp.uploadFailed": "T\u1ea3i l\u00ean kh\u00f4ng th\u00e0nh c\u00f4ng, vui l\u00f2ng th\u1eed l\u1ea1i", + "pad.impexp.importfailed": "Nh\u1eadp th\u1ea5t b\u1ea1i", + "pad.impexp.copypaste": "Xin vui l\u00f2ng sao ch\u00e9p v\u00e0 d\u00e1n", + "pad.impexp.exportdisabled": "Xu\u1ea5t ra \u0111\u1ecbnh d\u1ea1ng {{type}} \u0111\u00e3 b\u1ecb v\u00f4 hi\u1ec7u h\u00f3a. Xin h\u00e3y li\u00ean h\u1ec7 v\u1edbi qu\u1ea3n tr\u1ecb vi\u00ean h\u1ec7 th\u1ed1ng \u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin chi ti\u1ebft." +} \ No newline at end of file diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index a7f0f81c2..43975328b 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -3,6 +3,7 @@ "authors": [ "Dimension", "Hydra", + "Shangkuanlc", "Yfdyh000", "\u4e4c\u62c9\u8de8\u6c2a", "\u71c3\u7389" @@ -37,6 +38,7 @@ "pad.settings.stickychat": "\u603b\u662f\u5728\u5c4f\u5e55\u4e0a\u663e\u793a\u804a\u5929", "pad.settings.colorcheck": "\u4f5c\u8005\u989c\u8272", "pad.settings.linenocheck": "\u884c\u53f7", + "pad.settings.rtlcheck": "\u4ece\u53f3\u5230\u5de6\u7684\u8bfb\u53d6\u5185\u5bb9\u5417\uff1f", "pad.settings.fontType": "\u5b57\u4f53\u7c7b\u578b\uff1a", "pad.settings.fontType.normal": "\u6b63\u5e38", "pad.settings.fontType.monospaced": "\u7b49\u5bbd\u5b57\u4f53", @@ -85,6 +87,7 @@ "timeslider.exportCurrent": "\u5bfc\u51fa\u76ee\u524d\u7248\u672c\u4e3a\uff1a", "timeslider.version": "\u7b2c {{version}} \u7248\u672c", "timeslider.saved": "\u5728{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", + "timeslider.dateformat": "{{year}} \u5e74 {{month}} \u6708 {{day}} \u65e5 {{hours}}\u65f6:{{minutes}}\u5206:{{seconds}}\u79d2", "timeslider.month.january": "\u4e00\u6708", "timeslider.month.february": "\u4e8c\u6708", "timeslider.month.march": "\u4e09\u6708", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index c194545ce..bb48b348f 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -1,8 +1,9 @@ { "@metadata": { "authors": { - "0": "Shirayuki", - "2": "Simon Shek" + "0": "Shangkuanlc", + "1": "Shirayuki", + "3": "Simon Shek" } }, "index.newPad": "\u65b0Pad", @@ -17,8 +18,8 @@ "pad.toolbar.unindent.title": "\u51f8\u6392", "pad.toolbar.undo.title": "\u64a4\u92b7\uff08Ctrl-Z\uff09", "pad.toolbar.redo.title": "\u91cd\u505a\uff08Ctrl-Y\uff09", - "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u984f\u8272", - "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u5c0e\u5165\uff0f\u532f\u51fa", + "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u5354\u4f5c\u8005\u984f\u8272\u5340\u5225", + "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u532f\u5165\uff0f\u532f\u51fa", "pad.toolbar.timeslider.title": "\u6642\u9593\u8ef8", "pad.toolbar.savedRevision.title": "\u5132\u5b58\u4fee\u8a02", "pad.toolbar.settings.title": "\u8a2d\u5b9a", @@ -33,7 +34,7 @@ "pad.settings.padSettings": "Pad\u8a2d\u5b9a", "pad.settings.myView": "\u6211\u7684\u8996\u7a97", "pad.settings.stickychat": "\u6c38\u9060\u5728\u5c4f\u5e55\u4e0a\u986f\u793a\u804a\u5929", - "pad.settings.colorcheck": "\u4f5c\u8005\u984f\u8272", + "pad.settings.colorcheck": "\u5354\u4f5c\u8005\u984f\u8272", "pad.settings.linenocheck": "\u884c\u865f", "pad.settings.rtlcheck": "\u5f9e\u53f3\u81f3\u5de6\u8b80\u53d6\u5167\u5bb9\uff1f", "pad.settings.fontType": "\u5b57\u9ad4\u985e\u578b\uff1a", @@ -41,7 +42,7 @@ "pad.settings.fontType.monospaced": "\u7b49\u5bec", "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u8996\u7a97", "pad.settings.language": "\u8a9e\u8a00\uff1a", - "pad.importExport.import_export": "\u5c0e\u5165\uff0f\u532f\u51fa", + "pad.importExport.import_export": "\u532f\u5165\uff0f\u532f\u51fa", "pad.importExport.import": "\u4e0a\u8f09\u4efb\u4f55\u6587\u5b57\u6a94\u6216\u6587\u6a94", "pad.importExport.importSuccessful": "\u5b8c\u6210\uff01", "pad.importExport.export": "\u532f\u51fa\u7576\u524dpad\u70ba\uff1a", @@ -62,13 +63,13 @@ "pad.modals.unauth.explanation": "\u60a8\u7684\u6b0a\u9650\u5728\u67e5\u770b\u6b64\u9801\u6642\u767c\u751f\u66f4\u6539\u3002\u8acb\u5617\u8a66\u91cd\u65b0\u9023\u63a5\u3002", "pad.modals.looping": "\u5df2\u96e2\u7dda\u3002", "pad.modals.looping.explanation": "\u8207\u540c\u6b65\u4f3a\u670d\u5668\u9593\u6709\u901a\u4fe1\u554f\u984c\u3002", - "pad.modals.looping.cause": "\u4e5f\u8a31\u60a8\u901a\u904e\u4e00\u500b\u4e0d\u76f8\u5bb9\u7684\u9632\u706b\u7246\u6216\u4ee3\u7406\u4f3a\u670d\u5668\u9023\u63a5\u3002", + "pad.modals.looping.cause": "\u4e5f\u8a31\u60a8\u662f\u901a\u904e\u4e0d\u76f8\u5bb9\u7684\u9632\u706b\u7246\u6216\u4ee3\u7406\u4f3a\u670d\u5668\u9023\u7dda\u3002", "pad.modals.initsocketfail": "\u7121\u6cd5\u8a2a\u554f\u4f3a\u670d\u5668\u3002", "pad.modals.initsocketfail.explanation": "\u7121\u6cd5\u9023\u63a5\u5230\u540c\u6b65\u4f3a\u670d\u5668\u3002", - "pad.modals.initsocketfail.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u60a8\u7684\u700f\u89bd\u5668\u6216\u60a8\u7684\u4e92\u806f\u7db2\u9023\u63a5\u7684\u554f\u984c\u3002", + "pad.modals.initsocketfail.cause": "\u9019\u53ef\u80fd\u662f\u56e0\u70ba\u700f\u89bd\u5668\u6216\u7db2\u969b\u7db2\u8def\u9023\u7dda\u554f\u984c\u6240\u9020\u6210\u3002", "pad.modals.slowcommit": "\u5df2\u96e2\u7dda\u3002", "pad.modals.slowcommit.explanation": "\u4f3a\u670d\u5668\u6c92\u6709\u56de\u61c9\u3002", - "pad.modals.slowcommit.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u7db2\u8def\u9023\u63a5\u554f\u984c\u3002", + "pad.modals.slowcommit.cause": "\u9019\u53ef\u80fd\u662f\u56e0\u70ba\u7db2\u8def\u9023\u7dda\u554f\u984c\u6240\u9020\u6210\u3002", "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", "pad.modals.deleted.explanation": "\u6b64pad\u5df2\u88ab\u79fb\u9664\u3002", "pad.modals.disconnected": "\u60a8\u5df2\u4e2d\u65b7\u9023\u7dda\u3002", @@ -78,17 +79,17 @@ "pad.share.readonly": "\u552f\u8b80", "pad.share.link": "\u9023\u7d50", "pad.share.emebdcode": "\u5d4c\u5165\u7db2\u5740", - "pad.chat": "\u804a\u5929", - "pad.chat.title": "\u6253\u958b\u6b64pad\u7684\u804a\u5929\u3002", + "pad.chat": "\u804a\u5929\u529f\u80fd", + "pad.chat.title": "\u6253\u958bpad\u804a\u5929\u529f\u80fd", "pad.chat.loadmessages": "\u8f09\u5165\u66f4\u591a\u8a0a\u606f", "timeslider.pageTitle": "{{appTitle}}\u6642\u9593\u8ef8", "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u5230pad", - "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", - "timeslider.toolbar.authorsList": "\u7121\u4f5c\u8005", + "timeslider.toolbar.authors": "\u5354\u4f5c\u8005\uff1a", + "timeslider.toolbar.authorsList": "\u7121\u5354\u4f5c\u8005", "timeslider.toolbar.exportlink.title": "\u532f\u51fa", "timeslider.exportCurrent": "\u532f\u51fa\u7576\u524d\u7248\u672c\u70ba\uff1a", "timeslider.version": "\u7248\u672c{{version}}", - "timeslider.saved": "{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", + "timeslider.saved": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5\u5132\u5b58", "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "1\u6708", "timeslider.month.february": "2\u6708", @@ -102,15 +103,15 @@ "timeslider.month.october": "10\u6708", "timeslider.month.november": "11\u6708", "timeslider.month.december": "12\u6708", - "timeslider.unnamedauthor": "{{num}} \u533f\u540d\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}} \u533f\u540d\u4f5c\u8005", - "pad.savedrevs.marked": "\u6b64\u4fee\u8a02\u5df2\u6a19\u8a18\u70ba\u5df2\u4fdd\u5b58\u3002", + "timeslider.unnamedauthor": "{{num}} \u533f\u540d\u5354\u4f5c\u8005", + "timeslider.unnamedauthors": "{{num}} \u533f\u540d\u5354\u4f5c\u8005", + "pad.savedrevs.marked": "\u6a19\u8a18\u6b64\u4fee\u8a02\u7248\u672c\u70ba\u5df2\u5132\u5b58\u4fee\u8a02\u7248\u672c\u3002", "pad.userlist.entername": "\u8f38\u5165\u60a8\u7684\u59d3\u540d", "pad.userlist.unnamed": "\u672a\u547d\u540d", "pad.userlist.guest": "\u8a2a\u5ba2", "pad.userlist.deny": "\u62d2\u7d55", "pad.userlist.approve": "\u6279\u51c6", - "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u500b\u6587\u6a94\u7684\u4f5c\u8005\u984f\u8272\u55ce\uff1f", + "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u500b\u6587\u6a94\u7684\u5354\u4f5c\u8005\u984f\u8272\u5340\u5225\u55ce\uff1f", "pad.impexp.importbutton": "\u73fe\u5728\u532f\u5165", "pad.impexp.importing": "\u532f\u5165\u4e2d...", "pad.impexp.confirmimport": "\u532f\u5165\u7684\u6a94\u6848\u5c07\u6703\u8986\u84cbpad\u5167\u76ee\u524d\u7684\u6587\u5b57\u3002\u60a8\u78ba\u5b9a\u8981\u7e7c\u7e8c\u55ce\uff1f", diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 85efb0083..1e079b522 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -35,6 +35,7 @@ var messageLogger = log4js.getLogger("message"); var accessLogger = log4js.getLogger("access"); var _ = require('underscore'); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); +var channels = require("channels"); /** * A associative array that saves informations about a session @@ -48,6 +49,11 @@ var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); */ var sessioninfos = {}; +/** + * A changeset queue per pad that is processed by handleUserChanges() + */ +var padChannels = new channels.channels(handleUserChanges); + /** * Saves the Socket class we need to send and recieve data from the client */ @@ -176,7 +182,7 @@ exports.handleMessage = function(client, message) if (sessioninfos[client.id].readonly) { messageLogger.warn("Dropped message, COLLABROOM for readonly pad"); } else if (message.data.type == "USER_CHANGES") { - handleUserChanges(client, message); + padChannels.emit(message.padId, {client: client, message: message});// add to pad queue } else if (message.data.type == "USERINFO_UPDATE") { handleUserInfoUpdate(client, message); } else if (message.data.type == "CHAT_MESSAGE") { @@ -224,22 +230,30 @@ exports.handleMessage = function(client, message) // FIXME: Call our "sessions" "connections". // FIXME: Use a hook instead // FIXME: Allow to override readwrite access with readonly - var auth = sessioninfos[client.id].auth; - securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, function(err, statusObject) - { - if(ERR(err, callback)) return; - //access was granted - if(statusObject.accessStatus == "grant") + // FIXME: A message might arrive but wont have an auth object, this is obviously bad so we should deny it + // Simulate using the load testing tool + if(!sessioninfos[client.id].auth){ + console.error("Auth was never applied to a session. If you are using the stress-test tool then restart Etherpad and the Stress test tool.") + callback(); + }else{ + var auth = sessioninfos[client.id].auth; + securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, function(err, statusObject) { - callback(); - } - //no access, send the client a message that tell him why - else - { - client.json.send({accessStatus: statusObject.accessStatus}) - } - }); + if(ERR(err, callback)) return; + + //access was granted + if(statusObject.accessStatus == "grant") + { + callback(); + } + //no access, send the client a message that tell him why + else + { + client.json.send({accessStatus: statusObject.accessStatus}) + } + }); + } }, finalHandler ]); @@ -522,23 +536,26 @@ function handleUserInfoUpdate(client, message) * @param client the client that send this message * @param message the message from the client */ -function handleUserChanges(client, message) +function handleUserChanges(data, cb) { + var client = data.client + , message = data.message + // Make sure all required fields are present if(message.data.baseRev == null) { messageLogger.warn("Dropped message, USER_CHANGES Message has no baseRev!"); - return; + return cb(); } if(message.data.apool == null) { messageLogger.warn("Dropped message, USER_CHANGES Message has no apool!"); - return; + return cb(); } if(message.data.changeset == null) { messageLogger.warn("Dropped message, USER_CHANGES Message has no changeset!"); - return; + return cb(); } //get all Vars we need @@ -675,10 +692,14 @@ function handleUserChanges(client, message) pad.appendRevision(nlChangeset); } - exports.updatePadClients(pad, callback); + exports.updatePadClients(pad, function(er) { + ERR(er) + }); + callback(); } ], function(err) { + cb(); ERR(err); }); } diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 483bb1d17..e87370028 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -48,88 +48,56 @@ exports.addComponent = function(moduleName, module) /** * sets the socket.io and adds event functions for routing */ -exports.setSocketIO = function(_socket) -{ +exports.setSocketIO = function(_socket) { //save this socket internaly socket = _socket; - socket.sockets.on('connection', function(client) - { + socket.sockets.on('connection', function(client) { client.set('remoteAddress', client.handshake.address.address); var clientAuthorized = false; //wrap the original send function to log the messages client._send = client.send; - client.send = function(message) - { + client.send = function(message) { messageLogger.debug("to " + client.id + ": " + stringifyWithoutPassword(message)); client._send(message); } //tell all components about this connect - for(var i in components) - { + for(var i in components) { components[i].handleConnect(client); - } - - //try to handle the message of this client - function handleMessage(message) - { - if(message.component && components[message.component]) - { - //check if component is registered in the components array - if(components[message.component]) - { - messageLogger.debug("from " + client.id + ": " + stringifyWithoutPassword(message)); - components[message.component].handleMessage(client, message); - } - } - else - { - messageLogger.error("Can't route the message:" + stringifyWithoutPassword(message)); - } - } - + } + client.on('message', function(message) { - if(message.protocolVersion && message.protocolVersion != 2) - { + if(message.protocolVersion && message.protocolVersion != 2) { messageLogger.warn("Protocolversion header is not correct:" + stringifyWithoutPassword(message)); return; } //client is authorized, everything ok - if(clientAuthorized) - { - handleMessage(message); - } - //try to authorize the client - else - { - //this message has everything to try an authorization - if(message.padId !== undefined && message.sessionID !== undefined && message.token !== undefined && message.password !== undefined) - { - securityManager.checkAccess (message.padId, message.sessionID, message.token, message.password, function(err, statusObject) - { - ERR(err); - - //access was granted, mark the client as authorized and handle the message - if(statusObject.accessStatus == "grant") - { - clientAuthorized = true; - handleMessage(message); + if(clientAuthorized) { + handleMessage(client, message); + } else { //try to authorize the client + if(message.padId !== undefined && message.sessionID !== undefined && message.token !== undefined && message.password !== undefined) { + //this message has everything to try an authorization + securityManager.checkAccess (message.padId, message.sessionID, message.token, message.password, + function(err, statusObject) { + ERR(err); + + //access was granted, mark the client as authorized and handle the message + if(statusObject.accessStatus == "grant") { + clientAuthorized = true; + handleMessage(client, message); + } + //no access, send the client a message that tell him why + else { + messageLogger.warn("Authentication try failed:" + stringifyWithoutPassword(message)); + client.json.send({accessStatus: statusObject.accessStatus}); + } } - //no access, send the client a message that tell him why - else - { - messageLogger.warn("Authentication try failed:" + stringifyWithoutPassword(message)); - client.json.send({accessStatus: statusObject.accessStatus}); - } - }); - } - //drop message - else - { + ); + } else { //drop message messageLogger.warn("Dropped message cause of bad permissions:" + stringifyWithoutPassword(message)); } } @@ -146,6 +114,21 @@ exports.setSocketIO = function(_socket) }); } +//try to handle the message of this client +function handleMessage(client, message) +{ + + if(message.component && components[message.component]) { + //check if component is registered in the components array + if(components[message.component]) { + messageLogger.debug("from " + client.id + ": " + stringifyWithoutPassword(message)); + components[message.component].handleMessage(client, message); + } + } else { + messageLogger.error("Can't route the message:" + stringifyWithoutPassword(message)); + } +} + //returns a stringified representation of a message, removes the password //this ensures there are no passwords in the log function stringifyWithoutPassword(message) diff --git a/src/package.json b/src/package.json index 96ee35b95..2dd9ac8ec 100644 --- a/src/package.json +++ b/src/package.json @@ -23,7 +23,7 @@ "clean-css" : "0.3.2", "uglify-js" : "1.2.5", "formidable" : "1.0.9", - "log4js" : "0.5.x", + "log4js" : "0.6.6", "nodemailer" : "0.3.x", "jsdom-nocontextifiy" : "0.2.10", "async-stacktrace" : "0.0.2", @@ -37,7 +37,8 @@ "underscore" : "1.3.1", "unorm" : "1.0.0", "languages4translatewiki" : "0.1.3", - "swagger-node-express" : "1.2.3" + "swagger-node-express" : "1.2.3", + "channels" : "0.0.x" }, "bin": { "etherpad-lite": "./node/server.js" }, "devDependencies": { @@ -46,5 +47,5 @@ "engines" : { "node" : ">=0.6.3", "npm" : ">=1.0" }, - "version" : "1.2.10" + "version" : "1.2.11" } diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index b16042126..f92703851 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -2105,7 +2105,9 @@ exports.follow = function (cs1, cs2, reverseInsertOrder, pool) { exports.copyOp(op2, opOut); op2.opcode = ''; } else if (!op2.opcode) { - exports.copyOp(op1, opOut); + // @NOTE: Critical bugfix for EPL issue #1625. We do not copy op1 here + // in order to prevent attributes from leaking into result changesets. + // exports.copyOp(op1, opOut); op1.opcode = ''; } else { // both keeps diff --git a/src/static/js/ace.js b/src/static/js/ace.js index 83ad9447b..db0d596b8 100644 --- a/src/static/js/ace.js +++ b/src/static/js/ace.js @@ -1,5 +1,5 @@ /** - * This code is mostly from the old Etherpad. Please help us to comment this code. + * This code is mostly from the old Etherpad. Please help us to comment this code. * This helps other people to understand this code better and helps them to improve it. * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED */ @@ -86,7 +86,7 @@ function Ace2Editor() }); actionsPendingInit = []; } - + ace2.registry[info.id] = info; // The following functions (prefixed by 'ace_') are exposed by editor, but @@ -97,7 +97,7 @@ function Ace2Editor() 'applyChangesToBase', 'applyPreparedChangesetToBase', 'setUserChangeNotificationCallback', 'setAuthorInfo', 'setAuthorSelectionRange', 'callWithAce', 'execCommand', 'replaceRange']; - + _.each(aceFunctionsPendingInit, function(fnName,i){ var prefix = 'ace_'; var name = prefix + fnName; @@ -105,18 +105,18 @@ function Ace2Editor() info[prefix + fnName].apply(this, arguments); }); }); - + editor.exportText = function() { if (!loaded) return "(awaiting init)\n"; return info.ace_exportText(); }; - + editor.getFrame = function() { return info.frame || null; }; - + editor.getDebugProperty = function(prop) { return info.ace_getDebugProperty(prop); @@ -221,16 +221,16 @@ function Ace2Editor() // calls to these functions ($$INCLUDE_...) are replaced when this file is processed // and compressed, putting the compressed code from the named file directly into the // source here. - // these lines must conform to a specific format because they are passed by the build script: + // these lines must conform to a specific format because they are passed by the build script: var includedCSS = []; var $$INCLUDE_CSS = function(filename) {includedCSS.push(filename)}; $$INCLUDE_CSS("../static/css/iframe_editor.css"); $$INCLUDE_CSS("../static/css/pad.css"); $$INCLUDE_CSS("../static/custom/pad.css"); - + var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path }); includedCSS = includedCSS.concat(additionalCSS); - + pushStyleTagsFor(iframeHTML, includedCSS); if (!Ace2Editor.EMBEDED && Ace2Editor.EMBEDED[KERNEL_SOURCE]) { @@ -304,16 +304,16 @@ window.onload = function () {\n\ $$INCLUDE_CSS("../static/css/iframe_editor.css"); $$INCLUDE_CSS("../static/css/pad.css"); $$INCLUDE_CSS("../static/custom/pad.css"); - - + + var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){ return '../static/plugins/' + path }); includedCSS = includedCSS.concat(additionalCSS); - + pushStyleTagsFor(outerHTML, includedCSS); // bizarrely, in FF2, a file with no "external" dependencies won't finish loading properly // (throbs busy while typing) - outerHTML.push('', scriptTag(outerScript), '
x
'); + outerHTML.push('', '', scriptTag(outerScript), '
x
'); var outerFrame = document.createElement("IFRAME"); outerFrame.name = "ace_outer"; diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 0d54d7251..97540191a 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1,5 +1,5 @@ /** - * This code is mostly from the old Etherpad. Please help us to comment this code. + * This code is mostly from the old Etherpad. Please help us to comment this code. * This helps other people to understand this code better and helps them to improve it. * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED */ @@ -36,10 +36,10 @@ var isNodeText = Ace2Common.isNodeText, htmlPrettyEscape = Ace2Common.htmlPrettyEscape, noop = Ace2Common.noop; var hooks = require('./pluginfw/hooks'); - + function Ace2Inner(){ - + var makeChangesetTracker = require('./changesettracker').makeChangesetTracker; var colorutils = require('./colorutils').colorutils; var makeContentCollector = require('./contentcollector').makeContentCollector; @@ -53,9 +53,9 @@ function Ace2Inner(){ var undoModule = require('./undomodule').undoModule; var makeVirtualLineView = require('./virtual_lines').makeVirtualLineView; var AttributeManager = require('./AttributeManager'); - + var DEBUG = false; //$$ build script replaces the string "var DEBUG=true;//$$" with "var DEBUG=false;" - // changed to false + // changed to false var isSetUp = false; var THE_TAB = ' '; //4 @@ -83,9 +83,9 @@ function Ace2Inner(){ initLineNumbers(); var outsideKeyDown = noop; - + var outsideKeyPress = function(){return true;}; - + var outsideNotifyDirty = noop; // selFocusAtStart -- determines whether the selection extends "backwards", so that the focus @@ -101,7 +101,7 @@ function Ace2Inner(){ alines: [], apool: new AttribPool() }; - + // lines, alltext, alines, and DOM are set up in setup() if (undoModule.enabled) { @@ -113,7 +113,7 @@ function Ace2Inner(){ var doesWrap = true; var hasLineNumbers = true; var isStyled = true; - + // space around the innermost iframe element var iframePadLeft = MIN_LINEDIV_WIDTH + LINE_NUMBER_PADDING_RIGHT + EDIT_BODY_PADDING_LEFT; var iframePadTop = EDIT_BODY_PADDING_TOP; @@ -122,7 +122,7 @@ function Ace2Inner(){ var console = (DEBUG && window.console); var documentAttributeManager; - + if (!window.console) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; @@ -159,7 +159,7 @@ function Ace2Inner(){ var textFace = 'monospace'; var textSize = 12; - + function textLineHeight() { @@ -167,12 +167,14 @@ function Ace2Inner(){ } var dynamicCSS = null; + var outerDynamicCSS = null; var parentDynamicCSS = null; function initDynamicCSS() { dynamicCSS = makeCSSManager("dynamicsyntax"); - parentDynamicCSS = makeCSSManager("dynamicsyntax", true); + outerDynamicCSS = makeCSSManager("dynamicsyntax", "outer"); + parentDynamicCSS = makeCSSManager("dynamicsyntax", "parent"); } var changesetTracker = makeChangesetTracker(scheduler, rep.apool, { @@ -208,6 +210,72 @@ function Ace2Inner(){ }; editorInfo.ace_getAuthorInfos= getAuthorInfos; + function setAuthorStyle(author, info) + { + if (!dynamicCSS) { + return; + } + var authorSelector = getAuthorColorClassSelector(getAuthorClassName(author)); + + var authorStyleSet = hooks.callAll('aceSetAuthorStyle', { + dynamicCSS: dynamicCSS, + parentDynamicCSS: parentDynamicCSS, + outerDynamicCSS: outerDynamicCSS, + info: info, + author: author, + authorSelector: authorSelector, + }); + + // Prevent default behaviour if any hook says so + if (_.any(authorStyleSet, function(it) { return it })) + { + return + } + + if (!info) + { + dynamicCSS.removeSelectorStyle(authorSelector); + parentDynamicCSS.removeSelectorStyle(authorSelector); + } + else + { + if (info.bgcolor) + { + var bgcolor = info.bgcolor; + if ((typeof info.fade) == "number") + { + bgcolor = fadeColor(bgcolor, info.fade); + } + + var authorStyle = dynamicCSS.selectorStyle(authorSelector); + var parentAuthorStyle = parentDynamicCSS.selectorStyle(authorSelector); + var anchorStyle = dynamicCSS.selectorStyle(authorSelector + ' > a') + + // author color + authorStyle.backgroundColor = bgcolor; + parentAuthorStyle.backgroundColor = bgcolor; + + // text contrast + if(colorutils.luminosity(colorutils.css2triple(bgcolor)) < 0.5) + { + authorStyle.color = '#ffffff'; + parentAuthorStyle.color = '#ffffff'; + }else{ + authorStyle.color = null; + parentAuthorStyle.color = null; + } + + // anchor text contrast + if(colorutils.luminosity(colorutils.css2triple(bgcolor)) < 0.55) + { + anchorStyle.color = colorutils.triple2css(colorutils.complementary(colorutils.css2triple(bgcolor))); + }else{ + anchorStyle.color = null; + } + } + } + } + function setAuthorInfo(author, info) { if ((typeof author) != "string") @@ -217,56 +285,12 @@ function Ace2Inner(){ if (!info) { delete authorInfos[author]; - if (dynamicCSS) - { - dynamicCSS.removeSelectorStyle(getAuthorColorClassSelector(getAuthorClassName(author))); - parentDynamicCSS.removeSelectorStyle(getAuthorColorClassSelector(getAuthorClassName(author))); - } } else { authorInfos[author] = info; - if (info.bgcolor) - { - if (dynamicCSS) - { - var bgcolor = info.bgcolor; - if ((typeof info.fade) == "number") - { - bgcolor = fadeColor(bgcolor, info.fade); - } - - var authorStyle = dynamicCSS.selectorStyle(getAuthorColorClassSelector( - getAuthorClassName(author))); - var parentAuthorStyle = parentDynamicCSS.selectorStyle(getAuthorColorClassSelector( - getAuthorClassName(author))); - var anchorStyle = dynamicCSS.selectorStyle(getAuthorColorClassSelector( - getAuthorClassName(author))+' > a') - - // author color - authorStyle.backgroundColor = bgcolor; - parentAuthorStyle.backgroundColor = bgcolor; - - // text contrast - if(colorutils.luminosity(colorutils.css2triple(bgcolor)) < 0.5) - { - authorStyle.color = '#ffffff'; - parentAuthorStyle.color = '#ffffff'; - }else{ - authorStyle.color = null; - parentAuthorStyle.color = null; - } - - // anchor text contrast - if(colorutils.luminosity(colorutils.css2triple(bgcolor)) < 0.55) - { - anchorStyle.color = colorutils.triple2css(colorutils.complementary(colorutils.css2triple(bgcolor))); - }else{ - anchorStyle.color = null; - } - } - } } + setAuthorStyle(author, info); } function getAuthorClassName(author) @@ -541,8 +565,8 @@ function Ace2Inner(){ { return rep.lines.atOffset(charOffset).key; } - - + + function dispose() { disposed = true; @@ -897,14 +921,14 @@ function Ace2Inner(){ editorInfo.ace_doReturnKey = doReturnKey; editorInfo.ace_isBlockElement = isBlockElement; editorInfo.ace_getLineListType = getLineListType; - + editorInfo.ace_callWithAce = function(fn, callStack, normalize) { var wrapper = function() { return fn(editorInfo); }; - + if (normalize !== undefined) { var wrapper1 = wrapper; @@ -930,14 +954,14 @@ function Ace2Inner(){ // @param value the value to set to editorInfo.ace_setProperty = function(key, value) { - - // Convinience function returning a setter for a class on an element + + // Convinience function returning a setter for a class on an element var setClassPresenceNamed = function(element, cls){ return function(value){ setClassPresence(element, cls, !! value) } }; - + // These properties are exposed var setters = { wraps: setWraps, @@ -952,7 +976,7 @@ function Ace2Inner(){ }, grayedout: setClassPresenceNamed(outerWin.document.body, "grayedout"), dmesg: function(){ dmesg = window.dmesg = value; }, - userauthor: function(value){ + userauthor: function(value){ thisAuthor = String(value); documentAttributeManager.author = thisAuthor; }, @@ -965,10 +989,10 @@ function Ace2Inner(){ document.documentElement.dir = value? 'rtl' : 'ltr' } }; - + var setter = setters[key.toLowerCase()]; - - // check if setter is present + + // check if setter is present if(setter !== undefined){ setter(value) } @@ -1077,7 +1101,7 @@ function Ace2Inner(){ return false; } }; - + isTimeUp.elapsed = function() { return now() - startTime; @@ -1458,7 +1482,7 @@ function Ace2Inner(){ var p = PROFILER("getSelection", false); var selection = getSelection(); p.end(); - + function topLevel(n) { if ((!n) || n == root) return null; @@ -1468,7 +1492,7 @@ function Ace2Inner(){ } return n; } - + if (selection) { var node1 = topLevel(selection.startPoint.node); @@ -1726,7 +1750,7 @@ function Ace2Inner(){ root:root, point:selection.startPoint, documentAttributeManager: documentAttributeManager - }); + }); selStart = (selStartFromHook==null||selStartFromHook.length==0)?getLineAndCharForPoint(selection.startPoint):selStartFromHook; } if (selection && !selEnd) @@ -1739,7 +1763,7 @@ function Ace2Inner(){ point:selection.endPoint, documentAttributeManager: documentAttributeManager }); - selEnd = (selEndFromHook==null||selEndFromHook.length==0)?getLineAndCharForPoint(selection.endPoint):selEndFromHook; + selEnd = (selEndFromHook==null||selEndFromHook.length==0)?getLineAndCharForPoint(selection.endPoint):selEndFromHook; } // selection from content collection can, in various ways, extend past final @@ -1760,7 +1784,7 @@ function Ace2Inner(){ // update rep if we have a new selection // NOTE: IE loses the selection when you click stuff in e.g. the // editbar, so removing the selection when it's lost is not a good - // idea. + // idea. if (selection) repSelectionChange(selStart, selEnd, selection && selection.focusAtStart); // update browser selection p.mark("browsel"); @@ -1895,19 +1919,19 @@ function Ace2Inner(){ return rep.selStart[0]; } editorInfo.ace_caretLine = caretLine; - + function caretColumn() { return rep.selStart[1]; } editorInfo.ace_caretColumn = caretColumn; - + function caretDocChar() { return rep.lines.offsetOfIndex(caretLine()) + caretColumn(); } editorInfo.ace_caretDocChar = caretDocChar; - + function handleReturnIndentation() { // on return, indent to level of previous line @@ -2336,8 +2360,8 @@ function Ace2Inner(){ documentAttributeManager.setAttributesOnRange(lineAndColumnFromChar(start), lineAndColumnFromChar(end), attribs); } editorInfo.ace_performDocumentApplyAttributesToCharRange = performDocumentApplyAttributesToCharRange; - - + + function setAttributeOnSelection(attributeName, attributeValue) { if (!(rep.selStart && rep.selEnd)) return; @@ -2900,7 +2924,7 @@ function Ace2Inner(){ { if (lineClass !== null) lineElem.className = lineClass; }; - + result.prepareForAdd = writeClass; result.finishUpdate = writeClass; result.getInnerHTML = function() @@ -3262,7 +3286,7 @@ function Ace2Inner(){ { return (n.tagName || '').toLowerCase() == "a" && n.href; } - + // only want to catch left-click if ((!evt.ctrlKey) && (evt.button != 2) && (evt.button != 3)) { @@ -3298,7 +3322,7 @@ function Ace2Inner(){ { return; } - + var lineNum = rep.selStart[0]; var listType = getLineListType(lineNum); @@ -3423,9 +3447,9 @@ function Ace2Inner(){ var thisLineListType = getLineListType(theLine); var prevLineEntry = (theLine > 0 && rep.lines.atIndex(theLine - 1)); var prevLineBlank = (prevLineEntry && prevLineEntry.text.length == prevLineEntry.lineMarker); - + var thisLineHasMarker = documentAttributeManager.lineHasMarker(theLine); - + if (thisLineListType) { // this line is a list @@ -3500,7 +3524,7 @@ function Ace2Inner(){ return !!REGEX_WORDCHAR.exec(c); } editorInfo.ace_isWordChar = isWordChar; - + function isSpaceChar(c) { return !!REGEX_SPACE.exec(c); @@ -4130,7 +4154,7 @@ function Ace2Inner(){ maxIndex: tn.nodeValue.length }; }; - + var selection = {}; if (origSelectionRange.compareEndPoints("StartToEnd", origSelectionRange) === 0) { @@ -4234,7 +4258,7 @@ function Ace2Inner(){ selection.startPoint = pointFromRangeBound(range.startContainer, range.startOffset); selection.endPoint = pointFromRangeBound(range.endContainer, range.endOffset); selection.focusAtStart = (((range.startContainer != range.endContainer) || (range.startOffset != range.endOffset)) && browserSelection.anchorNode && (browserSelection.anchorNode == range.endContainer) && (browserSelection.anchorOffset == range.endOffset)); - + if(selection.startPoint.node.ownerDocument !== window.document){ return null; } @@ -4999,9 +5023,9 @@ function Ace2Inner(){ } } } - + var listAttributeName = 'list'; - + function getLineListType(lineNum) { return documentAttributeManager.getAttributeOnLine(lineNum, listAttributeName) @@ -5014,7 +5038,7 @@ function Ace2Inner(){ }else{ documentAttributeManager.setAttributeOnLine(lineNum, listAttributeName, listType); } - + //if the list has been removed, it is necessary to renumber //starting from the *next* line because the list may have been //separated. If it returns null, it means that the list was not cut, try @@ -5024,7 +5048,7 @@ function Ace2Inner(){ renumberList(lineNum); } } - + function renumberList(lineNum){ //1-check we are in a list var type = getLineListType(lineNum); @@ -5037,7 +5061,7 @@ function Ace2Inner(){ { return null; } - + //2-find the first line of the list while(lineNum-1 >= 0 && (type=getLineListType(lineNum-1))) { @@ -5046,7 +5070,7 @@ function Ace2Inner(){ break; lineNum--; } - + //3-renumber every list item of the same level from the beginning, level 1 //IMPORTANT: never skip a level because there imbrication may be arbitrary var builder = Changeset.builder(rep.lines.totalWidth()); @@ -5073,7 +5097,7 @@ function Ace2Inner(){ ChangesetUtils.buildKeepRange(rep, builder, loc, (loc = [line, 1]), [ ['start', position] ], rep.apool); - + position++; line++; } @@ -5088,19 +5112,19 @@ function Ace2Inner(){ } return line; } - + applyNumberList(lineNum, 1); var cs = builder.toString(); if (!Changeset.isIdentity(cs)) { performDocumentApplyChangeset(cs); } - + //4-apply the modifications - - + + } - + function doInsertList(type) { @@ -5138,7 +5162,7 @@ function Ace2Inner(){ var t = getLineListType(n); mods.push([n, allLinesAreList ? 'indent' + level : (t ? type + level : type + '1')]); } - + _.each(mods, function(mod){ setLineListType(mod[0], mod[1]); }); @@ -5152,7 +5176,7 @@ function Ace2Inner(){ } editorInfo.ace_doInsertUnorderedList = doInsertUnorderedList; editorInfo.ace_doInsertOrderedList = doInsertOrderedList; - + var lineNumbersShown; var sideDivInner; @@ -5168,11 +5192,11 @@ function Ace2Inner(){ var newNumLines = rep.lines.length(); if (newNumLines < 1) newNumLines = 1; //update height of all current line numbers - + var a = sideDivInner.firstChild; var b = doc.body.firstChild; var n = 0; - + if (currentCallStack && currentCallStack.domClean) { @@ -5201,8 +5225,8 @@ function Ace2Inner(){ b = b.nextSibling; n++; } - } - + } + if (newNumLines != lineNumbersShown) { var container = sideDivInner; @@ -5212,27 +5236,27 @@ function Ace2Inner(){ { lineNumbersShown++; var n = lineNumbersShown; - var div = odoc.createElement("DIV"); + var div = odoc.createElement("DIV"); //calculate height for new line number if(b){ var h = (b.clientHeight || b.offsetHeight); - + if (b.nextSibling){ h = b.nextSibling.offsetTop - b.offsetTop; } } - + if(h){ // apply style to div div.style.height = h +"px"; } - + div.appendChild(odoc.createTextNode(String(n))); fragment.appendChild(div); if(b){ b = b.nextSibling; } } - + container.appendChild(fragment); while (lineNumbersShown > newNumLines) { @@ -5241,8 +5265,8 @@ function Ace2Inner(){ } } } - - + + // Init documentAttributeManager documentAttributeManager = new AttributeManager(rep, performDocumentApplyChangeset); editorInfo.ace_performDocumentApplyAttributesToRange = function () { @@ -5288,13 +5312,13 @@ function Ace2Inner(){ bindTheEventHandlers(); }); - + hooks.callAll('aceInitialized', { editorInfo: editorInfo, rep: rep, documentAttributeManager: documentAttributeManager }); - + scheduler.setTimeout(function() { parent.readyFunc(); // defined in code that sets up the inner iframe diff --git a/src/static/js/changesettracker.js b/src/static/js/changesettracker.js index d0c91e3d3..8c4c1c216 100644 --- a/src/static/js/changesettracker.js +++ b/src/static/js/changesettracker.js @@ -57,6 +57,7 @@ function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) { changeCallback(); } + catch(pseudoError) {} finally { changeCallbackTimeout = null; @@ -161,21 +162,32 @@ function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) } else { + + // add forEach function to Array.prototype for IE8 + if (!('forEach' in Array.prototype)) { + Array.prototype.forEach= function(action, that /*opt*/) { + for (var i= 0, n= this.length; i /tmp/sauce.zip unzip /tmp/sauce.zip -d /tmp # start the sauce connector in background and make sure it doesn't output the secret key -(java -jar /tmp/Sauce-Connect.jar $SAUCE_USER $SAUCE_KEY -f /tmp/tunnel > /dev/null )& +(java -jar /tmp/Sauce-Connect.jar $SAUCE_USERNAME $SAUCE_ACCESS_KEY -f /tmp/tunnel > /dev/null )& # save the sauce pid in a file echo $! > /tmp/sauce.pid