diff options
204 files changed, 10738 insertions, 6256 deletions
@@ -15,3 +15,4 @@ npm-debug.log .ep_initialized *.crt *.key +bin/etherpad-1.deb diff --git a/.travis.yml b/.travis.yml index 77f0c855..4cdf6383 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,20 @@ language: node_js node_js: - - "0.8" + - "0.10" install: - "bin/installDeps.sh" - - "export GIT_HASH=$(cat .git/HEAD | head -c 7)" -before_script: + - "export GIT_HASH=$(git rev-parse --verify --short HEAD)" +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=pita + - 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 irc: channels: - - "irc.freenode.org#etherpad-lite-dev"
\ No newline at end of file + - "irc.freenode.org#etherpad-lite-dev" diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fac58f2..e5ae13bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,129 @@ +# 1.4 + * NEW: Disable toolbar items through settings.json + * NEW: Internal stats/metrics engine + * NEW: Copy/Move Pad API functions + * NEW: getAttributeOnSelection method + * NEW: CSS function when an attribute is active on caret location + * NEW: Various new eejs blocks + * NEW: Ace afterEditHook + * NEW: Import hook to introduce alternative export methods + * NEW: preProcessDomLine allows Domline attributes to be processed before native attributes + * Fix: Allow for lighter author colors + * Fix: Improved randomness of session tokens + * Fix: Don't panic if an author2session/group2session no longer exists + * Fix: Gracefully fallback to related languages if chosen language is unavailable + * Fix: Various changeset/stability bugs + * Fix: Re-enable import buttons after failed import + * Fix: Allow browser tabs to be cycled when in editor + * Fix: Better Protocol detection + * Fix: padList API Fix + * Fix: Caret walking issue + * Fix: Better settings.json parsing + * Fix: Improved import/export handling + * Other: Various whitespace/code clean-up + * Other: .deb packaging creator + * Other: More API Documentation + * Other: Lots more translations + * Other: Support Node 0.11 + +# 1.3 + * NEW: We now follow the semantic versioning scheme! + * NEW: Option to disable IP logging + * NEW: Localisation updates from http://translatewiki.net. + * Fix: Fix readOnly group pads + * Fix: don't fetch padList on every request + +# 1.2.12 + * NEW: Add explanations for more disconnect scenarios + * NEW: export sessioninfos so plugins can access it + * NEW: pass pad in postAceInit hook + * NEW: Add trustProxy setting. ALlows to make ep use X-forwarded-for as remoteAddress + * NEW: userLeave hook (UNDOCUMENTED) + * NEW: Plural macro for translations + * NEW: backlinks to main page in Admin pages + * NEW: New translations from translatewiki.net + * SECURITY FIX: Filter author data sent to clients + * FIX: Never keep processing a changeset if it's corrupted + * FIX: Some client-side performance fixes for webkit browsers + * FIX: Only execute listAllPads query on demand (not on start-up) + * FIX: HTML import (don't crash on malformed or blank HTML input; strip title out of html during import) + * FIX: check if uploaded file only contains ascii chars when abiword disabled + * FIX: Plugin search in /admin/plugins + * FIX: Don't create new pad if a non-existant read-only pad is accessed + * FIX: Drop messages from unknown connections (would lead to a crash after a restart) + * FIX: API: fix createGroupFor endpoint, if mapped group is deleted + * FIX: Import form for other locales + * FIX: Don't stop processing changeset queue if there is an error + * FIX: Caret movement. Chrome detects blank rows line heights as incorrect + * FIX: allow colons in password + * FIX: Polish logging of client-side errors on the server + * FIX: Username url param + * FIX: Make start script POSIX ompatible + + +# 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 + * Fix: console issue in collab client would error on cross domain embeds in IE + * Fix: Only Restart Etherpad once plugin is installed + * Fix: Only redraw lines that exist after drag and drop + * Fix: Pasting into ordered list + * Fix: Import browser detection + * Fix: 2 Part Locale Specs + * Fix: Remove language string from chat element + * Fix: Make Saved revision Star fade back out on non Top frames + * Other: Remove some cruft legacy JS from old Etherpad + * Other: Express 3.1.2 breaks sessions, set Express to 3.1.0 + +# 1.2.91 + * NEW: Authors can now send custom object messages to other Authors making 3 way conversations possible. This introduces WebRTC plugin support. + * NEW: Hook for Chat Messages Allows for Desktop Notification support + * NEW: FreeBSD installation docs + * NEW: Ctrl S for save revision makes the Icon glow for a few sconds. + * NEW: Various hooks and expose the document ACE object + * NEW: Plugin page revamp makes finding and installing plugins more sane. + * NEW: Icon to enable sticky chat from the Chat box + * Fix: Cookies inside of plugins + * Fix: Don't leak event emitters when accessing admin/plugins + * Fix: Don't allow user to send messages after they have been "kicked" from a pad + * Fix: Refactor Caret navigation with Arrow and Pageup/down keys stops cursor being lost + * Fix: Long lines in Firefox now wrap properly + * Fix: Session Disconnect limit is increased from 10 to 20 to support slower restarts + * Fix: Support Node 0.10 + * Fix: Log HTTP on DEBUG log level + * Fix: Server wont crash on import fails on 0 file import. + * Fix: Import no longer fails consistantly + * Fix: Language support for non existing languages + * Fix: Mobile support for chat notifications are now usable + * Fix: Re-Enable Editbar buttons on reconnect + * Fix: Clearing authorship colors no longer disconnects all clients + * Other: New debug information for sessions + +# 1.2.9 + * Fix: MAJOR Security issue, where a hacker could submit content as another user + * Fix: security issue due to unescaped user input + * Fix: Admin page at /admin redirects to /admin/ now to prevent breaking relative links + * Fix: indentation in chrome on linux + * Fix: PadUsers API endpoint + * NEW: A script to import data to all dbms + * NEW: Add authorId to chat and userlist as a data attribute + * NEW: Refactor and fix our frontend tests + * NEW: Localisation updates + + # 1.2.81 * Fix: CtrlZ-Y for Undo Redo * Fix: RTL functionality on contents & fix RTL/LTR tests and RTL in Safari diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a69a3b6..0110151c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,17 +2,17 @@ (Please talk to people on the mailing list before you change this page, see our section on [how to get in touch](https://github.com/ether/etherpad-lite#get-in-touch)) ## Important note for pull requests -**Pull requests should issued against the develop branch**. We never pull directly into master. +**Pull requests should be issued against the develop branch**. We never pull directly into master. **Our goal is to iterate in small steps. Release often, release early. Evolution instead of a revolution** -## General goals of Etherpad Lite +## General goals of Etherpad To make sure everybody is going in the same direction: * easy to install for admins and easy to use for people * easy to integrate into other apps, but also usable as standalone * using less resources on server side -* extensible, as much functionality should be extendable with plugins so changes don't have to be done in core -Also, keep it maintainable. We don't wanna end ob as the monster Etherpad was! +* extensible, as much functionality should be extendable with plugins so changes don't have to be done in core. +Also, keep it maintainable. We don't wanna end up as the monster Etherpad was! ## How to work with git? * Don't work in your master branch. @@ -31,6 +31,7 @@ Also, keep it maintainable. We don't wanna end ob as the monster Etherpad was! * Do generalize sooner or later! (if an old solution, quickly hacked together, poses more problems than it solves today, refactor it!) * Keep it compatible. Do not introduce changes to the public API, db schema or configurations too lightly. Don't make incompatible changes without good reasons! * If you do make changes, document them! (see below) +* Use protocol independent urls "//" ## Branching model / git workflow see git flow http://nvie.com/posts/a-successful-git-branching-model/ @@ -62,4 +63,7 @@ The docs are in the `doc/` folder in the git repository, so people can easily fi Documentation should be kept up-to-date. This means, whenever you add a new API method, add a new hook or change the database model, pack the relevant changes to the docs in the same pull request. -You can build the docs e.g. produce html, using `make docs`. At some point in the future we will provide an online documentation. The current documentation in the github wiki should always reflect the state of `master` (!), since there are no docs in master, yet.
\ No newline at end of file +You can build the docs e.g. produce html, using `make docs`. At some point in the future we will provide an online documentation. The current documentation in the github wiki should always reflect the state of `master` (!), since there are no docs in master, yet. + +## Testing +Front-end tests are found in the `tests/frontend/` folder in the repository. Run them by pointing your browser to `<yourdomainhere>/tests/frontend`. @@ -1,4 +1,3 @@ - Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -187,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2012 THE ETHERPAD FOUNDATION + Copyright 2013 THE ETHERPAD FOUNDATION Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1,49 +1,35 @@ -# Making collaborative editing the standard on the web +# A really-real time collaborative word processor for the web +![alt text](http://i.imgur.com/zYrGkg3.gif "Etherpad in action on PrimaryPad") # About -Etherpad lite is a really-real time collaborative editor spawned from the Hell fire of Etherpad. -We're reusing the well tested Etherpad easysync library to make it really realtime. Etherpad Lite -is based on node.js ergo is much lighter and more stable than the original Etherpad. Our hope -is that this will encourage more users to use and install a realtime collaborative editor. A smaller, manageable and well -documented codebase makes it easier for developers to improve the code and contribute towards the project. - -**Etherpad vs Etherpad lite** -<table> - <tr> - <td> </td><td><b>Etherpad</b></td><td><b>Etherpad Lite</b></td> - </tr> - <tr> - <td align="right">Size of the folder (without git history)</td><td>30 MB</td><td>1.5 MB</td> - </tr> - <tr> - <td align="right">Languages used server side</td><td>Javascript (Rhino), Java, Scala</td><td>Javascript (node.js)</td> - </tr> - <tr> - <td align="right">Lines of server side Javascript code</td><td>~101k</td><td>~9k</td> - </tr> - <tr> - <td align="right">RAM Usage immediately after start</td><td>257 MB (grows to ~1GB)</td><td>16 MB (grows to ~30MB)</td> - </tr> -</table> - - -Etherpad Lite is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) -that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API. There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. -There's also a full-featured plugin framework, allowing you to easily add your own features. -Finally, Etherpad Lite comes with translations into tons of different languages! - -**Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live** +Etherpad is a really-real time collaborative editor maintained by the Etherpad Community. + +Etherpad is written in Javascript(99.9%) on both the server and client so it's easy for developers to maintain and add new features. Because of this Etherpad has tons of customizations that you can leverage. + +Etherpad is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) +that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API. + +There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website. + +There's also a full-featured plugin framework, allowing you to easily add your own features. By default your Etherpad is rather sparce and because Etherpad takes a lot of it's inspiration from Wordpress plugins are really easy to install and update. Once you have Etherpad installed you should visit the plugin page and take control. + +Finally, Etherpad comes with translations into most languages! Users are automatically delivered the correct language for their local settings. + + +**Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live.** Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**, really! # Installation +Etherpad works with node v0.8, v0.10 and v0.11, only. (We don't support v0.6) + ## Windows ### Prebuilt windows package This package works out of the box on any windows machine, but it's not very useful for developing purposes... -1. Download the windows package <https://github.com/ether/etherpad-lite/downloads> +1. [Download the latest windows package](http://etherpad.org/#download) 2. Extract the folder Now, run `start.bat` and open <http://localhost:9001> in your browser. You like it? [Next steps](#next-steps). @@ -62,16 +48,17 @@ Update to the latest version with `git pull origin`, then run `bin\installOnWind [Next steps](#next-steps). -## Linux +## GNU/Linux and other UNIX-like systems You'll need gzip, git, curl, libssl develop libraries, python and gcc. *For Debian/Ubuntu*: `apt-get install gzip git-core curl python libssl-dev pkg-config build-essential` *For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"` +*For FreeBSD*: `portinstall node, npm, git (optional)` Additionally, you'll need [node.js](http://nodejs.org) installed, Ideally the latest stable version, be careful of installing nodejs from apt. -**As any user (we recommend creating a separate user called etherpad-lite):** +**As any user (we recommend creating a separate user called etherpad):** -1. Move to a folder where you want to install Etherpad Lite. Clone the git repository `git clone git://github.com/ether/etherpad-lite.git` +1. Move to a folder where you want to install Etherpad. Clone the git repository `git clone git://github.com/ether/etherpad-lite.git` 2. Change into the new directory containing the cloned source code `cd etherpad-lite` Now, run `bin/run.sh` and open <http://127.0.0.1:9001> in your browser. @@ -83,9 +70,9 @@ You like it? [Next steps](#next-steps). # Next Steps ## Tweak the settings -You can modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad Lite instances from the same installation.) +You can initially modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad instances from the same installation.) Once you have access to your /admin section settings can be modified through the web browser. -You should use a dedicated database such as "mysql", if you are planning on using etherpad-lite in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes. +You should use a dedicated database such as "mysql", if you are planning on using etherpad-in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes. ## Helpful resources The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages. @@ -95,11 +82,11 @@ Documentation can be found in `docs/`. # Development ## Things you should know -Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Lite Development](http://youtu.be/67-Q26YH97E). +Read this [git guide](http://learn.github.com/p/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). -You can debug Etherpad lite using `bin/debugRun.sh`. +You can debug Etherpad using `bin/debugRun.sh`. If you want to find out how Etherpad's `Easysync` works (the library that makes it really realtime), start with this [PDF](https://github.com/ether/etherpad-lite/raw/master/doc/easysync/easysync-full-description.pdf) (complex, but worth reading). @@ -111,7 +98,7 @@ Look at the [TODO list](https://github.com/ether/etherpad-lite/wiki/TODO) and ou Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md), really! # Get in touch -Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)! +Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our busy freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)! # Modules created for this project diff --git a/bin/buildDebian.sh b/bin/buildDebian.sh new file mode 100755 index 00000000..cc3353c2 --- /dev/null +++ b/bin/buildDebian.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# IMPORTANT +# Protect agaisnt mispelling a var and rm -rf / +set -u +set -e + +SRC=/tmp/etherpad-deb-src +DIST=/tmp/etherpad-deb-dist +SYSROOT=${SRC}/sysroot +DEBIAN=${SRC}/DEBIAN + +rm -rf ${DIST} +mkdir -p ${DIST}/ + +rm -rf ${SRC} +rsync -a bin/deb-src/ ${SRC}/ +mkdir -p ${SYSROOT}/opt/ + +rsync --exclude '.git' -a . ${SYSROOT}/opt/etherpad/ --delete +mkdir -p ${SYSROOT}/usr/share/doc +cp README.md ${SYSROOT}/usr/share/doc/etherpad +find ${SRC}/ -type d -exec chmod 0755 {} \; +find ${SRC}/ -type f -exec chmod go-w {} \; +chown -R root:root ${SRC}/ + +let SIZE=`du -s ${SYSROOT} | sed s'/\s\+.*//'`+8 +pushd ${SYSROOT}/ +tar czf ${DIST}/data.tar.gz [a-z]* +popd +sed s"/SIZE/${SIZE}/" -i ${DEBIAN}/control +pushd ${DEBIAN} +tar czf ${DIST}/control.tar.gz * +popd + +pushd ${DIST}/ +echo 2.0 > ./debian-binary + +find ${DIST}/ -type d -exec chmod 0755 {} \; +find ${DIST}/ -type f -exec chmod go-w {} \; +chown -R root:root ${DIST}/ +ar r ${DIST}/etherpad-1.deb debian-binary control.tar.gz data.tar.gz +popd +rsync -a ${DIST}/etherpad-1.deb ./ diff --git a/bin/buildForWindows.sh b/bin/buildForWindows.sh index c67a3701..a1e2c757 100755 --- a/bin/buildForWindows.sh +++ b/bin/buildForWindows.sh @@ -67,4 +67,4 @@ mv etherpad-lite-win.zip $START_FOLDER echo "clean up..." rm -rf /tmp/etherpad-lite-win -echo "Finished. You can find the zip in the Etherpad Lite root folder, it's called etherpad-lite-win.zip" +echo "Finished. You can find the zip in the Etherpad root folder, it's called etherpad-lite-win.zip" diff --git a/bin/convert.js b/bin/convert.js index a2f3bdd4..202ef04e 100644 --- a/bin/convert.js +++ b/bin/convert.js @@ -337,7 +337,7 @@ function convertPad(padId, callback) var oldName2newName = {}; //replace the authors with generated authors - // we need to do that cause etherpad saves pad local authors, etherpad lite uses them global + // we need to do that cause where the original etherpad saves pad local authors, the new (lite) etherpad uses them global for(var i in apool.numToAttrib) { var key = apool.numToAttrib[i][0]; diff --git a/bin/deb-src/DEBIAN/control b/bin/deb-src/DEBIAN/control new file mode 100644 index 00000000..a516dc6d --- /dev/null +++ b/bin/deb-src/DEBIAN/control @@ -0,0 +1,9 @@ +Package: etherpad +Version: 1.3 +Section: base +Priority: optional +Architecture: i386 +Installed-Size: SIZE +Depends: +Maintainer: John McLear <john@mclear.co.uk> +Description: Etherpad is a collaborative editor. diff --git a/bin/deb-src/DEBIAN/postinst b/bin/deb-src/DEBIAN/postinst new file mode 100755 index 00000000..2f483f7e --- /dev/null +++ b/bin/deb-src/DEBIAN/postinst @@ -0,0 +1,7 @@ +#!/bin/bash +# Start the services! + +service etherpad start +echo "Give Etherpad about 3 minutes to install dependencies then visit http://localhost:9001 in your web browser" +echo "To stop etherpad type 'service etherpad stop', To restart type 'service etherpad restart'". +rm -f /tmp/etherpad.log /tmp/etherpad.err diff --git a/bin/deb-src/DEBIAN/preinst b/bin/deb-src/DEBIAN/preinst new file mode 100755 index 00000000..e5b5e0b7 --- /dev/null +++ b/bin/deb-src/DEBIAN/preinst @@ -0,0 +1,26 @@ +#!/bin/bash + +# Installs node if it isn't already installed +# +# Don't steamroll over a previously installed node version +# TODO provide a local version of node? + +VER="0.10.4" +ARCH="x86" +if [ `arch | grep 64` ] +then + ARCH="x64" +fi + +# TODO test version +if [ ! -f /usr/local/bin/node ] +then + pushd /tmp + wget -c "http://nodejs.org/dist/v${VER}/node-v${VER}-linux-${ARCH}.tar.gz" + rm -rf /tmp/node-v${VER}-linux-${ARCH} + tar xf node-v${VER}-linux-${ARCH}.tar.gz -C /tmp/ + cp -a /tmp/node-v${VER}-linux-${ARCH}/* /usr/local/ +fi + +# Create Etherpad user +adduser --system etherpad diff --git a/bin/deb-src/DEBIAN/prerm b/bin/deb-src/DEBIAN/prerm new file mode 100755 index 00000000..5e3d0f8a --- /dev/null +++ b/bin/deb-src/DEBIAN/prerm @@ -0,0 +1,4 @@ +#!/bin/bash + +# Stop the appserver: +service etherpad stop || true diff --git a/bin/deb-src/sysroot/etc/init/etherpad.conf b/bin/deb-src/sysroot/etc/init/etherpad.conf new file mode 100644 index 00000000..cd6f4541 --- /dev/null +++ b/bin/deb-src/sysroot/etc/init/etherpad.conf @@ -0,0 +1,28 @@ +description "etherpad" + +start on started networking +stop on runlevel [!2345] + +env EPHOME=/opt/etherpad +env EPLOGS=/var/log/etherpad +env EPUSER=etherpad + +respawn + +pre-start script + cd $EPHOME + mkdir $EPLOGS ||true + chown $EPUSER $EPLOGS ||true + chmod 0755 $EPLOGS ||true + chown -R $EPUSER $EPHOME/var ||true + $EPHOME/bin/installDeps.sh >> $EPLOGS/error.log || { stop; exit 1; } +end script + +script + cd $EPHOME/ + exec su -s /bin/sh -c 'exec "$0" "$@"' $EPUSER -- node node_modules/ep_etherpad-lite/node/server.js \ + >> $EPLOGS/access.log \ + 2>> $EPLOGS/error.log + echo "Etherpad is running on http://localhost:9001 - To change settings edit /opt/etherpad/settings.json" + +end script diff --git a/bin/installDeps.sh b/bin/installDeps.sh index 9763f41b..84f2e227 100755 --- a/bin/installDeps.sh +++ b/bin/installDeps.sh @@ -16,7 +16,7 @@ if [ $(uname) = "SunOS" ]; then } fi -#Is wget installed? +#Is curl installed? hash curl > /dev/null 2>&1 || { echo "Please install curl" >&2 exit 1 @@ -44,8 +44,8 @@ fi #check node version NODE_VERSION=$(node --version) NODE_V_MINOR=$(echo $NODE_VERSION | cut -d "." -f 1-2) -if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.6" ]; then - echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.6.x or v0.8.x" >&2 +if [ ! $NODE_V_MINOR = "v0.8" ] && [ ! $NODE_V_MINOR = "v0.10" ] && [ ! $NODE_V_MINOR = "v0.11" ]; then + echo "You're running a wrong version of node, you're using $NODE_VERSION, we need v0.8.x, v0.10.x or v0.11.x" >&2 exit 1 fi diff --git a/bin/installOnWindows.bat b/bin/installOnWindows.bat index f678672b..86223064 100644 --- a/bin/installOnWindows.bat +++ b/bin/installOnWindows.bat @@ -8,7 +8,7 @@ cmd /C node -e "" || ( echo "Please install node.js ( http://nodejs.org )" && ex echo _ echo Checking node version... -set check_version="if(['6','8'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad Lite requires v0.6.x or v0.8.x'); process.exit(1) }" +set check_version="if(['8','10'].indexOf(process.version.split('.')[1].toString()) === -1) { console.log('You are running a wrong version of Node. Etherpad requires v0.8.x or v0.10.x'); process.exit(1) }" cmd /C node -e %check_version% || exit /B 1 echo _ diff --git a/bin/loadTesting/README b/bin/loadTesting/README index 2246f7eb..c8ecd71e 100644 --- a/bin/loadTesting/README +++ b/bin/loadTesting/README @@ -2,7 +2,7 @@ This is the new load testing file: https://bitbucket.org/rbraakman/etherpad-stre BELOW is the original load testing file. -This load tester is extremely useful for testing how many dormant clients can connect to etherpad lite. +This load tester is extremely useful for testing how many dormant clients can connect to etherpad. TODO: Emulate characters being typed into a pad @@ -10,26 +10,26 @@ Emulate characters being typed into a pad HOW TO USE (from @mjd75) proper formatting at: https://github.com/ether/etherpad-lite/issues/360 Server 1: -Installed Node.js (etc), EtherPad Lite and MySQL +Installed Node.js (etc), EtherPad and MySQL Server 2: Installed Xvfb and PhantomJS I installed Xvfb following (roughly) this guide: http://blog.martin-lyness.com/archives/installing-xvfb-on-ubuntu-9-10-karmic-koala - #sudo apt-get install xvfb - #sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic + #sudo apt-get install xvfb + #sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic Launched two instances of Xvfb directly from the terminal: - #Xvfb :0 -ac - #Xvfb :1 -ac + #Xvfb :0 -ac + #Xvfb :1 -ac I installed PhantomJS following this guide: http://code.google.com/p/phantomjs/wiki/Installation - #sudo add-apt-repository ppa:jerome-etienne/neoip - #sudo apt-get update - #sudo apt-get install phantomjs + #sudo add-apt-repository ppa:jerome-etienne/neoip + #sudo apt-get update + #sudo apt-get install phantomjs I created a small JavaScript file for PhatomJS to use to control the browser instances: diff --git a/bin/loadTesting/launcher.sh b/bin/loadTesting/launcher.sh index 375b1544..e940f8e0 100755 --- a/bin/loadTesting/launcher.sh +++ b/bin/loadTesting/launcher.sh @@ -3,7 +3,7 @@ # connect 500 instances to display :0 for i in {1..500} do - echo $i + echo $i echo "Displaying Some shit" DISPLAY=:0 screen -d -m /home/phantomjs/bin/phantomjs loader.js http://10.0.0.55:9001/p/pad2 && sleep 2 done @@ -11,17 +11,17 @@ fi ignoreRoot=0 for ARG in $* do - if [ $ARG == '--root' ]; then + if [ "$ARG" = "--root" ]; then ignoreRoot=1 fi done #Stop the script if its started as root if [ "$(id -u)" -eq 0 ] && [ $ignoreRoot -eq 0 ]; then - echo "You shouldn't start Etherpad-Lite as root!" - echo "Please type 'Etherpad Lite rocks my socks' or supply the '--root' argument if you still want to start it as root" + echo "You shouldn't start Etherpad as root!" + echo "Please type 'Etherpad rocks my socks' or supply the '--root' argument if you still want to start it as root" read rocks - if [ ! $rocks = "Etherpad Lite rocks my socks" ] + if [ ! $rocks = "Etherpad rocks my socks" ] then echo "Your input was incorrect" exit 1 @@ -33,4 +33,7 @@ bin/installDeps.sh $* || exit 1 #Move to the node folder and start echo "start..." -node node_modules/ep_etherpad-lite/node/server.js $* + +SCRIPTPATH=`pwd -P` +node $SCRIPTPATH/node_modules/ep_etherpad-lite/node/server.js $* + diff --git a/bin/safeRun.sh b/bin/safeRun.sh index b060f5d1..4b3485ba 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/api.md b/doc/api/api.md index eb5bb9c9..d124e4c3 100644 --- a/doc/api/api.md +++ b/doc/api/api.md @@ -5,4 +5,6 @@ @include hooks_server-side @include editorInfo @include changeset_library -@include pluginfw
\ No newline at end of file +@include pluginfw +@include toolbar +@include editbar
\ No newline at end of file diff --git a/doc/api/editbar.md b/doc/api/editbar.md new file mode 100644 index 00000000..ce89c0b7 --- /dev/null +++ b/doc/api/editbar.md @@ -0,0 +1,28 @@ +# Editbar +srf/static/js/pad_editbar.js + +## isEnabled() + +## disable() + +## toggleDropDown(dropdown, callback) +Shows the dropdown `div.popup` whose `id` equals `dropdown`. + +## registerCommand(cmd, callback) +Register a handler for a specific command. Commands are fired if the corresponding button is clicked or the corresponding select is changed. + +## registerAceCommand(cmd, callback) +Creates an ace callstack and calls the callback with an ace instance: `callback(cmd, ace)`. + +Example: +``` +toolbar.registerAceCommand("insertorderedlist", function (cmd, ace) { + ace.ace_doInsertOrderedList(); +}); +``` + +## registerDropdownCommand(cmd, dropdown) +Ties a `div.popup` where `id` equals `dropdown` to a `command` fired by clicking a button. + +## triggerCommand(cmd[, item]) +Triggers a command (optionally with some internal representation of the toolbar item that triggered it).
\ No newline at end of file diff --git a/doc/api/editorInfo.md b/doc/api/editorInfo.md index 05656bce..31361a75 100644 --- a/doc/api/editorInfo.md +++ b/doc/api/editorInfo.md @@ -39,6 +39,13 @@ Returns the `rep` object. ## editorInfo.ace_performDocumentApplyAttributesToCharRange(?) ## editorInfo.ace_setAttributeOnSelection(?) ## editorInfo.ace_toggleAttributeOnSelection(?) +## editorInfo.ace_getAttributeOnSelection(attribute) +Returns a boolean if an attribute exists on a selected range. +The attribute should be the string name of the attribute applied to the selection IE subscript +Example usage: Apply the activeButton Class to a button if an attribute is on a highlighted/selected caret position or range. +Example: `call.editorInfo.ace_getAttributeOnSelection("subscript");` // call here is the callstack from aceEditEvent. +See the ep_subscript plugin for an example of this function in action. +Notes: Does not work on first or last character of a line. Suffers from a race condition if called with aceEditEvent. ## editorInfo.ace_performSelectionChange(?) ## editorInfo.ace_doIndentOutdent(?) ## editorInfo.ace_doUndoRedo(?) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index 7f376def..b8a58b31 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -10,6 +10,22 @@ nothing This hook proxies the functionality of jQuery's `$(document).ready` event. +## aceDomLinePreProcessLineAttributes +Called from: src/static/js/domline.js + +Things in context: + +1. domline - The current DOM line being processed +2. cls - The class of the current block element (useful for styling) + +This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. This hook is run BEFORE the numbered and ordered lists logic is applied. + +The return value of this hook should have the following structure: + +`{ preHtml: String, postHtml: String, processedMarker: Boolean }` + +The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more. + ## aceDomLineProcessLineAttributes Called from: src/static/js/domline.js @@ -18,7 +34,7 @@ Things in context: 1. domline - The current DOM line being processed 2. cls - The class of the current block element (useful for styling) -This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. +This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. This hook is run AFTER the ordered and numbered lists logic is applied. The return value of this hook should have the following structure: @@ -126,6 +142,7 @@ Called from: src/static/js/pad.js Things in context: 1. ace - the ace object that is applied to this editor. +2. pad - the pad object of the current pad. There doesn't appear to be any example available of this particular hook being used, but it gets fired after the editor is all set up. @@ -143,6 +160,20 @@ Things in context: This hook is called on the client side whenever a user joins or changes. This can be used to create notifications or an alternate user list. +## chatNewMessage +Called from: src/static/js/chat.js + +Things in context: + +1. authorName - The user that wrote this message +2. author - The authorID of the user that wrote the message +2. text - the message text +3. sticky (boolean) - if you want the gritter notification bubble to fade out on its own or just sit there +3. timestamp - the timestamp of the chat message +4. timeStr - the timestamp as a formatted string + +This hook is called on the client side whenever a chat message is received from the server. It can be used to create different notifications for chat messages. + ## collectContentPre Called from: src/static/js/contentcollector.js @@ -247,3 +278,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/doc/api/hooks_server-side.md b/doc/api/hooks_server-side.md index 0486f7d3..51026140 100644 --- a/doc/api/hooks_server-side.md +++ b/doc/api/hooks_server-side.md @@ -63,7 +63,46 @@ Things in context: This hook gets called upon the rendering of an ejs template block. For any specific kind of block, you can change how that block gets rendered by modifying the content object passed in. -Have a look at `src/templates/pad.html` and `src/templates/timeslider.html` to see which blocks are available. +Available blocks in `pad.html` are: + + * `htmlHead` - after `<html>` and immediately before the title tag + * `styles` - the style `<link>`s + * `body` - the contents of the body tag + * `editbarMenuLeft` - the left tool bar (consider using the toolbar controller instead of manually adding html here) + * `editbarMenuRight` - right tool bar + * `afterEditbar` - allows you to add stuff immediately after the toolbar + * `userlist` - the contents of the userlist dropdown + * `loading` - the intial loading message + * `mySettings` - the left column of the settings dropdown ("My view"); intended for adding checkboxes only + * `mySettings.dropdowns` - add your dropdown settings here + * `globalSettings` - the right column of the settings dropdown ("Global view") + * `importColumn` - import form + * `exportColumn` - export form + * `modals` - Contains all connectivity messages + * `embedPopup` - the embed dropdown + * `scripts` - Add your script tags here, if you really have to (consider use client-side hooks instead) + +`timeslider.html` blocks: + + * `timesliderStyles` + * `timesliderScripts` + * `timesliderBody` + * `timesliderTop` + * `timesliderEditbarRight` + * `modals` + + `index.html` blocks: + + * `indexWrapper` - contains the form for creating new pads + +## padInitToolbar +Called from: src/node/hooks/express/specialpages.js + +Things in context: + +1. toolbar - the toolbar controller that will render the toolbar eventually + +Here you can add custom toolbar items that will be available in the toolbar config in `settings.json`. For more about the toolbar controller see the API section. ## padCreate Called from: src/node/db/Pad.js @@ -208,3 +247,19 @@ Things in context: This hook will allow a plug-in developer to re-write each line when exporting to HTML. +## exportFileName +Called from src/node/handler/ExportHandler.js + +Things in context: + +1. padId + +This hook will allow a plug-in developer to modify the file name of an exported pad. This is useful if you want to export a pad under another name and/or hide the padId under export. Note that the doctype or file extension cannot be modified for security reasons. + +Example: + +``` +exports.exportFileName = function(hook, padId, callback){ + callback("newFileName"+padId); +} +``` diff --git a/doc/api/http_api.md b/doc/api/http_api.md index 7e05ff86..6cbe6e6b 100644 --- a/doc/api/http_api.md +++ b/doc/api/http_api.md @@ -7,7 +7,7 @@ The API gives another web application control of the pads. The basic functions a * grant/forbid access to pads * get/set pad content -The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to etherpad lite. Means: Your web application still has to do authentication, but you can tell etherpad lite via the api, which visitors should get which permissions. This allows etherpad lite to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website. +The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to Etherpad. Means: Your web application still has to do authentication, but you can tell Etherpad via the api, which visitors should get which permissions. This allows Etherpad to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website. Take a look at [HTTP API client libraries](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) to see if a library in your favorite language. @@ -61,7 +61,7 @@ Portal submits content into new blog post ## Usage ### API version -The latest version is `1.2.7` +The latest version is `1.2.9` The current version can be queried via /api. @@ -103,7 +103,7 @@ Responses are valid JSON in the following format: ### Authentication -Authentication works via a token that is sent with each request as a post parameter. There is a single token per Etherpad-Lite deployment. This token will be random string, generated by Etherpad-Lite at the first start. It will be saved in APIKEY.txt in the root folder of Etherpad Lite. Only Etherpad Lite and the requesting application knows this key. Token management will not be exposed through this API. +Authentication works via a token that is sent with each request as a post parameter. There is a single token per Etherpad deployment. This token will be random string, generated by Etherpad at the first start. It will be saved in APIKEY.txt in the root folder of Etherpad. Only Etherpad and the requesting application knows this key. Token management will not be exposed through this API. ### Node Interoperability @@ -132,7 +132,7 @@ creates a new group #### createGroupIfNotExistsFor(groupMapper) * API >= 1 -this functions helps you to map your application group ids to etherpad lite group ids +this functions helps you to map your application group ids to Etherpad group ids *Example returns:* * `{code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}}` @@ -188,7 +188,7 @@ creates a new author #### createAuthorIfNotExistsFor(authorMapper [, name]) * API >= 1 -this functions helps you to map your application author ids to etherpad lite author ids +this functions helps you to map your application author ids to Etherpad author ids *Example returns:* * `{code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}}` @@ -294,6 +294,65 @@ returns the text of a pad formatted as HTML * `{code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}}` * `{code: 1, message:"padID does not exist", data: null}` +#### setHTML(padID, html) + * API >= 1 + +sets the text of a pad based on HTML, HTML must be well formed. Malformed HTML will send a warning to the API log. + +*Example returns:* + * `{code: 0, message:"ok", data: null}` + * `{code: 1, message:"padID does not exist", data: null}` + +#### getAttributePool(padID) + * API >= 1.2.8 + +returns the attribute pool of a pad + +*Example returns:* + * `{ "code":0, + "message":"ok", + "data": { + "pool":{ + "numToAttrib":{ + "0":["author","a.X4m8bBWJBZJnWGSh"], + "1":["author","a.TotfBPzov54ihMdH"], + "2":["author","a.StiblqrzgeNTbK05"], + "3":["bold","true"] + }, + "attribToNum":{ + "author,a.X4m8bBWJBZJnWGSh":0, + "author,a.TotfBPzov54ihMdH":1, + "author,a.StiblqrzgeNTbK05":2, + "bold,true":3 + }, + "nextNum":4 + } + } + }` + * `{"code":1,"message":"padID does not exist","data":null}` + +#### getRevisionChangeset(padID, [rev]) + * API >= 1.2.8 + +get the changeset at a given revision, or last revision if 'rev' is not defined. + +*Example returns:* + * `{ "code" : 0, + "message" : "ok", + "data" : "Z:1>6b|5+6b$Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http://etherpad.org\n" + }` + * `{"code":1,"message":"padID does not exist","data":null}` + * `{"code":1,"message":"rev is higher than the head revision of the pad","data":null}` + +#### createDiffHTML(padID, startRev, endRev) + * API >= 1.2.7 + +returns an object of diffs from 2 points in a pad + +*Example returns:* + * `{"code":0,"message":"ok","data":{"html":"<style>\n.authora_HKIv23mEbachFYfH {background-color: #a979d9}\n.authora_n4gEeMLsv1GivNeh {background-color: #a9b5d9}\n.removed {text-decoration: line-through; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; filter: alpha(opacity=80); opacity: 0.8; }\n</style>Welcome to Etherpad!<br><br>This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!<br><br>Get involved with Etherpad at <a href=\"http://etherpad.org\">http://etherpad.org</a><br><span class=\"authora_HKIv23mEbachFYfH\">aw</span><br><br>","authors":["a.HKIv23mEbachFYfH",""]}}` + * `{"code":4,"message":"no or wrong API Key","data":null}` + ### Chat #### getChatHistory(padID, [start, end]) * API >= 1.2.7 @@ -369,6 +428,24 @@ deletes a pad * `{code: 0, message:"ok", data: null}` * `{code: 1, message:"padID does not exist", data: null}` +#### copyPad(sourceID, destinationID[, force=false]) + * API >= 1.2.8 + +copies a pad with full history and chat. If force is true and the destination pad exists, it will be overwritten. + +*Example returns:* + * `{code: 0, message:"ok", data: null}` + * `{code: 1, message:"padID does not exist", data: null}` + +#### movePad(sourceID, destinationID[, force=false]) + * API >= 1.2.8 + +moves a pad. If force is true and the destination pad exists, it will be overwritten. + +*Example returns:* + * `{code: 0, message:"ok", data: null}` + * `{code: 1, message:"padID does not exist", data: null}` + #### getReadOnlyID(padID) * API >= 1 @@ -378,6 +455,15 @@ returns the read only link of a pad * `{code: 0, message:"ok", data: {readOnlyID: "r.s8oes9dhwrvt0zif"}}` * `{code: 1, message:"padID does not exist", data: null}` +#### getPadID(readOnlyID) + * API >= 1.2.10 + +returns the id of a pad which is assigned to the readOnlyID + +*Example returns:* + * `{code: 0, message:"ok", data: {padID: "p.s8oes9dhwrvt0zif"}}` + * `{code: 1, message:"padID does not exist", data: null}` + #### setPublicStatus(padID, publicStatus) * API >= 1 @@ -458,4 +544,4 @@ returns ok when the current api token is valid lists all pads on this epl instance *Example returns:* - * `{code: 0, message:"ok", data: ["testPad", "thePadsOfTheOthers"]}` + * `{code: 0, message:"ok", data: {padIDs: ["testPad", "thePadsOfTheOthers"]}}` diff --git a/doc/api/toolbar.md b/doc/api/toolbar.md new file mode 100644 index 00000000..03a3d8f8 --- /dev/null +++ b/doc/api/toolbar.md @@ -0,0 +1,46 @@ +# Toolbar controller +src/node/utils/toolbar.js + +## button(opts) + * {Object} `opts` + * `command` - this command fill be fired on the editbar on click + * `localizationId` - will be set as `data-l10-id` + * `class` - here you can add additional classes to the button + +Returns: {Button} + +Example: +``` +var orderedlist = toolbar.button({ + command: "insertorderedlist", + localizationId: "pad.toolbar.ol.title", + class: "buttonicon buttonicon-insertorderedlist" +}) +``` + +You can also create buttons with text: + +``` +var myButton = toolbar.button({ + command: "myButton", + localizationId: "myPlugin.toolbar.myButton", + class: "buttontext" +}) +``` + +## selectButton(opts) + * {Object} `opts` + * `id` - id of the menu item + * `selectId` - id of the select element + * `command` - this command fill be fired on the editbar on change + +Returns: {SelectButton} + +## SelectButton.addOption(value, text, attributes) + * {String} value - The value of this option + * {String} text - the label text used for this option + * {Object} attributes - any additional html attributes go here (e.g. `data-l10n-id`) + +## registerButton(name, item) + * {String} name - used to reference the item in the toolbar config in settings.json + * {Button|SelectButton} item - the button to add
\ No newline at end of file diff --git a/doc/assets/style.css b/doc/assets/style.css index fe1343af..09bc9a36 100644 --- a/doc/assets/style.css +++ b/doc/assets/style.css @@ -1,3 +1,7 @@ +html { + border-top: solid green 5pt; +} + body.apidoc { width: 60%; min-width: 10cm; @@ -5,8 +9,7 @@ body.apidoc { } #header { - background-color: #5a5; - padding: 10px; + padding: 1pc 0; color: #111; } diff --git a/doc/custom_static.md b/doc/custom_static.md index f646e3ba..7bb29009 100644 --- a/doc/custom_static.md +++ b/doc/custom_static.md @@ -1,5 +1,5 @@ # Custom static files -Etherpad Lite allows you to include your own static files in the browser, by modifying the files in `static/custom`. +Etherpad allows you to include your own static files in the browser, by modifying the files in `static/custom`. * `index.js` Javascript that'll be run in `/` * `index.css` Stylesheet affecting `/` diff --git a/doc/documentation.md b/doc/documentation.md index 0542c436..2452ec08 100644 --- a/doc/documentation.md +++ b/doc/documentation.md @@ -2,7 +2,7 @@ <!-- type=misc --> -The goal of this documentation is to comprehensively explain Etherpad-Lite, +The goal of this documentation is to comprehensively explain Etherpad, both from a reference as well as a conceptual point of view. Where appropriate, property types, method arguments, and the arguments diff --git a/doc/easysync/README.md b/doc/easysync/README.md index 55148754..326fd81a 100644 --- a/doc/easysync/README.md +++ b/doc/easysync/README.md @@ -1,2 +1,2 @@ # About this folder -We put all documentations we found about the old Etherpad together in this folder. Most of this is still valid for Etherpad Lite
\ No newline at end of file +We put all documentations we found about the original Etherpad together in this folder. Most of this is still valid for the current (node.js based) Etherpad.
\ No newline at end of file diff --git a/doc/easysync/easysync-full-description.tex b/doc/easysync/easysync-full-description.tex index a831da64..5ed9f29e 100644 --- a/doc/easysync/easysync-full-description.tex +++ b/doc/easysync/easysync-full-description.tex @@ -83,7 +83,7 @@ For any two changesets $A$, $B$ such that \begin{itemize} \item[] $A=(n_1\rightarrow n_2)[\cdots]$ -\item[] $A=(n_2\rightarrow n_3)[\cdots]$ +\item[] $B=(n_2\rightarrow n_3)[\cdots]$ \end{itemize} it is clear that there is a third changeset $C=(n_1\rightarrow n_3)[\cdots]$ such that applying $C$ to a document $X$ yeilds the same resulting document as does applying $A$ and then $B$. In this case, we write $AB=C$. @@ -97,14 +97,14 @@ It is impossible to compute $(XA)B$ because $B$ can only be applied to a documen This is where \emph{merging} comes in. Merging takes two changesets that apply to the same initial document (and that cannot be composed), and computes a single new changeset that presevers the intent of both changes. The merge of $A$ and $B$ is written as $m(A,B)$. For the Etherpad system to work, we require that $m(A,B)=m(B,A)$. -Aside from what we have said so far about merging, there aremany different implementations that will lead to a workable system. We have created one implementation for text that has the following constraints. +Aside from what we have said so far about merging, there are many different implementations that will lead to a workable system. We have created one implementation for text that has the following constraints. \section{Follows} \label{follows} When users $A$ and $B$ have the same document $X$ on their screen, and they proceed to make respective changesets $A$ and $B$, it is no use to compute $m(A,B)$, because $m(A,B)$ applies to document $X$, but the users are already looking at document $XA$ and $XB$. What we really want is to compute $B'$ and $A'$ such that $$XAB' = XBA' = Xm(A,B)$$ -``Following'' computes these $B'$ and $A'$ changesets. The definition of the ``follow'' function $f$ is such that $Af(A,B)=Bf(B,A)=m(A,B)=m(B,A)$. When we computer $f(A,B)$. +``Following'' computes these $B'$ and $A'$ changesets. The definition of the ``follow'' function $f$ is such that $Af(A,B)=Bf(B,A)=m(A,B)=m(B,A)$. When we compute $f(A,B)$ \begin{itemize} \item Insertions in $A$ become retained characters in $f(A,B)$ \item Insertions in $B$ become insertions in $f(A,B)$ diff --git a/doc/easysync/easysync-notes.txt b/doc/easysync/easysync-notes.txt index d3b3dc55..72adadd2 100644 --- a/doc/easysync/easysync-notes.txt +++ b/doc/easysync/easysync-notes.txt @@ -79,14 +79,14 @@ Here are descriptions of the operations, where capital letters are variables: kept MUST be a newline, and the final newline of the document is allowed. "*I" : Apply attribute I from the pool to the following +, =, |+, or |= command. In other words, any number of * ops can come before a +, =, or | but not - between a | and the corresponding + or =. + between a | and the corresponding + or =. If +, text is inserted having this attribute. If =, text is kept but with - the attribute applied as an attribute addition or removal. - Consecutive attributes must be sorted lexically by (key,value) with key - and value taken as strings. It's illegal to have duplicate keys - for (key,value) pairs that apply to the same text. It's illegal to - have an empty value for a key in the case of an insertion (+), the - pair should just be omitted. + the attribute applied as an attribute addition or removal. + Consecutive attributes must be sorted lexically by (key,value) with key + and value taken as strings. It's illegal to have duplicate keys + for (key,value) pairs that apply to the same text. It's illegal to + have an empty value for a key in the case of an insertion (+), the + pair should just be omitted. Characters from the source text that aren't accounted for are assumed to be kept with the same attributes. diff --git a/doc/index.md b/doc/index.md index 5d3022be..09553f68 100644 --- a/doc/index.md +++ b/doc/index.md @@ -1,4 +1,5 @@ @include documentation +@include stats @include localization @include custom_static @include api/api diff --git a/doc/localization.md b/doc/localization.md index 182197d9..15c4d59d 100644 --- a/doc/localization.md +++ b/doc/localization.md @@ -1,5 +1,5 @@ # Localization -Etherpad lite provides a multi-language user interface, that's apart from your users' content, so users from different countries can collaborate on a single document, while still having the user interface displayed in their mother tongue. +Etherpad provides a multi-language user interface, that's apart from your users' content, so users from different countries can collaborate on a single document, while still having the user interface displayed in their mother tongue. ## Translating @@ -19,9 +19,9 @@ Translations will be send back to us regularly and will eventually appear in the `/src/locales` contains files for all supported languages which contain the translated strings. Translation files are simple `*.json` files and look like this: ```json -{ "pad.modals.connected": "Connecté." -, "pad.modals.uderdup": "Ouvrir dans une nouvelle fenêtre." -, "pad.toolbar.unindent.title": "Désindenter" +{ "pad.modals.connected": "Connecté." +, "pad.modals.uderdup": "Ouvrir dans une nouvelle fenêtre." +, "pad.toolbar.unindent.title": "Dèsindenter" , "pad.toolbar.undo.title": "Annuler (Ctrl-Z)" , "timeslider.pageTitle": "{{appTitle}} Curseur temporel" , ... @@ -50,7 +50,7 @@ to: <option data-l10n-id="ep_heading.h1" value="0"></option> ``` -In the javascript files of your plugin, chaneg all hardcoded messages/strings... +In the javascript files of your plugin, change all hardcoded messages/strings... from: ```js @@ -75,7 +75,7 @@ alert(window._('pad.chat')); *ep_your-plugin/locales/es.json* ``` -{ "ep_your-plugin.h1": "Título 1" +{ "ep_your-plugin.h1": "TÃtulo 1" } ``` @@ -83,7 +83,7 @@ Everytime the http server is started, it will auto-detect your messages and merg ### Overwrite core messages -You can overwrite Etherpad Lite's core messages in your plugin's locale files. +You can overwrite Etherpad's core messages in your plugin's locale files. For example, if you want to replace `Chat` with `Notes`, simply add... *ep_your-plugin/locales/en.json* @@ -91,4 +91,4 @@ For example, if you want to replace `Chat` with `Notes`, simply add... { "ep_your-plugin.h1": "Heading 1" , "pad.chat": "Notes" } -```
\ No newline at end of file +``` diff --git a/doc/plugins.md b/doc/plugins.md index 0e0dee00..76c409b1 100644 --- a/doc/plugins.md +++ b/doc/plugins.md @@ -1,5 +1,5 @@ # Plugins -Etherpad-Lite allows you to extend its functionality with plugins. A plugin registers hooks (functions) for certain events (thus certain features) in Etherpad-lite to execute its own functionality based on these events. +Etherpad allows you to extend its functionality with plugins. A plugin registers hooks (functions) for certain events (thus certain features) in Etherpad-lite to execute its own functionality based on these events. Publicly available plugins can be found in the npm registry (see <http://npmjs.org>). Etherpad-lite's naming convention for plugins is to prefix your plugins with `ep_`. So, e.g. it's `ep_flubberworms`. Thus you can install plugins from npm, using `npm install ep_flubberworm` in etherpad-lite's root directory. @@ -104,7 +104,7 @@ Your plugin must also contain a [package definition file](http://npmjs.org/doc/j ``` ## Templates -If your plugin adds or modifies the front end HTML (e.g. adding buttons or changing their functions), you should put the necessary HTML code for such operations in `templates/`, in files of type ".ejs", since Etherpad-Lite uses EJS for HTML templating. See the following link for more information about EJS: <https://github.com/visionmedia/ejs>. +If your plugin adds or modifies the front end HTML (e.g. adding buttons or changing their functions), you should put the necessary HTML code for such operations in `templates/`, in files of type ".ejs", since Etherpad uses EJS for HTML templating. See the following link for more information about EJS: <https://github.com/visionmedia/ejs>. ## Writing and running front-end tests for your plugin diff --git a/doc/stats.md b/doc/stats.md new file mode 100644 index 00000000..7da69547 --- /dev/null +++ b/doc/stats.md @@ -0,0 +1,18 @@ +# Statistics +Etherpad keeps track of the goings-on inside the edit machinery. If you'd like to have a look at this, just point your browser to `/stats`. + +We currently measure: + + - totalUsers (counter) + - connects (meter) + - disconnects (meter) + - pendingEdits (counter) + - edits (timer) + - failedChangesets (meter) + - httpRequests (timer) + - http500 (meter) + - memoryUsage (gauge) + +Under the hood, we are happy to rely on [measured](https://github.com/felixge/node-measured) for all our metrics needs. + +To modify or simply access our stats in your plugin, simply `require('ep_etherpad-lite/stats')` which is a `measured.Collection`.
\ No newline at end of file diff --git a/doc/template.html b/doc/template.html index b91f3c16..26706327 100644 --- a/doc/template.html +++ b/doc/template.html @@ -2,12 +2,12 @@ <html lang="en"> <head> <meta charset="utf-8"> - <title>__SECTION__ - Etherpad Lite v__VERSION__ Manual & Documentation</title> + <title>__SECTION__ - Etherpad v__VERSION__ Manual & Documentation</title> <link rel="stylesheet" href="assets/style.css"> </head> <body class="apidoc" id="api-section-__FILENAME__"> <header id="header"> - <h1>Etherpad-Lite v__VERSION__ Manual & Documentation</h1> + <h1>Etherpad v__VERSION__ Manual & Documentation</h1> </header> <div id="toc"> diff --git a/settings.json.template b/settings.json.template index ec0e6f83..38e82679 100644 --- a/settings.json.template +++ b/settings.json.template @@ -78,7 +78,13 @@ /* Require authorization by a module, or a user with is_admin set, see below. */ "requireAuthorization": false, - + + /*when you use NginX or another proxy/ load-balancer set this to true*/ + "trustProxy": false, + + /* Privacy: disable IP logging */ + "disableIPlogging": false, + /* Users for basic authentication. is_admin = true gives access to /admin. If you do not uncomment this, /admin will not be available! */ /* @@ -97,6 +103,25 @@ // restrict socket.io transport methods "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"], + /* The toolbar buttons configuration. + "toolbar": { + "left": [ + ["bold", "italic", "underline", "strikethrough"], + ["orderedlist", "unorderedlist", "indent", "outdent"], + ["undo", "redo"], + ["clearauthorship"] + ], + "right": [ + ["importexport", "timeslider", "savedrevision"], + ["settings", "embed"], + ["showusers"] + ], + "timeslider": [ + ["timeslider_export", "timeslider_returnToPad"] + ] + }, + */ + /* The log level we are using, can be: DEBUG, INFO, WARN, ERROR */ "loglevel": "INFO", @@ -104,40 +129,41 @@ // https://github.com/nomiddlename/log4js-node // You can add as many appenders as you want here: "logconfig" : - { "appenders": [ - { "type": "console" - //, "category": "access"// only logs pad access - } + { "appenders": [ + { "type": "console" + //, "category": "access"// only logs pad access + } /* - , { "type": "file" + , { "type": "file" , "filename": "your-log-file-here.log" , "maxLogSize": 1024 , "backups": 3 // how many log files there're gonna be at max //, "category": "test" // only log a specific category - }*/ + }*/ /* - , { "type": "logLevelFilter" - , "level": "warn" // filters out all log messages that have a lower level than "error" - , "appender": - { Use whatever appender you want here } - }*/ + , { "type": "logLevelFilter" + , "level": "warn" // filters out all log messages that have a lower level than "error" + , "appender": + { Use whatever appender you want here } + }*/ /* - , { "type": "logLevelFilter" - , "level": "error" // filters out all log messages that have a lower level than "error" - , "appender": - { "type": "smtp" - , "subject": "An error occured in your EPL instance!" - , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" - , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message - , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods - "host": "smtp.example.com", "port": 465, - "secureConnection": true, - "auth": { - "user": "foo@example.com", - "pass": "bar_foo" + , { "type": "logLevelFilter" + , "level": "error" // filters out all log messages that have a lower level than "error" + , "appender": + { "type": "smtp" + , "subject": "An error occured in your EPL instance!" + , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" + , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message + , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods + "host": "smtp.example.com", "port": 465, + "secureConnection": true, + "auth": { + "user": "foo@example.com", + "pass": "bar_foo" + } } - } - } - }*/ - ] } + } + }*/ + ] + } } diff --git a/src/locales/af.json b/src/locales/af.json index 979a823d..9bf302e0 100644 --- a/src/locales/af.json +++ b/src/locales/af.json @@ -5,7 +5,7 @@ ] }, "index.newPad": "Nuwe pad", - "index.createOpenPad": "of skep\/open 'n pad met die naam:", + "index.createOpenPad": "of skep/open 'n pad met die naam:", "pad.toolbar.bold.title": "Vet (Ctrl-B)", "pad.toolbar.italic.title": "Kursief (Ctrl-I)", "pad.toolbar.underline.title": "Onderstreep (Ctrl-U)", @@ -28,7 +28,6 @@ "pad.importExport.exportdokuwiki": "DokuWiki", "pad.modals.userdup.advice": "Maak weer 'n verbinding as u die venster wil gebruik.", "pad.modals.unauth": "Nie toegestaan", - "pad.modals.looping": "Verbinding verbreek.", "pad.modals.deleted": "Geskrap.", "pad.share": "Deel die pad", "pad.share.readonly": "Lees-alleen", @@ -63,4 +62,4 @@ "pad.impexp.importbutton": "Voer nou in", "pad.impexp.importing": "Besig met invoer...", "pad.impexp.importfailed": "Invoer het gefaal" -}
\ No newline at end of file +} diff --git a/src/locales/ar.json b/src/locales/ar.json index be0e7457..6e5d14bd 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -5,73 +5,101 @@ "Tux-tn" ] }, - "pad.toolbar.bold.title": "\u0633\u0645\u064a\u0643 (Ctrl-B)", - "pad.toolbar.italic.title": "\u0645\u0627\u0626\u0644 (Ctrl-I)", - "pad.toolbar.underline.title": "\u062a\u0633\u0637\u064a\u0631 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0634\u0637\u0628", - "pad.toolbar.ol.title": "\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u062a\u0628\u0629", - "pad.toolbar.ul.title": "\u0642\u0627\u0626\u0645\u0629 \u063a\u064a\u0631 \u0645\u0631\u062a\u0628\u0629", - "pad.toolbar.indent.title": "\u0625\u0632\u0627\u062d\u0629", - "pad.toolbar.unindent.title": "\u062d\u0630\u0641 \u0627\u0644\u0625\u0632\u0627\u062d\u0629", - "pad.toolbar.undo.title": "\u0641\u0643 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u062a\u0643\u0631\u0627\u0631 (Ctrl-Y)", - "pad.toolbar.import_export.title": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f\/\u062a\u0635\u062f\u064a\u0631 \u0645\u0646\/\u0625\u0644\u0649 \u062a\u0646\u0633\u064a\u0642\u0627\u062a \u0645\u0644\u0641\u0627\u062a \u0645\u062e\u062a\u0644\u0641\u0629", - "pad.toolbar.timeslider.title": "\u0645\u062a\u0635\u0641\u062d \u0627\u0644\u062a\u0627\u0631\u064a\u062e", - "pad.toolbar.savedRevision.title": "\u0627\u0644\u062a\u0646\u0642\u064a\u062d\u0627\u062a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629", - "pad.toolbar.settings.title": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a", - "pad.colorpicker.save": "\u062a\u0633\u062c\u064a\u0644", - "pad.colorpicker.cancel": "\u0625\u0644\u063a\u0627\u0621", - "pad.loading": "\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...", - "pad.settings.stickychat": "\u0627\u0644\u062f\u0631\u062f\u0634\u0629 \u062f\u0627\u0626\u0645\u0627 \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629", - "pad.settings.linenocheck": "\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0623\u0633\u0637\u0631", - "pad.settings.fontType": "\u0646\u0648\u0639 \u0627\u0644\u062e\u0637:", - "pad.settings.fontType.normal": "\u0639\u0627\u062f\u064a", - "pad.settings.fontType.monospaced": "\u062b\u0627\u0628\u062a \u0627\u0644\u0639\u0631\u0636", - "pad.settings.language": "\u0627\u0644\u0644\u063a\u0629:", - "pad.importExport.import_export": "\u0627\u0633\u062a\u064a\u0631\u0627\u062f\/\u062a\u0635\u062f\u064a\u0631", - "pad.importExport.import": "\u062a\u062d\u0645\u064a\u0644 \u0623\u064a \u0645\u0644\u0641 \u0646\u0635\u064a \u0623\u0648 \u0648\u062b\u064a\u0642\u0629", - "pad.importExport.importSuccessful": "\u0646\u0627\u062c\u062d!", - "pad.importExport.exporthtml": "\u0625\u062a\u0634 \u062a\u064a \u0625\u0645 \u0625\u0644", - "pad.importExport.exportplain": "\u0646\u0635 \u0639\u0627\u062f\u064a", - "pad.importExport.exportword": "\u0645\u0627\u064a\u0643\u0631\u0648\u0633\u0648\u0641\u062a \u0648\u0648\u0631\u062f", - "pad.importExport.exportpdf": "\u0635\u064a\u063a\u0629 \u0627\u0644\u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0627\u0644\u0645\u062d\u0645\u0648\u0644\u0629", - "pad.importExport.exportopen": "ODF (\u0646\u0633\u0642 \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u0645\u0641\u062a\u0648\u062d)", - "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648\u0648\u064a\u0643\u064a", - "pad.modals.connected": "\u0645\u062a\u0635\u0644.", - "pad.modals.forcereconnect": "\u0641\u0631\u0636 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644", - "pad.modals.unauth": "\u063a\u064a\u0631 \u0645\u062e\u0648\u0644", - "pad.modals.looping": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", - "pad.modals.initsocketfail": "\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645", - "pad.modals.initsocketfail.explanation": "\u062a\u0639\u0630\u0631 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u062e\u0627\u062f\u0645 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629.", - "pad.modals.slowcommit": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644.", - "pad.modals.slowcommit.explanation": "\u0627\u0644\u062e\u0627\u062f\u0645 \u0644\u0627 \u064a\u0633\u062a\u062c\u064a\u0628.", - "pad.modals.slowcommit.cause": "\u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0647\u0630\u0627 \u0628\u0633\u0628\u0628 \u0645\u0634\u0627\u0643\u0644 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u0634\u0628\u0643\u0629.", - "pad.modals.deleted": "\u0645\u062d\u0630\u0648\u0641.", - "pad.modals.disconnected": "\u0644\u0645 \u062a\u0639\u062f \u0645\u062a\u0651\u0635\u0644.", - "pad.modals.disconnected.explanation": "\u062a\u0645 \u0641\u0642\u062f\u0627\u0646 \u0627\u0644\u0625\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645", - "pad.modals.disconnected.cause": "\u0642\u062f \u064a\u0643\u0648\u0646 \u0627\u0644\u062e\u0627\u062f\u0645 \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0639\u0644\u0627\u0645\u0646\u0627 \u0625\u0630\u0627 \u062a\u0643\u0631\u0631 \u0647\u0630\u0627.", - "pad.share.readonly": "\u0644\u0644\u0642\u0631\u0627\u0621\u0629 \u0641\u0642\u0637", - "pad.share.link": "\u0631\u0627\u0628\u0637", - "pad.chat": "\u062f\u0631\u062f\u0634\u0629", - "timeslider.toolbar.authors": "\u0627\u0644\u0645\u0624\u0644\u0641\u0648\u0646:", - "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0645\u0624\u0644\u0641\u064a\u0646", - "timeslider.exportCurrent": "\u062a\u0635\u062f\u064a\u0631 \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0643:", - "timeslider.version": "\u0625\u0635\u062f\u0627\u0631 {{version}}", - "timeslider.month.january": "\u064a\u0646\u0627\u064a\u0631", - "timeslider.month.february": "\u0641\u0628\u0631\u0627\u064a\u0631", - "timeslider.month.march": "\u0645\u0627\u0631\u0633", - "timeslider.month.april": "\u0623\u0628\u0631\u064a\u0644", - "timeslider.month.may": "\u0645\u0627\u064a\u0648", - "timeslider.month.june": "\u064a\u0648\u0646\u064a\u0648", - "timeslider.month.july": "\u064a\u0648\u0644\u064a\u0648", - "timeslider.month.august": "\u0623\u063a\u0633\u0637\u0633", - "timeslider.month.september": "\u0633\u0628\u062a\u0645\u0628\u0631", - "timeslider.month.october": "\u0623\u0643\u062a\u0648\u0628\u0631", - "timeslider.month.november": "\u0646\u0648\u0641\u0645\u0628\u0631", - "timeslider.month.december": "\u062f\u064a\u0633\u0645\u0628\u0631", - "pad.userlist.entername": "\u0625\u062f\u062e\u0644 \u0627\u0633\u0645\u0643", - "pad.userlist.unnamed": "\u063a\u064a\u0631 \u0645\u0633\u0645\u0649", - "pad.userlist.guest": "\u0636\u064a\u0641", - "pad.userlist.deny": "\u0631\u0641\u0636", - "pad.userlist.approve": "\u0645\u0648\u0627\u0641\u0642\u0629" -}
\ No newline at end of file + "index.newPad": "باد جديد", + "index.createOpenPad": "أو صنع/ÙØªØ Ø¨Ø§Ø¯ بوضع إسمه:", + "pad.toolbar.bold.title": "سميك (Ctrl-B)", + "pad.toolbar.italic.title": "مائل (Ctrl-I)", + "pad.toolbar.underline.title": "تسطير (Ctrl-U)", + "pad.toolbar.strikethrough.title": "شطب", + "pad.toolbar.ol.title": "قائمة مرتبة", + "pad.toolbar.ul.title": "قائمة غير مرتبة", + "pad.toolbar.indent.title": "إزاØØ©", + "pad.toolbar.unindent.title": "Øذ٠الإزاØØ©", + "pad.toolbar.undo.title": "ÙÙƒ (Ctrl-Z)", + "pad.toolbar.redo.title": "تكرار (Ctrl-Y)", + "pad.toolbar.import_export.title": "استيراد/تصدير من/إلى تنسيقات ملÙات مختلÙØ©", + "pad.toolbar.timeslider.title": "متصÙØ Ø§Ù„ØªØ§Ø±ÙŠØ®", + "pad.toolbar.savedRevision.title": "ØÙظ المراجعة", + "pad.toolbar.settings.title": "الإعدادات", + "pad.toolbar.embed.title": "تبادل Ùˆ تضمين هذا الباد", + "pad.toolbar.showusers.title": "عرض المستخدمين على هذا الباد", + "pad.colorpicker.save": "تسجيل", + "pad.colorpicker.cancel": "إلغاء", + "pad.loading": "جاري التØميل...", + "pad.passwordRequired": "تØتاج إلى كلمة مرور للوصول إلى هذا الباد", + "pad.permissionDenied": "ليس لديك إذن لدخول هذا الباد", + "pad.wrongPassword": "كانت كلمة المرور خاطئة", + "pad.settings.padSettings": "إعدادات الباد", + "pad.settings.myView": "رؤيتي", + "pad.settings.stickychat": "الدردشة دائما على الشاشة", + "pad.settings.colorcheck": "ألوان التأليÙ", + "pad.settings.linenocheck": "أرقام الأسطر", + "pad.settings.rtlcheck": "قراءة المØتويات من اليمين إلى اليسار؟", + "pad.settings.fontType": "نوع الخط:", + "pad.settings.fontType.normal": "عادي", + "pad.settings.fontType.monospaced": "ثابت العرض", + "pad.settings.globalView": "الرؤية الشاملة", + "pad.settings.language": "اللغة:", + "pad.importExport.import_export": "استيراد/تصدير", + "pad.importExport.import": "تØميل أي مل٠نصي أو وثيقة", + "pad.importExport.importSuccessful": "ناجØ!", + "pad.importExport.export": "تصدير الباد الØالي بصÙØ©:", + "pad.importExport.exporthtml": "إتش تي إم إل", + "pad.importExport.exportplain": "نص عادي", + "pad.importExport.exportword": "مايكروسوÙت وورد", + "pad.importExport.exportpdf": "صيغة المستندات المØمولة", + "pad.importExport.exportopen": "ODF (نسق المستند المÙتوØ)", + "pad.importExport.exportdokuwiki": "دوکوويكي", + "pad.modals.connected": "متصل.", + "pad.modals.reconnecting": "إعادة الاتصال ببادك", + "pad.modals.forcereconnect": "Ùرض إعادة الاتصال", + "pad.modals.userdup": "Ù…ÙØªÙˆØ ÙÙŠ ناÙذة أخرى", + "pad.modals.userdup.explanation": "يبدو أن هذا الباد تم ÙتØÙ‡ ÙÙŠ أكثر من ناÙذة متصÙØ ÙÙŠ هذا الØاسوب.", + "pad.modals.userdup.advice": "إعادة الاتصال لإستعمال هذه الناÙذة بدلاً من الاخرى.", + "pad.modals.unauth": "غير مخول", + "pad.modals.initsocketfail": "لا يمكن الوصول إلى الخادم", + "pad.modals.initsocketfail.explanation": "تعذر الاتصال بخادم المزامنة.", + "pad.modals.slowcommit.explanation": "الخادم لا يستجيب.", + "pad.modals.slowcommit.cause": "يمكن أن يكون هذا بسبب مشاكل ÙÙŠ الاتصال بالشبكة.", + "pad.modals.deleted": "Ù…ØذوÙ.", + "pad.modals.deleted.explanation": "تمت إزالة هذا الباد", + "pad.modals.disconnected": "لم تعد متّصل.", + "pad.modals.disconnected.explanation": "تم Ùقدان الإتصال بالخادم", + "pad.modals.disconnected.cause": "قد يكون الخادم غير متوÙر. الرجاء إعلامنا إذا تكرر هذا.", + "pad.share.readonly": "للقراءة Ùقط", + "pad.share.link": "رابط", + "pad.share.emebdcode": "URL للتضمين", + "pad.chat": "دردشة", + "pad.chat.title": "ÙØªØ Ø§Ù„Ø¯Ø±Ø¯Ø´Ø© لهذا الباد", + "pad.chat.loadmessages": "تØميل المزيد من الرسائل", + "timeslider.toolbar.returnbutton": "العودة إلى الباد", + "timeslider.toolbar.authors": "المؤلÙون:", + "timeslider.toolbar.authorsList": "بدون مؤلÙين", + "timeslider.toolbar.exportlink.title": "تصدير", + "timeslider.exportCurrent": "تصدير النسخة الØالية Ùƒ:", + "timeslider.version": "إصدار {{version}}", + "timeslider.saved": "Ù…ØÙوظ {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "يناير", + "timeslider.month.february": "Ùبراير", + "timeslider.month.march": "مارس", + "timeslider.month.april": "أبريل", + "timeslider.month.may": "مايو", + "timeslider.month.june": "يونيو", + "timeslider.month.july": "يوليو", + "timeslider.month.august": "أغسطس", + "timeslider.month.september": "سبتمبر", + "timeslider.month.october": "أكتوبر", + "timeslider.month.november": "نوÙمبر", + "timeslider.month.december": "ديسمبر", + "pad.userlist.entername": "إدخل اسمك", + "pad.userlist.unnamed": "غير مسمى", + "pad.userlist.guest": "ضيÙ", + "pad.userlist.deny": "رÙض", + "pad.userlist.approve": "مواÙقة", + "pad.impexp.importbutton": "الاستيراد الآن", + "pad.impexp.importing": "الاستيراد...", + "pad.impexp.uploadFailed": "Ùشل التØميل، الرجاء المØاولة مرة أخرى", + "pad.impexp.importfailed": "Ùشل الاستيراد", + "pad.impexp.copypaste": "الرجاء نسخ/لصق" +} diff --git a/src/locales/ast.json b/src/locales/ast.json index 7beb706a..45ee9391 100644 --- a/src/locales/ast.json +++ b/src/locales/ast.json @@ -1,47 +1,48 @@ { "@metadata": { - "authors": { - "1": "Xuacu" - } + "authors": [ + "Xuacu" + ] }, "index.newPad": "Nuevu bloc", - "index.createOpenPad": "o crear\/abrir un bloc col nome:", + "index.createOpenPad": "o crear/abrir un bloc col nome:", "pad.toolbar.bold.title": "Negrina (Ctrl-B)", "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Sorray\u00e1u (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Tach\u00e1u", + "pad.toolbar.underline.title": "Sorrayáu (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Tacháu", "pad.toolbar.ol.title": "Llista ordenada", "pad.toolbar.ul.title": "Llista ensin ordenar", - "pad.toolbar.indent.title": "Sangr\u00eda", - "pad.toolbar.unindent.title": "Sangr\u00eda inversa", + "pad.toolbar.indent.title": "SangrÃa (TAB)", + "pad.toolbar.unindent.title": "SangrÃa inversa (Mayúsc+TAB)", "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autor\u00eda", - "pad.toolbar.import_export.title": "Importar\/Esportar ente distintos formatos de ficheru", + "pad.toolbar.clearAuthorship.title": "Llimpiar los colores d'autorÃa", + "pad.toolbar.import_export.title": "Importar/Esportar ente distintos formatos de ficheru", "pad.toolbar.timeslider.title": "Eslizador de tiempu", - "pad.toolbar.savedRevision.title": "Revisiones guardaes", - "pad.toolbar.settings.title": "Configuraci\u00f3n", - "pad.toolbar.embed.title": "Incrustar esti bloc", + "pad.toolbar.savedRevision.title": "Guardar revisión", + "pad.toolbar.settings.title": "Configuración", + "pad.toolbar.embed.title": "Compartir ya incrustar esti bloc", "pad.toolbar.showusers.title": "Amosar los usuarios d'esti bloc", "pad.colorpicker.save": "Guardar", "pad.colorpicker.cancel": "Encaboxar", "pad.loading": "Cargando...", - "pad.passwordRequired": "Necesites una contrase\u00f1a pa entrar a esti bloc", + "pad.passwordRequired": "Necesites una contraseña pa entrar a esti bloc", "pad.permissionDenied": "Nun tienes permisu pa entrar a esti bloc", - "pad.wrongPassword": "La contrase\u00f1a era incorreuta", - "pad.settings.padSettings": "Configuraci\u00f3n del bloc", + "pad.wrongPassword": "La contraseña era incorreuta", + "pad.settings.padSettings": "Configuración del bloc", "pad.settings.myView": "la mio vista", "pad.settings.stickychat": "Alderique en pantalla siempres", - "pad.settings.colorcheck": "Colores d'autor\u00eda", - "pad.settings.linenocheck": "N\u00famberos de llinia", - "pad.settings.fontType": "Tipograf\u00eda:", + "pad.settings.colorcheck": "Colores d'autorÃa", + "pad.settings.linenocheck": "Númberos de llinia", + "pad.settings.rtlcheck": "¿Lleer el contenÃu de drecha a izquierda?", + "pad.settings.fontType": "TipografÃa:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monoespaciada", "pad.settings.globalView": "Vista global", "pad.settings.language": "Llingua:", - "pad.importExport.import_export": "Importar\/Esportar", + "pad.importExport.import_export": "Importar/Esportar", "pad.importExport.import": "Xubir cualquier ficheru o documentu de testu", - "pad.importExport.importSuccessful": "\u00a1Correuto!", + "pad.importExport.importSuccessful": "¡Correuto!", "pad.importExport.export": "Esportar el bloc actual como:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Testu simple", @@ -49,45 +50,47 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "S\u00f3lo se pue importar dende los formatos de testu planu o html. Pa carauter\u00edstiques d'importaci\u00f3n m\u00e1s avanzaes <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instala abiword<\/a>.", - "pad.modals.connected": "Coneut\u00e1u.", + "pad.importExport.abiword.innerHTML": "Sólo se pue importar dende los formatos de testu planu o html. Pa carauterÃstiques d'importación más avanzaes <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instala abiword</a>.", + "pad.modals.connected": "Coneutáu.", "pad.modals.reconnecting": "Reconeutando col to bloc...", - "pad.modals.forcereconnect": "Forzar la reconex\u00f3n", + "pad.modals.forcereconnect": "Forzar la reconexón", "pad.modals.userdup": "Abiertu n'otra ventana", - "pad.modals.userdup.explanation": "Esti bloc paez que ta abiertu en m\u00e1s d'una ventana del navegador d'esti ordenador.", + "pad.modals.userdup.explanation": "Esti bloc paez que ta abiertu en más d'una ventana del navegador d'esti ordenador.", "pad.modals.userdup.advice": "Reconeutar pa usar esta ventana.", - "pad.modals.unauth": "Non autoriz\u00e1u.", - "pad.modals.unauth.explanation": "Los tos permisos camudaron mientres vies esta p\u00e1xina. Intenta volver a coneutar.", - "pad.modals.looping": "Desconeut\u00e1u.", - "pad.modals.looping.explanation": "Hai problemes de comunicaci\u00f3n col sirvidor de sincronizaci\u00f3n.", - "pad.modals.looping.cause": "Pues tar coneut\u00e1u per un torgafueos o un proxy incompatibles.", + "pad.modals.unauth": "Non autorizáu", + "pad.modals.unauth.explanation": "Los tos permisos camudaron mientres vies esta páxina. Intenta volver a coneutar.", + "pad.modals.looping.explanation": "Hai problemes de comunicación col sirvidor de sincronización.", + "pad.modals.looping.cause": "Pues tar coneutáu per un torgafueos o un proxy incompatibles.", "pad.modals.initsocketfail": "Sirvidor incalcanzable.", - "pad.modals.initsocketfail.explanation": "Nun se pudo coneutar col sirvidor de sincronizaci\u00f3n.", - "pad.modals.initsocketfail.cause": "Probablemente ye por aciu d'un problema col navegador o cola to conex\u00f3n a internet.", - "pad.modals.slowcommit": "Desconeut\u00e1u.", + "pad.modals.initsocketfail.explanation": "Nun se pudo coneutar col sirvidor de sincronización.", + "pad.modals.initsocketfail.cause": "Probablemente ye por aciu d'un problema col navegador o cola to conexón a internet.", "pad.modals.slowcommit.explanation": "El sirvidor nun respuende.", - "pad.modals.slowcommit.cause": "Pue ser por problemes de coneutivid\u00e1 de la rede.", - "pad.modals.deleted": "Desanici\u00e1u", - "pad.modals.deleted.explanation": "Esti bloc se desanici\u00f3.", + "pad.modals.slowcommit.cause": "Pue ser por problemes de coneutividá de la rede.", + "pad.modals.badChangeset.explanation": "El sirvidor de sincronización clasificó como illegal una edición que fizo.", + "pad.modals.badChangeset.cause": "Esto podrÃa dase por una mala configuración del sirvidor o por algún otru comportamientu inesperáu. ComunÃquese col alministrador del serviciu si cree qu'esto ye un error. Intente volver a coneutar pa siguir editando.", + "pad.modals.corruptPad.explanation": "El bloc al qu'intenta entrar ta corrompÃu.", + "pad.modals.corruptPad.cause": "Esto pue ser por una mala configuración del sirvidor o por algún otru comportamientu inesperáu. ComunÃquese col alministrador del serviciu.", + "pad.modals.deleted": "Desaniciáu", + "pad.modals.deleted.explanation": "Esti bloc se desanició.", "pad.modals.disconnected": "Te desconeutasti.", - "pad.modals.disconnected.explanation": "Perdi\u00f3se la conex\u00f3n col sirvidor", - "pad.modals.disconnected.cause": "El sirvidor podr\u00eda nun tar disponible. Por favor, avisanos si sigue pasando esto.", + "pad.modals.disconnected.explanation": "Perdióse la conexón col sirvidor", + "pad.modals.disconnected.cause": "El sirvidor podrÃa nun tar disponible. Por favor, avise al alministrador del serviciu si sigue pasando esto.", "pad.share": "Compartir esti bloc", - "pad.share.readonly": "S\u00f3lo llectura", + "pad.share.readonly": "Sólo llectura", "pad.share.link": "Enllaz", "pad.share.emebdcode": "Incrustar URL", "pad.chat": "Chat", "pad.chat.title": "Abrir el chat d'esti bloc.", - "pad.chat.loadmessages": "Cargar m\u00e1s mensaxes", + "pad.chat.loadmessages": "Cargar más mensaxes", "timeslider.pageTitle": "Eslizador de tiempu de {{appTitle}}", "timeslider.toolbar.returnbutton": "Tornar al bloc", "timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authorsList": "Nun hai autores", "timeslider.toolbar.exportlink.title": "Esportar", - "timeslider.exportCurrent": "Esportar la versi\u00f3n actual como:", - "timeslider.version": "Versi\u00f3n {{version}}", - "timeslider.saved": "Guard\u00e1u el {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.exportCurrent": "Esportar la versión actual como:", + "timeslider.version": "Versión {{version}}", + "timeslider.saved": "Guardáu el {{day}} de {{month}} de {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "de xineru", "timeslider.month.february": "de febreru", "timeslider.month.march": "de marzu", @@ -100,21 +103,20 @@ "timeslider.month.october": "d'ochobre", "timeslider.month.november": "de payares", "timeslider.month.december": "d'avientu", - "timeslider.unnamedauthor": "{{num}} autor an\u00f3nimu", - "timeslider.unnamedauthors": "{{num}} autores an\u00f3nimos", - "pad.savedrevs.marked": "Esta revisi\u00f3n marcose como revisi\u00f3n guardada", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anónimu, other: autores anónimos]}", + "pad.savedrevs.marked": "Esta revisión marcose como revisión guardada", "pad.userlist.entername": "Escribi'l to nome", "pad.userlist.unnamed": "ensin nome", - "pad.userlist.guest": "Invit\u00e1u", + "pad.userlist.guest": "Invitáu", "pad.userlist.deny": "Refugar", "pad.userlist.approve": "Aprobar", - "pad.editbar.clearcolors": "\u00bfLlimpiar los colores d'autor\u00eda nel documentu ensembre?", + "pad.editbar.clearcolors": "¿Llimpiar los colores d'autorÃa nel documentu ensembre?", "pad.impexp.importbutton": "Importar agora", "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "La importaci\u00f3n d'un ficheru sustituir\u00e1'l testu actual del bloc. \u00bfSeguro que quies siguir?", + "pad.impexp.confirmimport": "La importación d'un ficheru sustituirá'l testu actual del bloc. ¿Seguro que quies siguir?", "pad.impexp.convertFailed": "Nun pudimos importar esti ficheru. Por favor,usa otru formatu de ficheru diferente o copia y pega manualmente.", - "pad.impexp.uploadFailed": "Fall\u00f3 la carga del ficheru, intentalo otra vuelta", - "pad.impexp.importfailed": "Fall\u00f3 la importaci\u00f3n", + "pad.impexp.uploadFailed": "Falló la carga del ficheru, intentalo otra vuelta", + "pad.impexp.importfailed": "Falló la importación", "pad.impexp.copypaste": "Por favor, copia y apega", - "pad.impexp.exportdisabled": "La esportaci\u00f3n en formatu {{type}} ta desactivada. Por favor, comunica col alministrador del sistema pa m\u00e1s detalles." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "La esportación en formatu {{type}} ta desactivada. Por favor, comunica col alministrador del sistema pa más detalles." +} diff --git a/src/locales/az.json b/src/locales/az.json index 95c65798..f4504323 100644 --- a/src/locales/az.json +++ b/src/locales/az.json @@ -2,120 +2,123 @@ "@metadata": { "authors": [ "AZISS", - "Khan27" + "Khan27", + "Mushviq Abdulla" ] }, "index.newPad": "Yeni Pad", - "index.createOpenPad": "v\u0259 ya Pad-\u0131 ad\u0131 il\u0259 yarat\/a\u00e7:", - "pad.toolbar.bold.title": "Qal\u0131n (Ctrl-B)", + "index.createOpenPad": "vÉ™ ya Pad-ı adı ilÉ™ yarat/aç:", + "pad.toolbar.bold.title": "Qalın (Ctrl-B)", "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", - "pad.toolbar.underline.title": "Alt\u0131ndan x\u0259tt \u00e7\u0259km\u0259 (Ctrl-U)", + "pad.toolbar.underline.title": "Altından xÉ™tt çəkmÉ™ (Ctrl-U)", "pad.toolbar.strikethrough.title": "Pozulma", - "pad.toolbar.ol.title": "Qaydaya sal\u0131nm\u0131\u015f siyah\u0131", - "pad.toolbar.ul.title": "Qaydaya sal\u0131nmam\u0131\u015f siyah\u0131", + "pad.toolbar.ol.title": "Qaydaya salınmış siyahı", + "pad.toolbar.ul.title": "Qaydaya salınmamış siyahı", "pad.toolbar.indent.title": "Abzas", - "pad.toolbar.unindent.title": "\u00c7\u0131x\u0131nt\u0131", + "pad.toolbar.unindent.title": "Çıxıntı", "pad.toolbar.undo.title": "Geri Al (Ctrl-Z)", "pad.toolbar.redo.title": "Qaytarmaq (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "M\u00fc\u0259lliflik R\u0259ngl\u0259rini T\u0259mizl\u0259", - "pad.toolbar.import_export.title": "M\u00fcxt\u0259lif fayl formatlar\u0131n(a\/dan) idxal\/ixrac", - "pad.toolbar.timeslider.title": "Vaxt c\u0259dv\u0259li", - "pad.toolbar.savedRevision.title": "Saxlan\u0131lan D\u00fcz\u0259li\u015fl\u0259r", - "pad.toolbar.settings.title": "T\u0259nziml\u0259m\u0259l\u0259r", - "pad.toolbar.embed.title": "Bu pad-\u0131 yay\u0131mla", - "pad.toolbar.showusers.title": "Pad-da istifad\u0259\u00e7il\u0259ri g\u00f6st\u0259r", + "pad.toolbar.clearAuthorship.title": "Müəlliflik RÉ™nglÉ™rini TÉ™mizlÉ™", + "pad.toolbar.import_export.title": "MüxtÉ™lif fayl formatların(a/dan) idxal/ixrac", + "pad.toolbar.timeslider.title": "Vaxt cÉ™dvÉ™li", + "pad.toolbar.savedRevision.title": "Saxlanılan DüzÉ™liÅŸlÉ™r", + "pad.toolbar.settings.title": "TÉ™nzimlÉ™mÉ™lÉ™r", + "pad.toolbar.embed.title": "Bu pad-ı yayımla", + "pad.toolbar.showusers.title": "Pad-da istifadəçilÉ™ri göstÉ™r", "pad.colorpicker.save": "Saxla", - "pad.colorpicker.cancel": "\u0130mtina", - "pad.loading": "Y\u00fckl\u0259nir...", - "pad.passwordRequired": "Bu pad-a daxil olmaq \u00fc\u00e7\u00fcn parol laz\u0131md\u0131r", - "pad.permissionDenied": "Bu pad-a daxil olmaq \u00fc\u00e7\u00fcn icaz\u0259niz yoxdur", - "pad.wrongPassword": "Sizin parolunuz s\u0259hvdir", - "pad.settings.padSettings": "Pad T\u0259nziml\u0259m\u0259l\u0259ri", - "pad.settings.myView": "M\u0259nim G\u00f6r\u00fcnt\u00fcm", - "pad.settings.stickychat": "S\u00f6hb\u0259t h\u0259mi\u015f\u0259 ekranda", - "pad.settings.colorcheck": "M\u00fc\u0259lliflik r\u0259ngl\u0259ri", - "pad.settings.linenocheck": "S\u0259tir n\u00f6mr\u0259l\u0259ri", - "pad.settings.fontType": "\u015eriftin tipi:", + "pad.colorpicker.cancel": "Ä°mtina", + "pad.loading": "YüklÉ™nir...", + "pad.passwordRequired": "Bu pad-a daxil olmaq üçün parol lazımdır", + "pad.permissionDenied": "Bu pad-a daxil olmaq üçün icazÉ™niz yoxdur", + "pad.wrongPassword": "Sizin parolunuz sÉ™hvdir", + "pad.settings.padSettings": "Pad TÉ™nzimlÉ™mÉ™lÉ™ri", + "pad.settings.myView": "MÉ™nim Görüntüm", + "pad.settings.stickychat": "SöhbÉ™t hÉ™miÅŸÉ™ ekranda", + "pad.settings.colorcheck": "Müəlliflik rÉ™nglÉ™ri", + "pad.settings.linenocheck": "SÉ™tir nömrÉ™lÉ™ri", + "pad.settings.rtlcheck": "MühtÉ™viyyat saÄŸdan sola doÄŸru oxunsunmu?", + "pad.settings.fontType": "Åžriftin tipi:", "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monobo\u015fluq", - "pad.settings.globalView": "\u00dcmumi g\u00f6r\u00fcn\u00fc\u015f", + "pad.settings.fontType.monospaced": "MonoboÅŸluq", + "pad.settings.globalView": "Ãœmumi görünüş", "pad.settings.language": "Dil:", - "pad.importExport.import_export": "\u0130dxal\/\u0130xrac", - "pad.importExport.import": "H\u0259r hans\u0131 bir m\u0259tn fayl\u0131 v\u0259 ya s\u0259n\u0259d y\u00fckl\u0259", - "pad.importExport.importSuccessful": "U\u011furlu!", - "pad.importExport.export": "Haz\u0131rki pad-\u0131 ixrac etm\u0259k kimi:", + "pad.importExport.import_export": "Ä°dxal/Ä°xrac", + "pad.importExport.import": "HÉ™r hansı bir mÉ™tn faylı vÉ™ ya sÉ™nÉ™d yüklÉ™", + "pad.importExport.importSuccessful": "UÄŸurlu!", + "pad.importExport.export": "Hazırki pad-ı ixrac etmÉ™k kimi:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Adi m\u0259tn", + "pad.importExport.exportplain": "Adi mÉ™tn", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (A\u00e7\u0131q S\u0259n\u0259d Format\u0131)", + "pad.importExport.exportopen": "ODF (Açıq SÉ™nÉ™d Formatı)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Siz yaln\u0131z adi m\u0259tnd\u0259n v\u0259 ya HTML-d\u0259n idxal ed\u0259 bil\u0259rsiniz. \u0130dxal\u0131n daha m\u00fcr\u0259kk\u0259b funksiyalar\u0131 \u00fc\u00e7\u00fcn, z\u0259hm\u0259t olmasa, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"> AbiWord-i qura\u015fd\u0131r\u0131n<\/a>.", - "pad.modals.connected": "Ba\u011fland\u0131.", - "pad.modals.reconnecting": "Sizin pad yenid\u0259n qo\u015fulur..", - "pad.modals.forcereconnect": "M\u0259cbur t\u0259krar\u0259n ba\u011flan", - "pad.modals.userdup": "Ba\u015fqa p\u0259nc\u0259r\u0259d\u0259 art\u0131q a\u00e7\u0131qd\u0131r", - "pad.modals.userdup.explanation": "S\u0259n\u0259d, ola bilsin ki, bu kompyuterd\u0259, brauzerin bir ne\u00e7\u0259 p\u0259nc\u0259r\u0259sind\u0259 a\u00e7\u0131lm\u0131\u015fd\u0131r.", - "pad.modals.userdup.advice": "Bu p\u0259nc\u0259r\u0259d\u0259n istifad\u0259yl\u0259 yenid\u0259n qo\u015fulun.", - "pad.modals.unauth": "\u0130caz\u0259li deyil", - "pad.modals.unauth.explanation": "Bu s\u0259hif\u0259y\u0259 baxd\u0131\u011f\u0131n\u0131z vaxt sizin icaz\u0259niz d\u0259yi\u015filib. B\u0259rpa etm\u0259k \u00fc\u015f\u00fcn yenid\u0259n c\u0259hd edin.", - "pad.modals.looping": "\u018flaq\u0259 k\u0259sildi.", - "pad.modals.looping.explanation": "Sinxronla\u015fd\u0131rma serveri il\u0259 kommunikasiya x\u0259tas\u0131 var.", - "pad.modals.looping.cause": "Ola bilsin ki, siz uy\u011fun olmayan fayrvol v\u0259 ya proksi vasit\u0259si il\u0259 qo\u015fulma\u011fa c\u0259hd g\u00f6st\u0259rirsiniz.", - "pad.modals.initsocketfail": "Server \u0259l\u00e7atmazd\u0131r.", - "pad.modals.initsocketfail.explanation": "Sinxronla\u015fd\u0131rma serverin\u0259 qo\u015fulma m\u00fcmk\u00fcns\u00fczd\u00fcr.", - "pad.modals.initsocketfail.cause": "Ehtimal ki, bu problem sizin brauzerinizl\u0259 v\u0259 ya internet-birl\u0259\u015fm\u0259nizl\u0259 \u0259laq\u0259d\u0259rdir.", - "pad.modals.slowcommit": "\u018flaq\u0259 k\u0259sildi.", + "pad.importExport.abiword.innerHTML": "Siz yalnız adi mÉ™tndÉ™n vÉ™ ya HTML-dÉ™n idxal edÉ™ bilÉ™rsiniz. Ä°dxalın daha mürÉ™kkÉ™b funksiyaları üçün, zÉ™hmÉ™t olmasa, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"> AbiWord-i quraÅŸdırın</a>.", + "pad.modals.connected": "BaÄŸlandı.", + "pad.modals.reconnecting": "Sizin pad yenidÉ™n qoÅŸulur..", + "pad.modals.forcereconnect": "MÉ™cbur tÉ™krarÉ™n baÄŸlan", + "pad.modals.userdup": "BaÅŸqa pÉ™ncÉ™rÉ™dÉ™ artıq açıqdır", + "pad.modals.userdup.explanation": "SÉ™nÉ™d, ola bilsin ki, bu kompyuterdÉ™, brauzerin bir neçə pÉ™ncÉ™rÉ™sindÉ™ açılmışdır.", + "pad.modals.userdup.advice": "Bu pÉ™ncÉ™rÉ™dÉ™n istifadÉ™ylÉ™ yenidÉ™n qoÅŸulun.", + "pad.modals.unauth": "Ä°cazÉ™li deyil", + "pad.modals.unauth.explanation": "Bu sÉ™hifÉ™yÉ™ baxdığınız vaxt sizin icazÉ™niz dÉ™yiÅŸilib. BÉ™rpa etmÉ™k üşün yenidÉ™n cÉ™hd edin.", + "pad.modals.looping.explanation": "SinxronlaÅŸdırma serveri ilÉ™ kommunikasiya xÉ™tası var.", + "pad.modals.looping.cause": "Ola bilsin ki, siz uyÄŸun olmayan fayrvol vÉ™ ya proksi vasitÉ™si ilÉ™ qoÅŸulmaÄŸa cÉ™hd göstÉ™rirsiniz.", + "pad.modals.initsocketfail": "Server É™lçatmazdır.", + "pad.modals.initsocketfail.explanation": "SinxronlaÅŸdırma serverinÉ™ qoÅŸulma mümkünsüzdür.", + "pad.modals.initsocketfail.cause": "Ehtimal ki, bu problem sizin brauzerinizlÉ™ vÉ™ ya internet-birləşmÉ™nizlÉ™ É™laqÉ™dÉ™rdir.", "pad.modals.slowcommit.explanation": "Server cavab vermir.", - "pad.modals.slowcommit.cause": "Bu \u015f\u0259b\u0259k\u0259 ba\u011flant\u0131s\u0131nda probleml\u0259r yarana bil\u0259r.", + "pad.modals.slowcommit.cause": "Bu ÅŸÉ™bÉ™kÉ™ baÄŸlantısında problemlÉ™r yarana bilÉ™r.", + "pad.modals.badChangeset.explanation": "Etdiyiniz bir redaktÉ™ sinxronizasiya serveri tÉ™rÉ™findÉ™n qeyri-leqal/qanundan kÉ™nar olaraq tÉ™sbit edildi.", + "pad.modals.badChangeset.cause": "Bu, yanlış server tÉ™rtibatı ya da baÅŸqa bir gözlÉ™nilmÉ™yÉ™n davranışlar nÉ™ticÉ™sindÉ™ ola bilÉ™r. Bu sizÉ™ bir xÉ™ta imiÅŸ kimi görünürsÉ™ lütfÉ™n servis nÉ™zarÉ™tçisi ilÉ™ É™laqÉ™ yaradın. RedaktÉ™yÉ™ davam etmÉ™k üçün yenidÉ™n qoÅŸulmanı yoxlayın.", + "pad.modals.corruptPad.explanation": "ÆldÉ™ etmÉ™yÉ™ çalışdığınız sÉ™nÉ™d zÉ™dÉ™lidir.", + "pad.modals.corruptPad.cause": "Bu, yanlış server tÉ™rtibatı ya da baÅŸqa bir gözlÉ™nilmÉ™yÉ™n davranışlardan É™mÉ™lÉ™ gÉ™lÉ™ bilÉ™r. LütfÉ™n servis nÉ™zarÉ™tçisi ilÉ™ É™laqÉ™ yaradın.", "pad.modals.deleted": "Silindi.", "pad.modals.deleted.explanation": "Bu pad silindi.", - "pad.modals.disconnected": "\u018flaq\u0259 k\u0259silib.", - "pad.modals.disconnected.explanation": "Server\u0259 qo\u015fulma itirilib", - "pad.modals.disconnected.cause": "Server istifad\u0259 olunmur. \u018fg\u0259r problem t\u0259krarlanacaqsa, biz\u0259 bildirin.", - "pad.share": "Bu pad-\u0131 yay\u0131mla", - "pad.share.readonly": "Yaln\u0131z oxuyun", - "pad.share.link": "Ke\u00e7id", - "pad.share.emebdcode": "URL-ni yay\u0131mla", - "pad.chat": "S\u00f6hb\u0259t", - "pad.chat.title": "Bu pad \u00fc\u00e7\u00fcn chat a\u00e7\u0131n.", - "pad.chat.loadmessages": "Daha \u00e7ox mesaj y\u00fckl\u0259", - "timeslider.pageTitle": "{{appTitle}} Vaxt c\u0259dv\u0259li", - "timeslider.toolbar.returnbutton": "Pad-a qay\u0131t", - "timeslider.toolbar.authors": "M\u00fc\u0259llifl\u0259r:", - "timeslider.toolbar.authorsList": "M\u00fc\u0259llif yoxdur", - "timeslider.toolbar.exportlink.title": "\u0130xrac", - "timeslider.exportCurrent": "Cari versiyan\u0131 ixrac etm\u0259k kimi:", + "pad.modals.disconnected": "ÆlaqÉ™ kÉ™silib.", + "pad.modals.disconnected.explanation": "ServerÉ™ qoÅŸulma itirilib", + "pad.modals.disconnected.cause": "Server istifadÉ™ olunmur. ÆgÉ™r problem tÉ™krarlanacaqsa, bizÉ™ bildirin.", + "pad.share": "Bu pad-ı yayımla", + "pad.share.readonly": "Yalnız oxuyun", + "pad.share.link": "Keçid", + "pad.share.emebdcode": "URL-ni yayımla", + "pad.chat": "SöhbÉ™t", + "pad.chat.title": "Bu pad üçün chat açın.", + "pad.chat.loadmessages": "Daha çox mesaj yüklÉ™", + "timeslider.pageTitle": "{{appTitle}} Vaxt cÉ™dvÉ™li", + "timeslider.toolbar.returnbutton": "Pad-a qayıt", + "timeslider.toolbar.authors": "MüəlliflÉ™r:", + "timeslider.toolbar.authorsList": "Müəllif yoxdur", + "timeslider.toolbar.exportlink.title": "Ä°xrac", + "timeslider.exportCurrent": "Cari versiyanı ixrac etmÉ™k kimi:", "timeslider.version": "Versiya {{version}}", - "timeslider.saved": "Saxlan\u0131ld\u0131 {{day}} {{month}}, {{year}}", + "timeslider.saved": "Saxlanıldı {{day}} {{month}}, {{year}}", "timeslider.dateformat": "{{day}} {{month}}, {{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Yanvar", "timeslider.month.february": "Fevral", "timeslider.month.march": "Mart", "timeslider.month.april": "Aprel", "timeslider.month.may": "May", - "timeslider.month.june": "\u0130yun", - "timeslider.month.july": "\u0130yul", + "timeslider.month.june": "Ä°yun", + "timeslider.month.july": "Ä°yul", "timeslider.month.august": "Avqust", "timeslider.month.september": "Sentyabr", "timeslider.month.october": "Oktyabr", "timeslider.month.november": "Noyabr", "timeslider.month.december": "Dekabr", - "timeslider.unnamedauthor": "{{num}} ads\u0131z m\u00fc\u0259llif", - "timeslider.unnamedauthors": "{{num}} ads\u0131z m\u00fc\u0259llifl\u0259r", - "pad.savedrevs.marked": "Bu versiya indi yadda\u015fa saxlanm\u0131\u015f kimi ni\u015fanland\u0131", - "pad.userlist.entername": "Ad\u0131n\u0131z\u0131 daxil et", - "pad.userlist.unnamed": "ads\u0131z", + "timeslider.unnamedauthors": "{{num}} adsız müəlliflÉ™r", + "pad.savedrevs.marked": "Bu versiya indi yaddaÅŸa saxlanmış kimi niÅŸanlandı", + "pad.userlist.entername": "Adınızı daxil et", + "pad.userlist.unnamed": "adsız", "pad.userlist.guest": "Qonaq", - "pad.userlist.deny": "\u0130nkar etm\u0259k", - "pad.userlist.approve": "T\u0259sdiql\u0259m\u0259k", - "pad.editbar.clearcolors": "B\u00fct\u00fcn s\u0259n\u0259dl\u0259rd\u0259 m\u00fc\u0259lliflik r\u0259ngl\u0259rini t\u0259mizl\u0259?", - "pad.impexp.importbutton": "\u0130ndi idxal edin", - "pad.impexp.importing": "\u0130dxal...", - "pad.impexp.confirmimport": "Fayl\u0131n idxal\u0131 cari m\u0259tni yenil\u0259y\u0259c\u0259k. Siz \u0259minsinizmi ki, davam etm\u0259k ist\u0259yirsiniz?", - "pad.impexp.convertFailed": "Biz bu fayl idxal etm\u0259k m\u00fcmk\u00fcn deyil idi. Xahi\u015f olunur m\u00fcxt\u0259lif s\u0259n\u0259dd\u0259n istifad\u0259 edin v\u0259 ya kopyalay\u0131b yap\u0131\u015fd\u0131rmaq yolundan istifad\u0259 edin", - "pad.impexp.uploadFailed": "Y\u00fckl\u0259m\u0259d\u0259 s\u0259hv, xahi\u015f olunur yen\u0259 c\u0259hd edin", - "pad.impexp.importfailed": "\u0130dxal zaman\u0131 s\u0259hv", - "pad.impexp.copypaste": "Xahi\u015f edirik kopyalay\u0131b yap\u0131\u015fd\u0131r\u0131n", - "pad.impexp.exportdisabled": "{{ type}} format\u0131nda ixrac s\u00f6nd\u00fcr\u00fclm\u00fc\u015fd\u00fcr. \u018ftrafl\u0131 informasiya \u00fc\u00e7\u00fcn sistem administratoruna m\u00fcraci\u0259t ediniz." -}
\ No newline at end of file + "pad.userlist.deny": "Ä°nkar etmÉ™k", + "pad.userlist.approve": "TÉ™sdiqlÉ™mÉ™k", + "pad.editbar.clearcolors": "Bütün sÉ™nÉ™dlÉ™rdÉ™ müəlliflik rÉ™nglÉ™rini tÉ™mizlÉ™?", + "pad.impexp.importbutton": "Ä°ndi idxal edin", + "pad.impexp.importing": "Ä°dxal...", + "pad.impexp.confirmimport": "Faylın idxalı cari mÉ™tni yenilÉ™yÉ™cÉ™k. Siz É™minsinizmi ki, davam etmÉ™k istÉ™yirsiniz?", + "pad.impexp.convertFailed": "Biz bu fayl idxal etmÉ™k mümkün deyil idi. XahiÅŸ olunur müxtÉ™lif sÉ™nÉ™ddÉ™n istifadÉ™ edin vÉ™ ya kopyalayıb yapışdırmaq yolundan istifadÉ™ edin", + "pad.impexp.uploadFailed": "YüklÉ™mÉ™dÉ™ sÉ™hv, xahiÅŸ olunur yenÉ™ cÉ™hd edin", + "pad.impexp.importfailed": "Ä°dxal zamanı sÉ™hv", + "pad.impexp.copypaste": "XahiÅŸ edirik kopyalayıb yapışdırın", + "pad.impexp.exportdisabled": "{{ type}} formatında ixrac söndürülmüşdür. Ætraflı informasiya üçün sistem administratoruna müraciÉ™t ediniz." +} diff --git a/src/locales/azb.json b/src/locales/azb.json index 5bfe448b..b3b76f80 100644 --- a/src/locales/azb.json +++ b/src/locales/azb.json @@ -5,69 +5,68 @@ "Mousa" ] }, - "index.newPad": "\u06cc\u0626\u0646\u06cc \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc", - "index.createOpenPad": "\u06cc\u0627 \u062f\u0627 \u0627\u06cc\u062c\u0627\u062f \/\u0628\u06cc\u0631 \u067e\u062f \u0622\u062f\u0644\u0627 \u0628\u0631\u0627\u0628\u0631 \u0622\u0686\u0645\u0627\u0642:", - "pad.toolbar.bold.title": "\u0628\u0648\u06cc\u0648\u062a", - "pad.toolbar.italic.title": "\u0645\u0648\u0631\u0628", - "pad.toolbar.underline.title": "\u062e\u0637\u062f\u06cc\u0646 \u0622\u0644\u062a\u06cc", - "pad.toolbar.strikethrough.title": "\u062e\u0637 \u06cc\u0626\u0645\u06cc\u0634", - "pad.toolbar.ol.title": "\u062c\u0648\u062a\u062f\u0646\u0645\u06cc\u0634 \u0641\u0647\u0631\u0633\u062a", - "pad.toolbar.ul.title": "\u062c\u0648\u062a\u062f\u0646\u0645\u0645\u06cc\u0634 \u0641\u0647\u0631\u0633\u062a", - "pad.toolbar.indent.title": "\u0627\u06cc\u0686\u0631\u06cc \u0628\u0627\u062a\u062f\u06cc\u06af\u06cc", - "pad.toolbar.unindent.title": "\u0627\u0626\u0634\u06cc\u06af\u0647 \u0686\u06cc\u062e\u062f\u06cc\u06af\u06cc", - "pad.toolbar.undo.title": "\u0628\u0627\u0637\u0644 \u0627\u0626\u062a\u0645\u06a9", - "pad.toolbar.redo.title": "\u06cc\u0626\u0646\u06cc \u062f\u0646", - "pad.toolbar.clearAuthorship.title": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0631\u0646\u06af \u0644\u0631\u06cc \u067e\u0648\u0632\u0645\u0627\u0642", - "pad.toolbar.import_export.title": "\u0622\u06cc\u0631\u06cc \u0642\u0627\u0644\u06cc\u0628 \u0644\u0631\u062f\u0646 \/\u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647 \/ \u0627\u0626\u0634\u06cc\u06af\u0647 \u062a\u0648\u06a9\u0645\u0647", - "pad.toolbar.timeslider.title": "\u0632\u0645\u0627\u0646 \u0627\u0633\u0644\u0627\u06cc\u062f\u06cc", - "pad.toolbar.savedRevision.title": "\u0633\u0627\u062e\u0644\u0627\u0646\u0645\u06cc\u0634 \u0646\u0633\u062e\u0647 \u0644\u0631", - "pad.toolbar.settings.title": "\u062a\u0646\u0638\u06cc\u0645\u0644\u0631", - "pad.toolbar.embed.title": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646 \u06cc\u0626\u0631\u0644\u062a\u0645\u06a9", - "pad.toolbar.showusers.title": "\u0628\u0648 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0627 \u0627\u0648\u0644\u0627\u0646 \u06a9\u0627\u0631\u0628\u0631\u0644\u0631\u06cc \u06af\u0648\u0633\u062a\u0631", - "pad.colorpicker.save": "\u0642\u0626\u06cc\u062f \u0627\u0626\u062a", - "pad.colorpicker.cancel": "\u0644\u063a\u0648 \u0627\u0626\u062a", - "pad.loading": "\u06cc\u0648\u06a9\u0644\u0646\u06cc\u0631...", - "pad.settings.padSettings": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0644\u0631", - "pad.settings.myView": "\u0645\u0646\u06cc\u0645 \u06af\u0648\u0631\u0646\u062a\u0648\u0645", - "pad.settings.stickychat": "\u0646\u0645\u0627\u06cc\u0634 \u0635\u0641\u062d\u0647 \u0633\u06cc\u0646\u062f\u0647 \u0647\u0645\u06cc\u0634\u0647 \u0686\u062a \u0627\u0648\u0644\u0633\u0648\u0646", - "pad.settings.colorcheck": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0631\u0646\u06af \u0644\u0631\u06cc", - "pad.settings.linenocheck": "\u062e\u0637\u0648\u0637 \u0634\u0645\u0627\u0631\u0647 \u0633\u06cc", - "pad.settings.fontType": "\u0642\u0644\u0645 \u0646\u0648\u0639\u06cc", - "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", - "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648 \u0627\u0633\u067e\u0626\u06cc\u0633", - "pad.settings.globalView": "\u0633\u0631\u0627\u0633\u0631 \u06af\u0648\u0631\u0648\u0646\u062a\u0648", - "pad.settings.language": "\u062f\u06cc\u0644:", - "pad.importExport.import_export": "\u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647 \/\u0627\u0626\u0634\u06cc\u06af\u0647 \u062a\u0648\u06a9\u0645\u0647", - "pad.importExport.import": "\u0633\u0646\u062f \u06cc\u0627 \u062f\u0627 \u0645\u062a\u0646\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u06cc\u0648\u06a9\u0644\u0647", - "pad.importExport.export": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc \u0639\u0646\u0648\u0627\u0646\u0627 \u0627\u06cc\u0686\u0631\u06cc \u062a\u0648\u06a9\u0645\u0647", - "pad.importExport.exporthtml": "\u0627\u0686 \u062a\u06cc \u0627\u0645 \u0627\u0644", - "pad.importExport.exportplain": "\u0633\u0627\u062f\u0647 \u0645\u062a\u0646", - "pad.importExport.exportword": "\u0645\u0627\u06cc\u06a9\u0631\u0648\u0633\u0627\u0641\u062a \u0648\u0648\u0631\u062f", - "pad.importExport.exportpdf": "\u067e\u06cc \u062f\u06cc \u0627\u0641", - "pad.importExport.exportopen": "\u0627\u0648 \u062f\u06cc \u0627\u0641", - "pad.importExport.exportdokuwiki": "\u062f\u0648\u06a9\u0648 \u0648\u06cc\u06a9\u06cc", - "pad.modals.connected": "\u0645\u062a\u0635\u0644 \u0627\u0648\u0644\u062f\u06cc", - "pad.modals.reconnecting": "\u0633\u06cc\u0632\u06cc\u0646 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u0647 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u062f\u06cc", - "pad.modals.forcereconnect": "\u06cc\u0626\u0646\u06cc \u0627\u062a\u0635\u0627\u0644 \u0627\u0648\u0686\u0648\u0646 \u0632\u0648\u0631\u0644\u0627\u0645\u0627", - "pad.modals.userdup.advice": "\u0628\u0648 \u067e\u0626\u0646\u062c\u0631\u0647 \u062f\u0646 \u0627\u06cc\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0626\u062a\u0645\u06a9 \u0627\u0648\u0686\u0648\u0646 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644", - "pad.modals.unauth": "\u0627\u0648\u0644\u0645\u0627\u0632", - "pad.modals.unauth.explanation": "\u0633\u06cc\u0632\u06cc\u0646 \u0627\u0644 \u0686\u062a\u0645\u0627 \u0645\u0633\u0626\u0644\u0647 \u0633\u06cc \u0628\u0648 \u0635\u0641\u062d\u0647 \u0646\u06cc\u0646 \u06af\u0648\u0631\u0648\u0646\u0648\u0634 \u0632\u0645\u0627\u0646\u06cc\u0646\u062f\u0627 \u062f\u06cc\u06cc\u0634\u06cc\u0644\u06cc\u0628 \u062f\u06cc\u0631 .\n\u0633\u0639\u06cc \u0627\u0626\u062f\u06cc\u0646 \u06cc\u0626\u0646\u06cc \u062f\u0646 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0627\u0633\u06cc\u0646\u06cc\u0632", - "pad.modals.looping": "\u0627\u062a\u06cc\u0635\u0627\u0644 \u0642\u0637\u0639 \u0627\u0648\u0644\u062f\u06cc", - "pad.modals.looping.explanation": "\u0627\u0631\u062a\u06cc\u0628\u0627\u0637\u06cc \u0645\u0648\u0634\u06a9\u06cc\u0644 \u0628\u06cc\u0631 \u0627\u0626\u062a\u0645\u0647 \u0633\u0631\u0648\u0631 \u062f\u0647 \u0648\u0627\u0631 \u062f\u06cc\u0631", - "pad.modals.looping.cause": "\u0628\u0644\u06a9\u0647 \u0633\u06cc\u0632 \u062f\u0648\u0632 \u062f\u0626\u0645\u06cc\u06cc\u0646 \u0628\u06cc\u0631 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u06cc\u0627\u062f\u0627 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0637\u0631\u06cc\u0642\u06cc \u0627\u06cc\u0644\u0647 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0648\u0628 \u0633\u06cc\u0646\u06cc\u0632", - "pad.modals.initsocketfail": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0648\u0644\u0645\u0648\u06cc\u0627\u0646 \u0633\u0631\u0648\u0631 \u062f\u06cc\u0631", - "pad.modals.initsocketfail.explanation": "\u0628\u06cc\u0631\u0644\u0634\u062f\u06cc\u0631\u06cc\u0644\u0645\u0647 \u0633\u0631\u0648\u0631 \u0644\u0631\u06cc\u0646\u0647 \u0645\u062a\u0635\u06cc\u0644 \u0627\u0648\u0644\u0627 \u0628\u06cc\u0644\u0645\u0647 \u062f\u06cc", - "pad.modals.deleted": "\u0633\u06cc\u0644\u06cc\u0646\u062f\u06cc.", - "pad.modals.deleted.explanation": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc \u0633\u06cc\u0644\u06cc\u0646\u06cc\u0628 \u062f\u06cc\u0631.", - "pad.modals.disconnected": "\u0633\u06cc\u0632\u06cc\u0646 \u0627\u062a\u0635\u0627\u0644\u06cc\u0646\u06cc\u0632 \u0642\u0637\u0639 \u0627\u0648\u0644\u0648\u0628 \u062f\u0648\u0631.", - "pad.modals.disconnected.explanation": "\u0633\u0631\u0648\u0631\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0627\u0648\u0644\u0648\u0628 \u062f\u0648\u0631.", - "pad.share.readonly": "\u0627\u0648\u062e\u0648\u0645\u0627\u0644\u06cc \u0641\u0642\u0637", - "pad.share.link": "\u0628\u0627\u063a\u0644\u0627\u0646\u062a\u06cc", - "pad.share.emebdcode": "\u0646\u0634\u0627\u0646\u06cc \u0646\u06cc \u06cc\u0626\u0631\u0644\u062a\u0645\u06a9", - "pad.chat": "\u0686\u062a", - "pad.chat.title": "\u0628\u0648 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0646\u06cc \u0686\u062a \u0627\u0648\u0686\u0648\u0646 \u0622\u0686", - "timeslider.pageTitle": "{{appTitle}}\u0632\u0645\u0627\u0646 \u0627\u0633\u0644\u0627\u06cc\u062f\u0631\u06cc", - "timeslider.toolbar.returnbutton": "\u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u0633\u06cc\u0646\u0647 \u0642\u0627\u06cc\u06cc\u062a", - "timeslider.toolbar.authors": "\u06cc\u0627\u0632\u06cc\u0686\u06cc\u0644\u0627\u0631", - "timeslider.toolbar.authorsList": "\u06cc\u0627\u0632\u06cc\u0686\u06cc \u0633\u06cc\u0632" -}
\ No newline at end of file + "index.newPad": "یئنی یادداشت دÙترچه سی", + "index.createOpenPad": "یا دا ایجاد /بیر پد آدلا برابر آچماق:", + "pad.toolbar.bold.title": "بویوت", + "pad.toolbar.italic.title": "مورب", + "pad.toolbar.underline.title": "خطدین آلتی", + "pad.toolbar.strikethrough.title": "خط یئمیش", + "pad.toolbar.ol.title": "جوتدنمیش Ùهرست", + "pad.toolbar.ul.title": "جوتدنممیش Ùهرست", + "pad.toolbar.indent.title": "ایچری باتدیگی", + "pad.toolbar.unindent.title": "ائشیگه چیخدیگی", + "pad.toolbar.undo.title": "باطل ائتمک", + "pad.toolbar.redo.title": "یئنی دن", + "pad.toolbar.clearAuthorship.title": "یازیچی رنگ لری پوزماق", + "pad.toolbar.import_export.title": "آیری قالیب لردن /ایچری توکمه / ائشیگه توکمه", + "pad.toolbar.timeslider.title": "زمان اسلایدی", + "pad.toolbar.savedRevision.title": "ساخلانمیش نسخه لر", + "pad.toolbar.settings.title": "تنظیملر", + "pad.toolbar.embed.title": "بو یادداشت دÙترچه سین یئرلتمک", + "pad.toolbar.showusers.title": "بو دÙترچه یادداشت دا اولان کاربرلری گوستر", + "pad.colorpicker.save": "قئید ائت", + "pad.colorpicker.cancel": "لغو ائت", + "pad.loading": "یوکلنیر...", + "pad.settings.padSettings": "یادداشت دÙترچه سینین تنظیملر", + "pad.settings.myView": "منیم گورنتوم", + "pad.settings.stickychat": "نمایش صÙØÙ‡ سینده همیشه چت اولسون", + "pad.settings.colorcheck": "یازیچی رنگ لری", + "pad.settings.linenocheck": "خطوط شماره سی", + "pad.settings.fontType": "قلم نوعی", + "pad.settings.fontType.normal": "نورمال", + "pad.settings.fontType.monospaced": "مونو اسپئیس", + "pad.settings.globalView": "سراسر گورونتو", + "pad.settings.language": "دیل:", + "pad.importExport.import_export": "ایچری توکمه /ائشیگه توکمه", + "pad.importExport.import": "سند یا دا متنی پرونده یوکله", + "pad.importExport.export": "بو یادداشت دÙترچه سی عنوانا ایچری توکمه", + "pad.importExport.exporthtml": "اچ تی ام ال", + "pad.importExport.exportplain": "ساده متن", + "pad.importExport.exportword": "مایکروساÙت وورد", + "pad.importExport.exportpdf": "Ù¾ÛŒ دی اÙ", + "pad.importExport.exportopen": "او دی اÙ", + "pad.importExport.exportdokuwiki": "دوکو ویکی", + "pad.modals.connected": "متصل اولدی", + "pad.modals.reconnecting": "سیزین یادداشت دÙترچه سینه یئنی دن متصیل اولدی", + "pad.modals.forcereconnect": "یئنی اتصال اوچون زورلاما", + "pad.modals.userdup.advice": "بو پئنجره دن ایستÙاده ائتمک اوچون یئنی دن متصیل اول", + "pad.modals.unauth": "اولماز", + "pad.modals.unauth.explanation": "سیزین ال چتما مسئله سی بو صÙØÙ‡ نین گورونوش زمانیندا دییشیلیب دیر .\nسعی ائدین یئنی دن متصیل اولاسینیز", + "pad.modals.looping.explanation": "ارتیباطی موشکیل بیر ائتمه سرور ده وار دیر", + "pad.modals.looping.cause": "بلکه سیز دوز دئمیین بیر Ùایروال یادا پروکسی طریقی ایله متصیل اولوب سینیز", + "pad.modals.initsocketfail": "دسترسی اولمویان سرور دیر", + "pad.modals.initsocketfail.explanation": "بیرلشدیریلمه سرور لرینه متصیل اولا بیلمه دی", + "pad.modals.deleted": "سیلیندی.", + "pad.modals.deleted.explanation": "بو یادداشت دÙترچه سی سیلینیب دیر.", + "pad.modals.disconnected": "سیزین اتصالینیز قطع اولوب دور.", + "pad.modals.disconnected.explanation": "سروره اتصال قطع اولوب دور.", + "pad.share.readonly": "اوخومالی Ùقط", + "pad.share.link": "باغلانتی", + "pad.share.emebdcode": "نشانی Ù†ÛŒ یئرلتمک", + "pad.chat": "چت", + "pad.chat.title": "بو یادداشت دÙترچه Ù†ÛŒ چت اوچون Ø¢Ú†", + "timeslider.pageTitle": "{{appTitle}}زمان اسلایدری", + "timeslider.toolbar.returnbutton": "یادداشت دÙترچه سینه قاییت", + "timeslider.toolbar.authors": "یازیچیلار", + "timeslider.toolbar.authorsList": "یازیچی سیز" +} diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json new file mode 100644 index 00000000..d2cb6add --- /dev/null +++ b/src/locales/be-tarask.json @@ -0,0 +1,123 @@ +{ + "@metadata": { + "authors": [ + "Jim-by", + "Wizardist", + "Red Winged Duck" + ] + }, + "index.newPad": "Стварыць", + "index.createOpenPad": "ці тварыць/адкрыць дакумÑнт з назвай:", + "pad.toolbar.bold.title": "ТоўÑÑ‚Ñ‹ (Ctrl-B)", + "pad.toolbar.italic.title": "КурÑÑ–Ñž (Ctrl-I)", + "pad.toolbar.underline.title": "ПадкрÑÑьліваньне (Ctrl-U)", + "pad.toolbar.strikethrough.title": "ЗакрÑÑьліваньне", + "pad.toolbar.ol.title": "Упарадкаваны ÑьпіÑ", + "pad.toolbar.ul.title": "Ðеўпарадкаваны ÑьпіÑ", + "pad.toolbar.indent.title": "ВодÑтуп (TAB)", + "pad.toolbar.unindent.title": "Ð’Ñ‹Ñтуп (Shift+TAB)", + "pad.toolbar.undo.title": "СкаÑаваць(Ctrl-Z)", + "pad.toolbar.redo.title": "Ð’Ñрнуць (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Прыбраць колер дакумÑнту", + "pad.toolbar.import_export.title": "Імпарт/ÐкÑпарт з выкарыÑтаньне розных фарматаў файлаў", + "pad.toolbar.timeslider.title": "Шкала чаÑу", + "pad.toolbar.savedRevision.title": "Захаваць вÑÑ€ÑÑ–ÑŽ", + "pad.toolbar.settings.title": "Ðалады", + "pad.toolbar.embed.title": "ПадзÑліцца Ñ– ўбудаваць гÑÑ‚Ñ‹ дакумÑнт", + "pad.toolbar.showusers.title": "Паказаць карыÑтальнікаў у гÑтым дакумÑнце", + "pad.colorpicker.save": "Захаваць", + "pad.colorpicker.cancel": "СкаÑаваць", + "pad.loading": "Загрузка...", + "pad.passwordRequired": "Ð”Ð»Ñ Ð´Ð¾Ñтупу да гÑтага дакумÑнта патрÑбны пароль", + "pad.permissionDenied": "Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу на доÑтуп да гÑтага дакумÑнта", + "pad.wrongPassword": "Ð’Ñ‹ ўвÑлі нÑÑлушны пароль", + "pad.settings.padSettings": "Ðалады дакумÑнта", + "pad.settings.myView": "Мой выглÑд", + "pad.settings.stickychat": "ЗаўÑёды паказваць чат", + "pad.settings.colorcheck": "Колеры аўтарÑтва", + "pad.settings.linenocheck": "Ðумары радкоў", + "pad.settings.rtlcheck": "ТÑкÑÑ‚ Ñправа-налева", + "pad.settings.fontType": "Тып шрыфту:", + "pad.settings.fontType.normal": "Звычайны", + "pad.settings.fontType.monospaced": "Монашырынны", + "pad.settings.globalView": "Ðгульны выглÑд", + "pad.settings.language": "Мова:", + "pad.importExport.import_export": "Імпарт/ÐкÑпарт", + "pad.importExport.import": "Загрузіжайце Ð»ÑŽÐ±Ñ‹Ñ Ñ‚ÑкÑÑ‚Ð°Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ або дакумÑнты", + "pad.importExport.importSuccessful": "ПаÑьпÑхова!", + "pad.importExport.export": "ÐкÑпартаваць бÑгучы дакумÑнт Ñк:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "ПроÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Ð’Ñ‹ можаце імпартаваць толькі з звычайнага Ñ‚ÑкÑту або HTML. Ð”Ð·ÐµÐ»Ñ Ð±Ð¾Ð»ÑŒÑˆ пашыраных магчымаÑьцÑÑž імпарту, калі лаÑка, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">уÑталюйце abiword</a>.", + "pad.modals.connected": "ПадлучыліÑÑ.", + "pad.modals.reconnecting": "ПерападлучÑньне да вашага дакумÑнта...", + "pad.modals.forcereconnect": "ПрымуÑовае перападлучÑньне", + "pad.modals.userdup": "Ðдкрыта Ñž іншым акне", + "pad.modals.userdup.explanation": "Падобна, дакумÑнт адкрыты больш чым у адным акне браўзÑра на гÑтым кампутары.", + "pad.modals.userdup.advice": "Паўторна падключыць з выкарыÑтаньнем гÑтага акна.", + "pad.modals.unauth": "Ðе аўтарызаваны", + "pad.modals.unauth.explanation": "Ð’Ð°ÑˆÑ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹ былі Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ñ‹Ñ Ñž чаÑе праглÑду гÑтай Ñтаронкі. ПаÑпрабуйце перападключыцца.", + "pad.modals.looping.explanation": "Праблемы далучÑÐ½ÑŒÐ½Ñ Ð´Ð° ÑÑрвÑра Ñынхранізацыі.", + "pad.modals.looping.cause": "Магчыма, вы падключыліÑÑ Ð¿Ñ€Ð°Ð·ÑŒ неÑумÑшчальны брандмаўÑÑ€ або прокÑÑ–.", + "pad.modals.initsocketfail": "СÑрвÑÑ€ недаÑтупны.", + "pad.modals.initsocketfail.explanation": "Ðе атрымалаÑÑ Ð¿Ð°Ð´Ð»ÑƒÑ‡Ñ‹Ñ†Ñ†Ð° да ÑÑрвÑра Ñынхранізацыі.", + "pad.modals.initsocketfail.cause": "Імаверна, гÑта зьвÑзана з праблемамі з вашым браўзÑрам або інтÑрнÑÑ‚-злучÑньнем.", + "pad.modals.slowcommit.explanation": "СÑрвÑÑ€ не адказвае.", + "pad.modals.slowcommit.cause": "ГÑта можа быць выклікана праблемамі зь Ñеткавым падлучÑньнем.", + "pad.modals.badChangeset.explanation": "СÑрвÑÑ€ Ñынхранізацыі вызначыў зробленае вамі Ñ€Ñдагаваньне Ñк недапушчальнае.", + "pad.modals.badChangeset.cause": "ГÑта можа адбывацца празь нÑÑлушную канфігурацыю ÑÑрвÑра або празь Ñ–Ð½ÑˆÑ‹Ñ Ð½ÐµÑ‡Ð°ÐºÐ°Ð½Ñ‹Ñ Ð´Ð·ÐµÑньні. Калі лаÑка, ÑкантактуйцеÑÑ Ð· адмініÑтратарам, калі вы лічыце, што гÑта памылка. ПаÑпрабуйце перападлучыцца, каб працÑгнуць Ñ€Ñдагаваньне.", + "pad.modals.corruptPad.explanation": "ДакумÑнт, да Ñкога вы Ñпрабуеце атрымаць доÑтуп, пашкоджаны.", + "pad.modals.corruptPad.cause": "ГÑта можа быць выклікана нÑправільнай канфігурацыÑй ÑÑрвÑру або іншымі нечаканымі дзеÑньнÑмі. Калі лаÑка, ÑкантактуйцеÑÑ Ð· адмініÑтратарам Ñлужбы.", + "pad.modals.deleted": "Выдалены.", + "pad.modals.deleted.explanation": "ГÑÑ‚Ñ‹ дакумÑнт быў выдалены.", + "pad.modals.disconnected": "Ð’Ñ‹ былі адключаныÑ.", + "pad.modals.disconnected.explanation": "ЗлучÑньне з ÑÑрвÑрам было Ñтрачанае", + "pad.modals.disconnected.cause": "Магчыма, ÑÑрвÑÑ€ недаÑтупны. Калі лаÑка, паведаміце адмініÑтратару Ñлужбы, калі праблема будзе паўтарацца.", + "pad.share": "ПадзÑліцца дакумÑнтам", + "pad.share.readonly": "Толькі Ð´Ð»Ñ Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ", + "pad.share.link": "СпаÑылка", + "pad.share.emebdcode": "УклаÑьці URL", + "pad.chat": "Чат", + "pad.chat.title": "Ðдкрыць чат Ð´Ð»Ñ Ð³Ñтага дакумÑнту.", + "pad.chat.loadmessages": "Загрузіць болей паведамленьнÑÑž", + "timeslider.pageTitle": "ЧаÑÐ°Ð²Ð°Ñ ÑˆÐºÐ°Ð»Ð° {{appTitle}}", + "timeslider.toolbar.returnbutton": "Ð’Ñрнуцца да дакумÑнту", + "timeslider.toolbar.authors": "Ðўтары:", + "timeslider.toolbar.authorsList": "ÐÑма аўтараў", + "timeslider.toolbar.exportlink.title": "ÐкÑпарт", + "timeslider.exportCurrent": "ÐкÑпартаваць актуальную вÑÑ€ÑÑ–ÑŽ Ñк:", + "timeslider.version": "Ð’ÑÑ€ÑÑ–Ñ {{version}}", + "timeslider.saved": "Захавана {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Ñтудзень", + "timeslider.month.february": "люты", + "timeslider.month.march": "Ñакавік", + "timeslider.month.april": "краÑавік", + "timeslider.month.may": "травень", + "timeslider.month.june": "чÑрвень", + "timeslider.month.july": "ліпень", + "timeslider.month.august": "жнівень", + "timeslider.month.september": "вераÑень", + "timeslider.month.october": "каÑтрычнік", + "timeslider.month.november": "ліÑтапад", + "timeslider.month.december": "Ñьнежань", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: безыменны аўтар, few: Ð±ÐµÐ·Ñ‹Ð¼ÐµÐ½Ð½Ñ‹Ñ Ð°ÑžÑ‚Ð°Ñ€Ñ‹, many: безыменных аўтараў, other: безыменных аўтараў ]}", + "pad.savedrevs.marked": "ГÑÑ‚Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ Ñ†Ñпер Ð¿Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ñк захаванаÑ", + "pad.userlist.entername": "УвÑдзіце вашае імÑ", + "pad.userlist.unnamed": "безыменны", + "pad.userlist.guest": "ГоÑьць", + "pad.userlist.deny": "Ðдхіліць", + "pad.userlist.approve": "Зацьвердзіць", + "pad.editbar.clearcolors": "ÐчыÑьціць аўтарÑÐºÑ–Ñ ÐºÐ¾Ð»ÐµÑ€Ñ‹ ва ÑžÑім дакумÑнце?", + "pad.impexp.importbutton": "Імпартаваць зараз", + "pad.impexp.importing": "Імпартаваньне…", + "pad.impexp.confirmimport": "Імпарт файла перазапіша цÑперашні Ñ‚ÑкÑÑ‚ дакумÑнту. Ð’Ñ‹ ўпÑўненыÑ, што хочаце працÑгваць?", + "pad.impexp.convertFailed": "Ðе атрымалаÑÑ Ñ–Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ñ†ÑŒ гÑÑ‚Ñ‹ файл. Калі лаÑка, выкарыÑтайце іншы фармат дакумÑнту або Ñкапіюйце ўручную.", + "pad.impexp.uploadFailed": "Загрузка не атрымалаÑÑ, калі лаÑка, паÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·", + "pad.impexp.importfailed": "Памылка імпарту", + "pad.impexp.copypaste": "Калі лаÑка, Ñкапіюйце Ñ– ÑžÑтаўце" +} diff --git a/src/locales/bn.json b/src/locales/bn.json index 2d12528b..00ac6577 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -6,86 +6,84 @@ "Sankarshan" ] }, - "index.newPad": "\u09a8\u09a4\u09c1\u09a8 \u09aa\u09cd\u09af\u09be\u09a1", - "index.createOpenPad": "\u0985\u09a5\u09ac\u09be \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c7 \u09aa\u09cd\u09af\u09be\u09a1 \u0996\u09c1\u09b2\u09c1\u09a8\/\u09a4\u09c8\u09b0\u09c0 \u0995\u09b0\u09c1\u09a8:", - "pad.toolbar.bold.title": "\u0997\u09be\u09a1\u09bc \u0995\u09b0\u09be (Ctrl-B)", - "pad.toolbar.italic.title": "\u09ac\u09be\u0981\u0995\u09be \u0995\u09b0\u09be (Ctrl-I)", - "pad.toolbar.underline.title": "\u0986\u09a8\u09cd\u09a1\u09be\u09b0\u09b2\u09be\u0987\u09a8 (Ctrl-U)", - "pad.toolbar.ol.title": "\u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7 \u09a4\u09be\u09b2\u09bf\u0995\u09be", - "pad.toolbar.indent.title": "\u09aa\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u09bf\u0995\u0995\u09b0\u09a3", - "pad.toolbar.unindent.title": "\u0986\u0989\u099f\u09a1\u09c7\u09a8\u09cd\u099f", - "pad.toolbar.undo.title": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u0995\u09b0\u09c1\u09a8 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u0995\u09c3\u09a4\u09bf \u09b0\u0982 \u09aa\u09b0\u09bf\u09b7\u09cd\u0995\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", - "pad.toolbar.timeslider.title": "\u099f\u09be\u0987\u09ae\u09b8\u09cd\u09b2\u09be\u0987\u09a1\u09be\u09b0", - "pad.toolbar.savedRevision.title": "\u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09c1\u09a8", - "pad.toolbar.settings.title": "\u09b8\u09c7\u099f\u09bf\u0982", - "pad.toolbar.embed.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u098f\u09ae\u09cd\u09ac\u09c7\u09a1 \u0995\u09b0\u09c1\u09a8", - "pad.toolbar.showusers.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0\u09a6\u09c7\u09b0 \u09a6\u09c7\u0996\u09be\u09a8", - "pad.colorpicker.save": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3", - "pad.colorpicker.cancel": "\u09ac\u09be\u09a4\u09bf\u09b2", - "pad.loading": "\u09b2\u09cb\u09a1\u09bf\u0982...", - "pad.passwordRequired": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u099c\u09a8\u09cd\u09af \u0986\u09aa\u09a8\u09be\u0995\u09c7 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b9\u09ac\u09c7", - "pad.permissionDenied": "\u09a6\u09c1\u0983\u0996\u09bf\u09a4, \u098f \u09aa\u09cd\u09af\u09be\u09a1-\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09c7\u0987", - "pad.wrongPassword": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09b8\u09a0\u09bf\u0995 \u09a8\u09af\u09bc", - "pad.settings.padSettings": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09cd\u09a5\u09be\u09aa\u09a8", - "pad.settings.myView": "\u0986\u09ae\u09be\u09b0 \u09a6\u09c3\u09b6\u09cd\u09af", - "pad.settings.stickychat": "\u099a\u09cd\u09af\u09be\u099f \u09b8\u0995\u09cd\u09b0\u09c0\u09a8\u09c7 \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8 \u0995\u09b0\u09be \u09b9\u09ac\u09c7", - "pad.settings.colorcheck": "\u09b2\u09c7\u0996\u0995\u09a6\u09c7\u09b0 \u09a8\u09bf\u099c\u09b8\u09cd\u09ac \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09bf\u09a4 \u09b0\u0982", - "pad.settings.linenocheck": "\u09b2\u09be\u0987\u09a8 \u09a8\u09ae\u09cd\u09ac\u09b0", - "pad.settings.fontType": "\u09ab\u09a8\u09cd\u099f-\u098f\u09b0 \u09aa\u09cd\u09b0\u0995\u09be\u09b0:", - "pad.settings.fontType.normal": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3", + "index.newPad": "নতà§à¦¨ পà§à¦¯à¦¾à¦¡", + "index.createOpenPad": "অথবা নাম লিখে পà§à¦¯à¦¾à¦¡ খà§à¦²à§à¦¨/তৈরী করà§à¦¨:", + "pad.toolbar.bold.title": "গাড় করা (Ctrl-B)", + "pad.toolbar.italic.title": "বাà¦à¦•à¦¾ করা (Ctrl-I)", + "pad.toolbar.underline.title": "আনà§à¦¡à¦¾à¦°à¦²à¦¾à¦‡à¦¨ (Ctrl-U)", + "pad.toolbar.ol.title": "সারিবদà§à¦§ তালিকা", + "pad.toolbar.indent.title": "পà§à¦°à¦¾à¦¨à§à¦¤à¦¿à¦•à¦•à¦°à¦£", + "pad.toolbar.unindent.title": "আউটডেনà§à¦Ÿ", + "pad.toolbar.undo.title": "বাতিল করà§à¦¨ (Ctrl-Z)", + "pad.toolbar.redo.title": "পà§à¦¨à¦°à¦¾à¦¯à¦¼ করà§à¦¨ (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "কৃতি রং পরিষà§à¦•à¦¾à¦° করà§à¦¨", + "pad.toolbar.timeslider.title": "টাইমসà§à¦²à¦¾à¦‡à¦¡à¦¾à¦°", + "pad.toolbar.savedRevision.title": "সংসà§à¦•à¦°à¦£ সংরকà§à¦·à¦£ করà§à¦¨", + "pad.toolbar.settings.title": "সেটিং", + "pad.toolbar.embed.title": "à¦à¦‡ পà§à¦¯à¦¾à¦¡-টি à¦à¦®à§à¦¬à§‡à¦¡ করà§à¦¨", + "pad.toolbar.showusers.title": "à¦à¦‡ পà§à¦¯à¦¾à¦¡à§‡à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° দেখান", + "pad.colorpicker.save": "সংরকà§à¦·à¦£", + "pad.colorpicker.cancel": "বাতিল", + "pad.loading": "লোডিং...", + "pad.passwordRequired": "à¦à¦‡ পà§à¦¯à¦¾à¦¡-টি দেখার জনà§à¦¯ আপনাকে পাসওয়ারà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে হবে", + "pad.permissionDenied": "দà§à¦ƒà¦–িত, ঠপà§à¦¯à¦¾à¦¡-টি দেখার অধিকার আপনার নেই", + "pad.wrongPassword": "আপনার পাসওয়ারà§à¦¡ সঠিক নয়", + "pad.settings.padSettings": "পà§à¦¯à¦¾à¦¡à§‡à¦° সà§à¦¥à¦¾à¦ªà¦¨", + "pad.settings.myView": "আমার দৃশà§à¦¯", + "pad.settings.stickychat": "চà§à¦¯à¦¾à¦Ÿ সকà§à¦°à§€à¦¨à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করা হবে", + "pad.settings.colorcheck": "লেখকদের নিজসà§à¦¬ নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ রং", + "pad.settings.linenocheck": "লাইন নমà§à¦¬à¦°", + "pad.settings.fontType": "ফনà§à¦Ÿ-à¦à¦° পà§à¦°à¦•à¦¾à¦°:", + "pad.settings.fontType.normal": "সাধারণ", "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "\u09b8\u09b0\u09cd\u09ac\u09ac\u09cd\u09af\u09be\u09aa\u09c0 \u09a6\u09c3\u09b6\u09cd\u09af", - "pad.settings.language": "\u09ad\u09be\u09b7\u09be:", - "pad.importExport.import_export": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u099f\/\u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f", - "pad.importExport.import": "\u0995\u09cb\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09ab\u09be\u0987\u09b2 \u09ac\u09be \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09c1\u09a8", - "pad.importExport.importSuccessful": "\u09b8\u09ab\u09b2!", - "pad.importExport.export": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", - "pad.importExport.exporthtml": "\u098f\u0987\u099a\u099f\u09bf\u098f\u09ae\u098f\u09b2", - "pad.importExport.exportplain": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3 \u09b2\u09c7\u0996\u09be", - "pad.importExport.exportword": "\u09ae\u09be\u0987\u0995\u09cd\u09b0\u09cb\u09b8\u09ab\u099f \u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", - "pad.importExport.exportpdf": "\u09aa\u09bf\u09a1\u09bf\u098f\u09ab", - "pad.importExport.exportopen": "\u0993\u09a1\u09bf\u098f\u09ab (\u0993\u09aa\u09c7\u09a8 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u09ab\u09b0\u09ae\u09cd\u09af\u09be\u099f)", + "pad.settings.globalView": "সরà§à¦¬à¦¬à§à¦¯à¦¾à¦ªà§€ দৃশà§à¦¯", + "pad.settings.language": "à¦à¦¾à¦·à¦¾:", + "pad.importExport.import_export": "ইমà§à¦ªà§‹à¦°à¦Ÿ/à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ", + "pad.importExport.import": "কোন টেকà§à¦¸à¦Ÿ ফাইল বা ডকà§à¦®à§‡à¦¨à§à¦Ÿ আপলোড করà§à¦¨", + "pad.importExport.importSuccessful": "সফল!", + "pad.importExport.export": "à¦à¦‡ পà§à¦¯à¦¾à¦¡à¦Ÿà¦¿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨", + "pad.importExport.exporthtml": "à¦à¦‡à¦šà¦Ÿà¦¿à¦à¦®à¦à¦²", + "pad.importExport.exportplain": "সাধারণ লেখা", + "pad.importExport.exportword": "মাইকà§à¦°à§‹à¦¸à¦«à¦Ÿ ওয়ারà§à¦¡", + "pad.importExport.exportpdf": "পিডিà¦à¦«", + "pad.importExport.exportopen": "ওডিà¦à¦« (ওপেন ডকà§à¦®à§‡à¦¨à§à¦Ÿ ফরমà§à¦¯à¦¾à¦Ÿ)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09b8\u09ab\u09b2", - "pad.modals.reconnecting": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7..", - "pad.modals.forcereconnect": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b8\u0982\u09af\u09cb\u0997\u09b8\u09cd\u09a5\u09be\u09aa\u09a8\u09c7\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be", - "pad.modals.userdup": "\u0985\u09a8\u09cd\u09af \u0989\u0987\u09a8\u09cd\u09a1\u09cb-\u09a4\u09c7 \u0996\u09cb\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", - "pad.modals.unauth": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09a7\u09bf\u0995\u09be\u09b0 \u09a8\u09c7\u0987", - "pad.modals.looping": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", - "pad.modals.initsocketfail": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0-\u098f\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u0985\u09b8\u0995\u09cd\u09b7\u09ae\u0964", - "pad.modals.slowcommit": "\u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8", - "pad.modals.deleted": "\u0985\u09aa\u09b8\u09be\u09b0\u09bf\u09a4\u0964", - "pad.modals.deleted.explanation": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u099f\u09bf \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964", - "pad.modals.disconnected.explanation": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09af\u09cb\u0997\u09be\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be", - "pad.share": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", - "pad.share.link": "\u09b2\u09bf\u0982\u0995", - "pad.share.emebdcode": "\u0987\u0989\u0986\u09b0\u098f\u09b2 \u09b8\u0982\u09af\u09cb\u099c\u09a8", - "pad.chat": "\u099a\u09cd\u09af\u09be\u099f", - "pad.chat.title": "\u098f\u0987 \u09aa\u09cd\u09af\u09be\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u099a\u09cd\u09af\u09be\u099f \u099a\u09be\u09b2\u09c1 \u0995\u09b0\u09c1\u09a8\u0964", - "timeslider.toolbar.returnbutton": "\u09aa\u09cd\u09af\u09be\u09a1\u09c7 \u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u0993", - "timeslider.toolbar.authors": "\u09b2\u09c7\u0996\u0995\u0997\u09a3:", - "timeslider.toolbar.authorsList": "\u0995\u09cb\u09a8\u09cb \u09b2\u09c7\u0996\u0995 \u09a8\u09c7\u0987", - "timeslider.exportCurrent": "\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3\u099f\u09bf \u098f\u0995\u09cd\u09b8\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8:", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u099c\u09be\u09a8\u09c1\u09af\u09bc\u09be\u09b0\u09bf", - "timeslider.month.february": "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09af\u09bc\u09be\u09b0\u09bf", - "timeslider.month.march": "\u09ae\u09be\u09b0\u09cd\u099a", - "timeslider.month.april": "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2", - "timeslider.month.may": "\u09ae\u09c7", - "timeslider.month.june": "\u099c\u09c1\u09a8", - "timeslider.month.july": "\u099c\u09c1\u09b2\u09be\u0987", - "timeslider.month.august": "\u0986\u0997\u09b8\u09cd\u099f", - "timeslider.month.september": "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0", - "timeslider.month.october": "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0", - "timeslider.month.november": "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0", - "timeslider.month.december": "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0", - "pad.userlist.entername": "\u0986\u09aa\u09a8\u09be\u09b0 \u09a8\u09be\u09ae", - "pad.userlist.unnamed": "\u0995\u09cb\u09a8 \u09a8\u09be\u09ae \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09a8\u09bf", - "pad.userlist.guest": "\u0985\u09a4\u09bf\u09a5\u09bf", - "pad.userlist.approve": "\u0985\u09a8\u09c1\u09ae\u09cb\u09a6\u09bf\u09a4", - "pad.impexp.importbutton": "\u098f\u0996\u09a8 \u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0995\u09b0\u09c1\u09a8", - "pad.impexp.importing": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u099a\u09b2\u099b\u09c7...", - "pad.impexp.importfailed": "\u0987\u09ae\u09cd\u09aa\u09cb\u09b0\u09cd\u099f \u0985\u09b8\u0995\u09cd\u09b7\u09ae" -}
\ No newline at end of file + "pad.modals.connected": "যোগাযোগ সফল", + "pad.modals.reconnecting": "আপনার পà§à¦¯à¦¾à¦¡à§‡à¦° সাথে সংযোগসà§à¦¥à¦¾à¦ªà¦¨ করা হচà§à¦›à§‡..", + "pad.modals.forcereconnect": "পà§à¦¨à¦°à¦¾à¦¯à¦¼ সংযোগসà§à¦¥à¦¾à¦ªà¦¨à§‡à¦° চেষà§à¦Ÿà¦¾", + "pad.modals.userdup": "অনà§à¦¯ উইনà§à¦¡à§‹-তে খোলা হয়েছে", + "pad.modals.unauth": "আপনার অধিকার নেই", + "pad.modals.initsocketfail": "সারà§à¦à¦¾à¦°-à¦à¦° সাথে যোগাযোগ করতে অসকà§à¦·à¦®à¥¤", + "pad.modals.deleted": "অপসারিত।", + "pad.modals.deleted.explanation": "à¦à¦‡ পà§à¦¯à¦¾à¦¡à¦Ÿà¦¿ অপসারণ করা হয়েছে।", + "pad.modals.disconnected.explanation": "সারà§à¦à¦¾à¦°à§‡à¦° সাথে যোগাযোগ করা যাচà§à¦›à§‡ না", + "pad.share": "শেয়ার করà§à¦¨", + "pad.share.link": "লিংক", + "pad.share.emebdcode": "ইউআরà¦à¦² সংযোজন", + "pad.chat": "চà§à¦¯à¦¾à¦Ÿ", + "pad.chat.title": "à¦à¦‡ পà§à¦¯à¦¾à¦¡à§‡à¦° জনà§à¦¯ চà§à¦¯à¦¾à¦Ÿ চালৠকরà§à¦¨à¥¤", + "timeslider.toolbar.returnbutton": "পà§à¦¯à¦¾à¦¡à§‡ ফিরে যাও", + "timeslider.toolbar.authors": "লেখকগণ:", + "timeslider.toolbar.authorsList": "কোনো লেখক নেই", + "timeslider.exportCurrent": "বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£à¦Ÿà¦¿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨:", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "জানà§à¦¯à¦¼à¦¾à¦°à¦¿", + "timeslider.month.february": "ফেবà§à¦°à§à¦¯à¦¼à¦¾à¦°à¦¿", + "timeslider.month.march": "মারà§à¦š", + "timeslider.month.april": "à¦à¦ªà§à¦°à¦¿à¦²", + "timeslider.month.may": "মে", + "timeslider.month.june": "জà§à¦¨", + "timeslider.month.july": "জà§à¦²à¦¾à¦‡", + "timeslider.month.august": "আগসà§à¦Ÿ", + "timeslider.month.september": "সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°", + "timeslider.month.october": "অকà§à¦Ÿà§‹à¦¬à¦°", + "timeslider.month.november": "নà¦à§‡à¦®à§à¦¬à¦°", + "timeslider.month.december": "ডিসেমà§à¦¬à¦°", + "pad.userlist.entername": "আপনার নাম", + "pad.userlist.unnamed": "কোন নাম নিরà§à¦¬à¦¾à¦šà¦¨ করা হয়নি", + "pad.userlist.guest": "অতিথি", + "pad.userlist.approve": "অনà§à¦®à§‹à¦¦à¦¿à¦¤", + "pad.impexp.importbutton": "à¦à¦–ন ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨", + "pad.impexp.importing": "ইমà§à¦ªà§‹à¦°à§à¦Ÿ চলছে...", + "pad.impexp.importfailed": "ইমà§à¦ªà§‹à¦°à§à¦Ÿ অসকà§à¦·à¦®" +} diff --git a/src/locales/br.json b/src/locales/br.json index 1197f0d6..e22802c1 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -8,89 +8,92 @@ ] }, "index.newPad": "Pad nevez", - "index.createOpenPad": "pe kroui\u00f1\/digeri\u00f1 ur pad gant an anv :", + "index.createOpenPad": "pe krouiñ/digeriñ ur pad gant an anv :", "pad.toolbar.bold.title": "Tev (Ctrl-B)", "pad.toolbar.italic.title": "Italek (Ctrl-I)", - "pad.toolbar.underline.title": "Islinenna\u00f1 (Ctrl-U)", + "pad.toolbar.underline.title": "Islinennañ (Ctrl-U)", "pad.toolbar.strikethrough.title": "Barrennet", "pad.toolbar.ol.title": "Roll urzhiet", "pad.toolbar.ul.title": "Roll en dizurzh", - "pad.toolbar.indent.title": "Endanta\u00f1", - "pad.toolbar.unindent.title": "Diendanta\u00f1", + "pad.toolbar.indent.title": "Endantañ (TAB)", + "pad.toolbar.unindent.title": "Diendantañ (Shift+TAB)", "pad.toolbar.undo.title": "Dizober (Ktrl-Z)", "pad.toolbar.redo.title": "Adober (Ktrl-Y)", - "pad.toolbar.clearAuthorship.title": "Diverka\u00f1 al livio\u00f9 oc'h anaout an aozerien", - "pad.toolbar.import_export.title": "Enporzhia\u00f1\/Ezporzhia\u00f1 eus\/war-zu ur furmad restr dishe\u00f1vel", + "pad.toolbar.clearAuthorship.title": "Diverkañ al livioù oc'h anaout an aozerien", + "pad.toolbar.import_export.title": "Enporzhiañ/Ezporzhiañ eus/war-zu ur furmad restr disheñvel", "pad.toolbar.timeslider.title": "Istor dinamek", - "pad.toolbar.savedRevision.title": "Doareo\u00f9 enrollet", - "pad.toolbar.settings.title": "Arventenno\u00f9", - "pad.toolbar.embed.title": "Enframma\u00f1 ar pad-ma\u00f1", + "pad.toolbar.savedRevision.title": "Doareoù enrollet", + "pad.toolbar.settings.title": "Arventennoù", + "pad.toolbar.embed.title": "Rannañ hag enframmañ ar pad-mañ", "pad.toolbar.showusers.title": "Diskwelet implijerien ar Pad", - "pad.colorpicker.save": "Enrolla\u00f1", - "pad.colorpicker.cancel": "Nulla\u00f1", - "pad.loading": "O karga\u00f1...", + "pad.colorpicker.save": "Enrollañ", + "pad.colorpicker.cancel": "Nullañ", + "pad.loading": "O kargañ...", "pad.passwordRequired": "Ezhomm ho peus ur ger-tremen evit mont d'ar Pad-se", - "pad.permissionDenied": "\nN'oc'h ket aotreet da vont d'ar pad-ma\u00f1", + "pad.permissionDenied": "\nN'oc'h ket aotreet da vont d'ar pad-mañ", "pad.wrongPassword": "Fazius e oa ho ker-tremen", - "pad.settings.padSettings": "Arventenno\u00f9 Pad", + "pad.settings.padSettings": "Arventennoù Pad", "pad.settings.myView": "Ma diskwel", "pad.settings.stickychat": "Diskwel ar flap bepred", - "pad.settings.colorcheck": "Livio\u00f9 anaout", - "pad.settings.linenocheck": "Niverenno\u00f9 linenno\u00f9", + "pad.settings.colorcheck": "Livioù anaout", + "pad.settings.linenocheck": "Niverennoù linennoù", + "pad.settings.rtlcheck": "Lenn an danvez a-zehou da gleiz ?", "pad.settings.fontType": "Seurt font :", "pad.settings.fontType.normal": "Reizh", "pad.settings.fontType.monospaced": "Monospas", "pad.settings.globalView": "Gwel dre vras", "pad.settings.language": "Yezh :", - "pad.importExport.import_export": "Enporzhia\u00f1\/Ezporzhia\u00f1", - "pad.importExport.import": "Enkarga\u00f1 un destenn pe ur restr", + "pad.importExport.import_export": "Enporzhiañ/Ezporzhiañ", + "pad.importExport.import": "Enkargañ un destenn pe ur restr", "pad.importExport.importSuccessful": "Deuet eo ganeoc'h !", - "pad.importExport.export": "Ezporzhia\u00f1 ar pad brema\u00f1 evel :", + "pad.importExport.export": "Ezporzhiañ ar pad bremañ evel :", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Testenn blaen", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Ne c'hallit ket emporzjia\u00f1 furmado\u00f9 testenno\u00f9 kriz pe html. Evit arc'hwelio\u00f9 enporzhia\u00f1 emdroetoc'h, staliit <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword<\/a> mar plij.", + "pad.importExport.abiword.innerHTML": "Ne c'hallit ket emporzjiañ furmadoù testennoù kriz pe html. Evit arc'hwelioù enporzhiañ emdroetoc'h, staliit <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword</a> mar plij.", "pad.modals.connected": "Kevreet.", - "pad.modals.reconnecting": "Adkevrea\u00f1 war-zu ho pad...", - "pad.modals.forcereconnect": "Adkevrea\u00f1 dre heg", + "pad.modals.reconnecting": "Adkevreañ war-zu ho pad...", + "pad.modals.forcereconnect": "Adkevreañ dre heg", "pad.modals.userdup": "Digor en ur prenestr all", - "pad.modals.userdup.explanation": "Digor eo ho pad, war a seblant, e meur a brenestr eus ho merdeer en urzhiataer-ma\u00f1.", - "pad.modals.userdup.advice": "Kevrea\u00f1 en ur implijout ar prenestr-ma\u00f1.", + "pad.modals.userdup.explanation": "Digor eo ho pad, war a seblant, e meur a brenestr eus ho merdeer en urzhiataer-mañ.", + "pad.modals.userdup.advice": "Kevreañ en ur implijout ar prenestr-mañ.", "pad.modals.unauth": "N'eo ket aotreet", - "pad.modals.unauth.explanation": "Kemmet e vo hoc'h aotreo\u00f9 pa vo diskwelet ar bajenn.-ma\u00f1 Klaskit kevrea\u00f1 en-dro.", - "pad.modals.looping": "Digevreet.", - "pad.modals.looping.explanation": "Kudenno\u00f9 kehenti\u00f1 zo gant ar servijer sinkronelekaat.", + "pad.modals.unauth.explanation": "Kemmet e vo hoc'h aotreoù pa vo diskwelet ar bajenn.-mañ Klaskit kevreañ en-dro.", + "pad.modals.looping.explanation": "Kudennoù kehentiñ zo gant ar servijer sinkronelekaat.", "pad.modals.looping.cause": "Posupl eo e vefe gwarezet ho kevreadur gant ur maltouter diembreget pe ur servijer proksi", "pad.modals.initsocketfail": "Ne c'haller ket tizhout ar servijer.", - "pad.modals.initsocketfail.explanation": "Ne c'haller ket kevrea\u00f1 ouzh ar servijer sinkronelaat.", + "pad.modals.initsocketfail.explanation": "Ne c'haller ket kevreañ ouzh ar servijer sinkronelaat.", "pad.modals.initsocketfail.cause": "Gallout a ra ar gudenn dont eus ho merdeer Web pe eus ho kevreadur Internet.", - "pad.modals.slowcommit": "Digevreet.", "pad.modals.slowcommit.explanation": "Ne respont ket ar serveur.", - "pad.modals.slowcommit.cause": "Gallout a ra dont diwar kudenno\u00f9 kevrea\u00f1 gant ar rouedad.", + "pad.modals.slowcommit.cause": "Gallout a ra dont diwar kudennoù kevreañ gant ar rouedad.", + "pad.modals.badChangeset.explanation": "Graet ho peus ur c'hemm met rummet eo bet evel e-maez lezenn gant ar servijer sinkronelaat", + "pad.modals.badChangeset.cause": "Dont a ra marteze eus ur c'hefluniadur fall eus ar servijer pe eus un emzalc'h dic'hortoz all. Kit e darempred, mar plij, gant merour ar servijer, ma soñj deoc'h ez eo ur fazi. Klaskit kevreañ en-dro evit kenderc'hel da gemmañ.", + "pad.modals.corruptPad.explanation": "Breinet eo ar bloc'h emaoc'h o klask tizhout.", + "pad.modals.corruptPad.cause": "Dont a ra marteze eus ur c'hefluniadur fall eus ar servijer pe eus un emzalc'h dic'hortoz all. Kit e darempred, mar plij, gant merour ar servijer.", "pad.modals.deleted": "Dilamet.", - "pad.modals.deleted.explanation": "Lamet eo bet ar pad-ma\u00f1.", + "pad.modals.deleted.explanation": "Lamet eo bet ar pad-mañ.", "pad.modals.disconnected": "Digevreet oc'h bet.", "pad.modals.disconnected.explanation": "Kollet eo bet ar c'hevreadur gant ar servijer", - "pad.modals.disconnected.cause": "Dizimplijadus eo ar servijer marteze. Kelaouit ac'hanomp ma pad ar gudenn.", - "pad.share": "Ranna\u00f1 ar pad-ma\u00f1.", + "pad.modals.disconnected.cause": "Dizimplijadus eo ar servijer marteze. Kelaouit ar servij merañ ma pad ar gudenn.", + "pad.share": "Rannañ ar pad-mañ.", "pad.share.readonly": "Lenn hepken", "pad.share.link": "Liamm", - "pad.share.emebdcode": "Enframma\u00f1 an URL", + "pad.share.emebdcode": "Enframmañ an URL", "pad.chat": "Flap", - "pad.chat.title": "Digeri\u00f1 ar flap kevelet gant ar pad-ma\u00f1.", - "pad.chat.loadmessages": "Karga\u00f1 muioc'h a gemennadenno\u00f9", + "pad.chat.title": "Digeriñ ar flap kevelet gant ar pad-mañ.", + "pad.chat.loadmessages": "Kargañ muioc'h a gemennadennoù", "timeslider.pageTitle": "Istor dinamek eus {{appTitle}}", - "timeslider.toolbar.returnbutton": "Distrei\u00f1 d'ar pad-ma\u00f1.", + "timeslider.toolbar.returnbutton": "Distreiñ d'ar pad-mañ.", "timeslider.toolbar.authors": "Aozerien :", "timeslider.toolbar.authorsList": "Aozer ebet", - "timeslider.toolbar.exportlink.title": "Ezporzhia\u00f1", - "timeslider.exportCurrent": "Ezporzhia\u00f1 an doare brema\u00f1 evel :", + "timeslider.toolbar.exportlink.title": "Ezporzhiañ", + "timeslider.exportCurrent": "Ezporzhiañ an doare bremañ evel :", "timeslider.version": "Stumm {{version}}", - "timeslider.saved": "Enrolla\u00f1 {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.saved": "Enrollañ {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Genver", "timeslider.month.february": "C'hwevrer", "timeslider.month.march": "Meurzh", @@ -103,21 +106,20 @@ "timeslider.month.october": "Here", "timeslider.month.november": "Du", "timeslider.month.december": "Kerzu", - "timeslider.unnamedauthor": "{{niver}} aozer dianav", - "timeslider.unnamedauthors": "Aozerien dianav", - "pad.savedrevs.marked": "Merket eo an adweladenn-ma\u00f1 evel adweladenn gwiriet", + "timeslider.unnamedauthors": "{{num}} dianav {[plural(num) one: aozer, other: aozerien ]}", + "pad.savedrevs.marked": "Merket eo an adweladenn-mañ evel adweladenn gwiriet", "pad.userlist.entername": "Ebarzhit hoc'h anv", "pad.userlist.unnamed": "dizanv", "pad.userlist.guest": "Den pedet", "pad.userlist.deny": "Nac'h", - "pad.userlist.approve": "Aproui\u00f1", - "pad.editbar.clearcolors": "Diverka\u00f1 al livio\u00f9 stag ouzh an aozerien en teul a-bezh ?", - "pad.impexp.importbutton": "Enporzhia\u00f1 brema\u00f1", - "pad.impexp.importing": "Oc'h enporzhia\u00f1...", - "pad.impexp.confirmimport": "Ma vez enporzhiet ur restr e vo diverket ar pezh zo en teul a-vrema\u00f1. Ha sur oc'h e fell deoc'h mont betek penn ?", - "pad.impexp.convertFailed": "N'eus ket bet gallet enporzhia\u00f1 ar restr. Ober gant ur furmad teul all pe eila\u00f1\/pega\u00f1 gant an dorn.", - "pad.impexp.uploadFailed": "C'hwitet eo bet an enporzhia\u00f1. Klaskit en-dro.", + "pad.userlist.approve": "Aprouiñ", + "pad.editbar.clearcolors": "Diverkañ al livioù stag ouzh an aozerien en teul a-bezh ?", + "pad.impexp.importbutton": "Enporzhiañ bremañ", + "pad.impexp.importing": "Oc'h enporzhiañ...", + "pad.impexp.confirmimport": "Ma vez enporzhiet ur restr e vo diverket ar pezh zo en teul a-vremañ. Ha sur oc'h e fell deoc'h mont betek penn ?", + "pad.impexp.convertFailed": "N'eus ket bet gallet enporzhiañ ar restr. Ober gant ur furmad teul all pe eilañ/pegañ gant an dorn.", + "pad.impexp.uploadFailed": "C'hwitet eo bet an enporzhiañ. Klaskit en-dro.", "pad.impexp.importfailed": "C'hwitet eo an enporzhiadenn", - "pad.impexp.copypaste": "Eilit\/pegit, mar plij", - "pad.impexp.exportdisabled": "Diweredekaet eo ezporzhia\u00f1 d'ar furmad {{type}}. Kit e darempred gant merour ar reizhiad evit gouzout hiroc'h." -}
\ No newline at end of file + "pad.impexp.copypaste": "Eilit/pegit, mar plij", + "pad.impexp.exportdisabled": "Diweredekaet eo ezporzhiañ d'ar furmad {{type}}. Kit e darempred gant merour ar reizhiad evit gouzout hiroc'h." +} diff --git a/src/locales/ca.json b/src/locales/ca.json index ec521eca..f6870db8 100644 --- a/src/locales/ca.json +++ b/src/locales/ca.json @@ -1,70 +1,102 @@ { "@metadata": { "authors": [ + "Alvaro Vidal-Abarca", "Pginer", "Pitort", "Toniher" ] }, + "index.newPad": "Nou pad", + "index.createOpenPad": "o crea/obre un pad amb el nom:", "pad.toolbar.bold.title": "Negreta (Ctrl-B)", "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", "pad.toolbar.underline.title": "Subratllat (Ctrl-U)", "pad.toolbar.strikethrough.title": "Ratllat", "pad.toolbar.ol.title": "Llista ordenada", "pad.toolbar.ul.title": "Llista sense ordenar", - "pad.toolbar.indent.title": "Sagnat", - "pad.toolbar.unindent.title": "Sagnat invers", - "pad.toolbar.undo.title": "Desf\u00e9s (Ctrl-Z)", - "pad.toolbar.redo.title": "Ref\u00e9s (Ctrl-Y)", + "pad.toolbar.indent.title": "Sagnat (TAB)", + "pad.toolbar.unindent.title": "Sagnat invers (Majúsc+TAB)", + "pad.toolbar.undo.title": "Desfés (Ctrl-Z)", + "pad.toolbar.redo.title": "Refés (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Neteja els colors d'autoria", - "pad.toolbar.savedRevision.title": "Desa la revisi\u00f3", - "pad.toolbar.settings.title": "Configuraci\u00f3", - "pad.toolbar.showusers.title": "Mostra els usuaris d\u2019aquest pad", + "pad.toolbar.import_export.title": "Importa/exporta a partir de diferents formats de fitxer", + "pad.toolbar.timeslider.title": "LÃnia temporal", + "pad.toolbar.savedRevision.title": "Desa la revisió", + "pad.toolbar.settings.title": "Configuració", + "pad.toolbar.embed.title": "Comparteix i incrusta aquest pad", + "pad.toolbar.showusers.title": "Mostra els usuaris d’aquest pad", "pad.colorpicker.save": "Desa", - "pad.colorpicker.cancel": "Cancel\u00b7la", - "pad.loading": "S'est\u00e0 carregant...", - "pad.wrongPassword": "La contrasenya \u00e9s incorrecta", + "pad.colorpicker.cancel": "Cancel·la", + "pad.loading": "S'està carregant...", + "pad.passwordRequired": "Us cal una contrasenya per a accedir a aquest pad", + "pad.permissionDenied": "No teniu permisos per a accedir a aquest pad", + "pad.wrongPassword": "La contrasenya és incorrecta", + "pad.settings.padSettings": "Parà metres del pad", "pad.settings.myView": "La meva vista", "pad.settings.stickychat": "Xateja sempre a la pantalla", "pad.settings.colorcheck": "Colors d'autoria", - "pad.settings.linenocheck": "N\u00fameros de l\u00ednia", + "pad.settings.linenocheck": "Números de lÃnia", + "pad.settings.rtlcheck": "Llegir el contingut de dreta a esquerra?", "pad.settings.fontType": "Tipus de lletra:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "D'amplada fixa", "pad.settings.globalView": "Vista global", "pad.settings.language": "Llengua:", - "pad.importExport.import_export": "Importaci\u00f3\/exportaci\u00f3", + "pad.importExport.import_export": "Importació/exportació", "pad.importExport.import": "Puja qualsevol fitxer de text o document", + "pad.importExport.importSuccessful": "Hi ha hagut èxit!", + "pad.importExport.export": "Exporta el pad actual com a:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Text net", + "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Només podeu importar de text net o html. Per a opcions d'importació més avançades <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instal·leu l'Abiword</a>.", "pad.modals.connected": "Connectat.", - "pad.modals.forcereconnect": "For\u00e7a tornar a connectar", + "pad.modals.reconnecting": "S'està tornant a connectar al vostre pad…", + "pad.modals.forcereconnect": "Força tornar a connectar", + "pad.modals.userdup": "Obert en una altra finestra", + "pad.modals.userdup.explanation": "Aquest pad sembla que està obert en més d'una finestra de navegador de l'ordinador.", + "pad.modals.userdup.advice": "Torneu a connectar-vos per a utilitzar aquesta finestra.", "pad.modals.unauth": "No autoritzat", - "pad.modals.unauth.explanation": "Els vostres permisos han canviat mentre es visualitzava la p\u00e0gina. Proveu de reconnectar-vos.", - "pad.modals.looping": "Desconnectat.", - "pad.modals.initsocketfail": "El servidor no \u00e9s accessible.", - "pad.modals.initsocketfail.explanation": "No s'ha pogut connectar amb el servidor de sincronitzaci\u00f3.", - "pad.modals.slowcommit": "Desconnectat.", + "pad.modals.unauth.explanation": "Els vostres permisos han canviat mentre es visualitzava la pà gina. Proveu de reconnectar-vos.", + "pad.modals.looping.explanation": "Hi ha problemes de comunicació amb el servidor de sincronització.", + "pad.modals.looping.cause": "Potser us heu connectat a través d'un tallafocs o servidor intermediari incompatible.", + "pad.modals.initsocketfail": "El servidor no és accessible.", + "pad.modals.initsocketfail.explanation": "No s'ha pogut connectar amb el servidor de sincronització.", + "pad.modals.initsocketfail.cause": "Això és probablement a causa d'un problema amb el navegador o la connexió a Internet.", "pad.modals.slowcommit.explanation": "El servidor no respon.", + "pad.modals.slowcommit.cause": "Això podria ser a causa de problemes amb la connectivitat de la xarxa.", + "pad.modals.badChangeset.explanation": "El servidor de sincronització ha classificat com a il·legat una edició que heu fet.", + "pad.modals.badChangeset.cause": "Això pot ser degut a una configuració errònia del servidor o a algun altre comportament inesperat. Si us plau, si considereu que això és un error, contacteu amb l'administrador del servei. Intenteu reconnectar-vos per tal de continuar editant.", + "pad.modals.corruptPad.explanation": "El pad al qual esteu intentant accedir està corrupte.", + "pad.modals.corruptPad.cause": "Això pot ser degut a una configuració errònia del servidor o a algun altre comportament inesperat. Si us plau, contacteu amb l'administrador del servei.", "pad.modals.deleted": "Suprimit.", + "pad.modals.deleted.explanation": "S'ha suprimit el pad.", "pad.modals.disconnected": "Heu estat desconnectat.", - "pad.modals.disconnected.cause": "El servidor sembla que no est\u00e0 disponible. Notifiqueu-nos si continua passant.", - "pad.share.readonly": "Nom\u00e9s de lectura", - "pad.share.link": "Enlla\u00e7", + "pad.modals.disconnected.explanation": "S'ha perdut la connexió amb el servidor", + "pad.modals.disconnected.cause": "El servidor sembla que no està disponible. Notifiqueu a l'administrador del servei si continua passant.", + "pad.share": "Comparteix el pad", + "pad.share.readonly": "Només de lectura", + "pad.share.link": "Enllaç", + "pad.share.emebdcode": "Incrusta l'URL", "pad.chat": "Xat", + "pad.chat.title": "Obre el xat d'aquest pad.", + "pad.chat.loadmessages": "Carrega més missatges", + "timeslider.pageTitle": "LÃnia temporal — {{appTitle}}", + "timeslider.toolbar.returnbutton": "Torna al pad", "timeslider.toolbar.authors": "Autors:", "timeslider.toolbar.authorsList": "No hi ha autors", "timeslider.toolbar.exportlink.title": "Exporta", - "timeslider.exportCurrent": "Exporta la versi\u00f3 actual com a:", - "timeslider.version": "Versi\u00f3 {{version}}", + "timeslider.exportCurrent": "Exporta la versió actual com a:", + "timeslider.version": "Versió {{version}}", "timeslider.saved": "Desat {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Gener", "timeslider.month.february": "Febrer", - "timeslider.month.march": "Mar\u00e7", + "timeslider.month.march": "Març", "timeslider.month.april": "Abril", "timeslider.month.may": "Maig", "timeslider.month.june": "Juny", @@ -74,7 +106,9 @@ "timeslider.month.october": "Octubre", "timeslider.month.november": "Novembre", "timeslider.month.december": "Desembre", - "pad.userlist.entername": "Introdu\u00efu el vostre nom", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor, other: autors ]} sense nom", + "pad.savedrevs.marked": "Aquesta revisió està marcada ara com a revisió desada", + "pad.userlist.entername": "Introduïu el vostre nom", "pad.userlist.unnamed": "sense nom", "pad.userlist.guest": "Convidat", "pad.userlist.deny": "Refusa", @@ -82,8 +116,10 @@ "pad.editbar.clearcolors": "Voleu netejar els colors d'autor del document sencer?", "pad.impexp.importbutton": "Importa ara", "pad.impexp.importing": "Important...", - "pad.impexp.convertFailed": "No \u00e9s possible d'importar aquest fitxer. Si us plau, podeu provar d'utilitzar un format diferent o copiar i enganxar manualment.", - "pad.impexp.uploadFailed": "Ha fallat la c\u00e0rrega. Torneu-ho a provar", - "pad.impexp.importfailed": "Ha fallat la importaci\u00f3", - "pad.impexp.copypaste": "Si us plau, copieu i enganxeu" -}
\ No newline at end of file + "pad.impexp.confirmimport": "En importar un fitxer se sobreescriurà el text actual del pad. Esteu segur que voleu continuar?", + "pad.impexp.convertFailed": "No és possible d'importar aquest fitxer. Si us plau, podeu provar d'utilitzar un format diferent o copiar i enganxar manualment.", + "pad.impexp.uploadFailed": "Ha fallat la cà rrega. Torneu-ho a provar", + "pad.impexp.importfailed": "Ha fallat la importació", + "pad.impexp.copypaste": "Si us plau, copieu i enganxeu", + "pad.impexp.exportdisabled": "Està inhabilitada l'exportació com a {{type}}. Contacteu amb el vostre administrador de sistemes per a més informació." +} diff --git a/src/locales/cs.json b/src/locales/cs.json index bf415f23..62a2302c 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -1,99 +1,126 @@ { "@metadata": { "authors": [ + "Jakubt", + "Jezevec", + "Juandev", + "Leanes", "Quinn" ] }, - "index.newPad": "Nov\u00fd Pad", - "index.createOpenPad": "nebo vytvo\u0159it\/otev\u0159\u00edt Pad jm\u00e9nem:", - "pad.toolbar.bold.title": "Tu\u010dn\u00e9 (Ctrl-B)", - "pad.toolbar.italic.title": "Kurz\u00edva (Ctrl-I)", - "pad.toolbar.underline.title": "Podtr\u017een\u00ed (Ctrl-U)", - "pad.toolbar.strikethrough.title": "P\u0159eskrtnut\u00e9", - "pad.toolbar.ol.title": "\u010c\u00edslovan\u00fd seznam", - "pad.toolbar.ul.title": "Ne\u010d\u00edslovan\u00fd seznam", - "pad.toolbar.indent.title": "Odsazen\u00ed", - "pad.toolbar.unindent.title": "P\u0159edsazen\u00ed", - "pad.toolbar.undo.title": "Zp\u011bt (Ctrl-Z)", + "index.newPad": "Založ nový Pad", + "index.createOpenPad": "nebo vytvoÅ™/otevÅ™i Pad s názvem:", + "pad.toolbar.bold.title": "TuÄný text (Ctrl-B)", + "pad.toolbar.italic.title": "KurzÃva (Ctrl-I)", + "pad.toolbar.underline.title": "Podtržené pÃsmo (Ctrl-U)", + "pad.toolbar.strikethrough.title": "PÅ™eskrtnuté pÃsmo", + "pad.toolbar.ol.title": "ÄŒÃslovaný seznam", + "pad.toolbar.ul.title": "NeÄÃslovaný seznam", + "pad.toolbar.indent.title": "OdsazenÃ", + "pad.toolbar.unindent.title": "PÅ™edsazenÃ", + "pad.toolbar.undo.title": "ZpÄ›t (Ctrl-Z)", "pad.toolbar.redo.title": "Opakovat (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Vymazat barvy autorstv\u00ed", - "pad.toolbar.import_export.title": "Importovat\/Exportovat z\/do jin\u00fdch form\u00e1t\u016f", - "pad.toolbar.timeslider.title": "Osa \u010dasu", - "pad.toolbar.savedRevision.title": "Ulo\u017een\u00e9 revize", - "pad.toolbar.settings.title": "Nastaven\u00ed", - "pad.toolbar.embed.title": "Um\u00edstit tento Pad", - "pad.toolbar.showusers.title": "Zobrazit u\u017eivatele u tohoto Padu", - "pad.colorpicker.save": "Ulo\u017eit", - "pad.colorpicker.cancel": "Zru\u0161it", - "pad.loading": "Na\u010d\u00edt\u00e1n\u00ed...", - "pad.passwordRequired": "Pot\u0159ebuje\u0161 zadat heslo pro p\u0159\u00edstup k tomuto Padu", - "pad.permissionDenied": "Nem\u00e1\u0161 p\u0159\u00edstupov\u00e9 opr\u00e1vn\u011bn\u00ed k tomuto Padu", - "pad.wrongPassword": "Tv\u00e9 heslo je \u0161patn\u00e9", - "pad.settings.padSettings": "Nastaven\u00ed Padu", - "pad.settings.myView": "Vlastn\u00ed pohled", - "pad.settings.stickychat": "Chat v\u017edy na obrazovce", - "pad.settings.colorcheck": "Barvy autorstv\u00ed", - "pad.settings.linenocheck": "\u010c\u00edsla \u0159\u00e1dk\u016f", - "pad.settings.fontType": "Typ p\u00edsma:", - "pad.settings.fontType.normal": "Norm\u00e1ln\u00ed", - "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Glob\u00e1ln\u00ed pohled", + "pad.toolbar.clearAuthorship.title": "Vymazat barvy autorů", + "pad.toolbar.import_export.title": "Importovat/Exportovat z/do jiných formátů", + "pad.toolbar.timeslider.title": "ÄŒasová osa", + "pad.toolbar.savedRevision.title": "Uložit revizi", + "pad.toolbar.settings.title": "NastavenÃ", + "pad.toolbar.embed.title": "SdÃlet a umÃstit tento Pad", + "pad.toolbar.showusers.title": "Zobrazit uživatele u tohoto Padu", + "pad.colorpicker.save": "Uložit", + "pad.colorpicker.cancel": "ZruÅ¡it", + "pad.loading": "NaÄÃtánÃ...", + "pad.passwordRequired": "Pro pÅ™Ãstup k tomuto Padu je tÅ™eba znát heslo", + "pad.permissionDenied": "Nemáte oprávnÄ›nà pro pÅ™Ãstup k tomuto Padu", + "pad.wrongPassword": "Nesprávné heslo", + "pad.settings.padSettings": "Nastavenà Padu", + "pad.settings.myView": "Vlastnà pohled", + "pad.settings.stickychat": "Chat vždy na obrazovce", + "pad.settings.colorcheck": "Barvy autorů", + "pad.settings.linenocheck": "ÄŒÃsla řádků", + "pad.settings.rtlcheck": "ÄŒÃst obsah zprava doleva?", + "pad.settings.fontType": "Typ pÃsma:", + "pad.settings.fontType.normal": "NormálnÃ", + "pad.settings.fontType.monospaced": "NeproporÄnÃ", + "pad.settings.globalView": "Globálnà pohled", "pad.settings.language": "Jazyk:", - "pad.importExport.import_export": "Import\/Export", - "pad.importExport.import": "Nahr\u00e1t libovoln\u00fd textov\u00fd soubor nebo dokument", - "pad.importExport.export": "Exportovat st\u00e1vaj\u00edc\u00ed Pad jako:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Nahrát libovolný textový soubor nebo dokument", + "pad.importExport.importSuccessful": "ÚspěšnÄ›!", + "pad.importExport.export": "Exportovat stávajÃcà Pad jako:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Prost\u00fd text", + "pad.importExport.exportplain": "Prostý text", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Importovat m\u016f\u017ee\u0161 pouze prost\u00fd text nebo HTML form\u00e1tov\u00e1n\u00ed. Pro pokro\u010dilej\u0161\u00ed funkce importu, pros\u00edm, nainstaluj \u201e<a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword<\/a>\u201c.", - "pad.modals.connected": "P\u0159ipojeno.", - "pad.modals.reconnecting": "Znovup\u0159ipojov\u00e1n\u00ed k tv\u00e9mu Padu\u2026", - "pad.modals.forcereconnect": "Vynutit znovup\u0159ipojen\u00ed", - "pad.modals.userdup.explanation": "Zd\u00e1 se, \u017ee tento Pad je na tomto po\u010d\u00edta\u010di otev\u0159en ve v\u00edce ne\u017e jednom okn\u011b.", - "pad.modals.userdup.advice": "Pro pou\u017eit\u00ed tohoto okna se mus\u00ed\u0161 znovu p\u0159ipojit.", - "pad.modals.unauth": "Nem\u00e1te autorizaci", - "pad.modals.unauth.explanation": "Va\u0161e opr\u00e1vn\u011bn\u00ed se zm\u011bnila, zat\u00edmco jste si prohl\u00ed\u017eel\/a toto okno. Zkuste se znovu p\u0159ipojit.", - "pad.modals.looping": "Odpojeno.", - "pad.modals.looping.explanation": "Nastaly probl\u00e9my p\u0159i komunikaci se synchroniza\u010dn\u00edm serverem.", - "pad.modals.looping.cause": "Mo\u017en\u00e1 jste p\u0159ipojeni p\u0159es nekompaktn\u00ed firewall nebo proxy.", - "pad.modals.initsocketfail": "Server je nedostupn\u00fd.", - "pad.modals.initsocketfail.explanation": "Nepoda\u0159ilo se p\u0159ipojit k synchroniza\u010dn\u00edmu serveru.", - "pad.modals.initsocketfail.cause": "Toto je pravd\u011bpodobn\u011b zp\u016fsobeno va\u0161\u00edm prohl\u00ed\u017ee\u010dem nebo p\u0159ipojen\u00edm k internetu.", - "pad.modals.slowcommit": "Odpojeno.", - "pad.modals.slowcommit.explanation": "Server neodpov\u00edd\u00e1.", - "pad.modals.slowcommit.cause": "M\u016f\u017ee to b\u00fdt zp\u016fsobeno probl\u00e9my s internetov\u00fdm p\u0159ipojen\u00edm.", - "pad.modals.deleted": "Odstran\u011bno.", - "pad.modals.deleted.explanation": "Tento Pad byl odebr\u00e1n.", - "pad.modals.disconnected": "Byl jsi odpojen.", - "pad.modals.disconnected.explanation": "P\u0159ipojen\u00ed k serveru bylo p\u0159eru\u0161eno", - "pad.modals.disconnected.cause": "Server m\u016f\u017ee b\u00fdt nedostupn\u00fd. Pros\u00edm, upozorni n\u00e1s, pokud bude tento probl\u00e9m p\u0159etrv\u00e1vat.", - "pad.share": "Sd\u00edlet tento Pad", - "pad.share.readonly": "Jen pro \u010dten\u00ed", + "pad.importExport.abiword.innerHTML": "Importovat můžeÅ¡ pouze prostý text nebo HTML formátovánÃ. Pro pokroÄilejÅ¡Ã funkce importu, prosÃm, nainstaluj „<a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword</a>“.", + "pad.modals.connected": "PÅ™ipojeno.", + "pad.modals.reconnecting": "ZnovupÅ™ipojovánà k Padu…", + "pad.modals.forcereconnect": "Vynutit znovupÅ™ipojenÃ", + "pad.modals.userdup": "OtevÅ™eno v jiném oknÄ›", + "pad.modals.userdup.explanation": "Zdá se, že tento Pad je na tomto poÄÃtaÄi otevÅ™en ve vÃce než jednom oknÄ›.", + "pad.modals.userdup.advice": "Pro použità tohoto okna je tÅ™eba se znovu pÅ™ipojit.", + "pad.modals.unauth": "Nemáte autorizaci", + "pad.modals.unauth.explanation": "VaÅ¡e oprávnÄ›nà se zmÄ›nila, zatÃmco jste si prohlÞel/a toto okno. Zkuste se znovu pÅ™ipojit.", + "pad.modals.looping.explanation": "Nastaly problémy pÅ™i komunikaci se synchronizaÄnÃm serverem.", + "pad.modals.looping.cause": "Možná jste pÅ™ipojeni pÅ™es nekompaktnà firewall nebo proxy.", + "pad.modals.initsocketfail": "Server je nedostupný.", + "pad.modals.initsocketfail.explanation": "NepodaÅ™ilo se pÅ™ipojit k synchronizaÄnÃmu serveru.", + "pad.modals.initsocketfail.cause": "Toto je pravdÄ›podobnÄ› způsobeno vaÅ¡Ãm prohlÞeÄem nebo pÅ™ipojenÃm k internetu.", + "pad.modals.slowcommit.explanation": "Server neodpovÃdá.", + "pad.modals.slowcommit.cause": "Může to být způsobeno problémy s internetovým pÅ™ipojenÃm.", + "pad.modals.badChangeset.explanation": "Editace, kterou jste uÄinili byla vyhodnocena jako zakázaná syncronizacà serveru.", + "pad.modals.badChangeset.cause": "To může být způsobeno Å¡patnou konfiguracà serveru, nebo jiným neoÄekávaným chovánÃm. Kontaktujte prosÃm správce služby, pokud i myslÃte, že se jedná o chybu. Zkuste se pÅ™ipojit znovu, pokud chcete pokraÄovat v psanÃ.", + "pad.modals.corruptPad.explanation": "Pad, ke kterému se snažÃte pÅ™ipojit je poÅ¡kozen.", + "pad.modals.corruptPad.cause": "To může být kvůli Å¡patné konfiguraci serveru, nebo kvůli jinému neoÄekávanému chovánÃ. Kontaktujte prosÃm správce služby.", + "pad.modals.deleted": "OdstranÄ›no.", + "pad.modals.deleted.explanation": "Tento Pad byl odebrán.", + "pad.modals.disconnected": "Byl jste odpojen.", + "pad.modals.disconnected.explanation": "PÅ™ipojenà k serveru bylo pÅ™eruÅ¡eno", + "pad.modals.disconnected.cause": "Server může být nedostupný. UpozornÄ›te administrátora služby, pokud se to bude opakovat.", + "pad.share": "SdÃlet tento Pad", + "pad.share.readonly": "Jen pro ÄtenÃ", "pad.share.link": "Odkaz", - "pad.share.emebdcode": "Vlo\u017eit URL", + "pad.share.emebdcode": "Vložit URL", "pad.chat": "Chat", - "pad.chat.title": "Otev\u0159\u00edt chat tohoto Padu.", - "timeslider.pageTitle": "Osa \u010dasu {{appTitle}}", - "timeslider.toolbar.returnbutton": "N\u00e1vrat do Padu", - "timeslider.toolbar.authors": "Auto\u0159i:", - "timeslider.toolbar.authorsList": "Bez autor\u016f", - "timeslider.exportCurrent": "Exportovat nyn\u011bj\u0161\u00ed verzi jako:", + "pad.chat.title": "OtevÅ™Ãt chat tohoto Padu.", + "pad.chat.loadmessages": "NaÄÃst vÃce zpráv", + "timeslider.pageTitle": "ÄŒasová osa {{appTitle}}", + "timeslider.toolbar.returnbutton": "Návrat do Padu", + "timeslider.toolbar.authors": "AutoÅ™i:", + "timeslider.toolbar.authorsList": "Bez autorů", + "timeslider.toolbar.exportlink.title": "Exportovat", + "timeslider.exportCurrent": "Exportovat nynÄ›jÅ¡Ã verzi jako:", "timeslider.version": "Verze {{version}}", - "timeslider.saved": "Ulo\u017eeno {{day}} {{month}} {{year}}", + "timeslider.saved": "Uloženo {{day}} {{month}} {{year}}", "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "leden", - "timeslider.month.february": "\u00fanor", - "timeslider.month.march": "b\u0159ezen", + "timeslider.month.february": "únor", + "timeslider.month.march": "bÅ™ezen", "timeslider.month.april": "duben", - "timeslider.month.may": "kv\u011bten", - "timeslider.month.june": "\u010derven", - "timeslider.month.july": "\u010dervenec", + "timeslider.month.may": "kvÄ›ten", + "timeslider.month.june": "Äerven", + "timeslider.month.july": "Äervenec", "timeslider.month.august": "srpen", - "timeslider.month.september": "z\u00e1\u0159\u00ed", - "timeslider.month.october": "\u0159\u00edjen", + "timeslider.month.september": "zářÃ", + "timeslider.month.october": "Å™Ãjen", "timeslider.month.november": "listopad", - "timeslider.month.december": "prosinec" -}
\ No newline at end of file + "timeslider.month.december": "prosinec", + "timeslider.unnamedauthors": "{{num}} {[ plural(num) one: nejmenovaný Autor, few: nejmenovanà AutoÅ™i, other: nejmenovaných Autorů ]}", + "pad.savedrevs.marked": "Tato revize je nynà oznaÄena jako uložená", + "pad.userlist.entername": "Zadejte své jméno", + "pad.userlist.unnamed": "nejmenovaný", + "pad.userlist.guest": "Host", + "pad.userlist.deny": "Zakázat", + "pad.userlist.approve": "Povolit", + "pad.editbar.clearcolors": "Odstranit barvy autorů z celého dokumentu?", + "pad.impexp.importbutton": "Importovat", + "pad.impexp.importing": "ImportovánÃ…", + "pad.impexp.confirmimport": "Import souboru pÅ™epÃÅ¡e aktuálnà text v padu. Opravdu chcete tuto akci provést?", + "pad.impexp.convertFailed": "Tento soubor nelze importovat. Použijte prosÃm jiný formát dokumentu nebo nakopÃrujte text ruÄnÄ›", + "pad.impexp.uploadFailed": "Nahrávánà selhalo, zkuste to znovu", + "pad.impexp.importfailed": "Import selhal", + "pad.impexp.copypaste": "Vložte prosÃm kopii", + "pad.impexp.exportdisabled": "Export do formátu {{type}} je zakázán. Kontaktujte svého administrátora pro zjiÅ¡tÄ›nà detailů." +} diff --git a/src/locales/da.json b/src/locales/da.json index e7cde1f5..a6a07d14 100644 --- a/src/locales/da.json +++ b/src/locales/da.json @@ -2,45 +2,47 @@ "@metadata": { "authors": [ "Christian List", - "Peter Alberti" + "Peter Alberti", + "Steenth" ] }, "index.newPad": "Ny Pad", - "index.createOpenPad": "eller opret\/\u00e5bn en Pad med navnet:", + "index.createOpenPad": "eller opret/Ã¥bn en Pad med navnet:", "pad.toolbar.bold.title": "Fed (Ctrl-B)", "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", "pad.toolbar.underline.title": "Understregning (Ctrl-U)", "pad.toolbar.strikethrough.title": "Gennemstregning", "pad.toolbar.ol.title": "Sorteret liste", "pad.toolbar.ul.title": "Usorteret liste", - "pad.toolbar.indent.title": "Indrykning", - "pad.toolbar.unindent.title": "Ryk ud", + "pad.toolbar.indent.title": "Indrykning (TAB)", + "pad.toolbar.unindent.title": "Ryk ud (Shift+TAB)", "pad.toolbar.undo.title": "Fortryd (Ctrl-Z)", "pad.toolbar.redo.title": "Annuller Fortryd (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Fjern farver for forfatterskab", - "pad.toolbar.import_export.title": "Import\/eksport fra\/til forskellige filformater", + "pad.toolbar.import_export.title": "Import/eksport fra/til forskellige filformater", "pad.toolbar.timeslider.title": "Timeslider", - "pad.toolbar.savedRevision.title": "Gemte revisioner", + "pad.toolbar.savedRevision.title": "Gem Revision", "pad.toolbar.settings.title": "Indstillinger", - "pad.toolbar.embed.title": "Integrer denne pad", - "pad.toolbar.showusers.title": "Vis brugere p\u00e5 denne pad", + "pad.toolbar.embed.title": "Del og integrer denne pad", + "pad.toolbar.showusers.title": "Vis brugere pÃ¥ denne pad", "pad.colorpicker.save": "Gem", "pad.colorpicker.cancel": "Afbryd", - "pad.loading": "Indl\u00e6ser ...", - "pad.passwordRequired": "Du skal bruge en adgangskode for at f\u00e5 adgang til denne pad", - "pad.permissionDenied": "Du har ikke tilladelse til at f\u00e5 adgang til denne pad.", + "pad.loading": "Indlæser ...", + "pad.passwordRequired": "Du skal bruge en adgangskode for at fÃ¥ adgang til denne pad", + "pad.permissionDenied": "Du har ikke tilladelse til at fÃ¥ adgang til denne pad.", "pad.wrongPassword": "Din adgangskode er forkert", "pad.settings.padSettings": "Pad indstillinger", "pad.settings.myView": "Min visning", - "pad.settings.stickychat": "Chat altid p\u00e5 sk\u00e6rmen", + "pad.settings.stickychat": "Chat altid pÃ¥ skærmen", "pad.settings.colorcheck": "Forfatterskabsfarver", "pad.settings.linenocheck": "Linjenumre", + "pad.settings.rtlcheck": "Læse indhold fra højre mod venstre?", "pad.settings.fontType": "Skrifttype:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Fastbredde", "pad.settings.globalView": "Global visning", "pad.settings.language": "Sprog:", - "pad.importExport.import_export": "Import\/Eksport", + "pad.importExport.import_export": "Import/Eksport", "pad.importExport.import": "Uploade en tekstfil eller dokument", "pad.importExport.importSuccessful": "Vellykket!", "pad.importExport.export": "Eksporter aktuelle pad som:", @@ -50,45 +52,47 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan kun importere fra almindelig tekst eller HTML-formater. For mere avancerede importfunktioner, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer venligst abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Du kan kun importere fra almindelig tekst eller HTML-formater. For mere avancerede importfunktioner, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer venligst abiword</a>.", "pad.modals.connected": "Forbundet.", "pad.modals.reconnecting": "Genopretter forbindelsen til din pad...", "pad.modals.forcereconnect": "Gennemtving genoprettelse af forbindelsen", - "pad.modals.userdup": "\u00c5bnet i et andet vindue", - "pad.modals.userdup.explanation": "Denne pad synes at v\u00e6re \u00e5bnet i mere end \u00e9t browservindue p\u00e5 denne computer.", + "pad.modals.userdup": "Ã…bnet i et andet vindue", + "pad.modals.userdup.explanation": "Denne pad synes at være Ã¥bnet i mere end ét browservindue pÃ¥ denne computer.", "pad.modals.userdup.advice": "Tilslut igen for at bruge dette vindue i stedet.", "pad.modals.unauth": "Ikke tilladt", - "pad.modals.unauth.explanation": "Dine rettigheder er \u00e6ndret mens du ser p\u00e5 denne side. Pr\u00f8v at oprette forbindelsen igen.", - "pad.modals.looping": "Forbindelse afbrudt.", + "pad.modals.unauth.explanation": "Dine rettigheder er ændret mens du ser pÃ¥ denne side. Prøv at oprette forbindelsen igen.", "pad.modals.looping.explanation": "Der er kommunikationsproblemer med synkroniseringsserveren.", - "pad.modals.looping.cause": "M\u00e5ske tilsluttede du via en inkompatibel firewall eller proxy.", - "pad.modals.initsocketfail": "Serveren er ikke tilg\u00e6ngelig.", + "pad.modals.looping.cause": "MÃ¥ske tilsluttede du via en inkompatibel firewall eller proxy.", + "pad.modals.initsocketfail": "Serveren er ikke tilgængelig.", "pad.modals.initsocketfail.explanation": "Kunne ikke oprette forbindelse til synkroniseringsserveren.", "pad.modals.initsocketfail.cause": "Det skyldes sandsynligvis et problem med din browser eller din internetforbindelse.", - "pad.modals.slowcommit": "Forbindelse afbrudt.", "pad.modals.slowcommit.explanation": "Serveren svarer ikke.", - "pad.modals.slowcommit.cause": "Det kan skyldes problemer med netv\u00e6rksforbindelsen.", + "pad.modals.slowcommit.cause": "Det kan skyldes problemer med netværksforbindelsen.", + "pad.modals.badChangeset.explanation": "En redigering, du har foretaget, blev klassificeret ulovlig af synkroniseringsserveren.", + "pad.modals.badChangeset.cause": "Dette kan skyldes en forkert konfiguration af serveren eller en anden uventet adfærd. Kontakt venligst service administratoren, hvis du føler, at dette er en fejl. Prøv at oprette forbindelsen igen for at fortsætte med at redigere.", + "pad.modals.corruptPad.explanation": "Den pad du prøver at fÃ¥ adgang til er beskadiget.", + "pad.modals.corruptPad.cause": "Dette kan skyldes en forkert konfiguration af serveren eller en anden uventet adfærd. Kontakt venligst service administratoren.", "pad.modals.deleted": "Slettet.", "pad.modals.deleted.explanation": "Denne pad er blevet fjernet.", - "pad.modals.disconnected": "Du har f\u00e5et afbrudt forbindelsen.", + "pad.modals.disconnected": "Du har fÃ¥et afbrudt forbindelsen.", "pad.modals.disconnected.explanation": "Forbindelsen til serveren blev afbrudt", - "pad.modals.disconnected.cause": "Serveren er muligvis ikke tilg\u00e6ngelig. G\u00f8r os venligst opm\u00e6rksom p\u00e5 hvis dette forts\u00e6tter med at ske.", + "pad.modals.disconnected.cause": "Serveren er muligvis ikke tilgængelig. Informer service administratoren hvis dette fortsætter med at ske.", "pad.share": "Del denne pad", "pad.share.readonly": "Skrivebeskyttet", "pad.share.link": "Link", "pad.share.emebdcode": "Integrerings URL", "pad.chat": "Chat", - "pad.chat.title": "\u00c5ben chat for denne pad.", - "pad.chat.loadmessages": "Indl\u00e6s flere meddelelser", + "pad.chat.title": "Ã…ben chat for denne pad.", + "pad.chat.loadmessages": "Indlæs flere meddelelser", "timeslider.pageTitle": "{{appTitle}} Timeslider", "timeslider.toolbar.returnbutton": "Tilbage til pad", "timeslider.toolbar.authors": "Forfattere:", "timeslider.toolbar.authorsList": "Ingen forfattere", - "timeslider.toolbar.exportlink.title": "Eksport\u00e9r", + "timeslider.toolbar.exportlink.title": "Eksportér", "timeslider.exportCurrent": "Eksporter aktuelle version som:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Gemt den {{day}}.{{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januar", "timeslider.month.february": "februar", "timeslider.month.march": "marts", @@ -101,21 +105,20 @@ "timeslider.month.october": "oktober", "timeslider.month.november": "november", "timeslider.month.december": "december", - "timeslider.unnamedauthor": "{{num}} unavngiven forfatter", - "timeslider.unnamedauthors": "{{num}} unavngivne forfattere", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: unavngiven forfatter, other: unavngivne forfattere]}", "pad.savedrevs.marked": "Denne revision er nu markeret som en gemt revision", "pad.userlist.entername": "Indtast dit navn", "pad.userlist.unnamed": "ikke-navngivet", - "pad.userlist.guest": "G\u00e6st", - "pad.userlist.deny": "N\u00e6gt", + "pad.userlist.guest": "Gæst", + "pad.userlist.deny": "Nægt", "pad.userlist.approve": "Godkend", "pad.editbar.clearcolors": "Fjern farver for ophavsmand i hele dokumentet?", "pad.impexp.importbutton": "Importer nu", "pad.impexp.importing": "Importerer...", - "pad.impexp.confirmimport": "At importere en fil, vil overskrives den aktuelle pad tekst. Er du sikker p\u00e5 du vil forts\u00e6tte?", - "pad.impexp.convertFailed": "Vi var ikke i stand til at importere denne fil. Brug et andet dokument-format eller kopier og s\u00e6t ind manuelt", - "pad.impexp.uploadFailed": "Upload mislykkedes, pr\u00f8v igen", + "pad.impexp.confirmimport": "At importere en fil, vil overskrives den aktuelle pad tekst. Er du sikker pÃ¥ du vil fortsætte?", + "pad.impexp.convertFailed": "Vi var ikke i stand til at importere denne fil. Brug et andet dokument-format eller kopier og sæt ind manuelt", + "pad.impexp.uploadFailed": "Upload mislykkedes, prøv igen", "pad.impexp.importfailed": "Importen mislykkedes", - "pad.impexp.copypaste": "Venligst kopier og s\u00e6t ind", + "pad.impexp.copypaste": "Venligst kopier og sæt ind", "pad.impexp.exportdisabled": "Eksportere i {{type}} format er deaktiveret. Kontakt din systemadministrator for mere information." -}
\ No newline at end of file +} diff --git a/src/locales/de.json b/src/locales/de.json index 20938422..05a9af79 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1,35 +1,35 @@ { "@metadata": { - "authors": { - "0": "Metalhead64", - "1": "Mklehr", - "2": "Nipsky", - "4": "Wikinaut" - } + "authors": [ + "Metalhead64", + "Mklehr", + "Nipsky", + "Wikinaut" + ] }, "index.newPad": "Neues Pad", - "index.createOpenPad": "Pad mit folgendem Namen \u00f6ffnen:", + "index.createOpenPad": "Pad mit folgendem Namen öffnen:", "pad.toolbar.bold.title": "Fett (Strg-B)", "pad.toolbar.italic.title": "Kursiv (Strg-I)", "pad.toolbar.underline.title": "Unterstrichen (Strg-U)", "pad.toolbar.strikethrough.title": "Durchgestrichen", "pad.toolbar.ol.title": "Nummerierte Liste", "pad.toolbar.ul.title": "Ungeordnete Liste", - "pad.toolbar.indent.title": "Einr\u00fccken", - "pad.toolbar.unindent.title": "Ausr\u00fccken", - "pad.toolbar.undo.title": "R\u00fcckg\u00e4ngig (Strg-Z)", + "pad.toolbar.indent.title": "Einrücken (TAB)", + "pad.toolbar.unindent.title": "Ausrücken (Shift+TAB)", + "pad.toolbar.undo.title": "Rückgängig (Strg-Z)", "pad.toolbar.redo.title": "Wiederholen (Strg-Y)", - "pad.toolbar.clearAuthorship.title": "Autorenfarben zur\u00fccksetzen", - "pad.toolbar.import_export.title": "Import\/Export in verschiedenen Dateiformaten", + "pad.toolbar.clearAuthorship.title": "Autorenfarben zurücksetzen", + "pad.toolbar.import_export.title": "Import/Export von/zu verschiedenen Dateiformaten", "pad.toolbar.timeslider.title": "Pad-Versionsgeschichte anzeigen", - "pad.toolbar.savedRevision.title": "Version speichern", + "pad.toolbar.savedRevision.title": "Version markieren", "pad.toolbar.settings.title": "Einstellungen", - "pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten", + "pad.toolbar.embed.title": "Pad teilen oder einbetten", "pad.toolbar.showusers.title": "Aktuell verbundene Benutzer anzeigen", "pad.colorpicker.save": "Speichern", "pad.colorpicker.cancel": "Abbrechen", - "pad.loading": "Laden \u2026", - "pad.passwordRequired": "Sie ben\u00f6tigen ein Passwort, um auf dieses Pad zuzugreifen", + "pad.loading": "Laden …", + "pad.passwordRequired": "Sie benötigen ein Passwort, um auf dieses Pad zuzugreifen", "pad.permissionDenied": "Sie haben keine Berechtigung, um auf dieses Pad zuzugreifen", "pad.wrongPassword": "Ihr Passwort war falsch", "pad.settings.padSettings": "Pad Einstellungen", @@ -37,13 +37,14 @@ "pad.settings.stickychat": "Chat immer anzeigen", "pad.settings.colorcheck": "Autorenfarben anzeigen", "pad.settings.linenocheck": "Zeilennummern", + "pad.settings.rtlcheck": "Inhalt von rechts nach links lesen?", "pad.settings.fontType": "Schriftart:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Gemeinsame Ansicht", "pad.settings.language": "Sprache:", - "pad.importExport.import_export": "Import\/Export", - "pad.importExport.import": "Datei oder Dokument hochladen", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Text-Datei oder Dokument hochladen", "pad.importExport.importSuccessful": "Erfolgreich!", "pad.importExport.export": "Aktuelles Pad exportieren als:", "pad.importExport.exporthtml": "HTML", @@ -52,48 +53,50 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Sie k\u00f6nnen nur aus Klartext oder HTML-Formaten importieren. F\u00fcr mehr erweiterte Importfunktionen <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installieren Sie bitte abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Sie können nur aus Klartext oder HTML-Formaten importieren. Für mehr erweiterte Importfunktionen <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installieren Sie bitte abiword</a>.", "pad.modals.connected": "Verbunden.", - "pad.modals.reconnecting": "Wiederherstellen der Verbindung \u2026", + "pad.modals.reconnecting": "Wiederherstellen der Verbindung …", "pad.modals.forcereconnect": "Erneut Verbinden", - "pad.modals.userdup": "In einem anderen Fenster ge\u00f6ffnet", - "pad.modals.userdup.explanation": "Dieses Pad scheint in mehr als einem Browser-Fenster auf diesem Computer ge\u00f6ffnet zu sein.", + "pad.modals.userdup": "In einem anderen Fenster geöffnet", + "pad.modals.userdup.explanation": "Dieses Pad scheint in mehr als einem Browser-Fenster auf diesem Computer geöffnet zu sein.", "pad.modals.userdup.advice": "Um dieses Fenster zu benutzen, verbinden Sie bitte erneut.", "pad.modals.unauth": "Nicht authorisiert.", - "pad.modals.unauth.explanation": "Ihre Zugriffsberechtigung f\u00fcr dieses Pad hat sich zwischenzeitlich ge\u00e4ndert. Bitte versuchen Sie, das Pad erneut aufzurufen.", - "pad.modals.looping": "Verbindung unterbrochen.", + "pad.modals.unauth.explanation": "Ihre Zugriffsberechtigung für dieses Pad hat sich zwischenzeitlich geändert. Sie können versuchen das Pad erneut aufzurufen.", "pad.modals.looping.explanation": "Es gibt Probleme bei der Kommunikation mit dem Pad-Server.", - "pad.modals.looping.cause": "M\u00f6glicherweise sind Sie durch eine inkompatible Firewall oder \u00fcber einen inkompatiblen Proxy mit dem Padserver verbunden.", + "pad.modals.looping.cause": "Möglicherweise sind Sie durch eine inkompatible Firewall oder über einen inkompatiblen Proxy mit dem Pad-Server verbunden.", "pad.modals.initsocketfail": "Pad-Server nicht erreichbar.", "pad.modals.initsocketfail.explanation": "Es konnte keine Verbindung zum Pad-Server hergestellt werden.", - "pad.modals.initsocketfail.cause": "Dies k\u00f6nnte an Ihrem Browser oder Ihrer Internet-Verbindung liegen.", - "pad.modals.slowcommit": "Verbindung unterbrochen.", + "pad.modals.initsocketfail.cause": "Dies könnte an Ihrem Browser oder Ihrer Internet-Verbindung liegen.", "pad.modals.slowcommit.explanation": "Der Pad-Server reagiert nicht.", - "pad.modals.slowcommit.cause": "Dies k\u00f6nnte ein Netzwerkverbindungsproblem sein oder eine momentane \u00dcberlastung des Pad-Servers.", - "pad.modals.deleted": "Gel\u00f6scht.", - "pad.modals.deleted.explanation": "Dieses Pad wurde gel\u00f6scht.", + "pad.modals.slowcommit.cause": "Dies könnte ein Netzwerkverbindungsproblem sein oder eine momentane Überlastung des Pad-Servers.", + "pad.modals.badChangeset.explanation": "Eine von Ihnen gemachte Änderung wurde vom Pad-Server als ungültig eingestuft.", + "pad.modals.badChangeset.cause": "Dies könnte aufgrund einer falschen Serverkonfiguration oder eines anderen unerwarteten Verhaltens passiert sein. Bitte kontaktiere den Diensteadministrator, falls du glaubst, dass es sich um einen Fehler handelt. Versuche dich erneut zu verbinden, um mit dem Bearbeiten fortzufahren.", + "pad.modals.corruptPad.explanation": "Das Pad, auf das du zugreifen willst, ist beschädigt.", + "pad.modals.corruptPad.cause": "Dies könnte an einer falschen Serverkonfiguration oder eines anderen unerwarteten Verhaltens liegen. Bitte kontaktiere den Diensteadministrator.", + "pad.modals.deleted": "Gelöscht.", + "pad.modals.deleted.explanation": "Dieses Pad wurde entfernt.", "pad.modals.disconnected": "Verbindung unterbrochen.", "pad.modals.disconnected.explanation": "Die Verbindung zum Pad-Server wurde unterbrochen.", - "pad.modals.disconnected.cause": "M\u00f6glicherweise ist der Pad-Server nicht erreichbar. Bitte benachrichtigen Sie uns, falls dies weiterhin passiert.", - "pad.share": "Dieses Pad anderen mitteilen", - "pad.share.readonly": "Eingeschr\u00e4nkter Nur-Lese-Zugriff", + "pad.modals.disconnected.cause": "Möglicherweise ist der Pad-Server nicht erreichbar. Bitte benachrichtigen Sie den Dienstadministrator, falls dies weiterhin passiert.", + "pad.share": "Dieses Pad teilen", + "pad.share.readonly": "Eingeschränkter Nur-Lese-Zugriff", "pad.share.link": "Link", "pad.share.emebdcode": "In Webseite einbetten", "pad.chat": "Chat", - "pad.chat.title": "Den Chat dieses Pads \u00f6ffnen", + "pad.chat.title": "Den Chat dieses Pads öffnen", "pad.chat.loadmessages": "Weitere Nachrichten laden", "timeslider.pageTitle": "{{appTitle}} Pad-Versionsgeschichte", - "timeslider.toolbar.returnbutton": "Zur\u00fcck zum Pad", + "timeslider.toolbar.returnbutton": "Zurück zum Pad", "timeslider.toolbar.authors": "Autoren:", "timeslider.toolbar.authorsList": "keine Autoren", - "timeslider.toolbar.exportlink.title": "Export", + "timeslider.toolbar.exportlink.title": "Diese Version exportieren", "timeslider.exportCurrent": "Exportiere diese Version als:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Gespeichert am {{day}}.{{month}}.{{year}}", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januar", "timeslider.month.february": "Februar", - "timeslider.month.march": "M\u00e4rz", + "timeslider.month.march": "März", "timeslider.month.april": "April", "timeslider.month.may": "Mai", "timeslider.month.june": "Juni", @@ -103,21 +106,20 @@ "timeslider.month.october": "Oktober", "timeslider.month.november": "November", "timeslider.month.december": "Dezember", - "timeslider.unnamedauthor": "{{num}} unbenannter Autor", - "timeslider.unnamedauthors": "{{num}} unbenannte Autoren", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: unbenannter Autor, other: unbenannte Autoren ]}", "pad.savedrevs.marked": "Diese Version wurde jetzt als gespeicherte Version gekennzeichnet", "pad.userlist.entername": "Geben Sie Ihren Namen ein", "pad.userlist.unnamed": "unbenannt", "pad.userlist.guest": "Gast", "pad.userlist.deny": "Verweigern", "pad.userlist.approve": "Genehmigen", - "pad.editbar.clearcolors": "Autorenfarben im gesamten Dokument zur\u00fccksetzen?", + "pad.editbar.clearcolors": "Autorenfarben im gesamten Dokument zurücksetzen?", "pad.impexp.importbutton": "Jetzt importieren", - "pad.impexp.importing": "Importiere \u2026", - "pad.impexp.confirmimport": "Das Importieren einer Datei \u00fcberschreibt den aktuellen Text des Pads. Wollen Sie wirklich fortfahren?", - "pad.impexp.convertFailed": "Wir k\u00f6nnen diese Datei nicht importieren. Bitte verwenden Sie ein anderes Dokumentenformat oder \u00fcbertragen Sie den Text manuell.", + "pad.impexp.importing": "Importiere …", + "pad.impexp.confirmimport": "Das Importieren einer Datei überschreibt den aktuellen Text des Pads. Wollen Sie wirklich fortfahren?", + "pad.impexp.convertFailed": "Wir können diese Datei nicht importieren. Bitte verwenden Sie ein anderes Dokumentformat oder übertragen Sie den Text manuell.", "pad.impexp.uploadFailed": "Der Upload ist fehlgeschlagen. Bitte versuchen Sie es erneut.", "pad.impexp.importfailed": "Import fehlgeschlagen", - "pad.impexp.copypaste": "Bitte kopieren und einf\u00fcgen", - "pad.impexp.exportdisabled": "Der Export im {{type}}-Format ist deaktiviert. F\u00fcr Einzelheiten kontaktieren Sie bitte Ihren Systemadministrator." -}
\ No newline at end of file + "pad.impexp.copypaste": "Bitte kopieren und einfügen", + "pad.impexp.exportdisabled": "Der Export im {{type}}-Format ist deaktiviert. Für Einzelheiten kontaktieren Sie bitte Ihren Systemadministrator." +} diff --git a/src/locales/diq.json b/src/locales/diq.json index 62079d78..4a6630a3 100644 --- a/src/locales/diq.json +++ b/src/locales/diq.json @@ -2,75 +2,90 @@ "@metadata": { "authors": [ "Erdemaslancan", + "Gorizon", "Mirzali" ] }, "index.newPad": "Pedo newe", - "pad.toolbar.bold.title": "Qal\u0131n (Ctrl-B)", - "pad.toolbar.italic.title": "Nam\u0131te (Ctrl-I)", - "pad.toolbar.underline.title": "B\u0131nxet\u0131n (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Serxet\u0131n", - "pad.toolbar.ol.title": "Lista r\u00eazkerdiye", - "pad.toolbar.ul.title": "Lista r\u00eazn\u00eakerdiye", - "pad.toolbar.indent.title": "Ser\u00ea r\u00eaze", - "pad.toolbar.unindent.title": "V\u0131cente", + "pad.toolbar.bold.title": "Qalın (Ctrl-B)", + "pad.toolbar.italic.title": "Namıte (Ctrl-I)", + "pad.toolbar.underline.title": "Bınxetın (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Serxetın", + "pad.toolbar.ol.title": "Lista rêzkerdiye", + "pad.toolbar.ul.title": "Lista rêznêkerdiye", + "pad.toolbar.indent.title": "Serrêze (TAB)", + "pad.toolbar.unindent.title": "Teberdayış (Shift+TAB)", "pad.toolbar.undo.title": "Meke (Ctrl-Z)", - "pad.toolbar.redo.title": "F\u0131na b\u0131ke (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Reng\u00ea Nu\u015fto\u011fi\u00ea Ar\u0131stey", - "pad.toolbar.timeslider.title": "\u011e\u0131zag\u00ea zemani", - "pad.toolbar.savedRevision.title": "Rewizyon\u00ea Qeydbiyayey", - "pad.toolbar.settings.title": "Sazkerd\u0131\u015fi", - "pad.toolbar.embed.title": "Na ped degusnayiya", + "pad.toolbar.redo.title": "Fına bıke (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Rengê Nuştoğiê Arıstey", + "pad.toolbar.timeslider.title": "Ğızagê zemani", + "pad.toolbar.savedRevision.title": "Çımraviyarnayışi qeyd ke", + "pad.toolbar.settings.title": "Sazkerdışi", + "pad.toolbar.embed.title": "Na bloknot degusn u bıhesrne", + "pad.toolbar.showusers.title": "Na bloknot de karbera bıasne", "pad.colorpicker.save": "Qeyd ke", - "pad.colorpicker.cancel": "B\u0131texelne", + "pad.colorpicker.cancel": "Bıtexelne", "pad.loading": "Bar beno...", - "pad.settings.padSettings": "Sazkerd\u0131\u015f\u00ea Pedi", - "pad.settings.myView": "Asay\u0131\u015f\u00ea m\u0131", - "pad.settings.colorcheck": "Reng\u00ea nu\u015ftekariye", - "pad.settings.linenocheck": "N\u0131mrey\u00ea xeter", - "pad.settings.fontType": "Babeta nu\u015fti:", + "pad.wrongPassword": "Parola şıma ğeleta", + "pad.settings.padSettings": "Sazkerdışê Pedi", + "pad.settings.myView": "Asayışê mı", + "pad.settings.colorcheck": "Rengê nuştekariye", + "pad.settings.linenocheck": "Nımreyê xeter", + "pad.settings.fontType": "Babeta nuşti:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Yewca", - "pad.settings.globalView": "Asay\u0131\u015fo Global", - "pad.settings.language": "Z\u0131wan:", - "pad.importExport.import_export": "Zereday\u0131\u015f\/Teberday\u0131\u015f", + "pad.settings.globalView": "Asayışo Global", + "pad.settings.language": "Zıwan:", + "pad.importExport.import_export": "Zeredayış/Teberdayış", + "pad.importExport.importSuccessful": "Mıwafaq biye", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Duz metin", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "G\u0131rediya.", + "pad.modals.connected": "Gırediya.", "pad.modals.unauth": "Selahiyetdar niyo", - "pad.modals.looping": "B\u00eag\u0131rey\u0131n.", - "pad.modals.initsocketfail": "N\u00earesney\u00eano ciyageyro\u011fi.", - "pad.modals.slowcommit": "B\u00eag\u0131rey\u0131n.", + "pad.modals.initsocketfail": "Nêresneyêno ciyageyroği.", "pad.modals.deleted": "Esteriya.", "pad.modals.deleted.explanation": "Ena ped wedariye", - "pad.share": "Na ped v\u0131la ke", - "pad.share.readonly": "Tenya b\u0131wane", - "pad.share.link": "G\u0131re", + "pad.share": "Na ped vıla ke", + "pad.share.readonly": "Tenya bıwane", + "pad.share.link": "Gıre", "pad.share.emebdcode": "Degusnaye URL", - "pad.chat": "M\u0131hebet", - "pad.chat.title": "Qand\u00ea ena ped m\u0131hebet ake.", - "timeslider.pageTitle": "\u011e\u0131zag\u00ea zemani {{appTitle}}", - "timeslider.toolbar.returnbutton": "Peyser \u015fo ped", - "timeslider.toolbar.authors": "Nu\u015fto\u011fi:", - "timeslider.toolbar.authorsList": "Nu\u015fto\u011fi \u00e7\u0131niy\u00ea", - "timeslider.exportCurrent": "Versiyon\u00ea enewki teber de:", - "timeslider.version": "Versiyon\u00ea {{version}}", + "pad.chat": "Mıhebet", + "pad.chat.title": "Qandê ena ped mıhebet ake.", + "pad.chat.loadmessages": "Dehana zaf mesaci bar keri", + "timeslider.pageTitle": "Ğızagê zemani {{appTitle}}", + "timeslider.toolbar.returnbutton": "Peyser şo ped", + "timeslider.toolbar.authors": "Nuştoği:", + "timeslider.toolbar.authorsList": "Nuştoği çıniyê", + "timeslider.toolbar.exportlink.title": "Teber de", + "timeslider.exportCurrent": "Versiyonê enewki teber de:", + "timeslider.version": "Versiyonê {{version}}", "timeslider.saved": "{{day}} {{month}}, {{year}} de biyo qeyd", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u00c7ele", - "timeslider.month.february": "\u015e\u0131bate", - "timeslider.month.march": "Adar", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Çele", + "timeslider.month.february": "Zemherı", + "timeslider.month.march": "Mert", "timeslider.month.april": "Nisane", - "timeslider.month.may": "Gulane", + "timeslider.month.may": "Gúlan", "timeslider.month.june": "Heziran", - "timeslider.month.july": "Temuze", + "timeslider.month.july": "Temuz", "timeslider.month.august": "Tebaxe", - "timeslider.month.september": "Ke\u015fkelun", - "timeslider.month.october": "T\u0131\u015frino Ver\u00ean", - "timeslider.month.november": "T\u0131\u015frino Pey\u00ean", - "timeslider.month.december": "Kanun" -}
\ No newline at end of file + "timeslider.month.september": "KeÅŸkelun", + "timeslider.month.october": "Tışrino Verên", + "timeslider.month.november": "Tışrino Peyên", + "timeslider.month.december": "Kanun", + "timeslider.unnamedauthors": "{{num}} unnamed {[plural(num) zu: nuÅŸtoÄŸ, zewbi: nustoÄŸi ]}", + "pad.userlist.entername": "Namey ÄŸo cı kewe", + "pad.userlist.unnamed": "Name nébıyo", + "pad.userlist.guest": "Meyman", + "pad.userlist.deny": "Red ke", + "pad.userlist.approve": "Tesdiq ke", + "pad.editbar.clearcolors": "Wesiqa de renge nuÅŸtoÄŸey bıesterneye?", + "pad.impexp.importbutton": "Nıka miyan ke", + "pad.impexp.importing": "Deyeno azere...", + "pad.impexp.importfailed": "Zer kerdış mıwafaq nebı", + "pad.impexp.copypaste": "Reca keme kopya pronayış bıkeri" +} diff --git a/src/locales/dsb.json b/src/locales/dsb.json new file mode 100644 index 00000000..a24536d4 --- /dev/null +++ b/src/locales/dsb.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "index.newPad": "Nowy zapisnik", + "index.createOpenPad": "abo napóraj/wócyÅ„ zapisnik z mjenim:", + "pad.toolbar.bold.title": "Tucny (Strg-B)", + "pad.toolbar.italic.title": "Kursiwny (Strg-I)", + "pad.toolbar.underline.title": "PódÅ¡marnuÅ› (Strg-U)", + "pad.toolbar.strikethrough.title": "PÅ›eÅ¡marnuÅ›", + "pad.toolbar.ol.title": "NumerÄ›rowana lisćina", + "pad.toolbar.ul.title": "Nalicenje", + "pad.toolbar.indent.title": "ZasunuÅ› (TAB)", + "pad.toolbar.unindent.title": "WusunuÅ› (Umsch+TAB)", + "pad.toolbar.undo.title": "AnulÄ›rowaÅ› (Strg-Z)", + "pad.toolbar.redo.title": "WóspjetowaÅ› (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Awtorowe barwy laÅ¡owaÅ›", + "pad.toolbar.import_export.title": "Import/Eksport z/do drugich datajowych formatow", + "pad.toolbar.timeslider.title": "Wersijowa historija", + "pad.toolbar.savedRevision.title": "Wersiju skÅ‚adowaÅ›", + "pad.toolbar.settings.title": "Nastajenja", + "pad.toolbar.embed.title": "ToÅ› ten zapisnik źěliÅ› a zasajźiÅ›", + "pad.toolbar.showusers.title": "Wužywarje na toÅ› tom zapisniku pokazaÅ›", + "pad.colorpicker.save": "SkÅ‚adowaÅ›", + "pad.colorpicker.cancel": "PÅ›etergnuÅ›", + "pad.loading": "Zacytujo se...", + "pad.passwordRequired": "TrjebaÅ¡ gronidÅ‚o, aby na toÅ› ten zapisnik pÅ›istup měł", + "pad.permissionDenied": "NjamaÅ¡ pÅ›istupne pÅ¡awo za toÅ› ten zapisnik.", + "pad.wrongPassword": "Twójo gronidÅ‚o jo wopaki byÅ‚o", + "pad.settings.padSettings": "Nastajenja zapisnika", + "pad.settings.myView": "Mój naglÄ›d", + "pad.settings.stickychat": "Chat pÅ›ecej na wobrazowce pokazaÅ›", + "pad.settings.colorcheck": "Awtorowe barwy", + "pad.settings.linenocheck": "Smužkowe numery", + "pad.settings.rtlcheck": "WopÅ›imjeÅ›e wótpÅ¡awa nalÄ›wo cytaÅ›?", + "pad.settings.fontType": "Pismowa družyna:", + "pad.settings.fontType.normal": "Normalny", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Globalny naglÄ›d", + "pad.settings.language": "RÄ›c:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Tekstowu dataju abo dokument nagraÅ›", + "pad.importExport.importSuccessful": "Wuspěšny!", + "pad.importExport.export": "Aktualny zapisnik eksportÄ›rowaÅ› ako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Lutny tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "MóžoÅ¡ jano z fprmatow lutnego teksta abo z HTML-formata importÄ›rowaÅ›. Za wÄ›cej rozÅ¡yrjone importÄ›rowaÅ„ske funkcije <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instalÄ›ruj pÅ¡osym Abiword</a>.", + "pad.modals.connected": "ZwÄ›zany.", + "pad.modals.reconnecting": "ZwÄ›zujo se znowego z twójim zapisnikom...", + "pad.modals.forcereconnect": "Znowego zwÄ›zaÅ›", + "pad.modals.userdup": "W drugem woknje wócynjony", + "pad.modals.userdup.explanation": "Zda se, až toÅ› ten zapisnik jo se we wÄ›cej ako jadnem woknje wobglÄ›dowaka na toÅ› tom licadÅ‚u wócyniÅ‚.", + "pad.modals.userdup.advice": "ZwÄ›zaj znowego, aby toÅ› to wokno mÄ›sto togo wužywaÅ‚.", + "pad.modals.unauth": "NjeawtorizÄ›rowany", + "pad.modals.unauth.explanation": "PÅ›i wobglÄ›dowanju toÅ› togo boka su se twóje pÅ¡awa zmÄ›nili. Wopytaj se znowego zwÄ›zaÅ›.", + "pad.modals.looping.explanation": "Su komunikaciske problemy ze synchronizÄ›rowaÅ„skim serwerom.", + "pad.modals.looping.cause": "Snaź sy pÅ›ez njekompatibelnu wognjowu murju abo proksy zwÄ›zany.", + "pad.modals.initsocketfail": "Serwer njejo dojÅ›piwajobny.", + "pad.modals.initsocketfail.explanation": "Zwisk ze synchronizÄ›rowaÅ„skim serwerom njejo móžno.", + "pad.modals.initsocketfail.cause": "To jo nejskerjej problem z twójim wobglÄ›dowakom abo twójim internetnym zwiskom.", + "pad.modals.slowcommit.explanation": "Serwer njewótegranja.", + "pad.modals.slowcommit.cause": "To by mógÅ‚o problem seÅ›owego zwiska byÅ›.", + "pad.modals.badChangeset.explanation": "ZmÄ›na, kótaruž sy pÅ›ewjadÅ‚, jo se pÅ›ez synchronizÄ›rowaÅ„ski serwer ako njedowólonu markÄ›rowaÅ‚a.", + "pad.modals.badChangeset.cause": "To jo se snaź wopacneje serweroweje konfiguracije dla abo drugego njewócakanego zaźaeržanja dla staÅ‚o. PÅ¡osym staj se ze sÅ‚užbowym administratorom do zwiska, jolic se mysliÅ¡, až to jo zmólka. Wopytaj hyšći raz zwÄ›zaÅ›, aby z wobźěłowanim pókÅ¡acowaÅ‚.", + "pad.modals.corruptPad.explanation": "Zapisnik, na kótaryž coÅ¡ pÅ›istup měś, jo wobÅ¡kóźony.", + "pad.modals.corruptPad.cause": "To jo se snaź wopacneje serweroweje konfiguracije dla abo drugego njewócakanego zaźaržanja dla staÅ‚o. PÅ¡osym staj se ze sÅ‚užbowym administratorom do zwiska.", + "pad.modals.deleted": "WulaÅ¡owany.", + "pad.modals.deleted.explanation": "ToÅ› ten zapisnik jo se wótpóraÅ‚.", + "pad.modals.disconnected": "Zwisk jo pÅ›etergnjony.", + "pad.modals.disconnected.explanation": "Zwisk ze serwerom jo se zgubiÅ‚", + "pad.modals.disconnected.cause": "Serwer njestoj k dispoziciji. PÅ¡osym informÄ›ruj sÅ‚užbowego administratora, jolic to se dalej stawa.", + "pad.share": "ToÅ› ten zapisnik źěliÅ›", + "pad.share.readonly": "Jano cytajobny", + "pad.share.link": "Wótkaz", + "pad.share.emebdcode": "URL zasajźiÅ›", + "pad.chat": "Chat", + "pad.chat.title": "Chat za toÅ› ten zapisnik wócyniÅ›", + "pad.chat.loadmessages": "DalÅ¡ne powÄ›sći zacytaÅ›", + "timeslider.pageTitle": "{{appTitle}} - wersijowa historija", + "timeslider.toolbar.returnbutton": "SlÄ›dk k zapisnikoju", + "timeslider.toolbar.authors": "Awtory:", + "timeslider.toolbar.authorsList": "Žedne awtory", + "timeslider.toolbar.exportlink.title": "EksportÄ›rowaÅ›", + "timeslider.exportCurrent": "Aktualnu wersiju eksportÄ›rowaÅ› ako:", + "timeslider.version": "Wersija {{version}}", + "timeslider.saved": "SkÅ‚adowany {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januara", + "timeslider.month.february": "februara", + "timeslider.month.march": "mÄ›rca", + "timeslider.month.april": "apryla", + "timeslider.month.may": "maja", + "timeslider.month.june": "junija", + "timeslider.month.july": "julija", + "timeslider.month.august": "awgusta", + "timeslider.month.september": "septembra", + "timeslider.month.october": "oktobra", + "timeslider.month.november": "nowembra", + "timeslider.month.december": "decembra", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: awtor, two: awtora, few: awtory, other: awtorow ]} bźez mjenja", + "pad.savedrevs.marked": "ToÅ› ta wersija jo se nÄ›nto ako skÅ‚adowana wersija markÄ›rowaÅ‚a", + "pad.userlist.entername": "Zapódaj swójo mÄ›", + "pad.userlist.unnamed": "bźez mjenja", + "pad.userlist.guest": "Gósć", + "pad.userlist.deny": "WótpokazaÅ›", + "pad.userlist.approve": "PÅ›izwóliÅ›", + "pad.editbar.clearcolors": "Awtorowe barwy w ceÅ‚em dokumenÅ›e laÅ¡owaÅ›?", + "pad.impexp.importbutton": "NÄ›nto importÄ›rowaÅ›", + "pad.impexp.importing": "ImportÄ›rujo se...", + "pad.impexp.confirmimport": "Importowanje dataje pÅ›epiÅ¡o aktualny tekst zapisnika. CoÅ¡ napÅ¡awdu pókÅ¡acowaÅ›?", + "pad.impexp.convertFailed": "Njejsmy mógli toÅ› tu dataju importÄ›rowaÅ›. PÅ¡osym wužyj drugi dokumentowy format abo kopÄ›ruj manuelnje", + "pad.impexp.uploadFailed": "NagraÅ›e njejo se raźiÅ‚o, pÅ¡osym wopytaj hyšći raz", + "pad.impexp.importfailed": "Import njejo se raziÅ‚", + "pad.impexp.copypaste": "PÅ¡osym kopÄ›rowaÅ› a zasajźiÅ›", + "pad.impexp.exportdisabled": "Eksport ako format {{type}} jo znjemóžnjony. PÅ¡osym staj se ze swójim systemowym administratorom za drobnostki do zwiska." +} diff --git a/src/locales/el.json b/src/locales/el.json index f33865e6..0c334c1c 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -2,122 +2,125 @@ "@metadata": { "authors": [ "Evropi", + "Geraki", "Glavkos", "Monopatis", "Protnet" ] }, - "index.newPad": "\u039d\u03ad\u03bf Pad", - "index.createOpenPad": "\u03ae \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\/\u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03b5\u03bd\u03cc\u03c2 Pad \u03bc\u03b5 \u03cc\u03bd\u03bf\u03bc\u03b1:", - "pad.toolbar.bold.title": "\u0388\u03bd\u03c4\u03bf\u03bd\u03b1 (Ctrl-B)", - "pad.toolbar.italic.title": "\u03a0\u03bb\u03ac\u03b3\u03b9\u03b1 (Ctrl-I)", - "pad.toolbar.underline.title": "\u03a5\u03c0\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0394\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03ae \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae", - "pad.toolbar.ol.title": "\u03a4\u03b1\u03be\u03b9\u03bd\u03bf\u03bc\u03b7\u03bc\u03ad\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1", - "pad.toolbar.ul.title": "\u039b\u03af\u03c3\u03c4\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c3\u03b5\u03b9\u03c1\u03ac", - "pad.toolbar.indent.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03c3\u03bf\u03c7\u03ae\u03c2", - "pad.toolbar.unindent.title": "\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b5\u03c3\u03bf\u03c7\u03ae\u03c2", - "pad.toolbar.undo.title": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03a3\u03c5\u03bd\u03c4\u03b1\u03ba\u03c4\u03ce\u03bd", - "pad.toolbar.import_export.title": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03cc\/\u03c3\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03bf\u03cd\u03c2 \u03c4\u03cd\u03c0\u03bf\u03c5\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd", - "pad.toolbar.timeslider.title": "\u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", - "pad.toolbar.savedRevision.title": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b5\u03c2 \u0391\u03bd\u03b1\u03b8\u03b5\u03c9\u03c1\u03ae\u03c3\u03b5\u03b9\u03c2", - "pad.toolbar.settings.title": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2", - "pad.toolbar.embed.title": "\u0395\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 pad", - "pad.toolbar.showusers.title": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 pad", - "pad.colorpicker.save": "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7", - "pad.colorpicker.cancel": "\u0386\u03ba\u03c5\u03c1\u03bf", - "pad.loading": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...", - "pad.passwordRequired": "\u03a7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b3\u03b9\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", - "pad.permissionDenied": "\u0394\u03b5\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03af\u03c9\u03bc\u03b1 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", - "pad.wrongPassword": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c3\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03bb\u03b1\u03bd\u03b8\u03b1\u03c3\u03bc\u03ad\u03bd\u03bf\u03c2", - "pad.settings.padSettings": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 Pad", - "pad.settings.myView": "\u0397 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03bc\u03bf\u03c5", - "pad.settings.stickychat": "\u0397 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03ac\u03bd\u03c4\u03b1 \u03bf\u03c1\u03b1\u03c4\u03ae", - "pad.settings.colorcheck": "\u03a7\u03c1\u03ce\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7", - "pad.settings.linenocheck": "\u0391\u03c1\u03b9\u03b8\u03bc\u03bf\u03af \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2", - "pad.settings.fontType": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac\u03c2:", - "pad.settings.fontType.normal": "\u039a\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ae", - "pad.settings.fontType.monospaced": "\u039a\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c0\u03bb\u03ac\u03c4\u03bf\u03c5\u03c2", - "pad.settings.globalView": "\u039a\u03b1\u03b8\u03bf\u03bb\u03b9\u03ba\u03ae \u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae", - "pad.settings.language": "\u0393\u03bb\u03ce\u03c3\u03c3\u03b1:", - "pad.importExport.import_export": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\/\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae", - "pad.importExport.import": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03bf\u03c0\u03bf\u03b9\u03bf\u03c5\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ae \u03b5\u03b3\u03b3\u03c1\u03ac\u03c6\u03bf\u03c5", - "pad.importExport.importSuccessful": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2!", - "pad.importExport.export": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 pad \u03c9\u03c2:", + "index.newPad": "ÎÎο Pad", + "index.createOpenPad": "ή δημιουÏγία/άνοιγμα ενός Pad με όνομα:", + "pad.toolbar.bold.title": "Έντονη (Ctrl-B)", + "pad.toolbar.italic.title": "Πλάγια (Ctrl-I)", + "pad.toolbar.underline.title": "ΥπογÏάμμιση (Ctrl-U)", + "pad.toolbar.strikethrough.title": "ΔιακÏιτή διαγÏαφή", + "pad.toolbar.ol.title": "ΤαξινομημÎνη λίστα", + "pad.toolbar.ul.title": "Λίστα χωÏίς σειÏά", + "pad.toolbar.indent.title": "ΑÏιστεÏά εσοχή (TAB)", + "pad.toolbar.unindent.title": "Δεξιά εσοχή (Shift+TAB)", + "pad.toolbar.undo.title": "ΑναίÏεση (Ctrl-Z)", + "pad.toolbar.redo.title": "Επανάληψη (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "ΕκκαθάÏιση των χÏωμάτων των συντακτών", + "pad.toolbar.import_export.title": "Εισαγωγή/Εξαγωγή από/σε διαφοÏετικοÏÏ‚ Ï„Ïπους αÏχείων", + "pad.toolbar.timeslider.title": "ΧÏονοδιάγÏαμμα", + "pad.toolbar.savedRevision.title": "Αποθήκευση ΑναθεώÏησης", + "pad.toolbar.settings.title": "Ρυθμίσεις", + "pad.toolbar.embed.title": "ΔιαμοίÏαση και Ενσωμάτωση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… pad", + "pad.toolbar.showusers.title": "Εμφάνιση των χÏηστών Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… pad", + "pad.colorpicker.save": "Αποθήκευση", + "pad.colorpicker.cancel": "ΆκυÏο", + "pad.loading": "ΦόÏτωση...", + "pad.passwordRequired": "ΧÏειάζεστε κωδικό Ï€Ïόσβασης για Ï€Ïόσβαση σε αυτό το pad", + "pad.permissionDenied": "Δεν Îχετε δικαίωμα Ï€Ïόσβασης σε αυτό το pad", + "pad.wrongPassword": "Ο κωδικός σας ήταν λανθασμÎνος", + "pad.settings.padSettings": "Ρυθμίσεις Pad", + "pad.settings.myView": "Η Ï€Ïοβολή μου", + "pad.settings.stickychat": "Îα είναι πάντα οÏατή η συνομιλία", + "pad.settings.colorcheck": "ΧÏώματα συντάκτη", + "pad.settings.linenocheck": "ΑÏιθμοί γÏαμμών", + "pad.settings.rtlcheck": "Διαβάζεται το πεÏιεχόμενο από δεξιά Ï€Ïος τα αÏιστεÏά;", + "pad.settings.fontType": "ΤÏπος γÏαμματοσειÏάς:", + "pad.settings.fontType.normal": "Κανονική", + "pad.settings.fontType.monospaced": "ΚαθοÏισμÎνου πλάτους", + "pad.settings.globalView": "Καθολική Î Ïοβολή", + "pad.settings.language": "Γλώσσα:", + "pad.importExport.import_export": "Εισαγωγή/Εξαγωγή", + "pad.importExport.import": "Αποστολή οποιουδήποτε αÏχείου κειμÎνου ή εγγÏάφου", + "pad.importExport.importSuccessful": "Επιτυχής!", + "pad.importExport.export": "Εξαγωγή Ï„ÏÎχοντος pad ως:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0391\u03c0\u03bb\u03cc \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf", + "pad.importExport.exportplain": "Απλό κείμενο", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportopen": "ODF (ΜοÏφή Open Document)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03bb\u03bf\u03cd \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03ae \u03bc\u03bf\u03c1\u03c6\u03ae\u03c2 html. \u0393\u03b9\u03b1 \u03c0\u03b9\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf abiword<\/a>.", - "pad.modals.connected": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03bc\u03ad\u03bd\u03bf\u03b9.", - "pad.modals.reconnecting": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf pad \u03c3\u03b1\u03c2...", - "pad.modals.forcereconnect": "\u0395\u03c0\u03b9\u03b2\u03bf\u03bb\u03ae \u03b5\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", - "pad.modals.userdup": "\u0391\u03bd\u03bf\u03b9\u03b3\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5 \u03ac\u03bb\u03bb\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf", - "pad.modals.userdup.explanation": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf pad \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03bd\u03bf\u03b9\u03c7\u03c4\u03cc \u03c3\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03b1\u03c0\u03cc \u03ad\u03bd\u03b1 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03c4\u03bf\u03c5 \u03c0\u03c1\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc\u03bd \u03c4\u03bf\u03bd \u03c5\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03c4\u03ae.", - "pad.modals.userdup.advice": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf.", - "pad.modals.unauth": "\u0394\u03b5\u03bd \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9", - "pad.modals.unauth.explanation": "\u03a4\u03b1 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03ac \u03c3\u03b1\u03c2 \u03ac\u03bb\u03bb\u03b1\u03be\u03b1\u03bd \u03cc\u03c3\u03bf \u03b2\u03bb\u03ad\u03c0\u03b1\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1. \u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5.", - "pad.modals.looping": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5.", - "pad.modals.looping.explanation": "\u03a5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1\u03c2 \u03bc\u03b5 \u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd.", - "pad.modals.looping.cause": "\u038a\u03c3\u03c9\u03c2 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03ae\u03ba\u03b1\u03c4\u03b5 \u03bc\u03ad\u03c3\u03c9 \u03b5\u03bd\u03cc\u03c2 \u03bc\u03b7 \u03c3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03cd \u03c4\u03b5\u03af\u03c7\u03bf\u03c5\u03c2 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b1\u03c3\u03af\u03b1\u03c2 \u03ae \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03bc\u03b5\u03c3\u03bf\u03bb\u03ac\u03b2\u03b7\u03c3\u03b7\u03c2.", - "pad.modals.initsocketfail": "\u0391\u03b4\u03cd\u03bd\u03b1\u03c4\u03b7 \u03ae \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae.", - "pad.modals.initsocketfail.explanation": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03bf\u03cd.", - "pad.modals.initsocketfail.cause": "\u0391\u03c5\u03c4\u03cc \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c0\u03b9\u03b8\u03b1\u03bd\u03ce\u03c2 \u03c3\u03b5 \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03bc\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03c0\u03b5\u03c1\u03b9\u03ae\u03b3\u03b7\u03c3\u03b7\u03c2 \u03ae \u03c4\u03b7\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf \u03b4\u03b9\u03b1\u03b4\u03af\u03ba\u03c4\u03c5\u03bf.", - "pad.modals.slowcommit": "\u0391\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03ad\u03b8\u03b7\u03ba\u03b5.", - "pad.modals.slowcommit.explanation": "\u039f \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2 \u03b4\u03b5\u03bd \u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9.", - "pad.modals.slowcommit.cause": "\u0391\u03c5\u03c4\u03cc \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bf\u03c6\u03b5\u03af\u03bb\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2 \u03b4\u03b9\u03ba\u03c4\u03cd\u03bf\u03c5.", - "pad.modals.deleted": "\u0394\u03b9\u03b5\u03b3\u03c1\u03ac\u03c6\u03b7.", - "pad.modals.deleted.explanation": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf pad \u03ad\u03c7\u03b5\u03b9 \u03ba\u03b1\u03c4\u03b1\u03c1\u03b3\u03b7\u03b8\u03b5\u03af.", - "pad.modals.disconnected": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b1\u03c0\u03bf\u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af.", - "pad.modals.disconnected.explanation": "\u03a7\u03ac\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae", - "pad.modals.disconnected.cause": "\u039f \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf\u03c2. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b1\u03c2 \u03b5\u03ac\u03bd \u03b1\u03c5\u03c4\u03cc \u03b5\u03be\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af \u03bd\u03b1 \u03c3\u03c5\u03bc\u03b2\u03b1\u03af\u03bd\u03b5\u03b9.", - "pad.share": "\u039c\u03bf\u03b9\u03c1\u03b1\u03c3\u03c4\u03b5\u03af\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad", - "pad.share.readonly": "\u039c\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7", - "pad.share.link": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2", - "pad.share.emebdcode": "URL \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2", - "pad.chat": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1", - "pad.chat.title": "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf pad.", - "pad.chat.loadmessages": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03c9\u03bd \u03bc\u03b7\u03bd\u03c5\u03bc\u03ac\u03c4\u03c9\u03bd", - "timeslider.pageTitle": "{{appTitle}} \u03a7\u03c1\u03bf\u03bd\u03bf\u03b4\u03b9\u03ac\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1", - "timeslider.toolbar.returnbutton": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03c3\u03c4\u03bf pad", - "timeslider.toolbar.authors": "\u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b5\u03c2:", - "timeslider.toolbar.authorsList": "\u039a\u03b1\u03bd\u03ad\u03bd\u03b1\u03c2 \u03a3\u03c5\u03bd\u03c4\u03ac\u03ba\u03c4\u03b7\u03c2", - "timeslider.toolbar.exportlink.title": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae", - "timeslider.exportCurrent": "\u0395\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7\u03c2 \u03c9\u03c2:", - "timeslider.version": "\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 {{version}}", - "timeslider.saved": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c4\u03b9\u03c2 {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5", - "timeslider.month.february": "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5", - "timeslider.month.march": "\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5", - "timeslider.month.april": "\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5", - "timeslider.month.may": "\u039c\u03b1\u0390\u03bf\u03c5", - "timeslider.month.june": "\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5", - "timeslider.month.july": "\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5", - "timeslider.month.august": "\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5", - "timeslider.month.september": "\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.month.october": "\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.month.november": "\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.month.december": "\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5", - "timeslider.unnamedauthor": "{{num}} \u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03c2 \u03c3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ad\u03b1\u03c2", - "timeslider.unnamedauthors": "{{num}} \u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03b9 \u03c3\u03c5\u03b3\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c2", - "pad.savedrevs.marked": "\u0391\u03c5\u03c4\u03ae \u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03b5\u03c0\u03b9\u03c3\u03b7\u03bc\u03ac\u03bd\u03b8\u03b7\u03ba\u03b5 \u03c9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7", - "pad.userlist.entername": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03ac \u03c3\u03b1\u03c2", - "pad.userlist.unnamed": "\u03b1\u03bd\u03ce\u03bd\u03c5\u03bc\u03bf\u03c2", - "pad.userlist.guest": "\u0395\u03c0\u03b9\u03c3\u03ba\u03ad\u03c0\u03c4\u03b7\u03c2", - "pad.userlist.deny": "\u0386\u03c1\u03bd\u03b7\u03c3\u03b7", - "pad.userlist.approve": "\u0388\u03b3\u03ba\u03c1\u03b9\u03c3\u03b7", - "pad.editbar.clearcolors": "\u039d\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03ba\u03ba\u03b1\u03b8\u03ac\u03c1\u03b9\u03c3\u03b7 \u03c7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd \u03c3\u03cd\u03bd\u03c4\u03b1\u03be\u03b7\u03c2 \u03c3\u03b5 \u03bf\u03bb\u03cc\u03ba\u03bb\u03b7\u03c1\u03bf \u03c4\u03bf \u03ad\u03b3\u03b3\u03c1\u03b1\u03c6\u03bf;", - "pad.impexp.importbutton": "\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03a4\u03ce\u03c1\u03b1", - "pad.impexp.importing": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b1\u03b9...", - "pad.impexp.confirmimport": "\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b5\u03bd\u03cc\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03b8\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03c4\u03bf \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03c4\u03bf\u03c5 pad. \u0395\u03af\u03c3\u03c4\u03b5 \u03b2\u03ad\u03b2\u03b1\u03b9\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5;", - "pad.impexp.convertFailed": "\u0394\u03b5\u03bd \u03ba\u03b1\u03c4\u03b1\u03c6\u03ad\u03c1\u03b1\u03bc\u03b5 \u03bd\u03b1 \u03b5\u03b9\u03c3\u03ac\u03b3\u03bf\u03c5\u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03c4\u03cd\u03c0\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ae \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03c4\u03b5 \u03c7\u03b5\u03b9\u03c1\u03bf\u03ba\u03af\u03bd\u03b7\u03c4\u03b1", - "pad.impexp.uploadFailed": "\u0397 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5, \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03ae\u03c3\u03c4\u03b5 \u03be\u03b1\u03bd\u03ac", - "pad.impexp.importfailed": "\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5", - "pad.impexp.copypaste": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03c4\u03b5", - "pad.impexp.exportdisabled": "\u0397 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03b5 \u03bc\u03bf\u03c1\u03c6\u03ae {{type}} \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03b8\u03b5\u03af. \u0395\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae \u03c4\u03bf\u03c5 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03cc\u03c2 \u03c3\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2." -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "ΜποÏείτε να κάνετε εισαγωγή Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Îνου ή μοÏφής html. Για πιο Ï€ÏοηγμÎνες δυνατότητες εισαγωγής παÏακαλώ <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">εγκαταστήστε το abiword</a>.", + "pad.modals.connected": "ΣυνδεμÎνοι.", + "pad.modals.reconnecting": "ΕπανασÏνδεση στο pad σας...", + "pad.modals.forcereconnect": "Επιβολή επανασÏνδεσης", + "pad.modals.userdup": "ΑνοιγμÎνο σε άλλο παÏάθυÏο", + "pad.modals.userdup.explanation": "Αυτό το pad φαίνεται να είναι ανοιχτό σε πεÏισσότεÏα από Îνα παÏάθυÏο του Ï€ÏογÏάμματος πεÏιήγησης σε αυτόν τον υπολογιστή.", + "pad.modals.userdup.advice": "ΕπανασÏνδεση για να χÏησιμοποιήσετε αυτό το παÏάθυÏο.", + "pad.modals.unauth": "Δεν επιτÏÎπεται", + "pad.modals.unauth.explanation": "Τα δικαιώματά σας άλλαξαν όσο βλÎπατε αυτήν τη σελίδα. Δοκιμάστε να επανασυνδεθείτε.", + "pad.modals.looping.explanation": "ΥπάÏχουν Ï€Ïοβλήματα επικοινωνίας με τον διακομιστή συγχÏονισμοÏ.", + "pad.modals.looping.cause": "Ίσως συνδεθήκατε μÎσω ενός μη ÏƒÏ…Î¼Î²Î±Ï„Î¿Ï Ï„ÎµÎ¯Ï‡Î¿Ï…Ï‚ Ï€Ïοστασίας ή διακομιστή μεσολάβησης.", + "pad.modals.initsocketfail": "ΑδÏνατη ή επικοινωνία με τον διακομιστή.", + "pad.modals.initsocketfail.explanation": "Δεν ήταν δυνατή η σÏνδεση με τον διακομιστή συγχÏονισμοÏ.", + "pad.modals.initsocketfail.cause": "Αυτό οφείλεται πιθανώς σε Ï€Ïόβλημα με το Ï€ÏόγÏαμμα πεÏιήγησης ή της σÏνδεσής σας στο διαδίκτυο.", + "pad.modals.slowcommit.explanation": "Ο διακομιστής δεν αποκÏίνεται.", + "pad.modals.slowcommit.cause": "Αυτό μποÏεί να οφείλεται σε Ï€Ïοβλήματα σÏνδεσης δικτÏου.", + "pad.modals.badChangeset.explanation": "Μια επεξεÏγασία που κάνατε χαÏακτηÏίστηκε ως παÏάνομη από τον διακομιστή συγχÏονισμοÏ.", + "pad.modals.badChangeset.cause": "Αυτό μποÏεί να οφείλεται σε Îνα λάθος στη ÏÏθμιση του διακομιστή ή κάποια άλλη απÏόβλεπτη συμπεÏιφοÏά. ΠαÏακαλώ επικοινωνήστε με τον διαχειÏιστή της υπηÏεσίας, εάν πιστεÏετε πως αυτό οφείλεται σε σφάλμα. Δοκιμάστε να επανασυνδεθείτε για να συνεχίσετε την επεξεÏγασία.", + "pad.modals.corruptPad.explanation": "Το pad που Ï€Ïοσπαθείτε να επισκεφτείτε είναι κατεστÏαμμÎνο.", + "pad.modals.corruptPad.cause": "Αυτό μποÏεί να οφείλεται σε Îνα λάθος στη ÏÏθμιση του διακομιστή ή κάποια άλλη απÏόβλεπτη συμπεÏιφοÏά. ΠαÏακαλώ επικοινωνήστε με τον διαχειÏιστή της υπηÏεσίας.", + "pad.modals.deleted": "ΔιεγÏάφη.", + "pad.modals.deleted.explanation": "Αυτό το pad Îχει καταÏγηθεί.", + "pad.modals.disconnected": "Έχετε αποσυνδεθεί.", + "pad.modals.disconnected.explanation": "Χάθηκε η σÏνδεση με τον διακομιστή", + "pad.modals.disconnected.cause": "Ο διακομιστής μποÏεί να μην είναι διαθÎσιμος. ΠαÏακαλοÏμε ειδοποιήστε τον διαχειÏιστή της υπηÏεσίας εάν εξακολουθεί να συμβαίνει αυτό.", + "pad.share": "ΜοιÏαστείτε αυτό το pad", + "pad.share.readonly": "Μόνο για ανάγνωση", + "pad.share.link": "ΣÏνδεσμος", + "pad.share.emebdcode": "URL ενσωμάτωσης", + "pad.chat": "Συνομιλία", + "pad.chat.title": "Άνοιγμα της συνομιλίας για αυτό το pad.", + "pad.chat.loadmessages": "ΦόÏτωση πεÏισσότεÏων μηνυμάτων", + "timeslider.pageTitle": "{{appTitle}} ΧÏονοδιάγÏαμμα", + "timeslider.toolbar.returnbutton": "ΕπιστÏοφή στο pad", + "timeslider.toolbar.authors": "Συντάκτες:", + "timeslider.toolbar.authorsList": "ΚανÎνας Συντάκτης", + "timeslider.toolbar.exportlink.title": "Εξαγωγή", + "timeslider.exportCurrent": "Εξαγωγή Ï„ÏÎχουσας Îκδοσης ως:", + "timeslider.version": "Έκδοση {{version}}", + "timeslider.saved": "ΑποθηκεÏτηκε στις {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "ΙανουαÏίου", + "timeslider.month.february": "ΦεβÏουαÏίου", + "timeslider.month.march": "ΜαÏτίου", + "timeslider.month.april": "ΑπÏιλίου", + "timeslider.month.may": "ΜαÎου", + "timeslider.month.june": "Ιουνίου", + "timeslider.month.july": "Ιουλίου", + "timeslider.month.august": "ΑυγοÏστου", + "timeslider.month.september": "ΣεπτεμβÏίου", + "timeslider.month.october": "ΟκτωβÏίου", + "timeslider.month.november": "ÎοεμβÏίου", + "timeslider.month.december": "ΔεκεμβÏίου", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: ανώνυμος συντάκτης, other: ανώνυμοι συντάκτες]}", + "pad.savedrevs.marked": "Αυτή η Îκδοση επισημάνθηκε ως αποθηκευμÎνη Îκδοση", + "pad.userlist.entername": "Εισάγετε το όνομά σας", + "pad.userlist.unnamed": "ανώνυμος", + "pad.userlist.guest": "ΕπισκÎπτης", + "pad.userlist.deny": "ΆÏνηση", + "pad.userlist.approve": "ΈγκÏιση", + "pad.editbar.clearcolors": "Îα γίνει εκκαθάÏιση χÏωμάτων σÏνταξης σε ολόκληÏο το ÎγγÏαφο;", + "pad.impexp.importbutton": "Εισαγωγή ΤώÏα", + "pad.impexp.importing": "Εισάγεται...", + "pad.impexp.confirmimport": "Η εισαγωγή ενός αÏχείου θα αντικαταστήσει το κείμενο του pad. Είστε βÎβαιοι ότι θÎλετε να συνεχίσετε;", + "pad.impexp.convertFailed": "Δεν καταφÎÏαμε να εισάγουμε αυτό το αÏχείο. ΠαÏακαλώ χÏησιμοποιήστε διαφοÏετικό Ï„Ïπο αÏχείου ή αντιγÏάψτε και επικολλήστε χειÏοκίνητα", + "pad.impexp.uploadFailed": "Η αποστολή απÎτυχε, παÏακαλώ Ï€Ïοσπαθήστε ξανά", + "pad.impexp.importfailed": "Η εισαγωγή απÎτυχε", + "pad.impexp.copypaste": "ΠαÏακαλώ αντιγÏάψτε και επικολλήστε", + "pad.impexp.exportdisabled": "Η εξαγωγή σε μοÏφή {{type}} Îχει απενεÏγοποιηθεί. Επικοινωνήστε με τον διαχειÏιστή του συστήματός σας για λεπτομÎÏειες." +} diff --git a/src/locales/en.json b/src/locales/en.json index 920a2b00..01d3ff4f 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,14 +1,15 @@ { "index.newPad": "New Pad", "index.createOpenPad": "or create/open a Pad with the name:", + "pad.toolbar.bold.title": "Bold (Ctrl-B)", "pad.toolbar.italic.title": "Italic (Ctrl-I)", "pad.toolbar.underline.title": "Underline (Ctrl-U)", "pad.toolbar.strikethrough.title": "Strikethrough", "pad.toolbar.ol.title": "Ordered list", "pad.toolbar.ul.title": "Unordered List", - "pad.toolbar.indent.title": "Indent", - "pad.toolbar.unindent.title": "Outdent", + "pad.toolbar.indent.title": "Indent (TAB)", + "pad.toolbar.unindent.title": "Outdent (Shift+TAB)", "pad.toolbar.undo.title": "Undo (Ctrl-Z)", "pad.toolbar.redo.title": "Redo (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Clear Authorship Colors", @@ -16,14 +17,17 @@ "pad.toolbar.timeslider.title": "Timeslider", "pad.toolbar.savedRevision.title": "Save Revision", "pad.toolbar.settings.title": "Settings", - "pad.toolbar.embed.title": "Embed this pad", + "pad.toolbar.embed.title": "Share and Embed this pad", "pad.toolbar.showusers.title": "Show the users on this pad", + "pad.colorpicker.save": "Save", "pad.colorpicker.cancel": "Cancel", + "pad.loading": "Loading...", "pad.passwordRequired": "You need a password to access this pad", "pad.permissionDenied": "You do not have permission to access this pad", "pad.wrongPassword": "Your password was wrong", + "pad.settings.padSettings": "Pad Settings", "pad.settings.myView": "My View", "pad.settings.stickychat": "Chat always on screen", @@ -35,6 +39,7 @@ "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Global View", "pad.settings.language": "Language:", + "pad.importExport.import_export": "Import/Export", "pad.importExport.import": "Upload any text file or document", "pad.importExport.importSuccessful": "Successful!", @@ -45,29 +50,42 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "You only can import from plain text or html formats. For more advanced import features please <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">install abiword</a>.", + "pad.importExport.abiword.innerHTML": "You only can import from plain text or HTML formats. For more advanced import features please <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">install abiword</a>.", + "pad.modals.connected": "Connected.", "pad.modals.reconnecting": "Reconnecting to your pad..", "pad.modals.forcereconnect": "Force reconnect", + "pad.modals.userdup": "Opened in another window", "pad.modals.userdup.explanation": "This pad seems to be opened in more than one browser window on this computer.", "pad.modals.userdup.advice": "Reconnect to use this window instead.", + "pad.modals.unauth": "Not authorized", "pad.modals.unauth.explanation": "Your permissions have changed while viewing this page. Try to reconnect.", - "pad.modals.looping": "Disconnected.", + "pad.modals.looping.explanation": "There are communication problems with the synchronization server.", "pad.modals.looping.cause": "Perhaps you connected through an incompatible firewall or proxy.", + "pad.modals.initsocketfail": "Server is unreachable.", "pad.modals.initsocketfail.explanation": "Couldn't connect to the synchronization server.", "pad.modals.initsocketfail.cause": "This is probably due to a problem with your browser or your internet connection.", - "pad.modals.slowcommit": "Disconnected.", + "pad.modals.slowcommit.explanation": "The server is not responding.", "pad.modals.slowcommit.cause": "This could be due to problems with network connectivity.", + + "pad.modals.badChangeset.explanation": "An edit you have made was classified illegal by the synchronization server.", + "pad.modals.badChangeset.cause": "This could be due to a wrong server configuration or some other unexpected behavior. Please contact the service administrator, if you feel this is an error. Try to reconnect in order to continue editing.", + + "pad.modals.corruptPad.explanation": "The pad you are trying to access is corrupt.", + "pad.modals.corruptPad.cause": "This may be due to a wrong server configuration or some other unexpected behavior. Please contact the service administrator.", + "pad.modals.deleted": "Deleted.", "pad.modals.deleted.explanation": "This pad has been removed.", + "pad.modals.disconnected": "You have been disconnected.", "pad.modals.disconnected.explanation": "The connection to the server was lost", - "pad.modals.disconnected.cause": "The server may be unavailable. Please notify us if this continues to happen.", + "pad.modals.disconnected.cause": "The server may be unavailable. Please notify the service administrator if this continues to happen.", + "pad.share": "Share this pad", "pad.share.readonly": "Read only", "pad.share.link": "Link", @@ -75,6 +93,7 @@ "pad.chat": "Chat", "pad.chat.title": "Open the chat for this pad.", "pad.chat.loadmessages": "Load more messages", + "timeslider.pageTitle": "{{appTitle}} Timeslider", "timeslider.toolbar.returnbutton": "Return to pad", "timeslider.toolbar.authors": "Authors:", @@ -83,6 +102,7 @@ "timeslider.exportCurrent": "Export current version as:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Saved {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "January", "timeslider.month.february": "February", @@ -96,8 +116,8 @@ "timeslider.month.october": "October", "timeslider.month.november": "November", "timeslider.month.december": "December", - "timeslider.unnamedauthor": "{{num}} unnamed author", - "timeslider.unnamedauthors": "{{num}} unnamed authors", + + "timeslider.unnamedauthors": "{{num}} unnamed {[plural(num) one: author, other: authors ]}", "pad.savedrevs.marked": "This revision is now marked as a saved revision", "pad.userlist.entername": "Enter your name", "pad.userlist.unnamed": "unnamed", @@ -105,6 +125,7 @@ "pad.userlist.deny": "Deny", "pad.userlist.approve": "Approve", "pad.editbar.clearcolors": "Clear authorship colors on entire document?", + "pad.impexp.importbutton": "Import Now", "pad.impexp.importing": "Importing...", "pad.impexp.confirmimport": "Importing a file will overwrite the current text of the pad. Are you sure you want to proceed?", @@ -113,4 +134,4 @@ "pad.impexp.importfailed": "Import failed", "pad.impexp.copypaste": "Please copy paste", "pad.impexp.exportdisabled": "Exporting as {{type}} format is disabled. Please contact your system administrator for details." -}
\ No newline at end of file +} diff --git a/src/locales/es.json b/src/locales/es.json index 187f3637..831b89c1 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1,52 +1,56 @@ { "@metadata": { - "authors": { - "0": "Armando-Martin", - "1": "Jacobo", - "2": "Joker", - "3": "Rubenwap", - "5": "Vivaelcelta", - "6": "Xuacu" - } + "authors": [ + "Armando-Martin", + "Jacobo", + "Joker", + "Larjona", + "Mklehr", + "Rubenwap", + "VegaDark", + "Vivaelcelta", + "Xuacu" + ] }, "index.newPad": "Nuevo Pad", - "index.createOpenPad": "o crea\/abre un Pad con el nombre:", + "index.createOpenPad": "o crea/abre un Pad con el nombre:", "pad.toolbar.bold.title": "Negrita (Ctrl-B)", "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", "pad.toolbar.underline.title": "Subrayado (Ctrl-U)", "pad.toolbar.strikethrough.title": "Tachado", "pad.toolbar.ol.title": "Lista ordenada", "pad.toolbar.ul.title": "Lista desordenada", - "pad.toolbar.indent.title": "Sangrar", - "pad.toolbar.unindent.title": "Desangrar", + "pad.toolbar.indent.title": "SangrÃa (TAB)", + "pad.toolbar.unindent.title": "Eliminar sangrÃa (Shift+TAB)", "pad.toolbar.undo.title": "Deshacer (Ctrl-Z)", "pad.toolbar.redo.title": "Rehacer (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Eliminar los colores de los autores", - "pad.toolbar.import_export.title": "Importar\/Exportar a diferentes formatos de archivos", - "pad.toolbar.timeslider.title": "L\u00ednea de tiempo", - "pad.toolbar.savedRevision.title": "Revisiones guardadas", - "pad.toolbar.settings.title": "Configuraci\u00f3n", - "pad.toolbar.embed.title": "Incrustar este pad", + "pad.toolbar.import_export.title": "Importar/Exportar a diferentes formatos de archivos", + "pad.toolbar.timeslider.title": "LÃnea de tiempo", + "pad.toolbar.savedRevision.title": "Guardar revisión", + "pad.toolbar.settings.title": "Configuración", + "pad.toolbar.embed.title": "Compartir e incrustar este pad", "pad.toolbar.showusers.title": "Mostrar los usuarios de este pad", "pad.colorpicker.save": "Guardar", "pad.colorpicker.cancel": "Cancelar", "pad.loading": "Cargando...", - "pad.passwordRequired": "Necesitas una contrase\u00f1a para acceder a este documento", - "pad.permissionDenied": "No tienes permiso para acceder a esta p\u00e1gina", - "pad.wrongPassword": "La contrase\u00f1a era incorrecta", - "pad.settings.padSettings": "Configuraci\u00f3n del Pad", + "pad.passwordRequired": "Necesitas una contraseña para acceder a este documento", + "pad.permissionDenied": "No tienes permiso para acceder a esta página", + "pad.wrongPassword": "La contraseña era incorrecta", + "pad.settings.padSettings": "Configuración del Pad", "pad.settings.myView": "Preferencias personales", "pad.settings.stickychat": "Chat siempre encima", - "pad.settings.colorcheck": "Color de autor\u00eda", - "pad.settings.linenocheck": "N\u00fameros de l\u00ednea", - "pad.settings.fontType": "Tipograf\u00eda:", + "pad.settings.colorcheck": "Color de autorÃa", + "pad.settings.linenocheck": "Números de lÃnea", + "pad.settings.rtlcheck": "¿Leer contenido de derecha a izquierda?", + "pad.settings.fontType": "TipografÃa:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monoespacio", "pad.settings.globalView": "Preferencias globales", "pad.settings.language": "Idioma:", - "pad.importExport.import_export": "Importar\/Exportar", + "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Subir cualquier texto o documento", - "pad.importExport.importSuccessful": "\u00a1Operaci\u00f3n realizada con \u00e9xito!", + "pad.importExport.importSuccessful": "¡Operación realizada con éxito!", "pad.importExport.export": "Exporta el pad actual como:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto plano", @@ -54,45 +58,47 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "S\u00f3lo puede importar formatos de texto plano o html. Para funciones m\u00e1s avanzadas instale <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Sólo puede importar formatos de texto plano o html. Para funciones más avanzadas instale <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword</a>.", "pad.modals.connected": "Conectado.", "pad.modals.reconnecting": "Reconectando a tu pad..", - "pad.modals.forcereconnect": "Reconexi\u00f3n forzosa", + "pad.modals.forcereconnect": "Reconexión forzosa", "pad.modals.userdup": "Abierto en otra ventana", - "pad.modals.userdup.explanation": "Este pad parece estar abierto en m\u00e1s de una ventana de tu navegador.", + "pad.modals.userdup.explanation": "Este pad parece estar abierto en más de una ventana de tu navegador.", "pad.modals.userdup.advice": "Reconectar para usar esta ventana.", "pad.modals.unauth": "No autorizado.", - "pad.modals.unauth.explanation": "Los permisos han cambiado mientras estabas viendo esta p\u00e1gina. Intenta reconectar de nuevo.", - "pad.modals.looping": "Desconectado.", - "pad.modals.looping.explanation": "Estamos teniendo problemas con la sincronizaci\u00f3n en el servidor.", - "pad.modals.looping.cause": "Puede deberse a que te conectes a trav\u00e9s de un proxy o un cortafuegos incompatible.", + "pad.modals.unauth.explanation": "Los permisos han cambiado mientras estabas viendo esta página. Intenta reconectar de nuevo.", + "pad.modals.looping.explanation": "Estamos teniendo problemas con la sincronización en el servidor.", + "pad.modals.looping.cause": "Puede deberse a que te conectes a través de un proxy o un cortafuegos incompatible.", "pad.modals.initsocketfail": "Servidor incalcanzable.", - "pad.modals.initsocketfail.explanation": "No se pudo conectar al servidor de sincronizaci\u00f3n.", - "pad.modals.initsocketfail.cause": "Puede ser a causa de tu navegador o de una ca\u00edda en tu conexi\u00f3n de Internet.", - "pad.modals.slowcommit": "Desconectado.", + "pad.modals.initsocketfail.explanation": "No se pudo conectar al servidor de sincronización.", + "pad.modals.initsocketfail.cause": "Puede ser a causa de tu navegador o de una caÃda en tu conexión de Internet.", "pad.modals.slowcommit.explanation": "El servidor no responde.", - "pad.modals.slowcommit.cause": "Puede deberse a problemas con tu conexi\u00f3n de red.", + "pad.modals.slowcommit.cause": "Puede deberse a problemas con tu conexión de red.", + "pad.modals.badChangeset.explanation": "Ha hecho una edición clasificada como ilegal por el servidor de sincronización.", + "pad.modals.badChangeset.cause": "Esto podrÃa ser debido a una mala configuración del servidor o algún otro comportamiento inesperado. Póngase en contacto con el administrador del servicio, si siente que esto es un error. Intente volver a conectar con el fin de seguir editando.", + "pad.modals.corruptPad.explanation": "El pad que está intentando acceder está dañado.", + "pad.modals.corruptPad.cause": "Esto puede deberse a una mala configuración de servidor o algún otro comportamiento inesperado. Póngase en contacto con el administrador del servicio.", "pad.modals.deleted": "Borrado.", "pad.modals.deleted.explanation": "Este pad ha sido borrado.", "pad.modals.disconnected": "Has sido desconectado.", - "pad.modals.disconnected.explanation": "Se perdi\u00f3 la conexi\u00f3n con el servidor", - "pad.modals.disconnected.cause": "El servidor podr\u00eda no estar disponible. Contacte con nosotros si esto contin\u00faa sucediendo.", + "pad.modals.disconnected.explanation": "Se perdió la conexión con el servidor", + "pad.modals.disconnected.cause": "El servidor podrÃa no estar disponible. Contacte con nosotros si esto continúa sucediendo.", "pad.share": "Compatir el pad", - "pad.share.readonly": "S\u00f3lo lectura", + "pad.share.readonly": "Sólo lectura", "pad.share.link": "Enlace", "pad.share.emebdcode": "Incrustar URL", "pad.chat": "Chat", "pad.chat.title": "Abrir el chat para este pad.", - "pad.chat.loadmessages": "Cargar m\u00e1s mensajes", - "timeslider.pageTitle": "{{appTitle}} L\u00ednea de tiempo", + "pad.chat.loadmessages": "Cargar más mensajes", + "timeslider.pageTitle": "{{appTitle}} LÃnea de tiempo", "timeslider.toolbar.returnbutton": "Volver al pad", "timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authorsList": "Sin autores", "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar la versi\u00f3n actual como:", - "timeslider.version": "Versi\u00f3n {{version}}", + "timeslider.exportCurrent": "Exportar la versión actual como:", + "timeslider.version": "Versión {{version}}", "timeslider.saved": "Guardado el {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Enero", "timeslider.month.february": "Febrero", "timeslider.month.march": "Marzo", @@ -105,21 +111,20 @@ "timeslider.month.october": "Octubre", "timeslider.month.november": "Noviembre", "timeslider.month.december": "Diciembre", - "timeslider.unnamedauthor": "{{num}} autor desconocido", - "timeslider.unnamedauthors": "{{num}} autores desconocidos", - "pad.savedrevs.marked": "Revisi\u00f3n guardada", + "timeslider.unnamedauthors": "{{num}} {[ plural(num) one: autor desconocido, other: autores desconocidos]}", + "pad.savedrevs.marked": "Revisión guardada", "pad.userlist.entername": "Escribe tu nombre", - "pad.userlist.unnamed": "an\u00f3nimo", + "pad.userlist.unnamed": "anónimo", "pad.userlist.guest": "Invitado", "pad.userlist.deny": "Denegar", "pad.userlist.approve": "Aprobar", - "pad.editbar.clearcolors": "\u00bfDesea borrar el color de los autores en todo el documento?", + "pad.editbar.clearcolors": "¿Desea borrar el color de los autores en todo el documento?", "pad.impexp.importbutton": "Importar", "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "Al importar un fichero se borrar\u00e1 el contenido actual del documento. \u00bfQuiere continuar?", + "pad.impexp.confirmimport": "Al importar un fichero se borrará el contenido actual del documento. ¿Quiere continuar?", "pad.impexp.convertFailed": "No pudimos importar este fichero. Intentalo con otro formato diferente o copia y pega manualmente.", - "pad.impexp.uploadFailed": "El env\u00edo del fichero fall\u00f3. Intentelo de nuevo.", + "pad.impexp.uploadFailed": "El envÃo del fichero falló. Intentelo de nuevo.", "pad.impexp.importfailed": "Fallo al importar", "pad.impexp.copypaste": "Intente copiar y pegar", - "pad.impexp.exportdisabled": "La exportaci\u00f3n al formato {{type}} format est\u00e1 desactivada. Contacte con su administrador de sistemas." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "La exportación al formato {{type}} format está desactivada. Contacte con su administrador de sistemas." +} diff --git a/src/locales/et.json b/src/locales/et.json new file mode 100644 index 00000000..29cd92b9 --- /dev/null +++ b/src/locales/et.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "Kristian.kankainen" + ] + }, + "index.newPad": "Uus klade", + "index.createOpenPad": "loo või rööptoimeta kladet nimega:", + "pad.toolbar.bold.title": "Rasvane (Ctrl + B)", + "pad.toolbar.italic.title": "Kaldkiri (Ctrl + I)", + "pad.toolbar.underline.title": "Allakriipsutus (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Läbikriipsutus", + "pad.toolbar.ol.title": "Nummerdatud loend", + "pad.toolbar.ul.title": "Täppidega loend", + "pad.toolbar.indent.title": "Suurenda taanet (TAB)", + "pad.toolbar.unindent.title": "Vähenda taanet (Shift+TAB)", + "pad.toolbar.undo.title": "Võta tagasi (Ctrl-Z)", + "pad.toolbar.redo.title": "Tee uuesti (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Kustuta eri autorite värvid", + "pad.toolbar.import_export.title": "Impordi-ekspordi eri failivormingutesse", + "pad.toolbar.timeslider.title": "Ajajoon", + "pad.toolbar.savedRevision.title": "Salvesta versioon", + "pad.toolbar.settings.title": "Seaded", + "pad.toolbar.embed.title": "Jaga ja põimi seda kladet", + "pad.toolbar.showusers.title": "Näita klade kasutajaid", + "pad.colorpicker.save": "Salvesta", + "pad.colorpicker.cancel": "Loobu", + "pad.loading": "Laadimine...", + "pad.passwordRequired": "Sul peab olema parool selle klade rööptoimetamiseks", + "pad.permissionDenied": "Sul puuduvad ligipääsuõigused selle klade rööptoimetamiseks", + "pad.wrongPassword": "Vigane parool", + "pad.settings.padSettings": "Klade seadistused", + "pad.settings.myView": "Minu vaade", + "pad.settings.stickychat": "Näita vestlust alatiselt ekraanil", + "pad.settings.colorcheck": "Autorite värvid", + "pad.settings.linenocheck": "Reanumbrid", + "pad.settings.rtlcheck": "Näita sisu paremalt vasakule?", + "pad.settings.fontType": "Å rifti tüüp:", + "pad.settings.fontType.normal": "Normaalne", + "pad.settings.fontType.monospaced": "Ãœhelaiuste märkidega", + "pad.settings.globalView": "Koguvaade", + "pad.settings.language": "Keel:", + "pad.importExport.import_export": "Import-eksport", + "pad.importExport.import": "Laadi üles mistahes tekstifail või dokument", + "pad.importExport.importSuccessful": "Edukalt laaditud!", + "pad.importExport.export": "Ekspordi käesolev klade kui:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Lihttekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Paraku on ainult lihttekstis voi HTML-vormingus dokumentide importimine võimaldatud. Rohkem võimaluste jaoks peab <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">paigaldama abiword</a>.", + "pad.modals.connected": "Ãœhendatud.", + "pad.modals.reconnecting": "Proovitakse luua ühendus klade juurde...", + "pad.modals.forcereconnect": "Sunni ühenduse taasloomist", + "pad.modals.userdup": "Käesolev klade on avatud teises aknas", + "pad.modals.userdup.explanation": "Käesolev klade paistab olevat avatud rohkem kui ühes brauseriaknas selles arvutis.", + "pad.modals.userdup.advice": "Kasuta käesolevat akent teiste asemel.", + "pad.modals.unauth": "Pole lubatud", + "pad.modals.unauth.explanation": "Sinu ligipääsuõigused on muutunud. Proovi ühendada uuesti.", + "pad.modals.looping.explanation": "Serveriga sünkroniseerimine tundub olevat takistatud.", + "pad.modals.looping.cause": "Äkki oled ühendatud tulemüüri või puhverserveri kaudu?", + "pad.modals.initsocketfail": "Server pole kättesaadaval.", + "pad.modals.initsocketfail.explanation": "Ei saadud ühendust sünkroniseerimisserveriga.", + "pad.modals.initsocketfail.cause": "See on tõenäoliselt su brauserist või internetiühendusest tingitud.", + "pad.modals.slowcommit.explanation": "Server ei vasta.", + "pad.modals.slowcommit.cause": "See on tõenäoliselt võrguühendusest tingitud.", + "pad.modals.badChangeset.explanation": "Sünkroniseerimisserver keeldus vastuvõtmast tehtud muudatuse.", + "pad.modals.badChangeset.cause": "See võib sõltuda serveri valest seadistusest või mõnest muust tõrkest. Palun kontakteeru teenuse haldajaga või proovi uuesti.", + "pad.modals.corruptPad.explanation": "Klade, millele püüad ligi pääseda, on rikkis.", + "pad.modals.corruptPad.cause": "See võib sõltuda serveri valest seadistusest või mõnest muust tõrkest. Palun kontakteeru teenuse haldajaga või proovi uuesti.", + "pad.modals.deleted": "Kustutatud.", + "pad.modals.deleted.explanation": "Klade on kustutatud.", + "pad.modals.disconnected": "Sa ei ole ühendatud.", + "pad.modals.disconnected.explanation": "Ãœhendus serveriga katkes", + "pad.modals.disconnected.cause": "Server ei ole saadaval. Palun kontakteeru teenuse haldajaga või proovi uuesti.", + "pad.share": "Jaga kladet", + "pad.share.readonly": "Kirjutuskaitstud", + "pad.share.link": "Link", + "pad.share.emebdcode": "Põimi URL", + "pad.chat": "Vestle", + "pad.chat.title": "Ava klade vestlusaken.", + "pad.chat.loadmessages": "Laadi rohkem sõnumeid", + "timeslider.pageTitle": "{{appTitle}} ajajoon", + "timeslider.toolbar.returnbutton": "Tagasi kladele", + "timeslider.toolbar.authors": "AutoridË", + "timeslider.toolbar.authorsList": "Autor puudub", + "timeslider.toolbar.exportlink.title": "Eksport", + "timeslider.exportCurrent": "Ekspordi käesolev versioon kuiË", + "timeslider.version": "Versioon {{version}}", + "timeslider.saved": "Salvestatud {{day}}. {{month}}il {{year}}. aastal", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Jaanuar", + "timeslider.month.february": "Veebruar", + "timeslider.month.march": "Märts", + "timeslider.month.april": "Aprill", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juuni", + "timeslider.month.july": "Juuli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktoober", + "timeslider.month.november": "November", + "timeslider.month.december": "Detsember", + "timeslider.unnamedauthors": "{{num}} nimetamata {[plural(num) one: autor, other: autorit ]}", + "pad.savedrevs.marked": "Versioon märgiti salvestatuna", + "pad.userlist.entername": "Sisesta oma nimi", + "pad.userlist.unnamed": "Nimetu", + "pad.userlist.guest": "Külaline", + "pad.userlist.deny": "Eira", + "pad.userlist.approve": "Nõustu", + "pad.editbar.clearcolors": "Kas soovid kustutada autorite värvid dokumendist?", + "pad.impexp.importbutton": "Impordi", + "pad.impexp.importing": "Importimine...", + "pad.impexp.confirmimport": "Faili importimine kustutab praeguse versiooni. Kas kindlasti importida?", + "pad.impexp.convertFailed": "Antud faili pole võimalik importida. Palun kasuta teist vormingut või kopeeri-kleebi käsitsi", + "pad.impexp.uploadFailed": "Ãœleslaadimine nurjus, proovi uuesti", + "pad.impexp.importfailed": "Importimine nurjus", + "pad.impexp.copypaste": "Palun kopeeri ja kleebi", + "pad.impexp.exportdisabled": "Eksportimine vormingusse {{type}} on hetkel keelatud. Ãœksikasjade saamiseks pöördu oma süsteemiadministraatori poole." +} diff --git a/src/locales/eu.json b/src/locales/eu.json new file mode 100644 index 00000000..5aa3ec4e --- /dev/null +++ b/src/locales/eu.json @@ -0,0 +1,118 @@ +{ + "@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 <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword instala ezazu</a>.", + "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.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.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.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." +} diff --git a/src/locales/fa.json b/src/locales/fa.json index bccc353c..3b421972 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -1,122 +1,127 @@ { "@metadata": { - "authors": { - "0": "BMRG14", - "1": "Dalba", - "3": "ZxxZxxZ" - } + "authors": [ + "BMRG14", + "Dalba", + "Ebraminio", + "Reza1615", + "ZxxZxxZ", + "الناز" + ] }, - "index.newPad": "\u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062a\u0627\u0632\u0647", - "index.createOpenPad": "\u06cc\u0627 \u0627\u06cc\u062c\u0627\u062f\/\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0628\u0627 \u0646\u0627\u0645:", - "pad.toolbar.bold.title": "\u067e\u0631\u0631\u0646\u06af (Ctrl-B)", - "pad.toolbar.italic.title": "\u06a9\u062c (Ctrl-I)", - "pad.toolbar.underline.title": "\u0632\u06cc\u0631\u062e\u0637 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u062e\u0637 \u062e\u0648\u0631\u062f\u0647", - "pad.toolbar.ol.title": "\u0641\u0647\u0631\u0633\u062a \u0645\u0631\u062a\u0628 \u0634\u062f\u0647", - "pad.toolbar.ul.title": "\u0641\u0647\u0631\u0633\u062a \u0645\u0631\u062a\u0628 \u0646\u0634\u062f\u0647", - "pad.toolbar.indent.title": "\u062a\u0648\u0631\u0641\u062a\u06af\u06cc", - "pad.toolbar.unindent.title": "\u0628\u06cc\u0631\u0648\u0646 \u0631\u0641\u062a\u06af\u06cc", - "pad.toolbar.undo.title": "\u0628\u0627\u0637\u0644\u200c\u06a9\u0631\u062f\u0646 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0627\u0632 \u0646\u0648 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", - "pad.toolbar.import_export.title": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc\/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0632\/\u0628\u0647 \u0642\u0627\u0644\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641", - "pad.toolbar.timeslider.title": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646", - "pad.toolbar.savedRevision.title": "\u0630\u062e\u06cc\u0631\u0647\u200c\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", - "pad.colorpicker.save": "\u0630\u062e\u06cc\u0631\u0647", - "pad.colorpicker.cancel": "\u0644\u063a\u0648", - "pad.loading": "\u062f\u0631 \u062d\u0627\u0644 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc...", - "pad.passwordRequired": "\u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0646\u06cc\u0627\u0632 \u0628\u0647 \u06cc\u06a9 \u06af\u0630\u0631\u0648\u0627\u0698\u0647 \u062f\u0627\u0631\u06cc\u062f", - "pad.permissionDenied": "\u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647\u200c\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0631\u0627 \u0646\u062f\u0627\u0631\u06cc\u062f", - "pad.wrongPassword": "\u06af\u0630\u0631\u0648\u0627\u0698\u0647\u200c\u06cc \u0634\u0645\u0627 \u062f\u0631\u0633\u062a \u0646\u06cc\u0633\u062a", - "pad.settings.padSettings": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.settings.myView": "\u0646\u0645\u0627\u06cc \u0645\u0646", - "pad.settings.stickychat": "\u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u06cc\u0634\u0647 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u0627\u0634\u062f", - "pad.settings.colorcheck": "\u0631\u0646\u06af\u200c\u0647\u0627\u06cc \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc", - "pad.settings.linenocheck": "\u0634\u0645\u0627\u0631\u0647\u200c\u06cc \u062e\u0637\u0648\u0637", - "pad.settings.fontType": "\u0646\u0648\u0639 \u0642\u0644\u0645:", - "pad.settings.fontType.normal": "\u0633\u0627\u062f\u0647", + "index.newPad": "دÙترچه یادداشت تازه", + "index.createOpenPad": "یا ایجاد/بازکردن یک دÙترچه یادداشت با نام:", + "pad.toolbar.bold.title": "پررنگ (Ctrl-B)", + "pad.toolbar.italic.title": "کج (Ctrl-I)", + "pad.toolbar.underline.title": "زیرخط (Ctrl-U)", + "pad.toolbar.strikethrough.title": "خط خورده", + "pad.toolbar.ol.title": "Ùهرست مرتب شده", + "pad.toolbar.ul.title": "Ùهرست مرتب نشده", + "pad.toolbar.indent.title": "تورÙتگی (TAB)", + "pad.toolbar.unindent.title": "بیرون رÙتگی (Shift+TAB)", + "pad.toolbar.undo.title": "باطل‌کردن (Ctrl-Z)", + "pad.toolbar.redo.title": "از نو (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "پاک‌کردن رنگ‌های نویسندگی", + "pad.toolbar.import_export.title": "درون‌ریزی/برون‌ریزی از/به قالب‌های مختلÙ", + "pad.toolbar.timeslider.title": "لغزندهٔ زمان", + "pad.toolbar.savedRevision.title": "ذخیره‌سازی نسخه", + "pad.toolbar.settings.title": "تنظیمات", + "pad.toolbar.embed.title": "اشتراک Ùˆ جاسازی این دÙترچه یادداشت", + "pad.toolbar.showusers.title": "نمایش کاربران در این دÙترچه یادداشت", + "pad.colorpicker.save": "ذخیره", + "pad.colorpicker.cancel": "لغو", + "pad.loading": "در Øال بارگذاری...", + "pad.passwordRequired": "برای دسترسی به این دÙترچه یادداشت نیاز به یک گذرواژه دارید", + "pad.permissionDenied": "شما اجازه‌ی دسترسی به این دÙترچه یادداشت را ندارید", + "pad.wrongPassword": "گذرواژه‌ی شما درست نیست", + "pad.settings.padSettings": "تنظیمات دÙترچه یادداشت", + "pad.settings.myView": "نمای من", + "pad.settings.stickychat": "Ú¯Ùتگو همیشه روی صÙØÙ‡ نمایش باشد", + "pad.settings.colorcheck": "رنگ‌های نویسندگی", + "pad.settings.linenocheck": "شماره‌ی خطوط", + "pad.settings.rtlcheck": "خواندن Ù…Øتوا از راست به چپ؟", + "pad.settings.fontType": "نوع قلم:", + "pad.settings.fontType.normal": "ساده", "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "\u0646\u0645\u0627\u06cc \u0633\u0631\u0627\u0633\u0631\u06cc", - "pad.settings.language": "\u0632\u0628\u0627\u0646:", - "pad.importExport.import_export": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc\/\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc", - "pad.importExport.import": "\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647\u200c\u06cc \u0645\u062a\u0646\u06cc \u06cc\u0627 \u0633\u0646\u062f", - "pad.importExport.importSuccessful": "\u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0648\u062f!", - "pad.importExport.export": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0628\u0627 \u0642\u0627\u0644\u0628:", + "pad.settings.globalView": "نمای سراسری", + "pad.settings.language": "زبان:", + "pad.importExport.import_export": "درون‌ریزی/برون‌ریزی", + "pad.importExport.import": "بارگذاری پرونده‌ی متنی یا سند", + "pad.importExport.importSuccessful": "موÙقیت آمیز بود!", + "pad.importExport.export": "برون‌ریزی این دÙترچه یادداشت با قالب:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0645\u062a\u0646 \u0633\u0627\u062f\u0647", + "pad.importExport.exportplain": "متن ساده", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (\u0642\u0627\u0644\u0628 \u0633\u0646\u062f \u0628\u0627\u0632)", + "pad.importExport.exportopen": "ODF (قالب سند باز)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0634\u0645\u0627 \u062a\u0646\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0642\u0627\u0644\u0628 \u0645\u062a\u0646 \u0633\u0627\u062f\u0647 \u06cc\u0627 \u0627\u0686\u200c\u062a\u06cc\u200c\u0627\u0645\u200c\u0627\u0644 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0634\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">AbiWord<\/a> \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.", - "pad.modals.connected": "\u0645\u062a\u0635\u0644 \u0634\u062f.", - "pad.modals.reconnecting": "\u062f\u0631 \u062d\u0627\u0644 \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0634\u0645\u0627..", - "pad.modals.forcereconnect": "\u0648\u0627\u062f\u0627\u0634\u062a\u0646 \u0628\u0647 \u0627\u062a\u0635\u0627\u0644 \u062f\u0648\u0628\u0627\u0631\u0647", - "pad.modals.userdup": "\u062f\u0631 \u067e\u0646\u062c\u0631\u0647\u200c\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0627\u0632 \u0634\u062f", - "pad.modals.userdup.explanation": "\u06af\u0645\u0627\u0646 \u0645\u06cc\u200c\u0631\u0648\u062f \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u062f\u0631 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647\u200c\u06cc \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0627\u0632 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.userdup.advice": "\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u067e\u0646\u062c\u0631\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06cc\u062f.", - "pad.modals.unauth": "\u0645\u062c\u0627\u0632 \u0646\u06cc\u0633\u062a", - "pad.modals.unauth.explanation": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u0645\u0627 \u062f\u0631 \u062d\u06cc\u0646 \u0645\u0634\u0627\u0647\u062f\u0647\u200c\u06cc \u0627\u06cc\u0646 \u0628\u0631\u06af\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627\u0641\u062a\u0647\u200c\u0627\u0633\u062a. \u062f\u0648\u0628\u0627\u0631\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f.", - "pad.modals.looping": "\u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f.", - "pad.modals.looping.explanation": "\u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u06cc \u0628\u0627 \u0633\u0631\u0648\u0631 \u0647\u0645\u06af\u0627\u0645\u200c\u0633\u0627\u0632\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.", - "pad.modals.looping.cause": "\u0634\u0627\u06cc\u062f \u0634\u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u06cc\u0627 \u067e\u0631\u0648\u06a9\u0633\u06cc \u0646\u0627\u0633\u0627\u0632\u06af\u0627\u0631 \u0645\u062a\u0635\u0644 \u0634\u062f\u0647\u200c\u0627\u06cc\u062f.", - "pad.modals.initsocketfail": "\u0633\u0631\u0648\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u06cc\u0633\u062a.", - "pad.modals.initsocketfail.explanation": "\u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u0632\u06cc \u0648\u0635\u0644 \u0634\u062f.", - "pad.modals.initsocketfail.cause": "\u0634\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0628\u0647 \u062e\u0627\u0637\u0631 \u0645\u0634\u06a9\u0644\u06cc \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u06cc\u0627 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0634\u0645\u0627 \u0628\u0627\u0634\u062f.", - "pad.modals.slowcommit": "\u0627\u062a\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062f.", - "pad.modals.slowcommit.explanation": "\u0633\u0631\u0648\u0631 \u067e\u0627\u0633\u062e \u0646\u0645\u06cc\u200c\u062f\u0647\u062f.", - "pad.modals.slowcommit.cause": "\u0627\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u062e\u0627\u0637\u0631 \u0645\u0634\u06a9\u0644\u0627\u062a\u06cc \u062f\u0631 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0634\u0628\u06a9\u0647 \u0628\u0627\u0634\u062f.", - "pad.modals.deleted": "\u067e\u0627\u06a9 \u0634\u062f.", - "pad.modals.deleted.explanation": "\u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u067e\u0627\u06a9 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.disconnected": "\u0627\u062a\u0635\u0627\u0644 \u0634\u0645\u0627 \u0642\u0637\u0639 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.disconnected.explanation": "\u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0642\u0637\u0639 \u0634\u062f\u0647\u200c\u0627\u0633\u062a.", - "pad.modals.disconnected.cause": "\u0633\u0631\u0648\u0631 \u0634\u0627\u06cc\u062f \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0646\u0628\u0627\u0634\u062f. \u0627\u06af\u0631 \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0628\u0627\u0632 \u0647\u0645 \u0631\u062e \u062f\u0627\u062f \u0645\u0627 \u0631\u0627 \u0622\u06af\u0627\u0647 \u0633\u0627\u0632\u06cc\u062f.", - "pad.share": "\u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0631\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.share.readonly": "\u0641\u0642\u0637 \u062e\u0648\u0627\u0646\u062f\u0646\u06cc", - "pad.share.link": "\u067e\u06cc\u0648\u0646\u062f", - "pad.share.emebdcode": "\u062c\u0627\u0633\u0627\u0632\u06cc \u0646\u0634\u0627\u0646\u06cc", - "pad.chat": "\u06af\u0641\u062a\u06af\u0648", - "pad.chat.title": "\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u06af\u0641\u062a\u06af\u0648 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "pad.chat.loadmessages": "\u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631", - "timeslider.pageTitle": "\u0627\u0633\u0644\u0627\u06cc\u062f\u0631 \u0632\u0645\u0627\u0646 {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u062f\u0641\u062a\u0631\u0686\u0647 \u06cc\u0627\u062f\u062f\u0627\u0634\u062a", - "timeslider.toolbar.authors": "\u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u0627\u0646:", - "timeslider.toolbar.authorsList": "\u0628\u062f\u0648\u0646 \u0646\u0648\u06cc\u0633\u0646\u062f\u0647", - "timeslider.toolbar.exportlink.title": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc", - "timeslider.exportCurrent": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0646\u06af\u0627\u0631\u0634 \u06a9\u0646\u0648\u0646\u06cc \u0628\u0647 \u0639\u0646\u0648\u0627\u0646:", - "timeslider.version": "\u0646\u06af\u0627\u0631\u0634 {{version}}", - "timeslider.saved": "{{month}} {{day}}\u060c {{year}} \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0698\u0627\u0646\u0648\u06cc\u0647", - "timeslider.month.february": "\u0641\u0628\u0631\u06cc\u0647", - "timeslider.month.march": "\u0645\u0627\u0631\u0686", - "timeslider.month.april": "\u0622\u067e\u0631\u06cc\u0644", - "timeslider.month.may": "\u0645\u06cc", - "timeslider.month.june": "\u0698\u0648\u0626\u0646", - "timeslider.month.july": "\u062c\u0648\u0644\u0627\u06cc", - "timeslider.month.august": "\u0622\u06af\u0648\u0633\u062a", - "timeslider.month.september": "\u0633\u067e\u062a\u0627\u0645\u0628\u0631", - "timeslider.month.october": "\u0627\u06a9\u062a\u0628\u0631", - "timeslider.month.november": "\u0646\u0648\u0627\u0645\u0628\u0631", - "timeslider.month.december": "\u062f\u0633\u0627\u0645\u0628\u0631", - "timeslider.unnamedauthor": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", - "timeslider.unnamedauthors": "{{num}} \u0646\u0648\u06cc\u0633\u0646\u062f\u0647\u0654 \u0628\u06cc\u200c\u0646\u0627\u0645", - "pad.savedrevs.marked": "\u0627\u06cc\u0646 \u0628\u0627\u0632\u0646\u0648\u06cc\u0633\u06cc \u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0639\u0644\u0627\u0645\u062a\u200c\u06af\u0630\u0627\u0631\u06cc \u0634\u062f", - "pad.userlist.entername": "\u0646\u0627\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f", - "pad.userlist.unnamed": "\u0628\u062f\u0648\u0646 \u0646\u0627\u0645", - "pad.userlist.guest": "\u0645\u0647\u0645\u0627\u0646", - "pad.userlist.deny": "\u0631\u062f \u06a9\u0631\u062f\u0646", - "pad.userlist.approve": "\u067e\u0630\u06cc\u0631\u0641\u062a\u0646", - "pad.editbar.clearcolors": "\u0631\u0646\u06af \u0646\u0648\u06cc\u0633\u0646\u062f\u06af\u06cc \u0627\u0632 \u0647\u0645\u0647\u200c\u06cc \u0633\u0646\u062f \u067e\u0627\u06a9 \u0634\u0648\u062f\u061f", - "pad.impexp.importbutton": "\u0647\u0645 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646", - "pad.impexp.importing": "\u062f\u0631 \u062d\u0627\u0644 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc...", - "pad.impexp.confirmimport": "\u0628\u0627 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0646\u0648\u0634\u062a\u0647\u200c\u06cc \u06a9\u0646\u0648\u0646\u06cc \u062f\u0641\u062a\u0631\u0686\u0647 \u067e\u0627\u06a9 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0622\u06cc\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u062f\u061f", - "pad.impexp.convertFailed": "\u0645\u0627 \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u062e\u0648\u0627\u0647\u0634\u0645\u0646\u062f\u06cc\u0645 \u0642\u0627\u0644\u0628 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0633\u0646\u062f\u062a\u0627\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u06cc\u0627 \u0628\u0635\u0648\u0631\u062a \u062f\u0633\u062a\u06cc \u0622\u0646\u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f", - "pad.impexp.uploadFailed": "\u0622\u067e\u0644\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u0646\u0634\u062f\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u062a\u0644\u0627\u0634 \u06a9\u0646\u06cc\u062f", - "pad.impexp.importfailed": "\u062f\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0627\u0646\u062c\u0627\u0645 \u0646\u0634\u062f", - "pad.impexp.copypaste": "\u06a9\u067e\u06cc \u067e\u06cc\u0633\u062a \u06a9\u0646\u06cc\u062f", - "pad.impexp.exportdisabled": "\u0628\u0631\u0648\u0646\u200c\u0631\u06cc\u0632\u06cc \u0628\u0627 \u0642\u0627\u0644\u0628 {{type}} \u0627\u0632 \u06a9\u0627\u0631 \u0627\u0641\u062a\u0627\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0628\u0627 \u0645\u062f\u06cc\u0631 \u0633\u06cc\u0633\u062a\u0645\u062a\u0627\u0646 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f." -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "شما تنها می‌توانید از قالب متن ساده یا اچ‌تی‌ام‌ال درون‌ریزی کنید. برای بیشتر شدن ویژگی‌های درون‌ریزی پیشرÙته <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">AbiWord</a> را نصب کنید.", + "pad.modals.connected": "متصل شد.", + "pad.modals.reconnecting": "در Øال اتصال دوباره به دÙترچه یادداشت شما..", + "pad.modals.forcereconnect": "واداشتن به اتصال دوباره", + "pad.modals.userdup": "در پنجره‌ای دیگر باز شد", + "pad.modals.userdup.explanation": "گمان می‌رود این دÙترچه یادداشت در بیش از یک پنجره‌ی مرورگر باز شده‌است.", + "pad.modals.userdup.advice": "برای استÙاده از این پنجره دوباره وصل شوید.", + "pad.modals.unauth": "مجاز نیست", + "pad.modals.unauth.explanation": "دسترسی شما در Øین مشاهده‌ی این برگه تغییر یاÙته‌است. دوباره متصل شوید.", + "pad.modals.looping.explanation": "مشکلاتی ارتباطی با سرور همگام‌سازی وجود دارد.", + "pad.modals.looping.cause": "شاید شما از طریق یک Ùایروال یا پروکسی ناسازگار متصل شده‌اید.", + "pad.modals.initsocketfail": "سرور در دسترس نیست.", + "pad.modals.initsocketfail.explanation": "نمی‌توان به سرور همگام سازی وصل شد.", + "pad.modals.initsocketfail.cause": "شاید این به خاطر مشکلی در مرورگر یا اتصال اینترنتی شما باشد.", + "pad.modals.slowcommit.explanation": "سرور پاسخ نمی‌دهد.", + "pad.modals.slowcommit.cause": "این می‌تواند به خاطر مشکلاتی در اتصال به شبکه باشد.", + "pad.modals.badChangeset.explanation": "ویرایشی Ú©Ù‡ شما انجام داده‌اید توسط سرور همگام‌سازی نادرست طیقه‌بندی شده‌است.", + "pad.modals.badChangeset.cause": "این می‌تواند به دلیل پیکربندی اشتباه یا سایر رÙتارهای غیرمنتظره باشد. اگر Ùکر می‌کنید این یک خطا است لطÙاً با مدیر خدمت تماس بگیرید. برای ادامهٔ ویرایش سعی کنید Ú©Ù‡ دوباره متصل شوید.", + "pad.modals.corruptPad.explanation": "پدی Ú©Ù‡ شما سعی دارید دسترسی پیدا کنید خراب است.", + "pad.modals.corruptPad.cause": "این اØتمالاً به دلیل تنظیمات اشتباه کارساز یا سایر رÙتارهای غیرمنتظره است. لطÙاً با مدیر خدمت تماس Øاصل کنید.", + "pad.modals.deleted": "پاک شد.", + "pad.modals.deleted.explanation": "این دÙترچه یادداشت پاک شده‌است.", + "pad.modals.disconnected": "اتصال شما قطع شده‌است.", + "pad.modals.disconnected.explanation": "اتصال به سرور قطع شده‌است.", + "pad.modals.disconnected.cause": "ممکن است سرور در دسترس نباشد. اگر این مشکل باز هم رخ داد مدیر Øدمت را آگاه کنید.", + "pad.share": "به اشتراک‌گذاری این دÙترچه یادداشت", + "pad.share.readonly": "Ùقط خواندنی", + "pad.share.link": "پیوند", + "pad.share.emebdcode": "جاسازی نشانی", + "pad.chat": "Ú¯Ùتگو", + "pad.chat.title": "بازکردن Ú¯Ùتگو برای این دÙترچه یادداشت", + "pad.chat.loadmessages": "بارگیری پیام‌های بیشتر", + "timeslider.pageTitle": "لغزندهٔ زمان {{appTitle}}", + "timeslider.toolbar.returnbutton": "بازگشت به دÙترچه یادداشت", + "timeslider.toolbar.authors": "نویسندگان:", + "timeslider.toolbar.authorsList": "بدون نویسنده", + "timeslider.toolbar.exportlink.title": "برون‌ریزی", + "timeslider.exportCurrent": "برون‌ریزی نگارش کنونی به عنوان:", + "timeslider.version": "نگارش {{version}}", + "timeslider.saved": "{{month}} {{day}}ØŒ {{year}} ذخیره شد", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "ژانویه", + "timeslider.month.february": "Ùبریه", + "timeslider.month.march": "مارچ", + "timeslider.month.april": "آپریل", + "timeslider.month.may": "Ù…ÛŒ", + "timeslider.month.june": "ژوئن", + "timeslider.month.july": "جولای", + "timeslider.month.august": "آگوست", + "timeslider.month.september": "سپتامبر", + "timeslider.month.october": "اکتبر", + "timeslider.month.november": "نوامبر", + "timeslider.month.december": "دسامبر", + "timeslider.unnamedauthors": "{{num}} نویسندهٔ بی‌نام", + "pad.savedrevs.marked": "این بازنویسی هم اکنون به عنوان ذخیره شده علامت‌گذاری شد", + "pad.userlist.entername": "نام خود را بنویسید", + "pad.userlist.unnamed": "بدون نام", + "pad.userlist.guest": "مهمان", + "pad.userlist.deny": "رد کردن", + "pad.userlist.approve": "پذیرÙتن", + "pad.editbar.clearcolors": "رنگ نویسندگی از همه‌ی سند پاک شود؟", + "pad.impexp.importbutton": "هم اکنون درون‌ریزی Ú©Ù†", + "pad.impexp.importing": "در Øال درون‌ریزی...", + "pad.impexp.confirmimport": "با درون‌ریزی یک پرونده نوشتهٔ کنونی دÙترچه پاک می‌شود. آیا می‌خواهید ادامه دهید؟", + "pad.impexp.convertFailed": "ما نمی‌توانیم این پرونده را درون‌ریزی کنیم. خواهشمندیم قالب دیگری برای سندتان انتخاب کرده یا بصورت دستی آنرا Ú©Ù¾ÛŒ کنید", + "pad.impexp.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید", + "pad.impexp.importfailed": "درون‌ریزی انجام نشد", + "pad.impexp.copypaste": "Ú©Ù¾ÛŒ پیست کنید", + "pad.impexp.exportdisabled": "برون‌ریزی با قالب {{type}} از کار اÙتاده است. برای جزئیات بیشتر با مدیر سیستمتان تماس بگیرید." +} diff --git a/src/locales/fi.json b/src/locales/fi.json index eeb4cb16..656f0a21 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -1,51 +1,55 @@ { "@metadata": { - "authors": { - "0": "Artnay", - "1": "Jl", - "2": "Nedergard", - "3": "Nike", - "5": "Veikk0.ma", - "6": "VezonThunder" - } + "authors": [ + "Artnay", + "Jl", + "Lliehu", + "Nedergard", + "Nike", + "Stryn", + "Tomi Toivio", + "Veikk0.ma", + "VezonThunder" + ] }, "index.newPad": "Uusi muistio", - "index.createOpenPad": "tai luo tai avaa muistio nimell\u00e4:", + "index.createOpenPad": "tai luo tai avaa muistio nimellä:", "pad.toolbar.bold.title": "Lihavointi (Ctrl-B)", "pad.toolbar.italic.title": "Kursivointi (Ctrl-I)", "pad.toolbar.underline.title": "Alleviivaus (Ctrl-U)", "pad.toolbar.strikethrough.title": "Yliviivaus", "pad.toolbar.ol.title": "Numeroitu lista", "pad.toolbar.ul.title": "Numeroimaton lista", - "pad.toolbar.indent.title": "Sisenn\u00e4", - "pad.toolbar.unindent.title": "Ulonna", + "pad.toolbar.indent.title": "Sisennä (TAB)", + "pad.toolbar.unindent.title": "Ulonna (Shift+TAB)", "pad.toolbar.undo.title": "Kumoa (Ctrl-Z)", "pad.toolbar.redo.title": "Tee uudelleen (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Poista kirjoittajav\u00e4rit", + "pad.toolbar.clearAuthorship.title": "Poista kirjoittajavärit", "pad.toolbar.import_export.title": "Tuo tai vie eri tiedostomuodoista tai -muotoihin", "pad.toolbar.timeslider.title": "Aikajana", "pad.toolbar.savedRevision.title": "Tallenna muutos", "pad.toolbar.settings.title": "Asetukset", - "pad.toolbar.embed.title": "Upota muistio", - "pad.toolbar.showusers.title": "N\u00e4yt\u00e4 muistion k\u00e4ytt\u00e4j\u00e4t", + "pad.toolbar.embed.title": "Jaa ja upota muistio", + "pad.toolbar.showusers.title": "Näytä muistion käyttäjät", "pad.colorpicker.save": "Tallenna", - "pad.colorpicker.cancel": "Peruuta", - "pad.loading": "Ladataan\u2026", - "pad.passwordRequired": "T\u00e4m\u00e4 muistio on suojattu salasanalla.", - "pad.permissionDenied": "K\u00e4ytt\u00f6oikeutesi eiv\u00e4t riit\u00e4 t\u00e4m\u00e4n muistion k\u00e4ytt\u00e4miseen.", - "pad.wrongPassword": "V\u00e4\u00e4r\u00e4 salasana", + "pad.colorpicker.cancel": "Peru", + "pad.loading": "Ladataan…", + "pad.passwordRequired": "Tämä muistio on suojattu salasanalla.", + "pad.permissionDenied": "Käyttöoikeutesi eivät riitä tämän muistion käyttämiseen.", + "pad.wrongPassword": "Väärä salasana", "pad.settings.padSettings": "Muistion asetukset", - "pad.settings.myView": "Oma n\u00e4kym\u00e4", - "pad.settings.stickychat": "Keskustelu aina n\u00e4kyviss\u00e4", - "pad.settings.colorcheck": "Kirjoittajav\u00e4rit", + "pad.settings.myView": "Oma näkymä", + "pad.settings.stickychat": "Keskustelu aina näkyvissä", + "pad.settings.colorcheck": "Kirjoittajavärit", "pad.settings.linenocheck": "Rivinumerot", - "pad.settings.fontType": "Kirjasintyyppi:", + "pad.settings.rtlcheck": "Luetaanko sisältö oikealta vasemmalle?", + "pad.settings.fontType": "Fonttityyppi:", "pad.settings.fontType.normal": "normaali", "pad.settings.fontType.monospaced": "tasalevyinen", - "pad.settings.globalView": "Yleisn\u00e4kym\u00e4", + "pad.settings.globalView": "Yleisnäkymä", "pad.settings.language": "Kieli:", - "pad.importExport.import_export": "Tuonti\/vienti", - "pad.importExport.import": "L\u00e4het\u00e4 mik\u00e4 tahansa tekstitiedosto tai asiakirja", + "pad.importExport.import_export": "Tuonti/vienti", + "pad.importExport.import": "Lähetä mikä tahansa tekstitiedosto tai asiakirja", "pad.importExport.importSuccessful": "Onnistui!", "pad.importExport.export": "Vie muistio muodossa:", "pad.importExport.exporthtml": "HTML", @@ -54,40 +58,42 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Tuonti on tuettu vain HTML- ja raakatekstitiedostoista. Lis\u00e4tietoja tuonnin lis\u00e4asetuksista on sivulla <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">install abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Tuonti on tuettu vain HTML- ja raakatekstitiedostoista. Lisätietoja tuonnin lisäasetuksista on sivulla <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">install abiword</a>.", "pad.modals.connected": "Yhdistetty.", - "pad.modals.reconnecting": "Muodostetaan yhteytt\u00e4 muistioon uudelleen...", - "pad.modals.forcereconnect": "Pakota yhdist\u00e4m\u00e4\u00e4n uudelleen", + "pad.modals.reconnecting": "Muodostetaan yhteyttä muistioon uudelleen...", + "pad.modals.forcereconnect": "Pakota yhdistämään uudelleen", "pad.modals.userdup": "Avattu toisessa ikkunassa", - "pad.modals.userdup.explanation": "T\u00e4m\u00e4 muistio vaikuttaa olevan avoinna useammassa eri selainikkunassa t\u00e4ll\u00e4 koneella.", - "pad.modals.userdup.advice": "Yhdist\u00e4 uudelleen, jos haluat k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 ikkunaa.", - "pad.modals.unauth": "Oikeudet eiv\u00e4t riit\u00e4", - "pad.modals.unauth.explanation": "K\u00e4ytt\u00f6oikeutesi ovat muuttuneet katsellessasi t\u00e4t\u00e4 sivua. Yrit\u00e4 yhdist\u00e4\u00e4 uudelleen.", - "pad.modals.looping": "Yhteys katkaistu.", + "pad.modals.userdup.explanation": "Tämä muistio vaikuttaa olevan avoinna useammassa eri selainikkunassa tällä koneella.", + "pad.modals.userdup.advice": "Yhdistä uudelleen, jos haluat käyttää tätä ikkunaa.", + "pad.modals.unauth": "Oikeudet eivät riitä", + "pad.modals.unauth.explanation": "Käyttöoikeutesi ovat muuttuneet katsellessasi tätä sivua. Yritä yhdistää uudelleen.", "pad.modals.looping.explanation": "Synkronointipalvelimen kanssa on yhteysongelmia.", - "pad.modals.looping.cause": "Yhteytesi on mahdollisesti muodostettu yhteensopimattoman palomuurin tai v\u00e4lityspalvelimen kautta.", - "pad.modals.initsocketfail": "Palvelimeen ei saada yhteytt\u00e4.", - "pad.modals.initsocketfail.explanation": "Synkronointipalvelimeen ei saatu yhteytt\u00e4.", - "pad.modals.initsocketfail.cause": "T\u00e4m\u00e4 johtuu mit\u00e4 luultavimmin selaimestasi tai verkkoyhteydest\u00e4si.", - "pad.modals.slowcommit": "Yhteys katkaistu.", + "pad.modals.looping.cause": "Yhteytesi on mahdollisesti muodostettu yhteensopimattoman palomuurin tai välityspalvelimen kautta.", + "pad.modals.initsocketfail": "Palvelimeen ei saada yhteyttä.", + "pad.modals.initsocketfail.explanation": "Synkronointipalvelimeen ei saatu yhteyttä.", + "pad.modals.initsocketfail.cause": "Tämä johtuu mitä luultavimmin selaimestasi tai verkkoyhteydestäsi.", "pad.modals.slowcommit.explanation": "Palvelin ei vastaa.", - "pad.modals.slowcommit.cause": "T\u00e4m\u00e4 saattaa johtua verkkoyhteyden ongelmista.", + "pad.modals.slowcommit.cause": "Tämä saattaa johtua verkkoyhteyden ongelmista.", + "pad.modals.badChangeset.explanation": "Tekemäsi muutos määritettiin sääntöjen vastaiseksi synkronointipalvelimen toimesta.", + "pad.modals.badChangeset.cause": "Tämä saattaa johtua virheellisistä palvelinmäärityksistä tai muusta odottamattomasta toiminnasta. Ota yhteys palvelun ylläpitäjään, jos kyseessä on mielestäsi virhe. Yritä jatkaa muokkausta yhdistämällä uudelleen.", + "pad.modals.corruptPad.explanation": "Muistio jota yrität avata on vioittunut.", + "pad.modals.corruptPad.cause": "Tämä saattaa johtua virheellisistä palvelinmäärityksistä tai muusta odottamattomasta toiminnasta. Ota yhteys palvelun ylläpitäjään.", "pad.modals.deleted": "Poistettu.", - "pad.modals.deleted.explanation": "T\u00e4m\u00e4 muistio on poistettu.", + "pad.modals.deleted.explanation": "Tämä muistio on poistettu.", "pad.modals.disconnected": "Yhteytesi on katkaistu.", "pad.modals.disconnected.explanation": "Yhteys palvelimeen katkesi", - "pad.modals.disconnected.cause": "Palvelin saattaa olla k\u00e4ytt\u00e4m\u00e4tt\u00f6miss\u00e4. Ilmoitathan meille, jos t\u00e4m\u00e4 ongelma toistuu.", + "pad.modals.disconnected.cause": "Palvelin saattaa olla tavoittamattomissa. Ilmoita palvelun ylläpitäjälle, jos tilanne toistuu usein.", "pad.share": "Jaa muistio", "pad.share.readonly": "Vain luku", "pad.share.link": "Linkki", "pad.share.emebdcode": "Upotusosoite", "pad.chat": "Keskustelu", - "pad.chat.title": "Avaa keskustelu nykyisest\u00e4 muistiosta.", - "pad.chat.loadmessages": "Lataa lis\u00e4\u00e4 viestej\u00e4", + "pad.chat.title": "Avaa keskustelu nykyisestä muistiosta.", + "pad.chat.loadmessages": "Lataa lisää viestejä", "timeslider.pageTitle": "{{appTitle}} -aikajana", "timeslider.toolbar.returnbutton": "Palaa muistioon", - "timeslider.toolbar.authors": "Tekij\u00e4t:", - "timeslider.toolbar.authorsList": "Ei tekij\u00f6it\u00e4", + "timeslider.toolbar.authors": "Tekijät:", + "timeslider.toolbar.authorsList": "Ei tekijöitä", "timeslider.toolbar.exportlink.title": "Vie", "timeslider.exportCurrent": "Vie nykyinen versio muodossa:", "timeslider.version": "Versio {{version}}", @@ -98,28 +104,27 @@ "timeslider.month.march": "maaliskuu", "timeslider.month.april": "huhtikuu", "timeslider.month.may": "toukokuu", - "timeslider.month.june": "kes\u00e4kuu", - "timeslider.month.july": "hein\u00e4kuu", + "timeslider.month.june": "kesäkuu", + "timeslider.month.july": "heinäkuu", "timeslider.month.august": "elokuu", "timeslider.month.september": "syyskuu", "timeslider.month.october": "lokakuu", "timeslider.month.november": "marraskuu", "timeslider.month.december": "joulukuu", - "timeslider.unnamedauthor": "{{num}} nimet\u00f6n tekij\u00e4", - "timeslider.unnamedauthors": "{{num}} nimet\u00f6nt\u00e4 tekij\u00e4\u00e4", - "pad.savedrevs.marked": "T\u00e4m\u00e4 versio on nyt merkitty tallennetuksi versioksi", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: nimetön tekijä, other: nimetöntä tekijää ]}", + "pad.savedrevs.marked": "Tämä versio on nyt merkitty tallennetuksi versioksi", "pad.userlist.entername": "Kirjoita nimesi", - "pad.userlist.unnamed": "nimet\u00f6n", + "pad.userlist.unnamed": "nimetön", "pad.userlist.guest": "Vieras", - "pad.userlist.deny": "Est\u00e4", - "pad.userlist.approve": "Hyv\u00e4ksy", - "pad.editbar.clearcolors": "Poistetaanko asiakirjasta tekij\u00e4v\u00e4rit?", + "pad.userlist.deny": "Estä", + "pad.userlist.approve": "Hyväksy", + "pad.editbar.clearcolors": "Poistetaanko asiakirjasta tekijävärit?", "pad.impexp.importbutton": "Tuo nyt", "pad.impexp.importing": "Tuodaan...", "pad.impexp.confirmimport": "Tiedoston tuonti korvaa kaiken muistiossa olevan tekstin. Haluatko varmasti jatkaa?", - "pad.impexp.convertFailed": "TIedoston tuonti ep\u00e4onnistui. K\u00e4yt\u00e4 eri tiedostomuotoa tai kopioi ja liit\u00e4 k\u00e4sin.", - "pad.impexp.uploadFailed": "L\u00e4hetys ep\u00e4onnistui. Yrit\u00e4 uudelleen.", - "pad.impexp.importfailed": "Tuonti ep\u00e4onnistui", - "pad.impexp.copypaste": "Kopioi ja liit\u00e4", - "pad.impexp.exportdisabled": "Vienti muotoon \"{{type}}\" ei ole k\u00e4yt\u00f6ss\u00e4. Ota yhteys yll\u00e4pit\u00e4j\u00e4\u00e4n saadaksesi lis\u00e4tietoja." -}
\ No newline at end of file + "pad.impexp.convertFailed": "TIedoston tuonti epäonnistui. Käytä eri tiedostomuotoa tai kopioi ja liitä käsin.", + "pad.impexp.uploadFailed": "Lähetys epäonnistui. Yritä uudelleen.", + "pad.impexp.importfailed": "Tuonti epäonnistui", + "pad.impexp.copypaste": "Kopioi ja liitä", + "pad.impexp.exportdisabled": "Vienti muotoon \"{{type}}\" ei ole käytössä. Ota yhteys ylläpitäjään saadaksesi lisätietoja." +} diff --git a/src/locales/fo.json b/src/locales/fo.json new file mode 100644 index 00000000..cd72dec7 --- /dev/null +++ b/src/locales/fo.json @@ -0,0 +1,94 @@ +{ + "@metadata": { + "authors": [ + "EileenSanda" + ] + }, + "index.newPad": "Nýggjur teldil", + "pad.toolbar.bold.title": "Við feitum (Ctrl-B)", + "pad.toolbar.italic.title": "Skráskrift (Ctrl-I)", + "pad.toolbar.underline.title": "Undirstrikað (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Gjøgnumstrikað", + "pad.toolbar.ol.title": "BÃleggingarlisti", + "pad.toolbar.undo.title": "Angra (Ctrl-Z)", + "pad.toolbar.redo.title": "Ger umaftur (Ctrl-Y)", + "pad.toolbar.import_export.title": "Innflyt/Útflyt frá/til ymiskar fÃlustøddir", + "pad.toolbar.savedRevision.title": "Goym Endurskoðan", + "pad.toolbar.settings.title": "Innstillingar", + "pad.toolbar.embed.title": "Deil og Innset henda pad'in", + "pad.toolbar.showusers.title": "VÃs brúkarar á hesum paddi", + "pad.colorpicker.save": "Goym", + "pad.colorpicker.cancel": "Ógilda", + "pad.loading": "Løðir...", + "pad.passwordRequired": "Tú hevur brúk fyri einum loyniorði fyri at fáa atgongd til henda paddin", + "pad.permissionDenied": "Tú hevur ikki loyvi til at fáa atgongd til henda paddin", + "pad.wrongPassword": "TÃtt loyniorð var skeivt", + "pad.settings.padSettings": "Pad innstillingar", + "pad.settings.myView": "MÃn sýning", + "pad.settings.stickychat": "Kjatta altÃð á skerminum", + "pad.settings.colorcheck": "Litir hjá rithøvundaskapinum", + "pad.settings.linenocheck": "Linjunummur", + "pad.settings.rtlcheck": "Vil tú lesa innihaldið frá høgru til vinstu?", + "pad.settings.fontType": "Skriftslag:", + "pad.settings.fontType.normal": "Vanligt", + "pad.settings.fontType.monospaced": "Føst breidd", + "pad.settings.globalView": "Global sýning", + "pad.settings.language": "Mál:", + "pad.importExport.import_export": "Innflyt/Útflyt", + "pad.importExport.import": "Legg út onkra tekstfÃlu ella dokument", + "pad.importExport.importSuccessful": "Tað eydnaðist!", + "pad.importExport.export": "Útflyt 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ð Dokument Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Tú kanst bert innflyta frá einføldum teksti ella html formatum. Fyri funksjónir til innflytan fyri vÃðarikomin vinarliga <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installera abiword</a>.", + "pad.modals.connected": "Tú hevur samband.", + "pad.modals.reconnecting": "Roynir aftur at fáa samband við tÃn pad..", + "pad.modals.forcereconnect": "Tvinga endurstovnan av sambandi.", + "pad.modals.userdup": "Er latið upp à øðrum vindeyga", + "pad.modals.userdup.explanation": "Tað sær út til at hesin paddurin er latin upp à meira enn einum brovsara vindeyga á hesari telduni.", + "pad.modals.userdup.advice": "Endurstovna sambandi fyri at nýta hetta vindeyga à staðin.", + "pad.modals.unauth": "Er ikki loyvt", + "pad.modals.unauth.explanation": "TÃni loyvi eru broytt, meðan tú hevur hugt at hesi sÃðuni. Royn og endurstovna sambandi.", + "pad.modals.initsocketfail": "Ambætarin er óatkomuligur.", + "pad.modals.initsocketfail.cause": "Hetta skyldast mest sannlÃkt ein trupulleika við tÃnum kaga/brovsara ella við tÃnum internetsambandi.", + "pad.modals.slowcommit.explanation": "Ambætarin (servarin) svarar ikki.", + "pad.modals.slowcommit.cause": "Hetta kann skyldast trupulleikar við netverkssambandinum.", + "pad.modals.deleted": "Er strikað.", + "pad.modals.deleted.explanation": "Hesin paddurin er fluttur.", + "pad.modals.disconnected": "Tú hevur mist sambandi.", + "pad.modals.disconnected.explanation": "Sambandið til ambætarin er avbrotið", + "pad.share": "Deil henda paddin", + "pad.share.readonly": "Vart fyri skriving", + "pad.share.link": "Slóð", + "timeslider.toolbar.returnbutton": "Vend aftur til pad'in", + "timeslider.toolbar.authors": "Høvundar:", + "timeslider.toolbar.authorsList": "Ongir høvundar", + "timeslider.toolbar.exportlink.title": "Útflyt", + "timeslider.exportCurrent": "Útflyt hesa versjóna sum:", + "timeslider.version": "Versjón {{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Ãl", + "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.unnamedauthors": "{{num}} {[plural(num) one: ónevndur rithøvundur, other: ónevndir rithøvundar ]}", + "pad.savedrevs.marked": "Henda endurskoðanin er nú merkt sum ein goymd endurskoðan", + "pad.userlist.entername": "Skriva tÃtt navn", + "pad.userlist.unnamed": "ikki-navngivið", + "pad.userlist.guest": "Gestur", + "pad.userlist.deny": "Nokta", + "pad.userlist.approve": "Góðkenn" +} diff --git a/src/locales/fr.json b/src/locales/fr.json index 4131c723..757cd15a 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1,129 +1,137 @@ { "@metadata": { - "authors": { - "0": "Cquoi", - "1": "Crochet.david", - "2": "Gomoko", - "3": "Goofy", - "4": "Goofy-bz", - "5": "Jean-Fr\u00e9d\u00e9ric", - "6": "Leviathan", - "7": "McDutchie", - "8": "Od1n", - "10": "Tux-tn" - } + "authors": [ + "Cquoi", + "Crochet.david", + "Gomoko", + "Goofy", + "Goofy-bz", + "Jean-Frédéric", + "Leviathan", + "McDutchie", + "Metroitendo", + "Od1n", + "Peter17", + "Quenenni", + "Rastus Vernon", + "Stephane Cottin", + "Tux-tn", + "Maxim21" + ] }, - "index.newPad": "Nouveau Pad", - "index.createOpenPad": "ou cr\u00e9er\/ouvrir un Pad intitul\u00e9 :", + "index.newPad": "Nouveau pad", + "index.createOpenPad": "ou créer/ouvrir un pad intitulé :", "pad.toolbar.bold.title": "Gras (Ctrl-B)", "pad.toolbar.italic.title": "Italique (Ctrl-I)", - "pad.toolbar.underline.title": "Soulign\u00e9 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Barr\u00e9", - "pad.toolbar.ol.title": "Liste ordonn\u00e9e", - "pad.toolbar.ul.title": "Liste \u00e0 puces", - "pad.toolbar.indent.title": "Indenter", - "pad.toolbar.unindent.title": "D\u00e9sindenter", + "pad.toolbar.underline.title": "Souligné (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Barré", + "pad.toolbar.ol.title": "Liste ordonnée", + "pad.toolbar.ul.title": "Liste non ordonnée", + "pad.toolbar.indent.title": "Indenter (TAB)", + "pad.toolbar.unindent.title": "Désindenter (Maj+TAB)", "pad.toolbar.undo.title": "Annuler (Ctrl-Z)", - "pad.toolbar.redo.title": "R\u00e9tablir (Ctrl-Y)", + "pad.toolbar.redo.title": "Rétablir (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Effacer les couleurs identifiant les auteurs", - "pad.toolbar.import_export.title": "Importer\/Exporter de\/vers un format de fichier diff\u00e9rent", + "pad.toolbar.import_export.title": "Importer/Exporter de/vers un format de fichier différent", "pad.toolbar.timeslider.title": "Historique dynamique", - "pad.toolbar.savedRevision.title": "Versions enregistr\u00e9es", - "pad.toolbar.settings.title": "Param\u00e8tres", - "pad.toolbar.embed.title": "Int\u00e9grer ce Pad", - "pad.toolbar.showusers.title": "Afficher les utilisateurs du Pad", + "pad.toolbar.savedRevision.title": "Enregistrer la révision", + "pad.toolbar.settings.title": "Paramètres", + "pad.toolbar.embed.title": "Partager et intégrer ce pad", + "pad.toolbar.showusers.title": "Afficher les utilisateurs du pad", "pad.colorpicker.save": "Enregistrer", "pad.colorpicker.cancel": "Annuler", - "pad.loading": "Chargement\u2026", - "pad.passwordRequired": "Vous avez besoin d'un mot de passe pour acc\u00e9der \u00e0 ce Pad", - "pad.permissionDenied": "Il ne vous est pas permis d\u2019acc\u00e9der \u00e0 ce Pad", - "pad.wrongPassword": "Mot de passe incorrect", - "pad.settings.padSettings": "Param\u00e8tres du Pad", + "pad.loading": "Chargement…", + "pad.passwordRequired": "Vous avez besoin d'un mot de passe pour accéder à ce pad", + "pad.permissionDenied": "Il ne vous est pas permis d’accéder à ce pad", + "pad.wrongPassword": "Votre mot de passe est incorrect", + "pad.settings.padSettings": "Paramètres du pad", "pad.settings.myView": "Ma vue", "pad.settings.stickychat": "Toujours afficher le chat", - "pad.settings.colorcheck": "Couleurs d\u2019identification", - "pad.settings.linenocheck": "Num\u00e9ros de lignes", - "pad.settings.fontType": "Type de police :", + "pad.settings.colorcheck": "Couleurs d’identification", + "pad.settings.linenocheck": "Numéros de lignes", + "pad.settings.rtlcheck": "Lecture de droite à gauche", + "pad.settings.fontType": "Police :", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Vue d\u2019ensemble", + "pad.settings.globalView": "Vue d’ensemble", "pad.settings.language": "Langue :", - "pad.importExport.import_export": "Importer\/Exporter", + "pad.importExport.import_export": "Importer/Exporter", "pad.importExport.import": "Charger un texte ou un document", - "pad.importExport.importSuccessful": "R\u00e9ussi!", - "pad.importExport.export": "Exporter le Pad actuel comme :", + "pad.importExport.importSuccessful": "Réussi!", + "pad.importExport.export": "Exporter le pad actuel comme :", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texte brut", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalit\u00e9s d'importation plus \u00e9volu\u00e9es, veuillez <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer abiword<\/a>.", - "pad.modals.connected": "Connect\u00e9.", - "pad.modals.reconnecting": "Reconnexion vers votre Pad...", - "pad.modals.forcereconnect": "Forcer la reconnexion.", - "pad.modals.userdup": "Ouvert dans une autre fen\u00eatre", - "pad.modals.userdup.explanation": "Il semble que ce Pad soit ouvert dans plusieurs fen\u00eatres de votre navigateur sur cet ordinateur.", - "pad.modals.userdup.advice": "Se reconnecter en utilisant cette fen\u00eatre.", - "pad.modals.unauth": "Non autoris\u00e9", - "pad.modals.unauth.explanation": "Vos permissions ont \u00e9t\u00e9 chang\u00e9es lors de l'affichage de cette page. Essayez de vous reconnecter.", - "pad.modals.looping": "D\u00e9connect\u00e9.", - "pad.modals.looping.explanation": "Nous \u00e9prouvons un probl\u00e8me de communication au serveur de synchronisation.", - "pad.modals.looping.cause": "Il est possible que votre connexion soit prot\u00e9g\u00e9e par un pare-feu incompatible ou un serveur proxy incompatible.", + "pad.importExport.abiword.innerHTML": "Vous ne pouvez importer que des formats texte brut ou html. Pour des fonctionnalités d'importation plus évoluées, veuillez <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer abiword</a>.", + "pad.modals.connected": "Connecté.", + "pad.modals.reconnecting": "Reconnexion vers votre pad...", + "pad.modals.forcereconnect": "Forcer la reconnexion", + "pad.modals.userdup": "Ouvert dans une autre fenêtre", + "pad.modals.userdup.explanation": "Ce pad semble être ouvert dans plus d'une fenêtre de navigateur sur cet ordinateur.", + "pad.modals.userdup.advice": "Se reconnecter en utilisant cette fenêtre.", + "pad.modals.unauth": "Non autorisé", + "pad.modals.unauth.explanation": "Vos permissions ont été changées lors de l'affichage de cette page. Essayez de vous reconnecter.", + "pad.modals.looping.explanation": "Nous éprouvons un problème de communication au serveur de synchronisation.", + "pad.modals.looping.cause": "Il est possible que votre connexion soit protégée par un pare-feu ou un serveur mandataire incompatible.", "pad.modals.initsocketfail": "Le serveur est introuvable.", "pad.modals.initsocketfail.explanation": "Impossible de se connecter au serveur de synchronisation.", - "pad.modals.initsocketfail.cause": "Le probl\u00e8me peut venir de votre navigateur web ou de votre connexion Internet.", - "pad.modals.slowcommit": "D\u00e9connect\u00e9.", - "pad.modals.slowcommit.explanation": "Le serveur ne r\u00e9pond pas.", - "pad.modals.slowcommit.cause": "Ce probl\u00e8me peut venir d'une mauvaise connectivit\u00e9 au r\u00e9seau.", - "pad.modals.deleted": "Supprim\u00e9.", - "pad.modals.deleted.explanation": "Ce Pad a \u00e9t\u00e9 supprim\u00e9.", - "pad.modals.disconnected": "Vous avez \u00e9t\u00e9 d\u00e9connect\u00e9.", - "pad.modals.disconnected.explanation": "La connexion au serveur a \u00e9chou\u00e9.", - "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Veuillez nous en informer si le probl\u00e8me persiste.", - "pad.share": "Partager ce Pad", + "pad.modals.initsocketfail.cause": "Ceci est probablement dû à un problème avec votre navigateur ou votre connexion internet.", + "pad.modals.slowcommit.explanation": "Le serveur ne répond pas.", + "pad.modals.slowcommit.cause": "Ce problème peut venir d'une mauvaise connectivité au réseau.", + "pad.modals.badChangeset.explanation": "Une modification que vous avez effectuée a été classée comme illégale par le serveur de synchronisation.", + "pad.modals.badChangeset.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service, si vous pensez que c’est une erreur. Essayez de vous reconnecter pour continuer à modifier.", + "pad.modals.corruptPad.explanation": "Le bloc auquel vous essayez d’accéder est corrompu.", + "pad.modals.corruptPad.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service.", + "pad.modals.deleted": "Supprimé.", + "pad.modals.deleted.explanation": "Ce pad a été supprimé.", + "pad.modals.disconnected": "Vous avez été déconnecté.", + "pad.modals.disconnected.explanation": "La connexion au serveur a échoué.", + "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Si le problème persiste, veuillez en informer l’administrateur du service.", + "pad.share": "Partager ce pad", "pad.share.readonly": "Lecture seule", "pad.share.link": "Lien", - "pad.share.emebdcode": "Lien \u00e0 int\u00e9grer", + "pad.share.emebdcode": "Incorporer un lien", "pad.chat": "Chat", - "pad.chat.title": "Ouvrir le chat associ\u00e9 \u00e0 ce pad.", + "pad.chat.title": "Ouvrir le chat associé à 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": "Retourner 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.exportCurrent": "Exporter la version actuelle en :", "timeslider.version": "Version {{version}}", - "timeslider.saved": "Enregistr\u00e9 le {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}} {{month}} {{year}} {{hours}}:{{minutes}}:{{secondes}}", + "timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janvier", - "timeslider.month.february": "F\u00e9vrier", + "timeslider.month.february": "Février", "timeslider.month.march": "Mars", "timeslider.month.april": "Avril", "timeslider.month.may": "Mai", "timeslider.month.june": "Juin", "timeslider.month.july": "Juillet", - "timeslider.month.august": "Ao\u00fbt", + "timeslider.month.august": "Août", "timeslider.month.september": "Septembre", "timeslider.month.october": "Octobre", "timeslider.month.november": "Novembre", - "timeslider.month.december": "D\u00e9cembre", - "timeslider.unnamedauthor": "{{num}} auteur anonyme", - "timeslider.unnamedauthors": "{{num}} auteurs anonymes", - "pad.savedrevs.marked": "Cette r\u00e9vision est maintenant marqu\u00e9e comme r\u00e9vision enregistr\u00e9e", + "timeslider.month.december": "Décembre", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: auteur anonyme, other: auteurs anonymes ]}", + "pad.savedrevs.marked": "Cette révision est maintenant marquée comme révision enregistrée", "pad.userlist.entername": "Entrez votre nom", - "pad.userlist.unnamed": "sans nom", - "pad.userlist.guest": "Invit\u00e9", + "pad.userlist.unnamed": "anonyme", + "pad.userlist.guest": "Invité", "pad.userlist.deny": "Refuser", "pad.userlist.approve": "Approuver", - "pad.editbar.clearcolors": "Effacer les couleurs de paternit\u00e9 dans tout le document ?", + "pad.editbar.clearcolors": "Effacer les couleurs de paternité dans tout le document ?", "pad.impexp.importbutton": "Importer maintenant", "pad.impexp.importing": "Import en cours...", - "pad.impexp.confirmimport": "Importer un fichier \u00e9crasera le texte actuel du bloc. \u00cates-vous s\u00fbr de vouloir le faire?", - "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire un copier\/coller manuel", - "pad.impexp.uploadFailed": "Le t\u00e9l\u00e9chargement a \u00e9chou\u00e9, veuillez r\u00e9essayer", - "pad.impexp.importfailed": "\u00c9chec de l'importation", - "pad.impexp.copypaste": "Veuillez copier\/coller", - "pad.impexp.exportdisabled": "Exporter au format {{type}} est d\u00e9sactiv\u00e9. Veuillez contacter votre administrateur syst\u00e8me pour plus de d\u00e9tails." -}
\ No newline at end of file + "pad.impexp.confirmimport": "Importer un fichier écrasera le texte actuel du pad. Êtes-vous sûr de vouloir le faire?", + "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire un copier/coller manuel", + "pad.impexp.uploadFailed": "Le téléchargement a échoué, veuillez réessayer", + "pad.impexp.importfailed": "Échec de l'importation", + "pad.impexp.copypaste": "Veuillez copier/coller", + "pad.impexp.exportdisabled": "Exporter au format {{type}} est désactivé. Veuillez contacter votre administrateur système pour plus de détails." +} diff --git a/src/locales/gl.json b/src/locales/gl.json index 261d28ef..93855a8b 100644 --- a/src/locales/gl.json +++ b/src/locales/gl.json @@ -1,45 +1,46 @@ { "@metadata": { - "authors": { - "1": "Toli\u00f1o" - } + "authors": [ + "Toliño" + ] }, "index.newPad": "Novo documento", - "index.createOpenPad": "ou cree\/abra un documento co nome:", + "index.createOpenPad": "ou cree/abra un documento co nome:", "pad.toolbar.bold.title": "Negra (Ctrl-B)", "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Subli\u00f1ar (Ctrl-U)", + "pad.toolbar.underline.title": "Subliñar (Ctrl-U)", "pad.toolbar.strikethrough.title": "Riscar", "pad.toolbar.ol.title": "Lista ordenada", "pad.toolbar.ul.title": "Lista sen ordenar", - "pad.toolbar.indent.title": "Sangr\u00eda", - "pad.toolbar.unindent.title": "Sen sangr\u00eda", + "pad.toolbar.indent.title": "SangrÃa (TAB)", + "pad.toolbar.unindent.title": "Sen sangrÃa (Maiús.+TAB)", "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificaci\u00f3n dos autores", - "pad.toolbar.import_export.title": "Importar\/Exportar desde\/a diferentes formatos de ficheiro", - "pad.toolbar.timeslider.title": "Li\u00f1a do tempo", - "pad.toolbar.savedRevision.title": "Revisi\u00f3ns gardadas", - "pad.toolbar.settings.title": "Configuraci\u00f3ns", - "pad.toolbar.embed.title": "Incorporar este documento", + "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificación dos autores", + "pad.toolbar.import_export.title": "Importar/Exportar desde/a diferentes formatos de ficheiro", + "pad.toolbar.timeslider.title": "Liña do tempo", + "pad.toolbar.savedRevision.title": "Gardar a revisión", + "pad.toolbar.settings.title": "Configuracións", + "pad.toolbar.embed.title": "Compartir e incorporar este documento", "pad.toolbar.showusers.title": "Mostrar os usuarios deste documento", "pad.colorpicker.save": "Gardar", "pad.colorpicker.cancel": "Cancelar", "pad.loading": "Cargando...", - "pad.passwordRequired": "C\u00f3mpre un contrasinal para acceder a este documento", + "pad.passwordRequired": "Cómpre un contrasinal para acceder a este documento", "pad.permissionDenied": "Non ten permiso para acceder a este documento", "pad.wrongPassword": "O contrasinal era incorrecto", - "pad.settings.padSettings": "Configuraci\u00f3ns do documento", - "pad.settings.myView": "A mi\u00f1a vista", + "pad.settings.padSettings": "Configuracións do documento", + "pad.settings.myView": "A miña vista", "pad.settings.stickychat": "Chat sempre visible", - "pad.settings.colorcheck": "Cores de identificaci\u00f3n", - "pad.settings.linenocheck": "N\u00fameros de li\u00f1a", + "pad.settings.colorcheck": "Cores de identificación", + "pad.settings.linenocheck": "Números de liña", + "pad.settings.rtlcheck": "Quere ler o contido da dereita á esquerda?", "pad.settings.fontType": "Tipo de letra:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monoespazada", "pad.settings.globalView": "Vista global", "pad.settings.language": "Lingua:", - "pad.importExport.import_export": "Importar\/Exportar", + "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Cargar un ficheiro de texto ou documento", "pad.importExport.importSuccessful": "Correcto!", "pad.importExport.export": "Exportar o documento actual en formato:", @@ -49,72 +50,73 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "S\u00f3 pode importar texto simple ou formatos HTML. Para obter m\u00e1is informaci\u00f3n sobre as caracter\u00edsticas de importaci\u00f3n avanzadas <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instale abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Só pode importar texto simple ou formatos HTML. Para obter máis información sobre as caracterÃsticas de importación avanzadas <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instale abiword</a>.", "pad.modals.connected": "Conectado.", "pad.modals.reconnecting": "Reconectando co seu documento...", - "pad.modals.forcereconnect": "Forzar a reconexi\u00f3n", - "pad.modals.userdup": "Aberto noutra vent\u00e1", - "pad.modals.userdup.explanation": "Semella que este documento est\u00e1 aberto en varias vent\u00e1s do navegador neste ordenador.", - "pad.modals.userdup.advice": "Reconectar para usar esta vent\u00e1.", + "pad.modals.forcereconnect": "Forzar a reconexión", + "pad.modals.userdup": "Aberto noutra ventá", + "pad.modals.userdup.explanation": "Semella que este documento está aberto en varias ventás do navegador neste ordenador.", + "pad.modals.userdup.advice": "Reconectar para usar esta ventá.", "pad.modals.unauth": "Non autorizado", - "pad.modals.unauth.explanation": "Os seus permisos cambiaron mentres estaba nesta p\u00e1xina. Intente a reconexi\u00f3n.", - "pad.modals.looping": "Desconectado.", - "pad.modals.looping.explanation": "Hai un problema de comunicaci\u00f3n co servidor de sincronizaci\u00f3n.", - "pad.modals.looping.cause": "Seica a s\u00faa conexi\u00f3n pasa a trav\u00e9s dun firewall ou proxy incompatible.", + "pad.modals.unauth.explanation": "Os seus permisos cambiaron mentres estaba nesta páxina. Intente a reconexión.", + "pad.modals.looping.explanation": "Hai un problema de comunicación co servidor de sincronización.", + "pad.modals.looping.cause": "Seica a súa conexión pasa a través dun firewall ou proxy incompatible.", "pad.modals.initsocketfail": "Non se pode alcanzar o servidor.", - "pad.modals.initsocketfail.explanation": "Non se pode conectar co servidor de sincronizaci\u00f3n.", - "pad.modals.initsocketfail.cause": "Isto acontece probablemente debido a un problema co navegador ou coa conexi\u00f3n \u00e1 internet.", - "pad.modals.slowcommit": "Desconectado.", + "pad.modals.initsocketfail.explanation": "Non se pode conectar co servidor de sincronización.", + "pad.modals.initsocketfail.cause": "Isto acontece probablemente debido a un problema co navegador ou coa conexión á internet.", "pad.modals.slowcommit.explanation": "O servidor non responde.", - "pad.modals.slowcommit.cause": "Isto pode deberse a un problema de conexi\u00f3n \u00e1 rede.", + "pad.modals.slowcommit.cause": "Isto pode deberse a un problema de conexión á rede.", + "pad.modals.badChangeset.explanation": "O servidor de sincronización clasificou como ilegal unha das súas edicións.", + "pad.modals.badChangeset.cause": "Isto pode deberse a unha cofiguración errónea do servidor ou algún outro comportamento inesperado. Póñase en contacto co administrador do servizo, se pensa que isto é un erro. Intente reconectar para continuar editando.", + "pad.modals.corruptPad.explanation": "O documento ao que intenta acceder está corrompido.", + "pad.modals.corruptPad.cause": "Isto pode deberse a unha cofiguración errónea do servidor ou algún outro comportamento inesperado. Póñase en contacto co administrador do servizo.", "pad.modals.deleted": "Borrado.", "pad.modals.deleted.explanation": "Este documento foi eliminado.", "pad.modals.disconnected": "Foi desconectado.", - "pad.modals.disconnected.explanation": "Perdeuse a conexi\u00f3n co servidor", - "pad.modals.disconnected.cause": "O servidor non est\u00e1 dispo\u00f1ible. P\u00f3\u00f1ase en contacto con n\u00f3s se o problema contin\u00faa.", + "pad.modals.disconnected.explanation": "Perdeuse a conexión co servidor", + "pad.modals.disconnected.cause": "O servidor non está dispoñible. Póñase en contacto co administrador do servizo se o problema continúa.", "pad.share": "Compartir este documento", - "pad.share.readonly": "Lectura s\u00f3", - "pad.share.link": "Ligaz\u00f3n", + "pad.share.readonly": "Lectura só", + "pad.share.link": "Ligazón", "pad.share.emebdcode": "Incorporar o URL", "pad.chat": "Chat", "pad.chat.title": "Abrir o chat deste documento.", - "pad.chat.loadmessages": "Cargar m\u00e1is mensaxes", - "timeslider.pageTitle": "Li\u00f1a do tempo de {{appTitle}}", + "pad.chat.loadmessages": "Cargar máis mensaxes", + "timeslider.pageTitle": "Liña do tempo de {{appTitle}}", "timeslider.toolbar.returnbutton": "Volver ao documento", "timeslider.toolbar.authors": "Autores:", - "timeslider.toolbar.authorsList": "Ning\u00fan autor", + "timeslider.toolbar.authorsList": "Ningún autor", "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar a versi\u00f3n actual en formato:", - "timeslider.version": "Versi\u00f3n {{version}}", + "timeslider.exportCurrent": "Exportar a versión actual en formato:", + "timeslider.version": "Versión {{version}}", "timeslider.saved": "Gardado o {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "xaneiro", "timeslider.month.february": "febreiro", "timeslider.month.march": "marzo", "timeslider.month.april": "abril", "timeslider.month.may": "maio", - "timeslider.month.june": "xu\u00f1o", + "timeslider.month.june": "xuño", "timeslider.month.july": "xullo", "timeslider.month.august": "agosto", "timeslider.month.september": "setembro", "timeslider.month.october": "outubro", "timeslider.month.november": "novembro", "timeslider.month.december": "decembro", - "timeslider.unnamedauthor": "{{num}} autor an\u00f3nimo", - "timeslider.unnamedauthors": "{{num}} autores an\u00f3nimos", - "pad.savedrevs.marked": "Esta revisi\u00f3n est\u00e1 agora marcada como revisi\u00f3n gardada", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anónimo, other: autores anónimos ]}", + "pad.savedrevs.marked": "Esta revisión está agora marcada como revisión gardada", "pad.userlist.entername": "Insira o seu nome", - "pad.userlist.unnamed": "an\u00f3nimo", + "pad.userlist.unnamed": "anónimo", "pad.userlist.guest": "Convidado", "pad.userlist.deny": "Rexeitar", "pad.userlist.approve": "Aprobar", - "pad.editbar.clearcolors": "Quere limpar as cores de identificaci\u00f3n dos autores en todo o documento?", + "pad.editbar.clearcolors": "Quere limpar as cores de identificación dos autores en todo o documento?", "pad.impexp.importbutton": "Importar agora", "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "A importaci\u00f3n dun ficheiro ha sobrescribir o texto actual do documento. Est\u00e1 seguro de querer continuar?", + "pad.impexp.confirmimport": "A importación dun ficheiro ha sobrescribir o texto actual do documento. Está seguro de querer continuar?", "pad.impexp.convertFailed": "Non somos capaces de importar o ficheiro. Utilice un formato de documento diferente ou copie e pegue manualmente", - "pad.impexp.uploadFailed": "Houbo un erro ao cargar o ficheiro; int\u00e9nteo de novo", - "pad.impexp.importfailed": "Fallou a importaci\u00f3n", + "pad.impexp.uploadFailed": "Houbo un erro ao cargar o ficheiro; inténteo de novo", + "pad.impexp.importfailed": "Fallou a importación", "pad.impexp.copypaste": "Copie e pegue", - "pad.impexp.exportdisabled": "A exportaci\u00f3n en formato {{type}} est\u00e1 desactivada. P\u00f3\u00f1ase en contacto co administrador do sistema se quere m\u00e1is detalles." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "A exportación en formato {{type}} está desactivada. Póñase en contacto co administrador do sistema se quere máis detalles." +} diff --git a/src/locales/he.json b/src/locales/he.json index 7e5f3b04..555cb5f5 100644 --- a/src/locales/he.json +++ b/src/locales/he.json @@ -2,120 +2,124 @@ "@metadata": { "authors": [ "Amire80", - "Ofrahod" + "Ofrahod", + "YaronSh", + "תומר ט" ] }, - "index.newPad": "\u05e4\u05e0\u05e7\u05e1 \u05d7\u05d3\u05e9", - "index.createOpenPad": "\u05d0\u05d5 \u05d9\u05e6\u05d9\u05e8\u05d4 \u05d0\u05d5 \u05e4\u05ea\u05d9\u05d7\u05d4 \u05e9\u05dc \u05e4\u05e0\u05e7\u05e1 \u05e2\u05dd \u05d1\u05e9\u05dd:", - "pad.toolbar.bold.title": "\u05d1\u05d5\u05dc\u05d8 (Ctrl-B)", - "pad.toolbar.italic.title": "\u05e0\u05d8\u05d5\u05d9 (Ctrl-I)", - "pad.toolbar.underline.title": "\u05e7\u05d5 \u05ea\u05d7\u05ea\u05d9 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u05e7\u05d5 \u05de\u05d5\u05d7\u05e7", - "pad.toolbar.ol.title": "\u05e8\u05e9\u05d9\u05de\u05d4 \u05de\u05de\u05d5\u05e1\u05e4\u05e8\u05ea", - "pad.toolbar.ul.title": "\u05e8\u05e9\u05d9\u05de\u05d4", - "pad.toolbar.indent.title": "\u05d4\u05d6\u05d7\u05d4", - "pad.toolbar.unindent.title": "\u05e6\u05de\u05e6\u05d5\u05dd \u05d4\u05d6\u05d7\u05d4", - "pad.toolbar.undo.title": "\u05d1\u05d9\u05d8\u05d5\u05dc (Ctrl-Z)", - "pad.toolbar.redo.title": "\u05d1\u05d9\u05e6\u05d5\u05e2 \u05de\u05d7\u05d3\u05e9", - "pad.toolbar.clearAuthorship.title": "\u05e0\u05d9\u05e7\u05d5\u05d9 \u05e6\u05d1\u05e2\u05d9\u05dd", - "pad.toolbar.import_export.title": "\u05d9\u05d9\u05d1\u05d5\u05d0\/\u05d9\u05d9\u05e6\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8\u05d9 \u05e7\u05d1\u05e6\u05d9\u05dd \u05e9\u05d5\u05e0\u05d9\u05dd", - "pad.toolbar.timeslider.title": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df", - "pad.toolbar.savedRevision.title": "\u05d2\u05e8\u05e1\u05d0\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea", - "pad.toolbar.settings.title": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", - "pad.toolbar.embed.title": "\u05d4\u05d8\u05de\u05e2\u05ea \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.toolbar.showusers.title": "\u05d4\u05e6\u05d2\u05ea \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.colorpicker.save": "\u05e9\u05de\u05d9\u05e8\u05d4", - "pad.colorpicker.cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", - "pad.loading": "\u05d8\u05e2\u05d9\u05e0\u05d4...", - "pad.passwordRequired": "\u05d3\u05e8\u05d5\u05e9\u05d4 \u05e1\u05e1\u05de\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.permissionDenied": "\u05d0\u05d9\u05df \u05dc\u05da \u05d4\u05e8\u05e9\u05d0\u05d4 \u05dc\u05d2\u05e9\u05ea \u05dc\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.wrongPassword": "\u05e1\u05e1\u05de\u05ea\u05da \u05d4\u05d9\u05d9\u05ea\u05d4 \u05e9\u05d2\u05d5\u05d9\u05d4", - "pad.settings.padSettings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e4\u05e0\u05e7\u05e1", - "pad.settings.myView": "\u05d4\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e9\u05dc\u05d9", - "pad.settings.stickychat": "\u05d4\u05e9\u05d9\u05d7\u05d4 \u05ea\u05de\u05d9\u05d3 \u05e2\u05dc \u05d4\u05de\u05e1\u05da", - "pad.settings.colorcheck": "\u05e6\u05d1\u05d9\u05e2\u05d4 \u05dc\u05e4\u05d9 \u05de\u05d7\u05d1\u05e8", - "pad.settings.linenocheck": "\u05de\u05e1\u05e4\u05e8\u05d9 \u05e9\u05d5\u05e8\u05d5\u05ea", - "pad.settings.fontType": "\u05e1\u05d5\u05d2 \u05d2\u05d5\u05e4\u05df:", - "pad.settings.fontType.normal": "\u05e8\u05d2\u05d9\u05dc", - "pad.settings.fontType.monospaced": "\u05d1\u05e8\u05d5\u05d7\u05d1 \u05e7\u05d1\u05d5\u05e2", - "pad.settings.globalView": "\u05ea\u05e6\u05d5\u05d2\u05d4 \u05dc\u05db\u05dc \u05d4\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd", - "pad.settings.language": "\u05e9\u05e4\u05d4:", - "pad.importExport.import_export": "\u05d9\u05d9\u05d1\u05d5\u05d0\/\u05d9\u05d9\u05e6\u05d5\u05d0", - "pad.importExport.import": "\u05d4\u05e2\u05dc\u05d0\u05ea \u05db\u05dc \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e7\u05e1\u05d8 \u05d0\u05d5 \u05de\u05e1\u05de\u05da", - "pad.importExport.importSuccessful": "\u05d6\u05d4 \u05e2\u05d1\u05d3!", - "pad.importExport.export": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05d1\u05ea\u05d5\u05e8:", + "index.newPad": "×¤× ×§×¡ חדש", + "index.createOpenPad": "ליצור ×ו לפתוח ×¤× ×§×¡ בש×:", + "pad.toolbar.bold.title": "בולט (Ctrl-B)", + "pad.toolbar.italic.title": "× ×˜×•×™ (Ctrl-I)", + "pad.toolbar.underline.title": "קו תחתי (Ctrl-U)", + "pad.toolbar.strikethrough.title": "קו מוחק", + "pad.toolbar.ol.title": "רשימה ממוספרת", + "pad.toolbar.ul.title": "רשימה", + "pad.toolbar.indent.title": "×”×–×—×” (ט×ב)", + "pad.toolbar.unindent.title": "×¦×ž×¦×•× ×”×–×—×” (שיפט–ט×ב)", + "pad.toolbar.undo.title": "ביטול (Ctrl-Z)", + "pad.toolbar.redo.title": "ביצוע מחדש", + "pad.toolbar.clearAuthorship.title": "× ×™×§×•×™ צבעי×", + "pad.toolbar.import_export.title": "ייבו×/×™×™×¦×•× ×‘×ª×¡×“×™×¨×™ ×§×‘×¦×™× ×©×•× ×™×", + "pad.toolbar.timeslider.title": "גולל זמן", + "pad.toolbar.savedRevision.title": "שמירת גרסה", + "pad.toolbar.settings.title": "הגדרות", + "pad.toolbar.embed.title": "שיתוף והטמעה של ×”×¤× ×§×¡ ×”×–×”", + "pad.toolbar.showusers.title": "הצגת ×”×ž×©×ª×ž×©×™× ×‘×¤× ×§×¡ ×”×–×”", + "pad.colorpicker.save": "שמירה", + "pad.colorpicker.cancel": "ביטול", + "pad.loading": "×˜×¢×™× ×”...", + "pad.passwordRequired": "דרושה ססמה כדי לגשת ×œ×¤× ×§×¡ ×”×–×”", + "pad.permissionDenied": "×ין לך הרש××” לגשת ×œ×¤× ×§×¡ ×”×–×”", + "pad.wrongPassword": "ססמתך הייתה שגויה", + "pad.settings.padSettings": "הגדרות ×¤× ×§×¡", + "pad.settings.myView": "התצוגה שלי", + "pad.settings.stickychat": "השיחה תמיד על המסך", + "pad.settings.colorcheck": "צביעה לפי מחבר", + "pad.settings.linenocheck": "מספרי שורות", + "pad.settings.rtlcheck": "×œ×§×¨×•× ×ת התוכן מימין לשמ×ל?", + "pad.settings.fontType": "סוג גופן:", + "pad.settings.fontType.normal": "רגיל", + "pad.settings.fontType.monospaced": "ברוחב קבוע", + "pad.settings.globalView": "תצוגה לכל המשתמשי×", + "pad.settings.language": "שפה:", + "pad.importExport.import_export": "ייבו×/ייצו×", + "pad.importExport.import": "העל×ת כל קובץ טקסט ×ו מסמך", + "pad.importExport.importSuccessful": "×–×” עבד!", + "pad.importExport.export": "×™×™×¦×•× ×”×¤× ×§×¡ ×”× ×•×›×—×™ בתור:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u05d8\u05e7\u05e1\u05d8 \u05e8\u05d2\u05d9\u05dc", - "pad.importExport.exportword": "\u05de\u05d9\u05e7\u05e8\u05d5\u05e1\u05d5\u05e4\u05d8 \u05d5\u05d5\u05e8\u05d3", + "pad.importExport.exportplain": "טקסט רגיל", + "pad.importExport.exportword": "מיקרוסופט וורד", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u05d1\u05d0\u05e4\u05e9\u05e8\u05d5\u05ea\u05da \u05dc\u05d9\u05d9\u05d1\u05d0 \u05de\u05d8\u05e7\u05e1\u05d8 \u05e4\u05e9\u05d5\u05d8 \u05d0\u05d5 \u05de\u05beHTML. \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d9\u05d9\u05d1\u05d5\u05d0 \u05de\u05ea\u05e7\u05d3\u05de\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05d9\u05e9 <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u05dc\u05d4\u05ea\u05e7\u05d9\u05df \u05d0\u05ea abiword<\/a>.", - "pad.modals.connected": "\u05de\u05d7\u05d5\u05d1\u05db\u05e8.", - "pad.modals.reconnecting": "\u05de\u05ea\u05d1\u05e6\u05e2 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05de\u05d7\u05d3\u05e9...", - "pad.modals.forcereconnect": "\u05d7\u05d9\u05d1\u05d5\u05e8 \u05db\u05e4\u05d5\u05d9 \u05de\u05d7\u05d3\u05e9", - "pad.modals.userdup": "\u05e4\u05ea\u05d5\u05d7 \u05d1\u05d7\u05dc\u05d5\u05df \u05d0\u05d7\u05e8", - "pad.modals.userdup.explanation": "\u05e0\u05e8\u05d0\u05d4 \u05e9\u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4 \u05e4\u05ea\u05d5\u05d7 \u05d1\u05d9\u05d5\u05ea\u05e8 \u05de\u05d7\u05dc\u05d5\u05df \u05d3\u05e4\u05d3\u05e4\u05df \u05d0\u05d7\u05d3 \u05d1\u05de\u05d7\u05e9\u05d1 \u05d4\u05d6\u05d4.", - "pad.modals.userdup.advice": "\u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05de\u05d7\u05d3\u05e9 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05d7\u05dc\u05d5\u05df \u05d4\u05d6\u05d4.", - "pad.modals.unauth": "\u05d0\u05d9\u05df \u05d4\u05e8\u05e9\u05d0\u05d4", - "pad.modals.unauth.explanation": "\u05d4\u05d4\u05e8\u05e9\u05d0\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05e9\u05ea\u05e0\u05d5 \u05d1\u05d6\u05de\u05df \u05e9\u05e0\u05d9\u05e1\u05d9\u05ea \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8. \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05de\u05d7\u05d3\u05e9.", - "pad.modals.looping": "\u05dc\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8.", - "pad.modals.looping.explanation": "\u05d9\u05e9 \u05d1\u05e2\u05d9\u05d5\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8 \u05e2\u05dd \u05d4\u05e9\u05e8\u05ea \u05d4\u05de\u05ea\u05d0\u05dd.", - "pad.modals.looping.cause": "\u05d9\u05d9\u05ea\u05db\u05df \u05e9\u05d4\u05ea\u05d7\u05d1\u05e8\u05ea \u05d3\u05e8\u05da \u05d7\u05d5\u05de\u05ea\u05be\u05d0\u05e9 \u05d0\u05d5 \u05e9\u05e8\u05ea \u05de\u05ea\u05d5\u05d5\u05da \u05e9\u05d0\u05d9\u05e0\u05dd \u05de\u05ea\u05d0\u05d9\u05de\u05d9\u05dd.", - "pad.modals.initsocketfail": "\u05d0\u05d9\u05df \u05ea\u05e7\u05e9\u05d5\u05e8\u05d5\u05ea \u05dc\u05e9\u05e8\u05ea.", - "pad.modals.initsocketfail.explanation": "\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05dc\u05e9\u05e8\u05ea \u05d4\u05de\u05ea\u05d0\u05dd \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7\u05d4.", - "pad.modals.initsocketfail.cause": "\u05d0\u05d5\u05dc\u05d9 \u05d6\u05d4 \u05d1\u05d2\u05dc\u05dc \u05d4\u05d3\u05e4\u05d3\u05e4\u05df \u05e9\u05dc\u05da \u05d0\u05d5 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05d4\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8 \u05e9\u05dc\u05da.", - "pad.modals.slowcommit": "\u05de\u05e0\u05d5\u05ea\u05e7.", - "pad.modals.slowcommit.explanation": "\u05d4\u05e9\u05e8\u05ea \u05d0\u05d9\u05e0\u05d5 \u05de\u05d2\u05d9\u05d1.", - "pad.modals.slowcommit.cause": "\u05d0\u05d5\u05dc\u05d9 \u05d6\u05d4 \u05d1\u05d2\u05dc\u05dc \u05d1\u05e2\u05d9\u05d5\u05ea \u05e2\u05dd \u05ea\u05e7\u05e9\u05d5\u05e8\u05ea \u05dc\u05e8\u05e9\u05ea.", - "pad.modals.deleted": "\u05e0\u05de\u05d7\u05e7.", - "pad.modals.deleted.explanation": "\u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4 \u05d4\u05d5\u05e1\u05e8.", - "pad.modals.disconnected": "\u05e0\u05d5\u05ea\u05e7\u05ea.", - "pad.modals.disconnected.explanation": "\u05d4\u05ea\u05e7\u05e9\u05d5\u05e8\u05ea \u05dc\u05e9\u05e8\u05ea \u05d0\u05d1\u05d3\u05d4", - "pad.modals.disconnected.cause": "\u05d9\u05d9\u05ea\u05db\u05df \u05e9\u05d4\u05e9\u05e8\u05ea \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df. \u05e0\u05d0 \u05dc\u05d4\u05d5\u05e1\u05d9\u05e2 \u05dc\u05e0\u05d5 \u05d0\u05dd \u05d6\u05d4 \u05de\u05de\u05e9\u05d9\u05da \u05dc\u05e7\u05e8\u05d5\u05ea.", - "pad.share": "\u05e9\u05d9\u05ea\u05d5\u05e3 \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4", - "pad.share.readonly": "\u05e7\u05d9\u05e9\u05d5\u05e8", - "pad.share.link": "\u05e7\u05d9\u05e9\u05d5\u05e8", - "pad.share.emebdcode": "\u05d4\u05d8\u05de\u05e2\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8", - "pad.chat": "\u05e9\u05d9\u05d7\u05d4", - "pad.chat.title": "\u05e4\u05ea\u05d9\u05d7\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1 \u05d4\u05d6\u05d4.", - "pad.chat.loadmessages": "\u05d8\u05e2\u05d9\u05e0\u05ea \u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea", - "timeslider.pageTitle": "\u05d2\u05d5\u05dc\u05dc \u05d6\u05de\u05df \u05e9\u05dc {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u05d7\u05d6\u05e8\u05d4 \u05d0\u05dc \u05d4\u05e4\u05e0\u05e7\u05e1", - "timeslider.toolbar.authors": "\u05db\u05d5\u05ea\u05d1\u05d9\u05dd:", - "timeslider.toolbar.authorsList": "\u05d0\u05d9\u05df \u05db\u05d5\u05ea\u05d1\u05d9\u05dd", - "timeslider.toolbar.exportlink.title": "\u05d9\u05e6\u05d5\u05d0", - "timeslider.exportCurrent": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d4\u05db\u05e8\u05e1\u05d4 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05d1\u05ea\u05d5\u05e8:", - "timeslider.version": "\u05d2\u05e8\u05e1\u05d4 {{version}}", - "timeslider.saved": "\u05e0\u05e9\u05de\u05e8\u05d4 \u05d1\u05be{{day}} \u05d1{{month}} {{year}}", + "pad.importExport.abiword.innerHTML": "ב×פשרותך ×œ×™×™×‘× ×ž×˜×§×¡×˜ פשוט ×ו מ־HTML. ל×פשרויות ×™×™×‘×•× ×ž×ª×§×“×ž×•×ª יותר יש <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">להתקין ×ת abiword</a>.", + "pad.modals.connected": "מחובר.", + "pad.modals.reconnecting": "מתבצע חיבור מחדש...", + "pad.modals.forcereconnect": "לכפות חיבור מחדש", + "pad.modals.userdup": "פתוח בחלון ×חר", + "pad.modals.userdup.explanation": "× ×¨××” ×©×”×¤× ×§×¡ ×”×–×” פתוח ביותר מחלון דפדפן ×חד במחשב ×”×–×”.", + "pad.modals.userdup.advice": "להתחבר מחדש ב×מצעות החלון ×”×–×”.", + "pad.modals.unauth": "×ין הרש××”", + "pad.modals.unauth.explanation": "ההרש×ות שלך ×”×©×ª× ×• בזמן ×©× ×™×¡×™×ª להתחבר. × × ×œ× ×¡×•×ª להתחבר מחדש.", + "pad.modals.looping.explanation": "יש בעיות חיבור ×¢× ×”×©×¨×ª המת××.", + "pad.modals.looping.cause": "ייתכן שהתחברת דרך חומת־×ש ×ו שרת מתווך בלתי־תו×מי×.", + "pad.modals.initsocketfail": "×ין תקשורות לשרת.", + "pad.modals.initsocketfail.explanation": "התחברות לשרת המת×× ×œ× ×”×¦×œ×™×—×”.", + "pad.modals.initsocketfail.cause": "×ולי ×–×” בגלל הדפדפן שלך ×ו חיבור ×”××™× ×˜×¨× ×˜ שלך.", + "pad.modals.slowcommit.explanation": "השרת ××™× ×• מגיב.", + "pad.modals.slowcommit.cause": "×ולי ×–×” בגלל בעיות ×¢× ×ª×§×©×•×¨×ª לרשת.", + "pad.modals.badChangeset.explanation": "עריכה שעשית סווגה ×›×‘×œ×ª×™Ö¾×ª×§×™× ×” על־ידי שרת ×”×¡× ×›×¨×•×Ÿ.", + "pad.modals.badChangeset.cause": "ייתכן שזה קרה בגלל הגדרות שרת שגויות ×ו ×”×ª× ×”×’×•×ª בלתי־צפויה כלשהי. × × ×œ×™×¦×•×¨ קשר ×¢× ×”×ž× ×”×œ של השירות ×× × ×¨××” לך שז×ת שגי××”. כדי להמשיך לערוך יש ×œ× ×¡×•×ª להתחבר מחדש.", + "pad.modals.corruptPad.explanation": "×”× ×ª×•× ×™× ×‘×¤× ×§×¡ ×©× ×™×¡×™×ª לגשת ×ליו התקלקלו.", + "pad.modals.corruptPad.cause": "ייתכן שזה קרה בגלל הגדרות שרת שגויות ×ו ×”×ª× ×”×’×•×ª בלתי־צפויה כלשהי. × × ×œ×™×¦×•×¨ קשר ×¢× ×”×ž× ×”×œ של השירות ×× × ×¨××” לך שז×ת שגי××”.", + "pad.modals.deleted": "× ×ž×—×§.", + "pad.modals.deleted.explanation": "×”×¤× ×§×¡ ×”×–×” הוסר.", + "pad.modals.disconnected": "× ×•×ª×§×ª.", + "pad.modals.disconnected.explanation": "התקשורת לשרת ×בדה", + "pad.modals.disconnected.cause": "ייתכן שהשרת ××™× ×• זמין. × × ×œ×”×•×“×™×¢ ×œ×ž× ×”×œ השירות ×× ×–×” ממשיך לקרות.", + "pad.share": "שיתוף ×”×¤× ×§×¡ ×”×–×”", + "pad.share.readonly": "קישור", + "pad.share.link": "קישור", + "pad.share.emebdcode": "הטמעת קישור", + "pad.chat": "שיחה", + "pad.chat.title": "פתיחת השיחה של ×”×¤× ×§×¡ ×”×–×”.", + "pad.chat.loadmessages": "×˜×¢×™× ×ª הודעות × ×•×¡×¤×•×ª", + "timeslider.pageTitle": "גולל זמן של {{appTitle}}", + "timeslider.toolbar.returnbutton": "חזרה ×ל ×”×¤× ×§×¡", + "timeslider.toolbar.authors": "כותבי×:", + "timeslider.toolbar.authorsList": "×ין כותבי×", + "timeslider.toolbar.exportlink.title": "ייצו×", + "timeslider.exportCurrent": "×™×™×¦×•× ×”×’×¨×¡×” ×”× ×•×›×—×™×ª בתור:", + "timeslider.version": "גרסה {{version}}", + "timeslider.saved": "× ×©×ž×¨×” ב־{{day}} ב{{month}} {{year}}", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u05d9\u05e0\u05d5\u05d0\u05e8", - "timeslider.month.february": "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8", - "timeslider.month.march": "\u05de\u05e8\u05e5", - "timeslider.month.april": "\u05d0\u05e4\u05e8\u05d9\u05dc", - "timeslider.month.may": "\u05de\u05d0\u05d9", - "timeslider.month.june": "\u05d9\u05d5\u05e0\u05d9", - "timeslider.month.july": "\u05d9\u05d5\u05dc\u05d9", - "timeslider.month.august": "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8", - "timeslider.month.september": "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8", - "timeslider.month.october": "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8", - "timeslider.month.november": "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8", - "timeslider.month.december": "\u05d3\u05e6\u05de\u05d1\u05e8", - "timeslider.unnamedauthor": "\u05db\u05d5\u05ea\u05d1 \u05d7\u05e1\u05e8\u05be\u05e9\u05dd \u05d0\u05d7\u05d3", - "timeslider.unnamedauthors": "{{num}} \u05db\u05d5\u05ea\u05d1\u05d9\u05dd \u05d7\u05e1\u05e8\u05d9\u05be\u05e9\u05dd", - "pad.savedrevs.marked": "\u05d2\u05e8\u05e1\u05d4 \u05d6\u05d5 \u05de\u05e1\u05d5\u05de\u05e0\u05ea \u05db\u05d2\u05e8\u05e1\u05d4 \u05e9\u05de\u05d5\u05e8\u05d4", - "pad.userlist.entername": "\u05e0\u05d0 \u05dc\u05d4\u05d6\u05d9\u05df \u05d0\u05ea \u05e9\u05de\u05da", - "pad.userlist.unnamed": "\u05dc\u05dc\u05d0 \u05e9\u05dd", - "pad.userlist.guest": "\u05d0\u05d5\u05e8\u05d7", - "pad.userlist.deny": "\u05dc\u05d3\u05d7\u05d5\u05ea", - "pad.userlist.approve": "\u05dc\u05d0\u05e9\u05e8", - "pad.editbar.clearcolors": "\u05dc\u05e0\u05e7\u05d5\u05ea \u05e6\u05d1\u05e2\u05d9\u05dd \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05db\u05d5\u05ea\u05d1\u05d9\u05dd \u05d1\u05db\u05dc \u05d4\u05de\u05e1\u05de\u05da?", - "pad.impexp.importbutton": "\u05dc\u05d9\u05d9\u05d1\u05d0 \u05db\u05e2\u05ea", - "pad.impexp.importing": "\u05d9\u05d9\u05d1\u05d5\u05d0...", - "pad.impexp.confirmimport": "\u05d9\u05d1\u05d5\u05d0 \u05e9\u05dc \u05e7\u05d5\u05d1\u05e5 \u05d9\u05d1\u05d8\u05dc \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05d1\u05e4\u05e0\u05e7\u05e1. \u05d4\u05d0\u05dd \u05d0\u05ea\u05dd \u05d1\u05d8\u05d5\u05d7\u05d9\u05dd \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05db\u05dd \u05dc\u05d4\u05de\u05e9\u05d9\u05da?", - "pad.impexp.convertFailed": "\u05dc\u05d0 \u05d4\u05ea\u05d7\u05dc\u05dc\u05d0 \u05d4\u05e6\u05dc\u05d7\u05e0\u05d5 \u05dc\u05d9\u05d9\u05d1\u05d0 \u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d4\u05d6\u05d4. \u05e0\u05d0 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8 \u05de\u05e1\u05de\u05da \u05e9\u05d5\u05e0\u05d4 \u05d0\u05d5 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7 \u05d9\u05d3\u05e0\u05d9\u05ea", - "pad.impexp.uploadFailed": "\u05d4\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4, \u05e0\u05d0 \u05dc\u05e0\u05e1\u05d5\u05ea \u05e9\u05d5\u05d1", - "pad.impexp.importfailed": "\u05d4\u05d9\u05d9\u05d1\u05d5\u05d0 \u05e0\u05db\u05e9\u05dc", - "pad.impexp.copypaste": "\u05e0\u05d0 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7", - "pad.impexp.exportdisabled": "\u05d9\u05d9\u05e6\u05d5\u05d0 \u05d1\u05ea\u05e1\u05d3\u05d9\u05e8 {{type}} \u05d0\u05d9\u05e0\u05d5 \u05e4\u05e2\u05d9\u05dc. \u05de\u05e0\u05d4\u05dc \u05d4\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05dc\u05da \u05d9\u05d5\u05db\u05dc \u05dc\u05e1\u05e4\u05e8 \u05dc\u05da \u05e2\u05dc \u05d6\u05d4 \u05e2\u05d5\u05d3 \u05e4\u05e8\u05d8\u05d9\u05dd." -}
\ No newline at end of file + "timeslider.month.january": "×™× ×•×ר", + "timeslider.month.february": "פברו×ר", + "timeslider.month.march": "מרץ", + "timeslider.month.april": "×פריל", + "timeslider.month.may": "מ××™", + "timeslider.month.june": "×™×•× ×™", + "timeslider.month.july": "יולי", + "timeslider.month.august": "×וגוסט", + "timeslider.month.september": "ספטמבר", + "timeslider.month.october": "×וקטובר", + "timeslider.month.november": "× ×•×‘×ž×‘×¨", + "timeslider.month.december": "דצמבר", + "timeslider.unnamedauthors": "{[plural(num) one: יוצר ×חד, other: {{num}} ×™×•×¦×¨×™× ]} ×œ×œ× ×©×", + "pad.savedrevs.marked": "גרסה זו ×ž×¡×•×ž× ×ª כגרסה שמורה", + "pad.userlist.entername": "× × ×œ×”×–×™×Ÿ ×ת שמך", + "pad.userlist.unnamed": "×œ×œ× ×©×", + "pad.userlist.guest": "×ורח", + "pad.userlist.deny": "לדחות", + "pad.userlist.approve": "ל×שר", + "pad.editbar.clearcolors": "×œ× ×§×•×ª ×¦×‘×¢×™× ×œ×¡×™×ž×•×Ÿ ×›×•×ª×‘×™× ×‘×›×œ המסמך?", + "pad.impexp.importbutton": "×œ×™×™×‘× ×›×¢×ª", + "pad.impexp.importing": "ייבו×...", + "pad.impexp.confirmimport": "×™×™×‘×•× ×©×œ קובץ יבטל ×ת הטקסט ×”× ×•×›×—×™ ×‘×¤× ×§×¡. ×”×× ×‘×¨×¦×•× ×š להמשיך?", + "pad.impexp.convertFailed": "×œ× ×”×¦×œ×—× ×• ×œ×™×™×‘× ×ת הקובץ ×”×–×”. × × ×œ×”×©×ª×ž×© בתסדיר מסמך ×©×•× ×” ×ו להעתיק ולהדביק ×™×“× ×™×ª", + "pad.impexp.uploadFailed": "ההעל××” × ×›×©×œ×”, × × ×œ× ×¡×•×ª שוב", + "pad.impexp.importfailed": "×”×™×™×‘×•× × ×›×©×œ", + "pad.impexp.copypaste": "× × ×œ×”×¢×ª×™×§ ולהדביק", + "pad.impexp.exportdisabled": "×™×™×¦×•× ×‘×ª×¡×“×™×¨ {{type}} ××™× ×• פעיל. ×ž× ×”×œ המערכת שלך יוכל לספר לך על ×–×” עוד פרטי×." +} diff --git a/src/locales/hrx.json b/src/locales/hrx.json new file mode 100644 index 00000000..808a1297 --- /dev/null +++ b/src/locales/hrx.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "Paul Beppler" + ] + }, + "index.newPad": "Neies Pad", + "index.createOpenPad": "Pad mit follichendem Noome uffmache:", + "pad.toolbar.bold.title": "Fett (Strg-B)", + "pad.toolbar.italic.title": "Kursiv (Strg-I)", + "pad.toolbar.underline.title": "Unnerstrich (Strg-U)", + "pad.toolbar.strikethrough.title": "Dorrichgestrich", + "pad.toolbar.ol.title": "Nummerierte List", + "pad.toolbar.ul.title": "Ungeordnete List", + "pad.toolbar.indent.title": "Einrück (TAB)", + "pad.toolbar.unindent.title": "Ausrück (Shift+TAB)", + "pad.toolbar.undo.title": "Rückgängich (Strg-Z)", + "pad.toolbar.redo.title": "Wiederhole (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Autorefarbe zurücksetze", + "pad.toolbar.import_export.title": "Import/Export von/zu verschiedne Dateiformate", + "pad.toolbar.timeslider.title": "Pad-Versionsgeschicht oonzeiche", + "pad.toolbar.savedRevision.title": "Version markiere", + "pad.toolbar.settings.title": "Einstellunge", + "pad.toolbar.embed.title": "Pad teile orrer inbette", + "pad.toolbar.showusers.title": "Aktuell verbundne Benutzer oonzeiche", + "pad.colorpicker.save": "Speichre", + "pad.colorpicker.cancel": "Abbreche", + "pad.loading": "Loode …", + "pad.passwordRequired": "Sie benötiche en Passwort, um uff das Pad zuzugreife", + "pad.permissionDenied": "Du host ken Berechtichung, um uff das Pad zuzugreif", + "pad.wrongPassword": "Dein Passwort woor falsch", + "pad.settings.padSettings": "Pad Einstellunge", + "pad.settings.myView": "Eichne Oonsicht", + "pad.settings.stickychat": "Chat immer oonzeiche", + "pad.settings.colorcheck": "Autorenfarbe oonzeiche", + "pad.settings.linenocheck": "Zeilenummer", + "pad.settings.rtlcheck": "Inhalt von rechts bis links lese?", + "pad.settings.fontType": "Schriftoort:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Gemeinsame Oonsicht", + "pad.settings.language": "Sproch:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Text-Datei orrer Dokument hochloode", + "pad.importExport.importSuccessful": "Erfollichreich!", + "pad.importExport.export": "Aktuelles Pad exportiere wie:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Textdatei", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Sie können nur aus Klartext oder HTML-Formaten importieren. Für mehr erweiterte Importfunktionen <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installieren Sie bitte abiword</a>.", + "pad.modals.connected": "Verbünd (konnektiert).", + "pad.modals.reconnecting": "Wiederherstelle von der Verbinnung …", + "pad.modals.forcereconnect": "Erneit Verbinne", + "pad.modals.userdup": "In enem andren Fenster schon uff (geöffnet)", + "pad.modals.userdup.explanation": "Das Pad scheint in meahr wie enem Browser-Fenster uff dem Komputadoar uff sin (geöffnet zu sein).", + "pad.modals.userdup.advice": "Um das Fenster se benutze, verbinn bittschön wieder erneit.", + "pad.modals.unauth": "Net authorisiert.", + "pad.modals.unauth.explanation": "Dein Zugriffsberechtichung für das Pad hot sich zwischichzeitlich geännert. Du kannst versuche das Pad wieder erneit uffserufe.", + "pad.modals.looping.explanation": "Es gebt Probleme bei der Kommunikation mit dem Pad-Server.", + "pad.modals.looping.cause": "Möchlicherweis bist dorrich en inkompatible Firewall orrer üwer en inkompatible Proxy mit dem Pad-Server verbünd (konnektiert).", + "pad.modals.initsocketfail": "Pad-Server net erreichbar.", + "pad.modals.initsocketfail.explanation": "Do konnt ken Verbinnung zum Pad-Server heargestellt sin.", + "pad.modals.initsocketfail.cause": "Dies könnt an deinem Browser orrer dein Internet-Verbinnung leihe.", + "pad.modals.slowcommit.explanation": "Der Pad-Server reagiert net.", + "pad.modals.slowcommit.cause": "Das könnt en Netzwerkverbinnungsproblem sin orrer en momentane Ãœwerlaschtung von der Pad-Server.", + "pad.modals.badChangeset.explanation": "En von dein gemachte Ännrung woard vom Pad-Server wie ungültich ingeschtuft (klassifiziert).", + "pad.modals.badChangeset.cause": "Das könnt uffgrund von en falsche Serverkonfiguration orrer en annre unerwoortete Verhalt passiert sin. Bittschön kontaktier den Diensteadministratoar, falls du gloobst, dass das sich um en Fehler handelt. Versuch dich wieder erneit se verbinne, um mit dem Beoorbeite fortzufoohre.", + "pad.modals.corruptPad.explanation": "Das Pad, uff das du zugreife willst, ist beschädicht.", + "pad.modals.corruptPad.cause": "Das könnt an en falsche Serverkonfiguration orrer en annre unerwoortete Verhalten liehn. Bittschön kontaktier den Diensteadministratoar.", + "pad.modals.deleted": "Abgewischt.", + "pad.modals.deleted.explanation": "Das Pad woard entfernt.", + "pad.modals.disconnected": "Verbinnung unnerbroch (du bist jetzt deskonnektiert).", + "pad.modals.disconnected.explanation": "Die Verbinnung (konnektion) zu dem Pad-Server woard unnerbroch.", + "pad.modals.disconnected.cause": "Möchlicherweis ist der Pad-Server net erreichbar. Bittschön benachrichtig den Dienstadministratoar, falls das weiterhin passiere tut.", + "pad.share": "Das Pad teile", + "pad.share.readonly": "Ingeschränkter Nur-Lese-Zugriff", + "pad.share.link": "Link", + "pad.share.emebdcode": "In Webseite einbette", + "pad.chat": "Chat", + "pad.chat.title": "Den Chat von dem Pad uffmache", + "pad.chat.loadmessages": "Weitre Nachrichte loode", + "timeslider.pageTitle": "{{appTitle}} Pad-Versionsgeschicht", + "timeslider.toolbar.returnbutton": "Zurück zum Pad", + "timeslider.toolbar.authors": "Autore:", + "timeslider.toolbar.authorsList": "ken Autore", + "timeslider.toolbar.exportlink.title": "Die Version exportiere", + "timeslider.exportCurrent": "Exportier die Version wie:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Gespeichert am {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januar", + "timeslider.month.february": "Februar", + "timeslider.month.march": "März", + "timeslider.month.april": "April", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juni", + "timeslider.month.july": "Juli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Dezember", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: unbenannter Autoar, other: unbenannte Autore ]}", + "pad.savedrevs.marked": "Die Version woard jetzt wie gespeicherte Version gekennzeichnet", + "pad.userlist.entername": "Tue en Noome ren gebe", + "pad.userlist.unnamed": "unbenannt", + "pad.userlist.guest": "Gast", + "pad.userlist.deny": "Verweihe (negiere)", + "pad.userlist.approve": "Genehmiche (approviere)", + "pad.editbar.clearcolors": "Autorefarbe im gesamte Dokument zurücksetze?", + "pad.impexp.importbutton": "Jetzt importiere", + "pad.impexp.importing": "Importiere …", + "pad.impexp.confirmimport": "Das Importiere von en Datei üwerschreibt den aktuelle Text von dem Pad. Willst du weerklich fortfoohre?", + "pad.impexp.convertFailed": "Mir könne die Datei net importiere. Bittschön verwenn en anner Dokumentformat orrer üwertrooh den Text manuell.", + "pad.impexp.uploadFailed": "Der Upload ist fehlgeschloohn (das hot net funktioniert). Bittschön versuch das wieder erneit.", + "pad.impexp.importfailed": "Import fehlgeschloohn (das hot net funktioniert)", + "pad.impexp.copypaste": "Bittschön tue kopiere und einfüche (oonklebe)", + "pad.impexp.exportdisabled": "Der Export im {{type}}-Format ist deaktiviert. Für Einzelheite (Detalhes) tue bittschön dein Systemadministratoar kontaktiere." +} diff --git a/src/locales/hsb.json b/src/locales/hsb.json new file mode 100644 index 00000000..c86f6078 --- /dev/null +++ b/src/locales/hsb.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "index.newPad": "Nowy zapisnik", + "index.createOpenPad": "abo wutwor/woÄiÅ„ zapisnik z mjenom:", + "pad.toolbar.bold.title": "TuÄny (Strg-B)", + "pad.toolbar.italic.title": "Kursiwny (Strg-I)", + "pad.toolbar.underline.title": "PodÅ¡mórnyć (Strg-U)", + "pad.toolbar.strikethrough.title": "PÅ™eÅ¡mórnyć", + "pad.toolbar.ol.title": "ÄŒisÅ‚owana lisćina", + "pad.toolbar.ul.title": "NaliÄenje", + "pad.toolbar.indent.title": "Zasunyć (TAB)", + "pad.toolbar.unindent.title": "Wusunyć (Umsch+TAB)", + "pad.toolbar.undo.title": "Cofnyć (Strg-Z)", + "pad.toolbar.redo.title": "Wospjetować (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Awtorowe barby wotstronić", + "pad.toolbar.import_export.title": "Import/Eksport z/do druhich datajowych formatow", + "pad.toolbar.timeslider.title": "Historijowa strona", + "pad.toolbar.savedRevision.title": "Wersiju skÅ‚adować", + "pad.toolbar.settings.title": "Nastajenja", + "pad.toolbar.embed.title": "Tutón zapisnik dźělić a zasadźić", + "pad.toolbar.showusers.title": "Wužiwarjow na tutym zapisniku pokazać", + "pad.colorpicker.save": "SkÅ‚adować", + "pad.colorpicker.cancel": "PÅ™etorhnyć", + "pad.loading": "ZaÄituje so...", + "pad.passwordRequired": "TrjebaÅ¡ hesÅ‚o, zo by na tutón zapisnik pÅ™istup měł", + "pad.permissionDenied": "Nimaće prawo za pÅ™istup na tutón zapisnik.", + "pad.wrongPassword": "Twoje hesÅ‚o bÄ› wopak", + "pad.settings.padSettings": "Nastajenja zapisnika", + "pad.settings.myView": "Mój napohlad", + "pad.settings.stickychat": "Chat pÅ™eco na wobrazowce pokazać", + "pad.settings.colorcheck": "Awtorowe barby", + "pad.settings.linenocheck": "Linkowe ÄisÅ‚a", + "pad.settings.rtlcheck": "Wobsah wotprawa nalÄ›wo Äitać?", + "pad.settings.fontType": "Pismowa družina:", + "pad.settings.fontType.normal": "Normalny", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Globalny napohlad", + "pad.settings.language": "RÄ›Ä:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Tekstowu dataju abo dokument nahrać", + "pad.importExport.importSuccessful": "Wuspěšny!", + "pad.importExport.export": "Aktualny zapisnik eksportować jako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Luty tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "MóžeÅ¡ jenož z formatow luteho teksta abo z HTML-formata importować. Za bóle rozÅ¡Ä›rjene importowanske funkcije <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instaluj proÅ¡u Abiword</a>.", + "pad.modals.connected": "Zwjazany.", + "pad.modals.reconnecting": "Zwjazuje so znowa z twojim zapisnikom...", + "pad.modals.forcereconnect": "Znowa zwjazać", + "pad.modals.userdup": "W druhim woknje woÄinjeny", + "pad.modals.userdup.explanation": "Zda so, zo tutón zapisnik je so we wjace haÄ jednym woknje wobhladowaka na tutym liÄaku woÄiniÅ‚.", + "pad.modals.userdup.advice": "Zwjazaj znowa, zo by tute wokno mÄ›sto toho wužiwaÅ‚.", + "pad.modals.unauth": "Njeawtorizowany", + "pad.modals.unauth.explanation": "PÅ™i wobhladowanju tuteje strony su so twoje prawa zmÄ›nili. Spytaj so znowa zwjazać.", + "pad.modals.looping.explanation": "Su komunikaciske problemy ze synchronizowanskim serwerom.", + "pad.modals.looping.cause": "Snano sy pÅ™ez njekompatibelnu wohnjowu murju abo proksy zwjazany.", + "pad.modals.initsocketfail": "Serwer je njedocpÄ›jomny.", + "pad.modals.initsocketfail.explanation": "Zwisk ze synchronizowanskim serwerom móžno njeje.", + "pad.modals.initsocketfail.cause": "To je najskerje problem z twojim wobhladowakom abo twojim internetnym zwiskom.", + "pad.modals.slowcommit.explanation": "Serwer njewotmoÅ‚wja.", + "pad.modals.slowcommit.cause": "To móhÅ‚o problem syćoweho zwiska być.", + "pad.modals.badChangeset.explanation": "ZmÄ›na, kotruž sy pÅ™ewjedÅ‚, je so pÅ™ez synchronizowanski serwer jako njedowolenu woznamjeniÅ‚a.", + "pad.modals.badChangeset.cause": "To je so snano wopaÄneje serweroweje konfiguracije dla abo druheho njewoÄakowaneho zadźerženja dla staÅ‚o. ProÅ¡u staj so ze sÅ‚užbowym administratorom do zwiska, jeli sej mysliÅ¡, zo to je zmylk. Spytaj hišće raz zwjazać, zo by z wobdźěłowanjom pokroÄowaÅ‚.", + "pad.modals.corruptPad.explanation": "Zapisnik, na kotryž chceÅ¡ pÅ™istup měć, je wobÅ¡kodźeny.", + "pad.modals.corruptPad.cause": "To je so snano wopaÄneje serweroweje konfiguracije dla abo druheho njewoÄakowaneho zadźerženja dla staÅ‚o. ProÅ¡u staj so ze sÅ‚užbowym administratorom do zwiska.", + "pad.modals.deleted": "ZhaÅ¡any.", + "pad.modals.deleted.explanation": "Tutón zapisnik je so wotstroniÅ‚.", + "pad.modals.disconnected": "Zwisk je pÅ™etorhnjeny.", + "pad.modals.disconnected.explanation": "Zwisk ze serwerom je so zhubiÅ‚", + "pad.modals.disconnected.cause": "Serwer k dispoziciji njesteji. ProÅ¡u informuj sÅ‚užboweho administratora, jeli to so dale stawa.", + "pad.share": "Tutón zapisnik dźělić", + "pad.share.readonly": "Jenož Äitajomny", + "pad.share.link": "Wotkaz", + "pad.share.emebdcode": "URL zasadźić", + "pad.chat": "Chat", + "pad.chat.title": "Chat za tutón zapisnik woÄinić", + "pad.chat.loadmessages": "DalÅ¡e powÄ›sće zaÄitać", + "timeslider.pageTitle": "{{appTitle}} - wersijowa historija", + "timeslider.toolbar.returnbutton": "Wróćo k zapisnikej", + "timeslider.toolbar.authors": "Awtorojo:", + "timeslider.toolbar.authorsList": "Žane awtorojo", + "timeslider.toolbar.exportlink.title": "Eksportować", + "timeslider.exportCurrent": "Aktualnu wersiju eksportować jako:", + "timeslider.version": "Wersija {{version}}", + "timeslider.saved": "SkÅ‚adowany {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januara", + "timeslider.month.february": "februara", + "timeslider.month.march": "mÄ›rca", + "timeslider.month.april": "apryla", + "timeslider.month.may": "meje", + "timeslider.month.june": "junija", + "timeslider.month.july": "julija", + "timeslider.month.august": "awgusta", + "timeslider.month.september": "septembra", + "timeslider.month.october": "oktobra", + "timeslider.month.november": "nowembra", + "timeslider.month.december": "decembra", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: awtor, two: awtoraj, few: awtorojo, other: awtorow ]} bjez mjena", + "pad.savedrevs.marked": "Tuta wersija je so nÄ›tko jako skÅ‚adowana wersija woznamjeniÅ‚a", + "pad.userlist.entername": "Zapodaj swoje mjeno", + "pad.userlist.unnamed": "bjez mjena", + "pad.userlist.guest": "Hósć", + "pad.userlist.deny": "Wotpokazać", + "pad.userlist.approve": "Schwalić", + "pad.editbar.clearcolors": "Awtorowe barby w cyÅ‚ym dokumenće zhaÅ¡eć?", + "pad.impexp.importbutton": "NÄ›tko importować", + "pad.impexp.importing": "Importuje so...", + "pad.impexp.confirmimport": "Importowanje dataje pÅ™episa aktualny tekst zapisnika. ChceÅ¡ woprawdźe pokroÄować?", + "pad.impexp.convertFailed": "Njemóžachmy tutu dataju importować. ProÅ¡u wužij druhi dokumentowy format abo kopÄ›ruj manuelnje", + "pad.impexp.uploadFailed": "Nahraće njeje so poradźiÅ‚o, proÅ¡u spytaj hišće raz", + "pad.impexp.importfailed": "Import njeje so poradźiÅ‚o", + "pad.impexp.copypaste": "ProÅ¡u kopÄ›rować a zasadźić", + "pad.impexp.exportdisabled": "Eksport jako format {{type}} je znjemóžnjeny. ProÅ¡u staj so ze swojim systemowym administratorom za podrobnosće do zwiska." +} diff --git a/src/locales/hu.json b/src/locales/hu.json index 6e667300..a726bf2b 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -1,111 +1,116 @@ { "@metadata": { - "authors": { - "0": "Dj", - "1": "Misibacsi", - "2": "R-Joe", - "4": "Tgr" - } + "authors": [ + "Dj", + "Misibacsi", + "R-Joe", + "Tgr", + "Csega" + ] }, - "index.newPad": "\u00daj notesz", - "index.createOpenPad": "vagy notesz l\u00e9trehoz\u00e1sa ezen a n\u00e9ven:", - "pad.toolbar.bold.title": "F\u00e9lk\u00f6v\u00e9r (Ctrl-B)", - "pad.toolbar.italic.title": "D\u0151lt (Ctrl-I)", - "pad.toolbar.underline.title": "Al\u00e1h\u00faz\u00e1s (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u00c1th\u00faz\u00e1s", - "pad.toolbar.ol.title": "Sz\u00e1mozott lista", - "pad.toolbar.ul.title": "Sz\u00e1mozatlan lista", - "pad.toolbar.indent.title": "Beh\u00faz\u00e1s n\u00f6vel\u00e9se", - "pad.toolbar.unindent.title": "Beh\u00faz\u00e1s cs\u00f6kkent\u00e9se", + "index.newPad": "Új notesz", + "index.createOpenPad": "vagy notesz létrehozása ezen a néven:", + "pad.toolbar.bold.title": "Félkövér (Ctrl-B)", + "pad.toolbar.italic.title": "DÅ‘lt (Ctrl-I)", + "pad.toolbar.underline.title": "Aláhúzás (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Ãthúzás", + "pad.toolbar.ol.title": "Számozott lista", + "pad.toolbar.ul.title": "Számozatlan lista", + "pad.toolbar.indent.title": "Behúzás növelése (TAB)", + "pad.toolbar.unindent.title": "Behúzás csökkentése (Shift+TAB)", "pad.toolbar.undo.title": "Vissza (Ctrl-Z)", - "pad.toolbar.redo.title": "\u00dajra (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Szerz\u0151k sz\u00ednez\u00e9s\u00e9nek kikapcsol\u00e1sa", - "pad.toolbar.import_export.title": "Import\u00e1l\u00e1s\/export\u00e1l\u00e1s k\u00fcl\u00f6nb\u00f6z\u0151 f\u00e1jlform\u00e1tumokb\u00f3l\/ba", - "pad.toolbar.timeslider.title": "Id\u0151cs\u00faszka", - "pad.toolbar.savedRevision.title": "Mentett \u00e1llapotok", - "pad.toolbar.settings.title": "Be\u00e1ll\u00edt\u00e1sok", - "pad.toolbar.embed.title": "Notesz be\u00e1gyaz\u00e1sa", - "pad.toolbar.showusers.title": "Notesz felhaszn\u00e1l\u00f3inak megmutat\u00e1sa", - "pad.colorpicker.save": "Ment\u00e9s", - "pad.colorpicker.cancel": "M\u00e9gsem", - "pad.loading": "Bet\u00f6lt\u00e9s\u2026", - "pad.passwordRequired": "Jelsz\u00f3ra van sz\u00fcks\u00e9ged ezen notesz el\u00e9r\u00e9s\u00e9hez", - "pad.permissionDenied": "Nincs enged\u00e9lyed ezen notesz el\u00e9r\u00e9s\u00e9hez", - "pad.wrongPassword": "A jelsz\u00f3 rossz volt", - "pad.settings.padSettings": "Notesz be\u00e1ll\u00edt\u00e1sai", - "pad.settings.myView": "Az \u00e9n n\u00e9zetem", - "pad.settings.stickychat": "Mindig mutasd a cseveg\u00e9s-dobozt", - "pad.settings.colorcheck": "Szerz\u0151k sz\u00ednei", - "pad.settings.linenocheck": "Sorok sz\u00e1moz\u00e1sa", - "pad.settings.fontType": "Bet\u0171t\u00edpus:", - "pad.settings.fontType.normal": "Szok\u00e1sos", - "pad.settings.fontType.monospaced": "\u00cdr\u00f3g\u00e9pes", - "pad.settings.globalView": "Glob\u00e1lis n\u00e9zet", + "pad.toolbar.redo.title": "Újra (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "SzerzÅ‘k szÃnezésének kikapcsolása", + "pad.toolbar.import_export.title": "Importálás/exportálás különbözÅ‘ fájlformátumokból/ba", + "pad.toolbar.timeslider.title": "IdÅ‘csúszka", + "pad.toolbar.savedRevision.title": "RevÃzió mentése", + "pad.toolbar.settings.title": "BeállÃtások", + "pad.toolbar.embed.title": "Notesz beágyazása és megosztása", + "pad.toolbar.showusers.title": "Notesz felhasználóinak megmutatása", + "pad.colorpicker.save": "Mentés", + "pad.colorpicker.cancel": "Mégsem", + "pad.loading": "Betöltés…", + "pad.passwordRequired": "Jelszóra van szükséged ezen notesz eléréséhez", + "pad.permissionDenied": "Nincs engedélyed ezen notesz eléréséhez", + "pad.wrongPassword": "A jelszó rossz volt", + "pad.settings.padSettings": "Notesz beállÃtásai", + "pad.settings.myView": "Az én nézetem", + "pad.settings.stickychat": "Mindig mutasd a csevegés-dobozt", + "pad.settings.colorcheck": "SzerzÅ‘k szÃnei", + "pad.settings.linenocheck": "Sorok számozása", + "pad.settings.rtlcheck": "Tartalom olvasása balról jobbra?", + "pad.settings.fontType": "BetűtÃpus:", + "pad.settings.fontType.normal": "Szokásos", + "pad.settings.fontType.monospaced": "Ãrógépes", + "pad.settings.globalView": "Globális nézet", "pad.settings.language": "Nyelv:", - "pad.importExport.import_export": "Import\/export", - "pad.importExport.import": "Tetsz\u0151leges sz\u00f6vegf\u00e1jl vagy dokumentum felt\u00f6lt\u00e9se", + "pad.importExport.import_export": "Import/export", + "pad.importExport.import": "TetszÅ‘leges szövegfájl vagy dokumentum feltöltése", "pad.importExport.importSuccessful": "Siker!", - "pad.importExport.export": "Jelenlegi notesz export\u00e1l\u00e1sa \u00edgy:", + "pad.importExport.export": "Jelenlegi notesz exportálása Ãgy:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Sima sz\u00f6veg", + "pad.importExport.exportplain": "Sima szöveg", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (Open Document form\u00e1tum)", + "pad.importExport.exportopen": "ODF (Open Document formátum)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "Kapcsol\u00f3dva.", - "pad.modals.reconnecting": "\u00dajrakapcsol\u00f3d\u00e1s a noteszhez...", - "pad.modals.forcereconnect": "\u00dajrakapcsol\u00f3d\u00e1s k\u00e9nyszer\u00edt\u00e9se", - "pad.modals.userdup.explanation": "\u00dagy t\u0171nik, ez a notesz t\u00f6bb k\u00fcl\u00f6nb\u00f6z\u0151 b\u00f6ng\u00e9sz\u0151ablakban is meg van nyitva a sz\u00e1m\u00edt\u00f3g\u00e9peden.", - "pad.modals.userdup.advice": "Kapcsol\u00f3dj \u00fajra, ha ezt az ablakot akarod haszn\u00e1lni.", - "pad.modals.unauth": "Nincs r\u00e1 jogosults\u00e1god", - "pad.modals.unauth.explanation": "A jogosults\u00e1gaid v\u00e1ltoztak, mik\u00f6zben n\u00e9zted ezt az oldalt. Pr\u00f3b\u00e1lj \u00fajrakapcsol\u00f3dni.", - "pad.modals.looping": "Kapcsolat bontva.", - "pad.modals.looping.explanation": "Nem siker\u00fclt a kommunik\u00e1ci\u00f3 a szinkroniz\u00e1ci\u00f3s szerverrel.", - "pad.modals.looping.cause": "Tal\u00e1n egy t\u00fal szigor\u00fa t\u0171zfalon vagy proxyn kereszt\u00fcl kapcsol\u00f3dt\u00e1l az internetre.", - "pad.modals.initsocketfail": "A szerver nem \u00e9rhet\u0151 el.", - "pad.modals.initsocketfail.explanation": "Nem siker\u00fclt kapcsol\u00f3dni a szinkroniz\u00e1ci\u00f3s szerverhez.", - "pad.modals.initsocketfail.cause": "Val\u00f3sz\u00edn\u0171leg a b\u00f6ng\u00e9sz\u0151ddel vagy az internetkapcsolatoddal van probl\u00e9ma.", - "pad.modals.slowcommit": "Megszakadt a kapcsolat.", - "pad.modals.slowcommit.explanation": "A szerver nem v\u00e1laszol.", - "pad.modals.slowcommit.cause": "Val\u00f3sz\u00edn\u0171leg az internetkapcsolattal van probl\u00e9ma.", - "pad.modals.deleted": "T\u00f6r\u00f6lve.", - "pad.modals.deleted.explanation": "Ez a notesz el lett t\u00e1vol\u00edtva.", + "pad.modals.connected": "Kapcsolódva.", + "pad.modals.reconnecting": "Újrakapcsolódás a noteszhez...", + "pad.modals.forcereconnect": "Újrakapcsolódás kényszerÃtése", + "pad.modals.userdup": "Másik ablakban megnyitva", + "pad.modals.userdup.explanation": "Úgy tűnik, ez a notesz több különbözÅ‘ böngészÅ‘ablakban is meg van nyitva a számÃtógépeden.", + "pad.modals.userdup.advice": "Kapcsolódj újra, ha ezt az ablakot akarod használni.", + "pad.modals.unauth": "Nincs rá jogosultságod", + "pad.modals.unauth.explanation": "A jogosultságaid változtak, miközben nézted ezt az oldalt. Próbálj újrakapcsolódni.", + "pad.modals.looping.explanation": "Nem sikerült a kommunikáció a szinkronizációs szerverrel.", + "pad.modals.looping.cause": "Talán egy túl szigorú tűzfalon vagy proxyn keresztül kapcsolódtál az internetre.", + "pad.modals.initsocketfail": "A szerver nem érhetÅ‘ el.", + "pad.modals.initsocketfail.explanation": "Nem sikerült kapcsolódni a szinkronizációs szerverhez.", + "pad.modals.initsocketfail.cause": "ValószÃnűleg a böngészÅ‘ddel vagy az internetkapcsolatoddal van probléma.", + "pad.modals.slowcommit.explanation": "A szerver nem válaszol.", + "pad.modals.slowcommit.cause": "ValószÃnűleg az internetkapcsolattal van probléma.", + "pad.modals.badChangeset.explanation": "FordÃtásodat a szinkronizációs szerver illegálisnak sorolta be.", + "pad.modals.deleted": "Törölve.", + "pad.modals.deleted.explanation": "Ez a notesz el lett távolÃtva.", "pad.modals.disconnected": "Kapcsolat bontva.", - "pad.modals.disconnected.explanation": "A szerverrel val\u00f3 kapcsolat megsz\u0171nt.", - "pad.modals.disconnected.cause": "Lehet, hogy a szerver nem el\u00e9rhet\u0151. K\u00e9rlek, \u00e9rtes\u00edts minket, ha a probl\u00e9ma tart\u00f3san fenn\u00e1ll.", - "pad.share": "Notesz megoszt\u00e1sa", - "pad.share.readonly": "Csak olvashat\u00f3", - "pad.share.link": "Hivatkoz\u00e1s", - "pad.share.emebdcode": "URL be\u00e1gyaz\u00e1sa", - "pad.chat": "Cseveg\u00e9s", - "pad.chat.title": "A noteszhez tartoz\u00f3 cseveg\u00e9s megnyit\u00e1sa.", - "timeslider.pageTitle": "{{appTitle}} id\u0151cs\u00faszka", + "pad.modals.disconnected.explanation": "A szerverrel való kapcsolat megszűnt.", + "pad.modals.disconnected.cause": "Lehet, hogy a szerver nem elérhetÅ‘. Kérlek, értesÃtsd a szolgáltatás adminisztrátorát, ha a probléma tartósan fennáll.", + "pad.share": "Notesz megosztása", + "pad.share.readonly": "Csak olvasható", + "pad.share.link": "Hivatkozás", + "pad.share.emebdcode": "URL beágyazása", + "pad.chat": "Csevegés", + "pad.chat.title": "A noteszhez tartozó csevegés megnyitása.", + "pad.chat.loadmessages": "További üzenetek betöltése", + "timeslider.pageTitle": "{{appTitle}} idÅ‘csúszka", "timeslider.toolbar.returnbutton": "Vissza a noteszhez", - "timeslider.toolbar.authors": "Szerz\u0151k:", - "timeslider.toolbar.authorsList": "Nincsenek szerz\u0151k", - "timeslider.exportCurrent": "Jelenlegi v\u00e1ltozat export\u00e1l\u00e1sa \u00edgy:", - "timeslider.version": "{{version}} verzi\u00f3", + "timeslider.toolbar.authors": "SzerzÅ‘k:", + "timeslider.toolbar.authorsList": "Nincsenek szerzÅ‘k", + "timeslider.toolbar.exportlink.title": "Exportálás", + "timeslider.exportCurrent": "Jelenlegi változat exportálása Ãgy:", + "timeslider.version": "{{version}} verzió", "timeslider.saved": "{{year}}. {{month}} {{day}}-n elmentve", - "timeslider.dateformat": "{{year}}\/{{month}}\/{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "janu\u00e1r", - "timeslider.month.february": "febru\u00e1r", - "timeslider.month.march": "m\u00e1rcius", - "timeslider.month.april": "\u00e1prilis", - "timeslider.month.may": "m\u00e1jus", - "timeslider.month.june": "j\u00fanius", - "timeslider.month.july": "j\u00falius", + "timeslider.dateformat": "{{year}}/{{month}}/{{day}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "január", + "timeslider.month.february": "február", + "timeslider.month.march": "március", + "timeslider.month.april": "április", + "timeslider.month.may": "május", + "timeslider.month.june": "június", + "timeslider.month.july": "július", "timeslider.month.august": "augusztus", "timeslider.month.september": "szeptember", - "timeslider.month.october": "okt\u00f3ber", + "timeslider.month.october": "október", "timeslider.month.november": "november", "timeslider.month.december": "december", + "pad.savedrevs.marked": "Ez a revÃzió mostantól mentettként jelölve", "pad.userlist.entername": "Add meg a nevedet", - "pad.userlist.unnamed": "n\u00e9vtelen", - "pad.userlist.guest": "Vend\u00e9g", + "pad.userlist.unnamed": "névtelen", + "pad.userlist.guest": "Vendég", "pad.userlist.deny": "Megtagad", - "pad.userlist.approve": "J\u00f3v\u00e1hagy", - "pad.impexp.importbutton": "Import\u00e1l\u00e1s most", - "pad.impexp.importing": "Import\u00e1l\u00e1s\u2026", - "pad.impexp.uploadFailed": "A felt\u00f6lt\u00e9s sikertelen, pr\u00f3b\u00e1ld meg \u00fajra", - "pad.impexp.importfailed": "Az import\u00e1l\u00e1s nem siker\u00fclt" -}
\ No newline at end of file + "pad.userlist.approve": "Jóváhagy", + "pad.impexp.importbutton": "Importálás most", + "pad.impexp.importing": "Importálás…", + "pad.impexp.uploadFailed": "A feltöltés sikertelen, próbáld meg újra", + "pad.impexp.importfailed": "Az importálás nem sikerült" +} diff --git a/src/locales/ia.json b/src/locales/ia.json index e6c5dde1..971f2919 100644 --- a/src/locales/ia.json +++ b/src/locales/ia.json @@ -5,27 +5,27 @@ ] }, "index.newPad": "Nove pad", - "index.createOpenPad": "o crear\/aperir un pad con le nomine:", + "index.createOpenPad": "o crear/aperir un pad con le nomine:", "pad.toolbar.bold.title": "Grasse (Ctrl-B)", "pad.toolbar.italic.title": "Italic (Ctrl-I)", "pad.toolbar.underline.title": "Sublinear (Ctrl-U)", "pad.toolbar.strikethrough.title": "Cancellar", "pad.toolbar.ol.title": "Lista ordinate", "pad.toolbar.ul.title": "Lista non ordinate", - "pad.toolbar.indent.title": "Indentar", - "pad.toolbar.unindent.title": "Disindentar", + "pad.toolbar.indent.title": "Indentar (TAB)", + "pad.toolbar.unindent.title": "Disindentar (Shift+TAB)", "pad.toolbar.undo.title": "Disfacer (Ctrl-Z)", "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Rader colores de autor", - "pad.toolbar.import_export.title": "Importar\/exportar in differente formatos de file", + "pad.toolbar.import_export.title": "Importar/exportar in differente formatos de file", "pad.toolbar.timeslider.title": "Glissa-tempore", "pad.toolbar.savedRevision.title": "Version salveguardate", "pad.toolbar.settings.title": "Configuration", - "pad.toolbar.embed.title": "Incorporar iste pad", + "pad.toolbar.embed.title": "Divider e incorporar iste pad", "pad.toolbar.showusers.title": "Monstrar le usatores de iste pad", "pad.colorpicker.save": "Salveguardar", "pad.colorpicker.cancel": "Cancellar", - "pad.loading": "Cargamento\u2026", + "pad.loading": "Cargamento…", "pad.passwordRequired": "Un contrasigno es necessari pro acceder a iste pad", "pad.permissionDenied": "Tu non ha le permission de acceder a iste pad", "pad.wrongPassword": "Le contrasigno es incorrecte", @@ -34,12 +34,13 @@ "pad.settings.stickychat": "Chat sempre visibile", "pad.settings.colorcheck": "Colores de autor", "pad.settings.linenocheck": "Numeros de linea", + "pad.settings.rtlcheck": "Leger le contento de dextra a sinistra?", "pad.settings.fontType": "Typo de litteras:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospatial", "pad.settings.globalView": "Vista global", "pad.settings.language": "Lingua:", - "pad.importExport.import_export": "Importar\/Exportar", + "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Incargar qualcunque file de texto o documento", "pad.importExport.importSuccessful": "Succedite!", "pad.importExport.export": "Exportar le pad actual como:", @@ -49,29 +50,31 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Tu pote solmente importar files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installa AbiWord<\/a>.", + "pad.importExport.abiword.innerHTML": "Tu pote solmente importar files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installa AbiWord</a>.", "pad.modals.connected": "Connectite.", - "pad.modals.reconnecting": "Reconnecte a tu pad\u2026", + "pad.modals.reconnecting": "Reconnecte a tu pad…", "pad.modals.forcereconnect": "Fortiar reconnexion", "pad.modals.userdup": "Aperte in un altere fenestra", "pad.modals.userdup.explanation": "Iste pad pare esser aperte in plus de un fenestra de navigator in iste computator.", "pad.modals.userdup.advice": "Reconnecte pro usar iste fenestra.", "pad.modals.unauth": "Non autorisate", "pad.modals.unauth.explanation": "Tu permissiones ha cambiate durante que tu legeva iste pagina. Tenta reconnecter.", - "pad.modals.looping": "Disconnectite.", "pad.modals.looping.explanation": "Il ha problemas de communication con le servitor de synchronisation.", "pad.modals.looping.cause": "Il es possibile que tu connexion passa per un firewall o proxy incompatibile.", "pad.modals.initsocketfail": "Le servitor es inattingibile.", "pad.modals.initsocketfail.explanation": "Impossibile connecter al servitor de synchronisation.", "pad.modals.initsocketfail.cause": "Isto es probabilemente causate per un problema con tu navigator o connexion a internet.", - "pad.modals.slowcommit": "Disconnectite.", "pad.modals.slowcommit.explanation": "Le servitor non responde.", "pad.modals.slowcommit.cause": "Isto pote esser causate per problemas con le connexion al rete.", + "pad.modals.badChangeset.explanation": "Un modification que tu ha facite ha essite classificate como incorrecte per le servitor de synchronisation.", + "pad.modals.badChangeset.cause": "Isto pote esser causate per un configuration incorrecte del servitor o per alcun altere comportamento impreviste. Per favor contacta le administrator del servicio si tu pensa que se tracta de un error. Tenta reconnecter te pro continuar a modificar.", + "pad.modals.corruptPad.explanation": "Le pad al qual tu tenta acceder es corrumpite.", + "pad.modals.corruptPad.cause": "Isto pote esser debite a un configuration incorrecte del servitor o a alcun altere comportamento impreviste. Per favor contacta le administrator del servicio.", "pad.modals.deleted": "Delite.", "pad.modals.deleted.explanation": "Iste pad ha essite removite.", "pad.modals.disconnected": "Tu ha essite disconnectite.", "pad.modals.disconnected.explanation": "Le connexion al servitor ha essite perdite.", - "pad.modals.disconnected.cause": "Le servitor pote esser indisponibile. Per favor notifica nos si isto continua a producer se.", + "pad.modals.disconnected.cause": "Le servitor pote esser indisponibile. Per favor notifica le administrator del servicio si isto continua a producer se.", "pad.share": "Diffunder iste pad", "pad.share.readonly": "Lectura solmente", "pad.share.link": "Ligamine", @@ -100,8 +103,7 @@ "timeslider.month.october": "octobre", "timeslider.month.november": "novembre", "timeslider.month.december": "decembre", - "timeslider.unnamedauthor": "{{num}} autor sin nomine", - "timeslider.unnamedauthors": "{{num}} autores sin nomine", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor, other: autores ]} sin nomine", "pad.savedrevs.marked": "Iste version es ora marcate como version salveguardate", "pad.userlist.entername": "Entra tu nomine", "pad.userlist.unnamed": "sin nomine", @@ -110,11 +112,11 @@ "pad.userlist.approve": "Approbar", "pad.editbar.clearcolors": "Rader le colores de autor in tote le documento?", "pad.impexp.importbutton": "Importar ora", - "pad.impexp.importing": "Importation in curso\u2026", + "pad.impexp.importing": "Importation in curso…", "pad.impexp.confirmimport": "Le importation de un file superscribera le texto actual del pad. Es tu secur de voler continuar?", "pad.impexp.convertFailed": "Nos non ha potite importar iste file. Per favor usa un altere formato de documento o copia e colla le texto manualmente.", "pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.", "pad.impexp.importfailed": "Importation fallite", "pad.impexp.copypaste": "Per favor copia e colla", "pad.impexp.exportdisabled": "Le exportation in formato {{type}} es disactivate. Per favor contacta le administrator del systema pro detalios." -}
\ No newline at end of file +} diff --git a/src/locales/it.json b/src/locales/it.json index 05569a32..8292c4f2 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Beta16", - "1": "Gianfranco", - "2": "Muxator", - "4": "Vituzzu" - } + "authors": [ + "Beta16", + "Gianfranco", + "Muxator", + "Vituzzu" + ] }, "index.newPad": "Nuovo Pad", "index.createOpenPad": "o creare o aprire un Pad con il nome:", @@ -15,34 +15,35 @@ "pad.toolbar.strikethrough.title": "Barrato", "pad.toolbar.ol.title": "Elenco numerato", "pad.toolbar.ul.title": "Elenco puntato", - "pad.toolbar.indent.title": "Rientro", - "pad.toolbar.unindent.title": "Riduci rientro", + "pad.toolbar.indent.title": "Rientro (TAB)", + "pad.toolbar.unindent.title": "Riduci rientro (Shift+TAB)", "pad.toolbar.undo.title": "Annulla (Ctrl-Z)", "pad.toolbar.redo.title": "Ripeti (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Elimina i colori che indicano gli autori", - "pad.toolbar.import_export.title": "Importa\/esporta da\/a diversi formati di file", + "pad.toolbar.import_export.title": "Importa/esporta da/a diversi formati di file", "pad.toolbar.timeslider.title": "Presentazione cronologia", - "pad.toolbar.savedRevision.title": "Revisioni salvate", + "pad.toolbar.savedRevision.title": "Versione salvata", "pad.toolbar.settings.title": "Impostazioni", - "pad.toolbar.embed.title": "Incorpora questo Pad", + "pad.toolbar.embed.title": "Condividi ed incorpora questo Pad", "pad.toolbar.showusers.title": "Visualizza gli utenti su questo Pad", "pad.colorpicker.save": "Salva", "pad.colorpicker.cancel": "Annulla", - "pad.loading": "Caricamento in corso\u2026", - "pad.passwordRequired": "Per accedere a questo Pad \u00e8 necessaria una password", + "pad.loading": "Caricamento in corso…", + "pad.passwordRequired": "Per accedere a questo Pad è necessaria una password", "pad.permissionDenied": "Non si dispone dei permessi necessari per accedere a questo Pad", - "pad.wrongPassword": "La password \u00e8 sbagliata", + "pad.wrongPassword": "La password è sbagliata", "pad.settings.padSettings": "Impostazioni del Pad", "pad.settings.myView": "Mia visualizzazione", "pad.settings.stickychat": "Chat sempre sullo schermo", "pad.settings.colorcheck": "Colori che indicano gli autori", "pad.settings.linenocheck": "Numeri di riga", + "pad.settings.rtlcheck": "Leggere il contenuto da destra a sinistra?", "pad.settings.fontType": "Tipo di carattere:", "pad.settings.fontType.normal": "Normale", "pad.settings.fontType.monospaced": "A larghezza fissa", "pad.settings.globalView": "Visualizzazione globale", "pad.settings.language": "Lingua:", - "pad.importExport.import_export": "Importazione\/esportazione", + "pad.importExport.import_export": "Importazione/esportazione", "pad.importExport.import": "Carica un file di testo o un documento", "pad.importExport.importSuccessful": "Riuscito!", "pad.importExport.export": "Esportare il Pad corrente come:", @@ -52,29 +53,31 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u00c8 possibile importare solo i formati di testo semplice o HTML. Per metodi pi\u00f9 avanzati di importazione <a href=https:\/\/github.com\/broadcast\/etherpad-lite\/wiki\/How-to-enable-importing and exporting-different file formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord>installare Abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "È possibile importare solo i formati di testo semplice o HTML. Per metodi più avanzati di importazione <a href=https://github.com/broadcast/etherpad-lite/wiki/How-to-enable-importing and exporting-different file formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord>installare Abiword</a>.", "pad.modals.connected": "Connesso.", "pad.modals.reconnecting": "Riconnessione al pad in corso...", "pad.modals.forcereconnect": "Forza la riconnessione", "pad.modals.userdup": "Aperto in un'altra finestra", - "pad.modals.userdup.explanation": "Questo Pad sembra essere aperto in pi\u00f9 di una finestra del browser su questo computer.", + "pad.modals.userdup.explanation": "Questo Pad sembra essere aperto in più di una finestra del browser su questo computer.", "pad.modals.userdup.advice": "Riconnettiti per utilizzare invece questa finestra.", "pad.modals.unauth": "Non autorizzato", "pad.modals.unauth.explanation": "Le tue autorizzazioni sono state modificate durante la visualizzazione di questa pagina. Prova a riconnetterti.", - "pad.modals.looping": "Disconnesso.", "pad.modals.looping.explanation": "Ci sono problemi di comunicazione con il server di sincronizzazione.", "pad.modals.looping.cause": "Forse sei connesso attraverso un firewall o un server proxy non compatibili.", - "pad.modals.initsocketfail": "Il server non \u00e8 raggiungibile.", + "pad.modals.initsocketfail": "Il server non è raggiungibile.", "pad.modals.initsocketfail.explanation": "Impossibile connettersi al server di sincronizzazione.", - "pad.modals.initsocketfail.cause": "Questo probabilmente \u00e8 dovuto a un problema con il tuo browser o con la tua connessione a internet.", - "pad.modals.slowcommit": "Disconnesso.", + "pad.modals.initsocketfail.cause": "Questo probabilmente è dovuto a un problema con il tuo browser o con la tua connessione a internet.", "pad.modals.slowcommit.explanation": "Il server non risponde.", - "pad.modals.slowcommit.cause": "Questo potrebbe essere dovuto a problemi con la connettivit\u00e0 di rete.", + "pad.modals.slowcommit.cause": "Questo potrebbe essere dovuto a problemi con la connettività di rete.", + "pad.modals.badChangeset.explanation": "Una modifica che hai fatto è stata considerata illegale dal server di sincronizzazione.", + "pad.modals.badChangeset.cause": "Ciò potrebbe essere causato da una errata configurazione del server o qualche altro comportamento imprevisto. Si prega di contattare l'amministratore del servizio, se si ritiene che questo sia un errore. Prova a riconnetterti per tentare di continuare a modificare.", + "pad.modals.corruptPad.explanation": "Il pad a cui stai tentando di accedere è danneggiato.", + "pad.modals.corruptPad.cause": "Ciò potrebbe essere causato da una errata configurazione del server o qualche altro comportamento imprevisto. Si prega di contattare l'amministratore del servizio.", "pad.modals.deleted": "Cancellato.", - "pad.modals.deleted.explanation": "Questo Pad \u00e8 stato rimosso.", + "pad.modals.deleted.explanation": "Questo Pad è stato rimosso.", "pad.modals.disconnected": "Sei stato disconnesso.", - "pad.modals.disconnected.explanation": "La connessione al server \u00e8 stata persa", - "pad.modals.disconnected.cause": "Il server potrebbe essere non disponibile. Per favore, fateci sapere se il problema persiste.", + "pad.modals.disconnected.explanation": "La connessione al server è stata persa", + "pad.modals.disconnected.cause": "Il server potrebbe essere non disponibile. Informa l'amministrazione del servizio se il problema persiste.", "pad.share": "Condividi questo Pad", "pad.share.readonly": "Sola lettura", "pad.share.link": "Link", @@ -90,7 +93,7 @@ "timeslider.exportCurrent": "Esporta la versione corrente come:", "timeslider.version": "Versione {{version}}", "timeslider.saved": "Salvato {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "gennaio", "timeslider.month.february": "febbraio", "timeslider.month.march": "marzo", @@ -103,9 +106,8 @@ "timeslider.month.october": "ottobre", "timeslider.month.november": "novembre", "timeslider.month.december": "dicembre", - "timeslider.unnamedauthor": "{{num}} autore senza nome", - "timeslider.unnamedauthors": "{{num}} autori senza nome", - "pad.savedrevs.marked": "Questa revisione \u00e8 ora contrassegnata come una versione salvata", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autore, other: autori ]} senza nome", + "pad.savedrevs.marked": "Questa revisione è ora contrassegnata come una versione salvata", "pad.userlist.entername": "Inserisci il tuo nome", "pad.userlist.unnamed": "senza nome", "pad.userlist.guest": "Ospite", @@ -114,10 +116,10 @@ "pad.editbar.clearcolors": "Eliminare i colori degli autori sull'intero documento?", "pad.impexp.importbutton": "Importa ora", "pad.impexp.importing": "Importazione in corso...", - "pad.impexp.confirmimport": "L'importazione del file sovrascriver\u00e0 il testo attuale del Pad. Sei sicuro di voler procedere?", - "pad.impexp.convertFailed": "Non \u00e8 stato possibile importare questo file. Utilizzare un formato differente o copiare ed incollare a mano", + "pad.impexp.confirmimport": "L'importazione del file sovrascriverà il testo attuale del Pad. Sei sicuro di voler procedere?", + "pad.impexp.convertFailed": "Non è stato possibile importare questo file. Utilizzare un formato differente o copiare ed incollare a mano", "pad.impexp.uploadFailed": "Caricamento non riuscito, riprovare", "pad.impexp.importfailed": "Importazione fallita", "pad.impexp.copypaste": "Si prega di copiare e incollare", - "pad.impexp.exportdisabled": "L'esportazione come {{type}} \u00e8 disabilitata. Contattare l'amministratore per i dettagli." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "L'esportazione come {{type}} è disabilitata. Contattare l'amministratore per i dettagli." +} diff --git a/src/locales/ja.json b/src/locales/ja.json index f7173dd4..f9d63cd2 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -4,117 +4,119 @@ "Shirayuki" ] }, - "index.newPad": "\u65b0\u898f\u4f5c\u6210", - "index.createOpenPad": "\u307e\u305f\u306f\u4f5c\u6210\/\u7de8\u96c6\u3059\u308b\u30d1\u30c3\u30c9\u540d\u3092\u5165\u529b:", - "pad.toolbar.bold.title": "\u592a\u5b57 (Ctrl-B)", - "pad.toolbar.italic.title": "\u659c\u4f53 (Ctrl-I)", - "pad.toolbar.underline.title": "\u4e0b\u7dda (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u53d6\u308a\u6d88\u3057\u7dda", - "pad.toolbar.ol.title": "\u756a\u53f7\u4ed8\u304d\u30ea\u30b9\u30c8", - "pad.toolbar.ul.title": "\u756a\u53f7\u306a\u3057\u30ea\u30b9\u30c8", - "pad.toolbar.indent.title": "\u30a4\u30f3\u30c7\u30f3\u30c8", - "pad.toolbar.unindent.title": "\u30a4\u30f3\u30c7\u30f3\u30c8\u89e3\u9664", - "pad.toolbar.undo.title": "\u5143\u306b\u623b\u3059 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u3084\u308a\u76f4\u3057 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb", - "pad.toolbar.import_export.title": "\u4ed6\u306e\u5f62\u5f0f\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", - "pad.toolbar.timeslider.title": "\u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", - "pad.toolbar.savedRevision.title": "\u7248\u3092\u4fdd\u5b58", - "pad.toolbar.settings.title": "\u8a2d\u5b9a", - "pad.toolbar.embed.title": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u57cb\u3081\u8fbc\u3080", - "pad.toolbar.showusers.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u8868\u793a", - "pad.colorpicker.save": "\u4fdd\u5b58", - "pad.colorpicker.cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", - "pad.loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...", - "pad.passwordRequired": "\u3053\u306e\u30d1\u30c3\u30c9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059", - "pad.permissionDenied": "\u3042\u306a\u305f\u306b\u306f\u3053\u306e\u30d1\u30c3\u30c9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u8a31\u53ef\u304c\u3042\u308a\u307e\u305b\u3093", - "pad.wrongPassword": "\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059", - "pad.settings.padSettings": "\u30d1\u30c3\u30c9\u306e\u8a2d\u5b9a", - "pad.settings.myView": "\u500b\u4eba\u8a2d\u5b9a", - "pad.settings.stickychat": "\u753b\u9762\u306b\u30c1\u30e3\u30c3\u30c8\u3092\u5e38\u306b\u8868\u793a", - "pad.settings.colorcheck": "\u4f5c\u8005\u306e\u8272\u5206\u3051", - "pad.settings.linenocheck": "\u884c\u756a\u53f7", - "pad.settings.fontType": "\u30d5\u30a9\u30f3\u30c8\u306e\u7a2e\u985e:", - "pad.settings.fontType.normal": "\u901a\u5e38", - "pad.settings.fontType.monospaced": "\u56fa\u5b9a\u5e45", - "pad.settings.globalView": "\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a", - "pad.settings.language": "\u8a00\u8a9e:", - "pad.importExport.import_export": "\u30a4\u30f3\u30dd\u30fc\u30c8\/\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", - "pad.importExport.import": "\u3042\u3089\u3086\u308b\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3084\u6587\u66f8\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u3059", - "pad.importExport.importSuccessful": "\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002", - "pad.importExport.export": "\u73fe\u5728\u306e\u30d1\u30c3\u30c9\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", + "index.newPad": "æ–°è¦ä½œæˆ", + "index.createOpenPad": "ã¾ãŸã¯ä½œæˆ/編集ã™ã‚‹ãƒ‘ッドåを入力:", + "pad.toolbar.bold.title": "å¤ªå— (Ctrl-B)", + "pad.toolbar.italic.title": "斜体 (Ctrl-I)", + "pad.toolbar.underline.title": "下線 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "å–り消ã—ç·š", + "pad.toolbar.ol.title": "番å·ä»˜ãリスト", + "pad.toolbar.ul.title": "番å·ãªã—リスト", + "pad.toolbar.indent.title": "インデント (Tab)", + "pad.toolbar.unindent.title": "インデント解除 (Shift+Tab)", + "pad.toolbar.undo.title": "å…ƒã«æˆ»ã™ (Ctrl-Z)", + "pad.toolbar.redo.title": "ã‚„ã‚Šç›´ã— (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "作者ã®è‰²åˆ†ã‘を消去", + "pad.toolbar.import_export.title": "ä»–ã®å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ/エクスãƒãƒ¼ãƒˆ", + "pad.toolbar.timeslider.title": "タイムスライダー", + "pad.toolbar.savedRevision.title": "版をä¿å˜", + "pad.toolbar.settings.title": "è¨å®š", + "pad.toolbar.embed.title": "ã“ã®ãƒ‘ッドを共有ã™ã‚‹/埋ã‚込む", + "pad.toolbar.showusers.title": "ã“ã®ãƒ‘ッドã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’表示", + "pad.colorpicker.save": "ä¿å˜", + "pad.colorpicker.cancel": "ã‚ャンセル", + "pad.loading": "èªã¿è¾¼ã¿ä¸...", + "pad.passwordRequired": "ã“ã®ãƒ‘ッドã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ãƒ‘スワードãŒå¿…è¦ã§ã™", + "pad.permissionDenied": "ã‚ãªãŸã«ã¯ã“ã®ãƒ‘ッドã¸ã®ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“", + "pad.wrongPassword": "パスワードãŒé–“é•ã£ã¦ã„ã¾ã™", + "pad.settings.padSettings": "パッドã®è¨å®š", + "pad.settings.myView": "個人è¨å®š", + "pad.settings.stickychat": "ç”»é¢ã«ãƒãƒ£ãƒƒãƒˆã‚’常ã«è¡¨ç¤º", + "pad.settings.colorcheck": "作者ã®è‰²åˆ†ã‘", + "pad.settings.linenocheck": "行番å·", + "pad.settings.rtlcheck": "å³æ¨ªæ›¸ãã«ã™ã‚‹", + "pad.settings.fontType": "フォントã®ç¨®é¡ž:", + "pad.settings.fontType.normal": "通常", + "pad.settings.fontType.monospaced": "固定幅", + "pad.settings.globalView": "ã‚°ãƒãƒ¼ãƒãƒ«è¨å®š", + "pad.settings.language": "言語:", + "pad.importExport.import_export": "インãƒãƒ¼ãƒˆ/エクスãƒãƒ¼ãƒˆ", + "pad.importExport.import": "ã‚らゆるテã‚ストファイルや文書をアップãƒãƒ¼ãƒ‰ã§ãã¾ã™", + "pad.importExport.importSuccessful": "完了ã—ã¾ã—ãŸã€‚", + "pad.importExport.export": "ç¾åœ¨ã®ãƒ‘ッドをエクスãƒãƒ¼ãƒˆã™ã‚‹å½¢å¼:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8", + "pad.importExport.exportplain": "プレーンテã‚スト", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u307e\u305f\u306f HTML \u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306e\u307f\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u3059\u3002\u3088\u308a\u9ad8\u5ea6\u306a\u30a4\u30f3\u30dd\u30fc\u30c8\u6a5f\u80fd\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001<a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a>\u3057\u3066\u304f\u3060\u3055\u3044\u3002", - "pad.modals.connected": "\u63a5\u7d9a\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.reconnecting": "\u30d1\u30c3\u30c9\u306b\u518d\u63a5\u7d9a\u4e2d...", - "pad.modals.forcereconnect": "\u5f37\u5236\u7684\u306b\u518d\u63a5\u7d9a", - "pad.modals.userdup": "\u5225\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u958b\u304b\u308c\u3066\u3044\u307e\u3059", - "pad.modals.userdup.explanation": "\u3053\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306e\u8907\u6570\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3001\u3053\u306e\u30d1\u30c3\u30c9\u3092\u958b\u3044\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002", - "pad.modals.userdup.advice": "\u4ee3\u308f\u308a\u306b\u3053\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u518d\u63a5\u7d9a\u3057\u307e\u3059\u3002", - "pad.modals.unauth": "\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093", - "pad.modals.unauth.explanation": "\u3053\u306e\u30da\u30fc\u30b8\u306e\u95b2\u89a7\u4e2d\u306b\u3042\u306a\u305f\u306e\u6a29\u9650\u304c\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002\u518d\u63a5\u7d9a\u3092\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002", - "pad.modals.looping": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.looping.explanation": "\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u901a\u4fe1\u306b\u554f\u984c\u70b9\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.looping.cause": "\u3054\u4f7f\u7528\u4e2d\u306e\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u307e\u305f\u306f\u30d7\u30ed\u30ad\u30b7\u3068\u306f\u4e92\u63db\u6027\u304c\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.initsocketfail": "\u30b5\u30fc\u30d0\u30fc\u306b\u5230\u9054\u3067\u304d\u307e\u305b\u3093\u3002", - "pad.modals.initsocketfail.explanation": "\u540c\u671f\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002", - "pad.modals.initsocketfail.cause": "\u3053\u308c\u306f\u3054\u4f7f\u7528\u4e2d\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u3084\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u63a5\u7d9a\u306e\u554f\u984c\u304c\u539f\u56e0\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.slowcommit": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.slowcommit.explanation": "\u30b5\u30fc\u30d0\u30fc\u304c\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002", - "pad.modals.slowcommit.cause": "\u3053\u308c\u306f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u306e\u554f\u984c\u304c\u539f\u56e0\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002", - "pad.modals.deleted": "\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.deleted.explanation": "\u3053\u306e\u30d1\u30c3\u30c9\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.disconnected": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f\u3002", - "pad.modals.disconnected.explanation": "\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u63a5\u7d9a\u304c\u5931\u308f\u308c\u307e\u3057\u305f", - "pad.modals.disconnected.cause": "\u30b5\u30fc\u30d0\u30fc\u306b\u5230\u9054\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u554f\u984c\u304c\u89e3\u6c7a\u3057\u306a\u3044\u5834\u5408\u306f\u304a\u77e5\u3089\u305b\u304f\u3060\u3055\u3044\u3002", - "pad.share": "\u3053\u306e\u30d1\u30c3\u30c9\u3092\u5171\u6709", - "pad.share.readonly": "\u8aad\u307f\u53d6\u308a\u5c02\u7528", - "pad.share.link": "\u30ea\u30f3\u30af", - "pad.share.emebdcode": "\u57cb\u3081\u8fbc\u307f\u7528 URL", - "pad.chat": "\u30c1\u30e3\u30c3\u30c8", - "pad.chat.title": "\u3053\u306e\u30d1\u30c3\u30c9\u306e\u30c1\u30e3\u30c3\u30c8\u3092\u958b\u304d\u307e\u3059\u3002", - "pad.chat.loadmessages": "\u305d\u306e\u4ed6\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8aad\u307f\u8fbc\u3080", - "timeslider.pageTitle": "{{appTitle}} \u30bf\u30a4\u30e0\u30b9\u30e9\u30a4\u30c0\u30fc", - "timeslider.toolbar.returnbutton": "\u30d1\u30c3\u30c9\u306b\u623b\u308b", - "timeslider.toolbar.authors": "\u4f5c\u8005:", - "timeslider.toolbar.authorsList": "\u4f5c\u8005\u306a\u3057", - "timeslider.toolbar.exportlink.title": "\u30a8\u30af\u30b9\u30dd\u30fc\u30c8", - "timeslider.exportCurrent": "\u73fe\u5728\u306e\u7248\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u5f62\u5f0f:", - "timeslider.version": "\u30d0\u30fc\u30b8\u30e7\u30f3 {{version}}", - "timeslider.saved": "| {{year}}\u5e74{{month}}{{day}}\u65e5\u306b\u4fdd\u5b58", - "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "1\u6708", - "timeslider.month.february": "2\u6708", - "timeslider.month.march": "3\u6708", - "timeslider.month.april": "4\u6708", - "timeslider.month.may": "5\u6708", - "timeslider.month.june": "6\u6708", - "timeslider.month.july": "7\u6708", - "timeslider.month.august": "8\u6708", - "timeslider.month.september": "9\u6708", - "timeslider.month.october": "10\u6708", - "timeslider.month.november": "11\u6708", - "timeslider.month.december": "12\u6708", - "timeslider.unnamedauthor": "{{num}} \u4eba\u306e\u533f\u540d\u306e\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}} \u4eba\u306e\u533f\u540d\u306e\u4f5c\u8005", - "pad.savedrevs.marked": "\u3053\u306e\u7248\u3092\u3001\u4fdd\u5b58\u6e08\u307f\u306e\u7248\u3068\u3057\u3066\u30de\u30fc\u30af\u3057\u307e\u3057\u305f\u3002", - "pad.userlist.entername": "\u540d\u524d\u3092\u5165\u529b", - "pad.userlist.unnamed": "\u540d\u524d\u306a\u3057", - "pad.userlist.guest": "\u30b2\u30b9\u30c8", - "pad.userlist.deny": "\u62d2\u5426", - "pad.userlist.approve": "\u627f\u8a8d", - "pad.editbar.clearcolors": "\u6587\u66f8\u5168\u4f53\u306e\u4f5c\u8005\u306e\u8272\u5206\u3051\u3092\u6d88\u53bb\u3057\u307e\u3059\u304b?", - "pad.impexp.importbutton": "\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b", - "pad.impexp.importing": "\u30a4\u30f3\u30dd\u30fc\u30c8\u4e2d...", - "pad.impexp.confirmimport": "\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3059\u308b\u3068\u3001\u30d1\u30c3\u30c9\u306e\u73fe\u5728\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u4e0a\u66f8\u304d\u3055\u308c\u307e\u3059\u3002\u672c\u5f53\u306b\u7d9a\u884c\u3057\u307e\u3059\u304b?", - "pad.impexp.convertFailed": "\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4ed6\u306e\u6587\u66f8\u5f62\u5f0f\u3092\u4f7f\u7528\u3059\u308b\u304b\u3001\u624b\u4f5c\u696d\u3067\u30b3\u30d4\u30fc & \u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044", - "pad.impexp.uploadFailed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044", - "pad.impexp.importfailed": "\u30a4\u30f3\u30dd\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f", - "pad.impexp.copypaste": "\u30b3\u30d4\u30fc & \u30da\u30fc\u30b9\u30c8\u3057\u3066\u304f\u3060\u3055\u3044", - "pad.impexp.exportdisabled": "{{type}}\u5f62\u5f0f\u3067\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306f\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u8a73\u7d30\u306f\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005\u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044\u3002" -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "プレーンテã‚ストã¾ãŸã¯ HTML ファイルã‹ã‚‰ã®ã¿ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚より高度ãªã‚¤ãƒ³ãƒãƒ¼ãƒˆæ©Ÿèƒ½ã‚’使用ã™ã‚‹ã«ã¯ã€<a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword をインストール</a>ã—ã¦ãã ã•ã„。", + "pad.modals.connected": "接続ã•ã‚Œã¾ã—ãŸã€‚", + "pad.modals.reconnecting": "パッドã«å†æŽ¥ç¶šä¸...", + "pad.modals.forcereconnect": "強制的ã«å†æŽ¥ç¶š", + "pad.modals.userdup": "別ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§é–‹ã‹ã‚Œã¦ã„ã¾ã™", + "pad.modals.userdup.explanation": "ã“ã®ã‚³ãƒ³ãƒ”ューターã®è¤‡æ•°ã®ãƒ–ラウザーウィンドウã§ã€ã“ã®ãƒ‘ッドを開ã„ã¦ã„るよã†ã§ã™ã€‚", + "pad.modals.userdup.advice": "代ã‚ã‚Šã«ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’å†æŽ¥ç¶šã—ã¾ã™ã€‚", + "pad.modals.unauth": "権é™ãŒã‚ã‚Šã¾ã›ã‚“", + "pad.modals.unauth.explanation": "ã“ã®ãƒšãƒ¼ã‚¸ã®é–²è¦§ä¸ã«ã‚ãªãŸã®æ¨©é™ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚å†æŽ¥ç¶šã‚’ãŠè©¦ã—ãã ã•ã„。", + "pad.modals.looping.explanation": "åŒæœŸã‚µãƒ¼ãƒãƒ¼ã¨ã®é€šä¿¡ã«å•é¡Œç‚¹ãŒã‚ã‚Šã¾ã™ã€‚", + "pad.modals.looping.cause": "ã”使用ä¸ã®ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã¾ãŸã¯ãƒ—ãƒã‚ã‚·ã¨ã¯äº’æ›æ€§ãŒãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚", + "pad.modals.initsocketfail": "サーãƒãƒ¼ã«åˆ°é”ã§ãã¾ã›ã‚“。", + "pad.modals.initsocketfail.explanation": "åŒæœŸã‚µãƒ¼ãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚", + "pad.modals.initsocketfail.cause": "ã“ã‚Œã¯ã”使用ä¸ã®ãƒ–ラウザーやインターãƒãƒƒãƒˆæŽ¥ç¶šã®å•é¡ŒãŒåŽŸå› ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚", + "pad.modals.slowcommit.explanation": "サーãƒãƒ¼ãŒå¿œç”ã—ã¾ã›ã‚“。", + "pad.modals.slowcommit.cause": "ã“ã‚Œã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã®å•é¡ŒãŒåŽŸå› ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚", + "pad.modals.badChangeset.explanation": "投稿ã—ãŸç·¨é›†ã¯åŒæœŸã‚µãƒ¼ãƒãƒ¼ã«ã‚ˆã£ã¦é•æ³•æ€§ã®ã‚ã‚‹ã‚‚ã®ã¨ã—ã¦ç§˜åŒ¿ã•ã‚Œã¾ã—ãŸã€‚", + "pad.modals.badChangeset.cause": "ã“ã‚Œã¯ã‚µãƒ¼ãƒãƒ¼ã®æ§‹æˆä¸è‰¯ã‹ã€äºˆæœŸã›ã¬æŒ™å‹•ã‚’見ã›ãŸãŸã‚ã«ç™ºç”Ÿã—ãŸäº‹è±¡ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚ŒãŒã‚¨ãƒ©ãƒ¼ã§ã‚ã‚‹ç–‘ã„ãŒã‚ã‚Œã°ã€å½“サービス管ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。編集を続行ã™ã‚‹ã«ã¯å†æŽ¥ç¶šã—ã¦ã¿ã¦ãã ã•ã„。", + "pad.modals.corruptPad.explanation": "アクセスã—よã†ã¨ã—ã¦ã„るパッドã¯ç ´æã—ã¦ã„ã¾ã™ã€‚", + "pad.modals.corruptPad.cause": "ã“ã‚Œã¯ã‚µãƒ¼ãƒãƒ¼ã®æ§‹æˆä¸è‰¯ã‹ã€äºˆæœŸã›ã¬æŒ™å‹•ã‚’見ã›ãŸãŸã‚ã«ç™ºç”Ÿã—ãŸäº‹è±¡ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚当サービス管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。", + "pad.modals.deleted": "削除ã•ã‚Œã¾ã—ãŸã€‚", + "pad.modals.deleted.explanation": "ã“ã®ãƒ‘ッドã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚", + "pad.modals.disconnected": "切æ–ã•ã‚Œã¾ã—ãŸã€‚", + "pad.modals.disconnected.explanation": "サーãƒãƒ¼ã¨ã®æŽ¥ç¶šãŒå¤±ã‚ã‚Œã¾ã—ãŸ", + "pad.modals.disconnected.cause": "サーãƒãƒ¼ã‚’利用ã§ããªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡ŒãŒè§£æ±ºã—ãªã„å ´åˆã¯ã‚µãƒ¼ãƒ“スã®ç®¡ç†è€…ã«ãŠçŸ¥ã‚‰ã›ãã ã•ã„。", + "pad.share": "ã“ã®ãƒ‘ッドを共有", + "pad.share.readonly": "èªã¿å–り専用", + "pad.share.link": "リンク", + "pad.share.emebdcode": "埋ã‚è¾¼ã¿ç”¨ URL", + "pad.chat": "ãƒãƒ£ãƒƒãƒˆ", + "pad.chat.title": "ã“ã®ãƒ‘ッドã®ãƒãƒ£ãƒƒãƒˆã‚’é–‹ãã¾ã™ã€‚", + "pad.chat.loadmessages": "ãã®ä»–ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’èªã¿è¾¼ã‚€", + "timeslider.pageTitle": "{{appTitle}} タイムスライダー", + "timeslider.toolbar.returnbutton": "パッドã«æˆ»ã‚‹", + "timeslider.toolbar.authors": "作者:", + "timeslider.toolbar.authorsList": "作者ãªã—", + "timeslider.toolbar.exportlink.title": "エクスãƒãƒ¼ãƒˆ", + "timeslider.exportCurrent": "ç¾åœ¨ã®ç‰ˆã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹å½¢å¼:", + "timeslider.version": "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {{version}}", + "timeslider.saved": "| {{year}}å¹´{{month}}{{day}}æ—¥ã«ä¿å˜", + "timeslider.dateformat": "{{year}}å¹´{{month}}月{{day}}æ—¥ {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "1月", + "timeslider.month.february": "2月", + "timeslider.month.march": "3月", + "timeslider.month.april": "4月", + "timeslider.month.may": "5月", + "timeslider.month.june": "6月", + "timeslider.month.july": "7月", + "timeslider.month.august": "8月", + "timeslider.month.september": "9月", + "timeslider.month.october": "10月", + "timeslider.month.november": "11月", + "timeslider.month.december": "12月", + "timeslider.unnamedauthors": "{{num}} 人ã®åŒ¿åã®{[plural(num) other: 作者 ]}", + "pad.savedrevs.marked": "ã“ã®ç‰ˆã‚’ã€ä¿å˜æ¸ˆã¿ã®ç‰ˆã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã—ãŸã€‚", + "pad.userlist.entername": "åå‰ã‚’入力", + "pad.userlist.unnamed": "åå‰ãªã—", + "pad.userlist.guest": "ゲスト", + "pad.userlist.deny": "æ‹’å¦", + "pad.userlist.approve": "承èª", + "pad.editbar.clearcolors": "文書全体ã®ä½œè€…ã®è‰²åˆ†ã‘を消去ã—ã¾ã™ã‹?", + "pad.impexp.importbutton": "インãƒãƒ¼ãƒˆã™ã‚‹", + "pad.impexp.importing": "インãƒãƒ¼ãƒˆä¸...", + "pad.impexp.confirmimport": "ファイルをインãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€ãƒ‘ッドã®ç¾åœ¨ã®ãƒ†ã‚ストãŒä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚本当ã«ç¶šè¡Œã—ã¾ã™ã‹?", + "pad.impexp.convertFailed": "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’インãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ä»–ã®æ–‡æ›¸å½¢å¼ã‚’使用ã™ã‚‹ã‹ã€æ‰‹ä½œæ¥ã§ã‚³ãƒ”ー & ペーストã—ã¦ãã ã•ã„", + "pad.impexp.uploadFailed": "アップãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„", + "pad.impexp.importfailed": "インãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ", + "pad.impexp.copypaste": "コピー & ペーストã—ã¦ãã ã•ã„", + "pad.impexp.exportdisabled": "{{type}}å½¢å¼ã§ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚詳細ã¯ã‚·ã‚¹ãƒ†ãƒ 管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。" +} diff --git a/src/locales/km.json b/src/locales/km.json new file mode 100644 index 00000000..a90c0e97 --- /dev/null +++ b/src/locales/km.json @@ -0,0 +1,100 @@ +{ + "@metadata": { + "authors": [ + "ážœáŸážŽážáž¶ážšáž·áž‘្ធ", + "Sovichet" + ] + }, + "index.newPad": "áž•áŸážážáŸ’មី", + "index.createOpenPad": "ឬបង្កើáž/បើកផáŸážážŠáŸ‚លមានឈ្មោះ៖", + "pad.toolbar.bold.title": "ដិហ(Ctrl-B)", + "pad.toolbar.italic.title": "ទ្រáŸáž (Ctrl-I)", + "pad.toolbar.underline.title": "គូសបន្ទាážáŸ‹ (Ctrl-U)", + "pad.toolbar.strikethrough.title": "ឆូážáž…ោល", + "pad.toolbar.ol.title": "បញ្ជីážáž¶áž˜ážáž˜áŸ’រៀប", + "pad.toolbar.ul.title": "បញ្ជីមិនážáž¶áž˜ážáž˜áŸ’រៀប", + "pad.toolbar.indent.title": "ážáž·ážáž…ូលក្នុង (TAB)", + "pad.toolbar.unindent.title": "ážáž·ážáž…áŸáž‰áž€áŸ’រៅ (Shift+TAB)", + "pad.toolbar.undo.title": "អាន់ឌូ (Ctrl-Z)", + "pad.toolbar.redo.title": "រីឌូ (Ctrl-Y)", + "pad.toolbar.import_export.title": "នាំចូល/នាំចáŸáž‰ ពី/ទៅប្រភáŸáž‘ឯកសារផ្សáŸáž„ទៀáž", + "pad.toolbar.savedRevision.title": "រក្សាទុកកំណែ", + "pad.toolbar.settings.title": "ការកំណážáŸ‹â€‹", + "pad.toolbar.embed.title": "ចែក​រំលែក​និង​បង្កប់​ផáŸážâ€‹áž“áŸáŸ‡", + "pad.toolbar.showusers.title": "បង្ហាញ​អ្នក​ប្រើ​លើ​ផáŸážâ€‹áž“áŸáŸ‡", + "pad.colorpicker.save": "រក្សាទុក", + "pad.colorpicker.cancel": "បោះបង់", + "pad.loading": "កំពុងផ្ទុក…", + "pad.passwordRequired": "អ្នក​ážáŸ’រូវ​មាន​ពាក្យ​សម្ងាážáŸ‹ ដើម្បី​ចូល​ផáŸážâ€‹áž“áŸáŸ‡", + "pad.permissionDenied": "អ្នក​មិន​មាន​សិទ្ធិ​ចូល​ផáŸážâ€‹áž“áŸáŸ‡â€‹áž‘áŸ", + "pad.wrongPassword": "ពាក្យ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក ážáž»ážŸâ€‹áž ើយ", + "pad.settings.padSettings": "ការ​កំណážáŸ‹â€‹áž•áŸáž", + "pad.settings.myView": "គំហើញរបស់ážáŸ’ញុំ", + "pad.settings.stickychat": "ážáŸ‚ង​បង្ហាញ​ការ​ជជែក​លើ​អáŸáž€áŸ’រង់", + "pad.settings.linenocheck": "áž›áŸážâ€‹áž”ន្ទាážáŸ‹", + "pad.settings.rtlcheck": "អាន​ពី​ស្ដាំ​ទៅ​ឆ្វáŸáž„?", + "pad.settings.fontType": "ប្រភáŸáž‘ពុម្ពអក្សរ៖", + "pad.settings.fontType.normal": "ធម្មážáž¶", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "គំហើញសកល", + "pad.settings.language": "ភាសា៖", + "pad.importExport.import_export": "នាំចូល/នាំចáŸáž‰", + "pad.importExport.import": "ផ្ទុក​ឡើង​ឯកសារ​អážáŸ’ážáž”ទ​ណាមួយ", + "pad.importExport.importSuccessful": "ដោយជោគជáŸáž™!", + "pad.importExport.export": "នាំ​ចáŸáž‰â€‹áž•áŸážâ€‹áž”ច្ចុប្បន្ន​ជា៖", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "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": "បាន​ážáž—្ជាប់​។", + "pad.modals.reconnecting": "កំពុង​ភ្ជាប់​ទៅ​ផáŸážâ€‹ážšáž”ស់​អ្នក​ម្ដង​ទៀáž..", + "pad.modals.forcereconnect": "បង្ážáŸ†â€‹áž²áŸ’យ​ភ្ជាប់​ឡើង​វិញ", + "pad.modals.userdup": "បាន​បើក​ក្នុង​វីនដូ​មួយ​ទៀáž", + "pad.modals.unauth.explanation": "សិទ្ធិ​របស់​អ្នក​ážáŸ’រូវ​បាន​ប្ដូរ ážážŽáŸˆâ€‹áž–áŸáž›â€‹áž€áŸ†áž–ុង​មើល​ទំពáŸážšâ€‹áž“áŸáŸ‡áŸ” សូម​ព្យាយាម​ភ្ជាប់​ឡើង​វិញ។", + "pad.modals.looping.cause": "ប្រហែល​ជា​អ្នក​បាន​ភ្ជាប់​ážáž¶áž˜ firewall ឬ ប្រុកស៊ី ដែល​មិន​ážáŸ’រូវ​គ្នា។", + "pad.modals.initsocketfail": "មិន​អាច​ទៅ​ដល់​ម៉ាស៊ីន​បម្រើ។", + "pad.modals.initsocketfail.cause": "áž“áŸáŸ‡â€‹áž¢áž¶áž…​ជា​បញ្ហា​ជាមួយ​កម្មវិធី​អ៊ីនធឺណិហឬ​ការ​ážáž—្ជាប់​អ៊ីនធឺណិážâ€‹ážšáž”ស់​អ្នក។", + "pad.modals.slowcommit.explanation": "មិន​មាន​ចម្លើយ​ážáž”​ពី​ម៉ាស៊ីន​បម្រើ​ទáŸáŸ”", + "pad.modals.deleted": "បាន​លុប។", + "pad.modals.deleted.explanation": "បាន​លុប​ផáŸážâ€‹áž“áŸáŸ‡â€‹áž…áŸáž‰áŸ”", + "pad.modals.disconnected.explanation": "បាន​បាážáŸ‹â€‹áž€áž¶ážšâ€‹ážáž—្ជាប់​ទៅ​ម៉ាស៊ីន​បម្រើ", + "pad.share": "ចែក​រំលែក​ផáŸážâ€‹áž“áŸáŸ‡", + "pad.share.readonly": "អាន​ážáŸ‚​ប៉ុណ្ណោះ", + "pad.share.link": "ážáŸ†ážŽâ€‹áž—្ជាប់", + "pad.share.emebdcode": "URL បង្កប់", + "pad.chat": "ជជែក", + "pad.chat.title": "បើក​ការ​ជជែក​សម្រាប់​ផáŸážâ€‹áž“áŸáŸ‡áŸ”", + "pad.chat.loadmessages": "ផ្ទុក​សារ​ážáŸ‚ម​ទៀáž", + "timeslider.toolbar.returnbutton": "ážáŸ’រឡប់​ទៅ​ផáŸáž", + "timeslider.toolbar.authors": "អ្នក​បង្កើážáŸ–", + "timeslider.toolbar.authorsList": "គ្មាន​អ្នក​បង្កើáž", + "timeslider.toolbar.exportlink.title": "នាំចáŸáž‰", + "timeslider.exportCurrent": "នាំ​ចáŸáž‰â€‹áž€áŸ†ážŽáŸ‚​បច្ចុប្បន្ន​ជា៖", + "timeslider.version": "កំណែ {{version}}", + "timeslider.saved": "បាន​រក្សា​ទុក {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "មករា", + "timeslider.month.february": "កុម្ភៈ", + "timeslider.month.march": "មិនា", + "timeslider.month.april": "មáŸážŸáž¶", + "timeslider.month.may": "ឧសភា", + "timeslider.month.june": "មិážáž»áž“ា​", + "timeslider.month.july": "កក្ដដា​", + "timeslider.month.august": "សីហា", + "timeslider.month.september": "កញ្ញា", + "timeslider.month.october": "ážáž»áž›áž¶", + "timeslider.month.november": "វិច្ឆិកា", + "timeslider.month.december": "ធ្នូ", + "pad.userlist.entername": "បញ្ចូល​ឈ្មោះ​របស់​អ្នក", + "pad.userlist.unnamed": "គ្មាន​ឈ្មោះ", + "pad.userlist.guest": "ភ្ញៀវ", + "pad.userlist.deny": "បដិសáŸáž’", + "pad.userlist.approve": "យល់​ព្រម", + "pad.impexp.importbutton": "នាំចូលឥឡូវនáŸáŸ‡", + "pad.impexp.importing": "កំពុងនាំចូល​...", + "pad.impexp.importfailed": "នាំចូល​មិន​បាន​សម្រáŸáž…", + "pad.impexp.copypaste": "សូម​ចម្លង​ហើយ​បិទ​ភ្ជាប់", + "pad.impexp.exportdisabled": "ការ​នាំចáŸáž‰â€‹áž‡áž¶ {{type}} ážáŸ’រូវ​បាន​បិទ។ សូម​ទាក់ទង​អ្នក​គ្រប់​គ្រង​ប្រពáŸáž“្ធ សម្រាប់​ពáŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម។" +} diff --git a/src/locales/ko.json b/src/locales/ko.json index ccd7705c..16a478f9 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1,120 +1,123 @@ { "@metadata": { - "authors": { - "1": "\uc544\ub77c" - } + "authors": [ + "Hym411", + "ì•„ë¼" + ] }, - "index.newPad": "\uc0c8 \ud328\ub4dc", - "index.createOpenPad": "\ub610\ub294 \ub2e4\uc74c \uc774\ub984\uc73c\ub85c \ud328\ub4dc \ub9cc\ub4e4\uae30\/\uc5f4\uae30:", - "pad.toolbar.bold.title": "\uad75\uac8c (Ctrl-B)", - "pad.toolbar.italic.title": "\uae30\uc6b8\uc784 (Ctrl-I)", - "pad.toolbar.underline.title": "\ubc11\uc904 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\ucde8\uc18c\uc120", - "pad.toolbar.ol.title": "\uc21c\uc11c \uc788\ub294 \ubaa9\ub85d", - "pad.toolbar.ul.title": "\uc21c\uc11c \uc5c6\ub294 \ubaa9\ub85d", - "pad.toolbar.indent.title": "\ub4e4\uc5ec\uc4f0\uae30", - "pad.toolbar.unindent.title": "\ub0b4\uc5b4\uc4f0\uae30", - "pad.toolbar.undo.title": "\uc2e4\ud589 \ucde8\uc18c (Ctrl-Z)", - "pad.toolbar.redo.title": "\ub2e4\uc2dc \uc2e4\ud589 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\uc800\uc790\uc758 \uc0c9 \uc9c0\uc6b0\uae30", - "pad.toolbar.import_export.title": "\ub2e4\ub978 \ud30c\uc77c \ud615\uc2dd\uc73c\ub85c \uac00\uc838\uc624\uae30\/\ub0b4\ubcf4\ub0b4\uae30", - "pad.toolbar.timeslider.title": "\uc2dc\uac04\uc2ac\ub77c\uc774\ub354", - "pad.toolbar.savedRevision.title": "\uc800\uc7a5\ud55c \ud310", - "pad.toolbar.settings.title": "\uc124\uc815", - "pad.toolbar.embed.title": "\uc774 \ud328\ub4dc \ud3ec\ud568\ud558\uae30", - "pad.toolbar.showusers.title": "\uc774 \ud328\ub4dc\uc5d0 \uc0ac\uc6a9\uc790 \ubcf4\uae30", - "pad.colorpicker.save": "\uc800\uc7a5", - "pad.colorpicker.cancel": "\ucde8\uc18c", - "pad.loading": "\ubd88\ub7ec\uc624\ub294 \uc911...", - "pad.passwordRequired": "\uc774 \ud328\ub4dc\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ube44\ubc00\ubc88\ud638\uac00 \ud544\uc694\ud569\ub2c8\ub2e4", - "pad.permissionDenied": "\uc774 \ud328\ub4dc\uc5d0 \uc811\uadfc\ud560 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4", - "pad.wrongPassword": "\ube44\ubc00\ubc88\ud638\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", - "pad.settings.padSettings": "\ud328\ub4dc \uc124\uc815", - "pad.settings.myView": "\ub0b4 \ubcf4\uae30", - "pad.settings.stickychat": "\ud654\uba74\uc5d0 \ud56d\uc0c1 \ub300\ud654 \ubcf4\uae30", - "pad.settings.colorcheck": "\uc800\uc790 \uc0c9", - "pad.settings.linenocheck": "\uc904 \ubc88\ud638", - "pad.settings.fontType": "\uae00\uaf34 \uc885\ub958:", - "pad.settings.fontType.normal": "\ubcf4\ud1b5", - "pad.settings.fontType.monospaced": "\uace0\uc815 \ud3ed", - "pad.settings.globalView": "\uc804\uc5ed \ubcf4\uae30", - "pad.settings.language": "\uc5b8\uc5b4:", - "pad.importExport.import_export": "\uac00\uc838\uc624\uae30\/\ub0b4\ubcf4\ub0b4\uae30", - "pad.importExport.import": "\ud14d\uc2a4\ud2b8 \ud30c\uc77c\uc774\ub098 \ubb38\uc11c \uc62c\ub9ac\uae30", - "pad.importExport.importSuccessful": "\uc131\uacf5!", - "pad.importExport.export": "\ub2e4\uc74c\uc73c\ub85c \ud604\uc7ac \ud328\ub4dc \ub0b4\ubcf4\ub0b4\uae30:", + "index.newPad": "새 패드", + "index.createOpenPad": "ë˜ëŠ” ë‹¤ìŒ ì´ë¦„으로 패드 만들기/열기:", + "pad.toolbar.bold.title": "굵게 (Ctrl-B)", + "pad.toolbar.italic.title": "기울임 (Ctrl-I)", + "pad.toolbar.underline.title": "밑줄 (Ctrl-U)", + "pad.toolbar.strikethrough.title": "ì·¨ì†Œì„ ", + "pad.toolbar.ol.title": "순서 있는 목ë¡", + "pad.toolbar.ul.title": "순서 없는 목ë¡", + "pad.toolbar.indent.title": "들여쓰기 (TAB)", + "pad.toolbar.unindent.title": "내어쓰기 (Shift+TAB)", + "pad.toolbar.undo.title": "실행 취소 (Ctrl-Z)", + "pad.toolbar.redo.title": "다시 실행 (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "ì €ìžì˜ 색 지우기", + "pad.toolbar.import_export.title": "다른 íŒŒì¼ í˜•ì‹ìœ¼ë¡œ ê°€ì ¸ì˜¤ê¸°/내보내기", + "pad.toolbar.timeslider.title": "시간슬ë¼ì´ë”", + "pad.toolbar.savedRevision.title": "íŒ ì €ìž¥", + "pad.toolbar.settings.title": "ì„¤ì •", + "pad.toolbar.embed.title": "ì´ íŒ¨ë“œë¥¼ ê³µìœ í•˜ê³ í¬í•¨í•˜ê¸°", + "pad.toolbar.showusers.title": "ì´ íŒ¨ë“œì— ì‚¬ìš©ìž ë³´ê¸°", + "pad.colorpicker.save": "ì €ìž¥", + "pad.colorpicker.cancel": "취소", + "pad.loading": "불러오는 중...", + "pad.passwordRequired": "ì´ íŒ¨ë“œì— ì ‘ê·¼í•˜ë ¤ë©´ 비밀번호가 필요합니다", + "pad.permissionDenied": "ì´ íŒ¨ë“œì— ì ‘ê·¼í• ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤", + "pad.wrongPassword": "비밀번호가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤", + "pad.settings.padSettings": "패드 ì„¤ì •", + "pad.settings.myView": "ë‚´ 보기", + "pad.settings.stickychat": "í™”ë©´ì— í•ìƒ 대화 보기", + "pad.settings.colorcheck": "ì €ìž ìƒ‰", + "pad.settings.linenocheck": "줄 번호", + "pad.settings.rtlcheck": "ìš°íš¡ì„œ(오른쪽ì—ì„œ 왼쪽으로)입니까?", + "pad.settings.fontType": "글꼴 종류:", + "pad.settings.fontType.normal": "보통", + "pad.settings.fontType.monospaced": "ê³ ì • í", + "pad.settings.globalView": "ì „ì— ë³´ê¸°", + "pad.settings.language": "언어:", + "pad.importExport.import_export": "ê°€ì ¸ì˜¤ê¸°/내보내기", + "pad.importExport.import": "í…스트 파ì¼ì´ë‚˜ 문서 올리기", + "pad.importExport.importSuccessful": "성공!", + "pad.importExport.export": "다ìŒìœ¼ë¡œ 현재 패드 내보내기:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\uc77c\ubc18 \ud14d\uc2a4\ud2b8", + "pad.importExport.exportplain": "ì¼ë°˜ í…스트", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\uc77c\ubc18 \ud14d\uc2a4\ud2b8\ub098 html \ud615\uc2dd\uc73c\ub85c\ub9cc \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 \uac00\uc838\uc624\uae30 \uae30\ub2a5\uc5d0 \ub300\ud574\uc11c\ub294 <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword\ub97c \uc124\uce58<\/a>\ud558\uc138\uc694.", - "pad.modals.connected": "\uc5f0\uacb0\ud588\uc2b5\ub2c8\ub2e4.", - "pad.modals.reconnecting": "\ud328\ub4dc\uc5d0 \ub2e4\uc2dc \uc5f0\uacb0 \uc911..", - "pad.modals.forcereconnect": "\uac15\uc81c\ub85c \ub2e4\uc2dc \uc5f0\uacb0", - "pad.modals.userdup": "\ub2e4\ub978 \ucc3d\uc5d0\uc11c \uc5f4\ub9ac\uace0 \uc788\uc2b5\ub2c8\ub2e4", - "pad.modals.userdup.explanation": "\uc774 \ud328\ub4dc\ub294 \uc774 \ucef4\ud4e8\ud130\uc5d0 \ud558\ub098\ubcf4\ub2e4 \ub9ce\uc774 \ube0c\ub77c\uc6b0\uc800 \ucc3d\uc5d0\uc11c \uc5f4\ub9b0 \uac83 \uac19\uc2b5\ub2c8\ub2e4.", - "pad.modals.userdup.advice": "\ub300\uc2e0 \uc774 \ucc3d\uc744 \uc0ac\uc6a9\ud574 \ub2e4\uc2dc \uc5f0\uacb0\ud569\ub2c8\ub2e4.", - "pad.modals.unauth": "\uad8c\ud55c\uc774 \uc5c6\uc74c", - "pad.modals.unauth.explanation": "\uc774 \ubb38\uc11c\ub97c \ubcf4\ub294 \ub3d9\uc548 \uad8c\ud55c\uc774 \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc5f0\uacb0\uc744 \uc2dc\ub3c4\ud558\uc138\uc694.", - "pad.modals.looping": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", - "pad.modals.looping.explanation": "\ub3d9\uae30 \uc11c\ubc84\uc640\uc758 \ud1b5\uc2e0 \ubb38\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.looping.cause": "\uc544\ub9c8 \ud638\ud658\ub418\uc9c0 \uc54a\ub294 \ubc29\ud654\ubcbd\uc774\ub098 \ud504\ub85d\uc2dc\ub97c \ud1b5\ud574 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.initsocketfail": "\uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", - "pad.modals.initsocketfail.explanation": "\ub3d9\uae30 \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", - "pad.modals.initsocketfail.cause": "\uc544\ub9c8\ub3c4 \ube0c\ub77c\uc6b0\uc800\ub098 \uc778\ud130\ub137 \uc5f0\uacb0\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.slowcommit": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", - "pad.modals.slowcommit.explanation": "\uc11c\ubc84\uac00 \uc751\ub2f5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", - "pad.modals.slowcommit.cause": "\ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc5d0 \ubb38\uc81c\uac00 \uc788\uae30 \ub54c\ubb38\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.", - "pad.modals.deleted": "\uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", - "pad.modals.deleted.explanation": "\uc774 \ud328\ub4dc\ub97c \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4.", - "pad.modals.disconnected": "\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.", - "pad.modals.disconnected.explanation": "\uc11c\ubc84\uc5d0\uc11c \uc5f0\uacb0\uc744 \uc783\uc5c8\uc2b5\ub2c8\ub2e4", - "pad.modals.disconnected.cause": "\uc11c\ubc84\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774 \ubb38\uc81c\uac00 \uacc4\uc18d \ubc1c\uc0dd\ud558\uba74 \uc54c\ub824\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.", - "pad.share": "\uc774 \ud328\ub4dc \uacf5\uc720\ud558\uae30", - "pad.share.readonly": "\uc77d\uae30 \uc804\uc6a9", - "pad.share.link": "\ub9c1\ud06c", - "pad.share.emebdcode": "URL \ud3ec\ud568", - "pad.chat": "\ub300\ud654", - "pad.chat.title": "\uc774 \ud328\ub4dc\uc5d0 \ub300\ud654\ub97c \uc5fd\ub2c8\ub2e4.", - "pad.chat.loadmessages": "\ub354 \ub9ce\uc740 \uba54\uc2dc\uc9c0 \ubd88\ub7ec\uc624\uae30", - "timeslider.pageTitle": "{{appTitle}} \uc2dc\uac04\uc2ac\ub77c\uc774\ub354", - "timeslider.toolbar.returnbutton": "\ud328\ub4dc\ub85c \ub3cc\uc544\uac00\uae30", - "timeslider.toolbar.authors": "\uc800\uc790:", - "timeslider.toolbar.authorsList": "\uc800\uc790 \uc5c6\uc74c", - "timeslider.toolbar.exportlink.title": "\ub0b4\ubcf4\ub0b4\uae30", - "timeslider.exportCurrent": "\ud604\uc7ac \ubc84\uc804\uc73c\ub85c \ub0b4\ubcf4\ub0b4\uae30:", - "timeslider.version": "\ubc84\uc804 {{version}}", - "timeslider.saved": "{{year}}\ub144 {{month}} {{day}}\uc77c\uc5d0 \uc800\uc7a5\ud568", - "timeslider.dateformat": "{{year}}\ub144\/{{month}}\/{{day}}\uc77c {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "1\uc6d4", - "timeslider.month.february": "2\uc6d4", - "timeslider.month.march": "3\uc6d4", - "timeslider.month.april": "4\uc6d4", - "timeslider.month.may": "5\uc6d4", - "timeslider.month.june": "6\uc6d4", - "timeslider.month.july": "7\uc6d4", - "timeslider.month.august": "8\uc6d4", - "timeslider.month.september": "9\uc6d4", - "timeslider.month.october": "10\uc6d4", - "timeslider.month.november": "11\uc6d4", - "timeslider.month.december": "12\uc6d4", - "timeslider.unnamedauthor": "\uc774\ub984 \uc5c6\ub294 \uc800\uc790 {{num}}\uba85", - "timeslider.unnamedauthors": "\uc774\ub984 \uc5c6\ub294 \uc800\uc790 {{num}}\uba85", - "pad.savedrevs.marked": "\uc774 \ud310\uc740 \uc774\uc81c \uc800\uc7a5\ud55c \ud310\uc73c\ub85c \ud45c\uc2dc\ud569\ub2c8\ub2e4.", - "pad.userlist.entername": "\uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694", - "pad.userlist.unnamed": "\uc774\ub984\uc5c6\uc74c", - "pad.userlist.guest": "\uc190\ub2d8", - "pad.userlist.deny": "\uac70\ubd80", - "pad.userlist.approve": "\uc2b9\uc778", - "pad.editbar.clearcolors": "\uc804\uccb4 \ubb38\uc11c\uc758 \uc800\uc790 \uc0c9\uc744 \uc9c0\uc6b0\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", - "pad.impexp.importbutton": "\uc9c0\uae08 \uac00\uc838\uc624\uae30", - "pad.impexp.importing": "\uac00\uc838\uc624\ub294 \uc911...", - "pad.impexp.confirmimport": "\ud30c\uc77c\uc744 \uac00\uc838\uc624\uba74 \ud328\ub4dc\uc758 \ud604\uc7ac \ud14d\uc2a4\ud2b8\ub97c \ub36e\uc5b4\uc4f0\uac8c \ub429\ub2c8\ub2e4. \uc9c4\ud589\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", - "pad.impexp.convertFailed": "\uc774 \ud30c\uc77c\uc744 \uac00\uc838\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\ub978 \ubb38\uc11c \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud558\uac70\ub098 \uc218\ub3d9\uc73c\ub85c \ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694", - "pad.impexp.uploadFailed": "\uc62c\ub9ac\uae30\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694", - "pad.impexp.importfailed": "\uac00\uc838\uc624\uae30\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4", - "pad.impexp.copypaste": "\ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc73c\uc138\uc694", - "pad.impexp.exportdisabled": "{{type}} \ud615\uc2dd\uc73c\ub85c \ub0b4\ubcf4\ub0b4\uae30\uac00 \ube44\ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4." -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "ì¼ë°˜ í…스트나 html 형ì‹ìœ¼ë¡œë§Œ ê°€ì ¸ì˜¬ 수 있습니다. ê³ ê¸‰ ê°€ì ¸ì˜¤ê¸° ê¸°ëŠ¥ì— ëŒ€í•´ì„œëŠ” <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword를 설치</a>하세요.", + "pad.modals.connected": "연결했습니다.", + "pad.modals.reconnecting": "íŒ¨ë“œì— ë‹¤ì‹œ ì—°ê²° 중..", + "pad.modals.forcereconnect": "ê°•ì œë¡œ 다시 ì—°ê²°", + "pad.modals.userdup": "다른 ì°½ì—ì„œ ì—´ë¦¬ê³ ìžˆìŠµë‹ˆë‹¤", + "pad.modals.userdup.explanation": "ì´ íŒ¨ë“œëŠ” ì´ ì»´í“¨í„°ì— í•˜ë‚˜ë³´ë‹¤ ë§Žì´ ë¸Œë¼ìš°ì € ì°½ì—ì„œ 열린 것 같습니다.", + "pad.modals.userdup.advice": "ëŒ€ì‹ ì´ ì°½ì„ ì‚¬ìš©í•´ 다시 연결합니다.", + "pad.modals.unauth": "ê¶Œí•œì´ ì—†ìŒ", + "pad.modals.unauth.explanation": "ì´ ë¬¸ì„œë¥¼ 보는 ë™ì•ˆ ê¶Œí•œì´ ë°”ë€Œì—ˆìŠµë‹ˆë‹¤. 다시 ì—°ê²°ì„ ì‹œë„하세요.", + "pad.modals.looping.explanation": "ë™ê¸° ì„œë²„ì™€ì˜ í†µì‹ ë¬¸ì œê°€ 있습니다.", + "pad.modals.looping.cause": "아마 호환ë˜ì§€ 않는 방화벽ì´ë‚˜ 프ë¡ì‹œë¥¼ 통해 ì—°ê²°ë˜ì–´ 있습니다.", + "pad.modals.initsocketfail": "ì„œë²„ì— ì—°ê²°í• ìˆ˜ 없습니다.", + "pad.modals.initsocketfail.explanation": "ë™ê¸° ì„œë²„ì— ì—°ê²°í• ìˆ˜ 없습니다.", + "pad.modals.initsocketfail.cause": "ì•„ë§ˆë„ ë¸Œë¼ìš°ì €ë‚˜ ì¸í„°ë„· ì—°ê²°ì— ë¬¸ì œê°€ 있기 ë•Œë¬¸ì¼ ìˆ˜ 있습니다.", + "pad.modals.slowcommit.explanation": "서버가 ì‘답하지 않습니다.", + "pad.modals.slowcommit.cause": "ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì— ë¬¸ì œê°€ 있기 ë•Œë¬¸ì¼ ìˆ˜ 있습니다.", + "pad.modals.badChangeset.explanation": "ë‹¹ì‹ ì˜ íŽ¸ì§‘ì€ ë™ê¸°í™” ì„œë²„ì— ì˜í•´ 불법ì ì¸ ê²ƒìœ¼ë¡œ 분류ë˜ì—ˆìŠµë‹ˆë‹¤.", + "pad.modals.badChangeset.cause": "ìž˜ëª»ëœ ì„œë²„ 구성ì´ë‚˜ 예기치 못한 í–‰ë™ ë•Œë¬¸ì— ë°œìƒí–ˆì„ 수 있습니다. 서버 관리ìžì™€ ì—°ë½í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤. 만약 ì´ ë©”ì‹œì§€ê°€ 오류ë¼ê³ ìƒê°ëœë‹¤ë©´, íŽ¸ì§‘ì„ ë‹¤ì‹œ ì‹œë„í•´ 보세요.", + "pad.modals.corruptPad.explanation": "ë‹¹ì‹ ì´ ì‹œë„í•˜ë ¤ëŠ” 패드는 ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤.", + "pad.modals.corruptPad.cause": "ìž˜ëª»ëœ ì„œë²„ 구성 ë˜ëŠ” 다른 예기치 ì•Šì€ ì˜¤ë¥˜ ë•Œë¬¸ì— ë°œìƒí–ˆì„ 수 있습니다. 서버 관리ìžì™€ ì—°ë½í•˜ì„¸ìš”.", + "pad.modals.deleted": "ì‚ì œë˜ì—ˆìŠµë‹ˆë‹¤.", + "pad.modals.deleted.explanation": "ì´ íŒ¨ë“œë¥¼ ì œê±°í–ˆìŠµë‹ˆë‹¤.", + "pad.modals.disconnected": "ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤.", + "pad.modals.disconnected.explanation": "서버ì—ì„œ ì—°ê²°ì„ ìžƒì—ˆìŠµë‹ˆë‹¤", + "pad.modals.disconnected.cause": "서버를 ì‚¬ìš©í• ìˆ˜ 없습니다. ì´ ë¬¸ì œê°€ ê³„ì† ë°œìƒí•˜ë©´ 서비스 관리ìžì—게 ì•Œë ¤ì£¼ì‹œê¸° ë°”ëžë‹ˆë‹¤.", + "pad.share": "ì´ íŒ¨ë“œ ê³µìœ í•˜ê¸°", + "pad.share.readonly": "ì½ê¸° ì „ìš©", + "pad.share.link": "ë§í¬", + "pad.share.emebdcode": "URL í¬í•¨", + "pad.chat": "대화", + "pad.chat.title": "ì´ íŒ¨ë“œì— ëŒ€í™”ë¥¼ 엽니다.", + "pad.chat.loadmessages": "ë” ë§Žì€ ë©”ì‹œì§€ 불러오기", + "timeslider.pageTitle": "{{appTitle}} 시간슬ë¼ì´ë”", + "timeslider.toolbar.returnbutton": "패드로 ëŒì•„가기", + "timeslider.toolbar.authors": "ì €ìž:", + "timeslider.toolbar.authorsList": "ì €ìž ì—†ìŒ", + "timeslider.toolbar.exportlink.title": "내보내기", + "timeslider.exportCurrent": "현재 ë²„ì „ìœ¼ë¡œ 내보내기:", + "timeslider.version": "ë²„ì „ {{version}}", + "timeslider.saved": "{{year}}ë…„ {{month}} {{day}}ì¼ì— ì €ìž¥í•¨", + "timeslider.dateformat": "{{year}}ë…„/{{month}}/{{day}}ì¼ {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "1ì›”", + "timeslider.month.february": "2ì›”", + "timeslider.month.march": "3ì›”", + "timeslider.month.april": "4ì›”", + "timeslider.month.may": "5ì›”", + "timeslider.month.june": "6ì›”", + "timeslider.month.july": "7ì›”", + "timeslider.month.august": "8ì›”", + "timeslider.month.september": "9ì›”", + "timeslider.month.october": "10ì›”", + "timeslider.month.november": "11ì›”", + "timeslider.month.december": "12ì›”", + "timeslider.unnamedauthors": "ì´ë¦„ 없는 {[plural(num) one: ì €ìž, other: ì €ìž ]} {{num}}명", + "pad.savedrevs.marked": "ì´ íŒì€ ì´ì œ ì €ìž¥í•œ íŒìœ¼ë¡œ 표시합니다.", + "pad.userlist.entername": "ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”", + "pad.userlist.unnamed": "ì´ë¦„ì—†ìŒ", + "pad.userlist.guest": "ì†ë‹˜", + "pad.userlist.deny": "거부", + "pad.userlist.approve": "승ì¸", + "pad.editbar.clearcolors": "ì „ì²´ ë¬¸ì„œì˜ ì €ìž ìƒ‰ì„ ì§€ìš°ì‹œê² ìŠµë‹ˆê¹Œ?", + "pad.impexp.importbutton": "지금 ê°€ì ¸ì˜¤ê¸°", + "pad.impexp.importing": "ê°€ì ¸ì˜¤ëŠ” 중...", + "pad.impexp.confirmimport": "파ì¼ì„ ê°€ì ¸ì˜¤ë©´ íŒ¨ë“œì˜ í˜„ìž¬ í…스트를 ë®ì–´ì“°ê²Œ ë©ë‹ˆë‹¤. ì§„í–‰í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", + "pad.impexp.convertFailed": "ì´ íŒŒì¼ì„ ê°€ì ¸ì˜¬ 수 없습니다. 다른 문서 형ì‹ì„ 사용하거나 수ë™ìœ¼ë¡œ 복사하여 붙여넣으세요", + "pad.impexp.uploadFailed": "올리기를 실패했습니다. 다시 ì‹œë„하세요", + "pad.impexp.importfailed": "ê°€ì ¸ì˜¤ê¸°ë¥¼ 실패했습니다", + "pad.impexp.copypaste": "복사하여 붙여넣으세요", + "pad.impexp.exportdisabled": "{{type}} 형ì‹ìœ¼ë¡œ 내보내기가 비활성화ë˜ì–´ 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ ì‹œìŠ¤í…œ 관리ìžì—게 문ì˜í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤." +} diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 648f9506..5c471273 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -1,120 +1,122 @@ { "@metadata": { - "authors": { - "1": "Purodha" - } + "authors": [ + "Purodha" + ] }, "index.newPad": "Neu Padd", - "index.createOpenPad": "udder maach e Padd op med d\u00e4m Naame:", - "pad.toolbar.bold.title": "F\u00e4ttschreff (Strg-B)", + "index.createOpenPad": "udder maach e Padd op med däm Naame:", + "pad.toolbar.bold.title": "Fättschreff (Strg-B)", "pad.toolbar.italic.title": "Scheive Schreff (Strg-I)", "pad.toolbar.underline.title": "Ongerstresche (Strg-U)", "pad.toolbar.strikethrough.title": "Dorschjeschtresche", - "pad.toolbar.ol.title": "Le\u00df met Nommere", - "pad.toolbar.ul.title": "Le\u00df met Pongkte", - "pad.toolbar.indent.title": "Enjer\u00f6k", - "pad.toolbar.unindent.title": "U\u00dfjer\u00f6k", - "pad.toolbar.undo.title": "Retuur n\u00e4mme (Strg-Z)", + "pad.toolbar.ol.title": "Leß met Nommere", + "pad.toolbar.ul.title": "Leß met Pongkte", + "pad.toolbar.indent.title": "Enjerök (TAB)", + "pad.toolbar.unindent.title": "Ußjerök (Jruhßschreff+TAB)", + "pad.toolbar.undo.title": "Retuur nämme (Strg-Z)", "pad.toolbar.redo.title": "Norrens (Strg-Y)", - "pad.toolbar.clearAuthorship.title": "d\u00e4 Schriiver ier F\u00e4rve fottn\u00e4mme", - "pad.toolbar.import_export.title": "Vun ongerscheidlijje Dattei_Fommaate empotteere udder \u00e4xpotteere", + "pad.toolbar.clearAuthorship.title": "dä Schriiver ier Färve fottnämme", + "pad.toolbar.import_export.title": "Vun ongerscheidlijje Dattei_Fommaate empotteere udder äxpotteere", "pad.toolbar.timeslider.title": "Verjangeheid afschpelle", - "pad.toolbar.savedRevision.title": "de Versjohn fa\u00dfhallde", - "pad.toolbar.settings.title": "Enscht\u00e4llonge", - "pad.toolbar.embed.title": "Donn dat Padd enbenge", + "pad.toolbar.savedRevision.title": "de Versjohn faßhallde", + "pad.toolbar.settings.title": "Enschtällonge", + "pad.toolbar.embed.title": "Donn dat Padd öffentlesch maache un enbenge", "pad.toolbar.showusers.title": "Verbonge Metschriiver aanzeije", - "pad.colorpicker.save": "Fa\u00dfhallde", - "pad.colorpicker.cancel": "Oph\u00fc\u00fcre", - "pad.loading": "Aam Laade …", - "pad.passwordRequired": "Do bruchs e Pa\u00dfwoot f\u00f6r heh dat P\u00e4dd.", - "pad.permissionDenied": "Do h\u00e4s nit dat R\u00e4\u00e4sch, op heh dat P\u00e4dd zohzejriife.", - "pad.wrongPassword": "Ding Pa\u00dfwoot wohr verkeht.", - "pad.settings.padSettings": "Dam P\u00e4dd sin Enscht\u00e4llonge", + "pad.colorpicker.save": "Faßhallde", + "pad.colorpicker.cancel": "Ophüüre", + "pad.loading": "Ben aam Laade …", + "pad.passwordRequired": "Do bruchs e Paßwoot för heh dat Pädd.", + "pad.permissionDenied": "Do häs nit dat Rääsch, op heh dat Pädd zohzejriife.", + "pad.wrongPassword": "Ding Paßwoot wohr verkeht.", + "pad.settings.padSettings": "Dam Pädd sin Enschtällonge", "pad.settings.myView": "Anseesch", "pad.settings.stickychat": "Donn der Klaaf emmer aanzeije", - "pad.settings.colorcheck": "F\u00e4rve f\u00f6r de Schriiver", - "pad.settings.linenocheck": "Nommere f\u00f6r de Reije", + "pad.settings.colorcheck": "Färve för de Schriiver", + "pad.settings.linenocheck": "Nommere för de Reije", + "pad.settings.rtlcheck": "Schreff vun Rääschß noh Lenks?", "pad.settings.fontType": "Zoot Schreff", "pad.settings.fontType.normal": "Nomaal", "pad.settings.fontType.monospaced": "einheidlesch brejde Zeische", - "pad.settings.globalView": "Et U\u00dfsin f\u00f6r Alle", + "pad.settings.globalView": "Et Ußsin för Alle", "pad.settings.language": "Schprooch:", - "pad.importExport.import_export": "Empoot\/\u00c4xpoot", - "pad.importExport.import": "Donn jeede T\u00e4x udder jeede Zoot Dokem\u00e4nt huhlaade", + "pad.importExport.import_export": "Empoot/Äxpoot", + "pad.importExport.import": "Donn jeede Täx udder jeede Zoot Dokemänt huhlaade", "pad.importExport.importSuccessful": "Jeschaff!", - "pad.importExport.export": "Don dat P\u00e4dd \u00e4xpoteere al\u00df:", + "pad.importExport.export": "Don dat Pädd äxpoteere alß:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Eijfach T\u00e4x", + "pad.importExport.exportplain": "Eijfach Täx", "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF (Poteerbaa Dokem\u00e4nte Fommaat)", - "pad.importExport.exportopen": "ODF (Offe Dokem\u00e4nte-Fommaat)", + "pad.importExport.exportpdf": "PDF (Poteerbaa Dokemänte Fommaat)", + "pad.importExport.exportopen": "ODF (Offe Dokemänte-Fommaat)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Mer k\u00fcnne blo\u00df eijfaache T\u00e4xte udder HTML_Fommaate empoteere. Opw\u00e4ndejere M\u00fcjjeleschkeite f\u00f6 der Empoot jon och, dof\u00f6r bruch mer en <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Enschtallazjuhn met <i lang=\"en\">Abiword<\/i><\/a>.", + "pad.importExport.abiword.innerHTML": "Mer künne bloß eijfaache Täxte udder HTML_Fommaate empoteere. Opwändejere Müjjeleschkeite fö der Empoot jon och, doför bruch mer en <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Enschtallazjuhn met <i lang=\"en\">Abiword</i></a>.", "pad.modals.connected": "Verbonge.", "pad.modals.reconnecting": "Ben wider aam Verbenge …", "pad.modals.forcereconnect": "Wider verbenge", - "pad.modals.userdup": "En enem andere Finster en \u00c4rbeid", - "pad.modals.userdup.explanation": "Heh dat Padd schingk en mieh wi einem Finster vun enem Brauser op heh d\u00e4m R\u00e4\u00e4schner op ze sin.", - "pad.modals.userdup.advice": "En heh d\u00e4m Finster wider verbenge.", - "pad.modals.unauth": "Nit ber\u00e4\u00e4schtesch", - "pad.modals.unauth.explanation": "Ding Ber\u00e4\u00e4schtejong h\u00e4t sesch je\u00e4ndert, derwiehl De di Sigg aam beloore wohr\u00df. Vers\u00f6hk en neu Verbendong ze maache.", - "pad.modals.looping": "De Verbendong es fott.", - "pad.modals.looping.explanation": "Et jitt Probleeme met d\u00e4 Verbendong mem \u1e9e\u00f6\u00f6ver f\u00f6r de Schriiver ier Aandeile zesamme_ze_br\u00e4nge.", - "pad.modals.looping.cause": "K\u00fcnnt sin, Ding Verbendong jeiht dorj_ene onzopa\u00df proxy-\u1e9e\u00f6\u00f6ver udder firewall.", - "pad.modals.initsocketfail": "D\u00e4 \u1e9e\u00f6\u00f6ver es nit ze \u00e4reische.", - "pad.modals.initsocketfail.explanation": "Kein Verbendong met d\u00e4m \u1e9e\u00f6\u00f6ver ze krijje.", - "pad.modals.initsocketfail.cause": "Dat k\u00fcnnt aam Brauser udder aan d\u00e4m singer Verbendong \u00f6vver et Internet lijje.", - "pad.modals.slowcommit": "De Verbendong es fott.", - "pad.modals.slowcommit.explanation": "D\u00e4 \u1e9e\u00f6\u00f6ver antwoot nit.", - "pad.modals.slowcommit.cause": "Dat k\u00fcnnt aan Probleeme met Verbendonge em N\u00e4zw\u00e4rrek lijje.", - "pad.modals.deleted": "Fottjeschme\u00dfe.", - "pad.modals.deleted.explanation": "Dat P\u00e4dd es fottjeschme\u00dfe woode.", + "pad.modals.userdup": "En enem andere Finster en Ärbeid", + "pad.modals.userdup.explanation": "Heh dat Padd schingk en mieh wi einem Finster vun enem Brauser op heh däm Rääschner op ze sin.", + "pad.modals.userdup.advice": "En heh däm Finster wider verbenge.", + "pad.modals.unauth": "Nit berääschtesch", + "pad.modals.unauth.explanation": "Ding Berääschtejong hät sesch jeändert, derwiehl De di Sigg aam beloore wohrß. Versöhk en neu Verbendong ze maache.", + "pad.modals.looping.explanation": "Et jitt Probleeme met dä Verbendong mem ẞööver för de Schriiver ier Aandeile zesamme_ze_bränge.", + "pad.modals.looping.cause": "Künnt sin, Ding Verbendong jeiht dorj_ene onzopaß proxy-ẞööver udder firewall.", + "pad.modals.initsocketfail": "Dä ẞööver es nit ze äreische.", + "pad.modals.initsocketfail.explanation": "Kein Verbendong met däm ẞööver ze krijje.", + "pad.modals.initsocketfail.cause": "Dat künnt aam Brauser udder aan däm singer Verbendong övver et Internet lijje.", + "pad.modals.slowcommit.explanation": "Dä ẞööver antwoot nit.", + "pad.modals.slowcommit.cause": "Dat künnt aan Probleeme met Verbendonge em Näzwärrek lijje.", + "pad.modals.badChangeset.explanation": "En Änderong, di De jemaat häs, wood vum ẞööver nit aanjenumme.", + "pad.modals.badChangeset.cause": "Dat künnt sin wääje ener verkehte Enschtällong vum ẞööver udder ohnjät, wat mer nit äwaadt hät. Donn Desch aan däm ßööver singe Bedriever wände, wann De meins, dat dat ene Fähler wör. Donn desch neu verbende, öm mem Schriive wigger ze maache.", + "pad.modals.corruptPad.explanation": "Dat Pädd, wo De desch met verbenge wells, es kappott.", + "pad.modals.corruptPad.cause": "Dat künnt sin wääje ener verkehte Enschtällong vum ẞööver udder ohnjät, wat mer nit äwaadt hät. Donn Desch aan däm ßööver singe Bedriever wände.", + "pad.modals.deleted": "Fottjeschmeße.", + "pad.modals.deleted.explanation": "Dat Pädd es fottjeschmeße woode.", "pad.modals.disconnected": "Do bes nit mieh verbonge.", - "pad.modals.disconnected.explanation": "De Verbendong mem \u1e9e\u00f6\u00f6ver es fott.", - "pad.modals.disconnected.cause": "D\u00e4 \u1e9e\u00f6\u00f6ver k\u00fcnnt nit loufe.\nSidd_esu jood und saat ons Bescheid, wann dat \u00f6fters pa\u00dfeet.", - "pad.share": "Maach heh dat Padd \u00f6ffentlesch", - "pad.share.readonly": "Nor zom L\u00e4sse", + "pad.modals.disconnected.explanation": "De Verbendong mem ẞööver es fott.", + "pad.modals.disconnected.cause": "Dä ẞööver künnt nit mieh loufe.\nSidd_esu jood und saad ons Bescheid, wann dadd esu bliiv.", + "pad.share": "Maach heh dat Padd öffentlesch", + "pad.share.readonly": "Nor zom Lässe", "pad.share.link": "Lengk", "pad.share.emebdcode": "URL enboue", "pad.chat": "Klaaf", - "pad.chat.title": "Maach d\u00e4 Klaaf f\u00f6r heh dat P\u00e4dd op", + "pad.chat.title": "Maach dä Klaaf för heh dat Pädd op", "pad.chat.loadmessages": "Mieh Nohresschte laade...", "timeslider.pageTitle": "{{appTitle}} - Verjangeheid affschpelle", - "timeslider.toolbar.returnbutton": "Jangk retuur nohm P\u00e4dd", + "timeslider.toolbar.returnbutton": "Jangk retuur nohm Pädd", "timeslider.toolbar.authors": "Schriiver:", "timeslider.toolbar.authorsList": "Kein Schriivere", - "timeslider.toolbar.exportlink.title": "\u00c4xpoot", - "timeslider.exportCurrent": "Donn de meu\u00dfte V\u00e4sjohn \u00e4xpotteere al\u00df:", - "timeslider.version": "V\u00e4sjon {{version}}", - "timeslider.saved": "Fa\u00dfjehallde aam {{day}}. {{month}} {{year}}", - "timeslider.dateformat": "amm {{day}}. {{month}} {{year}} \u00f6m {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.toolbar.exportlink.title": "Äxpooteere", + "timeslider.exportCurrent": "Donn de meußte Väsjohn äxpotteere alß:", + "timeslider.version": "Väsjon {{version}}", + "timeslider.saved": "Faßjehallde aam {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "amm {{day}}. {{month}} {{year}} öm {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Jannewaa", - "timeslider.month.february": "F\u00e4\u00e4browaa", - "timeslider.month.march": "M\u00e4\u00e4z", + "timeslider.month.february": "Fääbrowaa", + "timeslider.month.march": "Määz", "timeslider.month.april": "Apprell", "timeslider.month.may": "Mai", "timeslider.month.june": "Juuni", "timeslider.month.july": "Juuli", - "timeslider.month.august": "Oujo\u00df", - "timeslider.month.september": "S\u00e4pt\u00e4mber", + "timeslider.month.august": "Oujoß", + "timeslider.month.september": "Säptämber", "timeslider.month.october": "Oktoober", - "timeslider.month.november": "Nov\u00e4mber", - "timeslider.month.december": "Dez\u00e4mber", - "timeslider.unnamedauthor": "{{num}} naameloose Schriever", - "timeslider.unnamedauthors": "{{num}} naameloose Schriever", - "pad.savedrevs.marked": "Heh di V\u00e4sjohn es j\u00e4z fa\u00dfjehallde.", + "timeslider.month.november": "Novämber", + "timeslider.month.december": "Dezämber", + "timeslider.unnamedauthors": "{[plural(num) one: eine, other: {{num}} ]} naameloose Schriever", + "pad.savedrevs.marked": "Heh di Väsjohn es jäz faßjehallde.", "pad.userlist.entername": "Jif Dinge Naame en", - "pad.userlist.unnamed": "naamelo\u00df\u00df", - "pad.userlist.guest": "Ja\u00df\u00df", + "pad.userlist.unnamed": "naameloßß", + "pad.userlist.guest": "Jaßß", "pad.userlist.deny": "Aflehne", - "pad.userlist.approve": "Joodhei\u00dfe", - "pad.editbar.clearcolors": "Sulle mer de F\u00e4rve f\u00f6r de Schriiver uss_em janze T\u00e4x fott maache?", - "pad.impexp.importbutton": "J\u00e4z empoteere", + "pad.userlist.approve": "Joodheiße", + "pad.editbar.clearcolors": "Sulle mer de Färve för de Schriiver uss_em janze Täx fott maache?", + "pad.impexp.importbutton": "Jäz empoteere", "pad.impexp.importing": "Ben aam Empotteere …", - "pad.impexp.confirmimport": "En Dattei ze empotteere m\u00e4\u00e4t der janze T\u00e4x em P\u00e4dd fott. Wess De dat verfaftesch hann?", - "pad.impexp.convertFailed": "Mer kunnte di Dattei nit empoteere. Nemm en ander Dattei-Fommaat udder donn d\u00e4 T\u00e4x vun Hand kopeere un ennf\u00f6\u00f6je.", - "pad.impexp.uploadFailed": "Et Huhlaade es don\u00e4vve jejange, bes esu jood un probeer et norr_ens", - "pad.impexp.importfailed": "Et Empoteere es don\u00e4vve jejange", - "pad.impexp.copypaste": "Bes esu jood un donn et koppeere un enf\u00f6\u00f6je", - "pad.impexp.exportdisabled": "Et \u00c4xpotteere em {{type}}-Formmaat es affjeschalldt. De Verwallder vun heh d\u00e4 Sigge k\u00fcnne doh velleisch wiggerh\u00e4llefe." -}
\ No newline at end of file + "pad.impexp.confirmimport": "En Dattei ze empotteere määt der janze Täx em Pädd fott. Wess De dat verfaftesch hann?", + "pad.impexp.convertFailed": "Mer kunnte di Dattei nit empoteere. Nemm en ander Dattei-Fommaat udder donn dä Täx vun Hand kopeere un ennfööje.", + "pad.impexp.uploadFailed": "Et Huhlaade es donävve jejange, bes esu jood un probeer et norr_ens", + "pad.impexp.importfailed": "Et Empoteere es donävve jejange", + "pad.impexp.copypaste": "Bes esu jood un donn et koppeere un enfööje", + "pad.impexp.exportdisabled": "Et Äxpotteere em {{type}}-Formmaat es affjeschalldt. De Verwallder vun heh dä Sigge künne doh velleisch wiggerhällefe." +} diff --git a/src/locales/lb.json b/src/locales/lb.json new file mode 100644 index 00000000..3cf1f684 --- /dev/null +++ b/src/locales/lb.json @@ -0,0 +1,54 @@ +{ + "@metadata": { + "authors": [ + "Robby", + "Soued031" + ] + }, + "index.newPad": "Neie Pad", + "pad.toolbar.ol.title": "Numeréiert Lëscht", + "pad.toolbar.ul.title": "Net-numeréiert Lëscht", + "pad.toolbar.undo.title": "Réckgängeg (Ctrl-Z)", + "pad.toolbar.redo.title": "Widderhuelen (Ctrl-Y)", + "pad.toolbar.savedRevision.title": "Versioun späicheren", + "pad.toolbar.settings.title": "Astellungen", + "pad.colorpicker.save": "Späicheren", + "pad.colorpicker.cancel": "Ofbriechen", + "pad.loading": "Lueden...", + "pad.wrongPassword": "Äert Passwuert ass falsch", + "pad.settings.fontType.normal": "Normal", + "pad.settings.language": "Sprooch:", + "pad.importExport.importSuccessful": "Erfollegräich", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.modals.unauth": "Net autoriséiert", + "pad.modals.slowcommit.explanation": "De Server äntwert net.", + "pad.modals.deleted": "Geläscht.", + "pad.share.readonly": "Nëmme liesen", + "pad.share.link": "Link", + "pad.chat.loadmessages": "Méi Message lueden", + "timeslider.toolbar.authors": "Auteuren:", + "timeslider.toolbar.authorsList": "Keng Auteuren", + "timeslider.exportCurrent": "Exportéiert déi aktuell Versioun als:", + "timeslider.version": "Versioun {{version}}", + "timeslider.saved": "Gespäichert de(n) {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januar", + "timeslider.month.february": "Februar", + "timeslider.month.march": "Mäerz", + "timeslider.month.april": "Abrëll", + "timeslider.month.may": "Mee", + "timeslider.month.june": "Juni", + "timeslider.month.july": "Juli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Dezember", + "pad.userlist.entername": "Gitt Ären Numm an", + "pad.userlist.guest": "Gaascht", + "pad.impexp.importbutton": "Elo importéieren", + "pad.impexp.importing": "Importéieren..." +} diff --git a/src/locales/lrc.json b/src/locales/lrc.json new file mode 100644 index 00000000..e30aaecd --- /dev/null +++ b/src/locales/lrc.json @@ -0,0 +1,79 @@ +{ + "@metadata": { + "authors": [ + "Mogoeilor" + ] + }, + "index.newPad": "دشته تازه", + "pad.toolbar.bold.title": "توپر", + "pad.toolbar.italic.title": "کج کوله(ctrl-l)", + "pad.toolbar.underline.title": "زیر خط دار بین (Ctrl-U)", + "pad.toolbar.ol.title": "نوم Ú¯Ù‡ منظم", + "pad.toolbar.ul.title": "نوم Ú¯Ù‡ بی نظم", + "pad.toolbar.indent.title": "مئن رئته(TAB)", + "pad.toolbar.unindent.title": "وه در رئته (Shift+TAB)", + "pad.toolbar.undo.title": "رد انجوم دئین (Ctrl-Z)", + "pad.toolbar.redo.title": "د نو انجوم دئین(Ctrl-Y)", + "pad.toolbar.settings.title": "تنظيمات", + "pad.colorpicker.save": "ذخيره كردن", + "pad.colorpicker.cancel": "رد كردن", + "pad.loading": "د Øالت سوار كرد", + "pad.wrongPassword": "پاسوردتو اشتوائه", + "pad.settings.padSettings": "تنظیمات دشته", + "pad.settings.myView": "نظرگه مه", + "pad.settings.stickychat": "همیشه د بلگه Ú†Ú© چنه بکید", + "pad.settings.linenocheck": "شماره خطیا", + "pad.settings.fontType": "نوع Ùونت:", + "pad.settings.fontType.normal": "عادی", + "pad.settings.fontType.monospaced": "تک جاگه", + "pad.settings.globalView": "دیئن جهونی", + "pad.settings.language": "زون:", + "pad.importExport.import_export": "وامین آوردن/د در دئن", + "pad.importExport.importSuccessful": "موÙÙ‚ بی!", + "pad.importExport.export": "دشته تازه Ú†ÛŒ وه در بیه:", + "pad.importExport.exporthtml": "اچ تی ام ال", + "pad.importExport.exportplain": "متن ساده", + "pad.importExport.exportword": "واجه پالایشتگر مایکروساÙت", + "pad.importExport.exportpdf": "Ù¾ÛŒ دی اÙ", + "pad.importExport.exportopen": "او دی اÙ(قالو سند وا بیه)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "وصل بیه", + "pad.modals.forcereconnect": "سی وصل بین مژبور Ú©Ùˆ", + "pad.modals.userdup": "د نیمدری هنی واز بیه", + "pad.modals.initsocketfail": "سرور د دسرسی نئ.", + "pad.modals.deleted": "پاک بیه", + "pad.modals.deleted.explanation": "ای دشته جا وه جا بیه", + "pad.modals.disconnected": "ارتواطتو قطع بیه", + "pad.share": "ای دشته نه بهر Ú©Ùˆ", + "pad.share.readonly": "Ùقط بØون", + "pad.share.link": "هوم پیوند", + "pad.chat": "Ú¯Ù¾ زئن", + "pad.chat.title": "Ú¯Ù¾ چنه نه سی دشته وا Ú©Ùˆ.", + "pad.chat.loadmessages": "پیغومیا بیشتر نه سوار Ú©Ùˆ", + "timeslider.toolbar.returnbutton": "ورگرد د دشته", + "timeslider.toolbar.authors": "نیسنه یا:", + "timeslider.toolbar.authorsList": "بی نیسنه", + "timeslider.toolbar.exportlink.title": "وه در ديئن", + "timeslider.version": "نسقه{{نسقه}}", + "timeslider.month.january": "جانويه", + "timeslider.month.february": "Ùوريه", + "timeslider.month.march": "مارس", + "timeslider.month.april": "آوريل", + "timeslider.month.may": "ما", + "timeslider.month.june": "جوئن", + "timeslider.month.july": "جولای", + "timeslider.month.august": "اگوست", + "timeslider.month.september": "سپتامر", + "timeslider.month.october": "اكتور", + "timeslider.month.november": "نوامر", + "timeslider.month.december": "دسامر", + "pad.userlist.entername": "نوم تونه وارد بکید", + "pad.userlist.unnamed": "نوم نهشته", + "pad.userlist.guest": "میزوان", + "pad.userlist.deny": "پرو کردن", + "pad.userlist.approve": "اصلا کردن", + "pad.impexp.importbutton": "ایسه وارد Ú©Ùˆ", + "pad.impexp.importing": "د Øالت وارد کردن", + "pad.impexp.importfailed": "وامین آوردن شکست Øرد", + "pad.impexp.copypaste": "خواهشن وردار بدیسن" +} diff --git a/src/locales/lt.json b/src/locales/lt.json new file mode 100644 index 00000000..503b6589 --- /dev/null +++ b/src/locales/lt.json @@ -0,0 +1,73 @@ +{ + "@metadata": { + "authors": [ + "Eitvys200", + "Mantak111" + ] + }, + "pad.toolbar.bold.title": "ParyÅ¡kintasis (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Ä—s spalvas", + "pad.toolbar.settings.title": "Nustatymai", + "pad.colorpicker.save": "IÅ¡saugoti", + "pad.colorpicker.cancel": "AtÅ¡aukti", + "pad.loading": "Ä®kraunama...", + "pad.settings.myView": "Mano Vaizdas", + "pad.settings.fontType": "Å rifto tipas:", + "pad.settings.fontType.normal": "Normalus", + "pad.settings.globalView": "Bendras Vaizdas", + "pad.settings.language": "Kalba:", + "pad.importExport.import_export": "Importuoti/Eksportuoti", + "pad.importExport.import": "Ä®kelkite bet kokį tekstinį failÄ… arba dokumentÄ…", + "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žiama", + "pad.modals.initsocketfail": "Serveris yra nepasiekiamas.", + "pad.modals.slowcommit.explanation": "Serveris neatsako.", + "pad.modals.deleted": "IÅ¡trintas.", + "pad.modals.disconnected": "JÅ«s atsijungÄ—te.", + "pad.share.readonly": "Tik skaityti", + "pad.share.link": "Nuoroda", + "pad.share.emebdcode": "Ä®terptasis URL", + "pad.chat": "Pokalbiai", + "pad.chat.loadmessages": "Ä®krauti daugiau praneÅ¡imų", + "timeslider.toolbar.authors": "Autoriai:", + "timeslider.toolbar.authorsList": "NÄ—ra autorių", + "timeslider.toolbar.exportlink.title": "Eksportuoti", + "timeslider.exportCurrent": "Eksportuoti dabartinÄ™ versijÄ… kaip:", + "timeslider.version": "Versija {{version}}", + "timeslider.saved": "IÅ¡saugota {{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žė", + "timeslider.month.june": "Birželis", + "timeslider.month.july": "Liepa", + "timeslider.month.august": "RugpjÅ«tis", + "timeslider.month.september": "RugsÄ—jis", + "timeslider.month.october": "Spalis", + "timeslider.month.november": "Lapkritis", + "timeslider.month.december": "Gruodis", + "timeslider.unnamedauthors": "{{num}} bevardžiai(-ių) autoriai(-ių)", + "pad.userlist.entername": "Ä®veskite savo vardÄ…", + "pad.userlist.unnamed": "bevardis", + "pad.userlist.guest": "SveÄias", + "pad.userlist.deny": "Neigti", + "pad.userlist.approve": "Patvirtinti", + "pad.impexp.importbutton": "Importuoti dabar", + "pad.impexp.importing": "Importuojama...", + "pad.impexp.uploadFailed": "Ä®kÄ—limas nepavyko, bandykite dar kartÄ…", + "pad.impexp.importfailed": "Importuoti nepavyko", + "pad.impexp.copypaste": "PraÅ¡ome nukopijuoti ir įklijuoti" +} diff --git a/src/locales/lv.json b/src/locales/lv.json new file mode 100644 index 00000000..e57c4259 --- /dev/null +++ b/src/locales/lv.json @@ -0,0 +1,84 @@ +{ + "@metadata": { + "authors": [ + "Admresdeserv.", + "Jmg.cmdi", + "Papuass" + ] + }, + "pad.toolbar.bold.title": "TreknrakstÄ (CTRL + B)", + "pad.toolbar.italic.title": "SlÄ«praksta (Ctrl-es)", + "pad.toolbar.underline.title": "PasvÄ«trojuma (CTRL + U)", + "pad.toolbar.strikethrough.title": "PÄrsvÄ«trojums", + "pad.toolbar.ol.title": "SakÄrtots saraksts", + "pad.toolbar.ul.title": "NesakÄrtots saraksts", + "pad.toolbar.indent.title": "AtkÄpe", + "pad.toolbar.unindent.title": "IzkÄpe", + "pad.toolbar.undo.title": "Atsaukt (CTRL + Z)", + "pad.toolbar.redo.title": "Atcelt atsaukÅ¡anu (CTRL + Y)", + "pad.toolbar.clearAuthorship.title": "NotÄ«rit autoru krÄsas", + "pad.toolbar.import_export.title": "ImportÄ“Å¡anas/eksportÄ“Å¡anas no un uz citu failu formÄtiem", + "pad.toolbar.savedRevision.title": "SaglabÄt pÄrskatÄ«Å¡anu", + "pad.toolbar.settings.title": "IestatÄ«jumi", + "pad.toolbar.embed.title": "Koplietot un iegut Å¡o pad", + "pad.toolbar.showusers.title": "ParÄdÄ«t Å¡o padu lietotÄjus", + "pad.colorpicker.save": "SaglabÄt", + "pad.colorpicker.cancel": "Atcelt", + "pad.loading": "IelÄdē…", + "pad.passwordRequired": "Ir nepiecieÅ¡ama parole, lai piekļūtu Å¡im pad", + "pad.permissionDenied": "Atvaino, bet tev nav pieejas Å¡im pad.", + "pad.wrongPassword": "JÅ«su parole bija nepareiza", + "pad.settings.padSettings": "Pad Iestatijumi", + "pad.settings.myView": "Mans viedoklis", + "pad.settings.stickychat": "ÄŒats vienmÄ“r ekrÄnÄ", + "pad.settings.colorcheck": "AutorÄ«bas krÄsas", + "pad.settings.linenocheck": "Rindiņu numurus", + "pad.settings.rtlcheck": "LasÄ«t saturu no labÄs puses uz kreiso?", + "pad.settings.fontType": "Fonta tips:", + "pad.settings.fontType.normal": "NormÄls", + "pad.settings.globalView": "GlobÄlu skatÄ«jumu", + "pad.settings.language": "Valoda:", + "pad.importExport.import_export": "Importet/Eksportet", + "pad.importExport.import": "AugÅ¡upielÄdÄ“t jebkuru teksta failu vai dokumentu", + "pad.importExport.importSuccessful": "VeiksmÄ«gi!", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "VienkÄrÅ¡a teksta", + "pad.importExport.exportword": "Programma Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open dokumenta formÄts)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.userdup": "AtvÄ“rts citÄ logÄ", + "pad.modals.unauth": "Nav atļauts", + "pad.modals.looping.explanation": "PastÄv sakaru problÄ“mas ar sinhronizÄcijas servera.", + "pad.modals.initsocketfail": "Serveris nav sasniedzams.", + "pad.modals.initsocketfail.explanation": "NevarÄ“ja izveidot savienojumu ar sinhronizÄcijas serveri.", + "pad.modals.slowcommit.explanation": "Serveris nereaģē.", + "pad.modals.deleted": "DzÄ“sts", + "pad.modals.disconnected": "JÅ«s esat atvienots.", + "pad.modals.disconnected.explanation": "Tika zaudÄ“ts savienojums ar serveri", + "pad.modals.disconnected.cause": "IespÄ“jams, ka serveris nav pieejams. LÅ«gums paziņot mums, ja tas turpina notikt.", + "pad.share": "Koplietot Å¡o pad", + "pad.share.readonly": "Tikai lasÄms", + "pad.share.link": "Saite", + "timeslider.toolbar.authors": "Autori:", + "timeslider.toolbar.authorsList": "Nav autoru", + "timeslider.toolbar.exportlink.title": "EksportÄ“t", + "timeslider.month.january": "JanvÄris", + "timeslider.month.february": "FebruÄris", + "timeslider.month.march": "Marts", + "timeslider.month.april": "AprÄ«lis", + "timeslider.month.may": "Maijs", + "timeslider.month.june": "JÅ«nijs", + "timeslider.month.july": "JÅ«lijs", + "timeslider.month.august": "Augusts", + "timeslider.month.september": "Septembris", + "timeslider.month.october": "Oktobris", + "timeslider.month.november": "Novembris", + "timeslider.month.december": "Decembris", + "pad.userlist.entername": "Ievadiet savu vÄrdu", + "pad.userlist.unnamed": "nenosaukts", + "pad.userlist.guest": "Viesis", + "pad.impexp.importbutton": "ImportÄ“t tÅ«lÄ«t", + "pad.impexp.importing": "ImportÄ“...", + "pad.impexp.importfailed": "Imports neizdevÄs" +} diff --git a/src/locales/map-bms.json b/src/locales/map-bms.json new file mode 100644 index 00000000..883b1d8f --- /dev/null +++ b/src/locales/map-bms.json @@ -0,0 +1,118 @@ +{ + "@metadata": { + "authors": [ + "StefanusRA" + ] + }, + "index.newPad": "Pad Anyar", + "index.createOpenPad": "utawa gawe/bukak Pad nganggo jeneng:", + "pad.toolbar.bold.title": "Kandhel (Ctrl-B)", + "pad.toolbar.italic.title": "Miring (Ctrl-I)", + "pad.toolbar.underline.title": "Garisngisor (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Corettengaeh", + "pad.toolbar.ol.title": "Daftar nganggo nomer", + "pad.toolbar.ul.title": "Daftar ora nganggo nomer", + "pad.toolbar.indent.title": "Nggantung", + "pad.toolbar.unindent.title": "nggantung njaba", + "pad.toolbar.undo.title": "Batalna (Ctrl-Z)", + "pad.toolbar.redo.title": "Baleni (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Busek ''Authorship Colors''", + "pad.toolbar.import_export.title": "Impor/Ekspor sekang/maring format berkas sejen", + "pad.toolbar.timeslider.title": "Timeslider", + "pad.toolbar.savedRevision.title": "Simpen revisi", + "pad.toolbar.settings.title": "Pangaturan", + "pad.toolbar.embed.title": "Sebarna lan ''embed'' pad kiye", + "pad.toolbar.showusers.title": "Tidokna panganggo-panganggo nang pad kiye", + "pad.colorpicker.save": "Simpen", + "pad.colorpicker.cancel": "Batalna", + "pad.loading": "Muatna...", + "pad.passwordRequired": "Rika perlu tembung sandhi kanggo ngakses pad kiye", + "pad.permissionDenied": "Rika ora duwe idin kanggo ngakses pad kiye", + "pad.wrongPassword": "Tembung sandhine Rika salah", + "pad.settings.padSettings": "Pangaturan Pad", + "pad.settings.myView": "Delengane Inyong", + "pad.settings.stickychat": "Dopokan mesti nang layar", + "pad.settings.colorcheck": "Authorship colors", + "pad.settings.linenocheck": "Nomer baris", + "pad.settings.rtlcheck": "Waca isi sekang tengen maring kiwe?", + "pad.settings.fontType": "Tipe Font:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Global View", + "pad.settings.language": "Basa:", + "pad.importExport.import_export": "Impor/Ekspor", + "pad.importExport.import": "Unggahna berkas teks utawa dokumen", + "pad.importExport.importSuccessful": "Sukses!", + "pad.importExport.export": "Ekspor pad kiye dadi:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "t", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Rika mung teyeng impor sekang format plain text utawa HTML. Kanggo fitur impor sing lewih maju monggo <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">masang abiword</a>.", + "pad.modals.connected": "Nyambung.", + "pad.modals.reconnecting": "Mbaleli nyambung ming pad Rika...", + "pad.modals.forcereconnect": "Maksa nyambung maning", + "pad.modals.userdup": "Bukak nang jendela sejen", + "pad.modals.userdup.explanation": "Pad kiye kayane dibukak nang lewih sekang siji browser nang komputer kiye.", + "pad.modals.userdup.advice": "Nyambung maning nganggo jendela kiye baen.", + "pad.modals.unauth": "Not authorized", + "pad.modals.unauth.explanation": "Idin-e Rika wis diowahi dong lagi ndeleng kaca kiye. Jajal nyambung maning.", + "pad.modals.looping.explanation": "Pra ana masalah komunikasi karo server sinkronisasi.", + "pad.modals.looping.cause": "Ndeyan Rika gole nyambung nganggo firewall utawa proksi sing ora pas.", + "pad.modals.initsocketfail": "Server ora teyeng dihubungi.", + "pad.modals.initsocketfail.explanation": "Ora teyeng nyambung maring sinkronisasi server.", + "pad.modals.initsocketfail.cause": "Kiye ndeyan ana masalah karo perambanne Rika utawa sambungan internete Rika.", + "pad.modals.slowcommit.explanation": "Server ora respon.", + "pad.modals.slowcommit.cause": "Kiye ndeyan ana masalah karo sambungan jaringan.", + "pad.modals.deleted": "Dibusek.", + "pad.modals.deleted.explanation": "Pad kiye wis dibusek.", + "pad.modals.disconnected": "Rika wis dipedot sambungane.", + "pad.modals.disconnected.explanation": "Sambungan maring server wis ilang", + "pad.modals.disconnected.cause": "Servere ndeyan ora ana. Monggo tidokna inyong angger kahanan kiye terus kedaden maning.", + "pad.share": "Sebarna pad kiye", + "pad.share.readonly": "Waca thok", + "pad.share.link": "Pranala", + "pad.share.emebdcode": "Embed URL", + "pad.chat": "Dopokan", + "pad.chat.title": "Buka dopokan kanggo pad kiye.", + "pad.chat.loadmessages": "Muatna pesen lewih akeh", + "timeslider.pageTitle": "{{appTitle}} Timeslider", + "timeslider.toolbar.returnbutton": "Mbalik ming pad", + "timeslider.toolbar.authors": "Penulise:", + "timeslider.toolbar.authorsList": "Ora ana penulise", + "timeslider.toolbar.exportlink.title": "Ekspor", + "timeslider.exportCurrent": "Ekspor versi sekiye dadi:", + "timeslider.version": "Versi {{version}}", + "timeslider.saved": "Simpen {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januari", + "timeslider.month.february": "Februari", + "timeslider.month.march": "Maret", + "timeslider.month.april": "April", + "timeslider.month.may": "Mei", + "timeslider.month.june": "Juni", + "timeslider.month.july": "Juli", + "timeslider.month.august": "Agustus", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Desember", + "timeslider.unnamedauthors": "{{num}} durung dijenengi {[plural(num) one: author, other: authors ]}", + "pad.savedrevs.marked": "Revisi kiye sekiye ditandani dadi revisi sing wis disimpen", + "pad.userlist.entername": "Lebokna jenenge Rika", + "pad.userlist.unnamed": "durungdijenengi", + "pad.userlist.guest": "Dayoh", + "pad.userlist.deny": "Ora olih", + "pad.userlist.approve": "Sarujuk", + "pad.editbar.clearcolors": "Busek ''authorship colors'' nang kabeh dokumen?", + "pad.impexp.importbutton": "Impor Sekiye", + "pad.impexp.importing": "Lagi ngimpor...", + "pad.impexp.confirmimport": "Ngimpor berkas bakal dadi nindih teks sekiye nang pad. Apa Rika wis mantep arep mroses kiye?", + "pad.impexp.convertFailed": "Inyong ora teyeng ngimpor berkas kiye. Jajal nganggo format dokumen sejen utawa salin-tempel manual.", + "pad.impexp.uploadFailed": "Gole ngunggah gagal, monggo dijajal maning", + "pad.impexp.importfailed": "Gole ngimpor gagal", + "pad.impexp.copypaste": "Monggo salin-tempel", + "pad.impexp.exportdisabled": "Ngekspor maring format {{type}} ora olih. Monggo takon maring administrator sisteme Rika kanggo detile." +} diff --git a/src/locales/mk.json b/src/locales/mk.json index 94d73bd8..8aaf9917 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -5,117 +5,119 @@ "Brest" ] }, - "index.newPad": "\u041d\u043e\u0432\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430", - "index.createOpenPad": "\u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0435\u0442\u0435\/\u043e\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0441\u043e \u0438\u043c\u0435\u0442\u043e:", - "pad.toolbar.bold.title": "\u0417\u0430\u0434\u0435\u0431\u0435\u043b\u0435\u043d\u043e (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u043e\u0441\u043e (Ctrl-I)", - "pad.toolbar.underline.title": "\u041f\u043e\u0434\u0432\u043b\u0435\u0447\u0435\u043d\u043e (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u041f\u0440\u0435\u0446\u0440\u0442\u0430\u043d\u043e", - "pad.toolbar.ol.title": "\u041f\u043e\u0434\u0440\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.ul.title": "\u041d\u0435\u043f\u043e\u0434\u0440\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.indent.title": "\u0412\u043e\u0432\u043b\u0435\u043a\u0443\u0432\u0430\u045a\u0435", - "pad.toolbar.unindent.title": "\u041e\u0442\u0441\u0442\u0430\u043f", - "pad.toolbar.undo.title": "\u0412\u0440\u0430\u0442\u0438 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041f\u043e\u043d\u0438\u0448\u0442\u0438 \u0433\u0438 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438", - "pad.toolbar.import_export.title": "\u0423\u0432\u043e\u0437\/\u0418\u0437\u0432\u043e\u0437 \u043e\u0434\/\u0432\u043e \u0440\u0430\u0437\u043d\u0438 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u0447\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438", - "pad.toolbar.timeslider.title": "\u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", - "pad.toolbar.savedRevision.title": "\u0417\u0430\u0447\u0443\u0432\u0430\u043d\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0438", - "pad.toolbar.settings.title": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438", - "pad.toolbar.embed.title": "\u0412\u043c\u0435\u0442\u043d\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", - "pad.toolbar.showusers.title": "\u041f\u0440\u0438\u043a\u0430\u0436. \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0446\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", - "pad.colorpicker.save": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458", - "pad.colorpicker.cancel": "\u041e\u0442\u043a\u0430\u0436\u0438", - "pad.loading": "\u0412\u0447\u0438\u0442\u0443\u0432\u0430\u043c...", - "pad.passwordRequired": "\u041f\u043e\u0442\u0440\u0435\u0431\u043d\u0430 \u0435 \u043b\u043e\u0437\u0438\u043d\u043a\u0430 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f", - "pad.permissionDenied": "\u0417\u0430 \u043e\u0432\u0434\u0435 \u043d\u0435 \u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u0430 \u0434\u043e\u0437\u0432\u043e\u043b\u0430 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f", - "pad.wrongPassword": "\u041f\u043e\u0433\u0440\u0435\u0448\u043d\u0430 \u043b\u043e\u0437\u0438\u043d\u043a\u0430", - "pad.settings.padSettings": "\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430", - "pad.settings.myView": "\u041c\u043e\u0458 \u043f\u043e\u0433\u043b\u0435\u0434", - "pad.settings.stickychat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435 \u0441\u0435\u043a\u043e\u0433\u0430\u0448 \u043d\u0430 \u0435\u043a\u0440\u0430\u043d\u043e\u0442", - "pad.settings.colorcheck": "\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438 \u0431\u043e\u0438", - "pad.settings.linenocheck": "\u0411\u0440\u043e\u0435\u0432\u0438 \u043d\u0430 \u0440\u0435\u0434\u043e\u0432\u0438\u0442\u0435", - "pad.settings.fontType": "\u0422\u0438\u043f \u043d\u0430 \u0444\u043e\u043d\u0442:", - "pad.settings.fontType.normal": "\u041d\u043e\u0440\u043c\u0430\u043b\u0435\u043d", - "pad.settings.fontType.monospaced": "\u041d\u0435\u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d", - "pad.settings.globalView": "\u0413\u043e\u0431\u0430\u043b\u0435\u043d \u043f\u043e\u0433\u043b\u0435\u0434", - "pad.settings.language": "\u0408\u0430\u0437\u0438\u043a:", - "pad.importExport.import_export": "\u0423\u0432\u043e\u0437\/\u0418\u0437\u0432\u043e\u0437", - "pad.importExport.import": "\u041f\u043e\u0434\u0438\u0433\u0430\u045a\u0435 \u043d\u0430 \u0431\u0438\u043b\u043e \u043a\u0430\u043a\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u043d\u0430 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", - "pad.importExport.export": "\u0418\u0437\u0432\u0435\u0437\u0438 \u0458\u0430 \u0442\u0435\u043a\u043e\u0432\u043d\u0430\u0442\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u043a\u0430\u043a\u043e", + "index.newPad": "Ðова тетратка", + "index.createOpenPad": "или направете/отворете тетратка Ñо името:", + "pad.toolbar.bold.title": "Задебелено (Ctrl-B)", + "pad.toolbar.italic.title": "КоÑо (Ctrl-I)", + "pad.toolbar.underline.title": "Подвлечено (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Прецртано", + "pad.toolbar.ol.title": "Подреден ÑпиÑок", + "pad.toolbar.ul.title": "Ðеподреден ÑпиÑок", + "pad.toolbar.indent.title": "Вовлекување (TAB)", + "pad.toolbar.unindent.title": "ОтÑтап (Shift+TAB)", + "pad.toolbar.undo.title": "Врати (Ctrl-Z)", + "pad.toolbar.redo.title": "Повтори (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Поништи ги авторÑките бои", + "pad.toolbar.import_export.title": "Увоз/Извоз од/во разни податотечни формати", + "pad.toolbar.timeslider.title": "ИÑториÑки преглед", + "pad.toolbar.savedRevision.title": "Зачувај преработка", + "pad.toolbar.settings.title": "ПоÑтавки", + "pad.toolbar.embed.title": "Споделете и вметнете ја тетраткава", + "pad.toolbar.showusers.title": "Прикаж. кориÑниците на тетраткава", + "pad.colorpicker.save": "Зачувај", + "pad.colorpicker.cancel": "Откажи", + "pad.loading": "Вчитувам...", + "pad.passwordRequired": "Потребна е лозинка за приÑтап", + "pad.permissionDenied": "За овде не е потребна дозвола за приÑтап", + "pad.wrongPassword": "Погрешна лозинка", + "pad.settings.padSettings": "ПоÑтавки на тетратката", + "pad.settings.myView": "Мој поглед", + "pad.settings.stickychat": "Разговорите Ñекогаш на екранот", + "pad.settings.colorcheck": "ÐвторÑки бои", + "pad.settings.linenocheck": "Броеви на редовите", + "pad.settings.rtlcheck": "Содржините да Ñе читаат од деÑно на лево?", + "pad.settings.fontType": "Тип на фонт:", + "pad.settings.fontType.normal": "Ðормален", + "pad.settings.fontType.monospaced": "Ðепропорционален", + "pad.settings.globalView": "Општ поглед", + "pad.settings.language": "Јазик:", + "pad.importExport.import_export": "Увоз/Извоз", + "pad.importExport.import": "Подигање на било каква текÑтуална податотека или документ", + "pad.importExport.importSuccessful": "УÑпешно!", + "pad.importExport.export": "Извези ја тековната тетратка како", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u041f\u0440\u043e\u0441\u0442 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportplain": "ПроÑÑ‚ текÑÑ‚", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0443\u0432\u0435\u0437\u0443\u0432\u0430\u0442\u0435 \u0441\u0430\u043c\u043e \u043e\u0434 \u043f\u0440\u043e\u0441\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438 html-\u0444\u043e\u0440\u043c\u0430\u0442. \u041f\u043e\u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0438 \u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0443\u0432\u043e\u0437 \u045c\u0435 \u0434\u043e\u0431\u0438\u0435\u0442\u0435 \u0430\u043a\u043e <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0435 AbiWord<\/a>.", - "pad.modals.connected": "\u041f\u043e\u0432\u0440\u0437\u0430\u043d\u043e.", - "pad.modals.reconnecting": "\u0412\u0435 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u043c \u0441\u043e \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430...", - "pad.modals.forcereconnect": "\u041d\u0430\u043c\u0435\u0442\u043d\u0438 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435", - "pad.modals.userdup": "\u041e\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0432\u043e \u0434\u0440\u0443\u0433 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446", - "pad.modals.userdup.explanation": "\u041e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u0432\u0435\u045c\u0435 \u043e\u0434 \u0435\u0434\u0435\u043d \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 (\u0432\u043e \u043f\u0440\u0435\u043b\u0438\u0441\u0442\u0443\u0432\u0430\u0447) \u043d\u0430 \u0441\u043c\u0435\u0442\u0430\u0447\u043e\u0442.", - "pad.modals.userdup.advice": "\u041f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435 \u0441\u0435 \u0437\u0430 \u0434\u0430 \u0433\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043e\u0432\u043e\u0458 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446.", - "pad.modals.unauth": "\u041d\u0435\u043e\u0432\u043b\u0430\u0441\u0442\u0435\u043d\u043e", - "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0438\u0442\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0438 \u0441\u0435 \u0438\u043c\u0430\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u0442\u043e \u0434\u043e\u0434\u0435\u043a\u0430 \u0458\u0430 \u0433\u043b\u0435\u0434\u0430\u0432\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0432\u0430. \u041e\u0431\u0438\u0434\u0435\u0442\u0435 \u0441\u0435 \u0434\u0430 \u0441\u0435 \u043f\u0440\u0435\u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435.", - "pad.modals.looping": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430.", - "pad.modals.looping.explanation": "\u0421\u0435 \u0458\u0430\u0432\u0438\u0458\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441\u043e \u0432\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u0443\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u043d\u0438\u043e\u0442 \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447.", - "pad.modals.looping.cause": "\u041c\u043e\u0436\u0435\u0431\u0438 \u0441\u0442\u0435 \u043f\u043e\u0432\u0440\u0437\u0430\u043d\u0438 \u043f\u0440\u0435\u043a\u0443 \u043d\u0435\u0441\u043a\u043b\u0430\u0434\u0435\u043d \u043e\u0433\u043d\u0435\u043d \u0455\u0438\u0434 \u0438\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u043f\u043d\u0438\u043a.", - "pad.modals.initsocketfail": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u0435\u043d.", - "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0432 \u0434\u0430 \u0441\u0435 \u043f\u043e\u0432\u0440\u0437\u0430\u043c \u0441\u043e \u0443\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u043d\u0438\u043e\u0442 \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447.", - "pad.modals.initsocketfail.cause": "\u041e\u0432\u0430 \u0432\u0435\u0440\u043e\u0458\u0430\u0442\u043d\u043e \u0441\u0435 \u0434\u043e\u043b\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043e \u0432\u0430\u0448\u0438\u043e\u0442 \u043f\u0440\u0435\u043b\u0438\u0441\u0442\u0443\u0432\u0430\u0447 \u0438\u043b\u0438 \u0432\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.", - "pad.modals.slowcommit": "\u041f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u043e.", - "pad.modals.slowcommit.explanation": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u043d\u0435 \u0441\u0435 \u043e\u0434\u0455\u0438\u0432\u0430.", - "pad.modals.slowcommit.cause": "\u041e\u0432\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0434\u043e\u043b\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0441\u043e \u043c\u0440\u0435\u0436\u043d\u043e\u0442\u043e \u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435.", - "pad.modals.deleted": "\u0418\u0437\u0431\u0440\u0438\u0448\u0430\u043d\u043e.", - "pad.modals.deleted.explanation": "\u041e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430 \u0435 \u043e\u0442\u0441\u0442\u0440\u0430\u043d\u0435\u0442\u0430.", - "pad.modals.disconnected": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430.", - "pad.modals.disconnected.explanation": "\u0412\u0440\u0441\u043a\u0430\u0442\u0430 \u0441\u043e \u043e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430", - "pad.modals.disconnected.cause": "\u041e\u043f\u0441\u043b\u0443\u0436\u0443\u0432\u0430\u0447\u043e\u0442 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u0435\u043d. \u0418\u0437\u0432\u0435\u0441\u0442\u0435\u0442\u0435 \u043d\u00e8 \u0430\u043a\u043e \u043e\u0432\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438 \u0434\u0430 \u0432\u0438 \u0441\u0435 \u0441\u043b\u0443\u0447\u0443\u0432\u0430.", - "pad.share": "\u0421\u043f\u043e\u0434\u0435\u043b\u0438 \u0458\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0432\u0430", - "pad.share.readonly": "\u0421\u0430\u043c\u043e \u0447\u0438\u0442\u0430\u045a\u0435", - "pad.share.link": "\u0412\u0440\u0441\u043a\u0430", - "pad.share.emebdcode": "\u0412\u043c\u0435\u0442\u043d\u0438 URL", - "pad.chat": "\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440", - "pad.chat.title": "\u041e\u0442\u0432\u043e\u0440\u0438 \u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0442 \u0437\u0430 \u043e\u0432\u0430\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430.", - "pad.chat.loadmessages": "\u0412\u0447\u0438\u0442\u0430\u0458 \u0443\u0448\u0442\u0435 \u043f\u043e\u0440\u0430\u043a\u0438", - "timeslider.pageTitle": "{{appTitle}} \u0418\u0441\u0442\u043e\u0440\u0438\u0441\u043a\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434", - "timeslider.toolbar.returnbutton": "\u041d\u0430\u0437\u0430\u0434 \u043d\u0430 \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430", - "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u0438:", - "timeslider.toolbar.authorsList": "\u041d\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u0440\u0438", - "timeslider.toolbar.exportlink.title": "\u0418\u0437\u0432\u043e\u0437", - "timeslider.exportCurrent": "\u0418\u0437\u0432\u0435\u0437\u0438 \u0458\u0430 \u0442\u0435\u043a\u043e\u0432\u043d\u0430\u0442\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 \u043a\u0430\u043a\u043e:", - "timeslider.version": "\u0412\u0435\u0440\u0437\u0438\u0458\u0430 {{version}}", - "timeslider.saved": "\u0417\u0430\u0447\u0443\u0432\u0430\u043d\u043e \u043d\u0430 {{day}} {{month}} {{year}} \u0433.", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0458\u0430\u043d\u0443\u0430\u0440\u0438", - "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", - "timeslider.month.march": "\u043c\u0430\u0440\u0442", - "timeslider.month.april": "\u0430\u043f\u0440\u0438\u043b", - "timeslider.month.may": "\u043c\u0430\u0458", - "timeslider.month.june": "\u0458\u0443\u043d\u0438", - "timeslider.month.july": "\u0458\u0443\u043b\u0438", - "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", - "timeslider.month.september": "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438", - "timeslider.month.october": "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438", - "timeslider.month.november": "\u043d\u043e\u0435\u043c\u0432\u0440\u0438", - "timeslider.month.december": "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438", - "timeslider.unnamedauthor": "{{num}} \u043d\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u043d \u0430\u0432\u0442\u043e\u0440", - "timeslider.unnamedauthors": "{{num}} \u043d\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u0438 \u0430\u0432\u0442\u043e\u0440\u0438", - "pad.savedrevs.marked": "\u041e\u0432\u0430\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u0458\u0430 \u0441\u0435\u0433\u0430 \u0435 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043a\u0430\u043a\u043e \u0437\u0430\u0447\u0443\u0432\u0430\u043d\u0430", - "pad.userlist.entername": "\u0412\u043d\u0435\u0441\u0435\u0442\u0435 \u0433\u043e \u0432\u0430\u0448\u0435\u0442\u043e \u0438\u043c\u0435", - "pad.userlist.unnamed": "\u0431\u0435\u0437 \u0438\u043c\u0435", - "pad.userlist.guest": "\u0413\u043e\u0441\u0442\u0438\u043d", - "pad.userlist.deny": "\u041e\u0434\u0431\u0438\u0458", - "pad.userlist.approve": "\u041e\u0434\u043e\u0431\u0440\u0438", - "pad.editbar.clearcolors": "\u0414\u0430 \u0433\u0438 \u043e\u0442\u0441\u0442\u0440\u0430\u043d\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0442\u0435 \u0431\u043e\u0438 \u043e\u0434 \u0446\u0435\u043b\u0438\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442?", - "pad.impexp.importbutton": "\u0423\u0432\u0435\u0437\u0438 \u0441\u0435\u0433\u0430", - "pad.impexp.importing": "\u0423\u0432\u0435\u0437\u0443\u0432\u0430\u043c...", - "pad.impexp.confirmimport": "\u0423\u0432\u0435\u0437\u0443\u0432\u0430\u0458\u045c\u0438 \u0458\u0430 \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430\u0442\u0430 \u045c\u0435 \u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0446\u0435\u043b\u0438\u043e\u0442 \u0434\u043e\u0441\u0435\u0433\u0430\u0448\u0435\u043d \u0442\u0435\u043a\u0441\u0442 \u0432\u043e \u0442\u0435\u0442\u0440\u0430\u0442\u043a\u0430\u0442\u0430. \u0414\u0430\u043b\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0435\u043a\u0430 \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435?", - "pad.impexp.convertFailed": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0432 \u0434\u0430 \u0458\u0430 \u0443\u0432\u0435\u0437\u0430\u043c \u043f\u043e\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430\u0442\u0430. \u041f\u043e\u0441\u043b\u0443\u0436\u0435\u0442\u0435 \u0441\u0435 \u0441\u043e \u043f\u043e\u0438\u043d\u0430\u043a\u043e\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u043b\u0438 \u043f\u0440\u0435\u043a\u043e\u043f\u0438\u0440\u0430\u0458\u0442\u0435 \u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0442 \u0440\u0430\u0447\u043d\u043e.", - "pad.impexp.uploadFailed": "\u041f\u043e\u0434\u0438\u0433\u0430\u045a\u0435\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u0430. \u041e\u0431\u0438\u0434\u0435\u0442\u0435 \u0441\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.", - "pad.impexp.importfailed": "\u0423\u0432\u043e\u0437\u043e\u0442 \u043d\u0435 \u0443\u0441\u043f\u0435\u0430", - "pad.impexp.copypaste": "\u041f\u0440\u0435\u043a\u043e\u043f\u0438\u0440\u0430\u0458\u0442\u0435", - "pad.impexp.exportdisabled": "\u0418\u0437\u0432\u043e\u0437\u043e\u0442 \u0432\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0442 {{type}} \u0435 \u043e\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u0410\u043a\u043e \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u0434\u043e\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u045c\u0435 \u0437\u0430 \u043e\u0432\u0430, \u043e\u0431\u0440\u0430\u0442\u0435\u0442\u0435 \u0441\u0435 \u043a\u0430\u0458 \u0441\u0438\u0441\u0442\u0435\u043c\u0441\u043a\u0438\u043e\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440." -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "Можете да увезувате Ñамо од проÑÑ‚ текÑÑ‚ и HTML-формат. Понапредни можноÑти за увоз ќе добиете ако <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">воÑпоÑтавите AbiWord</a>.", + "pad.modals.connected": "Поврзано.", + "pad.modals.reconnecting": "Ве преповрзувам Ñо тетратката...", + "pad.modals.forcereconnect": "Ðаметни преповрзување", + "pad.modals.userdup": "Отворено во друг прозорец", + "pad.modals.userdup.explanation": "Оваа тетратка е отворена на повеќе од еден прозорец (во прелиÑтувач) на Ñметачот.", + "pad.modals.userdup.advice": "Преповрзете Ñе за да го кориÑтите овој прозорец.", + "pad.modals.unauth": "ÐеовлаÑтено", + "pad.modals.unauth.explanation": "Вашите дозволи Ñе имаат изменето додека ја гледавте Ñтраницава. Обидете Ñе да Ñе преповрзете.", + "pad.modals.looping.explanation": "Се јавија проблеми Ñо врÑката Ñо уÑоглаÑителниот опÑлужувач.", + "pad.modals.looping.cause": "Можеби Ñте поврзани преку неÑкладен огнен ѕид или заÑтапник.", + "pad.modals.initsocketfail": "ОпÑлужувачот е недоÑтапен.", + "pad.modals.initsocketfail.explanation": "Ðе можев да Ñе поврзам Ñо уÑоглаÑителниот опÑлужувач.", + "pad.modals.initsocketfail.cause": "Ова веројатно Ñе должи на проблем Ñо вашиот прелиÑтувач или Ñемрежната врÑка.", + "pad.modals.slowcommit.explanation": "ОпÑлужувачот не Ñе одѕива.", + "pad.modals.slowcommit.cause": "Ова може да Ñе должи на проблеми Ñо мрежното поврзување.", + "pad.modals.badChangeset.explanation": "ОпÑлужувачот за уÑоглаÑување го Ñмета уредувањето што го направивте за недопуштено.", + "pad.modals.badChangeset.cause": "Ова може да Ñе должи на погрешна поÑтавеноÑÑ‚ на опÑлужувачот или некое друго неочекувано поведение. Обратете Ñе кај админиÑтраторот доколку Ñметате дека ова е грешка. Обидете Ñе да Ñе превклучите за да продолжите Ñо уредување.", + "pad.modals.corruptPad.explanation": "Тетратката што Ñакате да ја отворите е раÑипана.", + "pad.modals.corruptPad.cause": "Ова може да Ñе должи на погрешна поÑтавеноÑÑ‚ на опÑлужувачот или некое друго неочекувано поведение. Обратете Ñе кај админиÑтраторот.", + "pad.modals.deleted": "Избришано.", + "pad.modals.deleted.explanation": "Оваа тетратка е отÑтранета.", + "pad.modals.disconnected": "Ð’Ñ€Ñката е прекината.", + "pad.modals.disconnected.explanation": "Ð’Ñ€Ñката Ñо опÑлужувачот е прекината", + "pad.modals.disconnected.cause": "ОпÑлужувачот може да е недоÑтапен. ИзвеÑтете го админиÑтраторот ако ова продолжи да ви Ñе Ñлучува.", + "pad.share": "Сподели ја тетраткава", + "pad.share.readonly": "Само читање", + "pad.share.link": "Ð’Ñ€Ñка", + "pad.share.emebdcode": "Вметни URL", + "pad.chat": "Разговор", + "pad.chat.title": "Отвори го разговорот за оваа тетратка.", + "pad.chat.loadmessages": "Вчитај уште пораки", + "timeslider.pageTitle": "{{appTitle}} ИÑториÑки преглед", + "timeslider.toolbar.returnbutton": "Ðазад на тетратката", + "timeslider.toolbar.authors": "Ðвтори:", + "timeslider.toolbar.authorsList": "Ðема автори", + "timeslider.toolbar.exportlink.title": "Извоз", + "timeslider.exportCurrent": "Извези ја тековната верзија како:", + "timeslider.version": "Верзија {{version}}", + "timeslider.saved": "Зачувано на {{day}} {{month}} {{year}} г.", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "јануари", + "timeslider.month.february": "февруари", + "timeslider.month.march": "март", + "timeslider.month.april": "април", + "timeslider.month.may": "мај", + "timeslider.month.june": "јуни", + "timeslider.month.july": "јули", + "timeslider.month.august": "авгуÑÑ‚", + "timeslider.month.september": "Ñептември", + "timeslider.month.october": "октомври", + "timeslider.month.november": "ноември", + "timeslider.month.december": "декември", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: неименуван автор, other: неименувани автори ]}", + "pad.savedrevs.marked": "Оваа преработка Ñега е означена како зачувана", + "pad.userlist.entername": "ВнеÑете го вашето име", + "pad.userlist.unnamed": "без име", + "pad.userlist.guest": "ГоÑтин", + "pad.userlist.deny": "Одбиј", + "pad.userlist.approve": "Одобри", + "pad.editbar.clearcolors": "Да ги отÑтранам авторÑките бои од целиот документ?", + "pad.impexp.importbutton": "Увези Ñега", + "pad.impexp.importing": "Увезувам...", + "pad.impexp.confirmimport": "Увезувајќи ја податотеката ќе го замените целиот доÑегашен текÑÑ‚ во тетратката. Дали Ñте Ñигурни дека Ñакате да продолжите?", + "pad.impexp.convertFailed": "Ðе можев да ја увезам податотеката. ПоÑлужете Ñе Ñо поинаков формат или прекопирајте го текÑтот рачно.", + "pad.impexp.uploadFailed": "Подигањето не уÑпеа. Обидете Ñе повторно.", + "pad.impexp.importfailed": "Увозот не уÑпеа", + "pad.impexp.copypaste": "Прекопирајте", + "pad.impexp.exportdisabled": "Извозот во форматот {{type}} е оневозможен. Ðко Ñакате да дознаете повеќе за ова, обратете Ñе кај ÑиÑтемÑкиот админиÑтратор." +} diff --git a/src/locales/ml.json b/src/locales/ml.json index e8250434..ff7a38f3 100644 --- a/src/locales/ml.json +++ b/src/locales/ml.json @@ -1,119 +1,126 @@ { "@metadata": { "authors": [ + "Akhilan", + "Clockery", "Hrishikesh.kb", "Praveenp", "Santhosh.thottingal" ] }, - "index.newPad": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d3e\u0d21\u0d4d", - "index.createOpenPad": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d2a\u0d47\u0d30\u0d41\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d2a\u0d3e\u0d21\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15\/\u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15:", - "pad.toolbar.bold.title": "\u0d15\u0d1f\u0d4d\u0d1f\u0d3f\u0d15\u0d42\u0d1f\u0d4d\u0d1f\u0d3f\u0d2f\u0d46\u0d34\u0d41\u0d24\u0d41\u0d15 (Ctrl-B)", - "pad.toolbar.italic.title": "\u0d1a\u0d46\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d46\u0d34\u0d41\u0d24\u0d41\u0d15 (Ctrl-I)", - "pad.toolbar.underline.title": "\u0d05\u0d1f\u0d3f\u0d35\u0d30\u0d2f\u0d3f\u0d1f\u0d41\u0d15 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0d35\u0d46\u0d1f\u0d4d\u0d1f\u0d41\u0d15", - "pad.toolbar.ol.title": "\u0d15\u0d4d\u0d30\u0d2e\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d2a\u0d1f\u0d4d\u0d1f\u0d3f\u0d15", - "pad.toolbar.ul.title": "\u0d15\u0d4d\u0d30\u0d2e\u0d30\u0d39\u0d3f\u0d24 \u0d2a\u0d1f\u0d4d\u0d1f\u0d3f\u0d15", - "pad.toolbar.indent.title": "\u0d35\u0d32\u0d24\u0d4d\u0d24\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d33\u0d4d\u0d33\u0d41\u0d15", - "pad.toolbar.unindent.title": "\u0d07\u0d1f\u0d24\u0d4d\u0d24\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d33\u0d4d\u0d33\u0d41\u0d15", - "pad.toolbar.undo.title": "\u0d24\u0d3f\u0d30\u0d38\u0d4d\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d02 \u0d15\u0d33\u0d2f\u0d41\u0d15", - "pad.toolbar.import_export.title": "\u0d35\u0d4d\u0d2f\u0d24\u0d4d\u0d2f\u0d38\u0d4d\u0d24 \u0d2b\u0d2f\u0d7d \u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d\/\u0d24\u0d30\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f\/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.toolbar.timeslider.title": "\u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", - "pad.toolbar.savedRevision.title": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d41\u0d15\u0d7e", - "pad.toolbar.settings.title": "\u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", - "pad.toolbar.embed.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.toolbar.showusers.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d09\u0d2a\u0d2f\u0d4b\u0d15\u0d4d\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d2a\u0d4d\u0d30\u0d26\u0d7c\u0d36\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.colorpicker.save": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.colorpicker.cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.loading": "\u0d36\u0d47\u0d16\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", - "pad.passwordRequired": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d3f\u0d28\u0d3e\u0d2f\u0d3f \u0d12\u0d30\u0d41 \u0d30\u0d39\u0d38\u0d4d\u0d2f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d28\u0d7d\u0d15\u0d47\u0d23\u0d4d\u0d1f\u0d24\u0d3e\u0d23\u0d4d", - "pad.permissionDenied": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d15\u0d3e\u0d23\u0d41\u0d35\u0d3e\u0d7b \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d28\u0d41\u0d2e\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", - "pad.wrongPassword": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d28\u0d32\u0d4d\u0d15\u0d3f\u0d2f \u0d30\u0d39\u0d38\u0d4d\u0d2f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d46\u0d31\u0d4d\u0d31\u0d3e\u0d2f\u0d3f\u0d30\u0d41\u0d28\u0d4d\u0d28\u0d41", - "pad.settings.padSettings": "\u0d2a\u0d3e\u0d21\u0d4d \u0d38\u0d1c\u0d4d\u0d1c\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", - "pad.settings.myView": "\u0d0e\u0d28\u0d4d\u0d31\u0d46 \u0d15\u0d3e\u0d34\u0d4d\u0d1a", - "pad.settings.stickychat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d02 \u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d0e\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d41\u0d02 \u0d38\u0d4d\u0d15\u0d4d\u0d30\u0d40\u0d28\u0d3f\u0d7d \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.settings.colorcheck": "\u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d3e\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e", - "pad.settings.linenocheck": "\u0d35\u0d30\u0d3f\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d15\u0d4d\u0d30\u0d2e\u0d38\u0d02\u0d16\u0d4d\u0d2f", - "pad.settings.fontType": "\u0d2b\u0d4b\u0d23\u0d4d\u0d1f\u0d4d \u0d24\u0d30\u0d02:", - "pad.settings.fontType.normal": "\u0d38\u0d3e\u0d27\u0d3e\u0d30\u0d23\u0d02", - "pad.settings.fontType.monospaced": "\u0d2e\u0d4b\u0d23\u0d4b\u0d38\u0d4d\u0d2a\u0d47\u0d38\u0d4d", - "pad.settings.globalView": "\u0d2e\u0d4a\u0d24\u0d4d\u0d24\u0d15\u0d4d\u0d15\u0d3e\u0d34\u0d4d\u0d1a", - "pad.settings.language": "\u0d2d\u0d3e\u0d37:", - "pad.importExport.import_export": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f\/\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.importExport.import": "\u0d0e\u0d28\u0d4d\u0d24\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d32\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d2e\u0d4b \u0d30\u0d47\u0d16\u0d2f\u0d4b \u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.importExport.importSuccessful": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d02!", - "pad.importExport.export": "\u0d07\u0d2a\u0d4d\u0d2a\u0d4b\u0d34\u0d24\u0d4d\u0d24\u0d46 \u0d2a\u0d3e\u0d21\u0d4d \u0d07\u0d19\u0d4d\u0d19\u0d28\u0d46 \u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15:", - "pad.importExport.exporthtml": "\u0d0e\u0d1a\u0d4d\u0d1a\u0d4d.\u0d31\u0d4d\u0d31\u0d3f.\u0d0e\u0d02.\u0d0e\u0d7d.", - "pad.importExport.exportplain": "\u0d35\u0d46\u0d31\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d4d", - "pad.importExport.exportword": "\u0d2e\u0d48\u0d15\u0d4d\u0d30\u0d4b\u0d38\u0d4b\u0d2b\u0d4d\u0d31\u0d4d\u0d31\u0d4d \u0d35\u0d47\u0d21\u0d4d", - "pad.importExport.exportpdf": "\u0d2a\u0d3f.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d.", - "pad.importExport.exportopen": "\u0d12.\u0d21\u0d3f.\u0d0e\u0d2b\u0d4d. (\u0d13\u0d2a\u0d4d\u0d2a\u0d7a \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d)", - "pad.importExport.exportdokuwiki": "\u0d21\u0d4b\u0d15\u0d41\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d3f", - "pad.modals.connected": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", - "pad.modals.reconnecting": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d4d \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41...", - "pad.modals.forcereconnect": "\u0d0e\u0d28\u0d4d\u0d24\u0d3e\u0d2f\u0d3e\u0d32\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.modals.userdup": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d1c\u0d3e\u0d32\u0d15\u0d24\u0d4d\u0d24\u0d3f\u0d7d \u0d24\u0d41\u0d31\u0d28\u0d4d\u0d28\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", - "pad.modals.userdup.explanation": "\u0d08 \u0d15\u0d2e\u0d4d\u0d2a\u0d4d\u0d2f\u0d42\u0d1f\u0d4d\u0d1f\u0d31\u0d3f\u0d7d \u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d12\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d27\u0d3f\u0d15\u0d02 \u0d2c\u0d4d\u0d30\u0d57\u0d38\u0d7c \u0d1c\u0d3e\u0d32\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d3f\u0d7d \u0d24\u0d41\u0d31\u0d28\u0d4d\u0d28\u0d24\u0d3e\u0d2f\u0d3f \u0d15\u0d3e\u0d23\u0d41\u0d28\u0d4d\u0d28\u0d41.", - "pad.modals.userdup.advice": "\u0d08 \u0d1c\u0d3e\u0d32\u0d15\u0d02 \u0d24\u0d28\u0d4d\u0d28\u0d46 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d28\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.modals.unauth": "\u0d05\u0d28\u0d41\u0d35\u0d3e\u0d26\u0d2e\u0d3f\u0d32\u0d4d\u0d32", - "pad.modals.unauth.explanation": "\u0d08 \u0d24\u0d3e\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d41\u0d15\u0d4a\u0d23\u0d4d\u0d1f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d46 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d41\u0d33\u0d4d\u0d33 \u0d05\u0d28\u0d41\u0d2e\u0d24\u0d3f\u0d15\u0d33\u0d3f\u0d7d \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d3e\u0d2f\u0d3f. \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15.", - "pad.modals.looping": "\u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41.", - "pad.modals.looping.explanation": "\u0d38\u0d3f\u0d02\u0d15\u0d4d\u0d30\u0d23\u0d48\u0d38\u0d47\u0d37\u0d7b \u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d41\u0d33\u0d4d\u0d33 \u0d06\u0d36\u0d2f\u0d35\u0d3f\u0d28\u0d3f\u0d2e\u0d2f\u0d24\u0d4d\u0d24\u0d3f\u0d7d \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d23\u0d4d\u0d1f\u0d4d.", - "pad.modals.looping.cause": "\u0d12\u0d30\u0d41\u0d2a\u0d15\u0d4d\u0d37\u0d47 \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d24\u0d4d\u0d24 \u0d2b\u0d2f\u0d7c\u0d35\u0d3e\u0d33\u0d3f\u0d32\u0d42\u0d1f\u0d46\u0d2f\u0d4b \u0d2a\u0d4d\u0d30\u0d4b\u0d15\u0d4d\u0d38\u0d3f\u0d2f\u0d3f\u0d32\u0d42\u0d1f\u0d46\u0d2f\u0d4b \u0d06\u0d15\u0d3e\u0d02 \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d30\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d.", - "pad.modals.initsocketfail": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d3f\u0d32\u0d46\u0d24\u0d4d\u0d24\u0d3e\u0d7b \u0d2a\u0d31\u0d4d\u0d31\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32.", - "pad.modals.initsocketfail.explanation": "\u0d38\u0d3f\u0d02\u0d15\u0d4d\u0d30\u0d23\u0d48\u0d38\u0d47\u0d37\u0d7b \u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32.", - "pad.modals.initsocketfail.cause": "\u0d07\u0d28\u0d4d\u0d31\u0d7c\u0d28\u0d46\u0d31\u0d4d\u0d31\u0d4d \u0d15\u0d23\u0d15\u0d4d\u0d37\u0d28\u0d4d\u0d31\u0d46\u0d2f\u0d4b \u0d2c\u0d4d\u0d30\u0d57\u0d38\u0d31\u0d3f\u0d28\u0d4d\u0d31\u0d46\u0d2f\u0d4b \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d2e\u0d3e\u0d15\u0d3e\u0d02", - "pad.modals.slowcommit": "\u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41.", - "pad.modals.slowcommit.explanation": "\u0d38\u0d46\u0d7c\u0d35\u0d7c \u0d2a\u0d4d\u0d30\u0d24\u0d3f\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32.", - "pad.modals.slowcommit.cause": "\u0d28\u0d46\u0d31\u0d4d\u0d31\u0d4d\u200c\u0d35\u0d7c\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d4d\u0d30\u0d36\u0d4d\u0d28\u0d02 \u0d15\u0d3e\u0d30\u0d23\u0d2e\u0d3e\u0d15\u0d3e\u0d02.", - "pad.modals.deleted": "\u0d2e\u0d3e\u0d2f\u0d4d\u0d1a\u0d4d\u0d1a\u0d41", - "pad.modals.deleted.explanation": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41.", - "pad.modals.disconnected": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d7e \u0d35\u0d47\u0d7c\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41.", - "pad.modals.disconnected.explanation": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d41\u0d33\u0d4d\u0d33 \u0d2c\u0d28\u0d4d\u0d27\u0d02 \u0d28\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", - "pad.modals.disconnected.cause": "\u0d38\u0d46\u0d7c\u0d35\u0d7c \u0d32\u0d2d\u0d4d\u0d2f\u0d2e\u0d32\u0d4d\u0d32\u0d3e\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d02. \u0d07\u0d24\u0d4d \u0d24\u0d41\u0d1f\u0d7c\u0d1a\u0d4d\u0d1a\u0d2f\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41\u0d23\u0d4d\u0d1f\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d1e\u0d19\u0d4d\u0d19\u0d33\u0d46 \u0d05\u0d31\u0d3f\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15.", - "pad.share": "\u0d08 \u0d2a\u0d3e\u0d21\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15", - "pad.share.readonly": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2e\u0d3e\u0d24\u0d4d\u0d30\u0d02", - "pad.share.link": "\u0d15\u0d23\u0d4d\u0d23\u0d3f", - "pad.share.emebdcode": "\u0d0e\u0d02\u0d2c\u0d46\u0d21\u0d4d \u0d2f\u0d41.\u0d06\u0d7c.\u0d0e\u0d7d.", - "pad.chat": "\u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02", - "pad.chat.title": "\u0d08 \u0d2a\u0d3e\u0d21\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d24\u0d24\u0d4d\u0d38\u0d2e\u0d2f\u0d38\u0d02\u0d35\u0d3e\u0d26\u0d02 \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15.", - "pad.chat.loadmessages": "\u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d7e \u0d0e\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15", - "timeslider.pageTitle": "{{appTitle}} \u0d38\u0d2e\u0d2f\u0d30\u0d47\u0d16", - "timeslider.toolbar.returnbutton": "\u0d2a\u0d3e\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d3f\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d41\u0d2a\u0d4b\u0d35\u0d41\u0d15", - "timeslider.toolbar.authors": "\u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d7e:", - "timeslider.toolbar.authorsList": "\u0d06\u0d30\u0d41\u0d02 \u0d0e\u0d34\u0d41\u0d24\u0d3f\u0d2f\u0d3f\u0d1f\u0d4d\u0d1f\u0d3f\u0d32\u0d4d\u0d32", - "timeslider.toolbar.exportlink.title": "\u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f", - "timeslider.exportCurrent": "\u0d08 \u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d07\u0d19\u0d4d\u0d19\u0d28\u0d46 \u0d0e\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15:", - "timeslider.version": "\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d {{version}}", - "timeslider.saved": "\u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d24\u0d4d {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f", - "timeslider.month.february": "\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f", - "timeslider.month.march": "\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d", - "timeslider.month.april": "\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d", - "timeslider.month.may": "\u0d2e\u0d47\u0d2f\u0d4d", - "timeslider.month.june": "\u0d1c\u0d42\u0d7a", - "timeslider.month.july": "\u0d1c\u0d42\u0d32\u0d48", - "timeslider.month.august": "\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d", - "timeslider.month.september": "\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c", - "timeslider.month.october": "\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c", - "timeslider.month.november": "\u0d28\u0d35\u0d02\u0d2c\u0d7c", - "timeslider.month.december": "\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c", - "pad.savedrevs.marked": "\u0d08 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d \u0d38\u0d47\u0d35\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3e\u0d7e\u0d2a\u0d4d\u0d2a\u0d24\u0d3f\u0d2a\u0d4d\u0d2a\u0d3e\u0d2f\u0d3f \u0d05\u0d1f\u0d2f\u0d3e\u0d33\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", - "pad.userlist.entername": "\u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", - "pad.userlist.unnamed": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24", - "pad.userlist.guest": "\u0d05\u0d24\u0d3f\u0d25\u0d3f", - "pad.userlist.deny": "\u0d28\u0d3f\u0d30\u0d38\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.userlist.approve": "\u0d05\u0d02\u0d17\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.editbar.clearcolors": "\u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d3f\u0d7d \u0d30\u0d1a\u0d2f\u0d3f\u0d24\u0d3e\u0d15\u0d4d\u0d15\u0d33\u0d46 \u0d38\u0d42\u0d1a\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d28\u0d3e\u0d2f\u0d3f \u0d28\u0d7d\u0d15\u0d3f\u0d2f\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d33\u0d4d\u0d33 \u0d28\u0d3f\u0d31\u0d19\u0d4d\u0d19\u0d7e \u0d12\u0d34\u0d3f\u0d35\u0d3e\u0d15\u0d4d\u0d15\u0d1f\u0d4d\u0d1f\u0d46?", - "pad.impexp.importbutton": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.impexp.importing": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...", - "pad.impexp.confirmimport": "\u0d12\u0d30\u0d41 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d02 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d41\u0d33\u0d4d\u0d33 \u0d0e\u0d34\u0d41\u0d24\u0d4d\u0d24\u0d41\u0d15\u0d7e \u0d28\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d28\u0d3f\u0d1f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d02, \u0d24\u0d41\u0d1f\u0d30\u0d23\u0d2e\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d09\u0d31\u0d2a\u0d4d\u0d2a\u0d3e\u0d23\u0d4b?", - "pad.impexp.convertFailed": "\u0d08 \u0d2a\u0d4d\u0d30\u0d2e\u0d3e\u0d23\u0d02 \u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d38\u0d3e\u0d27\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d32\u0d4d\u0d32. \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d21\u0d4b\u0d15\u0d4d\u0d2f\u0d41\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15\u0d2f\u0d4b, \u0d38\u0d4d\u0d35\u0d28\u0d4d\u0d24\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15\u0d2f\u0d4b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", - "pad.impexp.uploadFailed": "\u0d05\u0d2a\u0d4d\u200c\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d35\u0d40\u0d23\u0d4d\u0d1f\u0d41\u0d02 \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.impexp.importfailed": "\u0d07\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d2e\u0d24\u0d3f \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", - "pad.impexp.copypaste": "\u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15", - "pad.impexp.exportdisabled": "{{type}} \u0d2b\u0d4b\u0d7c\u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d3f\u0d7d \u0d15\u0d2f\u0d31\u0d4d\u0d31\u0d41\u0d2e\u0d24\u0d3f \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d24\u0d1f\u0d1e\u0d4d\u0d1e\u0d3f\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41. \u0d15\u0d42\u0d1f\u0d41\u0d24\u0d7d \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d3e\u0d19\u0d4d\u0d15\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d02 \u0d05\u0d21\u0d4d\u0d2e\u0d3f\u0d28\u0d3f\u0d38\u0d4d\u0d1f\u0d4d\u0d30\u0d47\u0d31\u0d4d\u0d31\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d15." -}
\ No newline at end of file + "index.newPad": "à´ªàµà´¤à´¿à´¯ പാഡàµ", + "index.createOpenPad": "à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ പേരàµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ പാഡൠസൃഷàµà´Ÿà´¿à´•àµà´•àµà´•/à´¤àµà´±à´•àµà´•àµà´•:", + "pad.toolbar.bold.title": "à´•à´Ÿàµà´ªàµà´ªà´¤àµà´¤à´¿à´²àµ†à´´àµà´¤àµà´• (Ctrl-B)", + "pad.toolbar.italic.title": "ചെരിചàµà´šàµ†à´´àµà´¤àµà´• (Ctrl-I)", + "pad.toolbar.underline.title": "അടിവരയിടàµà´• (Ctrl-U)", + "pad.toolbar.strikethrough.title": "വെടàµà´Ÿàµà´•", + "pad.toolbar.ol.title": "à´•àµà´°à´®à´¤àµà´¤à´¿à´²àµà´³àµà´³ പടàµà´Ÿà´¿à´•", + "pad.toolbar.ul.title": "à´•àµà´°à´®à´°à´¹à´¿à´¤ പടàµà´Ÿà´¿à´•", + "pad.toolbar.indent.title": "വലതàµà´¤àµ‡à´•àµà´•àµ തളàµà´³àµà´• (ടാബàµ)", + "pad.toolbar.unindent.title": "ഇടതàµà´¤àµ‡à´•àµà´•àµ തളàµà´³àµà´• (à´·à´¿à´«àµà´±àµà´±àµ+ടാബàµ)", + "pad.toolbar.undo.title": "തിരസàµà´•à´°à´¿à´•àµà´•àµà´• (Ctrl-Z)", + "pad.toolbar.redo.title": "വീണàµà´Ÿàµà´‚ ചെയàµà´¯àµà´• (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "രചയിതാകàµà´•àµ¾à´•àµà´•àµà´³àµà´³ നിറം കളയàµà´•", + "pad.toolbar.import_export.title": "à´µàµà´¯à´¤àµà´¯à´¸àµà´¤ ഫയൽ തരങàµà´™à´³à´¿à´²àµ‡à´•àµà´•àµ/തരങàµà´™à´³à´¿àµ½ നിനàµà´¨àµ ഇറകàµà´•àµà´®à´¤à´¿/കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•", + "pad.toolbar.timeslider.title": "സമയരേഖ", + "pad.toolbar.savedRevision.title": "നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ സേവൠചെയàµà´¯àµà´•", + "pad.toolbar.settings.title": "സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾", + "pad.toolbar.embed.title": "à´ˆ പാഡൠപങàµà´•àµ വെയàµà´•àµà´•àµà´•, എംബെഡൠചെയàµà´¯àµà´•", + "pad.toolbar.showusers.title": "à´ˆ പാഡിലàµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµ† à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•", + "pad.colorpicker.save": "സേവൠചെയàµà´¯àµà´•", + "pad.colorpicker.cancel": "റദàµà´¦à´¾à´•àµà´•àµà´•", + "pad.loading": "ശേഖരികàµà´•àµà´¨àµà´¨àµ...", + "pad.passwordRequired": "à´ˆ പാഡൠഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¿à´¨à´¾à´¯à´¿ ഒരൠരഹസàµà´¯à´µà´¾à´•àµà´•àµ നൽകേണàµà´Ÿà´¤à´¾à´£àµ", + "pad.permissionDenied": "à´ˆ പാഡൠകാണàµà´µà´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ à´…à´¨àµà´®à´¤à´¿à´¯à´¿à´²àµà´²", + "pad.wrongPassword": "താങàµà´•àµ¾ നലàµà´•à´¿à´¯ രഹസàµà´¯à´µà´¾à´•àµà´•àµ തെറàµà´±à´¾à´¯à´¿à´°àµà´¨àµà´¨àµ", + "pad.settings.padSettings": "പാഡൠസജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾", + "pad.settings.myView": "à´Žà´¨àµà´±àµ† കാഴàµà´š", + "pad.settings.stickychat": "തതàµà´¸à´®à´¯à´¸à´‚വാദം à´Žà´ªàµà´ªàµ‹à´´àµà´‚ à´¸àµà´•àµà´°àµ€à´¨à´¿àµ½ കാണികàµà´•àµà´•", + "pad.settings.colorcheck": "à´Žà´´àµà´¤àµà´¤àµà´•à´¾àµ¼à´•àµà´•àµà´³àµà´³ നിറങàµà´™àµ¾", + "pad.settings.linenocheck": "വരികളàµà´Ÿàµ† à´•àµà´°à´®à´¸à´‚à´–àµà´¯", + "pad.settings.rtlcheck": "ഉളàµà´³à´Ÿà´•àµà´•à´‚ വലതàµà´¤àµà´¨à´¿à´¨àµà´¨àµ ഇടതàµà´¤àµ‹à´Ÿàµà´Ÿà´¾à´£àµ‹ വായികàµà´•àµ‡à´£àµà´Ÿà´¤àµ?", + "pad.settings.fontType": "ഫോണàµà´Ÿàµ തരം:", + "pad.settings.fontType.normal": "സാധാരണം", + "pad.settings.fontType.monospaced": "മോണോസàµà´ªàµ‡à´¸àµ", + "pad.settings.globalView": "മൊതàµà´¤à´•àµà´•à´¾à´´àµà´š", + "pad.settings.language": "à´à´¾à´·:", + "pad.importExport.import_export": "ഇറകàµà´•àµà´®à´¤à´¿/കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•", + "pad.importExport.import": "à´Žà´¨àµà´¤àµ†à´™àµà´•à´¿à´²àµà´‚ à´Žà´´àµà´¤àµà´¤àµ à´ªàµà´°à´®à´¾à´£à´®àµ‹ രേഖയോ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•", + "pad.importExport.importSuccessful": "വിജയകരം!", + "pad.importExport.export": "ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† പാഡൠഇങàµà´™à´¨àµ† കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•:", + "pad.importExport.exporthtml": "à´Žà´šàµà´šàµ.à´±àµà´±à´¿.à´Žà´‚.എൽ.", + "pad.importExport.exportplain": "വെറàµà´‚ à´Žà´´àµà´¤àµà´¤àµ", + "pad.importExport.exportword": "മൈകàµà´°àµ‹à´¸àµ‹à´«àµà´±àµà´±àµ വേഡàµ", + "pad.importExport.exportpdf": "പി.à´¡à´¿.à´Žà´«àµ.", + "pad.importExport.exportopen": "à´’.à´¡à´¿.à´Žà´«àµ. (à´“à´ªàµà´ªàµº ഡോകàµà´¯àµà´®àµ†à´¨àµà´±àµ ഫോർമാറàµà´±àµ)", + "pad.importExport.exportdokuwiki": "ഡോകàµà´µà´¿à´•àµà´•à´¿", + "pad.importExport.abiword.innerHTML": "à´ªàµà´²àµ†à´¯à´¿àµ» ടെകàµà´¸àµà´±àµà´±àµ‹ à´Žà´šàµà´šàµ.à´±àµà´±à´¿.à´Žà´‚.എൽ. തരമോ മാതàµà´°à´®àµ‡ താങàµà´•àµ¾à´•àµà´•àµ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯à´¾à´¨à´¾à´µàµ‚. കൂടàµà´¤àµ½ വിപàµà´²àµ€à´•àµƒà´¤ ഇറകàµà´•àµà´®à´¤à´¿ സൗകരàµà´¯à´™àµà´™àµ¾à´•àµà´•à´¾à´¯à´¿ ദയവായി <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">അബിവേഡൠഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¯àµà´•</a>.", + "pad.modals.connected": "ബനàµà´§à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.", + "pad.modals.reconnecting": "താങàµà´•à´³àµà´Ÿàµ† പാഡിലേയàµà´•àµà´•àµ വീണàµà´Ÿàµà´‚ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨àµ...", + "pad.modals.forcereconnect": "à´Žà´¨àµà´¤à´¾à´¯à´¾à´²àµà´‚ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•", + "pad.modals.userdup": "മറàµà´±àµŠà´°àµ ജാലകതàµà´¤à´¿àµ½ à´¤àµà´±à´¨àµà´¨à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ", + "pad.modals.userdup.explanation": "à´ˆ à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ à´ˆ പാഡൠഒനàµà´¨à´¿à´²à´§à´¿à´•à´‚ à´¬àµà´°àµ—സർ ജാലകങàµà´™à´³à´¿àµ½ à´¤àµà´±à´¨àµà´¨à´¤à´¾à´¯à´¿ കാണàµà´¨àµà´¨àµ.", + "pad.modals.userdup.advice": "à´ˆ ജാലകം തനàµà´¨àµ† ഉപയോഗികàµà´•à´¾à´¨à´¾à´¯à´¿ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•", + "pad.modals.unauth": "à´…à´¨àµà´µà´¾à´¦à´®à´¿à´²àµà´²", + "pad.modals.unauth.explanation": "à´ˆ താൾ à´•à´£àµà´Ÿàµà´•àµŠà´£àµà´Ÿà´¿à´°à´¿à´•àµà´•àµ† താങàµà´•àµ¾à´•àµà´•àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿à´•à´³à´¿àµ½ മാറàµà´±à´®àµà´£àµà´Ÿà´¾à´¯à´¿. വീണàµà´Ÿàµà´‚ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.", + "pad.modals.looping.explanation": "സിംകàµà´°à´£àµˆà´¸àµ‡à´·àµ» സെർവറàµà´®à´¾à´¯àµà´³àµà´³ ആശയവിനിമയതàµà´¤à´¿àµ½ à´ªàµà´°à´¶àµà´¨à´™àµà´™à´³àµà´£àµà´Ÿàµ.", + "pad.modals.looping.cause": "à´’à´°àµà´ªà´•àµà´·àµ‡ പൊരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤ ഫയർവാളിലൂടെയോ à´ªàµà´°àµ‹à´•àµà´¸à´¿à´¯à´¿à´²àµ‚ടെയോ ആകാം താങàµà´•àµ¾ ബനàµà´§à´¿à´šàµà´šà´¿à´°àµà´¨àµà´¨à´¤àµ.", + "pad.modals.initsocketfail": "സെർവറിലെതàµà´¤à´¾àµ» പറàµà´±àµà´¨àµà´¨à´¿à´²àµà´².", + "pad.modals.initsocketfail.explanation": "സിംകàµà´°à´£àµˆà´¸àµ‡à´·àµ» സെർവറàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².", + "pad.modals.initsocketfail.cause": "താങàµà´•à´³àµà´Ÿàµ† ഇനàµà´±àµ¼à´¨àµ†à´±àµà´±àµ കണകàµà´·à´¨àµà´±àµ†à´¯àµ‹ à´¬àµà´°àµ—സറിനàµà´±àµ†à´¯àµ‹ à´ªàµà´°à´¶àµà´¨à´®à´¾à´•à´¾à´‚", + "pad.modals.slowcommit.explanation": "സെർവർ à´ªàµà´°à´¤à´¿à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².", + "pad.modals.slowcommit.cause": "നെറàµà´±àµâ€Œà´µàµ¼à´•àµà´•àµ à´ªàµà´°à´¶àµà´¨à´‚ കാരണമാകാം.", + "pad.modals.badChangeset.explanation": "താങàµà´•àµ¾ ചെയàµà´¤ ഒരൠതിരàµà´¤àµà´¤àµ സമീകരണ സെർവർ നയവിരàµà´¦àµà´§à´®àµ†à´¨àµà´¨àµ പെടàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.", + "pad.modals.badChangeset.cause": "ഇതàµ, തെറàµà´±à´¾à´¯ സെർവർ à´•àµà´°à´®àµ€à´•à´°à´£à´‚ മൂലമോ മറàµà´±àµ†à´¨àµà´¤àµ†à´™àµà´•à´¿à´²àµà´‚ à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤ കാരണം കൊണàµà´Ÿàµ‹ ഉണàµà´Ÿà´¾à´¯à´¤à´¾à´¯àµ‡à´•àµà´•à´¾à´‚. ഇതൠതെറàµà´±à´¾à´£àµ†à´¨àµà´¨àµ താങàµà´•àµ¾à´•àµà´•àµ തോനàµà´¨àµà´¨àµà´¨àµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ സേവന കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¯àµ†(നെ) താങàµà´•àµ¾à´•àµà´•àµ സമീപികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ. തിരàµà´¤àµà´¤àµ½ à´¤àµà´Ÿà´°à´¾àµ» വീണàµà´Ÿàµà´‚ ബദàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•.", + "pad.modals.corruptPad.explanation": "താങàµà´•àµ¾ à´Žà´Ÿàµà´•àµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨ പാഡൠകേടാണàµ.", + "pad.modals.corruptPad.cause": "ഇതàµ, തെറàµà´±à´¾à´¯ സെർവർ à´•àµà´°à´®àµ€à´•à´°à´£à´‚ മൂലമോ മറàµà´±àµ†à´¨àµà´¤àµ†à´™àµà´•à´¿à´²àµà´‚ à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤ കാരണം കൊണàµà´Ÿàµ‹ ഉണàµà´Ÿà´¾à´¯à´¤à´¾à´¯àµ‡à´•àµà´•à´¾à´‚. ദയവായി സേവന കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¯àµ†(നെ) സമീപികàµà´•àµà´•.", + "pad.modals.deleted": "മായàµà´šàµà´šàµ", + "pad.modals.deleted.explanation": "à´ˆ പാഡൠനീകàµà´•à´‚ ചെയàµà´¤àµ.", + "pad.modals.disconnected": "താങàµà´•àµ¾ വേർപെടàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.", + "pad.modals.disconnected.explanation": "സെർവറàµà´®à´¾à´¯àµà´³àµà´³ ബനàµà´§à´‚ നഷàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ", + "pad.modals.disconnected.cause": "സെർവർ à´²à´àµà´¯à´®à´²àµà´²à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚. ഇതൠതàµà´Ÿàµ¼à´šàµà´šà´¯à´¾à´¯à´¿ സംà´à´µà´¿à´•àµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ ദയവായി സേവന കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´¯àµ†(നെ) അറിയികàµà´•àµà´•.", + "pad.share": "à´ˆ പാഡൠപങàµà´•à´¿à´Ÿàµà´•", + "pad.share.readonly": "വായികàµà´•àµ½ മാതàµà´°à´‚", + "pad.share.link": "à´•à´£àµà´£à´¿", + "pad.share.emebdcode": "എംബെഡൠയàµ.ആർ.എൽ.", + "pad.chat": "തതàµà´¸à´®à´¯à´¸à´‚വാദം", + "pad.chat.title": "à´ˆ പാഡിനàµà´±àµ† തതàµà´¸à´®à´¯à´¸à´‚വാദം à´¤àµà´±à´•àµà´•àµà´•.", + "pad.chat.loadmessages": "കൂടàµà´¤àµ½ സനàµà´¦àµ‡à´¶à´™àµà´™àµ¾ à´Žà´Ÿàµà´•àµà´•àµà´•", + "timeslider.pageTitle": "{{appTitle}} സമയരേഖ", + "timeslider.toolbar.returnbutton": "പാഡിലേകàµà´•àµ മടങàµà´™àµà´•", + "timeslider.toolbar.authors": "രചയിതാകàµà´•àµ¾:", + "timeslider.toolbar.authorsList": "ആരàµà´‚ à´Žà´´àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²", + "timeslider.toolbar.exportlink.title": "കയറàµà´±àµà´®à´¤à´¿", + "timeslider.exportCurrent": "à´ˆ പതിപàµà´ªàµ ഇങàµà´™à´¨àµ† à´Žà´Ÿàµà´•àµà´•àµà´•:", + "timeslider.version": "പതിപàµà´ªàµ {{version}}", + "timeslider.saved": "സേവൠചെയàµà´¤à´¤àµ {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "ജനàµà´µà´°à´¿", + "timeslider.month.february": "ഫെബàµà´°àµà´µà´°à´¿", + "timeslider.month.march": "മാർചàµà´šàµ", + "timeslider.month.april": "à´à´ªàµà´°à´¿àµ½", + "timeslider.month.may": "മേയàµ", + "timeslider.month.june": "ജൂൺ", + "timeslider.month.july": "ജൂലൈ", + "timeslider.month.august": "à´“à´—à´¸àµà´±àµà´±àµ", + "timeslider.month.september": "സെപàµà´±àµà´±à´‚ബർ", + "timeslider.month.october": "à´’à´•àµà´Ÿàµ‹à´¬àµ¼", + "timeslider.month.november": "നവംബർ", + "timeslider.month.december": "ഡിസംബർ", + "timeslider.unnamedauthors": "{{num}} പേരിലàµà´²à´¾à´¤àµà´¤ {[plural(num) one: രചയിതാവàµ, other: രചയിതാകàµà´•àµ¾ }}", + "pad.savedrevs.marked": "à´ˆ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ സേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ", + "pad.userlist.entername": "താങàµà´•à´³àµà´Ÿàµ† പേരൠനൽകàµà´•", + "pad.userlist.unnamed": "പേരിലàµà´²à´¾à´¤àµà´¤à´µ", + "pad.userlist.guest": "അതിഥി", + "pad.userlist.deny": "നിരസികàµà´•àµà´•", + "pad.userlist.approve": "അംഗീകരികàµà´•àµà´•", + "pad.editbar.clearcolors": "ഡോകàµà´¯àµà´®àµ†à´¨àµà´±à´¿àµ½ രചയിതാകàµà´•à´³àµ† സൂചിപàµà´ªà´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿ നൽകിയിടàµà´Ÿàµà´³àµà´³ നിറങàµà´™àµ¾ ഒഴിവാകàµà´•à´Ÿàµà´Ÿàµ†?", + "pad.impexp.importbutton": "ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´•", + "pad.impexp.importing": "ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´¨àµà´¨àµ...", + "pad.impexp.confirmimport": "ഒരൠപàµà´°à´®à´¾à´£à´‚ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ നിലവിലàµà´³àµà´³ à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ നഷàµà´Ÿà´ªàµà´ªàµ†à´Ÿà´¾à´¨à´¿à´Ÿà´¯à´¾à´•àµà´•àµà´‚, à´¤àµà´Ÿà´°à´£à´®àµ†à´¨àµà´¨àµ ഉറപàµà´ªà´¾à´£àµ‹?", + "pad.impexp.convertFailed": "à´ˆ à´ªàµà´°à´®à´¾à´£à´‚ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯à´¾àµ» സാധിചàµà´šà´¿à´²àµà´². ദയവായി മറàµà´±àµŠà´°àµ ഡോകàµà´¯àµà´®àµ†à´¨àµà´±àµ ഫോർമാറàµà´±àµ ഉപയോഗികàµà´•àµà´•à´¯àµ‹, à´¸àµà´µà´¨àµà´¤à´®à´¾à´¯à´¿ പകർതàµà´¤à´¿ ചേർകàµà´•àµà´•à´¯àµ‹ ചെയàµà´¯àµà´•", + "pad.impexp.uploadFailed": "à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ. ദയവായി വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•", + "pad.impexp.importfailed": "ഇറകàµà´•àµà´®à´¤à´¿ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ", + "pad.impexp.copypaste": "ദയവായി പകർതàµà´¤à´¿ ചേർകàµà´•àµà´•", + "pad.impexp.exportdisabled": "{{type}} ഫോർമാറàµà´±à´¿àµ½ കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ തടഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾à´•àµà´•àµ താങàµà´•à´³àµà´Ÿàµ† സിസàµà´±àµà´±à´‚ à´…à´¡àµà´®à´¿à´¨à´¿à´¸àµà´Ÿàµà´°àµ‡à´±àµà´±à´±àµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•." +} diff --git a/src/locales/mr.json b/src/locales/mr.json new file mode 100644 index 00000000..31de89aa --- /dev/null +++ b/src/locales/mr.json @@ -0,0 +1,57 @@ +{ + "@metadata": { + "authors": [ + "Ganeshgiram", + "V.narsikar", + "Ydyashad" + ] + }, + "index.newPad": "नव पान", + "pad.toolbar.bold.title": "ठळक (Ctrl-B)", + "pad.toolbar.italic.title": "तिरपी मà¥à¤¦à¥à¤°à¤¾à¤•à¥à¤·à¤°à¥‡ (Ctrl-I)", + "pad.toolbar.underline.title": "अधोरेखन (Ctrl-U)", + "pad.toolbar.strikethrough.title": "अकà¥à¤·à¤°à¤¾à¤‚वर काट", + "pad.toolbar.savedRevision.title": "आवृतà¥à¤¤à¥€ जतन करा", + "pad.toolbar.settings.title": "संरचना", + "pad.colorpicker.save": "जतन करा", + "pad.colorpicker.cancel": "रदà¥à¤¦ करा", + "pad.loading": "पà¥à¤°à¤à¤¾à¤°à¤£ करीत आहे", + "pad.wrongPassword": "आपला परवलीचा शबà¥à¤¦ चूक होता", + "pad.settings.myView": "माà¤à¥‡ दृशà¥à¤¯", + "pad.settings.linenocheck": "रेषांचे कà¥à¤°à¤®à¤¾à¤‚क", + "pad.settings.language": "à¤à¤¾à¤·à¤¾", + "pad.importExport.import_export": "आयात/निरà¥à¤¯à¤¾à¤¤", + "pad.importExport.importSuccessful": "यशसà¥à¤µà¥€!", + "pad.importExport.exportplain": "साधा मजकूर", + "pad.importExport.exportword": "मायकà¥à¤°à¥‹à¤¸à¥‰à¤«à¥à¤Ÿ वरà¥à¤¡", + "pad.importExport.exportpdf": "पीडीà¤à¤«", + "pad.importExport.exportopen": "ओडीà¤à¤«(ओपन डॉकà¥à¤¯à¥‚मेंट फॉरमॅट)", + "pad.importExport.exportdokuwiki": "डà¥à¤•à¥à¤µà¤¿à¤•à¤¿", + "pad.modals.connected": "अनà¥à¤¬à¤‚धित", + "pad.modals.initsocketfail": "विदागारास पोच नाही.", + "pad.modals.deleted": "वगळले.", + "pad.modals.disconnected.cause": "बहà¥à¤¤à¥‡à¤• सरवर उपलबà¥à¤§ होणार नाही। अस वारंवार à¤à¤¾à¤²à¥à¤¯à¤¾à¤¸ कृपया आमà¥à¤¹à¤¾à¤²à¤¾ कळवा।", + "pad.share.link": "दà¥à¤µà¤¾", + "pad.chat": "गपà¥à¤ªà¤¾", + "timeslider.toolbar.authorsList": "लेखक नाही", + "timeslider.month.january": "जानेवारी", + "timeslider.month.february": "फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€", + "timeslider.month.march": "मारà¥à¤š", + "timeslider.month.april": "à¤à¤ªà¥à¤°à¤¿à¤²", + "timeslider.month.may": "मे", + "timeslider.month.june": "जून", + "timeslider.month.july": "जà¥à¤²à¥ˆ", + "timeslider.month.august": "ऑगसà¥à¤Ÿ", + "timeslider.month.september": "सपà¥à¤Ÿà¥‡à¤‚बर", + "timeslider.month.october": "ऑकà¥à¤Ÿà¥‹à¤¬à¤°", + "timeslider.month.november": "नोवà¥à¤¹à¥‡à¤‚बर", + "timeslider.month.december": "डिसेंबर", + "pad.userlist.entername": "आपले नाव टाका", + "pad.userlist.unnamed": "निनावी", + "pad.userlist.guest": "पाहूणा", + "pad.userlist.approve": "मंजूर करा", + "pad.impexp.importbutton": "आता आयात करा", + "pad.impexp.importing": "आयात करीत आहे...", + "pad.impexp.importfailed": "आयात अयशसà¥à¤µà¥€", + "pad.impexp.copypaste": "कृपया नकल-डकवा" +} diff --git a/src/locales/ms.json b/src/locales/ms.json index 04055d26..033de1bc 100644 --- a/src/locales/ms.json +++ b/src/locales/ms.json @@ -5,23 +5,23 @@ ] }, "index.newPad": "Pad baru", - "index.createOpenPad": "atau cipta\/buka Pad yang bernama:", + "index.createOpenPad": "atau cipta/buka Pad yang bernama:", "pad.toolbar.bold.title": "Tebal (Ctrl-B)", "pad.toolbar.italic.title": "Miring (Ctrl-I)", "pad.toolbar.underline.title": "Garis bawah (Ctrl-U)", "pad.toolbar.strikethrough.title": "Garis lorek", "pad.toolbar.ol.title": "Senarai tertib", "pad.toolbar.ul.title": "Senarai tak tertib", - "pad.toolbar.indent.title": "Engsot ke dalam", - "pad.toolbar.unindent.title": "Engsot ke luar", + "pad.toolbar.indent.title": "Engsot ke dalam (TAB)", + "pad.toolbar.unindent.title": "Engsot ke luar (Shift + TAB)", "pad.toolbar.undo.title": "Buat asal (Ctrl-Z)", "pad.toolbar.redo.title": "Buat semula (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Padamkan Warna Pengarang", - "pad.toolbar.import_export.title": "Import\/Eksport dari\/ke format-format fail berbeza", + "pad.toolbar.import_export.title": "Import/Eksport dari/ke format-format fail berbeza", "pad.toolbar.timeslider.title": "Gelangsar masa", - "pad.toolbar.savedRevision.title": "Semakan Tersimpan", + "pad.toolbar.savedRevision.title": "Simpan Semakan", "pad.toolbar.settings.title": "Tetapan", - "pad.toolbar.embed.title": "Benamkan pad ini", + "pad.toolbar.embed.title": "Kongsikan dan Terapkan pad ini", "pad.toolbar.showusers.title": "Tunjukkan pengguna pada pad ini", "pad.colorpicker.save": "Simpan", "pad.colorpicker.cancel": "Batalkan", @@ -34,12 +34,13 @@ "pad.settings.stickychat": "Sentiasa bersembang pada skrin", "pad.settings.colorcheck": "Warna pengarang", "pad.settings.linenocheck": "Nombor baris", + "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", "pad.settings.fontType": "Jenis fon:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Paparan Sejagat", "pad.settings.language": "Bahasa:", - "pad.importExport.import_export": "Import\/Eksport", + "pad.importExport.import_export": "Import/Eksport", "pad.importExport.import": "Muat naik sebarang fail teks atau dokumen", "pad.importExport.importSuccessful": "Berjaya!", "pad.importExport.export": "Eksport pad semasa sebagai:", @@ -49,7 +50,7 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Anda hanya boleh mengimport dari format teks biasa atau html. Untuk ciri-ciri import yang lebih maju, sila <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">memasang abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Anda hanya boleh mengimport dari format teks biasa atau html. Untuk ciri-ciri import yang lebih maju, sila <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">memasang abiword</a>.", "pad.modals.connected": "Bersambung.", "pad.modals.reconnecting": "Bersambung semula dengan pad anda...", "pad.modals.forcereconnect": "Sambung semula secara paksa", @@ -58,20 +59,22 @@ "pad.modals.userdup.advice": "Sambung semula untuk menggunakan tetingkap ini pula.", "pad.modals.unauth": "Tidak dibenarkan", "pad.modals.unauth.explanation": "Kebenaran anda telah berubah sewaktu memaparkan halaman ini. Cuba bersambung semula.", - "pad.modals.looping": "Terputus.", "pad.modals.looping.explanation": "Terdapat masalah komunikasi dengan pelayan penyegerakan.", "pad.modals.looping.cause": "Mungkin anda telah bersambung melalui tembok api atau proksi yang tidak serasi.", "pad.modals.initsocketfail": "Pelayan tidak boleh dicapai.", "pad.modals.initsocketfail.explanation": "Tidak dapat bersambung dengan pelayar penyegerakan.", "pad.modals.initsocketfail.cause": "Ini mungkin disebabkan oleh masalah dengan pelayar atau sambungan internet anda.", - "pad.modals.slowcommit": "Terputus.", "pad.modals.slowcommit.explanation": "Pelayan tidak membalas.", "pad.modals.slowcommit.cause": "Ini mungkin disebabkan oleh masalah dengan kesambungan rangkaian anda.", + "pad.modals.badChangeset.explanation": "Suntingan yang telah anda lakukan telah dikira sebagai terlarang oleh pelayan penyegerakan.", + "pad.modals.badChangeset.cause": "Ini mungkin disebabkan oleh konfigurasi pelayan salah atau sesuatu kelakuan yang tidak dijangka. Sila hubungi penyelia servis anda jika anda merasakan ini adalah satu kesilapan. Cuba sambungkan semula talian untuk terus menyuntung.", + "pad.modals.corruptPad.explanation": "Pad yang anda cuba akses itu telah tercemar.", + "pad.modals.corruptPad.cause": "Ini mungkin disebabkan oleh konfigurasi pelayan salah atau sesuatu kelakuan yang tidak dijangka. Sila hubungi penyelia servis anda.", "pad.modals.deleted": "Dihapuskan.", "pad.modals.deleted.explanation": "Pad ini telah dibuang.", "pad.modals.disconnected": "Sambungan anda telah diputuskan.", "pad.modals.disconnected.explanation": "Sambungan ke pelayan terputus", - "pad.modals.disconnected.cause": "Pelayan mungkin tidak dapat dicapai. Sila beritahu kami jika masalah ini berterusan.", + "pad.modals.disconnected.cause": "Pelayan mungkin tidak dapat dicapai. Sila beritahu penyelia servis jika masalah ini berterusan.", "pad.share": "Kongsikan pad ini", "pad.share.readonly": "Baca sahaja", "pad.share.link": "Pautan", @@ -87,7 +90,7 @@ "timeslider.exportCurrent": "Eksport versi semasa sebagai:", "timeslider.version": "Versi {{version}}", "timeslider.saved": "Disimpan pada {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januari", "timeslider.month.february": "Februari", "timeslider.month.march": "Mac", @@ -100,8 +103,7 @@ "timeslider.month.october": "Oktober", "timeslider.month.november": "November", "timeslider.month.december": "Disember", - "timeslider.unnamedauthor": "{{num}} orang pengarang awanama", - "timeslider.unnamedauthors": "{{num}} orang pengarang awanama", + "timeslider.unnamedauthors": "{{num}} orang {[plural(num) other: pengarang]} awanama", "pad.savedrevs.marked": "Semakan ini telah ditandai sebagai semakan tersimpan", "pad.userlist.entername": "Taipkan nama anda", "pad.userlist.unnamed": "tanpa nama", @@ -117,4 +119,4 @@ "pad.impexp.importfailed": "Import gagal", "pad.impexp.copypaste": "Sila salin tampal", "pad.impexp.exportdisabled": "Mengeksport dalam format {{type}} dilarang. Sila hubungi pentadbir sistem anda untuk keterangan lanjut." -}
\ No newline at end of file +} diff --git a/src/locales/nb.json b/src/locales/nb.json new file mode 100644 index 00000000..0620d2b4 --- /dev/null +++ b/src/locales/nb.json @@ -0,0 +1,123 @@ +{ + "@metadata": { + "authors": [ + "Laaknor", + "Cocu" + ] + }, + "index.newPad": "Ny Pad", + "index.createOpenPad": "eller opprette/Ã¥pne en ny Pad med dette navnet:", + "pad.toolbar.bold.title": "Fet (Ctrl-B)", + "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", + "pad.toolbar.underline.title": "Understreking (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Gjennomstreking", + "pad.toolbar.ol.title": "Nummerert liste", + "pad.toolbar.ul.title": "Punktliste", + "pad.toolbar.indent.title": "Innrykk (TAB)", + "pad.toolbar.unindent.title": "Rykk ut (Shift+TAB)", + "pad.toolbar.undo.title": "Angre (Ctrl-Z)", + "pad.toolbar.redo.title": "Gjør omigjen (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Fjern forfatterfarger", + "pad.toolbar.import_export.title": "Importer/eksporter fra/til forskjellige filformater", + "pad.toolbar.timeslider.title": "Tidslinje", + "pad.toolbar.savedRevision.title": "Lagre revisjoner", + "pad.toolbar.settings.title": "Innstillinger", + "pad.toolbar.embed.title": "Bygg inn denne padden", + "pad.toolbar.showusers.title": "Vis brukerne av denne padden", + "pad.colorpicker.save": "Lagre", + "pad.colorpicker.cancel": "Avbryt", + "pad.loading": "Laster inn...", + "pad.passwordRequired": "Du trenger et passord for Ã¥ fÃ¥ tilgang til denne padden", + "pad.permissionDenied": "Du har ikke tilgang til denne padden", + "pad.wrongPassword": "Feil passord", + "pad.settings.padSettings": "Padinnstillinger", + "pad.settings.myView": "Min visning", + "pad.settings.stickychat": "Chat alltid synlig", + "pad.settings.colorcheck": "Forfatterfarger", + "pad.settings.linenocheck": "Linjenummer", + "pad.settings.rtlcheck": "Les innhold fra høyre til venstre?", + "pad.settings.fontType": "Skrifttype:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Fast bredde", + "pad.settings.globalView": "Global visning", + "pad.settings.language": "SprÃ¥k:", + "pad.importExport.import_export": "Importer/eksporter", + "pad.importExport.import": "Last opp tekstfil eller dokument", + "pad.importExport.importSuccessful": "Vellykket!", + "pad.importExport.export": "Eksporter padden som:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Ren tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Du kan bare importere fra ren tekst eller HTML-formater. For mer avanserte importfunksjoner, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer abiword</a>.", + "pad.modals.connected": "Tilkoblet.", + "pad.modals.reconnecting": "Kobler til din pad pÃ¥ nytt...", + "pad.modals.forcereconnect": "Tving gjenoppkobling", + "pad.modals.userdup": "Ã…pnet i nytt vindu", + "pad.modals.userdup.explanation": "Denne padden ser ut til Ã¥ være Ã¥pnet i mer enn et nettleservindu pÃ¥ denne maskinen.", + "pad.modals.userdup.advice": "Koble til igjen for Ã¥ bruke dette vinduet i stedenfor.", + "pad.modals.unauth": "Ikke tillatt", + "pad.modals.unauth.explanation": "Dine rettigheter har blitt endret mens du sÃ¥ pÃ¥ denne siden. Prøv Ã¥ koble til pÃ¥ nytt", + "pad.modals.looping.explanation": "Det er kommunikasjonsproblemer med synkroniseringsserveren.", + "pad.modals.looping.cause": "Kanskje du koblet til en inkompatibel brannmur eller mellomtjener", + "pad.modals.initsocketfail": "Serveren er utilgjengelig", + "pad.modals.initsocketfail.explanation": "Kunne ikke koble til synkroniseringsserveren.", + "pad.modals.initsocketfail.cause": "Dette er sannsynligvis pÃ¥ grunn av et problem med nettleseren eller din internettoppkobling", + "pad.modals.slowcommit.explanation": "Serveren svarer ikke.", + "pad.modals.slowcommit.cause": "Dette kan være et problem med nettverkstilkoblingen", + "pad.modals.badChangeset.explanation": "En redigering som du gjorde ble klassifisert som ulovlig av synkroniseringsserveren.", + "pad.modals.badChangeset.cause": "Dette kan komme av feil serverkonfigurasjon eller en annen uventet adferd. Vennligst kontakt serviceadministratoren hvis du anser dette Ã¥ være feil. Prøv Ã¥ gjenopprette forbindelsen for Ã¥ fortsette med redigeringen.", + "pad.modals.corruptPad.explanation": "Blokken du forsøker Ã¥ fÃ¥ tilgang til er skadet.", + "pad.modals.corruptPad.cause": "Dette kan komme av feil serverkonfigurasjon eller en annen uventet adferd. Vennligst kontakt serviceadministratoren hvis du anser dette Ã¥ være feil.", + "pad.modals.deleted": "Slettet.", + "pad.modals.deleted.explanation": "Denne padden har blitt fjernet", + "pad.modals.disconnected": "Du har blitt frakoblet.", + "pad.modals.disconnected.explanation": "Mistet tilkobling til serveren.", + "pad.modals.disconnected.cause": "Serveren kan være utilgjengelig. Vennligst si i fra til oss hvis dette fortsetter Ã¥ skje", + "pad.share": "Del denne padden", + "pad.share.readonly": "Skrivebeskyttet", + "pad.share.link": "Lenke", + "pad.share.emebdcode": "URL for innbygging", + "pad.chat": "Chat", + "pad.chat.title": "Ã…pne chatten for denne padden.", + "pad.chat.loadmessages": "Last flere beskjeder", + "timeslider.pageTitle": "{{appTitle}} Tidslinje", + "timeslider.toolbar.returnbutton": "GÃ¥ tilbake til pad", + "timeslider.toolbar.authors": "Forfattere:", + "timeslider.toolbar.authorsList": "Ingen forfattere", + "timeslider.toolbar.exportlink.title": "Eksporter", + "timeslider.exportCurrent": "Eksporter nÃ¥værende versjon som:", + "timeslider.version": "Versjon {{version}}", + "timeslider.saved": "Lagret {{day}} {{month}} {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januar", + "timeslider.month.february": "februar", + "timeslider.month.march": "mars", + "timeslider.month.april": "april", + "timeslider.month.may": "mai", + "timeslider.month.june": "juni", + "timeslider.month.july": "juli", + "timeslider.month.august": "august", + "timeslider.month.september": "september", + "timeslider.month.october": "oktober", + "timeslider.month.november": "november", + "timeslider.month.december": "desember", + "timeslider.unnamedauthors": "{{num}} navnløse {[plural(num) one: forfatter, other: forfattere ]}", + "pad.savedrevs.marked": "Denne revisjonen er nÃ¥ markert som en lagret revisjon", + "pad.userlist.entername": "Skriv inn ditt navn", + "pad.userlist.unnamed": "navnløs", + "pad.userlist.guest": "Gjest", + "pad.userlist.deny": "Nekt", + "pad.userlist.approve": "Godkjenn", + "pad.editbar.clearcolors": "Fjern forfatterfarger pÃ¥ hele dokumentet?", + "pad.impexp.importbutton": "Importer nÃ¥", + "pad.impexp.importing": "Importerer...", + "pad.impexp.confirmimport": "Importering av en fil vil overskrive den nÃ¥værende teksten pÃ¥ padden. Er du sikker pÃ¥ at du vil fortsette?", + "pad.impexp.convertFailed": "Vi greide ikke Ã¥ importere denne filen. Bruk et annet dokumentformat eller kopier og lim inn teksten manuelt", + "pad.impexp.uploadFailed": "Opplastning feilet. Prøv igjen", + "pad.impexp.importfailed": "Import feilet", + "pad.impexp.copypaste": "Vennligst kopier og lim inn", + "pad.impexp.exportdisabled": "Eksporterer som {{type}} er deaktivert. Vennligst kontakt din systemadministrator for detaljer." +} diff --git a/src/locales/nds.json b/src/locales/nds.json new file mode 100644 index 00000000..451a0211 --- /dev/null +++ b/src/locales/nds.json @@ -0,0 +1,119 @@ +{ + "@metadata": { + "authors": [ + "Gthoele", + "Joachim Mos" + ] + }, + "index.newPad": "Nee'et Pad", + "index.createOpenPad": "oder Pad mit düssen Naam apen maken:", + "pad.toolbar.bold.title": "Fett (Strg-B)", + "pad.toolbar.italic.title": "Kursiv (Strg-I)", + "pad.toolbar.underline.title": "Mit Streek dor ünner (Strg-U)", + "pad.toolbar.strikethrough.title": "Mit Streek dor dör", + "pad.toolbar.ol.title": "List na Nummern", + "pad.toolbar.ul.title": "List ahn Nummern", + "pad.toolbar.indent.title": "Text na rechts", + "pad.toolbar.unindent.title": "Text na links", + "pad.toolbar.undo.title": "Een Stapp retuur (Strg-Z)", + "pad.toolbar.redo.title": "Noch mal (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Klöör vun den Schriever wegnehmen", + "pad.toolbar.import_export.title": "Rinhalen/Rutgeven in verscheden Dateiformate", + "pad.toolbar.timeslider.title": "Geschicht vun de Pad-Faten wiesen", + "pad.toolbar.savedRevision.title": "Faten sekern", + "pad.toolbar.settings.title": "Instellungen", + "pad.toolbar.embed.title": "Düt Pad verdelen oder annerswo ringeven", + "pad.toolbar.showusers.title": "Wokeen is online?", + "pad.colorpicker.save": "Spiekern", + "pad.colorpicker.cancel": "Afbreken", + "pad.loading": "Läädt…", + "pad.passwordRequired": "Du bruukst en Passwoort, wenn du in düt Pad rinwullt", + "pad.permissionDenied": "In düt Pad dröffst du nich rin", + "pad.wrongPassword": "Dien Passwoort weer nich richtig", + "pad.settings.padSettings": "So is dat Pad instellt", + "pad.settings.myView": "So heff ik dat instellt", + "pad.settings.stickychat": "Chat jümmers wiesen", + "pad.settings.colorcheck": "Klören vun de Schrievers wiesen", + "pad.settings.linenocheck": "Nummer vun de Reeg", + "pad.settings.rtlcheck": "Lees Pad vun rechts nach links", + "pad.settings.fontType": "Schriftoort:", + "pad.settings.fontType.normal": "Normaal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Ansicht för all", + "pad.settings.language": "Spraak:", + "pad.importExport.import_export": "Rinhalen/Rutgeven", + "pad.importExport.import": "Datei oder Dokument hoochladen", + "pad.importExport.importSuccessful": "Hett slumpt!", + "pad.importExport.export": "Düt Pad rutgeven as:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Textdatei", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Se köönt blots wat vun Kloortext oder HTML-Stücken röverhalen. Mit <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"> köönt Se ok anner Saken röverhalen. Dorför mööt Se bidde abiword inrichten</a>.", + "pad.modals.connected": "Verbindung steiht.", + "pad.modals.reconnecting": "En Verbindung wedder opboen ...", + "pad.modals.forcereconnect": "Noch mal verbinnen", + "pad.modals.userdup": "In en anner Fenster op", + "pad.modals.userdup.explanation": "Dat lett, düt Pat is op düssen Reekner in mehr as een Browser-Fenster op.", + "pad.modals.userdup.advice": "Wullt du düt Fenster bruken, bidde noch mal de Verbindung opboen.", + "pad.modals.unauth": "Nich freegeven.", + "pad.modals.unauth.explanation": "Du hest nu anner Rechten för düt Pad. Maak dat bidde noch mal wedder nee op.", + "pad.modals.looping.explanation": "Dat gifft Kummer bi de Verbindung mit den Pad-Server.", + "pad.modals.looping.cause": "Mag ween un du hest Verbindung mit den Padserver över en Firewall, de nich passt, oder en Proxy, de nich passt.", + "pad.modals.initsocketfail": "Wi köönt den Pad-Server nich faat kriegen.", + "pad.modals.initsocketfail.explanation": "De Verbindung mit den Pad-Server hett nich klappt.", + "pad.modals.initsocketfail.cause": "Mag ween un dat liggt an dien Browser oder an dien Internet-Verbindung.", + "pad.modals.slowcommit.explanation": "De Pad-Server gifft keen Antwoort.", + "pad.modals.slowcommit.cause": "Kunn wenn un dat liggt an dat Nettwark, oder dor arbeidt jüst to veel Lüüd op den Pad-Server.", + "pad.modals.deleted": "Weg is dat!", + "pad.modals.deleted.explanation": "Düt Pad is nu weg.", + "pad.modals.disconnected": "De Kuntakt is afreten.", + "pad.modals.disconnected.explanation": "De Kuntakt mit den Pad-Server is afreten.", + "pad.modals.disconnected.cause": "Mag ween un wi köönt den Pad-Server jüst nich faat kriegen. Schull dat so wiedergahn, segg man Bescheed.", + "pad.share": "Düt Pad ok anner Lüüd wiesen", + "pad.share.readonly": "Se köönt hier jüst blots lesen", + "pad.share.link": "Link", + "pad.share.emebdcode": "In Websiet ringeven", + "pad.chat": "Chat", + "pad.chat.title": "Den Chat vun düt Pad apen maken", + "pad.chat.loadmessages": "Mehr Narichten laden", + "timeslider.pageTitle": "{{appTitle}} Öllere Faten vun dat Pad", + "timeslider.toolbar.returnbutton": "Retuur na dat Pad", + "timeslider.toolbar.authors": "Schrievers:", + "timeslider.toolbar.authorsList": "keen Schrievers", + "timeslider.toolbar.exportlink.title": "Rutschicken", + "timeslider.exportCurrent": "Schick düsse Faten rut as:", + "timeslider.version": "Faten {{version}}", + "timeslider.saved": "Sekert an den {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januar", + "timeslider.month.february": "Februar", + "timeslider.month.march": "März", + "timeslider.month.april": "April", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juni", + "timeslider.month.july": "Juli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktober", + "timeslider.month.november": "November", + "timeslider.month.december": "Dezember", + "timeslider.unnamedauthors": "{{num}} Schriever ohn Naam {[plural(num) one: Schriever, other: Schrievers ]}", + "pad.savedrevs.marked": "Düsse Faten hett nu dat Teken: sekerte Faten", + "pad.userlist.entername": "Schriev dien Naam", + "pad.userlist.unnamed": "hett keen Naam", + "pad.userlist.guest": "Besöker", + "pad.userlist.deny": "Deit uns Leed, wieder geiht dat nich", + "pad.userlist.approve": "Man to!", + "pad.editbar.clearcolors": "Klören vun de Schrievers in dat ganze Dokument torüchsetten?", + "pad.impexp.importbutton": "Nu rinhalen", + "pad.impexp.importing": "Haal dat rin …", + "pad.impexp.confirmimport": "Wenn du nu en Datei rinhaalst, warrt de Text in dat Pad överschreven. Wullt du würklich wieder maken?", + "pad.impexp.convertFailed": "Wi köönt düsse Datei nich rinhalen. Ännert Se bidde dat Format vun dat Dokument oder haalt Se den Text mit de Hand rin.", + "pad.impexp.uploadFailed": "Dat Hoochladen hett nich slumpt. Versöök dat man noch mal.", + "pad.impexp.importfailed": "Dat Rinhalen hett nich slumpt", + "pad.impexp.copypaste": "Bidde koperen un rinsetten", + "pad.impexp.exportdisabled": "Du kannst dat nich in dat {{type}}-Format rutschicken. Wenn du mehr weten wullt, fraag man den Systemadministrator." +} diff --git a/src/locales/ne.json b/src/locales/ne.json new file mode 100644 index 00000000..37194884 --- /dev/null +++ b/src/locales/ne.json @@ -0,0 +1,101 @@ +{ + "@metadata": { + "authors": [ + "सरोज कà¥à¤®à¤¾à¤° ढकाल" + ] + }, + "index.newPad": "नयाठपà¥à¤¯à¤¾à¤¡", + "index.createOpenPad": "नाम सहितको नयाठपà¥à¤¯à¤¾à¤¡ सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥‡ / खोलà¥à¤¨à¥‡ :", + "pad.toolbar.bold.title": "मोटो (Ctrl-B)", + "pad.toolbar.italic.title": "ढलà¥à¤•à¥‡ (Ctrl-I)", + "pad.toolbar.underline.title": "निमà¥à¤¨ रेखाङà¥à¤•à¤¨ (Ctrl-U)", + "pad.toolbar.strikethrough.title": "बीचको धरà¥à¤•à¥‹", + "pad.toolbar.ol.title": "कà¥à¤°à¤®à¤µà¤¦à¥à¤§ सूची", + "pad.toolbar.ul.title": "अकà¥à¤°à¤®à¤¾à¤™à¥à¤•à¤¿à¤¤ सूची", + "pad.toolbar.indent.title": "इनà¥à¤¡à¥‡à¤¨à¥à¤Ÿ (TAB)", + "pad.toolbar.unindent.title": "आउटडेनà¥à¤Ÿ (Shift+TAB)", + "pad.toolbar.undo.title": "रदà¥à¤¦ (Ctrl-Z)", + "pad.toolbar.redo.title": "पà¥à¤¨:लागॠ(Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "लेखकीय रङà¥à¤— हटाउने", + "pad.toolbar.timeslider.title": "टाइमसà¥à¤²à¤¾à¤‡à¤¡à¤°", + "pad.toolbar.savedRevision.title": "पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ संगà¥à¤°à¤¹à¤—रà¥à¤¨à¥‡", + "pad.toolbar.settings.title": "सेटिङà¥à¤—हरू", + "pad.toolbar.embed.title": "यस पà¥à¤¯à¤¾à¤¡à¤²à¤¾à¤ˆ बाडà¥à¤¨à¥‡ या इमà¥à¤¬à¥‡à¤¡ गरà¥à¤¨à¥‡", + "pad.toolbar.showusers.title": "यस पà¥à¤¯à¤¾à¤¡à¤®à¤¾ रहेका पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ देखाउने", + "pad.colorpicker.save": "संगà¥à¤°à¤¹ गरà¥à¤¨à¥‡", + "pad.colorpicker.cancel": "रदà¥à¤¦", + "pad.loading": "लोड हà¥à¤¦à¥ˆà¤›...", + "pad.passwordRequired": "यो पà¥à¤¯à¤¡ खोलà¥à¤¨ पासवरà¥à¤¡ चाहिनà¥à¤›", + "pad.permissionDenied": "तपाईà¤à¤²à¤¾à¤ˆ यस पà¥à¤¯à¤¾à¤¡ खोलà¥à¤¨ अनà¥à¤®à¤¤à¤¿ छैन", + "pad.wrongPassword": "तपाईà¤à¤•à¥‹ पासवरà¥à¤¡ गलत थियो", + "pad.settings.padSettings": "पà¥à¤¯à¤¾à¤¡ सेटिङà¥à¤—हरू", + "pad.settings.myView": "मेरो दृषà¥à¤¯", + "pad.settings.stickychat": "परà¥à¤¦à¤¾à¤®à¤¾ सधै चà¥à¤¯à¤¾à¤Ÿ गरà¥à¤¨à¥‡", + "pad.settings.colorcheck": "लेखकीय रङà¥à¤—", + "pad.settings.linenocheck": "हरफ संखà¥à¤¯à¤¾", + "pad.settings.rtlcheck": "के सामगà¥à¤°à¥€ दाहिने देखि देबà¥à¤°à¥‡ पढà¥à¤¨à¥‡ हो ?", + "pad.settings.fontType": "फनà¥à¤Ÿ पà¥à¤°à¤•à¤¾à¤°:", + "pad.settings.fontType.normal": "सामानà¥à¤¯", + "pad.settings.fontType.monospaced": "मोनोसà¥à¤ªà¥‡à¤¸", + "pad.settings.globalView": "विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ दृषà¥à¤¯", + "pad.settings.language": "à¤à¤¾à¤·à¤¾:", + "pad.importExport.import_export": "आयात/निरà¥à¤¯à¤¾à¤¤", + "pad.importExport.import": "कà¥à¤¨à¥ˆ पनि पाठरहेको फाइल या कागजात अपलोड गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥", + "pad.importExport.importSuccessful": "सफल à¤à¤¯à¥‹!", + "pad.importExport.export": "निमà¥à¤¨ रà¥à¤ªà¤®à¤¾ पà¥à¤¯à¤¾à¤¡ निरà¥à¤¯à¤¾à¤¤ गरà¥à¤¨à¥‡ :", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "साधारण पाठ", + "pad.importExport.exportword": "माइकà¥à¤°à¥‹à¤¸à¤«à¥à¤Ÿ वरà¥à¤¡", + "pad.importExport.exportpdf": "पिडिà¤à¤«", + "pad.importExport.exportopen": "ओडिà¤à¤«(खà¥à¤²à¥à¤²à¤¾ कागजात ढाà¤à¤šà¤¾)", + "pad.importExport.exportdokuwiki": "डकà¥à¤µà¤¿à¤•à¤¿", + "pad.modals.connected": "जोडीà¤à¤•à¥‹à¥¤", + "pad.modals.reconnecting": "तपाईà¤à¤•à¥‹ पà¥à¤¯à¤¾à¤¡à¤®à¤¾ पà¥à¤¨: जडान गरà¥à¤¦à¥ˆ", + "pad.modals.forcereconnect": "जडानको लागि जोडगरà¥à¤¨à¥‡", + "pad.modals.userdup": "अरà¥à¤•à¥‹ सनà¥à¤à¥à¤¯à¤¾à¤²à¤®à¤¾ खोलà¥à¤¨à¥‡", + "pad.modals.unauth": "अनà¥à¤®à¤¤à¥€ नदिइà¤à¤•à¥‹", + "pad.modals.initsocketfail": "सरà¥à¤à¤°à¤®à¤¾ पहà¥à¤à¤š पà¥à¤°à¥â€à¤¯à¤¾à¤‰à¤¨ सकिà¤à¤¨ ।", + "pad.modals.deleted": "मेटिà¤à¤•à¥‹ ।", + "pad.modals.deleted.explanation": "यो पà¥à¤¯à¤¾à¤¡ हटाइसकेको छ ।", + "pad.modals.disconnected": "तपाईà¤à¤•à¥‹ जडान अवरà¥à¤¦à¥à¤§ à¤à¤¯à¥‹ ।", + "pad.modals.disconnected.explanation": "तपाईà¤à¤•à¥‹ सरà¥à¤à¤°à¤¸à¤à¤—को जडान अवरà¥à¤¦à¥à¤§ à¤à¤¯à¥‹", + "pad.share": "यस पà¥à¤¯à¤¡à¤²à¤¾à¤ˆ बाडà¥à¤¨à¥‡", + "pad.share.readonly": "पढà¥à¤¨à¥‡ मातà¥à¤°", + "pad.share.link": "लिङà¥à¤•", + "pad.share.emebdcode": "URL थपà¥à¤¨à¥‡", + "pad.chat": "कà¥à¤°à¤¾à¤•à¤¾à¤¨à¥€", + "pad.chat.title": "यस पà¥à¤¯à¤¾à¤¡à¤•à¥‹ लागि कà¥à¤°à¤¾à¤•à¤¾à¤¨à¥€ खोलà¥à¤¨à¥‡", + "pad.chat.loadmessages": "थप सनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ खोलà¥à¤¨à¥‡", + "timeslider.pageTitle": "{{appTitle}} समय रेखा", + "timeslider.toolbar.returnbutton": "पà¥à¤¯à¤¾à¤¡à¤®à¤¾ फरà¥à¤•à¤¨à¥à¤¹à¥‹à¤¸à¥", + "timeslider.toolbar.authors": "लेखकहरà¥:", + "timeslider.toolbar.authorsList": "कà¥à¤¨à¥ˆ पनि लेखकहरू छैननà¥", + "timeslider.toolbar.exportlink.title": "निरà¥à¤¯à¤¾à¤¤", + "timeslider.exportCurrent": "हालको संसà¥à¤•à¤°à¤£ निमà¥à¤® रà¥à¤ªà¤®à¤¾ निरà¥à¤¯à¤¾à¤¤ गरà¥à¤¨à¥‡ :", + "timeslider.version": "संसà¥à¤•à¤°à¤£ {{version}}", + "timeslider.saved": "सङà¥à¤—à¥à¤°à¤¹ गरिà¤à¤•à¥‹ {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "जनवरी", + "timeslider.month.february": "फेबà¥à¤°à¥à¤…री", + "timeslider.month.march": "मारà¥à¤š", + "timeslider.month.april": "à¤à¤ªà¥à¤°à¥€à¤²", + "timeslider.month.may": "मे", + "timeslider.month.june": "जà¥à¤¨", + "timeslider.month.july": "जà¥à¤²à¤¾à¤ˆ", + "timeslider.month.august": "अगसà¥à¤Ÿ", + "timeslider.month.september": "सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°", + "timeslider.month.october": "अकà¥à¤Ÿà¥‹à¤¬à¤°", + "timeslider.month.november": "नोà¤à¥‡à¤®à¥à¤¬à¤°", + "timeslider.month.december": "डिसेमà¥à¤¬à¤°", + "timeslider.unnamedauthors": "{{num}} unnamed {[plural(num) one: author, other: authors ]}", + "pad.savedrevs.marked": "यस संसà¥à¤•à¤°à¤£à¤²à¤¾à¤ˆ संगà¥à¤°à¤¹à¤¿à¤¤à¤•à¥‹ रà¥à¤ªà¤®à¤¾ चिनो लगाइà¤à¤•à¥‹ छैन", + "pad.userlist.entername": "तपाईà¤à¤•à¥‹ नाम लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥", + "pad.userlist.unnamed": "नाम नखà¥à¤²à¤¾à¤‡à¤à¤•à¥‹", + "pad.userlist.guest": "पाहà¥à¤¨à¤¾", + "pad.userlist.deny": "असà¥à¤µà¥€à¤•à¤¾à¤° गरà¥à¤¨à¥‡", + "pad.userlist.approve": "सà¥à¤µà¥€à¤•à¥ƒà¤¤ गरà¥à¤¨à¥‡", + "pad.impexp.importbutton": "अहिले आयात गरà¥à¤¨à¥‡", + "pad.impexp.importing": "आयात गरà¥à¤¨à¥‡...", + "pad.impexp.importfailed": "आयात असफल à¤à¤¯à¥‹", + "pad.impexp.copypaste": "कृपया कपी पेसà¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸" +} diff --git a/src/locales/nl.json b/src/locales/nl.json index 4142cc33..5a9d9fba 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -12,20 +12,20 @@ "pad.toolbar.strikethrough.title": "Doorhalen", "pad.toolbar.ol.title": "Geordende lijst", "pad.toolbar.ul.title": "Ongeordende lijst", - "pad.toolbar.indent.title": "Inspringen", - "pad.toolbar.unindent.title": "Inspringing verkleinen", + "pad.toolbar.indent.title": "Inspringen (Tab)", + "pad.toolbar.unindent.title": "Inspringing verkleinen (Shift+Tab)", "pad.toolbar.undo.title": "Ongedaan maken (Ctrl-Z)", "pad.toolbar.redo.title": "Opnieuw uitvoeren (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Kleuren auteurs wissen", - "pad.toolbar.import_export.title": "Naar\/van andere opmaak exporteren\/importeren", + "pad.toolbar.import_export.title": "Naar/van andere opmaak exporteren/importeren", "pad.toolbar.timeslider.title": "Tijdlijn", "pad.toolbar.savedRevision.title": "Versie opslaan", "pad.toolbar.settings.title": "Instellingen", - "pad.toolbar.embed.title": "Pad insluiten", + "pad.toolbar.embed.title": "Pad delen en insluiten", "pad.toolbar.showusers.title": "Gebruikers van dit pad weergeven", "pad.colorpicker.save": "Opslaan", "pad.colorpicker.cancel": "Annuleren", - "pad.loading": "Bezig met laden\u2026", + "pad.loading": "Bezig met laden…", "pad.passwordRequired": "U hebt een wachtwoord nodig om toegang te krijgen tot deze pad", "pad.permissionDenied": "U hebt geen rechten om deze pad te bekijken", "pad.wrongPassword": "U hebt een onjuist wachtwoord ingevoerd", @@ -34,44 +34,47 @@ "pad.settings.stickychat": "Chat altijd zichtbaar", "pad.settings.colorcheck": "Kleuren auteurs", "pad.settings.linenocheck": "Regelnummers", + "pad.settings.rtlcheck": "Inhoud van rechts naar links lezen?", "pad.settings.fontType": "Lettertype:", "pad.settings.fontType.normal": "Normaal", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Globaal overzicht", "pad.settings.language": "Taal:", - "pad.importExport.import_export": "Importeren\/exporteren", + "pad.importExport.import_export": "Importeren/exporteren", "pad.importExport.import": "Upload een tekstbestand of document", "pad.importExport.importSuccessful": "Afgerond", "pad.importExport.export": "Huidige pad exporteren als", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Tekst zonder opmaak", "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportpdf": "Pdf", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit platte tekst of een HTML-opmaak. <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Installeer abiword<\/a> om meer geavanceerde importmogelijkheden te krijgen.", + "pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit platte tekst of een HTML-opmaak. <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Installeer abiword</a> om meer geavanceerde importmogelijkheden te krijgen.", "pad.modals.connected": "Verbonden.", "pad.modals.reconnecting": "Opnieuw verbinding maken met uw pad...", "pad.modals.forcereconnect": "Opnieuw verbinden", "pad.modals.userdup": "In een ander venster geopend", - "pad.modals.userdup.explanation": "Dit pad is meer dan \u00e9\u00e9n keer geopend in een browservenster op deze computer.", + "pad.modals.userdup.explanation": "Dit pad is meer dan één keer geopend in een browservenster op deze computer.", "pad.modals.userdup.advice": "Maak opnieuw verbinding als u dit venster wilt gebruiken.", "pad.modals.unauth": "Niet toegestaan", "pad.modals.unauth.explanation": "Uw rechten zijn gewijzigd terwijl u de pagina aan het bekijken was. Probeer opnieuw te verbinden.", - "pad.modals.looping": "Verbinding verbroken.", "pad.modals.looping.explanation": "Er is een probleem opgetreden tijdens de communicatie met de synchronisatieserver.", "pad.modals.looping.cause": "Mogelijk gebruikt de server een niet compatibele firewall of proxy server.", "pad.modals.initsocketfail": "Server is niet bereikbaar.", "pad.modals.initsocketfail.explanation": "Het was niet mogelijk te verbinden met de synchronisatieserver.", "pad.modals.initsocketfail.cause": "Mogelijk komt dit door uw browser of internetverbinding.", - "pad.modals.slowcommit": "Verbinding verbroken.", "pad.modals.slowcommit.explanation": "De server reageert niet.", "pad.modals.slowcommit.cause": "Dit komt mogelijk door netwerkproblemen.", + "pad.modals.badChangeset.explanation": "Een door u gemaakte bewerking is door de synchronisatieserver als incorrect aangemerkt.", + "pad.modals.badChangeset.cause": "Dit kan komen door een onjuiste serverinstelling of door ander onverwacht gedrag. Neem contact op met de servicebeheerder als u denkt dat er een onverwachte uitkomst is. Probeer opnieuw te verbinden om door te gaan met bewerken.", + "pad.modals.corruptPad.explanation": "Het pad dat u wilt openen is beschadigd.", + "pad.modals.corruptPad.cause": "Dit kan komen door een onjuiste serverinstelling of door ander onverwacht gedrag. Neem contact op met de servicebeheerder.", "pad.modals.deleted": "Verwijderd.", "pad.modals.deleted.explanation": "Dit pad is verwijderd.", "pad.modals.disconnected": "Uw verbinding is verbroken.", "pad.modals.disconnected.explanation": "De verbinding met de server is verbroken", - "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel alstublieft de beheerder op de hoogte.", + "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel de servicebeheerder op de hoogte.", "pad.share": "Pad delen", "pad.share.readonly": "Alleen-lezen", "pad.share.link": "Koppeling", @@ -100,8 +103,7 @@ "timeslider.month.october": "oktober", "timeslider.month.november": "november", "timeslider.month.december": "december", - "timeslider.unnamedauthor": "{{num}} onbekende auteur", - "timeslider.unnamedauthors": "{{num}} onbekende auteurs", + "timeslider.unnamedauthors": "{{num}} onbekende {[plural(num) one: auteur, other: auteurs ]}", "pad.savedrevs.marked": "Deze versie is nu gemarkeerd als opgeslagen versie", "pad.userlist.entername": "Geef uw naam op", "pad.userlist.unnamed": "zonder naam", @@ -110,11 +112,11 @@ "pad.userlist.approve": "Goedkeuren", "pad.editbar.clearcolors": "Auteurskleuren voor het hele document wissen?", "pad.impexp.importbutton": "Nu importeren", - "pad.impexp.importing": "Bezig met importeren\u2026", + "pad.impexp.importing": "Bezig met importeren…", "pad.impexp.confirmimport": "Door een bestand te importeren overschrijft u de huidige tekst van de pad. Wilt u echt doorgaan?", "pad.impexp.convertFailed": "Het was niet mogelijk dit bestand te importeren. Gebruik een andere documentopmaak of kopieer en plak de inhoud handmatig", "pad.impexp.uploadFailed": "Het uploaden is mislukt. Probeer het opnieuw", "pad.impexp.importfailed": "Importeren is mislukt", - "pad.impexp.copypaste": "Gebruik kopi\u00ebren en plakken", + "pad.impexp.copypaste": "Gebruik kopiëren en plakken", "pad.impexp.exportdisabled": "Exporteren als {{type}} is uitgeschakeld. Neem contact op met de systeembeheerder voor details." -}
\ No newline at end of file +} diff --git a/src/locales/nn.json b/src/locales/nn.json index e8004e8d..104a17dc 100644 --- a/src/locales/nn.json +++ b/src/locales/nn.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "1": "Unhammer" - } + "authors": [ + "Unhammer" + ] }, "index.newPad": "Ny blokk", - "index.createOpenPad": "eller opprett\/opna ei blokk med namnet:", + "index.createOpenPad": "eller opprett/opna ei blokk med namnet:", "pad.toolbar.bold.title": "Feit (Ctrl-B)", "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", "pad.toolbar.underline.title": "Understreking (Ctrl-U)", @@ -17,16 +17,16 @@ "pad.toolbar.undo.title": "Angra (Ctrl-Z)", "pad.toolbar.redo.title": "Gjer om (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Fjern forfattarfargar", - "pad.toolbar.import_export.title": "Importer\/eksporter til\/fr\u00e5 ulike filformat", + "pad.toolbar.import_export.title": "Importer/eksporter til/frå ulike filformat", "pad.toolbar.timeslider.title": "Tidslinje", - "pad.toolbar.savedRevision.title": "Lagra utg\u00e5ver", + "pad.toolbar.savedRevision.title": "Lagra utgåver", "pad.toolbar.settings.title": "Innstillingar", "pad.toolbar.embed.title": "Bygg inn blokka i ei nettside", - "pad.toolbar.showusers.title": "Syn brukarane p\u00e5 blokka", + "pad.toolbar.showusers.title": "Syn brukarane på blokka", "pad.colorpicker.save": "Lagra", "pad.colorpicker.cancel": "Avbryt", - "pad.loading": "Lastar \u2026", - "pad.passwordRequired": "Du treng eit passord for \u00e5 opna denne blokka", + "pad.loading": "Lastar …", + "pad.passwordRequired": "Du treng eit passord for å opna denne blokka", "pad.permissionDenied": "Du har ikkje tilgang til denne blokka", "pad.wrongPassword": "Feil passord", "pad.settings.padSettings": "Blokkinnstillingar", @@ -38,8 +38,8 @@ "pad.settings.fontType.normal": "Vanleg", "pad.settings.fontType.monospaced": "Fast breidd", "pad.settings.globalView": "Global visning", - "pad.settings.language": "Spr\u00e5k:", - "pad.importExport.import_export": "Importer\/eksporter", + "pad.settings.language": "Språk:", + "pad.importExport.import_export": "Importer/eksporter", "pad.importExport.import": "Last opp tekstfiler eller dokument", "pad.importExport.importSuccessful": "Vellukka!", "pad.importExport.export": "Eksporter blokka som:", @@ -49,27 +49,25 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan berre importera fr\u00e5 rein tekst- eller HTML-format. Ver venleg og <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer Abiword<\/a> om du treng meir avanserte importfunksjonar.", + "pad.importExport.abiword.innerHTML": "Du kan berre importera frå rein tekst- eller HTML-format. Ver venleg og <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installer Abiword</a> om du treng meir avanserte importfunksjonar.", "pad.modals.connected": "Tilkopla.", - "pad.modals.reconnecting": "Gjenopprettar tilkoplinga til blokka di \u2026", + "pad.modals.reconnecting": "Gjenopprettar tilkoplinga til blokka di …", "pad.modals.forcereconnect": "Tving gjentilkopling", "pad.modals.userdup": "Opna i eit anna vindauge", - "pad.modals.userdup.explanation": "Det ser ut som om denne blokka er open i meir enn eitt nettlesarvindauge p\u00e5 denne maskinen.", - "pad.modals.userdup.advice": "Kopla til om att for \u00e5 bruka dette vinduage i staden.", + "pad.modals.userdup.explanation": "Det ser ut som om denne blokka er open i meir enn eitt nettlesarvindauge på denne maskinen.", + "pad.modals.userdup.advice": "Kopla til om att for å bruka dette vinduage i staden.", "pad.modals.unauth": "Ikkje tillate", - "pad.modals.unauth.explanation": "Rettane dine blei endra under visning av denne sida. Pr\u00f8v \u00e5 kopla til p\u00e5 nytt.", - "pad.modals.looping": "Fr\u00e5kopla.", + "pad.modals.unauth.explanation": "Rettane dine blei endra under visning av denne sida. Prøv å kopla til på nytt.", "pad.modals.looping.explanation": "Det oppstod kommunikasjonsproblem med synkroniseringstenaren.", "pad.modals.looping.cause": "Kanskje du kopla til gjennom ein inkompatibel brannmur eller mellomtenar.", - "pad.modals.initsocketfail": "Klarte ikkje \u00e5 n\u00e5 tenaren.", - "pad.modals.initsocketfail.explanation": "Klarte ikkje \u00e5 kopla til synkroniseringstenaren.", - "pad.modals.initsocketfail.cause": "Dette er sannsynlegvis p\u00e5 grunn av eit problem med nettlesaren eller internettilkoplinga di.", - "pad.modals.slowcommit": "Fr\u00e5kopla.", + "pad.modals.initsocketfail": "Klarte ikkje å nå tenaren.", + "pad.modals.initsocketfail.explanation": "Klarte ikkje å kopla til synkroniseringstenaren.", + "pad.modals.initsocketfail.cause": "Dette er sannsynlegvis på grunn av eit problem med nettlesaren eller internettilkoplinga di.", "pad.modals.slowcommit.explanation": "Tenaren svarer ikkje.", - "pad.modals.slowcommit.cause": "Dette kan vera p\u00e5 grunn av problem med nettilkoplinga.", + "pad.modals.slowcommit.cause": "Dette kan vera på grunn av problem med nettilkoplinga.", "pad.modals.deleted": "Sletta.", "pad.modals.deleted.explanation": "Denne blokka er fjerna.", - "pad.modals.disconnected": "Du blei fr\u00e5kopla.", + "pad.modals.disconnected": "Du blei fråkopla.", "pad.modals.disconnected.explanation": "Mista tilkoplinga til tenaren", "pad.modals.disconnected.cause": "Tenaren er ikkje tilgjengeleg. Ver venleg og gi oss ei melding om dette skjer fleire gonger.", "pad.share": "Del denne blokka", @@ -83,10 +81,10 @@ "timeslider.toolbar.authors": "Forfattarar:", "timeslider.toolbar.authorsList": "Ingen forfattarar", "timeslider.toolbar.exportlink.title": "Eksporter", - "timeslider.exportCurrent": "Eksporter denne utg\u00e5va som:", - "timeslider.version": "Utg\u00e5ve {{version}}", + "timeslider.exportCurrent": "Eksporter denne utgåva som:", + "timeslider.version": "Utgåve {{version}}", "timeslider.saved": "Lagra {{day}}. {{month}}, {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}.{{minutes}}.{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", "timeslider.month.january": "januar", "timeslider.month.february": "februar", "timeslider.month.march": "mars", @@ -99,7 +97,7 @@ "timeslider.month.october": "oktober", "timeslider.month.november": "november", "timeslider.month.december": "desember", - "pad.savedrevs.marked": "Denne utg\u00e5va er no merkt som ei lagra utg\u00e5ve", + "pad.savedrevs.marked": "Denne utgåva er no merkt som ei lagra utgåve", "pad.userlist.entername": "Skriv namnet ditt", "pad.userlist.unnamed": "utan namn", "pad.userlist.guest": "Gjest", @@ -107,11 +105,11 @@ "pad.userlist.approve": "Godkjenn", "pad.editbar.clearcolors": "Fjern forfattarfargar i heile dokumentet?", "pad.impexp.importbutton": "Importer no", - "pad.impexp.importing": "Importerer \u2026", - "pad.impexp.confirmimport": "Viss du importerer ei fil, vil denne blokka bli overskriven. Er du sikker p\u00e5 at du vil fortsetja?", - "pad.impexp.convertFailed": "Me klarte ikkje \u00e5 importera denne fila. Ver venleg og bruk eit anna dokumentformat, eller kopier og lim inn for hand.", - "pad.impexp.uploadFailed": "Feil ved opplasting, ver venleg og pr\u00f8v om att", + "pad.impexp.importing": "Importerer …", + "pad.impexp.confirmimport": "Viss du importerer ei fil, vil denne blokka bli overskriven. Er du sikker på at du vil fortsetja?", + "pad.impexp.convertFailed": "Me klarte ikkje å importera denne fila. Ver venleg og bruk eit anna dokumentformat, eller kopier og lim inn for hand.", + "pad.impexp.uploadFailed": "Feil ved opplasting, ver venleg og prøv om att", "pad.impexp.importfailed": "Feil ved importering", "pad.impexp.copypaste": "Ver venleg og kopier og lim inn", "pad.impexp.exportdisabled": "Eksport av {{type}} er skrudd av. Ver venleg og ta kontakt med systemadministrator for meir informasjon." -}
\ No newline at end of file +} diff --git a/src/locales/oc.json b/src/locales/oc.json index 08390825..5921f4ff 100644 --- a/src/locales/oc.json +++ b/src/locales/oc.json @@ -4,74 +4,77 @@ "Cedric31" ] }, - "index.newPad": "Pad nov\u00e8l", - "index.createOpenPad": "o crear\/dobrir un Pad intitulat :", + "index.newPad": "Pad novèl", + "index.createOpenPad": "o crear/dobrir un Pad intitulat :", "pad.toolbar.bold.title": "Gras (Ctrl-B)", "pad.toolbar.italic.title": "Italica (Ctrl-I)", "pad.toolbar.underline.title": "Soslinhat (Ctrl-U)", "pad.toolbar.strikethrough.title": "Raiat", "pad.toolbar.ol.title": "Lista ordenada", "pad.toolbar.ul.title": "Lista amb de piuses", - "pad.toolbar.indent.title": "Indentar", - "pad.toolbar.unindent.title": "Desindentar", + "pad.toolbar.indent.title": "Indentar (TAB)", + "pad.toolbar.unindent.title": "Desindentar (Maj+TAB)", "pad.toolbar.undo.title": "Anullar (Ctrl-Z)", "pad.toolbar.redo.title": "Restablir (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Escafar las colors qu'identifican los autors", - "pad.toolbar.import_export.title": "Importar\/Exportar de\/cap a un format de fichi\u00e8r diferent", + "pad.toolbar.import_export.title": "Importar/Exportar de/cap a un format de fichièr diferent", "pad.toolbar.timeslider.title": "Istoric dinamic", - "pad.toolbar.savedRevision.title": "Versions enregistradas", - "pad.toolbar.settings.title": "Param\u00e8tres", - "pad.toolbar.embed.title": "Integrar aqueste Pad", + "pad.toolbar.savedRevision.title": "Enregistrar la revision", + "pad.toolbar.settings.title": "Paramètres", + "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", "pad.loading": "Cargament...", - "pad.passwordRequired": "Av\u00e8tz besonh d'un senhal per accedir a aqueste Pad", - "pad.permissionDenied": "Vos es pas perm\u00e9s d\u2019accedir a aqueste Pad.", - "pad.wrongPassword": "Senhal incorr\u00e8cte", - "pad.settings.padSettings": "Param\u00e8tres del Pad", + "pad.passwordRequired": "Avètz besonh d'un senhal per accedir a aqueste Pad", + "pad.permissionDenied": "Vos es pas permés d’accedir a aqueste Pad.", + "pad.wrongPassword": "Senhal incorrècte", + "pad.settings.padSettings": "Paramètres del Pad", "pad.settings.myView": "Ma vista", "pad.settings.stickychat": "Afichar totjorn lo chat", - "pad.settings.colorcheck": "Colors d\u2019identificacion", - "pad.settings.linenocheck": "Num\u00e8ros de linhas", - "pad.settings.fontType": "Tipe de poli\u00e7a :", + "pad.settings.colorcheck": "Colors d’identificacion", + "pad.settings.linenocheck": "Numèros de linhas", + "pad.settings.rtlcheck": "Lectura de drecha a esquèrra", + "pad.settings.fontType": "Tipe de poliça :", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Vista d\u2019ensemble", + "pad.settings.globalView": "Vista d’ensemble", "pad.settings.language": "Lenga :", - "pad.importExport.import_export": "Importar\/Exportar", - "pad.importExport.import": "Cargar un t\u00e8xte o un document", + "pad.importExport.import_export": "Importar/Exportar", + "pad.importExport.import": "Cargar un tèxte o un document", "pad.importExport.importSuccessful": "Capitat !", "pad.importExport.export": "Exportar lo Pad actual coma :", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "T\u00e8xte brut", + "pad.importExport.exportplain": "Tèxte brut", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Pod\u00e8tz pas importar que de formats t\u00e8xte brut o html. Per de foncionalitats d'importacion mai evoluadas, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installatz abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Podètz pas importar que de formats tèxte brut o html. Per de foncionalitats d'importacion mai evoluadas, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installatz abiword</a>.", "pad.modals.connected": "Connectat.", - "pad.modals.reconnecting": "Reconnexion cap a v\u00f2stre Pad...", - "pad.modals.forcereconnect": "For\u00e7ar la reconnexion.", - "pad.modals.userdup": "Dob\u00e8rt dins una autra fen\u00e8stra", - "pad.modals.userdup.explanation": "Sembla qu'aqueste Pad es dob\u00e8rt dins mai d'una fen\u00e8stra de v\u00f2stre navigador sus aqueste ordenador.", - "pad.modals.userdup.advice": "Se reconnectar en utilizant aquesta fen\u00e8stra.", + "pad.modals.reconnecting": "Reconnexion cap a vòstre Pad...", + "pad.modals.forcereconnect": "Forçar la reconnexion.", + "pad.modals.userdup": "Dobèrt dins una autra fenèstra", + "pad.modals.userdup.explanation": "Sembla qu'aqueste Pad es dobèrt dins mai d'una fenèstra de vòstre navigador sus aqueste ordenador.", + "pad.modals.userdup.advice": "Se reconnectar en utilizant aquesta fenèstra.", "pad.modals.unauth": "Pas autorizat", - "pad.modals.unauth.explanation": "V\u00f2stras permissions son estadas cambiadas al moment de l'afichatge d'aquesta pagina. Ensajatz de vos reconnectar.", - "pad.modals.looping": "Desconnectat", - "pad.modals.looping.explanation": "Av\u00e8m un probl\u00e8ma de comunicacion amb lo servidor de sincronizacion.", - "pad.modals.looping.cause": "Es possible que v\u00f2stra connexion si\u00e1 protegida per un parafu\u00f2c incompatible o un servidor proxy incompatible.", + "pad.modals.unauth.explanation": "Vòstras permissions son estadas cambiadas al moment de l'afichatge d'aquesta pagina. Ensajatz de vos reconnectar.", + "pad.modals.looping.explanation": "Avèm un problèma de comunicacion amb lo servidor de sincronizacion.", + "pad.modals.looping.cause": "Es possible que vòstra connexion siá protegida per un parafuòc incompatible o un servidor proxy incompatible.", "pad.modals.initsocketfail": "Lo servidor es introbable.", "pad.modals.initsocketfail.explanation": "Impossible de se connectar al servidor de sincronizacion.", - "pad.modals.initsocketfail.cause": "Lo probl\u00e8ma p\u00f2t venir de v\u00f2stre navigador web o de v\u00f2stra connexion Internet.", - "pad.modals.slowcommit": "Desconnectat", + "pad.modals.initsocketfail.cause": "Lo problèma pòt venir de vòstre navigador web o de vòstra connexion Internet.", "pad.modals.slowcommit.explanation": "Lo servidor respond pas.", - "pad.modals.slowcommit.cause": "Aqueste probl\u00e8ma p\u00f2t venir d'una marrida connectivitat a la ret.", + "pad.modals.slowcommit.cause": "Aqueste problèma pòt venir d'una marrida connectivitat a la ret.", + "pad.modals.badChangeset.explanation": "Una modificacion qu'avètz efectuada es estada classada coma illegala pel servidor de sincronizacion.", + "pad.modals.badChangeset.cause": "Aquò pòt èsser degut a una marrida configuracion del servidor o a un autre comportament inesperat. Contactatz l’administrator del servici, si pensatz qu’es una error. Ensajatz de vos reconnectar per contunhar de modificar.", + "pad.modals.corruptPad.explanation": "Lo blòt al qual ensajatz d’accedir es corromput.", + "pad.modals.corruptPad.cause": "Aquò pòt èsser degut a una marrida configuracion del servidor o a un autre comportament inesperat. Contactatz l’administrator del servici.", "pad.modals.deleted": "Suprimit.", "pad.modals.deleted.explanation": "Aqueste Pad es estat suprimit.", - "pad.modals.disconnected": "S\u00e8tz estat desconnectat.", + "pad.modals.disconnected": "Sètz estat desconnectat.", "pad.modals.disconnected.explanation": "La connexion al servidor a fracassat.", - "pad.modals.disconnected.cause": "Es possible que lo servidor si\u00e1 indisponible. Informatz-nos-ne se lo probl\u00e8ma persist\u00eds.", + "pad.modals.disconnected.cause": "Es possible que lo servidor siá indisponible. Se lo problèma contunha, informatz-ne l'administrator del servici.", "pad.share": "Partejar aqueste Pad", "pad.share.readonly": "Lectura sola", "pad.share.link": "Ligam", @@ -84,13 +87,13 @@ "timeslider.toolbar.authors": "Autors :", "timeslider.toolbar.authorsList": "Pas cap d'autor", "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar la version actuala en\u00a0:", + "timeslider.exportCurrent": "Exportar la version actuala en :", "timeslider.version": "Version {{version}}", "timeslider.saved": "Enregistrat lo {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Geni\u00e8r", - "timeslider.month.february": "Febri\u00e8r", - "timeslider.month.march": "Mar\u00e7", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Genièr", + "timeslider.month.february": "Febrièr", + "timeslider.month.march": "Març", "timeslider.month.april": "Abril", "timeslider.month.may": "Mai", "timeslider.month.june": "Junh", @@ -100,19 +103,20 @@ "timeslider.month.october": "Octobre", "timeslider.month.november": "Novembre", "timeslider.month.december": "Decembre", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anonim, other: autors anonims ]}", "pad.savedrevs.marked": "Aquesta revision es ara marcada coma revision enregistrada", - "pad.userlist.entername": "Entratz v\u00f2stre nom", + "pad.userlist.entername": "Entratz vòstre nom", "pad.userlist.unnamed": "sens nom", "pad.userlist.guest": "Convidat", "pad.userlist.deny": "Refusar", "pad.userlist.approve": "Aprovar", "pad.editbar.clearcolors": "Escafar las colors de paternitat dins tot lo document ?", "pad.impexp.importbutton": "Importar ara", - "pad.impexp.importing": "Imp\u00f2rt en cors...", - "pad.impexp.confirmimport": "Importar un fichi\u00e8r espotir\u00e0 lo t\u00e8xte actual del bl\u00f2t. S\u00e8tz segur que lo vol\u00e8tz far ?", - "pad.impexp.convertFailed": "Pod\u00e8m pas importar aqueste fichi\u00e8r. Utilizatz un autre format de document o fas\u00e8tz un copiar\/pegar manual", + "pad.impexp.importing": "Impòrt en cors...", + "pad.impexp.confirmimport": "Importar un fichièr espotirà lo tèxte actual del blòt. Sètz segur que lo volètz far ?", + "pad.impexp.convertFailed": "Podèm pas importar aqueste fichièr. Utilizatz un autre format de document o fasètz un copiar/pegar manual", "pad.impexp.uploadFailed": "Lo telecargament a fracassat, reensajatz", - "pad.impexp.importfailed": "Frac\u00e0s de l'importacion", - "pad.impexp.copypaste": "Copiatz\/pegatz", - "pad.impexp.exportdisabled": "Exportar al format {{type}} es desactivat. Contactatz v\u00f2stre administrator del sist\u00e8ma per mai de detalhs." -}
\ No newline at end of file + "pad.impexp.importfailed": "Fracà s de l'importacion", + "pad.impexp.copypaste": "Copiatz/pegatz", + "pad.impexp.exportdisabled": "Exportar al format {{type}} es desactivat. Contactatz vòstre administrator del sistèma per mai de detalhs." +} diff --git a/src/locales/os.json b/src/locales/os.json index 64b3ea2a..109dada7 100644 --- a/src/locales/os.json +++ b/src/locales/os.json @@ -4,117 +4,115 @@ "Bouron" ] }, - "index.newPad": "\u041d\u043e\u0433", - "index.createOpenPad": "\u043a\u04d5\u043d\u04d5 \u0441\u0430\u0440\u0430\u0437\/\u0431\u0430\u043a\u04d5\u043d \u043d\u043e\u0433 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0430\u0445\u04d5\u043c \u043d\u043e\u043c\u0438\u043c\u04d5:", - "pad.toolbar.bold.title": "\u0411\u04d5\u0437\u0434\u0436\u044b\u043d (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u044a\u04d5\u0434\u0437 (Ctrl-I)", - "pad.toolbar.underline.title": "\u0411\u044b\u043d\u044b\u043b\u0445\u0430\u0445\u0445 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0425\u0430\u0445\u0445", - "pad.toolbar.ol.title": "\u041d\u044b\u043c\u0430\u0434 \u043d\u043e\u043c\u0445\u044b\u0433\u044a\u0434", - "pad.toolbar.ul.title": "\u04d4\u043d\u04d5\u043d\u044b\u043c\u0430\u0434 \u043d\u043e\u043c\u0445\u044b\u0433\u044a\u0434", - "pad.toolbar.indent.title": "\u0425\u0430\u0441\u0442", - "pad.toolbar.unindent.title": "\u04d4\u0442\u0442\u04d5\u043c\u04d5\u0445\u0430\u0441\u0442", - "pad.toolbar.undo.title": "\u0420\u0430\u0437\u0434\u04d5\u0445\u044b\u043d (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0420\u0430\u0446\u0430\u0440\u0430\u0437\u044b\u043d (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5 \u0430\u0439\u0441\u044b\u043d\u04d5\u043d", - "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u0439\/\u0444\u043e\u0440\u043c\u0430\u0442\u0442\u04d5\u043c", - "pad.toolbar.timeslider.title": "\u0420\u04d5\u0441\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", - "pad.toolbar.savedRevision.title": "\u0424\u04d5\u043b\u0442\u04d5\u0440 \u0431\u0430\u0432\u04d5\u0440\u044b\u043d\u04d5\u043d", - "pad.toolbar.settings.title": "\u0423\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u04d5", - "pad.toolbar.embed.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0444\u0442\u0430\u0443\u044b\u043d", - "pad.toolbar.showusers.title": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0440\u0445\u0430\u0439\u0434\u0436\u044b\u0442\u044b \u0440\u0430\u0432\u0434\u0438\u0441\u044b\u043d", - "pad.colorpicker.save": "\u041d\u044b\u0432\u00e6\u0440\u044b\u043d", - "pad.colorpicker.cancel": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", - "pad.loading": "\u00c6\u0432\u0433\u00e6\u0434 \u0446\u00e6\u0443\u044b...", - "pad.passwordRequired": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u0440\u044b\u0432\u043d\u0430\u043b\u044b\u043d\u04d5\u043d \u0434\u04d5 \u0445\u044a\u04d5\u0443\u044b \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.permissionDenied": "\u0414\u04d5\u0443\u04d5\u043d \u043d\u04d5\u0439 \u0431\u0430\u0440 \u0430\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u0440\u044b\u0432\u043d\u0430\u043b\u044b\u043d", - "pad.wrongPassword": "\u0414\u04d5 \u043f\u0430\u0440\u043e\u043b\u044c \u0440\u0430\u0441\u0442 \u043d\u04d5\u0443", - "pad.settings.padSettings": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u0430\u0433\u04d5\u0432\u04d5\u0440\u0434\u0442\u044b\u0442\u04d5", - "pad.settings.myView": "\u041c\u04d5 \u0443\u044b\u043d\u0434", - "pad.settings.stickychat": "\u041d\u044b\u0445\u0430\u0441 \u0430\u043b\u043a\u0443\u044b\u0434\u04d5\u0440 \u04d5\u0432\u0434\u0438\u0441\u044b\u043d", - "pad.settings.colorcheck": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b \u0445\u0443\u044b\u0437\u0442\u04d5", - "pad.settings.linenocheck": "\u0420\u04d5\u043d\u0445\u044a\u044b\u0442\u044b \u043d\u043e\u043c\u044b\u0440\u0442\u04d5", - "pad.settings.fontType": "\u0428\u0440\u0438\u0444\u0442\u044b \u0445\u0443\u044b\u0437:", - "pad.settings.fontType.normal": "\u0425\u0443\u044b\u043c\u04d5\u0442\u04d5\u0433", - "pad.settings.fontType.monospaced": "\u04d4\u043c\u0443\u04d5\u0440\u04d5\u0445", - "pad.settings.globalView": "\u0418\u0443\u0443\u044b\u043b\u044b \u0443\u044b\u043d\u0434", - "pad.settings.language": "\u00c6\u0432\u0437\u0430\u0433:", - "pad.importExport.import_export": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442", - "pad.importExport.import": "\u0418\u0441\u0442\u044b \u0442\u0435\u043a\u0441\u0442 \u0444\u0430\u0439\u043b \u043a\u04d5\u043d\u04d5 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", - "pad.importExport.importSuccessful": "\u04d4\u043d\u0442\u044b\u0441\u0442!", - "pad.importExport.export": "\u041d\u044b\u0440\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u044d\u043a\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u043a\u0443\u044b\u0434:", + "index.newPad": "Ðог", + "index.createOpenPad": "кӕнӕ Ñараз/бакӕн ног документ ахӕм номимӕ:", + "pad.toolbar.bold.title": "Бӕзджын (Ctrl-B)", + "pad.toolbar.italic.title": "Къӕдз (Ctrl-I)", + "pad.toolbar.underline.title": "Бынылхахх (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Хахх", + "pad.toolbar.ol.title": "Ðымад номхыгъд", + "pad.toolbar.ul.title": "Ӕнӕнымад номхыгъд", + "pad.toolbar.indent.title": "ХаÑÑ‚", + "pad.toolbar.unindent.title": "ӔттӕмӕхаÑÑ‚", + "pad.toolbar.undo.title": "Раздӕхын (Ctrl-Z)", + "pad.toolbar.redo.title": "Рацаразын (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "ФыÑÑӕджы ныÑӕнттӕ айÑынӕн", + "pad.toolbar.import_export.title": "Импорт/ÑкÑпорт ӕндӕр файлы форматтӕй/форматтӕм", + "pad.toolbar.timeslider.title": "Ð Ó•Ñтӕджы хахх", + "pad.toolbar.savedRevision.title": "Фӕлтӕр бавӕрынӕн", + "pad.toolbar.settings.title": "Уагӕвӕрдтӕ", + "pad.toolbar.embed.title": "Ðцы документ бафтау æмæ йæ тыххæй ахъæр кæн", + "pad.toolbar.showusers.title": "Ðцы документы архайджыты равдиÑын", + "pad.colorpicker.save": "Ðывæрын", + "pad.colorpicker.cancel": "Ðыууадзын", + "pad.loading": "Æвгæд цæуы...", + "pad.passwordRequired": "Ðцы документмӕ рывналынӕн дӕ хъӕуы пароль", + "pad.permissionDenied": "Дӕуӕн нӕй бар ацы документмӕ рывналын", + "pad.wrongPassword": "Дӕ пароль раÑÑ‚ нӕу", + "pad.settings.padSettings": "Документы уагӕвӕрдтытӕ", + "pad.settings.myView": "Мӕ уынд", + "pad.settings.stickychat": "ÐÑ‹Ñ…Ð°Ñ Ð°Ð»ÐºÑƒÑ‹Ð´Ó•Ñ€ ӕвдиÑын", + "pad.settings.colorcheck": "ФыÑÑӕджы хуызтӕ", + "pad.settings.linenocheck": "Рӕнхъыты номыртӕ", + "pad.settings.rtlcheck": "ÐœÐ¸Ð´Ð¸Ñ Ñ€Ð°Ñ…Ð¸Ð·Ó•Ð¹ галиумӕ хъӕуы Ñ„Ó•Ñ€Ñын?", + "pad.settings.fontType": "Шрифты хуыз:", + "pad.settings.fontType.normal": "Хуымӕтӕг", + "pad.settings.fontType.monospaced": "Ӕмуӕрӕх", + "pad.settings.globalView": "Иууылы уынд", + "pad.settings.language": "Æвзаг:", + "pad.importExport.import_export": "Импорт/ÑкÑпорт", + "pad.importExport.import": "ИÑÑ‚Ñ‹ текÑÑ‚ файл кӕнӕ документ бавгӕнын", + "pad.importExport.importSuccessful": "ӔнтыÑÑ‚!", + "pad.importExport.export": "Ðыры документ ÑÑкпорт кӕнын куыд:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0425\u0443\u044b\u043c\u00e6\u0442\u00e6\u0433 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportplain": "Хуымæтæг текÑÑ‚", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0414\u04d5 \u0431\u043e\u043d \u0443 \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u04d5\u0440\u043c\u04d5\u0441\u0442 \u0445\u0443\u044b\u043c\u04d5\u0442\u04d5\u0433 \u0442\u0435\u043a\u0441\u0442 \u043a\u04d5\u043d\u04d5 html \u0444\u043e\u0440\u043c\u0430\u0442\u04d5\u0439. \u041b\u04d5\u043c\u0431\u044b\u043d\u04d5\u0433 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u043c\u0438\u043d\u0438\u0443\u0434\u0436\u044b\u0442\u04d5\u043d, \u0434\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u0441\u04d5\u0432\u04d5\u0440 abiword<\/a>.", - "pad.modals.connected": "\u0418\u0443\u0433\u043e\u043d\u0434.", - "pad.modals.reconnecting": "\u0414\u04d5 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5 \u043d\u043e\u0433\u04d5\u0439 \u0438\u0443\u0433\u043e\u043d\u0434 \u0446\u04d5\u0443\u044b..", - "pad.modals.forcereconnect": "\u0422\u044b\u0445\u0445\u04d5\u0439 \u0431\u0430\u0438\u0443 \u043a\u04d5\u043d\u044b\u043d", - "pad.modals.userdup": "\u041d\u043e\u0433 \u0440\u0443\u0434\u0437\u044b\u043d\u0434\u0436\u044b \u0431\u0430\u043a\u04d5\u043d\u044b\u043d", - "pad.modals.userdup.explanation": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u04d5\u0432\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0430\u0446\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0438\u0443\u04d5\u0439 \u0444\u044b\u043b\u0434\u04d5\u0440 \u0440\u0443\u0434\u0437\u044b\u043d\u0434\u0436\u044b \u0443 \u0433\u043e\u043c.", - "pad.modals.userdup.advice": "\u041d\u043e\u0433\u04d5\u0439 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d, \u0430\u0446\u044b \u0440\u0443\u0434\u0437\u044b\u043d\u0433\u04d5\u0439 \u0430\u0440\u0445\u0430\u0439\u044b\u043d\u044b \u0431\u04d5\u0441\u0442\u044b.", - "pad.modals.unauth": "\u041d\u04d5 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0433\u043e\u043d\u0434", - "pad.modals.unauth.explanation": "\u0414\u04d5 \u0431\u0430\u0440\u0442\u04d5 \u0444\u04d5\u0438\u0432\u0442\u043e\u0439, \u0446\u0430\u043b\u044b\u043d\u043c\u04d5 \u0434\u044b \u0430\u0446\u044b \u0444\u0430\u0440\u0441 \u043a\u0430\u0441\u0442\u04d5. \u0411\u0430\u0444\u04d5\u043b\u0432\u0430\u0440 \u043d\u043e\u0433\u04d5\u0439 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d.", - "pad.modals.looping": "\u0425\u0438\u0446\u04d5\u043d.", - "pad.modals.looping.explanation": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0439\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0438\u043c\u04d5 \u0431\u0430\u0438\u0443 \u043a\u04d5\u043d\u044b\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u04d5.", - "pad.modals.looping.cause": "\u0423\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0434\u044b \u0431\u0430\u0438\u0443 \u0434\u04d5 \u04d5\u043d\u04d5\u043c\u0431\u04d5\u043b\u0433\u04d5 \u0444\u0430\u0439\u0440\u0432\u043e\u043b \u043a\u04d5\u043d\u04d5 \u043f\u0440\u043e\u043a\u0441\u0438\u0439\u044b \u0443\u044b\u043b\u0442\u044b.", - "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0431\u0430\u0438\u0443\u0433\u04d5\u043d\u04d5\u043d \u043d\u04d5\u0439.", - "pad.modals.initsocketfail.explanation": "\u041d\u04d5 \u0440\u0430\u0443\u0430\u0434\u0438\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0439\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0431\u0430\u0438\u0443 \u0443\u044b\u043d.", - "pad.modals.initsocketfail.cause": "\u0410\u0439 \u0443\u04d5\u0446\u0446\u04d5\u0433\u04d5\u043d \u0434\u04d5 \u0441\u0433\u0430\u0440\u04d5\u043d \u043a\u04d5\u043d\u04d5 \u0434\u04d5 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u044b \u0442\u044b\u0445\u0445\u04d5\u0439 \u0443.", - "pad.modals.slowcommit": "\u0425\u0438\u0446\u04d5\u043d\u0433\u043e\u043d\u0434.", - "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u04d5 \u0434\u0437\u0443\u0430\u043f\u043f \u043a\u04d5\u043d\u044b.", - "pad.modals.slowcommit.cause": "\u0410\u0439 \u0433\u04d5\u043d\u04d5\u043d \u0438\u0441 \u0443 \u0445\u044b\u0437\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u04d5\u0439\u044b \u0442\u044b\u0445\u0445\u04d5\u0439.", - "pad.modals.deleted": "\u0425\u0430\u0444\u0442.", - "pad.modals.deleted.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0445\u0430\u0444\u0442 \u04d5\u0440\u0446\u044b\u0434.", - "pad.modals.disconnected": "\u0414\u044b \u0445\u0438\u0446\u04d5\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434\u0442\u04d5.", - "pad.modals.disconnected.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440\u0438\u043c\u04d5 \u0438\u0443\u0433\u043e\u043d\u0434 \u0444\u0435\u0441\u04d5\u0444\u0442\u0438\u0441", - "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440\u043c\u04d5 \u0433\u04d5\u043d\u04d5\u043d \u0438\u0441 \u0431\u0430\u0438\u0443\u0433\u04d5\u043d\u04d5\u043d \u043d\u04d5\u0439. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0444\u0435\u0445\u044a\u0443\u0441\u044b\u043d \u043d\u044b\u043d \u04d5\u0439 \u043a\u04d5\u043d, \u043a\u04d5\u0434 \u0430\u0444\u0442\u04d5 \u0434\u0430\u0440\u0434\u0434\u04d5\u0440 \u043a\u04d5\u043d\u0430.", - "pad.share": "\u0410\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u0439\u0443\u0430\u0440\u044b\u043d", - "pad.share.readonly": "\u04d4\u0440\u043c\u04d5\u0441\u0442 \u0444\u04d5\u0440\u0441\u044b\u043d\u04d5\u043d", - "pad.share.link": "\u04d4\u0440\u0432\u0438\u0442\u04d5\u043d", - "pad.share.emebdcode": "URL \u0431\u0430\u0432\u04d5\u0440\u044b\u043d", - "pad.chat": "\u041d\u044b\u0445\u0430\u0441", - "pad.chat.title": "\u041e\u0446\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u043d \u0447\u0430\u0442 \u0431\u0430\u043a\u04d5\u043d.", - "pad.chat.loadmessages": "\u0424\u044b\u043b\u0434\u04d5\u0440 \u0444\u044b\u0441\u0442\u04d5\u0433 \u0440\u0430\u0432\u0433\u04d5\u043d\u044b\u043d", - "timeslider.pageTitle": "{{appTitle}}-\u044b \u0440\u04d5\u0442\u04d5\u0434\u0436\u044b \u0445\u0430\u0445\u0445", - "timeslider.toolbar.returnbutton": "\u0424\u04d5\u0441\u0442\u04d5\u043c\u04d5, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043c\u04d5", - "timeslider.toolbar.authors": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5:", - "timeslider.toolbar.authorsList": "\u0424\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u04d5 \u043d\u04d5\u0439", - "timeslider.toolbar.exportlink.title": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442", - "timeslider.exportCurrent": "\u0421\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d \u043d\u044b\u0440\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043a\u0443\u044b\u0434:", - "timeslider.version": "\u0412\u0435\u0440\u0441\u0438 {{version}}", - "timeslider.saved": "\u04d4\u0432\u04d5\u0440\u0434 \u04d5\u0440\u0446\u044b\u0434 {{year}}-\u04d5\u043c \u0430\u0437\u044b, {{day}}-\u04d5\u043c {{month}}-\u044b", + "pad.importExport.abiword.innerHTML": "Дӕ бон у импорт кӕнын ӕрмӕÑÑ‚ хуымӕтӕг текÑÑ‚ кӕнӕ html форматӕй. Лӕмбынӕг импорты миниуджытӕн, дӕ хорзӕхӕй, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Ñӕвӕр abiword</a>.", + "pad.modals.connected": "Иугонд.", + "pad.modals.reconnecting": "Дӕ документмӕ ногӕй иугонд цӕуы..", + "pad.modals.forcereconnect": "Тыххӕй баиу кӕнын", + "pad.modals.userdup": "Ðог рудзынджы бакӕнын", + "pad.modals.userdup.explanation": "Ðцы документ ӕвӕццӕгӕн ацы компьютеры иуӕй фылдӕр рудзынджы у гом.", + "pad.modals.userdup.advice": "Ðогӕй баиу уын, ацы рудзынгӕй архайыны бӕÑÑ‚Ñ‹.", + "pad.modals.unauth": "ÐÓ• авторизацигонд", + "pad.modals.unauth.explanation": "Дӕ бартӕ фӕивтой, цалынмӕ ды ацы Ñ„Ð°Ñ€Ñ ÐºÐ°ÑÑ‚Ó•. Бафӕлвар ногӕй баиу уын.", + "pad.modals.looping.explanation": "Синхронизацийы Ñерверимӕ баиу кӕныны проблемӕ.", + "pad.modals.looping.cause": "Уӕццӕгӕн ды баиу дӕ ӕнӕмбӕлгӕ файрвол кӕнӕ прокÑийы уылты.", + "pad.modals.initsocketfail": "Сервермӕ баиугӕнӕн нӕй.", + "pad.modals.initsocketfail.explanation": "ÐÓ• Ñ€Ð°ÑƒÐ°Ð´Ð¸Ñ Ñинхронизацийы Ñервермӕ баиу уын.", + "pad.modals.initsocketfail.cause": "Ðй уӕццӕгӕн дӕ Ñгарӕн кӕнӕ дӕ интернеты тыххӕй у.", + "pad.modals.slowcommit.explanation": "Сервер нӕ дзуапп кӕны.", + "pad.modals.slowcommit.cause": "Ðй гӕнӕн Ð¸Ñ Ñƒ хызы проблемӕйы тыххӕй.", + "pad.modals.deleted": "Хафт.", + "pad.modals.deleted.explanation": "Документ хафт ӕрцыд.", + "pad.modals.disconnected": "Ды хицӕнгонд ӕрцыдтӕ.", + "pad.modals.disconnected.explanation": "Серверимӕ иугонд феÑӕфтиÑ", + "pad.modals.disconnected.cause": "Сервермӕ гӕнӕн Ð¸Ñ Ð±Ð°Ð¸ÑƒÐ³Ó•Ð½Ó•Ð½ нӕй. Дӕ хорзӕхӕй, фехъуÑын нын ӕй кӕн, кӕд афтӕ дарддӕр кӕна.", + "pad.share": "Ðцы документ райуарын", + "pad.share.readonly": "ӔрмӕÑÑ‚ Ñ„Ó•Ñ€Ñынӕн", + "pad.share.link": "Ӕрвитӕн", + "pad.share.emebdcode": "URL бавӕрын", + "pad.chat": "ÐыхаÑ", + "pad.chat.title": "Оцы документӕн чат бакӕн.", + "pad.chat.loadmessages": "Фылдӕр Ñ„Ñ‹Ñтӕг равгӕнын", + "timeslider.pageTitle": "{{appTitle}}-Ñ‹ рӕтӕджы хахх", + "timeslider.toolbar.returnbutton": "ФӕÑтӕмӕ, документмӕ", + "timeslider.toolbar.authors": "ФыÑÑӕджытӕ:", + "timeslider.toolbar.authorsList": "ФыÑÑӕджытӕ нӕй", + "timeslider.toolbar.exportlink.title": "ÐкÑпорт", + "timeslider.exportCurrent": "СÑкÑпорт кӕнын ныры фӕлтӕр куыд:", + "timeslider.version": "ВерÑи {{version}}", + "timeslider.saved": "Ӕвӕрд ӕрцыд {{year}}-ӕм азы, {{day}}-ӕм {{month}}-Ñ‹", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u044f\u043d\u0432\u0430\u0440\u044c", - "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0430\u043b\u044c", - "timeslider.month.march": "\u043c\u0430\u0440\u0442\u044a\u0438", - "timeslider.month.april": "\u0430\u043f\u0440\u0435\u043b\u044c", - "timeslider.month.may": "\u043c\u0430\u0439", - "timeslider.month.june": "\u0438\u044e\u043d\u044c", - "timeslider.month.july": "\u0438\u044e\u043b\u044c", - "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", - "timeslider.month.september": "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", - "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", - "timeslider.unnamedauthor": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0433", - "timeslider.unnamedauthors": "{{num}} \u04d5\u043d\u04d5\u043d\u043e\u043c \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b", - "pad.savedrevs.marked": "\u0410\u0446\u044b \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0440 \u043a\u0443\u044b\u0434 \u04d5\u0432\u04d5\u0440\u0434 \u0444\u04d5\u043b\u0442\u04d5\u0440 \u043d\u044b\u0441\u0430\u043d\u0433\u043e\u043d\u0434 \u04d5\u0440\u0446\u044b\u0434", - "pad.userlist.entername": "\u0414\u04d5 \u043d\u043e\u043c \u0431\u0430\u0444\u044b\u0441\u0441", - "pad.userlist.unnamed": "\u04d5\u043d\u04d5\u043d\u043e\u043c", - "pad.userlist.guest": "\u0423\u0430\u0437\u04d5\u0433", - "pad.userlist.deny": "\u041d\u044b\u0443\u0443\u0430\u0434\u0437\u044b\u043d", - "pad.userlist.approve": "\u0421\u0431\u04d5\u043b\u0432\u044b\u0440\u0434 \u043a\u04d5\u043d\u044b\u043d", - "pad.editbar.clearcolors": "\u04d4\u043d\u04d5\u0445\u044a\u04d5\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u04d5\u0439 \u0445\u044a\u04d5\u0443\u044b \u0430\u0439\u0441\u044b\u043d \u0444\u044b\u0441\u0441\u04d5\u0434\u0436\u044b\u0442\u044b \u043d\u044b\u0441\u04d5\u043d\u0442\u0442\u04d5?", - "pad.impexp.importbutton": "\u0415\u043d\u044b\u0440 \u0441\u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d", - "pad.impexp.importing": "\u0418\u043c\u043f\u043e\u0440\u0442 \u0446\u04d5\u0443\u044b...", - "pad.impexp.confirmimport": "\u0424\u0430\u0439\u043b\u044b \u0438\u043c\u043f\u043e\u0440\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u044b\u0440\u044b \u0442\u0435\u043a\u0441\u0442 \u0431\u044b\u043d\u0442\u043e\u043d \u0444\u04d5\u0438\u0432\u0434\u0437\u04d5\u043d\u0438\u0441. \u04d4\u0446\u04d5\u0433 \u0434\u04d5 \u0444\u04d5\u043d\u0434\u044b \u0443\u044b\u0439 \u0441\u0430\u0440\u0430\u0437\u044b\u043d?", - "pad.impexp.convertFailed": "\u041c\u0430\u0445\u04d5\u043d \u043d\u04d5 \u0431\u043e\u043d \u043d\u0435 \u0441\u0441\u0438\u0441 \u0430\u0446\u044b \u0444\u0430\u0439\u043b \u0441\u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u04d5\u043d\u044b\u043d. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0441\u043f\u0430\u0439\u0434\u0430 \u043a\u04d5\u043d \u04d5\u043d\u0434\u04d5\u0440 \u0444\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u04d5\u0439, \u043a\u04d5\u043d\u04d5 \u0441\u043a\u044a\u043e\u043f\u0438 \u043a\u04d5\u043d \u04d5\u043c\u04d5 \u0431\u0430\u0442\u044b\u0441\u0441 \u0442\u0435\u043a\u0441\u0442 \u0434\u04d5\u0445\u04d5\u0434\u04d5\u0433.", - "pad.impexp.uploadFailed": "\u0411\u0430\u0432\u0433\u04d5\u043d\u044b\u043d \u043d\u04d5 \u0440\u0430\u0443\u0430\u0434, \u0434\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0444\u04d5\u0441\u0442\u04d5\u0434\u04d5\u0440 \u0431\u0430\u0444\u04d5\u043b\u0432\u0430\u0440", - "pad.impexp.importfailed": "\u0418\u043c\u043f\u043e\u0440\u0442 \u043d\u04d5 \u0440\u0430\u0443\u0430\u0434", - "pad.impexp.copypaste": "\u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u043a\u044a\u043e\u043f\u0438 \u043a\u04d5\u043d \u04d5\u043c\u04d5 \u04d5\u0432\u04d5\u0440", - "pad.impexp.exportdisabled": "{{type}} \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0445\u0438\u0446\u04d5\u043d \u0443. \u0414\u04d5 \u0445\u043e\u0440\u0437\u04d5\u0445\u04d5\u0439, \u0431\u0430\u0434\u0437\u0443\u0440 \u0434\u04d5 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u043d \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0442\u04d5\u043c \u0444\u044b\u043b\u0434\u04d5\u0440 \u0431\u0430\u0437\u043e\u043d\u044b\u043d\u04d5\u043d." -}
\ No newline at end of file + "timeslider.month.january": "Ñнварь", + "timeslider.month.february": "февраль", + "timeslider.month.march": "мартъи", + "timeslider.month.april": "апрель", + "timeslider.month.may": "май", + "timeslider.month.june": "июнь", + "timeslider.month.july": "июль", + "timeslider.month.august": "авгуÑÑ‚", + "timeslider.month.september": "ÑентÑбрь", + "timeslider.month.october": "октÑбрь", + "timeslider.month.november": "ноÑбрь", + "timeslider.month.december": "декабрь", + "timeslider.unnamedauthors": "{{num}} ӕнӕном Ñ„Ñ‹ÑÑӕджы", + "pad.savedrevs.marked": "Ðцы фӕлтӕр ныр куыд ӕвӕрд фӕлтӕр ныÑангонд ӕрцыд", + "pad.userlist.entername": "Дӕ ном бафыÑÑ", + "pad.userlist.unnamed": "ӕнӕном", + "pad.userlist.guest": "Уазӕг", + "pad.userlist.deny": "Ðыууадзын", + "pad.userlist.approve": "Сбӕлвырд кӕнын", + "pad.editbar.clearcolors": "Ӕнӕхъӕн документӕй хъӕуы айÑын Ñ„Ñ‹ÑÑӕджыты ныÑӕнттӕ?", + "pad.impexp.importbutton": "Еныр Ñимпорт кӕнын", + "pad.impexp.importing": "Импорт цӕуы...", + "pad.impexp.confirmimport": "Файлы импорт документы ныры текÑÑ‚ бынтон фӕивдзӕниÑ. Ӕцӕг дӕ фӕнды уый Ñаразын?", + "pad.impexp.convertFailed": "Махӕн нӕ бон не ÑÑÐ¸Ñ Ð°Ñ†Ñ‹ файл Ñимпорт кӕнын. Дӕ хорзӕхӕй, Ñпайда кӕн ӕндӕр файлы форматӕй, кӕнӕ Ñкъопи кӕн ӕмӕ батыÑÑ Ñ‚ÐµÐºÑÑ‚ дӕхӕдӕг.", + "pad.impexp.uploadFailed": "Бавгӕнын нӕ рауад, дӕ хорзӕхӕй, Ñ„Ó•Ñтӕдӕр бафӕлвар", + "pad.impexp.importfailed": "Импорт нӕ рауад", + "pad.impexp.copypaste": "Дӕ хорзӕхӕй, къопи кӕн ӕмӕ ӕвӕр", + "pad.impexp.exportdisabled": "{{type}} форматы ÑкÑпорт хицӕн у. Дӕ хорзӕхӕй, бадзур дӕ ÑиÑтемон админиÑтратортӕм фылдӕр базонынӕн." +} diff --git a/src/locales/pa.json b/src/locales/pa.json new file mode 100644 index 00000000..9a38bef6 --- /dev/null +++ b/src/locales/pa.json @@ -0,0 +1,104 @@ +{ + "@metadata": { + "authors": [ + "Aalam" + ] + }, + "index.newPad": "ਨਵਾਂ ਪੈਡ", + "index.createOpenPad": "ਜਾਂ ਨਾਂ ਨਾਲ ਨਵਾਂ ਪੈਡ ਬਣਾਓ/ਖੋਲà©à¨¹à©‹:", + "pad.toolbar.bold.title": "ਗੂੜà©à¨¹à¨¾ (Ctrl-B)", + "pad.toolbar.italic.title": "ਤਿਰਛਾ (Ctrl-I)", + "pad.toolbar.underline.title": "ਹੇਠਾਂ-ਰੇਖਾ (Ctrl-U)", + "pad.toolbar.strikethrough.title": "ਵਿੰਨà©à¨¹à©‹ ਵਿਨੋ", + "pad.toolbar.ol.title": "ਲੜੀਵਾਰ ਲਿਸਟ", + "pad.toolbar.ul.title": "ਬਿਨ-ਲੜੀਬੱਧ ਸੂਚੀ", + "pad.toolbar.indent.title": "ਹਾਸ਼ੀਠਤੋਂ ਦੂਰ", + "pad.toolbar.undo.title": "ਵਾਪਸ (Ctrl-Z)", + "pad.toolbar.redo.title": "ਪਰਤਾਓ (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "ਪਰਮਾਣਕਿਤਾ ਰੰਗ ਸਾਫ਼ ਕਰੋ", + "pad.toolbar.import_export.title": "ਵੱਖ-ਵੱਖ ਫਾਇਲ ਫਾਰਮੈਟ ਤੋਂ/ਵਿੱਚ ਇੰਪੋਰਟ/à¨à¨•à¨¸à¨ªà©‹à¨°à¨Ÿ ਕਰੋ", + "pad.toolbar.timeslider.title": "ਸਮਾਂ-ਲਕੀਰ", + "pad.toolbar.savedRevision.title": "ਰੀਵਿਜ਼ਨ ਸੰà¨à¨¾à¨²à©‹", + "pad.toolbar.settings.title": "ਸੈਟਿੰਗ", + "pad.toolbar.embed.title": "ਇਹ ਪੈਡ ਸਾਂà¨à¨¾ ਤੇ ਇੰਬੈੱਡ ਕਰੋ", + "pad.toolbar.showusers.title": "ਇਹ ਪੈਡ ਉੱਤੇ ਯੂਜ਼ਰ ਵੇਖਾਓ", + "pad.colorpicker.save": "ਸੰà¨à¨¾à¨²à©‹", + "pad.colorpicker.cancel": "ਰੱਦ ਕਰੋ", + "pad.loading": "…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ", + "pad.passwordRequired": "ਇਹ ਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਪਾਸਵਰਡ ਚਾਹੀਦਾ ਹੈ", + "pad.permissionDenied": "ਇਹ ਪੈਡ ਵਰਤਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ", + "pad.wrongPassword": "ਤà©à¨¹à¨¾à¨¡à¨¾ ਪਾਸਵਰਡ ਗਲਤੀ ਸੀ", + "pad.settings.padSettings": "ਪੈਡ ਸੈਟਿੰਗ", + "pad.settings.myView": "ਮੇਰੀ à¨à¨²à¨•", + "pad.settings.stickychat": "ਹਮੇਸ਼ਾ ਸਕਰੀਨ ਉੱਤੇ ਗੱਲ ਕਰੋ", + "pad.settings.linenocheck": "ਲਾਈਨ ਨੰਬਰ", + "pad.settings.rtlcheck": "ਸਮੱਗਰੀ ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਪੜà©à¨¹à¨¨à©€ ਹੈ?", + "pad.settings.fontType": "ਫੋਂਟ ਕਿਸਮ:", + "pad.settings.fontType.normal": "ਸਧਾਰਨ", + "pad.settings.fontType.monospaced": "ਮੋਨੋਸਪੇਸ", + "pad.settings.globalView": "ਗਲੋਬਲ à¨à¨²à¨•", + "pad.settings.language": "à¨à¨¾à¨¸à¨¼à¨¾:", + "pad.importExport.import_export": "ਇੰਪੋਰਟ/à¨à¨•à¨¸à¨ªà©‹à¨°à¨Ÿ", + "pad.importExport.import": "ਕੋਈ ਵੀ ਟੈਕਸਟ ਫਾਇਲ ਜਾਂ ਦਸਤਾਵੇਜ਼ ਅੱਪਲੋਡ ਕਰੋ", + "pad.importExport.importSuccessful": "ਸਫ਼ਲ!", + "pad.importExport.export": "ਮੌਜੂਦਾ ਪੈਡ ਨੂੰ à¨à¨•à¨¸à¨ªà©‹à¨°à¨Ÿ ਕਰੋ:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "ਸਧਾਰਨ ਟੈਕਸਟ", + "pad.importExport.exportword": "ਮਾਈਕਰੋਸਾਫਟ ਵਰਡ", + "pad.importExport.exportpdf": "ਪੀਡੀà¨à¨«", + "pad.importExport.exportopen": "ODF (ਓਪਨ ਡੌਕੂਮੈਂਟ ਫਾਰਮੈਟ)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.modals.connected": "ਕà©à¨¨à©ˆà¨•à¨Ÿ ਹੈ।", + "pad.modals.reconnecting": "..ਤà©à¨¹à¨¾à¨¡à©‡ ਪੈਡ ਨਾਲ ਮà©à©œ-ਕà©à¨¨à©ˆà¨•à¨Ÿ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ", + "pad.modals.forcereconnect": "ਧੱਕੇ ਨਾਲ ਮà©à©œ-ਕà©à¨¨à©ˆà¨•à¨Ÿ ਕਰੋ", + "pad.modals.userdup": "ਹੋਰ ਵਿੰਡੋ ਵਿੱਚ ਖà©à©±à¨²à©à¨¹à¨¿à¨† ਹੈ", + "pad.modals.unauth": "ਪਰਮਾਣਿਤ ਨਹੀਂ ਹੈ", + "pad.modals.initsocketfail": "ਸਰਵਰ ਪਹà©à©°à¨š ਵਿੱਚ ਨਹੀਂ ਹੈ।", + "pad.modals.slowcommit.explanation": "ਸਰਵਰ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ।", + "pad.modals.slowcommit.cause": "ਇਹ ਨੈੱਟਵਰਕ ਕà©à¨¨à©ˆà¨•à¨¸à¨¼à¨¨ ਨਾਲ ਸਮੱਸਿਆ ਕਰਕੇ ਹੋ ਸਕਦਾ ਹੈ।", + "pad.modals.deleted": "ਹਟਾਇਆ।", + "pad.modals.deleted.explanation": "ਇਹ ਪੈਡ ਹਟਾਇਆ ਜਾ ਚà©à©±à¨•à¨¾ ਹੈ।", + "pad.modals.disconnected": "ਤà©à¨¸à©€à¨‚ ਡਿਸ-ਕà©à¨¨à©ˆà¨•à¨Ÿ ਹੋ ਚà©à©±à¨•à©‡ ਹੋ।", + "pad.modals.disconnected.explanation": "ਸਰਵਰ ਨਾਲ ਕà©à¨¨à©ˆà¨•à¨¸à¨¼à¨¨ ਖਤਮ ਹੋਇਆ ਹੈ", + "pad.share": "ਇਹ ਪੈਡ ਸਾਂà¨à¨¾ ਕਰੋ", + "pad.share.readonly": "ਕੇਵਲ ਪੜà©à¨¹à¨¨ ਲਈ", + "pad.share.link": "ਲਿੰਕ", + "pad.share.emebdcode": "ਇੰਬੈੱਡ URL", + "pad.chat": "ਗੱਲਬਾਤ", + "pad.chat.title": "ਇਹ ਪੈਡ ਲਈ ਗੱਲਬਾਤ ਖੋਲà©à¨¹à©‹à¥¤", + "pad.chat.loadmessages": "ਹੋਰ ਸà©à¨¨à©‡à¨¹à©‡ ਲੋਡ ਕਰੋ", + "timeslider.pageTitle": "{{appTitle}} ਸਮਾਂ-ਲਕੀਰ", + "timeslider.toolbar.returnbutton": "ਪੈਡ ਉੱਤੇ ਵਾਪਸ", + "timeslider.toolbar.authors": "ਲੇਖਕ:", + "timeslider.toolbar.authorsList": "ਕੋਈ ਲੇਖਕ ਨਹੀਂ", + "timeslider.toolbar.exportlink.title": "à¨à¨•à¨¸à¨ªà©‹à¨°à¨Ÿ", + "timeslider.exportCurrent": "ਮੌਜੂਦਾ ਵਰਜਨ ਇੰਠà¨à¨•à¨¸à¨ªà©‹à¨°à¨Ÿ ਕਰੋ:", + "timeslider.version": "ਵਰਜਨ {{version}}", + "timeslider.saved": "{{day}} {{month}} {{year}} ਨੂੰ ਸੰà¨à¨¾à¨²à¨¿à¨†", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "ਜਨਵਰੀ", + "timeslider.month.february": "ਫ਼ਰਵਰੀ", + "timeslider.month.march": "ਮਾਰਚ", + "timeslider.month.april": "ਅਪਰੈਲ", + "timeslider.month.may": "ਮਈ", + "timeslider.month.june": "ਜੂਨ", + "timeslider.month.july": "ਜà©à¨²à¨¾à¨ˆ", + "timeslider.month.august": "ਅਗਸਤ", + "timeslider.month.september": "ਸਤੰਬਰ", + "timeslider.month.october": "ਅਕਤੂਬਰ", + "timeslider.month.november": "ਨਵੰਬਰ", + "timeslider.month.december": "ਦਸੰਬਰ", + "timeslider.unnamedauthors": "{{num}} ਬੇਨਾਮ ਲੇਖਕ", + "pad.savedrevs.marked": "ਇਹ ਰੀਵਿਜ਼ਨ ਨੂੰ ਹà©à¨£ ਸੰà¨à¨¾à¨²à©‡ ਹੋਠਰੀਵਿਜ਼ਨ ਵਜੋਂ ਮੰਨਿਆ ਗਿਆ ਹੈ", + "pad.userlist.entername": "ਆਪਣਾ ਨਾਂ ਦਿਉ", + "pad.userlist.unnamed": "ਬੇਨਾਮ", + "pad.userlist.guest": "ਮਹਿਮਾਨ", + "pad.userlist.deny": "ਪਾਬੰਦੀ", + "pad.userlist.approve": "ਮਨਜ਼ੂਰ", + "pad.editbar.clearcolors": "ਪੂਰੇ ਦਸਾਤਵੇਜ਼ ਉੱਤੇ ਪਰਮਾਣਕਿਤਾ ਰੰਗ ਸਾਫ਼ ਕਰਨੇ ਹਨ?", + "pad.impexp.importbutton": "ਹà©à¨£à©‡ ਇੰਪੋਰਟ ਕਰੋ", + "pad.impexp.importing": "...ਇੰਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ", + "pad.impexp.uploadFailed": "ਅੱਪਲੋਡ ਲਈ ਫੇਲà©à¨¹ ਹੈ, ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।", + "pad.impexp.importfailed": "ਇੰਪੋਰਟ ਫੇਲà©à¨¹ ਹੈ", + "pad.impexp.copypaste": "ਕਾਪੀ ਕਰੋ ਚੇਪੋ ਜੀ" +} diff --git a/src/locales/pl.json b/src/locales/pl.json index 6a46dd77..9e7be2fb 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -1,122 +1,125 @@ { "@metadata": { - "authors": { - "0": "Rezonansowy", - "2": "WTM", - "3": "Woytecr" - } + "authors": [ + "Rezonansowy", + "Ty221", + "WTM", + "Woytecr" + ] }, - "index.newPad": "Nowy Dokument", - "index.createOpenPad": "lub stw\u00f3rz\/otw\u00f3rz dokument o nazwie:", + "index.newPad": "Nowy dokument", + "index.createOpenPad": "lub stwórz/otwórz dokument o nazwie:", "pad.toolbar.bold.title": "Pogrubienie (Ctrl-B)", "pad.toolbar.italic.title": "Kursywa (Ctrl-I)", - "pad.toolbar.underline.title": "Podkre\u015blenie (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Przekre\u015blenie", - "pad.toolbar.ol.title": "Lista uporz\u0105dkowana", - "pad.toolbar.ul.title": "Lista nieuporz\u0105dkowana", - "pad.toolbar.indent.title": "Wci\u0119cie", - "pad.toolbar.unindent.title": "Zmniejsz wci\u0119cie", + "pad.toolbar.underline.title": "PodkreÅ›lenie (Ctrl-U)", + "pad.toolbar.strikethrough.title": "PrzekreÅ›lenie", + "pad.toolbar.ol.title": "Lista uporzÄ…dkowana", + "pad.toolbar.ul.title": "Lista nieuporzÄ…dkowana", + "pad.toolbar.indent.title": "WciÄ™cie (TAB)", + "pad.toolbar.unindent.title": "WciÄ™cie (Shift + TAB)", "pad.toolbar.undo.title": "Cofnij (Ctrl-Z)", - "pad.toolbar.redo.title": "Pon\u00f3w (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Usu\u0144 kolory autor\u00f3w", - "pad.toolbar.import_export.title": "Import\/eksport z\/do r\u00f3\u017cnych format\u00f3w plik\u00f3w", - "pad.toolbar.timeslider.title": "O\u015b czasu", - "pad.toolbar.savedRevision.title": "Zapisz wersj\u0119", + "pad.toolbar.redo.title": "Ponów (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "UsuÅ„ kolory autorów", + "pad.toolbar.import_export.title": "Import/eksport z/do różnych formatów plików", + "pad.toolbar.timeslider.title": "OÅ› czasu", + "pad.toolbar.savedRevision.title": "Zapisz wersjÄ™", "pad.toolbar.settings.title": "Ustawienia", - "pad.toolbar.embed.title": "Umie\u015b\u0107 ten Notatnik", - "pad.toolbar.showusers.title": "Poka\u017c u\u017cytkownik\u00f3w", + "pad.toolbar.embed.title": "Podziel siÄ™ i osadź ten dokument", + "pad.toolbar.showusers.title": "Pokaż użytkowników", "pad.colorpicker.save": "Zapisz", "pad.colorpicker.cancel": "Anuluj", - "pad.loading": "\u0141adowanie...", - "pad.passwordRequired": "Musisz poda\u0107 has\u0142o aby uzyska\u0107 dost\u0119p do tego dokumentu", - "pad.permissionDenied": "Nie masz uprawnie\u0144 dost\u0119pu do tego dokumentu", - "pad.wrongPassword": "Nieprawid\u0142owe has\u0142o", + "pad.loading": "Åadowanie...", + "pad.passwordRequired": "Musisz podać hasÅ‚o aby uzyskać dostÄ™p do tego dokumentu", + "pad.permissionDenied": "Nie masz uprawnieÅ„ dostÄ™pu do tego dokumentu", + "pad.wrongPassword": "NieprawidÅ‚owe hasÅ‚o", "pad.settings.padSettings": "Ustawienia dokumentu", - "pad.settings.myView": "M\u00f3j widok", + "pad.settings.myView": "Mój widok", "pad.settings.stickychat": "Czat zawsze na ekranie", "pad.settings.colorcheck": "Kolory autorstwa", "pad.settings.linenocheck": "Numery linii", + "pad.settings.rtlcheck": "Czytasz treść od prawej do lewej?", "pad.settings.fontType": "Rodzaj czcionki:", "pad.settings.fontType.normal": "Normalna", "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Widok og\u00f3lny", - "pad.settings.language": "J\u0119zyk:", - "pad.importExport.import_export": "Import\/eksport", - "pad.importExport.import": "Prze\u015blij dowolny plik tekstowy lub dokument", + "pad.settings.globalView": "Widok ogólny", + "pad.settings.language": "JÄ™zyk:", + "pad.importExport.import_export": "Import/eksport", + "pad.importExport.import": "PrzeÅ›lij dowolny plik tekstowy lub dokument", "pad.importExport.importSuccessful": "Sukces!", - "pad.importExport.export": "Eksportuj bie\u017c\u0105cy dokument jako:", + "pad.importExport.export": "Eksportuj bieżący dokument jako:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Zwyk\u0142y tekst", + "pad.importExport.exportplain": "ZwykÅ‚y tekst", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Mo\u017cesz importowa\u0107 pliki tylko w formacie zwyk\u0142ego tekstu lub html. Aby umo\u017cliwi\u0107 bardziej zaawansowane funkcje importu, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">zainstaluj abiword<\/a>.", - "pad.modals.connected": "Po\u0142\u0105czony.", - "pad.modals.reconnecting": "Ponowne \u0142\u0105czenie z dokumentem...", - "pad.modals.forcereconnect": "Wymu\u015b ponowne po\u0142\u0105czenie", + "pad.importExport.abiword.innerHTML": "Możesz importować pliki tylko w formacie zwykÅ‚ego tekstu lub html. Aby umożliwić bardziej zaawansowane funkcje importu, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">zainstaluj abiword</a>.", + "pad.modals.connected": "PoÅ‚Ä…czony.", + "pad.modals.reconnecting": "Ponowne Å‚Ä…czenie z dokumentem...", + "pad.modals.forcereconnect": "WymuÅ› ponowne poÅ‚Ä…czenie", "pad.modals.userdup": "Otwarty w innym oknie", - "pad.modals.userdup.explanation": "Ten dokument prawdopodobnie zosta\u0142 otwarty w wi\u0119cej ni\u017c jednym oknie przegl\u0105darki.", - "pad.modals.userdup.advice": "Po\u0142\u0105cz ponownie przy u\u017cyciu tego okna.", + "pad.modals.userdup.explanation": "Ten dokument prawdopodobnie zostaÅ‚ otwarty w wiÄ™cej niż jednym oknie przeglÄ…darki.", + "pad.modals.userdup.advice": "PoÅ‚Ä…cz ponownie przy użyciu tego okna.", "pad.modals.unauth": "Brak autoryzacji", - "pad.modals.unauth.explanation": "Twoje uprawnienia uleg\u0142y zmianie podczas przegl\u0105dania tej strony. Spr\u00f3buj ponownie si\u0119 po\u0142\u0105czy\u0107.", - "pad.modals.looping": "Roz\u0142\u0105czony.", - "pad.modals.looping.explanation": "Wyst\u0105pi\u0142y problemy z komunikacj\u0105 z serwerem synchronizacji.", - "pad.modals.looping.cause": "By\u0107 mo\u017ce jeste\u015b po\u0142\u0105czony przez niezgodn\u0105 zapor\u0119 lub serwer proxy.", - "pad.modals.initsocketfail": "Serwer jest nieosi\u0105galny.", - "pad.modals.initsocketfail.explanation": "Nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 z serwerem synchronizacji.", - "pad.modals.initsocketfail.cause": "Przyczyn\u0105 s\u0105 prawdopodobnie problemy z przegl\u0105darka lub po\u0142\u0105czeniem z internetem.", - "pad.modals.slowcommit": "Roz\u0142\u0105czony.", + "pad.modals.unauth.explanation": "Twoje uprawnienia ulegÅ‚y zmianie podczas przeglÄ…dania tej strony. Spróbuj ponownie siÄ™ poÅ‚Ä…czyć.", + "pad.modals.looping.explanation": "WystÄ…piÅ‚y problemy z komunikacjÄ… z serwerem synchronizacji.", + "pad.modals.looping.cause": "Być może jesteÅ› poÅ‚Ä…czony przez niezgodnÄ… zaporÄ™ lub serwer proxy.", + "pad.modals.initsocketfail": "Serwer jest nieosiÄ…galny.", + "pad.modals.initsocketfail.explanation": "Nie udaÅ‚o siÄ™ poÅ‚Ä…czyć z serwerem synchronizacji.", + "pad.modals.initsocketfail.cause": "PrzyczynÄ… sÄ… prawdopodobnie problemy z przeglÄ…darka lub poÅ‚Ä…czeniem z internetem.", "pad.modals.slowcommit.explanation": "Serwer nie odpowiada.", - "pad.modals.slowcommit.cause": "Mo\u017ce by\u0107 to spowodowane problemami z Twoim po\u0142\u0105czeniem z sieci\u0105.", - "pad.modals.deleted": "Usuni\u0119to.", - "pad.modals.deleted.explanation": "Ten dokument zosta\u0142 usuni\u0119ty.", - "pad.modals.disconnected": "Zosta\u0142e\u015b roz\u0142\u0105czony.", - "pad.modals.disconnected.explanation": "Utracono po\u0142\u0105czenie z serwerem", - "pad.modals.disconnected.cause": "Serwer mo\u017ce by\u0107 niedost\u0119pny. Poinformuj nas je\u017celi problem b\u0119dzie si\u0119 powtarza\u0142.", - "pad.share": "Udost\u0119pnij ten dokument", + "pad.modals.slowcommit.cause": "Może być to spowodowane problemami z Twoim poÅ‚Ä…czeniem z sieciÄ….", + "pad.modals.badChangeset.explanation": "Edycja, którÄ… wykonaÅ‚eÅ›, zostaÅ‚a niewÅ‚aÅ›ciwie zakwalifikowana przez serwer synchronizacji.", + "pad.modals.badChangeset.cause": "Może być to spowodowane zÅ‚Ä… konfiguracjÄ… serwera lub innym nieoczekiwanym zachowaniem. Skontaktuj siÄ™ z administratorem serwisu, jeżeli wydaje Ci siÄ™, że to jest bÅ‚Ä…d. Spróbuj ponownie poÅ‚Ä…czyć siÄ™ aby kontynuować edycjÄ™.", + "pad.modals.corruptPad.explanation": "Dokument, do którego próbujesz uzyskać dostÄ™p, jest uszkodzony.", + "pad.modals.corruptPad.cause": "Może być to spowodowane zÅ‚Ä… konfiguracjÄ… serwera lub innym nieoczekiwanym zachowaniem. Skontaktuj siÄ™ z administratorem serwisu.", + "pad.modals.deleted": "UsuniÄ™to.", + "pad.modals.deleted.explanation": "Ten dokument zostaÅ‚ usuniÄ™ty.", + "pad.modals.disconnected": "ZostaÅ‚eÅ› rozÅ‚Ä…czony.", + "pad.modals.disconnected.explanation": "Utracono poÅ‚Ä…czenie z serwerem", + "pad.modals.disconnected.cause": "Serwer może być niedostÄ™pny. Poinformuj administratora serwisu jeżeli problem bÄ™dzie siÄ™ powtarzaÅ‚.", + "pad.share": "UdostÄ™pnij 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", - "timeslider.pageTitle": "O\u015b czasu {{appTitle}}", - "timeslider.toolbar.returnbutton": "Powr\u00f3\u0107 do dokumentu", + "pad.chat.title": "Otwórz czat dla tego dokumentu.", + "pad.chat.loadmessages": "ZaÅ‚aduj wiÄ™cej wiadomoÅ›ci", + "timeslider.pageTitle": "OÅ› czasu {{appTitle}}", + "timeslider.toolbar.returnbutton": "Powróć do dokumentu", "timeslider.toolbar.authors": "Autorzy:", - "timeslider.toolbar.authorsList": "Brak autor\u00f3w", + "timeslider.toolbar.authorsList": "Brak autorów", "timeslider.toolbar.exportlink.title": "Eksportuj", - "timeslider.exportCurrent": "Eksportuj bie\u017c\u0105c\u0105 wersj\u0119 jako:", + "timeslider.exportCurrent": "Eksportuj bieżącÄ… wersjÄ™ jako:", "timeslider.version": "Wersja {{version}}", "timeslider.saved": "Zapisano {{day}} {{month}} {{year}}", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "Stycze\u0144", + "timeslider.month.january": "StyczeÅ„", "timeslider.month.february": "Luty", "timeslider.month.march": "Marzec", - "timeslider.month.april": "Kwiecie\u0144", + "timeslider.month.april": "KwiecieÅ„", "timeslider.month.may": "Maj", "timeslider.month.june": "Czerwiec", "timeslider.month.july": "Lipiec", - "timeslider.month.august": "Sierpie\u0144", - "timeslider.month.september": "Wrzesie\u0144", - "timeslider.month.october": "Pa\u017adziernik", + "timeslider.month.august": "SierpieÅ„", + "timeslider.month.september": "WrzesieÅ„", + "timeslider.month.october": "Październik", "timeslider.month.november": "Listopad", - "timeslider.month.december": "Grudzie\u0144", - "timeslider.unnamedauthor": "{{num}} nienazwany autor", - "timeslider.unnamedauthors": "{{num}} autor\u00f3w bez nazw", - "pad.savedrevs.marked": "Ta wersja zosta\u0142a w\u0142a\u015bnie oznaczona jako zapisana.", - "pad.userlist.entername": "Wprowad\u017a swoj\u0105 nazw\u0119", + "timeslider.month.december": "GrudzieÅ„", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor, other: autorów ]} bez nazw", + "pad.savedrevs.marked": "Ta wersja zostaÅ‚a wÅ‚aÅ›nie oznaczona jako zapisana.", + "pad.userlist.entername": "Wprowadź swojÄ… nazwÄ™", "pad.userlist.unnamed": "bez nazwy", - "pad.userlist.guest": "Go\u015b\u0107", - "pad.userlist.deny": "Zabro\u0144", + "pad.userlist.guest": "Gość", + "pad.userlist.deny": "ZabroÅ„", "pad.userlist.approve": "Akceptuj", - "pad.editbar.clearcolors": "Wyczy\u015bci\u0107 kolory autorstwa w ca\u0142ym dokumencie?", + "pad.editbar.clearcolors": "WyczyÅ›cić kolory autorstwa w caÅ‚ym dokumencie?", "pad.impexp.importbutton": "Importuj teraz", "pad.impexp.importing": "Importowanie...", - "pad.impexp.confirmimport": "Importowanie pliku spowoduje zast\u0105pienie bie\u017c\u0105cego tekstu. Czy na pewno chcesz kontynuowa\u0107?", - "pad.impexp.convertFailed": "Nie byli\u015bmy w stanie zaimportowa\u0107 tego pliku. Prosz\u0119 u\u017cy\u0107 innego formatu dokumentu lub skopiowa\u0107 i wklei\u0107 r\u0119cznie", - "pad.impexp.uploadFailed": "Przesy\u0142anie nie powiod\u0142o si\u0119, prosz\u0119 spr\u00f3bowa\u0107 jeszcze raz", - "pad.impexp.importfailed": "Importowanie nie powiod\u0142o si\u0119", - "pad.impexp.copypaste": "Prosz\u0119 skopiowa\u0107 i wklei\u0107", - "pad.impexp.exportdisabled": "Eksport do formatu {{type}} jest wy\u0142\u0105czony. Prosz\u0119 skontaktowa\u0107 si\u0119 z administratorem aby uzyska\u0107 wi\u0119cej szczeg\u00f3\u0142\u00f3w." -}
\ No newline at end of file + "pad.impexp.confirmimport": "Importowanie pliku spowoduje zastąpienie bieżącego tekstu. Czy na pewno chcesz kontynuować?", + "pad.impexp.convertFailed": "Nie byliśmy w stanie zaimportować tego pliku. Proszę użyć innego formatu dokumentu lub skopiować i wkleić ręcznie", + "pad.impexp.uploadFailed": "Przesyłanie nie powiodło się, proszę spróbować jeszcze raz", + "pad.impexp.importfailed": "Importowanie nie powiodło się", + "pad.impexp.copypaste": "Proszę skopiować i wkleić", + "pad.impexp.exportdisabled": "Eksport do formatu {{type}} jest wyłączony. Proszę skontaktować się z administratorem aby uzyskać więcej szczegółów." +} diff --git a/src/locales/ps.json b/src/locales/ps.json index b992a56a..76004412 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -4,50 +4,68 @@ "Ahmed-Najib-Biabani-Ibrahimkhel" ] }, - "pad.toolbar.bold.title": "\u0632\u063a\u0631\u062f (Ctrl-B)", - "pad.toolbar.italic.title": "\u0631\u06d0\u0648\u0646\u062f (Ctrl-I)", - "pad.toolbar.undo.title": "\u0646\u0627\u06a9\u0693\u0644 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0628\u064a\u0627\u06a9\u0693\u0644 (Ctrl-Y)", - "pad.toolbar.settings.title": "\u0627\u0645\u0633\u062a\u0646\u06d0", - "pad.colorpicker.save": "\u062e\u0648\u0646\u062f\u064a \u06a9\u0648\u0644", - "pad.colorpicker.cancel": "\u0646\u0627\u06ab\u0627\u0631\u0644", - "pad.loading": "\u0628\u0631\u0633\u06d0\u0631\u06d0\u062f\u0646\u06d0 \u06a9\u06d0 \u062f\u06cc...", - "pad.wrongPassword": "\u067e\u067c\u0646\u0648\u0645 \u0645\u0648 \u0633\u0645 \u0646\u0647 \u0648", - "pad.settings.myView": "\u0632\u0645\u0627 \u06a9\u062a\u0646\u0647", - "pad.settings.fontType": "\u0644\u064a\u06a9\u0628\u06bc\u06d0 \u0689\u0648\u0644:", - "pad.settings.fontType.normal": "\u0646\u0648\u0631\u0645\u0627\u0644", - "pad.settings.fontType.monospaced": "\u0645\u0648\u0646\u0648\u0633\u067e\u06d0\u0633", - "pad.settings.globalView": "\u0646\u0693\u06d0\u0648\u0627\u0644\u0647 \u069a\u06a9\u0627\u0631\u06d0\u062f\u0646\u0647", - "pad.settings.language": "\u0698\u0628\u0647:", - "pad.importExport.importSuccessful": "\u0628\u0631\u064a\u0627\u0644\u06cc \u0634\u0648!", - "pad.importExport.exporthtml": "\u0627\u0686 \u067c\u064a \u0627\u0645 \u0627\u06d0\u0644", - "pad.importExport.exportplain": "\u0633\u0627\u062f\u0647 \u0645\u062a\u0646", - "pad.importExport.exportword": "\u0645\u0627\u064a\u06a9\u0631\u0648\u0633\u0627\u0641\u067c \u0648\u0631\u0689", - "pad.importExport.exportpdf": "\u067e\u064a \u0689\u064a \u0627\u06d0\u0641", - "pad.importExport.exportopen": "ODF (\u0627\u0648\u067e\u0646 \u0689\u0627\u06a9\u0648\u0645\u0646\u067c \u0641\u0627\u0631\u0645\u067c)", - "pad.modals.deleted": "\u0693\u0646\u06ab \u0634\u0648.", - "pad.share.readonly": "\u064a\u0648\u0627\u0632\u06d0 \u0644\u0648\u0633\u062a\u0646\u0647", - "pad.share.link": "\u062a\u0693\u0646\u0647", - "pad.share.emebdcode": "\u064a\u0648 \u0622\u0631 \u0627\u06d0\u0644 \u067c\u0648\u0645\u0628\u0644", - "pad.chat": "\u0628\u0627\u0646\u0689\u0627\u0631", - "pad.chat.loadmessages": "\u0646\u0648\u0631 \u067e\u064a\u063a\u0627\u0645\u0648\u0646\u0647 \u0628\u0631\u0633\u06d0\u0631\u0648\u0644", - "timeslider.toolbar.authors": "\u0644\u064a\u06a9\u0648\u0627\u0644:", - "timeslider.toolbar.authorsList": "\u0628\u06d0 \u0644\u064a\u06a9\u0648\u0627\u0644\u0647", - "timeslider.month.january": "\u062c\u0646\u0648\u0631\u064a", - "timeslider.month.february": "\u0641\u0628\u0631\u0648\u0631\u064a", - "timeslider.month.march": "\u0645\u0627\u0631\u0686", - "timeslider.month.april": "\u0627\u067e\u0631\u06d0\u0644", - "timeslider.month.may": "\u0645\u06cd", - "timeslider.month.june": "\u062c\u0648\u0646", - "timeslider.month.july": "\u062c\u0648\u0644\u0627\u06cc", - "timeslider.month.august": "\u0627\u06ab\u0633\u067c", - "timeslider.month.september": "\u0633\u06d0\u067e\u062a\u0645\u0628\u0631", - "timeslider.month.october": "\u0627\u06a9\u062a\u0648\u0628\u0631", - "timeslider.month.november": "\u0646\u0648\u0645\u0628\u0631", - "timeslider.month.december": "\u0689\u064a\u0633\u0645\u0628\u0631", - "pad.userlist.entername": "\u0646\u0648\u0645 \u0645\u0648 \u0648\u0631\u06a9\u0693\u06cd", - "pad.userlist.unnamed": "\u0628\u06d0 \u0646\u0648\u0645\u0647", - "pad.userlist.guest": "\u0645\u06d0\u0644\u0645\u0647", - "pad.userlist.deny": "\u0631\u062f\u0648\u0644", - "pad.userlist.approve": "\u0645\u0646\u0644" -}
\ No newline at end of file + "index.newPad": "Ù†ÙˆÛ Ù„ÙŠÚ©Ú†Ù‡", + "index.createOpenPad": "يا په Ù‡Ù…Ø¯Û Ù†ÙˆÙ… يوه Ù†ÙˆÛ Ù„ÙŠÚ©Ú†Ù‡ جوړول/پرانيستل:", + "pad.toolbar.bold.title": "زغرد (Ctrl-B)", + "pad.toolbar.italic.title": "رÛوند (Ctrl-I)", + "pad.toolbar.undo.title": "ناکړل (Ctrl-Z)", + "pad.toolbar.redo.title": "بياکړل (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "د Ù„ÙŠÚ©ÙˆØ§Ù„Û Ø±Ù†Ú«ÙˆÙ†Ù‡ سپينول", + "pad.toolbar.savedRevision.title": "مخکتنه خوندي کول", + "pad.toolbar.settings.title": "امستنÛ", + "pad.colorpicker.save": "خوندي کول", + "pad.colorpicker.cancel": "ناگارل", + "pad.loading": "برسÛرÛØ¯Ù†Û Ú©Û Ø¯ÛŒ...", + "pad.passwordRequired": "Ø¯Û Ù„ÙŠÚ©Ú†Û ØªÙ‡ د لاسرسي لپاره ØªØ§Ø³Û ÙŠÙˆ پټنوم ته اړتيا لرÛ", + "pad.wrongPassword": "پټنوم مو سم نه Ùˆ", + "pad.settings.padSettings": "د Ù„ÙŠÚ©Ú†Û Ø§Ù…Ø³ØªÙ†Û", + "pad.settings.myView": "زما کتنه", + "pad.settings.colorcheck": "د Ù„ÙŠÚ©ÙˆØ§Ù„Û Ø±Ù†Ú«ÙˆÙ†Ù‡", + "pad.settings.fontType": "Ù„ÙŠÚ©Ø¨Ú¼Û Ú‰ÙˆÙ„:", + "pad.settings.fontType.normal": "نورمال", + "pad.settings.fontType.monospaced": "مونوسپÛس", + "pad.settings.globalView": "Ù†Ú“Ûواله ښکارÛدنه", + "pad.settings.language": "ژبه:", + "pad.importExport.importSuccessful": "بريالی شو!", + "pad.importExport.exporthtml": "اچ ټي ام اÛÙ„", + "pad.importExport.exportplain": "ساده متن", + "pad.importExport.exportword": "مايکروساÙÙ¼ ورډ", + "pad.importExport.exportpdf": "پي Ú‰ÙŠ اÛÙ", + "pad.importExport.exportopen": "ODF (اوپن ډاکومنټ Ùارمټ)", + "pad.importExport.exportdokuwiki": "ډوکوويکي", + "pad.modals.connected": "اړيکمن شو.", + "pad.modals.slowcommit.explanation": "پالنگر Úواب نه وايي.", + "pad.modals.slowcommit.cause": "دا Ú©Ûدای شي د جال د اړيکتيايي ستونزو په سبب وي.", + "pad.modals.deleted": "Ú“Ù†Ú¯ شو.", + "pad.share.readonly": "ÙŠÙˆØ§Ø²Û Ù„ÙˆØ³ØªÙ†Ù‡", + "pad.share.link": "تړنه", + "pad.share.emebdcode": "يو آر اÛÙ„ ټومبل", + "pad.chat": "بانډار", + "pad.chat.loadmessages": "نور پيغامونه برسÛرول", + "timeslider.toolbar.authors": "ليکوال:", + "timeslider.toolbar.authorsList": "Ø¨Û Ù„ÙŠÚ©ÙˆØ§Ù„Ù‡", + "timeslider.toolbar.exportlink.title": "صادرول", + "timeslider.version": "بڼه {{version}}", + "timeslider.saved": "خوندي شو {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "جنوري", + "timeslider.month.february": "Ùبروري", + "timeslider.month.march": "مارچ", + "timeslider.month.april": "اپرÛÙ„", + "timeslider.month.may": "Ù…Û", + "timeslider.month.june": "جون", + "timeslider.month.july": "جولای", + "timeslider.month.august": "اگسټ", + "timeslider.month.september": "سÛپتمبر", + "timeslider.month.october": "اکتوبر", + "timeslider.month.november": "نومبر", + "timeslider.month.december": "ډيسمبر", + "timeslider.unnamedauthors": "{{num}} Ø¨Û Ù†ÙˆÙ…Ù‡ {[Ú‰Ûرگړي(num) يو: ليکوال، نور: ليکوالان ]}", + "pad.savedrevs.marked": "اوس دا مخکتنه د ÙŠÙˆÛ Ø®ÙˆÙ†Ø¯ÙŠ Ø´ÙˆÛ Ù…Ø®Ú©ØªÙ†Û Ù¾Ù‡ توگه په Ù†ÚšÙ‡ شوه", + "pad.userlist.entername": "نوم مو ورکړÛ", + "pad.userlist.unnamed": "Ø¨Û Ù†ÙˆÙ…Ù‡", + "pad.userlist.guest": "Ù…Ûلمه", + "pad.userlist.deny": "ردول", + "pad.userlist.approve": "منل", + "pad.impexp.copypaste": "لطÙاً لمÛسل Ù„ÛÚšÙ„ ترسره کړئ" +} diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index e029165d..a687b22a 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -1,45 +1,52 @@ { "@metadata": { "authors": [ - "Tuliouel" + "Gusta", + "Luckas", + "Prilopes", + "TheGabrielZaum", + "Titoncio", + "Tuliouel", + "Rafaelff" ] }, "index.newPad": "Nova Nota", "index.createOpenPad": "ou criar-abrir uma Nota com o nome:", "pad.toolbar.bold.title": "Negrito (Ctrl-B)", - "pad.toolbar.italic.title": "It\u00e1lico (Ctrl-I)", + "pad.toolbar.italic.title": "Itálico (Ctrl-I)", "pad.toolbar.underline.title": "Sublinhar (Ctrl-U)", "pad.toolbar.strikethrough.title": "Tachado", "pad.toolbar.ol.title": "Lista ordenada", - "pad.toolbar.ul.title": "Lista n\u00e3o ordenada", - "pad.toolbar.indent.title": "Aumentar Recuo", - "pad.toolbar.unindent.title": "Diminuir Recuo", + "pad.toolbar.ul.title": "Lista não ordenada", + "pad.toolbar.indent.title": "Aumentar Recuo (TAB)", + "pad.toolbar.unindent.title": "Diminuir Recuo (Shift+TAB)", "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", "pad.toolbar.redo.title": "Refazer (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Limpar as cores de identifica\u00e7\u00e3o de autoria", - "pad.toolbar.import_export.title": "Importar\/Exportar de\/para diferentes formatos de arquivo", + "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificação de autoria", + "pad.toolbar.import_export.title": "Importar/Exportar de/para diferentes formatos de arquivo", "pad.toolbar.timeslider.title": "Linha do tempo", - "pad.toolbar.savedRevision.title": "Salvar revis\u00e3o", - "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", - "pad.toolbar.embed.title": "Incorporar esta Nota", + "pad.toolbar.savedRevision.title": "Salvar revisão", + "pad.toolbar.settings.title": "Configurações", + "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", "pad.loading": "Carregando...", - "pad.passwordRequired": "Voc\u00ea precisa de uma senha para acessar esta Nota", - "pad.permissionDenied": "Voc\u00ea n\u00e3o tem permiss\u00e3o para acessar esta nota", + "pad.passwordRequired": "Você precisa de uma senha para acessar esta Nota", + "pad.permissionDenied": "Você não tem permissão para acessar esta Nota", "pad.wrongPassword": "Senha incorreta", - "pad.settings.padSettings": "Configura\u00e7\u00f5es da Nota", - "pad.settings.myView": "Minha Vis\u00e3o", - "pad.settings.stickychat": "Conversa sempre vis\u00edvel", + "pad.settings.padSettings": "Configurações da Nota", + "pad.settings.myView": "Minha Visão", + "pad.settings.stickychat": "Conversa sempre visÃvel", "pad.settings.colorcheck": "Cores de autoria", - "pad.settings.linenocheck": "N\u00fameros de linha", + "pad.settings.linenocheck": "Números de linha", + "pad.settings.rtlcheck": "Ler conteúdo da direita para esquerda?", "pad.settings.fontType": "Tipo de fonte:", "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespa\u00e7ada", - "pad.settings.globalView": "Vis\u00e3o global", + "pad.settings.fontType.monospaced": "Monoespaçada", + "pad.settings.globalView": "Visão global", "pad.settings.language": "Idioma:", - "pad.importExport.import_export": "Importar\/Exportar", + "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Enviar um arquivo texto ou documento", "pad.importExport.importSuccessful": "Completo!", "pad.importExport.export": "Exportar a presente nota como:", @@ -49,32 +56,34 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Voc\u00ea s\u00f3 pode importar de formatos de texto puro ou html. Para recursos de importa\u00e7\u00e3o mais avan\u00e7ados <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instale o abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Você só pode importar de formatos de texto puro ou html. Para recursos de importação mais avançados <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instale o abiword</a>.", "pad.modals.connected": "Conectado.", - "pad.modals.reconnecting": "Reconectando \u00e0 sua nota...", - "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", + "pad.modals.reconnecting": "Reconectando à sua nota...", + "pad.modals.forcereconnect": "Forçar reconexão", "pad.modals.userdup": "Aberto noutra janela", "pad.modals.userdup.explanation": "Esta nota parece estar aberta em mais de uma janela de navegador deste computador.", "pad.modals.userdup.advice": "Reconectar para usar esta janela.", - "pad.modals.unauth": "N\u00e3o autorizado", - "pad.modals.unauth.explanation": "Suas permiss\u00f5es foram mudadas enquanto visualizava esta p\u00e1gina. Tente reconectar.", - "pad.modals.looping": "Reconectado.", - "pad.modals.looping.explanation": "H\u00e1 problemas de comunica\u00e7\u00e3o com o servidor de sincroniza\u00e7\u00e3o.", - "pad.modals.looping.cause": "Talvez voc\u00ea tenha conectado por um firewall ou proxy incompat\u00edvel.", - "pad.modals.initsocketfail": "Servidor \u00e9 inalcan\u00e7\u00e1vel.", - "pad.modals.initsocketfail.explanation": "N\u00e3o foi poss\u00edvel conectar com o servidor de sincroniza\u00e7\u00e3o.", - "pad.modals.initsocketfail.cause": "Isto provavelmente ocorreu por um problema em seu navegador ou conex\u00e3o.", - "pad.modals.slowcommit": "Desconectado.", - "pad.modals.slowcommit.explanation": "O servidor n\u00e3o responde.", - "pad.modals.slowcommit.cause": "Isto pode ser por problemas com a conex\u00e3o de rede.", - "pad.modals.deleted": "Exclu\u00eddo", + "pad.modals.unauth": "Não autorizado", + "pad.modals.unauth.explanation": "Suas permissões foram mudadas enquanto visualizava esta página. Tente reconectar.", + "pad.modals.looping.explanation": "Há problemas de comunicação com o servidor de sincronização.", + "pad.modals.looping.cause": "Talvez você tenha conectado por um firewall ou proxy incompatÃvel.", + "pad.modals.initsocketfail": "Servidor é inalcançável.", + "pad.modals.initsocketfail.explanation": "Não foi possÃvel conectar com o servidor de sincronização.", + "pad.modals.initsocketfail.cause": "Isto provavelmente ocorreu por um problema em seu navegador ou conexão.", + "pad.modals.slowcommit.explanation": "O servidor não responde.", + "pad.modals.slowcommit.cause": "Isto pode ser por problemas com a conexão de rede.", + "pad.modals.badChangeset.explanation": "Uma edição que você fez foi classificada como ilegal pelo servidor de sincronização.", + "pad.modals.badChangeset.cause": "Isto pode ocorrer devido a uma configuração errada do servidor ou algum outro comportamento inesperado. Por favor contate o administrador, se você acredita que é um erro. Tente reconectar para continuar editando.", + "pad.modals.corruptPad.explanation": "O pad que você está tentando acessar está corrompido.", + "pad.modals.corruptPad.cause": "Isto pode ocorrer devido a uma configuração errada do servidor ou algum outro comportamento inesperado. Por favor contate o administrador.", + "pad.modals.deleted": "ExcluÃdo.", "pad.modals.deleted.explanation": "Esta nota foi removida.", - "pad.modals.disconnected": "Voc\u00ea foi desconectado.", - "pad.modals.disconnected.explanation": "A conex\u00e3o com o servidor foi perdida", - "pad.modals.disconnected.cause": "O servidor pode estar indispon\u00edvel. Comunique-nos caso isso continue.", + "pad.modals.disconnected": "Você foi desconectado.", + "pad.modals.disconnected.explanation": "A conexão com o servidor foi perdida", + "pad.modals.disconnected.cause": "O servidor pode estar indisponÃvel. Por favor, notifique o administrador caso isso continue.", "pad.share": "Compartilhar esta nota", "pad.share.readonly": "Somente leitura", - "pad.share.link": "Liga\u00e7\u00e3o", + "pad.share.link": "Ligação", "pad.share.emebdcode": "Incorporar o URL", "pad.chat": "Bate-papo", "pad.chat.title": "Abrir o bate-papo desta nota.", @@ -84,13 +93,13 @@ "timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authorsList": "Sem autores", "timeslider.toolbar.exportlink.title": "Exportar", - "timeslider.exportCurrent": "Exportar a vers\u00e3o atual em formato:", - "timeslider.version": "Vers\u00e3o {{version}}", + "timeslider.exportCurrent": "Exportar a versão atual em formato:", + "timeslider.version": "Versão {{version}}", "timeslider.saved": "Salvo em {{day}} de {{month}} de {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janeiro", "timeslider.month.february": "Fevereiro", - "timeslider.month.march": "Mar\u00e7o", + "timeslider.month.march": "Março", "timeslider.month.april": "Abril", "timeslider.month.may": "Maio", "timeslider.month.june": "Junho", @@ -100,21 +109,20 @@ "timeslider.month.october": "Outubro", "timeslider.month.november": "Novembro", "timeslider.month.december": "Dezembro", - "timeslider.unnamedauthor": "{{num}} autor desconhecido", - "timeslider.unnamedauthors": "{{num}} autores desconhecidos", - "pad.savedrevs.marked": "Esta revis\u00e3o foi marcada como salva", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anônimo, other: autores anônimos ]}", + "pad.savedrevs.marked": "Esta revisão foi marcada como salva", "pad.userlist.entername": "Insira o seu nome", - "pad.userlist.unnamed": "Sem t\u00edtulo", + "pad.userlist.unnamed": "Sem tÃtulo", "pad.userlist.guest": "Convidado", "pad.userlist.deny": "Negar", "pad.userlist.approve": "Aprovar", "pad.editbar.clearcolors": "Deseja limpar cores de autoria em todo o documento?", "pad.impexp.importbutton": "Importar agora", "pad.impexp.importing": "Importando...", - "pad.impexp.confirmimport": "Importar um arquivo sobrescrever\u00e1 o atual texto da nota. Tem certeza de que deseja prosseguir?", - "pad.impexp.convertFailed": "N\u00e3o foi poss\u00edvel importar este arquivo. Use outro formato ou copie e cole manualmente", + "pad.impexp.confirmimport": "Importar um arquivo sobrescreverá o atual texto da nota. Tem certeza de que deseja prosseguir?", + "pad.impexp.convertFailed": "Não foi possÃvel importar este arquivo. Use outro formato ou copie e cole manualmente", "pad.impexp.uploadFailed": "O envio falhou. Tente outra vez", - "pad.impexp.importfailed": "A importa\u00e7\u00e3o falhou", + "pad.impexp.importfailed": "A importação falhou", "pad.impexp.copypaste": "Copie e cole", - "pad.impexp.exportdisabled": "A exposta\u00e7\u00e3o em formato {{type}} est\u00e1 desativada. Comunique-se com o administrador do sistema para detalhes." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "A exportação em formato {{type}} está desativada. Comunique-se com o administrador do sistema para detalhes." +} diff --git a/src/locales/pt.json b/src/locales/pt.json index 0e651fe8..949bb7bc 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -1,40 +1,53 @@ { "@metadata": { - "authors": { - "1": "Waldir" - } + "authors": [ + "Hamilton Abreu", + "Luckas", + "Tuliouel", + "Waldir", + "Imperadeiro98" + ] }, - "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.italic.title": "Itálico (Ctrl-I)", "pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", - "pad.toolbar.ol.title": "Lista numerada", - "pad.toolbar.ul.title": "Lista", + "pad.toolbar.strikethrough.title": "Riscar", + "pad.toolbar.ol.title": "Lista ordenada", + "pad.toolbar.ul.title": "Lista desordenada", + "pad.toolbar.indent.title": "Avançar (TAB)", + "pad.toolbar.unindent.title": "Recuar (Shift+TAB)", "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", "pad.toolbar.redo.title": "Refazer (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Limpar cores de autoria", - "pad.toolbar.import_export.title": "Importar\/exportar de\/para diferentes formatos de ficheiro", + "pad.toolbar.import_export.title": "Importar/exportar de/para diferentes formatos de ficheiro", "pad.toolbar.timeslider.title": "Linha de tempo", - "pad.toolbar.savedRevision.title": "Vers\u00f5es gravadas", - "pad.toolbar.settings.title": "Configura\u00e7\u00f5es", - "pad.toolbar.embed.title": "Incorporar este Pad", - "pad.toolbar.showusers.title": "Mostrar os utilizadores neste Pad", + "pad.toolbar.savedRevision.title": "Salvar revisão", + "pad.toolbar.settings.title": "Configurações", + "pad.toolbar.embed.title": "Compartilhar e incorporar este 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.loading": "A carregar…", + "pad.passwordRequired": "Precisa de uma senha para aceder a este pad", + "pad.permissionDenied": "Não tem permissão para aceder a este pad.", + "pad.wrongPassword": "A palavra-chave está errada", + "pad.settings.padSettings": "Configurações da Nota", "pad.settings.myView": "Minha vista", + "pad.settings.stickychat": "Bate-papo sempre no ecrã", "pad.settings.colorcheck": "Cores de autoria", - "pad.settings.linenocheck": "N\u00fameros de linha", + "pad.settings.linenocheck": "Números de linha", + "pad.settings.rtlcheck": "Ler o conteúdo da direita para a esquerda?", "pad.settings.fontType": "Tipo de letra:", "pad.settings.fontType.normal": "Normal", - "pad.settings.fontType.monospaced": "Monoespa\u00e7ada", + "pad.settings.fontType.monospaced": "Monoespaçada", "pad.settings.globalView": "Vista global", - "pad.settings.language": "L\u00edngua:", - "pad.importExport.import_export": "Importar\/Exportar", + "pad.settings.language": "LÃngua:", + "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.importSuccessful": "Bem sucedido!", + "pad.importExport.export": "Exportar a Nota atual como:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto simples", "pad.importExport.exportword": "Microsoft Word", @@ -42,12 +55,37 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", "pad.modals.connected": "Ligado.", - "pad.modals.reconnecting": "Reconectando-se ao seu bloco\u2026", - "pad.modals.forcereconnect": "For\u00e7ar reconex\u00e3o", + "pad.modals.reconnecting": "Reconectando-se ao seu bloco…", + "pad.modals.forcereconnect": "Forçar reconexão", + "pad.modals.userdup": "Aberto noutra janela", + "pad.modals.userdup.explanation": "Este pad parece estar aberto em mais do que uma janela do navegador neste computador.", + "pad.modals.unauth": "Não autorizado", + "pad.modals.looping.explanation": "Existem problemas de comunicação com o servidor de sincronização.", + "pad.modals.initsocketfail": "O servidor está inacessÃvel.", + "pad.modals.initsocketfail.explanation": "Não foi possÃvel a conexão ao servidor de sincronização.", + "pad.modals.slowcommit.explanation": "O servidor não está a responder.", + "pad.modals.deleted": "Eliminado.", + "pad.modals.deleted.explanation": "Este pad foi removido.", + "pad.modals.disconnected": "Você foi desconectado.", + "pad.modals.disconnected.explanation": "A conexão com o servidor foi perdida", + "pad.modals.disconnected.cause": "O servidor pode estar indisponÃvel. Por favor, notifique o administrador de serviço se isto continuar a acontecer.", + "pad.share": "Compartilhar este pad", + "pad.share.readonly": "Somente para leitura", + "pad.chat": "Bate-papo", + "pad.chat.title": "Abrir o bate-papo para este pad.", + "pad.chat.loadmessages": "Carregar mais mensagens", + "timeslider.toolbar.returnbutton": "Voltar ao pad", + "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Sem Autores", + "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar versão atual como:", + "timeslider.version": "Versão {{version}}", + "timeslider.saved": "Gravado a {{day}} de {{month}} de {{ano}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janeiro", "timeslider.month.february": "Fevereiro", - "timeslider.month.march": "Mar\u00e7o", - "timeslider.month.april": "Abril\ufffd\ufffd", + "timeslider.month.march": "Março", + "timeslider.month.april": "Abril", "timeslider.month.may": "Maio", "timeslider.month.june": "Junho", "timeslider.month.july": "Julho", @@ -55,5 +93,18 @@ "timeslider.month.september": "Setembro", "timeslider.month.october": "Outubro", "timeslider.month.november": "Novembro", - "timeslider.month.december": "Dezembro" -}
\ No newline at end of file + "timeslider.month.december": "Dezembro", + "pad.savedrevs.marked": "Esta revisão está agora marcada como gravada", + "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.editbar.clearcolors": "Deseja limpar as cores de autoria em todo o documento?", + "pad.impexp.importbutton": "Importar agora", + "pad.impexp.importing": "Importando...", + "pad.impexp.confirmimport": "A importação de um ficheiro irá substituir o texto atual do pad. Tem certeza que deseja continuar?", + "pad.impexp.uploadFailed": "O upload falhou. Por favor, tente novamente", + "pad.impexp.importfailed": "A importação falhou", + "pad.impexp.copypaste": "Por favor, copie e cole" +} diff --git a/src/locales/ru.json b/src/locales/ru.json index 4e4c4050..cd030bad 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -4,120 +4,123 @@ "Amire80", "DCamer", "Eleferen", + "Okras", "Volkov" ] }, - "index.newPad": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c", - "index.createOpenPad": "\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\/\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c:", - "pad.toolbar.bold.title": "\u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl-B)", - "pad.toolbar.italic.title": "\u043a\u0443\u0440\u0441\u0438\u0432 (Ctrl-I)", - "pad.toolbar.underline.title": "\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435 (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0437\u0430\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435", - "pad.toolbar.ol.title": "\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.ul.title": "\u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.indent.title": "\u041e\u0442\u0441\u0442\u0443\u043f", - "pad.toolbar.unindent.title": "\u0412\u044b\u0441\u0442\u0443\u043f", - "pad.toolbar.undo.title": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (Ctrl-Z)", - "pad.toolbar.redo.title": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", - "pad.toolbar.import_export.title": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432", - "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438", - "pad.toolbar.savedRevision.title": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438", - "pad.toolbar.settings.title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", - "pad.toolbar.embed.title": "\u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435", - "pad.colorpicker.save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", - "pad.colorpicker.cancel": "\u041e\u0442\u043c\u0435\u043d\u0430", - "pad.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...", - "pad.passwordRequired": "\u0412\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430", - "pad.permissionDenied": "\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f", - "pad.wrongPassword": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.settings.padSettings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", - "pad.settings.myView": "\u041c\u043e\u0439 \u0432\u0438\u0434", - "pad.settings.stickychat": "\u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0447\u0430\u0442", - "pad.settings.colorcheck": "\u0426\u0432\u0435\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", - "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a", - "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0430:", - "pad.settings.fontType.normal": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439", - "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0439", - "pad.settings.globalView": "\u041e\u0431\u0449\u0438\u0439 \u0432\u0438\u0434", - "pad.settings.language": "\u042f\u0437\u044b\u043a:", - "pad.importExport.import_export": "\u0418\u043c\u043f\u043e\u0440\u0442\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442", - "pad.importExport.import": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e!", - "pad.importExport.export": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043a\u0430\u043a:", + "index.newPad": "Создать", + "index.createOpenPad": "или Ñоздать/открыть документ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼:", + "pad.toolbar.bold.title": "полужирный (Ctrl-B)", + "pad.toolbar.italic.title": "курÑив (Ctrl-I)", + "pad.toolbar.underline.title": "подчёркивание (Ctrl-U)", + "pad.toolbar.strikethrough.title": "зачёркивание", + "pad.toolbar.ol.title": "УпорÑдоченный ÑпиÑок", + "pad.toolbar.ul.title": "ÐеупорÑдоченный ÑпиÑок", + "pad.toolbar.indent.title": "ОтÑтуп (TAB)", + "pad.toolbar.unindent.title": "Ð’Ñ‹Ñтуп (Shift+TAB)", + "pad.toolbar.undo.title": "Отменить (Ctrl-Z)", + "pad.toolbar.redo.title": "Вернуть (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "ОчиÑтить цвета документа", + "pad.toolbar.import_export.title": "Импорт/ÑкÑпорт Ñ Ð¸Ñпользованием различных форматов файлов", + "pad.toolbar.timeslider.title": "Шкала времени", + "pad.toolbar.savedRevision.title": "Сохранить верÑию", + "pad.toolbar.settings.title": "ÐаÑтройки", + "pad.toolbar.embed.title": "ПоделитьÑÑ Ð¸ вÑтроить Ñтот документ", + "pad.toolbar.showusers.title": "Показать пользователей в документе", + "pad.colorpicker.save": "Сохранить", + "pad.colorpicker.cancel": "Отмена", + "pad.loading": "Загрузка...", + "pad.passwordRequired": "Вам нужен пароль Ð´Ð»Ñ Ð´Ð¾Ñтупа", + "pad.permissionDenied": "У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° доÑтуп", + "pad.wrongPassword": "Ðеправильный пароль", + "pad.settings.padSettings": "ÐаÑтройки документа", + "pad.settings.myView": "Мой вид", + "pad.settings.stickychat": "Ð’Ñегда отображать чат", + "pad.settings.colorcheck": "Цвета документа", + "pad.settings.linenocheck": "Ðомера Ñтрок", + "pad.settings.rtlcheck": "Читать Ñодержимое Ñправа налево?", + "pad.settings.fontType": "Тип шрифта:", + "pad.settings.fontType.normal": "Обычный", + "pad.settings.fontType.monospaced": "Моноширинный", + "pad.settings.globalView": "Общий вид", + "pad.settings.language": "Язык:", + "pad.importExport.import_export": "Импорт/ÑкÑпорт", + "pad.importExport.import": "Загрузить любой текÑтовый файл или документ", + "pad.importExport.importSuccessful": "УÑпешно!", + "pad.importExport.export": "ÐкÑпортировать текущий документ как:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportplain": "Обычный текÑÑ‚", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 OpenOffice)", + "pad.importExport.exportopen": "ODF (документ OpenOffice)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 HTML. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 AbiWord<\/a>.", - "pad.modals.connected": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d.", - "pad.modals.reconnecting": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.modals.forcereconnect": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435", - "pad.modals.userdup": "\u041e\u0442\u043a\u0440\u044b\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435", - "pad.modals.userdup.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0442\u043a\u0440\u044b\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.", - "pad.modals.userdup.advice": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u043d\u0430.", - "pad.modals.unauth": "\u041d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d", - "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.", - "pad.modals.looping": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", - "pad.modals.looping.explanation": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", - "pad.modals.looping.cause": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0431\u0440\u0430\u043d\u0434\u043c\u0430\u0443\u044d\u0440 \u0438\u043b\u0438 \u043f\u0440\u043e\u043a\u0441\u0438.", - "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.", - "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.", - "pad.modals.initsocketfail.cause": "\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c.", - "pad.modals.slowcommit": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d.", - "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442.", - "pad.modals.slowcommit.cause": "\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c.", - "pad.modals.deleted": "\u0423\u0434\u0430\u043b\u0435\u043d.", - "pad.modals.deleted.explanation": "\u042d\u0442\u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d.", - "pad.modals.disconnected": "\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043d\u043e.", - "pad.modals.disconnected.explanation": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e", - "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u043d\u0430\u043c, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0441\u044f.", - "pad.share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", - "pad.share.readonly": "\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435", - "pad.share.link": "\u0421\u0441\u044b\u043b\u043a\u0430", - "pad.share.emebdcode": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c URL", - "pad.chat": "\u0427\u0430\u0442", - "pad.chat.title": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.", - "pad.chat.loadmessages": "\u0415\u0449\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f", - "timeslider.pageTitle": "\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u043a\u0430\u043b\u0430 {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u041a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u044b:", - "timeslider.toolbar.authorsList": "\u041d\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u043e\u0432", - "timeslider.toolbar.exportlink.title": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442", - "timeslider.exportCurrent": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u0430\u043a:", - "timeslider.version": "\u0412\u0435\u0440\u0441\u0438\u044f {{version}}", - "timeslider.saved": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e {{day}}.{{month}}.{{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u044f\u043d\u0432\u0430\u0440\u044c", - "timeslider.month.february": "\u0444\u0435\u0432\u0440\u0430\u043b\u044c", - "timeslider.month.march": "\u043c\u0430\u0440\u0442", - "timeslider.month.april": "\u0430\u043f\u0440\u0435\u043b\u044c", - "timeslider.month.may": "\u043c\u0430\u0439", - "timeslider.month.june": "\u0438\u044e\u043d\u044c", - "timeslider.month.july": "\u0438\u044e\u043b\u044c", - "timeslider.month.august": "\u0430\u0432\u0433\u0443\u0441\u0442", - "timeslider.month.september": "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.october": "\u043e\u043a\u0442\u044f\u0431\u0440\u044c", - "timeslider.month.november": "\u043d\u043e\u044f\u0431\u0440\u044c", - "timeslider.month.december": "\u0434\u0435\u043a\u0430\u0431\u0440\u044c", - "timeslider.unnamedauthor": "{{num}} \u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u0440", - "timeslider.unnamedauthors": "\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432: {{num}}", - "pad.savedrevs.marked": "\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f", - "pad.userlist.entername": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0435 \u0438\u043c\u044f", - "pad.userlist.unnamed": "\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439", - "pad.userlist.guest": "\u0413\u043e\u0441\u0442\u044c", - "pad.userlist.deny": "\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c", - "pad.userlist.approve": "\u0423\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c", - "pad.editbar.clearcolors": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0432\u043e \u0432\u0441\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435?", - "pad.impexp.importbutton": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441", - "pad.impexp.importing": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u2026", - "pad.impexp.confirmimport": "\u0418\u043c\u043f\u043e\u0440\u0442 \u0444\u0430\u0439\u043b\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", - "pad.impexp.convertFailed": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e", - "pad.impexp.uploadFailed": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437", - "pad.impexp.importfailed": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438", - "pad.impexp.copypaste": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435", - "pad.impexp.exportdisabled": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {{type}} \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. \u0414\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443." -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "Ð’Ñ‹ можете импортировать только из обычного текÑта или HTML. Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ продвинутых функций импорта, пожалуйÑта, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">уÑтановите AbiWord</a>.", + "pad.modals.connected": "Подключен.", + "pad.modals.reconnecting": "Повторное подключение к вашему документу", + "pad.modals.forcereconnect": "Принудительное переподключение", + "pad.modals.userdup": "Открыто в другом окне", + "pad.modals.userdup.explanation": "Документ, возможно, открыт более чем в одном окне браузера на Ñтом компьютере.", + "pad.modals.userdup.advice": "Повторно подключить Ñ Ð¸Ñпользованием Ñтого окна.", + "pad.modals.unauth": "Ðе авторизован", + "pad.modals.unauth.explanation": "Ваши Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ изменены во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñмотра Ñтой Ñтраницы. Попробуйте подключитьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾.", + "pad.modals.looping.explanation": "Проблемы ÑвÑзи Ñ Ñервером Ñинхронизации.", + "pad.modals.looping.cause": "Возможно, вы подключилиÑÑŒ через неÑовмеÑтимый брандмауÑÑ€ или прокÑи.", + "pad.modals.initsocketfail": "Сервер недоÑтупен.", + "pad.modals.initsocketfail.explanation": "Ðе удалоÑÑŒ подключитьÑÑ Ðº Ñерверу Ñинхронизации.", + "pad.modals.initsocketfail.cause": "ВероÑтно, Ñто вызвано проблемами Ñ Ð²Ð°ÑˆÐ¸Ð¼ браузером или интернет-Ñоединением.", + "pad.modals.slowcommit.explanation": "Сервер не отвечает.", + "pad.modals.slowcommit.cause": "Ðто может быть вызвано проблемами Ñ Ñетевым подключением.", + "pad.modals.badChangeset.explanation": "Правка, которую вы Ñделали, была клаÑÑифицирована Ñервером Ñинхронизации как недопуÑтимаÑ.", + "pad.modals.badChangeset.cause": "Ðто может быть из-за неправильной конфигурации Ñервера или некоторых других неожиданных дейÑтвий. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором Ñлужбы, еÑли вы Ñчитаете, что Ñто ошибка. Попробуйте переподключитьÑÑ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы продолжить редактирование.", + "pad.modals.corruptPad.explanation": "Документ, к которому вы пытаетеÑÑŒ получить доÑтуп, повреждён.", + "pad.modals.corruptPad.cause": "Ðто может быть из-за неправильной конфигурации Ñервера или некоторых других неожиданных дейÑтвий. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором Ñлужбы.", + "pad.modals.deleted": "Удален.", + "pad.modals.deleted.explanation": "Ðтот документ был удален.", + "pad.modals.disconnected": "Соединение разорвано.", + "pad.modals.disconnected.explanation": "Подключение к Ñерверу потерÑно", + "pad.modals.disconnected.cause": "Сервер, возможно, недоÑтупен. ПожалуйÑта, Ñообщите админиÑтратору Ñлужбы, еÑли проблема будет повторÑÑ‚ÑÑ.", + "pad.share": "ПоделитьÑÑ", + "pad.share.readonly": "Только чтение", + "pad.share.link": "СÑылка", + "pad.share.emebdcode": "Ð’Ñтавить URL", + "pad.chat": "Чат", + "pad.chat.title": "Открыть чат Ð´Ð»Ñ Ñтого документа.", + "pad.chat.loadmessages": "Еще ÑообщениÑ", + "timeslider.pageTitle": "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑˆÐºÐ°Ð»Ð° {{appTitle}}", + "timeslider.toolbar.returnbutton": "К документу", + "timeslider.toolbar.authors": "Ðвторы:", + "timeslider.toolbar.authorsList": "Ðет авторов", + "timeslider.toolbar.exportlink.title": "ÐкÑпорт", + "timeslider.exportCurrent": "ÐкÑпортировать текущую верÑию как:", + "timeslider.version": "ВерÑÐ¸Ñ {{version}}", + "timeslider.saved": "Сохранено {{day}}.{{month}}.{{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Ñнварь", + "timeslider.month.february": "февраль", + "timeslider.month.march": "март", + "timeslider.month.april": "апрель", + "timeslider.month.may": "май", + "timeslider.month.june": "июнь", + "timeslider.month.july": "июль", + "timeslider.month.august": "авгуÑÑ‚", + "timeslider.month.september": "ÑентÑбрь", + "timeslider.month.october": "октÑбрь", + "timeslider.month.november": "ноÑбрь", + "timeslider.month.december": "декабрь", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: безымÑнный автор, few: безымÑнных автора, many: безымÑнных авторов, other: безымÑнных авторов]}", + "pad.savedrevs.marked": "Ðта верÑÐ¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ помечена как ÑохраненнаÑ", + "pad.userlist.entername": "Введите ваше имÑ", + "pad.userlist.unnamed": "безымÑнный", + "pad.userlist.guest": "ГоÑÑ‚ÑŒ", + "pad.userlist.deny": "Отклонить", + "pad.userlist.approve": "Утвердить", + "pad.editbar.clearcolors": "ОчиÑтить авторÑкие цвета во вÑем документе?", + "pad.impexp.importbutton": "Импортировать ÑейчаÑ", + "pad.impexp.importing": "Импортирование…", + "pad.impexp.confirmimport": "Импорт файла перезапишет текущий текÑÑ‚. Ð’Ñ‹ уверены, что вы хотите продолжить?", + "pad.impexp.convertFailed": "Ðе удалоÑÑŒ импортировать Ñтот файл. ПожалуйÑта, иÑпользуйте другой формат или Ñкопируйте вручную", + "pad.impexp.uploadFailed": "Загрузка не удалаÑÑŒ, пожалуйÑта, попробуйте ещё раз", + "pad.impexp.importfailed": "Ошибка при импортировании", + "pad.impexp.copypaste": "ПожалуйÑта, Ñкопируйте", + "pad.impexp.exportdisabled": "ÐкÑпорт в формате {{type}} отключен. Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации обратитеÑÑŒ к ÑиÑтемному админиÑтратору." +} diff --git a/src/locales/sco.json b/src/locales/sco.json new file mode 100644 index 00000000..efcb187a --- /dev/null +++ b/src/locales/sco.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "John Reid" + ] + }, + "index.newPad": "New Pad", + "index.createOpenPad": "or mak/apen ae Pad wi the name:", + "pad.toolbar.bold.title": "Bold (Ctrl-B)", + "pad.toolbar.italic.title": "Italic (Ctrl-I)", + "pad.toolbar.underline.title": "Underline (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Cross-oot", + "pad.toolbar.ol.title": "Ordered leet", + "pad.toolbar.ul.title": "Onordered Leet", + "pad.toolbar.indent.title": "Indent (TAB)", + "pad.toolbar.unindent.title": "Ootdent (Shift+TAB)", + "pad.toolbar.undo.title": "Ondae (Ctrl-Z)", + "pad.toolbar.redo.title": "Redae (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Clear Authorship Colours", + "pad.toolbar.import_export.title": "Import/Export fae/til different file formats", + "pad.toolbar.timeslider.title": "Timeslider", + "pad.toolbar.savedRevision.title": "Hain Reveesion", + "pad.toolbar.settings.title": "Settins", + "pad.toolbar.embed.title": "Shair n Embed this pad", + "pad.toolbar.showusers.title": "Shaw the uisers oan this pad", + "pad.colorpicker.save": "Hain", + "pad.colorpicker.cancel": "Cancel", + "pad.loading": "Laidin...", + "pad.passwordRequired": "Ye need ae passwaird fer tae access this pad", + "pad.permissionDenied": "Ye dinna hae permeession tae access this pad", + "pad.wrongPassword": "Yer password wis wrang", + "pad.settings.padSettings": "Pad Settins", + "pad.settings.myView": "Ma Luik", + "pad.settings.stickychat": "Tauk aye oan screen", + "pad.settings.colorcheck": "Authorship colours", + "pad.settings.linenocheck": "Line nummers", + "pad.settings.rtlcheck": "Read content fae richt til cair?", + "pad.settings.fontType": "Font type:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "The Global Luik", + "pad.settings.language": "Leid:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Upload oni tex file or document", + "pad.importExport.importSuccessful": "Success!", + "pad.importExport.export": "Export current pad as:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Plain tex", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Ye can yinly import fae plain tex or HTML formats. Fer mair advanced import features please <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">install abiword</a>.", + "pad.modals.connected": "Connected.", + "pad.modals.reconnecting": "Reconnectin til yer pad..", + "pad.modals.forcereconnect": "Force reconnect", + "pad.modals.userdup": "Apened in anither windae", + "pad.modals.userdup.explanation": "This pad seems tae be apened in mair than yin brouser windae on this computer.", + "pad.modals.userdup.advice": "Reconnect fer tae uise this windae instead.", + "pad.modals.unauth": "Naw authorized", + "pad.modals.unauth.explanation": "Yer permeessions hae chynged while viewing this page. Try tae reconnect.", + "pad.modals.looping.explanation": "Thaur ar communication proablems wi the synchronization server.", + "pad.modals.looping.cause": "Meyhaps ye connected through aen incompatible firewa or proxy.", + "pad.modals.initsocketfail": "Server canna be reached.", + "pad.modals.initsocketfail.explanation": "Coudna connect til the synchronization server.", + "pad.modals.initsocketfail.cause": "This is possably cause o ae problem wi yer brouser or yer wab connection.", + "pad.modals.slowcommit.explanation": "The server isna respondin.", + "pad.modals.slowcommit.cause": "This coud be cause o problems wi netwairk connecteevitie.", + "pad.modals.badChangeset.explanation": "Aen eedit that ye'v makit wis classeefied aes onlegal bi the synchronization server.", + "pad.modals.badChangeset.cause": "This coud be cause o ae wrang server confeeguration or some ither onexpected behavior. Please contact the service admeenistrator, gif ye feel that this is ae mistak. Try tae reconnect in order tae continue editing.", + "pad.modals.corruptPad.explanation": "The pad ye'r trying te access is mingin.", + "pad.modals.corruptPad.cause": "This micht be cause o ae wrang server confeeguration or some ither onexpected behavior. Please contact the service admeenistrater.", + "pad.modals.deleted": "Delytit.", + "pad.modals.deleted.explanation": "This pad has been hif't.", + "pad.modals.disconnected": "Ye'v been disconnected.", + "pad.modals.disconnected.explanation": "The connection til the server wis loast", + "pad.modals.disconnected.cause": "The server micht be onavailable. Please notify the service admeenistrater gif this continues tae happen.", + "pad.share": "Share this pad", + "pad.share.readonly": "Read yinly", + "pad.share.link": "Airtin", + "pad.share.emebdcode": "Embed URL", + "pad.chat": "Chait", + "pad.chat.title": "Apen the tauk fer this pad.", + "pad.chat.loadmessages": "Laid mair messages", + "timeslider.pageTitle": "{{appTitle}} Timeslider", + "timeslider.toolbar.returnbutton": "Return til pad", + "timeslider.toolbar.authors": "Authers:", + "timeslider.toolbar.authorsList": "Nae Authers", + "timeslider.toolbar.exportlink.title": "Export", + "timeslider.exportCurrent": "Export current version as:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Saved {{day}} {{month}}, {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januair", + "timeslider.month.february": "Febuair", + "timeslider.month.march": "Mairch", + "timeslider.month.april": "Apryle", + "timeslider.month.may": "Mey", + "timeslider.month.june": "Juin", + "timeslider.month.july": "Julie", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "October", + "timeslider.month.november": "November", + "timeslider.month.december": "Dizember", + "timeslider.unnamedauthors": "{{num}} onnamed {[plural(num) one: writer, other: writers ]}", + "pad.savedrevs.marked": "This reveesion is nou tagged aes ae hained reveesion", + "pad.userlist.entername": "Enter yer name", + "pad.userlist.unnamed": "onnamed", + "pad.userlist.guest": "Guest", + "pad.userlist.deny": "Bar", + "pad.userlist.approve": "Appruiv", + "pad.editbar.clearcolors": "Clear authership colours oan the entire document?", + "pad.impexp.importbutton": "Import Nou", + "pad.impexp.importing": "Importing...", + "pad.impexp.confirmimport": "Importin ae file will owerwrite the current tex o the pad. Ar ye sair ye want tae proceed?", + "pad.impexp.convertFailed": "We coudna import this file. Please uise ae different document format or copy paste manually", + "pad.impexp.uploadFailed": "The upload failed, please try again", + "pad.impexp.importfailed": "The import failed", + "pad.impexp.copypaste": "Please copy paste", + "pad.impexp.exportdisabled": "Exporting as {{type}} format is disabled. Please contact yer system admeenistrator fer details." +} diff --git a/src/locales/sk.json b/src/locales/sk.json new file mode 100644 index 00000000..8f376926 --- /dev/null +++ b/src/locales/sk.json @@ -0,0 +1,124 @@ +{ + "@metadata": { + "authors": [ + "Teslaton", + "Kusavica", + "Rudko" + ] + }, + "index.newPad": "Nový Pad", + "index.createOpenPad": "alebo vytvoriÅ¥/otvoriÅ¥ Pad s názvom:", + "pad.toolbar.bold.title": "TuÄné (Ctrl-B)", + "pad.toolbar.italic.title": "KurzÃva (Ctrl-I)", + "pad.toolbar.underline.title": "PodÄiarknuté (Ctrl-U)", + "pad.toolbar.strikethrough.title": "PreÄiarknuté", + "pad.toolbar.ol.title": "ÄŒÃslovaný zoznam", + "pad.toolbar.ul.title": "Odrážkový zoznam", + "pad.toolbar.indent.title": "ZväÄÅ¡iÅ¥ odsadenie (TAB)", + "pad.toolbar.unindent.title": "ZmenÅ¡iÅ¥ odsadenie (Shift+TAB)", + "pad.toolbar.undo.title": "Späť (Ctrl-Z)", + "pad.toolbar.redo.title": "Znova (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "OdstrániÅ¥ farby autorstva", + "pad.toolbar.import_export.title": "Import/export z/do rôznych formátov súborov", + "pad.toolbar.timeslider.title": "ÄŒasová os", + "pad.toolbar.savedRevision.title": "UložiÅ¥ revÃziu", + "pad.toolbar.settings.title": "Nastavenia", + "pad.toolbar.embed.title": "ZdieľaÅ¥ alebo vložiÅ¥ tento Pad", + "pad.toolbar.showusers.title": "ZobraziÅ¥ použÃvateľov tohoto Padu", + "pad.colorpicker.save": "UložiÅ¥", + "pad.colorpicker.cancel": "ZruÅ¡iÅ¥", + "pad.loading": "NaÄÃtava sa...", + "pad.passwordRequired": "PrÃstup k tomuto Padu je chránený heslom", + "pad.permissionDenied": "Ľutujeme, nemáte oprávnenie pristupovaÅ¥ k tomuto Padu", + "pad.wrongPassword": "Nesprávne heslo", + "pad.settings.padSettings": "Nastavenia Padu", + "pad.settings.myView": "Vlastný pohľad", + "pad.settings.stickychat": "Chat stále na obrazovke", + "pad.settings.colorcheck": "Farby autorstva", + "pad.settings.linenocheck": "ÄŒÃsla riadkov", + "pad.settings.rtlcheck": "ÄŒÃtaÅ¥ obsah sprava doľava?", + "pad.settings.fontType": "Typ pÃsma:", + "pad.settings.fontType.normal": "Normálne", + "pad.settings.fontType.monospaced": "Strojové", + "pad.settings.globalView": "Globálny pohľad", + "pad.settings.language": "Jazyk:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "NahraÅ¥ ľubovoľný textový súbor alebo dokument", + "pad.importExport.importSuccessful": "Import úspeÅ¡ný!", + "pad.importExport.export": "ExportovaÅ¥ aktuálny Pad ako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "ÄŒistý text", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "ImportovaÅ¥ môžete len Äistý text alebo HTML. Pre pokroÄilejÅ¡ie funkcie importu prosÃm nainÅ¡talujte „<a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Abiword</a>“.", + "pad.modals.connected": "Pripojené.", + "pad.modals.reconnecting": "Opätovné pripájanie k vášmu Padu...", + "pad.modals.forcereconnect": "VynútiÅ¥ znovupripojenie", + "pad.modals.userdup": "Otvorené v inom okne", + "pad.modals.userdup.explanation": "Zdá sa, že tento Pad je na tomto poÄÃtaÄi otvorený vo viacerých oknách prehliadaÄa.", + "pad.modals.userdup.advice": "Pre použitie tohoto okna se musÃte znovu pripojiÅ¥.", + "pad.modals.unauth": "Nie ste autorizovaný", + "pad.modals.unauth.explanation": "VaÅ¡e oprávnenia sa poÄas prehliadania tejto stránky zmenili. Skúste sa pripojiÅ¥ znovu.", + "pad.modals.looping.explanation": "Nastali problémy pri komunikácii so synchronizaÄným serverom.", + "pad.modals.looping.cause": "Možno ste pripojenà cez nekompatibilný firewall alebo proxy server.", + "pad.modals.initsocketfail": "Server je nedostupný.", + "pad.modals.initsocketfail.explanation": "Nepodarilo sa pripojiÅ¥ k synchronizaÄnému serveru.", + "pad.modals.initsocketfail.cause": "PrÃÄinou je pravdepodobne problém s prehliadaÄom alebo internetovým pripojenÃm.", + "pad.modals.slowcommit.explanation": "Server neodpovedá.", + "pad.modals.slowcommit.cause": "PrÃÄinou môže byÅ¥ problém so sieÅ¥ovým pripojenÃm.", + "pad.modals.badChangeset.explanation": "Editácia, kterú ste vykonali byla synchronizáciou serveru vyhodnotená ako nepovolená.", + "pad.modals.badChangeset.cause": "To môže byÅ¥ z dôvodu nesprávnej konfigurácie servera alebo iného neoÄakávaného správania. Ak máte pocit že doÅ¡lo k chybe, kontaktuje prosÃm správcu služby. Pokúste sa pripojiÅ¥ znova a pokraÄovaÅ¥ v úpravách.", + "pad.modals.corruptPad.explanation": "Pad ku ktorému sa snažÃte zÃskaÅ¥ prÃstup je poÅ¡kodený.", + "pad.modals.corruptPad.cause": "To môže byÅ¥ z dôvodu nesprávnej konfigurácie servera alebo iného neoÄakávaného správania. ProsÃm, obráťte sa na správcu služby.", + "pad.modals.deleted": "Odstránené.", + "pad.modals.deleted.explanation": "Tento Pad bol odstránený.", + "pad.modals.disconnected": "Boli ste odpojenÃ.", + "pad.modals.disconnected.explanation": "Spojenie so serverom sa preruÅ¡ilo", + "pad.modals.disconnected.cause": "Server môže byÅ¥ nedostupný. Ak by problém pretrvával, informujte správcu služby.", + "pad.share": "ZdieľaÅ¥ tento Pad", + "pad.share.readonly": "Len na ÄÃtanie", + "pad.share.link": "Odkaz", + "pad.share.emebdcode": "VložiÅ¥ URL", + "pad.chat": "Chat", + "pad.chat.title": "OtvoriÅ¥ chat tohoto Padu.", + "pad.chat.loadmessages": "NaÄÃtaÅ¥ ÄalÅ¡ie správy", + "timeslider.pageTitle": "ÄŒasová os {{appTitle}}", + "timeslider.toolbar.returnbutton": "Návrat do Padu", + "timeslider.toolbar.authors": "Autori:", + "timeslider.toolbar.authorsList": "Bez autorov", + "timeslider.toolbar.exportlink.title": "Export", + "timeslider.exportCurrent": "ExportovaÅ¥ aktuálnu verziu ako:", + "timeslider.version": "Verzia {{version}}", + "timeslider.saved": "Uložené {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januára", + "timeslider.month.february": "februára", + "timeslider.month.march": "marca", + "timeslider.month.april": "aprÃla", + "timeslider.month.may": "mája", + "timeslider.month.june": "júna", + "timeslider.month.july": "júla", + "timeslider.month.august": "augusta", + "timeslider.month.september": "septembra", + "timeslider.month.october": "októbra", + "timeslider.month.november": "novembra", + "timeslider.month.december": "decembra", + "timeslider.unnamedauthors": "{{num}} {[ plural(num) one: nemenovaný autor, few: nemenovanà autori, other: nemenovaných autorov ]}", + "pad.savedrevs.marked": "Táto revÃzia bola oznaÄená ako uložená", + "pad.userlist.entername": "Zadajte svoje meno", + "pad.userlist.unnamed": "nemenovaný", + "pad.userlist.guest": "HosÅ¥", + "pad.userlist.deny": "ZakázaÅ¥", + "pad.userlist.approve": "SchváliÅ¥", + "pad.editbar.clearcolors": "SkutoÄne odstrániÅ¥ autorské farby z celého dokumentu?", + "pad.impexp.importbutton": "ImportovaÅ¥", + "pad.impexp.importing": "Prebieha import...", + "pad.impexp.confirmimport": "Import súboru prepÃÅ¡e celý súÄasný obsah Padu. SkutoÄne si želáte vykonaÅ¥ túto akciu?", + "pad.impexp.convertFailed": "Tento súbor nie je možné importovaÅ¥. Použite prosÃm iný formát súboru alebo nakopÃrujte text manuálne", + "pad.impexp.uploadFailed": "Nahrávanie zlyhalo, skúste to prosÃm znovu", + "pad.impexp.importfailed": "Import zlyhal", + "pad.impexp.copypaste": "Vložte prosÃm kópiu cez schránku", + "pad.impexp.exportdisabled": "Export do formátu {{type}} nie je povolený. Kontaktujte prosÃm administrátora pre zistenie detailov." +} diff --git a/src/locales/sl.json b/src/locales/sl.json index edfa68c0..8e57cffa 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -1,47 +1,49 @@ { "@metadata": { "authors": [ + "Dbc334", "Mateju" ] }, "index.newPad": "Nov dokument", "index.createOpenPad": "ali pa odpri dokument z imenom:", "pad.toolbar.bold.title": "Krepko (Ctrl-B)", - "pad.toolbar.italic.title": "Le\u017ee\u010de (Ctrl-I)", - "pad.toolbar.underline.title": "Pod\u010drtano (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Pre\u010drtano", - "pad.toolbar.ol.title": "O\u0161tevil\u010den seznam", - "pad.toolbar.ul.title": "Vrsti\u010dni seznam", - "pad.toolbar.indent.title": "Zamik desno", - "pad.toolbar.unindent.title": "Zamik levo", + "pad.toolbar.italic.title": "LežeÄe (Ctrl-I)", + "pad.toolbar.underline.title": "PodÄrtano (Ctrl-U)", + "pad.toolbar.strikethrough.title": "PreÄrtano", + "pad.toolbar.ol.title": "OÅ¡tevilÄen seznam", + "pad.toolbar.ul.title": "VrstiÄni seznam", + "pad.toolbar.indent.title": "Zamik desno (TAB)", + "pad.toolbar.unindent.title": "Zamik levo (Shift+TAB)", "pad.toolbar.undo.title": "Razveljavi (Ctrl-Z)", "pad.toolbar.redo.title": "Ponovno uveljavi (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Po\u010disti barvo avtorstva", - "pad.toolbar.import_export.title": "Izvozi\/Uvozi razli\u010dne oblike zapisov", + "pad.toolbar.clearAuthorship.title": "PoÄisti barvo avtorstva", + "pad.toolbar.import_export.title": "Izvozi/Uvozi razliÄne oblike zapisov", "pad.toolbar.timeslider.title": "Drsnik zgodovine", - "pad.toolbar.savedRevision.title": "Shranjene predelave", + "pad.toolbar.savedRevision.title": "Shrani predelavo", "pad.toolbar.settings.title": "Nastavitve", - "pad.toolbar.embed.title": "Vstavi dokument", - "pad.toolbar.showusers.title": "Poka\u017ei uporabnike dokumenta", + "pad.toolbar.embed.title": "Deli in vkljuÄi dokument", + "pad.toolbar.showusers.title": "Pokaži uporabnike dokumenta", "pad.colorpicker.save": "Shrani", - "pad.colorpicker.cancel": "Prekli\u010di", + "pad.colorpicker.cancel": "PrekliÄi", "pad.loading": "Nalaganje ...", "pad.passwordRequired": "Za dostop do dokumenta je zahtevano geslo.", "pad.permissionDenied": "Za dostop do dokumenta so zahtevana posebna dovoljenja.", - "pad.wrongPassword": "Vpisano geslo je napa\u010dno.", + "pad.wrongPassword": "Vpisano geslo je napaÄno.", "pad.settings.padSettings": "Nastavitve dokumenta", "pad.settings.myView": "Pogled", "pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu.", "pad.settings.colorcheck": "Barve avtorstva", - "pad.settings.linenocheck": "\u0160tevilke vrstic", + "pad.settings.linenocheck": "Å tevilke vrstic", + "pad.settings.rtlcheck": "Ali naj se vsebina prebira od desne proti levi?", "pad.settings.fontType": "Vrsta pisave:", - "pad.settings.fontType.normal": "Obi\u010dajno", + "pad.settings.fontType.normal": "ObiÄajno", "pad.settings.fontType.monospaced": "Monospace", - "pad.settings.globalView": "Splo\u0161ni pogled", + "pad.settings.globalView": "SploÅ¡ni pogled", "pad.settings.language": "Jezik:", - "pad.importExport.import_export": "Uvoz\/Izvoz", - "pad.importExport.import": "Nalo\u017ei katerokoli besedilno datoteko ali dokument.", - "pad.importExport.importSuccessful": "Opravilo je uspe\u0161no kon\u010dano!", + "pad.importExport.import_export": "Uvoz/Izvoz", + "pad.importExport.import": "Naloži katerokoli besedilno datoteko ali dokument.", + "pad.importExport.importSuccessful": "Opravilo je uspeÅ¡no konÄano!", "pad.importExport.export": "Izvozi trenutni dokument kot:", "pad.importExport.exporthtml": "HTML (oblikovano besedilo)", "pad.importExport.exportplain": "TXT (neoblikovano besedilo)", @@ -49,43 +51,45 @@ "pad.importExport.exportpdf": "PDF (zapis Acrobat PDF)", "pad.importExport.exportopen": "ODF (zapis Open Document)", "pad.importExport.exportdokuwiki": "DokuWiki (zapis DokuWiki)", - "pad.importExport.abiword.innerHTML": "Uvoziti je mogo\u010de le obi\u010dajno neoblikovano besedilo in zapise HTML. Za naprednej\u0161e zmo\u017enosti namestite <a href=\\\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\\\">program Abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Uvoziti je mogoÄe le obiÄajno neoblikovano besedilo in zapise HTML. Za naprednejÅ¡e zmožnosti namestite <a href=\\\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\\\">program Abiword</a>.", "pad.modals.connected": "Povezano.", "pad.modals.reconnecting": "Poteka povezovanje z dokumentom ...", "pad.modals.forcereconnect": "Vsili ponovno povezavo.", - "pad.modals.userdup": "Dokument je \u017ee odprt v v drugem oknu.", - "pad.modals.userdup.explanation": "Videti je, da je ta dokument odprt v ve\u010d kot enem oknu brskalnika na tem ra\u010dunalniku.", + "pad.modals.userdup": "Dokument je že odprt v v drugem oknu.", + "pad.modals.userdup.explanation": "Videti je, da je ta dokument odprt v veÄ kot enem oknu brskalnika na tem raÄunalniku.", "pad.modals.userdup.advice": "Ponovno vzpostavite povezavo in uporabljajte to okno.", - "pad.modals.unauth": "Nepoobla\u0161\u010den dostop", + "pad.modals.unauth": "NepooblaÅ¡Äen dostop", "pad.modals.unauth.explanation": "Med pregledovanjem te strani so se dovoljenja za ogled spremenila. Treba se bo znova povezati.", - "pad.modals.looping": "Prekinjena povezava.", - "pad.modals.looping.explanation": "Zaznane so te\u017eave s povezavo za usklajevanje s stre\u017enikom.", - "pad.modals.looping.cause": "Morda je vzpostavljena povezava preko neustrezno nastavljenega po\u017earnega zidu ali posredni\u0161kega stre\u017enika.", - "pad.modals.initsocketfail": "Dostop do stre\u017enika ni mogo\u010d.", - "pad.modals.initsocketfail.explanation": "Povezava s stre\u017enikom za usklajevanje ni mogo\u010da.", - "pad.modals.initsocketfail.cause": "Najverjetneje je te\u017eava v brskalniku, ali pa so te\u017eave z internetno povezavo.", - "pad.modals.slowcommit": "Prekinjena povezava.", - "pad.modals.slowcommit.explanation": "Stre\u017enik se ne odziva.", - "pad.modals.slowcommit.cause": "Najverjetneje je pri\u0161lo do napake med vzpostavitvijo povezave.", + "pad.modals.looping.explanation": "Zaznane so težave s povezavo za usklajevanje s strežnikom.", + "pad.modals.looping.cause": "Morda je vzpostavljena povezava preko neustrezno nastavljenega požarnega zidu ali posredniÅ¡kega strežnika.", + "pad.modals.initsocketfail": "Dostop do strežnika ni mogoÄ.", + "pad.modals.initsocketfail.explanation": "Povezava s strežnikom za usklajevanje ni mogoÄa.", + "pad.modals.initsocketfail.cause": "Najverjetneje je težava v brskalniku, ali pa so težave z internetno povezavo.", + "pad.modals.slowcommit.explanation": "Strežnik se ne odziva.", + "pad.modals.slowcommit.cause": "Najverjetneje je priÅ¡lo do napake med vzpostavitvijo povezave.", + "pad.modals.badChangeset.explanation": "Urejanje, ki ste ga naredili, je sinhronizacijski strežnik oznaÄil kot nelegalno.", + "pad.modals.badChangeset.cause": "Razlog za to je morda napaÄna konfiguracija strežnika ali neko drugo nepriÄakovano vedenje. Prosimo, stopite v stik z upravljavcem storitve, Äe menite, da gre za napako. Poskusite se ponovno povezati, da nadaljujete z urejanjem.", + "pad.modals.corruptPad.explanation": "Blok, do katerega želite dostopati, je poÅ¡kodovan.", + "pad.modals.corruptPad.cause": "Razlog za to je morda napaÄna konfiguracija strežnika ali neko drugo nepriÄakovano vedenje. Prosimo, stopite v stik z upravljavcem storitve.", "pad.modals.deleted": "Izbrisano.", "pad.modals.deleted.explanation": "Dokument je odstranjen.", "pad.modals.disconnected": "Povezava je prekinjena.", - "pad.modals.disconnected.explanation": "Povezava s stre\u017enikom je bila prekinjena.", - "pad.modals.disconnected.cause": "Stre\u017enik je najverjetneje nedosegljiv. Po\u0161ljite poro\u010dilo, \u010de s napaka ve\u010dkrat pojavi.", - "pad.share": "Dolo\u010di souporabo dokumenta", + "pad.modals.disconnected.explanation": "Povezava s strežnikom je bila prekinjena.", + "pad.modals.disconnected.cause": "Strežnik je morda nedosegljiv. Prosimo, obvestite skrbnika storitve, Äe se to zgodi veÄkrat.", + "pad.share": "DoloÄi souporabo dokumenta", "pad.share.readonly": "Le za branje", "pad.share.link": "Povezava", "pad.share.emebdcode": "Vstavi naslov URL", "pad.chat": "Klepet", "pad.chat.title": "Odpri klepetalno okno dokumenta.", - "pad.chat.loadmessages": "Nalo\u017ei ve\u010d sporo\u010dil", + "pad.chat.loadmessages": "Naloži veÄ sporoÄil", "timeslider.pageTitle": "Zgodovina dokumenta {{appTitle}}", "timeslider.toolbar.returnbutton": "Vrni se na dokument", "timeslider.toolbar.authors": "Autorji:", - "timeslider.toolbar.authorsList": "Ni dolo\u010denih avtorjev", + "timeslider.toolbar.authorsList": "Ni doloÄenih avtorjev", "timeslider.toolbar.exportlink.title": "Izvozi", - "timeslider.exportCurrent": "Izvozi trenutno razli\u010dico kot:", - "timeslider.version": "Razli\u010dica {{version}}", + "timeslider.exportCurrent": "Izvozi trenutno razliÄico kot:", + "timeslider.version": "RazliÄica {{version}}", "timeslider.saved": "Shranjeno {{day}}.{{month}}.{{year}}", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januar", @@ -100,21 +104,20 @@ "timeslider.month.october": "Oktober", "timeslider.month.november": "November", "timeslider.month.december": "December", - "timeslider.unnamedauthor": "neimenovani avtor {{num}}", - "timeslider.unnamedauthors": "{{num}} neimenovani avtorji", - "pad.savedrevs.marked": "Ta predelava je ozna\u010dena kot shranjena predelava.", - "pad.userlist.entername": "Vpi\u0161ite ime", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: neimenovan avtor, plural(num) two: neimenovana avtorja, plural(num) few: neimenovani avtorji, other: neimenovanih avtorjev ]}", + "pad.savedrevs.marked": "Ta predelava je oznaÄena kot shranjena predelava.", + "pad.userlist.entername": "VpiÅ¡ite ime", "pad.userlist.unnamed": "neimenovana oseba", "pad.userlist.guest": "Gost", "pad.userlist.deny": "Zavrni", "pad.userlist.approve": "Odobri", - "pad.editbar.clearcolors": "Ali naj se po\u010distijo barve avtorstva v celotnem dokumentu?", + "pad.editbar.clearcolors": "Ali naj se poÄistijo barve avtorstva v celotnem dokumentu?", "pad.impexp.importbutton": "Uvozi takoj", - "pad.impexp.importing": "Poteka uva\u017eanje ...", - "pad.impexp.confirmimport": "Uvoz datoteke prepi\u0161e obstoje\u010de besedilo dokumenta. Ali ste prepri\u010dani, da \u017eelite nadaljevati?", - "pad.impexp.convertFailed": "Datoteke ni mogo\u010de uvoziti. Uporabiti je treba enega izmed podprtih zapisov dokumentov ali pa vsebino prilepiti ro\u010dno.", + "pad.impexp.importing": "Poteka uvažanje ...", + "pad.impexp.confirmimport": "Uvoz datoteke prepiÅ¡e obstojeÄe besedilo dokumenta. Ali ste prepriÄani, da želite nadaljevati?", + "pad.impexp.convertFailed": "Datoteke ni mogoÄe uvoziti. Uporabiti je treba enega izmed podprtih zapisov dokumentov ali pa vsebino prilepiti roÄno.", "pad.impexp.uploadFailed": "Nalaganje je spodletelo, poskusite znova.", "pad.impexp.importfailed": "Uvoz je spodletel.", "pad.impexp.copypaste": "Vsebino kopirajte in prilepite.", - "pad.impexp.exportdisabled": "Izvoz v zapis {{type}} je onemogo\u010den. Za ve\u010d podrobnosti stopite v stik s skrbnikom." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "Izvoz v zapis {{type}} je onemogoÄen. Za veÄ podrobnosti stopite v stik s skrbnikom." +} diff --git a/src/locales/sq.json b/src/locales/sq.json index 6ae81135..54e76067 100644 --- a/src/locales/sq.json +++ b/src/locales/sq.json @@ -5,86 +5,92 @@ ] }, "index.newPad": "Bllok i Ri", - "index.createOpenPad": "ose krijoni\/hapni nj\u00eb Bllok me emrin:", - "pad.toolbar.bold.title": "T\u00eb trasha (Ctrl-B)", - "pad.toolbar.italic.title": "T\u00eb pjerr\u00ebta (Ctrl-I)", - "pad.toolbar.underline.title": "T\u00eb n\u00ebnvizuara (Ctrl-U)", + "index.createOpenPad": "ose krijoni/hapni një Bllok me emrin:", + "pad.toolbar.bold.title": "Të trasha (Ctrl-B)", + "pad.toolbar.italic.title": "Të pjerrëta (Ctrl-I)", + "pad.toolbar.underline.title": "Të nënvizuara (Ctrl-U)", "pad.toolbar.strikethrough.title": "Hequrvije", - "pad.toolbar.ol.title": "List\u00eb e renditur", - "pad.toolbar.ul.title": "List\u00eb e parenditur", + "pad.toolbar.ol.title": "Listë e renditur", + "pad.toolbar.ul.title": "Listë e parenditur", "pad.toolbar.indent.title": "Brendazi", "pad.toolbar.unindent.title": "Jashtazi", - "pad.toolbar.undo.title": "Zhb\u00ebje (Ctrl-Z)", - "pad.toolbar.redo.title": "Rib\u00ebje (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Hiq Ngjyra Autor\u00ebsish", - "pad.toolbar.import_export.title": "Importoni\/Eksportoni nga\/n\u00eb formate t\u00eb tjera kartelash", + "pad.toolbar.undo.title": "Zhbëje (Ctrl-Z)", + "pad.toolbar.redo.title": "Ribëje (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Hiq Ngjyra Autorësish", + "pad.toolbar.import_export.title": "Importoni/Eksportoni nga/në formate të tjera kartelash", "pad.toolbar.timeslider.title": "Rrjedha kohore", - "pad.toolbar.savedRevision.title": "Rishikime t\u00eb Ruajtura", + "pad.toolbar.savedRevision.title": "Ruaje Rishikin", "pad.toolbar.settings.title": "Rregullime", - "pad.toolbar.embed.title": "Trup\u00ebzojeni k\u00ebt\u00eb bllok", - "pad.toolbar.showusers.title": "Shfaq p\u00ebrdoruesit n\u00eb k\u00ebt\u00eb bllok", + "pad.toolbar.embed.title": "Ndajeni me të tjerët dhe Trupëzojeni këtë bllok", + "pad.toolbar.showusers.title": "Shfaq përdoruesit në këtë bllok", "pad.colorpicker.save": "Ruaje", "pad.colorpicker.cancel": "Anuloje", "pad.loading": "Po ngarkohet...", - "pad.passwordRequired": "Ju duhet nj\u00eb fjal\u00ebkalim q\u00eb t\u00eb mund t\u00eb p\u00ebrdorni k\u00ebt\u00eb bllok", - "pad.permissionDenied": "Nuk keni leje t\u00eb hyni n\u00eb k\u00ebt\u00eb bllok", - "pad.wrongPassword": "Fjal\u00ebkalimi juaj qe gabim", + "pad.passwordRequired": "Ju duhet një fjalëkalim që të mund të përdorni këtë bllok", + "pad.permissionDenied": "Nuk keni leje të hyni në këtë bllok", + "pad.wrongPassword": "Fjalëkalimi juaj qe gabim", "pad.settings.padSettings": "Rregullime blloku", "pad.settings.myView": "Pamja Ime", - "pad.settings.stickychat": "Fjalosje p\u00ebrher\u00eb n\u00eb ekran", - "pad.settings.colorcheck": "Ngjyra autor\u00ebsish", + "pad.settings.stickychat": "Fjalosje përherë në ekran", + "pad.settings.colorcheck": "Ngjyra autorësish", "pad.settings.linenocheck": "Numra rreshtash", + "pad.settings.rtlcheck": "Të lexohet lënda nga e djathta në të majtë?", "pad.settings.fontType": "Lloj shkronjash:", "pad.settings.fontType.normal": "Normale", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Pamje Globale", - "pad.settings.language": "Gjuh\u00eb:", - "pad.importExport.import_export": "Import\/Eksport", - "pad.importExport.import": "Ngarkoni cil\u00ebndo kartel\u00eb teksti ose dokument", + "pad.settings.language": "Gjuhë:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Ngarkoni cilëndo kartelë teksti ose dokument", "pad.importExport.importSuccessful": "Me sukses!", - "pad.importExport.export": "Eksportojeni bllokun e tanish\u00ebm si:", + "pad.importExport.export": "Eksportojeni bllokun e tanishëm si:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "Tekst t\u00eb thjesht\u00eb", + "pad.importExport.exportplain": "Tekst të thjeshtë", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Mund t\u00eb importoni vet\u00ebm prej formati tekst i thjesht\u00eb ose html. P\u00ebr ve\u00e7ori m\u00eb t\u00eb p\u00ebrparuara importimi, ju lutemi, <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instaloni Abiword-in<\/a>.", + "pad.importExport.abiword.innerHTML": "Mund të importoni vetëm prej formati tekst i thjeshtë ose html. Për veçori më të përparuara importimi, ju lutemi, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instaloni Abiword-in</a>.", "pad.modals.connected": "I lidhur.", "pad.modals.reconnecting": "Po rilidheni te blloku juaj..", "pad.modals.forcereconnect": "Rilidhje e detyruar", - "pad.modals.userdup.explanation": "Ky bllok duket se gjendet i hapur n\u00eb m\u00eb shum\u00eb se nj\u00eb dritare shfletuesi n\u00eb k\u00ebt\u00eb kompjuter.", - "pad.modals.userdup.advice": "Rilidhu q\u00eb t\u00eb p\u00ebrdoret kjo dritare, m\u00eb mir\u00eb.", + "pad.modals.userdup": "Hapur në një tjetër dritare", + "pad.modals.userdup.explanation": "Ky bllok duket se gjendet i hapur në më shumë se një dritare shfletuesi në këtë kompjuter.", + "pad.modals.userdup.advice": "Rilidhu që të përdoret kjo dritare, më mirë.", "pad.modals.unauth": "I paautorizuar", - "pad.modals.unauth.explanation": "Nd\u00ebrkoh\u00eb q\u00eb shihnit k\u00ebt\u00eb dritare, lejet tuaja kan\u00eb ndryshuar. Provoni t\u00eb rilidheni.", - "pad.modals.looping": "I shk\u00ebputur.", - "pad.modals.looping.explanation": "Ka probleme komunikimi me sh\u00ebrbyesin e nj\u00ebkoh\u00ebsimit.", - "pad.modals.looping.cause": "Ndoshta jeni lidhur p\u00ebrmes nj\u00eb firewall-i ose nd\u00ebrmjet\u00ebsi t\u00eb pap\u00ebrputhsh\u00ebm.", - "pad.modals.initsocketfail": "Nuk kapet dot sh\u00ebrbyesi.", - "pad.modals.initsocketfail.explanation": "Nuk u lidh dot te sh\u00ebrbyesi i nj\u00ebkoh\u00ebsimit.", - "pad.modals.initsocketfail.cause": "Ka gjasa q\u00eb kjo vjen p\u00ebr shkak t\u00eb nj\u00eb problemi me shfletuesin tuaj ose lidhjen tuaj n\u00eb internet.", - "pad.modals.slowcommit": "I shk\u00ebputur.", - "pad.modals.slowcommit.explanation": "Sh\u00ebrbyesi nuk po p\u00ebrgjigjet.", - "pad.modals.slowcommit.cause": "Kjo mund t\u00eb vij\u00eb p\u00ebr shkak problemesh lidhjeje me rrjetin.", - "pad.modals.deleted": "I fshir\u00eb.", - "pad.modals.deleted.explanation": "Ky bllok \u00ebsht\u00eb hequr.", - "pad.modals.disconnected": "Jeni shk\u00ebputur.", - "pad.modals.disconnected.explanation": "U pre lidhja me sh\u00ebrbyesin", - "pad.modals.disconnected.cause": "Sh\u00ebrbyesi mund t\u00eb mos jet\u00eb n\u00eb pun\u00eb. Ju lutemi, na njoftoni, n\u00ebse kjo vazhdon t\u00eb ndodh\u00eb.", - "pad.share": "Ndajeni k\u00ebt\u00eb bllok me t\u00eb tjer\u00ebt", - "pad.share.readonly": "Vet\u00ebm p\u00ebr lexim", + "pad.modals.unauth.explanation": "Ndërkohë që shihnit këtë dritare, lejet tuaja kanë ndryshuar. Provoni të rilidheni.", + "pad.modals.looping.explanation": "Ka probleme komunikimi me shërbyesin e njëkohësimit.", + "pad.modals.looping.cause": "Ndoshta jeni lidhur përmes një firewall-i ose ndërmjetësi të papërputhshëm.", + "pad.modals.initsocketfail": "Nuk kapet dot shërbyesi.", + "pad.modals.initsocketfail.explanation": "Nuk u lidh dot te shërbyesi i njëkohësimit.", + "pad.modals.initsocketfail.cause": "Ka gjasa që kjo vjen për shkak të një problemi me shfletuesin tuaj ose lidhjen tuaj në internet.", + "pad.modals.slowcommit.explanation": "Shërbyesi nuk po përgjigjet.", + "pad.modals.slowcommit.cause": "Kjo mund të vijë për shkak problemesh lidhjeje me rrjetin.", + "pad.modals.badChangeset.explanation": "Një përpunim që keni bërë u shpall i paligjshëm nga shërbyesu i njëkohësimit.", + "pad.modals.badChangeset.cause": "Kjo mund të jetë për shkak të një formësimi të gabuar të shërbyesit ose ndonjë tjetër sjelljeje të papritur. Ju lutemi, lidhuni me përgjegjësin e shërbimit, nëse mendoni që ky është një gabim. Provoni të rilidheni që të vazhdoni përpunimin.", + "pad.modals.corruptPad.explanation": "Blloku te i cili po përpiqeni të hyni është i dëmtuar.", + "pad.modals.corruptPad.cause": "Kjo mund të vijë nga një formësim i gabuar shërbyesi ose ndonjë tjetër sjellje e papritur. Ju lutemi, lidhuni me përgjegjësin e shërbimit.", + "pad.modals.deleted": "I fshirë.", + "pad.modals.deleted.explanation": "Ky bllok është hequr.", + "pad.modals.disconnected": "Jeni shkëputur.", + "pad.modals.disconnected.explanation": "U pre lidhja me shërbyesin", + "pad.modals.disconnected.cause": "Shërbyesi mund të mos jetë në punë. Ju lutemi, njoftoni përgjegjësin e shërbimit, nëse kjo vazhdon të ndodhë.", + "pad.share": "Ndajeni këtë bllok me të tjerët", + "pad.share.readonly": "Vetëm për lexim", "pad.share.link": "Lidhje", - "pad.share.emebdcode": "URL trup\u00ebzimi", + "pad.share.emebdcode": "URL trupëzimi", "pad.chat": "Fjalosje", - "pad.chat.title": "Hapni fjalosjen p\u00ebr k\u00ebt\u00eb bllok.", - "timeslider.pageTitle": "Rrjedh\u00eb kohore e {{appTitle}}", + "pad.chat.title": "Hapni fjalosjen për këtë bllok.", + "pad.chat.loadmessages": "Ngarko më tepër mesazhe", + "timeslider.pageTitle": "Rrjedhë kohore e {{appTitle}}", "timeslider.toolbar.returnbutton": "Rikthehuni te blloku", - "timeslider.toolbar.authors": "Autor\u00eb:", - "timeslider.toolbar.authorsList": "Pa Autor\u00eb", - "timeslider.exportCurrent": "Eksportojeni versionin e tanish\u00ebm si:", + "timeslider.toolbar.authors": "Autorë:", + "timeslider.toolbar.authorsList": "Pa Autorë", + "timeslider.toolbar.exportlink.title": "Eksportoni", + "timeslider.exportCurrent": "Eksportojeni versionin e tanishëm si:", "timeslider.version": "Versioni {{version}}", - "timeslider.saved": "Ruajtur m\u00eb {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.saved": "Ruajtur më {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janar", "timeslider.month.february": "Shkurt", "timeslider.month.march": "Mars", @@ -95,21 +101,21 @@ "timeslider.month.august": "Gusht", "timeslider.month.september": "Shtator", "timeslider.month.october": "Tetor", - "timeslider.month.november": "N\u00ebntor", + "timeslider.month.november": "Nëntor", "timeslider.month.december": "Dhjetor", - "pad.savedrevs.marked": "Ky rishikim tani \u00ebsht\u00eb sh\u00ebnuar si rishikim i ruajtur", + "pad.savedrevs.marked": "Ky rishikim tani është shënuar si rishikim i ruajtur", "pad.userlist.entername": "Jepni emrin tuaj", - "pad.userlist.unnamed": "pa em\u00ebr", + "pad.userlist.unnamed": "pa emër", "pad.userlist.guest": "Vizitor", "pad.userlist.deny": "Mohoje", "pad.userlist.approve": "Miratoje", - "pad.editbar.clearcolors": "T\u00eb hiqen ngjyra autor\u00ebsish n\u00eb krejt dokumentin?", + "pad.editbar.clearcolors": "Të hiqen ngjyra autorësish në krejt dokumentin?", "pad.impexp.importbutton": "Importoje Tani", "pad.impexp.importing": "Po importohet...", - "pad.impexp.confirmimport": "Importimi i nj\u00eb kartele do t\u00eb mbishkruaj\u00eb tekstin e tanish\u00ebm t\u00eb bllokut. Jeni i sigurt se doni t\u00eb vazhdohet?", - "pad.impexp.convertFailed": "Nuk qem\u00eb n\u00eb gjendje ta importonim k\u00ebt\u00eb kartel\u00eb. Ju lutemi, p\u00ebrdorni nj\u00eb format tjet\u00ebr dokumentesh ose kopjojeni dhe hidheni dorazi", - "pad.impexp.uploadFailed": "Ngarkimi d\u00ebshtoi, ju lutemi, riprovoni", - "pad.impexp.importfailed": "Importimi d\u00ebshtoi", + "pad.impexp.confirmimport": "Importimi i një kartele do të mbishkruajë tekstin e tanishëm të bllokut. Jeni i sigurt se doni të vazhdohet?", + "pad.impexp.convertFailed": "Nuk qemë në gjendje ta importonim këtë kartelë. Ju lutemi, përdorni një format tjetër dokumentesh ose kopjojeni dhe hidheni dorazi", + "pad.impexp.uploadFailed": "Ngarkimi dështoi, ju lutemi, riprovoni", + "pad.impexp.importfailed": "Importimi dështoi", "pad.impexp.copypaste": "Ju lutemi, kopjojeni dhe ngjiteni", - "pad.impexp.exportdisabled": "Eksportimi n\u00eb formatin {{type}} \u00ebsht\u00eb i \u00e7aktivizuar. P\u00ebr holl\u00ebsi, ju lutemi, lidhuni me administratorin e sistemit." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "Eksportimi në formatin {{type}} është i çaktivizuar. Për hollësi, ju lutemi, lidhuni me administratorin e sistemit." +} diff --git a/src/locales/sv.json b/src/locales/sv.json index 8c6c2d86..623def9a 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -1,47 +1,50 @@ { "@metadata": { - "authors": { - "1": "WikiPhoenix" - } + "authors": [ + "Lokal Profil", + "WikiPhoenix", + "Jopparn" + ] }, "index.newPad": "Nytt block", - "index.createOpenPad": "eller skapa\/\u00f6ppna ett block med namnet:", + "index.createOpenPad": "eller skapa/öppna ett block med namnet:", "pad.toolbar.bold.title": "Fet (Ctrl-B)", "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", "pad.toolbar.underline.title": "Understruken (Ctrl-U)", "pad.toolbar.strikethrough.title": "Genomstruken", "pad.toolbar.ol.title": "Numrerad lista", - "pad.toolbar.ul.title": "Ta bort numrerad lista", - "pad.toolbar.indent.title": "\u00d6ka indrag", - "pad.toolbar.unindent.title": "Minska indrag", - "pad.toolbar.undo.title": "\u00c5ngra (Ctrl-Z)", - "pad.toolbar.redo.title": "G\u00f6r om (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Rensa f\u00f6rfattarf\u00e4rger", - "pad.toolbar.import_export.title": "Importera\/exportera fr\u00e5n\/till olika filformat", + "pad.toolbar.ul.title": "Osorterad lista", + "pad.toolbar.indent.title": "Öka indrag (TABB)", + "pad.toolbar.unindent.title": "Minska indrag (Shift+TABB)", + "pad.toolbar.undo.title": "Ångra (Ctrl-Z)", + "pad.toolbar.redo.title": "Gör om (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Rensa författarfärger", + "pad.toolbar.import_export.title": "Importera/exportera från/till olika filformat", "pad.toolbar.timeslider.title": "Tidsreglage", - "pad.toolbar.savedRevision.title": "Sparade revisioner", - "pad.toolbar.settings.title": "Inst\u00e4llningar", - "pad.toolbar.embed.title": "B\u00e4dda in detta block", - "pad.toolbar.showusers.title": "Visa anv\u00e4ndarna p\u00e5 detta block", + "pad.toolbar.savedRevision.title": "Spara version", + "pad.toolbar.settings.title": "Inställningar", + "pad.toolbar.embed.title": "Dela och bädda in detta block", + "pad.toolbar.showusers.title": "Visa användarna på detta block", "pad.colorpicker.save": "Spara", "pad.colorpicker.cancel": "Avbryt", - "pad.loading": "L\u00e4ser in...", - "pad.passwordRequired": "Du beh\u00f6ver ett l\u00f6senord f\u00f6r att f\u00e5 tillg\u00e5ng till detta block", - "pad.permissionDenied": "Du har inte beh\u00f6righet att f\u00e5 tillg\u00e5ng till detta block", - "pad.wrongPassword": "Ditt l\u00f6senord \u00e4r fel", - "pad.settings.padSettings": "Blockinst\u00e4llningar", + "pad.loading": "Läser in...", + "pad.passwordRequired": "Du behöver ett lösenord för att få tillgång till detta block", + "pad.permissionDenied": "Du har inte åtkomstbehörighet för detta block", + "pad.wrongPassword": "Ditt lösenord var fel", + "pad.settings.padSettings": "Blockinställningar", "pad.settings.myView": "Min vy", - "pad.settings.stickychat": "Chatten alltid p\u00e5 sk\u00e4rmen", - "pad.settings.colorcheck": "F\u00f6rfattarskapsf\u00e4rger", + "pad.settings.stickychat": "Chatten alltid på skärmen", + "pad.settings.colorcheck": "Författarskapsfärger", "pad.settings.linenocheck": "Radnummer", + "pad.settings.rtlcheck": "Vill du läsa innehållet från höger till vänster?", "pad.settings.fontType": "Typsnitt:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Fast breddsteg", "pad.settings.globalView": "Global vy", - "pad.settings.language": "Spr\u00e5k:", - "pad.importExport.import_export": "Importera\/exportera", - "pad.importExport.import": "Ladda upp en textfil eller dokument", - "pad.importExport.importSuccessful": "\u00c5tg\u00e4rden slutf\u00f6rdes!", + "pad.settings.language": "Språk:", + "pad.importExport.import_export": "Importera/Exportera", + "pad.importExport.import": "Ladda upp textfiler eller dokument", + "pad.importExport.importSuccessful": "Åtgärden slutfördes!", "pad.importExport.export": "Export aktuellt block som:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Oformaterad text", @@ -49,45 +52,47 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan endast importera fr\u00e5n oformaterad text eller html-format. F\u00f6r mer avancerade importeringsfunktioner, var god <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installera abiword<\/a>.", + "pad.importExport.abiword.innerHTML": "Du kan endast importera från oformaterad text eller html-format. För mer avancerade importeringsfunktioner, var god <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">installera abiword</a>.", "pad.modals.connected": "Ansluten.", - "pad.modals.reconnecting": "\u00c5teransluter till ditt block...", - "pad.modals.forcereconnect": "Tvinga \u00e5teranslutning", - "pad.modals.userdup": "\u00d6ppnades i ett nytt f\u00f6nster", - "pad.modals.userdup.explanation": "Detta block verkar vara \u00f6ppet i mer \u00e4n ett f\u00f6nster p\u00e5 denna dator.", - "pad.modals.userdup.advice": "\u00c5teranslut f\u00f6r att anv\u00e4nda detta f\u00f6nster ist\u00e4llet.", - "pad.modals.unauth": "Inte godk\u00e4nd", - "pad.modals.unauth.explanation": "Din beh\u00f6righet \u00e4ndrades medan du visar denna sida. F\u00f6rs\u00f6k att \u00e5teransluta.", - "pad.modals.looping": "Fr\u00e5nkopplad.", - "pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppst\u00e5tt.", - "pad.modals.looping.cause": "Kanske du \u00e4r ansluten via en inkompatibel brandv\u00e4gg eller proxy.", - "pad.modals.initsocketfail": "Servern inte kan n\u00e5s.", + "pad.modals.reconnecting": "Återansluter till ditt block...", + "pad.modals.forcereconnect": "Tvinga återanslutning", + "pad.modals.userdup": "Öppnades i ett nytt fönster", + "pad.modals.userdup.explanation": "Detta block verkar vara öppet i mer än ett fönster på denna dator.", + "pad.modals.userdup.advice": "Återanslut för att använda detta fönster istället.", + "pad.modals.unauth": "Inte godkänd", + "pad.modals.unauth.explanation": "Din behörighet ändrades medan du visar denna sida. Försök att återansluta.", + "pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppstått.", + "pad.modals.looping.cause": "Kanske du är ansluten via en inkompatibel brandvägg eller proxy.", + "pad.modals.initsocketfail": "Servern kan inte nås.", "pad.modals.initsocketfail.explanation": "Det gick inte att ansluta till synkroniseringsservern.", - "pad.modals.initsocketfail.cause": "Detta \u00e4r beror troligen p\u00e5 ett problem med din webbl\u00e4sare eller din internetanslutning.", - "pad.modals.slowcommit": "Fr\u00e5nkopplad.", + "pad.modals.initsocketfail.cause": "Detta beror troligen på ett problem med din webbläsare eller din internetanslutning.", "pad.modals.slowcommit.explanation": "Servern svarar inte.", - "pad.modals.slowcommit.cause": "Detta kan bero p\u00e5 problem med n\u00e4tverksanslutningen.", + "pad.modals.slowcommit.cause": "Detta kan bero på problem med nätverksanslutningen.", + "pad.modals.badChangeset.explanation": "En redigering som du gjort klassificerades som otillåten av synkroniseringsservern.", + "pad.modals.badChangeset.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören om du anser att detta är ett fel. Försök ansluta igen för att fortsätta redigera.", + "pad.modals.corruptPad.explanation": "Blocket du försöker komma åt är skadat.", + "pad.modals.corruptPad.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören.", "pad.modals.deleted": "Raderad.", "pad.modals.deleted.explanation": "Detta block har tagits bort.", - "pad.modals.disconnected": "Du har kopplats fr\u00e5n.", - "pad.modals.disconnected.explanation": "Anslutningen till servern avbr\u00f6ts", - "pad.modals.disconnected.cause": "Servern kanske inte \u00e4r tillg\u00e4nglig. Var god meddela oss om detta forts\u00e4tter att h\u00e4nda.", + "pad.modals.disconnected": "Du har blivit frånkopplad.", + "pad.modals.disconnected.explanation": "Anslutningen till servern avbröts", + "pad.modals.disconnected.cause": "Servern kanske är otillgänglig. Var god meddela tjänstadministratören om detta fortsätter att hända.", "pad.share": "Dela detta block", "pad.share.readonly": "Skrivskyddad", - "pad.share.link": "L\u00e4nk", - "pad.share.emebdcode": "B\u00e4dda in URL", + "pad.share.link": "Länk", + "pad.share.emebdcode": "Bädda in URL", "pad.chat": "Chatt", - "pad.chat.title": "\u00d6ppna chatten f\u00f6r detta block.", - "pad.chat.loadmessages": "L\u00e4s in fler meddelanden", - "timeslider.pageTitle": "Tidsreglage f\u00f6r {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u00c5terv\u00e4nd till blocket", - "timeslider.toolbar.authors": "F\u00f6rfattare:", - "timeslider.toolbar.authorsList": "Ingen f\u00f6rfattare", + "pad.chat.title": "Öppna chatten för detta block.", + "pad.chat.loadmessages": "Läs in fler meddelanden", + "timeslider.pageTitle": "Tidsreglage för {{appTitle}}", + "timeslider.toolbar.returnbutton": "Återvänd till blocket", + "timeslider.toolbar.authors": "Författare:", + "timeslider.toolbar.authorsList": "Inga författare", "timeslider.toolbar.exportlink.title": "Exportera", "timeslider.exportCurrent": "Exportera aktuell version som:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Sparades den {{day}} {{month}} {{year}}", - "timeslider.dateformat": "{{day}}\/{{month}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januari", "timeslider.month.february": "februari", "timeslider.month.march": "mars", @@ -100,21 +105,20 @@ "timeslider.month.october": "oktober", "timeslider.month.november": "november", "timeslider.month.december": "december", - "timeslider.unnamedauthor": "{{num}} namnl\u00f6s f\u00f6rfattare", - "timeslider.unnamedauthors": "{{num}} namnl\u00f6sa f\u00f6rfattare", - "pad.savedrevs.marked": "Denna revision \u00e4r nu markerad som en sparad revision", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: namnlös författare, other: namnlösa författare]}", + "pad.savedrevs.marked": "Denna version är nu markerad som en sparad version", "pad.userlist.entername": "Ange ditt namn", - "pad.userlist.unnamed": "namnl\u00f6s", - "pad.userlist.guest": "G\u00e4st", + "pad.userlist.unnamed": "namnlös", + "pad.userlist.guest": "Gäst", "pad.userlist.deny": "Neka", - "pad.userlist.approve": "Godk\u00e4nn", - "pad.editbar.clearcolors": "Rensa f\u00f6rfattarf\u00e4rger p\u00e5 hela dokumentet?", + "pad.userlist.approve": "Godkänn", + "pad.editbar.clearcolors": "Rensa författarfärger på hela dokumentet?", "pad.impexp.importbutton": "Importera nu", "pad.impexp.importing": "Importerar...", - "pad.impexp.confirmimport": "Att importera en fil kommer att skriva \u00f6ver den aktuella texten i blocket. \u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?", - "pad.impexp.convertFailed": "Vi kunde inte importera denna fil. Var god anv\u00e4nd ett annat dokumentformat eller kopiera och klistra in den manuellt", - "pad.impexp.uploadFailed": "Uppladdningen misslyckades, var god f\u00f6rs\u00f6k igen", + "pad.impexp.confirmimport": "Att importera en fil kommer att skriva över den aktuella texten i blocket. Är du säker på att du vill fortsätta?", + "pad.impexp.convertFailed": "Vi kunde inte importera denna fil. Var god använd ett annat dokumentformat eller kopiera och klistra in den manuellt", + "pad.impexp.uploadFailed": "Uppladdningen misslyckades, var god försök igen", "pad.impexp.importfailed": "Importering misslyckades", "pad.impexp.copypaste": "Var god kopiera och klistra in", - "pad.impexp.exportdisabled": "Exportering av formatet {{type}} \u00e4r inaktiverad. Var god kontakta din systemadministrat\u00f6r f\u00f6r mer information." -}
\ No newline at end of file + "pad.impexp.exportdisabled": "Exportering av formatet {{type}} är inaktiverad. Var god kontakta din systemadministratör för mer information." +} diff --git a/src/locales/te.json b/src/locales/te.json index 955b263a..41341d1e 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -1,83 +1,103 @@ { "@metadata": { - "authors": { - "0": "JVRKPRASAD", - "1": "Malkum", - "3": "Veeven" - } + "authors": [ + "JVRKPRASAD", + "Malkum", + "Veeven", + "Chaduvari", + "Ravichandra", + "Kiranmayee" + ] }, - "index.newPad": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c32\u0c15", - "index.createOpenPad": "\u0c12\u0c15 \u0c2a\u0c47\u0c30\u0c41\u0c24\u0c4b \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c05\u0c26\u0c47 \u0c2a\u0c47\u0c30\u0c41\u0c24\u0c4b \u0c09\u0c28\u0c4d\u0c28 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f", - "pad.toolbar.bold.title": "\u0c2e\u0c02\u0c26\u0c02", - "pad.toolbar.italic.title": "\u0c35\u0c3e\u0c32\u0c41 \u0c05\u0c15\u0c4d\u0c37\u0c30\u0c3e\u0c32\u0c41", - "pad.toolbar.underline.title": "\u0c15\u0c4d\u0c30\u0c3f\u0c02\u0c26\u0c17\u0c40\u0c24", - "pad.toolbar.strikethrough.title": "\u0c15\u0c4a\u0c1f\u0c4d\u0c1f\u0c3f\u0c35\u0c47\u0c24", - "pad.toolbar.ol.title": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c47\u0c36\u0c3f\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c28 \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e", - "pad.toolbar.ul.title": "\u0c05\u0c28\u0c3f\u0c30\u0c4d\u0c26\u0c47\u0c36\u0c3f\u0c24 \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e, ( \u0c15\u0c4d\u0c30\u0c2e\u0c2a\u0c26\u0c4d\u0c27\u0c24\u0c3f \u0c32\u0c47\u0c28\u0c3f \u0c1c\u0c3e\u0c2c\u0c3f\u0c24\u0c3e )", - "pad.toolbar.undo.title": "\u0c1a\u0c47\u0c2f\u0c35\u0c26\u0c4d\u0c26\u0c41", - "pad.toolbar.redo.title": "\u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f\u0c1a\u0c46\u0c2f\u0c4d\u0c2f\u0c3f", - "pad.toolbar.clearAuthorship.title": "\u0c2e\u0c42\u0c32\u0c15\u0c30\u0c4d\u0c24\u0c2a\u0c41 \u0c35\u0c30\u0c4d\u0c23\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c40\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f", - "pad.toolbar.import_export.title": "\u0c2d\u0c3f\u0c28\u0c4d\u0c28\u0c2e\u0c48\u0c28 \u0c30\u0c42\u0c2a\u0c32\u0c3e\u0c35\u0c28\u0c4d\u0c2f\u0c3e\u0c32\u0c28\u0c41 \u0c2c\u0c2f\u0c1f \u0c28\u0c41\u0c02\u0c21\u0c3f \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c2c\u0c2f\u0c1f\u0c15\u0c41 \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", - "pad.toolbar.timeslider.title": "\u0c2a\u0c28\u0c3f\u0c38\u0c2e\u0c2f \u0c38\u0c42\u0c1a\u0c3f\u0c15 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02", - "pad.toolbar.savedRevision.title": "\u0c26\u0c3e\u0c1a\u0c3f\u0c28 \u0c2a\u0c41\u0c28\u0c30\u0c41\u0c1a\u0c4d\u0c1a\u0c30\u0c23\u0c32\u0c41", - "pad.toolbar.settings.title": "\u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", - "pad.toolbar.embed.title": "\u0c08 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c2a\u0c4a\u0c26\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", - "pad.toolbar.showusers.title": "\u0c08 \u0c2a\u0c32\u0c15 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c35\u0c3f\u0c28\u0c3f\u0c2f\u0c4b\u0c17\u0c26\u0c3e\u0c30\u0c41\u0c32\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41", - "pad.colorpicker.save": "\u0c2d\u0c26\u0c4d\u0c30\u0c2a\u0c30\u0c1a\u0c41", - "pad.colorpicker.cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41\u0c1a\u0c47\u0c2f\u0c3f", - "pad.loading": "\u0c32\u0c4b\u0c21\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", - "pad.wrongPassword": "\u0c2e\u0c40 \u0c30\u0c39\u0c38\u0c4d\u0c2f\u0c2a\u0c26\u0c02 \u0c24\u0c2a\u0c41", - "pad.settings.padSettings": "\u0c2a\u0c32\u0c15 \u0c05\u0c2e\u0c30\u0c3f\u0c15\u0c32\u0c41", - "pad.settings.myView": "\u0c28\u0c3e \u0c09\u0c26\u0c4d\u0c26\u0c47\u0c36\u0c4d\u0c2f\u0c2e\u0c41", - "pad.settings.stickychat": "\u0c24\u0c46\u0c30\u0c2a\u0c48\u0c28\u0c47 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c0e\u0c32\u0c4d\u0c32\u0c2a\u0c41\u0c21\u0c41 \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", - "pad.settings.colorcheck": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c15\u0c41 \u0c30\u0c02\u0c17\u0c41\u0c32\u0c41", - "pad.settings.linenocheck": "\u0c35\u0c30\u0c41\u0c38 \u0c38\u0c02\u0c16\u0c4d\u0c2f\u0c32\u0c41", - "pad.settings.fontType": "\u0c05\u0c15\u0c4d\u0c37\u0c30\u0c36\u0c48\u0c32\u0c3f \u0c30\u0c15\u0c02:", - "pad.settings.fontType.normal": "\u0c38\u0c3e\u0c27\u0c3e\u0c30\u0c23", - "pad.settings.fontType.monospaced": "\u0c2e\u0c4b\u0c28\u0c4b\u0c38\u0c4d\u0c2a\u0c47\u0c38\u0c4d", - "pad.settings.globalView": "\u0c2c\u0c2f\u0c1f\u0c15\u0c3f \u0c26\u0c30\u0c4d\u0c36\u0c28\u0c02", - "pad.settings.language": "\u0c2d\u0c3e\u0c37", - "pad.importExport.import_export": "\u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f\/\u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f", - "pad.importExport.import": "\u0c2a\u0c3e\u0c20\u0c2e\u0c41 \u0c26\u0c38\u0c4d\u0c24\u0c4d\u0c30\u0c2e\u0c41 \u0c32\u0c47\u0c26\u0c3e \u0c2a\u0c24\u0c4d\u0c30\u0c2e\u0c41\u0c28\u0c41 \u0c26\u0c3f\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41", - "pad.importExport.importSuccessful": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02!", - "pad.importExport.export": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c2a\u0c32\u0c15\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c2e\u0c41\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", - "pad.importExport.exporthtml": "\u0c39\u0c46\u0c1a\u0c4d \u0c1f\u0c3f \u0c0e\u0c02 \u0c0e\u0c32\u0c4d", - "pad.importExport.exportplain": "\u0c38\u0c3e\u0c26\u0c3e \u0c2a\u0c3e\u0c20\u0c4d\u0c2f\u0c02", - "pad.importExport.exportword": "\u0c2e\u0c48\u0c15\u0c4d\u0c30\u0c4b\u0c38\u0c3e\u0c2b\u0c4d\u0c1f\u0c4d \u0c35\u0c30\u0c4d\u0c21\u0c4d", - "pad.importExport.exportpdf": "\u0c2a\u0c40 \u0c21\u0c3f \u0c0e\u0c2b\u0c4d", - "pad.importExport.exportopen": "\u0c13 \u0c21\u0c3f \u0c0e\u0c2b\u0c4d (\u0c13\u0c2a\u0c46\u0c28\u0c4d \u0c21\u0c3e\u0c15\u0c4d\u0c2f\u0c41\u0c2e\u0c46\u0c02\u0c1f\u0c4d \u0c2b\u0c3e\u0c30\u0c4d\u0c2e\u0c3e\u0c1f\u0c4d)", - "pad.importExport.exportdokuwiki": "\u0c21\u0c3e\u0c15\u0c4d\u0c2f\u0c41\u0c35\u0c3f\u0c15\u0c3f", - "pad.modals.connected": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c41\u0c26\u0c3f\u0c30\u0c3f\u0c02\u0c26\u0c3f.", - "pad.modals.reconnecting": "\u0c2e\u0c40 \u0c2a\u0c32\u0c15\u0c15\u0c41 \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c41\u0c2a\u0c41\u0c24\u0c41\u0c02\u0c26\u0c3f...", - "pad.modals.forcereconnect": "\u0c2c\u0c32\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e\u0c28\u0c48\u0c28\u0c3e \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c41\u0c26\u0c3f\u0c30\u0c3f\u0c02\u0c1a\u0c41", - "pad.modals.userdup.explanation": "\u0c08 \u0c2a\u0c32\u0c15, \u0c08 \u0c15\u0c02\u0c2a\u0c4d\u0c2f\u0c42\u0c1f\u0c30\u0c4d\u0c32\u0c4b \u0c12\u0c15\u0c1f\u0c3f\u0c15\u0c28\u0c4d\u0c28 \u0c0e\u0c15\u0c4d\u0c15\u0c41\u0c35 \u0c17\u0c35\u0c3e\u0c15\u0c4d\u0c37\u0c2e\u0c41\u0c32\u0c32\u0c4b \u0c24\u0c46\u0c30\u0c41\u0c1a\u0c41\u0c15\u0c41\u0c28\u0c4d\u0c28\u0c1f\u0c4d\u0c32\u0c41 \u0c05\u0c28\u0c3f\u0c2a\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f.", - "pad.modals.userdup.advice": "\u0c2c\u0c26\u0c41\u0c32\u0c41\u0c17\u0c3e \u0c08 \u0c17\u0c35\u0c3e\u0c15\u0c4d\u0c37\u0c2e\u0c41\u0c28\u0c41 \u0c35\u0c3e\u0c21\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c2a\u0c02\u0c21\u0c3f", - "pad.modals.unauth": "\u0c05\u0c27\u0c3f\u0c15\u0c3e\u0c30\u0c02 \u0c32\u0c47\u0c26\u0c41", - "pad.modals.unauth.explanation": "\u0c2e\u0c40\u0c30\u0c41 \u0c08 \u0c2a\u0c41\u0c1f\u0c28\u0c41 \u0c1a\u0c42\u0c38\u0c4d\u0c24\u0c42\u0c28\u0c4d\u0c28\u0c2a\u0c4d\u0c2a\u0c41\u0c21\u0c41 \u0c2e\u0c40 \u0c05\u0c28\u0c41\u0c2e\u0c24\u0c41\u0c32\u0c41 \u0c2e\u0c3e\u0c30\u0c3e\u0c2f\u0c3f. \u0c2e\u0c30\u0c32 \u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c32\u0c2a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f.", - "pad.modals.looping": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c4b\u0c32\u0c4d\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f.", - "pad.modals.slowcommit": "\u0c38\u0c02\u0c2c\u0c02\u0c27\u0c02 \u0c15\u0c4b\u0c32\u0c4d\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f.", - "pad.modals.deleted": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f ( \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28\u0c26\u0c3f )", - "pad.share": "\u0c08 \u0c2a\u0c32\u0c15\u0c28\u0c41 \u0c2a\u0c02\u0c1a\u0c41\u0c15\u0c4a\u0c28\u0c41", - "pad.share.readonly": "\u0c1a\u0c26\u0c41\u0c35\u0c41\u0c1f\u0c15\u0c41 \u0c2e\u0c3e\u0c24\u0c4d\u0c30\u0c2e\u0c47", - "pad.share.link": "\u0c32\u0c02\u0c15\u0c46", - "pad.share.emebdcode": "\u0c2f\u0c41 \u0c06\u0c30\u0c4d \u0c0e\u0c32\u0c4d \u0c28\u0c41 \u0c2a\u0c4a\u0c26\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", - "pad.chat": "\u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f", - "pad.chat.title": "\u0c08 \u0c2a\u0c32\u0c15\u0c15\u0c41 \u0c2e\u0c3e\u0c1f\u0c3e\u0c2e\u0c02\u0c24\u0c3f\u0c28\u0c3f \u0c24\u0c46\u0c30\u0c3f\u0c1a\u0c3f \u0c09\u0c02\u0c1a\u0c02\u0c21\u0c3f.", - "timeslider.pageTitle": "{{appTitle}} \u0c2a\u0c28\u0c3f\u0c38\u0c2e\u0c2f \u0c38\u0c42\u0c1a\u0c3f\u0c15 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02", - "timeslider.toolbar.returnbutton": "\u0c2a\u0c32\u0c15\u0c15\u0c3f \u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f", - "timeslider.toolbar.authors": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c41:", - "timeslider.toolbar.authorsList": "\u0c30\u0c1a\u0c2f\u0c3f\u0c24\u0c32\u0c41 \u0c32\u0c47\u0c30\u0c41", - "timeslider.exportCurrent": "\u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c05\u0c35\u0c24\u0c3e\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c08 \u0c35\u0c3f\u0c27\u0c02\u0c17\u0c3e \u0c0e\u0c17\u0c41\u0c2e\u0c24\u0c3f \u0c1a\u0c47\u0c2f\u0c41\u0c2e\u0c41:", - "timeslider.month.january": "\u0c1c\u0c28\u0c35\u0c30\u0c3f", - "timeslider.month.february": "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f", - "timeslider.month.march": "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f", - "timeslider.month.april": "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d", - "timeslider.month.may": "\u0c2e\u0c47", - "timeslider.month.june": "\u0c1c\u0c42\u0c28\u0c4d", - "timeslider.month.july": "\u0c1c\u0c42\u0c32\u0c48", - "timeslider.month.august": "\u0c06\u0c17\u0c37\u0c4d\u0c1f\u0c41", - "timeslider.month.september": "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c41", - "timeslider.month.october": "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c41", - "timeslider.month.november": "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c41", - "timeslider.month.december": "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c41" -}
\ No newline at end of file + "index.newPad": "కొతà±à°¤ పలక", + "index.createOpenPad": "à°’à°• పేరà±à°¤à±‹ పలకని సృషà±à°Ÿà°¿à°‚à°šà°‚à°¡à°¿ లేదా అదే పేరà±à°¤à±‹ ఉనà±à°¨ పలకని తెరవండి", + "pad.toolbar.bold.title": "మందం", + "pad.toolbar.italic.title": "వాలౠఅకà±à°·à°°à°¾à°²à±", + "pad.toolbar.underline.title": "à°•à±à°°à°¿à°‚దగీత", + "pad.toolbar.strikethrough.title": "కొటà±à°Ÿà°¿à°µà±‡à°¤", + "pad.toolbar.ol.title": "నిరà±à°§à±‡à°¶à°¿à°‚పబడిన జాబితా", + "pad.toolbar.ul.title": "అనిరà±à°¦à±‡à°¶à°¿à°¤ జాబితా, ( à°•à±à°°à°®à°ªà°¦à±à°§à°¤à°¿ లేని జాబితా )", + "pad.toolbar.undo.title": "చేయవదà±à°¦à±", + "pad.toolbar.redo.title": "తిరిగిచెయà±à°¯à°¿", + "pad.toolbar.clearAuthorship.title": "మూలకరà±à°¤à°ªà± వరà±à°£à°¾à°²à°¨à± తీసివేయండి", + "pad.toolbar.import_export.title": "à°à°¿à°¨à±à°¨à°®à±ˆà°¨ రూపలావనà±à°¯à°¾à°²à°¨à± బయట à°¨à±à°‚à°¡à°¿ దిగà±à°®à°¤à°¿ లేదా బయటకౠఎగà±à°®à°¤à°¿ చేయండి", + "pad.toolbar.timeslider.title": "పనిసమయ సూచిక పరికరం", + "pad.toolbar.savedRevision.title": "à°ªà±à°¨à°°à±à°šà±à°šà°°à°£à°²à± దాచà±", + "pad.toolbar.settings.title": "అమరికలà±", + "pad.toolbar.embed.title": "à°ˆ పలకని పొదగించి పంచిపెటà±à°Ÿà°‚à°¡à°¿", + "pad.toolbar.showusers.title": "à°ˆ పలక యొకà±à°• వినియోగదారà±à°²à°¨à± చూపించà±", + "pad.colorpicker.save": "à°à°¦à±à°°à°ªà°°à°šà±", + "pad.colorpicker.cancel": "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿", + "pad.loading": "లోడవà±à°¤à±‹à°‚ది...", + "pad.permissionDenied": "à°ˆ పేజీని చూడడానికి మీరౠఅనà±à°®à°¤à°¿ లేదà±.", + "pad.wrongPassword": "మీ సంకేతపదం తపà±à°ªà±", + "pad.settings.padSettings": "పలక అమరికలà±", + "pad.settings.myView": "నా ఉదà±à°¦à±‡à°¶à±à°¯à°®à±", + "pad.settings.stickychat": "తెరపైనే మాటామంతిని à°Žà°²à±à°²à°ªà±à°¡à± చేయà±à°®à±", + "pad.settings.colorcheck": "రచయితలకౠరంగà±à°²à±", + "pad.settings.linenocheck": "వరà±à°¸ సంఖà±à°¯à°²à±", + "pad.settings.fontType": "à°…à°•à±à°·à°°à°¶à±ˆà°²à°¿ à°°à°•à°‚:", + "pad.settings.fontType.normal": "సాధారణ", + "pad.settings.fontType.monospaced": "మోనోసà±à°ªà±‡à°¸à±", + "pad.settings.globalView": "బయటకి దరà±à°¶à°¨à°‚", + "pad.settings.language": "à°à°¾à°·", + "pad.importExport.import_export": "దిగà±à°®à°¤à°¿/à°Žà°—à±à°®à°¤à°¿", + "pad.importExport.import": "పాఠమౠదసà±à°¤à±à°°à°®à± లేదా పతà±à°°à°®à±à°¨à± దిగà±à°®à°¤à°¿ చేయà±à°®à±", + "pad.importExport.importSuccessful": "విజయవంతం!", + "pad.importExport.export": "à°ªà±à°°à°¸à±à°¤à±à°¤ పలకని à°ˆ విధమà±à°—à°¾ à°Žà°—à±à°®à°¤à°¿ చేయà±à°®à±:", + "pad.importExport.exporthtml": "హెచౠటి à°Žà°‚ à°Žà°²à±", + "pad.importExport.exportplain": "సాదా పాఠà±à°¯à°‚", + "pad.importExport.exportword": "మైకà±à°°à±‹à°¸à°¾à°«à±à°Ÿà± వరà±à°¡à±", + "pad.importExport.exportpdf": "పీ à°¡à°¿ à°Žà°«à±", + "pad.importExport.exportopen": "à°“ à°¡à°¿ à°Žà°«à± (ఓపెనౠడాకà±à°¯à±à°®à±†à°‚టౠఫారà±à°®à°¾à°Ÿà±)", + "pad.importExport.exportdokuwiki": "డాకà±à°¯à±à°µà°¿à°•à°¿", + "pad.modals.connected": "సంబంధం à°•à±à°¦à°¿à°°à°¿à°‚ది.", + "pad.modals.reconnecting": "మీ పలకకౠమరల సంబంధం à°•à°²à±à°ªà±à°¤à±à°‚ది...", + "pad.modals.forcereconnect": "బలవంతంగానైనా సంబంధం à°•à±à°¦à°¿à°°à°¿à°‚à°šà±", + "pad.modals.userdup.explanation": "à°ˆ పలక, à°ˆ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ à°’à°•à°Ÿà°¿à°•à°¨à±à°¨ à°Žà°•à±à°•à±à°µ గవాకà±à°·à°®à±à°²à°²à±‹ తెరà±à°šà±à°•à±à°¨à±à°¨à°Ÿà±à°²à± అనిపిసà±à°¤à±à°‚ది.", + "pad.modals.userdup.advice": "బదà±à°²à±à°—à°¾ à°ˆ గవాకà±à°·à°®à±à°¨à± వాడడానికి మరల సంబంధం కలపండి", + "pad.modals.unauth": "అధికారం లేదà±", + "pad.modals.unauth.explanation": "మీరౠఈ à°ªà±à°Ÿà°¨à± చూసà±à°¤à±‚à°¨à±à°¨à°ªà±à°ªà±à°¡à± మీ à°…à°¨à±à°®à°¤à±à°²à± మారాయి. మరల సంబంధం కలపడానికి à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.", + "pad.modals.initsocketfail": "సరà±à°µà°°à± à°…à°‚à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ లేదà±.", + "pad.modals.slowcommit.explanation": "సరà±à°µà°°à± à°¸à±à°ªà°‚దించడం లేదà±.", + "pad.modals.deleted": "తొలగించబడింది ( తొలగించినది )", + "pad.share": "à°ˆ పలకనౠపంచà±à°•à±Šà°¨à±", + "pad.share.readonly": "à°šà°¦à±à°µà±à°Ÿà°•à± మాతà±à°°à°®à±‡", + "pad.share.link": "లంకె", + "pad.share.emebdcode": "యౠఆరౠఎలౠనౠపొదగించండి", + "pad.chat": "మాటామంతి", + "pad.chat.title": "à°ˆ పలకకౠమాటామంతిని తెరిచి ఉంచండి.", + "pad.chat.loadmessages": "మరినà±à°¨à°¿ సందేశాలౠతీసà±à°•à±à°°à°¾", + "timeslider.pageTitle": "{{appTitle}} పనిసమయ సూచిక పరికరం", + "timeslider.toolbar.returnbutton": "పలకకి తిరిగి వెళà±à°³à°‚à°¡à°¿", + "timeslider.toolbar.authors": "రచయితలà±:", + "timeslider.toolbar.authorsList": "రచయితలౠలేరà±", + "timeslider.toolbar.exportlink.title": "à°Žà°—à±à°®à°¤à°¿ చెయà±à°¯à°¿", + "timeslider.exportCurrent": "à°ªà±à°°à°¸à±à°¤à±à°¤ అవతారానà±à°¨à°¿ à°ˆ విధంగా à°Žà°—à±à°®à°¤à°¿ చేయà±à°®à±:", + "timeslider.saved": "{{year}}, {{month}} {{day}} à°¨ à°à°¦à±à°°à°ªà°°à°šà°¬à°¡à°¿à°‚ది", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "జనవరి", + "timeslider.month.february": "à°«à°¿à°¬à±à°°à°µà°°à°¿", + "timeslider.month.march": "మారà±à°šà°¿", + "timeslider.month.april": "à°à°ªà±à°°à°¿à°²à±", + "timeslider.month.may": "మే", + "timeslider.month.june": "జూనà±", + "timeslider.month.july": "జూలై", + "timeslider.month.august": "ఆగషà±à°Ÿà±", + "timeslider.month.september": "సెపà±à°Ÿà±†à°‚బరà±", + "timeslider.month.october": "à°…à°•à±à°Ÿà±‹à°¬à°°à±", + "timeslider.month.november": "నవంబరà±", + "timeslider.month.december": "డిసెంబరà±", + "pad.userlist.entername": "మీ పేరౠఇవà±à°µà°‚à°¡à°¿", + "pad.userlist.unnamed": "అనామకం", + "pad.userlist.guest": "అతిథి", + "pad.userlist.deny": "తిరసà±à°•à°°à°¿à°‚à°šà±", + "pad.userlist.approve": "ఆమోదించà±", + "pad.impexp.importbutton": "దిగà±à°®à°¤à°¿ చేసెయà±à°¯à°¿", + "pad.impexp.importing": "దిగà±à°®à°¤à°¿ చేసà±à°¤à±à°¨à±à°¨à°¾à°‚...", + "pad.impexp.confirmimport": "దిగà±à°®à°¤à°¿ చేసà±à°•à±‹à°µà°¡à°‚ వలà±à°² à°ªà±à°¯à°¾à°¡à± లోఉనà±à°¨ పాఠà±à°¯à°‚ à°¤à±à°¡à°¿à°šà°¿à°ªà±†à°Ÿà±à°Ÿà±à°•à±à°ªà±‹à°¤à±à°‚ది. ఇది మీకౠఅంగీకారమేనా?", + "pad.impexp.convertFailed": "à°ˆ ఫైలà±à°¨à± దిగà±à°®à°¤à°¿ చేసà±à°•à±‹à°²à±‡à°•à°ªà±‹à°¯à°¾à°‚. వేరే డాకà±à°¯à±à°®à±†à°‚టౠఫారà±à°®à°¾à°Ÿà±à°¨à± వాడండి లేదా మీరే కాపీ చేసి అతికించండి", + "pad.impexp.uploadFailed": "à°Žà°•à±à°•à°¿à°‚పౠవిఫలమైంది, మళà±à°³à±€ à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.", + "pad.impexp.importfailed": "దిగà±à°®à°¤à°¿ విఫలమైంది", + "pad.impexp.copypaste": "నకలౠచేసి అతికించండి" +} diff --git a/src/locales/tr.json b/src/locales/tr.json new file mode 100644 index 00000000..89c1f0df --- /dev/null +++ b/src/locales/tr.json @@ -0,0 +1,125 @@ +{ + "@metadata": { + "authors": [ + "Emperyan", + "Erdemaslancan", + "Joseph", + "Meelo" + ] + }, + "index.newPad": "Yeni Bloknot", + "index.createOpenPad": "ya da ÅŸu isimle bir Bloknot oluÅŸtur/aç:", + "pad.toolbar.bold.title": "Kalın (Ctrl-B)", + "pad.toolbar.italic.title": "EÄŸik (Ctrl-I)", + "pad.toolbar.underline.title": "Altı Çizili (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Ãœstü Çizili", + "pad.toolbar.ol.title": "Sıralı liste", + "pad.toolbar.ul.title": "Sırasız Liste", + "pad.toolbar.indent.title": "Girintiyi arttır (TAB)", + "pad.toolbar.unindent.title": "Girintiyi azalt (Shift+TAB)", + "pad.toolbar.undo.title": "Geri Al (Ctrl-Z)", + "pad.toolbar.redo.title": "Yenile (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Yazarlık Renklerini Temizle", + "pad.toolbar.import_export.title": "Farklı dosya biçimlerini içeri/dışarı aktar", + "pad.toolbar.timeslider.title": "Zaman Çizelgesi", + "pad.toolbar.savedRevision.title": "Düzeltmeyi Kaydet", + "pad.toolbar.settings.title": "Ayarlar", + "pad.toolbar.embed.title": "Bu bloknotu PaylaÅŸ ve Göm", + "pad.toolbar.showusers.title": "Kullanıcıları bu bloknotta göster", + "pad.colorpicker.save": "Kaydet", + "pad.colorpicker.cancel": "Ä°ptal", + "pad.loading": "Yükleniyor...", + "pad.passwordRequired": "Bu bloknota eriÅŸebilmeniz için parolaya ihtiyacınız var", + "pad.permissionDenied": "Bu bloknota eriÅŸmeye izniniz yok", + "pad.wrongPassword": "Parolanız yanlış", + "pad.settings.padSettings": "Bloknot Ayarları", + "pad.settings.myView": "Görünümüm", + "pad.settings.stickychat": "Ekranda her zaman sohbet edin", + "pad.settings.colorcheck": "Yazarlık renkleri", + "pad.settings.linenocheck": "Satır numaraları", + "pad.settings.rtlcheck": "İçerik saÄŸdan sola doÄŸru okunsun mu?", + "pad.settings.fontType": "Yazı tipi:", + "pad.settings.fontType.normal": "OlaÄŸan", + "pad.settings.fontType.monospaced": "Tek aralıklı", + "pad.settings.globalView": "Genel Görünüm", + "pad.settings.language": "Dil:", + "pad.importExport.import_export": "İçerik/Dışarı Aktar", + "pad.importExport.import": "Herhangi bir metin dosyası ya da belgesi yükle", + "pad.importExport.importSuccessful": "BaÅŸarılı!", + "pad.importExport.export": "Mevcut bloknotu ÅŸu olarak dışa aktar:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Düz metin", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Açık Doküman Biçimi)", + "pad.importExport.exportdokuwiki": "VikiBelge", + "pad.importExport.abiword.innerHTML": "Yalnızca düz metin ya da HTML biçimlerini içe aktarabilirsiniz. Daha fazla geliÅŸmiÅŸ içe aktarım özellikleri için <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">AbiWord'ü yükleyin</a>.", + "pad.modals.connected": "BaÄŸlandı.", + "pad.modals.reconnecting": "Bloknotunuza tekrar baÄŸlanılıyor...", + "pad.modals.forcereconnect": "Yeniden baÄŸlanmaya zorla", + "pad.modals.userdup": "BaÅŸka pencerede açıldı", + "pad.modals.userdup.explanation": "Bu bloknot bu bilgisayarda birden fazla tarayıcı penceresinde açılmış gibi görünüyor.", + "pad.modals.userdup.advice": "Bu pencereden kullanmak için yeniden baÄŸlanın.", + "pad.modals.unauth": "Yetkili deÄŸil", + "pad.modals.unauth.explanation": "Bu sayfayı görüntülerken izinleriniz deÄŸiÅŸtirildi. Tekrar baÄŸlanmayı deneyin.", + "pad.modals.looping.explanation": "EÅŸitleme sunucusu ile iletiÅŸim sorunları yaÅŸanıyor.", + "pad.modals.looping.cause": "Belki de uygun olmayan güvenlik duvarı ya da vekil sunucu (proxy) ile baÄŸlanmaya çalışıyorsunuz.", + "pad.modals.initsocketfail": "Sunucuya eriÅŸilemiyor.", + "pad.modals.initsocketfail.explanation": "EÅŸitleme sunucusuna baÄŸlantı kurulamıyor.", + "pad.modals.initsocketfail.cause": "Bu sorun muhtemelen, tarayıcınızdan ya da internet baÄŸlantınızdan kaynaklanıyor.", + "pad.modals.slowcommit.explanation": "Sunucu yanıt vermiyor.", + "pad.modals.slowcommit.cause": "Bu hata aÄŸ baÄŸlantısı sebebiyle olabilir.", + "pad.modals.badChangeset.explanation": "Yaptığınız bir düzenleme eÅŸitleme sunucusu tarafından kullanışsız/kural dışı olarak sınıflandırıldı.", + "pad.modals.badChangeset.cause": "Bu, yanlış sunucu yapılandırması ya da baÅŸka bir beklenmedik davranışlar sonucunda olmuÅŸ olabilir. Bu size bir hataymış gibi geliyorsa lütfen servis yöneticisiyle iletiÅŸime geçin. Düzenlemeye devam etmek için yeniden baÄŸlanmayı deneyin.", + "pad.modals.corruptPad.explanation": "EriÅŸmeye çalıştığınız bloknot bozuk.", + "pad.modals.corruptPad.cause": "Bu, yanlış sunucu yapılandırması ya da baÅŸka bir beklenmedik davranışlardan kaynaklanabilir. Lütfen servis yöneticisiyle iletiÅŸime geçin.", + "pad.modals.deleted": "Silindi.", + "pad.modals.deleted.explanation": "Bu bloknot kaldırılmış.", + "pad.modals.disconnected": "BaÄŸlantınız koptu.", + "pad.modals.disconnected.explanation": "Sunucu baÄŸlantısı kaybedildi", + "pad.modals.disconnected.cause": "Sunucu kullanılamıyor olabilir. Bunun devam etmesi durumunda servis yöneticisine bildirin.", + "pad.share": "Bu bloknotu paylaÅŸ", + "pad.share.readonly": "Salt okunur", + "pad.share.link": "BaÄŸlantı", + "pad.share.emebdcode": "URL'yi göm", + "pad.chat": "Sohbet", + "pad.chat.title": "Bu bloknot için sohbeti açın.", + "pad.chat.loadmessages": "Daha fazla mesaj yükle", + "timeslider.pageTitle": "{{appTitle}} Zaman Çizelgesi", + "timeslider.toolbar.returnbutton": "Bloknota geri dön", + "timeslider.toolbar.authors": "Yazarlar:", + "timeslider.toolbar.authorsList": "Yazar Yok", + "timeslider.toolbar.exportlink.title": "Dışa aktar", + "timeslider.exportCurrent": "Mevcut sürümü ÅŸu olarak dışa aktar:", + "timeslider.version": "{{version}} sürümü", + "timeslider.saved": "{{day}} {{month}} {{year}} tarihinde kaydedildi", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", + "timeslider.month.january": "Ocak", + "timeslider.month.february": "Åžubat", + "timeslider.month.march": "Mart", + "timeslider.month.april": "Nisan", + "timeslider.month.may": "Mayıs", + "timeslider.month.june": "Haziran", + "timeslider.month.july": "Temmuz", + "timeslider.month.august": "AÄŸustos", + "timeslider.month.september": "Eylül", + "timeslider.month.october": "Ekim", + "timeslider.month.november": "Kasım", + "timeslider.month.december": "Aralık", + "timeslider.unnamedauthors": "{{num}} adsız {[plural(num) one: yazar, other: yazar ]}", + "pad.savedrevs.marked": "Bu düzenleme artık kayıtlı bir düzeltme olarak iÅŸaretlendi", + "pad.userlist.entername": "Adınızı girin", + "pad.userlist.unnamed": "Adlandırılmamış", + "pad.userlist.guest": "Misafir", + "pad.userlist.deny": "Reddet", + "pad.userlist.approve": "Onayla", + "pad.editbar.clearcolors": "Bütün belgedeki yazarlık renkleri silinsin mi?", + "pad.impexp.importbutton": "Åžimdi İçe Aktar", + "pad.impexp.importing": "İçe aktarıyor...", + "pad.impexp.confirmimport": "Bir dosya içe aktarılırken bloknotun mevcut metninin üzerine yazdırılır. Devam etmek istediÄŸinizden emin misiniz?", + "pad.impexp.convertFailed": "Bu dosyayı içe aktarmak mümkün deÄŸil. Lütfen farklı bir belge biçimi kullanın ya da elle kopyala yapıştır yapın", + "pad.impexp.uploadFailed": "Yükleme baÅŸarısız, lütfen tekrar deneyin", + "pad.impexp.importfailed": "İçe aktarım baÅŸarısız oldu", + "pad.impexp.copypaste": "Lütfen kopyala yapıştır yapın", + "pad.impexp.exportdisabled": "{{type}} biçimiyle dışa aktarma devre dışı bırakıldı. Ayrıntılar için sistem yöneticinizle iletiÅŸime geçiniz." +} diff --git a/src/locales/uk.json b/src/locales/uk.json index 0da478cc..41686c5e 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -1,122 +1,126 @@ { "@metadata": { - "authors": { - "0": "Base", - "1": "Olvin", - "3": "Steve.rusyn" - } + "authors": [ + "Andriykopanytsia", + "Base", + "Olvin", + "Steve.rusyn", + "SteveR" + ] }, - "index.newPad": "\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438", - "index.createOpenPad": "\u0430\u0431\u043e \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438\/\u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0437 \u043d\u0430\u0437\u0432\u043e\u044e:", - "pad.toolbar.bold.title": "\u041d\u0430\u043f\u0456\u0432\u0436\u0438\u0440\u043d\u0438\u0439 (Ctrl-B)", - "pad.toolbar.italic.title": "\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl-I)", - "pad.toolbar.underline.title": "\u041f\u0456\u0434\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u043d\u044f (Ctrl-U)", - "pad.toolbar.strikethrough.title": "\u0417\u0430\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u043d\u044f", - "pad.toolbar.ol.title": "\u0423\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.ul.title": "\u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", - "pad.toolbar.indent.title": "\u0412\u0456\u0434\u0441\u0442\u0443\u043f", - "pad.toolbar.unindent.title": "\u0412\u0438\u0441\u0442\u0443\u043f", - "pad.toolbar.undo.title": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0438 (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.toolbar.import_export.title": "\u0406\u043c\u043f\u043e\u0440\u0442\/\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f\u043c \u0440\u0456\u0437\u043d\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0456\u0432 \u0444\u0430\u0439\u043b\u0456\u0432", - "pad.toolbar.timeslider.title": "\u0428\u043a\u0430\u043b\u0430 \u0447\u0430\u0441\u0443", - "pad.toolbar.savedRevision.title": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0456 \u0432\u0435\u0440\u0441\u0456\u0457", - "pad.toolbar.settings.title": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", - "pad.toolbar.embed.title": "\u0412\u0431\u0443\u0434\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.toolbar.showusers.title": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432 \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.colorpicker.save": "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438", - "pad.colorpicker.cancel": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438", - "pad.loading": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026", - "pad.passwordRequired": "\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u0456\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.permissionDenied": "\u0412\u0438 \u043d\u0435 \u043c\u0430\u0454 \u0434\u043e\u0437\u0432\u043e\u043b\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.wrongPassword": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c", - "pad.settings.padSettings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.settings.myView": "\u041c\u0456\u0439 \u0412\u0438\u0433\u043b\u044f\u0434", - "pad.settings.stickychat": "\u0417\u0430\u0432\u0436\u0434\u0438 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0442", - "pad.settings.colorcheck": "\u041a\u043e\u043b\u044c\u043e\u0440\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "pad.settings.linenocheck": "\u041d\u043e\u043c\u0435\u0440\u0438 \u0440\u044f\u0434\u043a\u0456\u0432", - "pad.settings.fontType": "\u0422\u0438\u043f \u0448\u0440\u0438\u0444\u0442\u0443:", - "pad.settings.fontType.normal": "\u0417\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u0439", - "pad.settings.fontType.monospaced": "\u041c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u0438\u0439", - "pad.settings.globalView": "\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0432\u0438\u0433\u043b\u044f\u0434", - "pad.settings.language": "\u041c\u043e\u0432\u0430:", - "pad.importExport.import_export": "\u0406\u043c\u043f\u043e\u0440\u0442\/\u0415\u043a\u0441\u043f\u043e\u0440\u0442", - "pad.importExport.import": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0443\u0434\u044c-\u044f\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0438\u0439 \u0444\u0430\u0439\u043b \u0430\u0431\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", - "pad.importExport.importSuccessful": "\u0423\u0441\u043f\u0456\u0448\u043d\u043e!", - "pad.importExport.export": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u044f\u043a:", + "index.newPad": "Створити", + "index.createOpenPad": "або Ñтворити/відкрити документ з назвою:", + "pad.toolbar.bold.title": "Ðапівжирний (Ctrl-B)", + "pad.toolbar.italic.title": "КурÑив (Ctrl-I)", + "pad.toolbar.underline.title": "ПідкреÑÐ»ÐµÐ½Ð½Ñ (Ctrl-U)", + "pad.toolbar.strikethrough.title": "ЗакреÑленнÑ", + "pad.toolbar.ol.title": "УпорÑдкований ÑпиÑок", + "pad.toolbar.ul.title": "ÐеупорÑдкований ÑпиÑок", + "pad.toolbar.indent.title": "ВідÑтуп (TAB)", + "pad.toolbar.unindent.title": "ВиÑтуп (Shift+TAB)", + "pad.toolbar.undo.title": "СкаÑувати (Ctrl-Z)", + "pad.toolbar.redo.title": "Повторити (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "ОчиÑтити кольори документу", + "pad.toolbar.import_export.title": "Імпорт/ЕкÑпорт з викориÑтаннÑм різних форматів файлів", + "pad.toolbar.timeslider.title": "Шкала чаÑу", + "pad.toolbar.savedRevision.title": "Зберегти верÑÑ–ÑŽ", + "pad.toolbar.settings.title": "ÐалаштуваннÑ", + "pad.toolbar.embed.title": "ПоділитиÑÑŒ та вбудувати цей документ", + "pad.toolbar.showusers.title": "Показати кориÑтувачів цього документу", + "pad.colorpicker.save": "Зберегти", + "pad.colorpicker.cancel": "СкаÑувати", + "pad.loading": "ЗавантаженнÑ…", + "pad.passwordRequired": "Вам необхідний пароль Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього документу", + "pad.permissionDenied": "Ви не має дозволу Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього документу", + "pad.wrongPassword": "Ðеправильний пароль", + "pad.settings.padSettings": "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñƒ", + "pad.settings.myView": "Мій ВиглÑд", + "pad.settings.stickychat": "Завжди відображувати чат", + "pad.settings.colorcheck": "Кольори документу", + "pad.settings.linenocheck": "Ðомери Ñ€Ñдків", + "pad.settings.rtlcheck": "Читати вміÑÑ‚ з права на ліво?", + "pad.settings.fontType": "Тип шрифту:", + "pad.settings.fontType.normal": "Звичайний", + "pad.settings.fontType.monospaced": "Моноширинний", + "pad.settings.globalView": "Загальний виглÑд", + "pad.settings.language": "Мова:", + "pad.importExport.import_export": "Імпорт/ЕкÑпорт", + "pad.importExport.import": "Завантажити будь-Ñкий текÑтовий файл або документ", + "pad.importExport.importSuccessful": "УÑпішно!", + "pad.importExport.export": "ЕкÑпортувати поточний документ Ñк:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u0417\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442", + "pad.importExport.exportplain": "Звичайний текÑÑ‚", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 OpenOffice)", + "pad.importExport.exportopen": "ODF (документ OpenOffice)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u0412\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043b\u0438\u0449\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0430\u0431\u043e html. \u0414\u043b\u044f \u0431\u0456\u043b\u044c\u0448 \u043f\u0440\u043e\u0441\u0443\u043d\u0443\u0442\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0456\u0432 \u0456\u043c\u043f\u043e\u0440\u0442\u0443 <a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u0432\u0441\u0442\u0430\u043d\u043e\u0432\u0456\u0442\u044c abiword<\/a>.", - "pad.modals.connected": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.reconnecting": "\u041f\u0435\u0440\u0435\u043f\u0456\u0434\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0434\u043e \u0412\u0430\u0448\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443..", - "pad.modals.forcereconnect": "\u041f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f", - "pad.modals.userdup": "\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0432 \u0456\u043d\u0448\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456", - "pad.modals.userdup.explanation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043c\u043e\u0436\u043b\u0438\u0432\u043e, \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0431\u0456\u043b\u044c\u0448 \u043d\u0456\u0436 \u0432 \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u043e\u043c\u043f'\u044e\u0442\u0435\u0440\u0456.", - "pad.modals.userdup.advice": "\u041f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044c \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u044e\u0447\u0438 \u0446\u0435 \u0432\u0456\u043a\u043d\u043e.", - "pad.modals.unauth": "\u041d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043e", - "pad.modals.unauth.explanation": "\u0412\u0430\u0448\u0456 \u043f\u0440\u0430\u0432\u0430 \u0431\u0443\u043b\u043e \u0437\u043c\u0456\u043d\u0435\u043d\u043e \u043f\u0456\u0434 \u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0443 \u0446\u0456\u0454\u0457 \u0441\u0442\u043e\u0440\u0456\u043d\u043a. \u0421\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044c.", - "pad.modals.looping": "\u0412\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.looping.explanation": "\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0438 \u0437\u0432'\u0454\u0437\u043a\u0443 \u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0456\u0437\u0430\u0446\u0456\u0457.", - "pad.modals.looping.cause": "\u041c\u043e\u0436\u043b\u0438\u0432\u043e, \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u0443\u043c\u0456\u0441\u043d\u0438\u0439 \u0431\u0440\u0430\u043d\u0434\u043c\u0430\u0443\u0435\u0440 \u0430\u0431\u043e \u043f\u0440\u043e\u043a\u0441\u0456-\u0441\u0435\u0440\u0432\u0435\u0440.", - "pad.modals.initsocketfail": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439.", - "pad.modals.initsocketfail.explanation": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u0434\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0456\u0437\u0430\u0446\u0456\u0457.", - "pad.modals.initsocketfail.cause": "\u0419\u043c\u043e\u0432\u0456\u0440\u043d\u043e, \u0446\u0435 \u043f\u043e\u0432'\u044f\u0437\u0430\u043d\u043e \u0437 \u0412\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0430\u0431\u043e \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0437'\u0454\u0434\u043d\u0430\u043d\u043d\u044f\u043c.", - "pad.modals.slowcommit": "\u0412\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.slowcommit.explanation": "\u0421\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u0430\u0454.", - "pad.modals.slowcommit.cause": "\u0426\u0435 \u043c\u043e\u0436\u0435 \u0431\u0443\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f\u043c \u0434\u043e \u043c\u0435\u0440\u0435\u0436\u0456.", - "pad.modals.deleted": "\u0412\u0438\u043b\u0443\u0447\u0435\u043d\u043e.", - "pad.modals.deleted.explanation": "\u0426\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0431\u0443\u043b\u043e \u0432\u0438\u043b\u0443\u0447\u0435\u043d\u043e.", - "pad.modals.disconnected": "\u0412\u0430\u0441 \u0431\u0443\u043b\u043e \u0432\u0456\u0434'\u0454\u0434\u043d\u0430\u043d\u043e.", - "pad.modals.disconnected.explanation": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0432\u0442\u0440\u0430\u0447\u0435\u043d\u043e", - "pad.modals.disconnected.cause": "\u0421\u0435\u0440\u0432\u0435\u0440, \u043c\u043e\u0436\u043b\u0438\u0432\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u0442\u0435 \u043d\u0430\u043c, \u044f\u043a\u0449\u043e \u0446\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044e\u0432\u0430\u0442\u0438\u043c\u0435\u0442\u044c\u0441\u044f.", - "pad.share": "\u041f\u043e\u0434\u0456\u043b\u0438\u0442\u0438\u0441\u044c", - "pad.share.readonly": "\u0422\u0456\u043b\u044c\u043a\u0438 \u0447\u0438\u0442\u0430\u043d\u043d\u044f", - "pad.share.link": "\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f", - "pad.share.emebdcode": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 URL", - "pad.chat": "\u0427\u0430\u0442", - "pad.chat.title": "\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0447\u0430\u0442 \u0434\u043b\u044f \u0446\u044c\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443.", - "pad.chat.loadmessages": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0456\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u044c", - "timeslider.pageTitle": "\u0427\u0430\u0441\u043e\u0432\u0430 \u0448\u043a\u0430\u043b\u0430 {{appTitle}}", - "timeslider.toolbar.returnbutton": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438\u0441\u044c \u0434\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443", - "timeslider.toolbar.authors": "\u0410\u0432\u0442\u043e\u0440\u0438:", - "timeslider.toolbar.authorsList": "\u041d\u0435\u043c\u0430\u0454 \u0430\u0432\u0442\u043e\u0440\u0456\u0432", - "timeslider.toolbar.exportlink.title": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442", - "timeslider.exportCurrent": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0443 \u0432\u0435\u0440\u0441\u0456\u044e \u044f\u043a:", - "timeslider.version": "\u0412\u0435\u0440\u0441\u0456\u044f {{version}}", - "timeslider.saved": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e {{month}} {{day}}, {{year}}", - "timeslider.dateformat": "{{month}}\/{{day}}\/{{year}} {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "\u0421\u0456\u0447\u0435\u043d\u044c", - "timeslider.month.february": "\u041b\u044e\u0442\u0438\u0439", - "timeslider.month.march": "\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c", - "timeslider.month.april": "\u041a\u0432\u0456\u0442\u0435\u043d\u044c", - "timeslider.month.may": "\u0422\u0440\u0430\u0432\u0435\u043d\u044c", - "timeslider.month.june": "\u0427\u0435\u0440\u0432\u0435\u043d\u044c", - "timeslider.month.july": "\u041b\u0438\u043f\u0435\u043d\u044c", - "timeslider.month.august": "\u0421\u0435\u0440\u043f\u0435\u043d\u044c", - "timeslider.month.september": "\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c", - "timeslider.month.october": "\u0416\u043e\u0432\u0442\u0435\u043d\u044c", - "timeslider.month.november": "\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434", - "timeslider.month.december": "\u0413\u0440\u0443\u0434\u0435\u043d\u044c", - "timeslider.unnamedauthor": "{{num}} \u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u0440", - "timeslider.unnamedauthors": "\u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432: {{num}}", - "pad.savedrevs.marked": "\u0426\u044e \u0432\u0435\u0440\u0441\u0456\u044e \u043f\u043e\u043c\u0456\u0447\u0435\u043d\u043e \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e\u044e \u0432\u0435\u0440\u0441\u0456\u0454\u044e", - "pad.userlist.entername": "\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u0412\u0430\u0448\u0435 \u0456\u043c'\u044f", - "pad.userlist.unnamed": "\u0431\u0435\u0437\u0456\u043c\u0435\u043d\u043d\u0438\u0439", - "pad.userlist.guest": "\u0413\u0456\u0441\u0442\u044c", - "pad.userlist.deny": "\u0417\u0430\u0431\u043e\u0440\u043e\u043d\u0438\u0442\u0438", - "pad.userlist.approve": "\u041f\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438", - "pad.editbar.clearcolors": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043a\u043e\u043b\u044c\u043e\u0440\u0438 \u0443 \u0432\u0441\u044c\u043e\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0456?", - "pad.impexp.importbutton": "\u0406\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0437\u0430\u0440\u0430\u0437", - "pad.impexp.importing": "\u0406\u043c\u043f\u043e\u0440\u0442...", - "pad.impexp.confirmimport": "\u0406\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0444\u0430\u0439\u043b\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443. \u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438?", - "pad.impexp.convertFailed": "\u041c\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c\u043e \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0444\u0430\u0439\u043b. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0456\u043d\u0448\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443, \u0430\u0431\u043e \u043f\u0440\u044f\u043c\u043e \u0441\u043a\u043e\u043f\u0456\u044e\u0439\u0442\u0435 \u0442\u0430 \u0432\u0441\u0442\u0430\u0432\u0442\u0435", - "pad.impexp.uploadFailed": "\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044c, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0441\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u043d\u043e\u0432\u0443", - "pad.impexp.importfailed": "\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u043f\u0440\u0438 \u0456\u043c\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u043d\u043d\u0456", - "pad.impexp.copypaste": "\u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0441\u043a\u043e\u043f\u0456\u044e\u0439\u0442\u0435 \u0442\u0430 \u0432\u0441\u0442\u0430\u0432\u0442\u0435", - "pad.impexp.exportdisabled": "\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0443 \u0444\u043e\u0440\u043c\u0430\u0442 {{type}} \u0432\u0438\u043c\u043a\u043d\u0435\u043d\u043e. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0437\u0432'\u044f\u0436\u0456\u0442\u044c\u0441\u044f \u0456\u0437 \u0412\u0430\u0448\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u043c \u0430\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0437\u0430 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438." -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "Ви можете імпортувати лище формати проÑтого текÑту або html. Ð”Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆ проÑунутих ÑпоÑобів імпорту <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">вÑтановіть abiword</a>.", + "pad.modals.connected": "З'єднано.", + "pad.modals.reconnecting": "ÐŸÐµÑ€ÐµÐ¿Ñ–Ð´Ð»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Вашого документу..", + "pad.modals.forcereconnect": "ПримуÑове перепідключеннÑ", + "pad.modals.userdup": "Відкрито в іншому вікні", + "pad.modals.userdup.explanation": "Документ, можливо, відкрито більш ніж в одному вікні браузера на цьому комп'ютері.", + "pad.modals.userdup.advice": "ПерепідключитиÑÑŒ викориÑтовуючи це вікно.", + "pad.modals.unauth": "Ðе авторизовано", + "pad.modals.unauth.explanation": "Ваші права було змінено під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду цієї Ñторінк. Спробуйте перепідключитиÑÑŒ.", + "pad.modals.looping.explanation": "Проблеми зв'єзку з Ñервером Ñинхронізації.", + "pad.modals.looping.cause": "Можливо, підключилиÑÑŒ через неÑуміÑний брандмауер або прокÑÑ–-Ñервер.", + "pad.modals.initsocketfail": "Сервер недоÑтупний.", + "pad.modals.initsocketfail.explanation": "Ðе вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ Ñервера Ñинхронізації.", + "pad.modals.initsocketfail.cause": "Ймовірно, це пов'Ñзано з Вашим браузером або інтернет-з'єднаннÑм.", + "pad.modals.slowcommit.explanation": "Сервер не відповідає.", + "pad.modals.slowcommit.cause": "Це може бути через проблем з підключеннÑм до мережі.", + "pad.modals.badChangeset.explanation": "РедагуваннÑ, Ñке ви зробили, було клаÑифіковане Ñк незаконний шлÑÑ… доÑтупу до Ñервера Ñинхронізації.", + "pad.modals.badChangeset.cause": "Причиною може бути неправильна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñервера або інші непередбачувані поведінки. ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора Ñлужби, Ñкщо ви відчуваєте, що це помилка. Спробуйте підключитиÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб продовжити редагуваннÑ.", + "pad.modals.corruptPad.explanation": "Пошкоджено документ, до Ñкого ви хочете одержати доÑтуп.", + "pad.modals.corruptPad.cause": "Це може бути через неправильну конфігурацію Ñервера або іншу непередбачувану поведінку. ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора Ñлужби.", + "pad.modals.deleted": "Вилучено.", + "pad.modals.deleted.explanation": "Цей документ було вилучено.", + "pad.modals.disconnected": "Ð’Ð°Ñ Ð±ÑƒÐ»Ð¾ від'єднано.", + "pad.modals.disconnected.explanation": "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером втрачено", + "pad.modals.disconnected.cause": "Сервер, можливо, недоÑтупний. Будь лаÑка, повідомте адмініÑтратора Ñлужби, Ñкщо це повторюватиметьÑÑ.", + "pad.share": "ПоділитиÑÑŒ", + "pad.share.readonly": "Тільки читаннÑ", + "pad.share.link": "ПоÑиланнÑ", + "pad.share.emebdcode": "Ð’Ñтавити URL", + "pad.chat": "Чат", + "pad.chat.title": "Відкрити чат Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ документу.", + "pad.chat.loadmessages": "Завантажити більше повідомлень", + "timeslider.pageTitle": "ЧаÑова шкала {{appTitle}}", + "timeslider.toolbar.returnbutton": "ПовернутиÑÑŒ до документу", + "timeslider.toolbar.authors": "Ðвтори:", + "timeslider.toolbar.authorsList": "Ðемає авторів", + "timeslider.toolbar.exportlink.title": "ЕкÑпорт", + "timeslider.exportCurrent": "ЕкÑпортувати поточну верÑÑ–ÑŽ Ñк:", + "timeslider.version": "ВерÑÑ–Ñ {{version}}", + "timeslider.saved": "Збережено {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Січень", + "timeslider.month.february": "Лютий", + "timeslider.month.march": "Березень", + "timeslider.month.april": "Квітень", + "timeslider.month.may": "Травень", + "timeslider.month.june": "Червень", + "timeslider.month.july": "Липень", + "timeslider.month.august": "Серпень", + "timeslider.month.september": "ВереÑень", + "timeslider.month.october": "Жовтень", + "timeslider.month.november": "ЛиÑтопад", + "timeslider.month.december": "Грудень", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: безіменний автор, few: безіменні автори, many: безіменних авторів, other: безіменних авторів]}", + "pad.savedrevs.marked": "Цю верÑÑ–ÑŽ помічено збереженою верÑією", + "pad.userlist.entername": "Введіть Ваше ім'Ñ", + "pad.userlist.unnamed": "безіменний", + "pad.userlist.guest": "ГіÑÑ‚ÑŒ", + "pad.userlist.deny": "Заборонити", + "pad.userlist.approve": "Підтвердити", + "pad.editbar.clearcolors": "ОчиÑтити кольори у вÑьому документі?", + "pad.impexp.importbutton": "Імпортувати зараз", + "pad.impexp.importing": "Імпорт...", + "pad.impexp.confirmimport": "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ перезапише поточний текÑÑ‚ документу. Ви дійÑно хочете продовжити?", + "pad.impexp.convertFailed": "Ми не можемо імпортувати цей файл. Будь лаÑка, викориÑтайте інший формат документу, або прÑмо Ñкопіюйте та вÑтавте", + "pad.impexp.uploadFailed": "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ вдалоÑÑŒ, будь лаÑка, Ñпробуйте знову", + "pad.impexp.importfailed": "Помилка при імпортуванні", + "pad.impexp.copypaste": "Будь лаÑка, Ñкопіюйте та вÑтавте", + "pad.impexp.exportdisabled": "ЕкÑпорт у формат {{type}} вимкнено. Будь лаÑка, зв'ÑжітьÑÑ Ñ–Ð· Вашим ÑиÑтемним адмініÑтратором за деталÑми." +} diff --git a/src/locales/vi.json b/src/locales/vi.json new file mode 100644 index 00000000..608e9645 --- /dev/null +++ b/src/locales/vi.json @@ -0,0 +1,124 @@ +{ + "@metadata": { + "authors": [ + "Baonguyen21022003", + "Minh Nguyen", + "Tuankiet65" + ] + }, + "index.newPad": "Tạo má»™t Pad má»›i", + "index.createOpenPad": "hay tạo/mở má»™t Pad vá»›i tên:", + "pad.toolbar.bold.title": "In Ä‘áºm (Ctrl-B)", + "pad.toolbar.italic.title": "In nghiêng (Ctrl-I)", + "pad.toolbar.underline.title": "Gạch chân (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Gạch ngang", + "pad.toolbar.ol.title": "Danh sách Có Äánh số", + "pad.toolbar.ul.title": "Danh sách Không Äánh số", + "pad.toolbar.indent.title": "Tăng lá» (TAB)", + "pad.toolbar.unindent.title": "Giảm lá» (Shift+TAB)", + "pad.toolbar.undo.title": "Hoà n tác (Ctrl-Z)", + "pad.toolbar.redo.title": "Là m lại (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Xóa Mà u chỉ Tác giả", + "pad.toolbar.import_export.title": "Xuất/Nháºp từ/đến các định dạng file khác nhau", + "pad.toolbar.timeslider.title": "Thanh thá»i gian", + "pad.toolbar.savedRevision.title": "LÆ°u Phiên bản", + "pad.toolbar.settings.title": "Thiết láºp", + "pad.toolbar.embed.title": "Chia sẻ và Nhúng pad nà y", + "pad.toolbar.showusers.title": "Hiện các ngÆ°á»i dùng trên pad nà y", + "pad.colorpicker.save": "LÆ°u", + "pad.colorpicker.cancel": "Hủy bá»", + "pad.loading": "Äang tải…", + "pad.passwordRequired": "Bạn cần máºt khẩu để truy cáºp pad nà y", + "pad.permissionDenied": "Bạn không có quyá»n truy cáºp pad nà y.", + "pad.wrongPassword": "Bạn đã nháºp sai máºt khẩu", + "pad.settings.padSettings": "Tùy chá»n Pad", + "pad.settings.myView": "Chỉ có tôi", + "pad.settings.stickychat": "Luân hiện cá»a sổ trò chuyện trên mà n hình", + "pad.settings.colorcheck": "Mà u chỉ tác giả", + "pad.settings.linenocheck": "Số dòng", + "pad.settings.rtlcheck": "Äá»c ná»™i dung từ phải sang trái?", + "pad.settings.fontType": "Kiểu phông chữ:", + "pad.settings.fontType.normal": "ThÆ°á»ng", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Toà n cầu", + "pad.settings.language": "Ngôn ngữ:", + "pad.importExport.import_export": "Xuất/Nháºp", + "pad.importExport.import": "Tải lên bất kỳ táºp tin văn bản hoặc tà i liệu", + "pad.importExport.importSuccessful": "Thà nh công!", + "pad.importExport.export": "Xuất pad hiện tại ra định dạng:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Văn bản thuần túy", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Bạn chỉ có thể nháºp và o từ văn bản thuần túy hay định dạng HTML. Nếu muốn có nhiá»u chức năng nháºp hÆ¡n xin hãy <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">cà i đặt abiword</a>.", + "pad.modals.connected": "Äã kết nối lại.", + "pad.modals.reconnecting": "Kết nối lại tá»›i pad của bạn", + "pad.modals.forcereconnect": "Ép kết nối lại", + "pad.modals.userdup": "Mở trong cá»a sổ khác", + "pad.modals.userdup.explanation": "Pad nà y dÆ°á»ng nhÆ° được mở trên hÆ¡n má»™t cá»a sổ trình duyệt trên máy tÃnh nà y.", + "pad.modals.userdup.advice": "Kết nối lại để sá» dụng cá»a sổ nà y.", + "pad.modals.unauth": "Không có quyá»n", + "pad.modals.unauth.explanation": "Quyá»n của bạn đã thay đổi trong khi bạn Ä‘ang xem trang nà y. Hãy thá» kết nối lại.", + "pad.modals.looping.explanation": "Có vấn Ä‘á» khi giao tiếp vá»›i máy chủ đồng bá»™", + "pad.modals.looping.cause": "Có thể bạn đã kết nối thông qua má»™t tÆ°á»ng lá»a hay proxy không thÃch hợp", + "pad.modals.initsocketfail": "Không thể tiếp cáºn máy chủ", + "pad.modals.initsocketfail.explanation": "Không thể kết nối đến máy chủ đồng bá»™.", + "pad.modals.initsocketfail.cause": "Äiá»u nà y có thể là do má»™t vấn Ä‘á» vá»›i trình duyệt của bạn hay Ä‘Æ°á»ng truyá»n internet của bạn.", + "pad.modals.slowcommit.explanation": "Máy chủ không phản hồi.", + "pad.modals.slowcommit.cause": "Äiá»u nà y có thể là do vấn Ä‘á» vá» kết nối mạng.", + "pad.modals.badChangeset.explanation": "Chỉnh sá»a bạn đã thá»±c hiện là bất hợp pháp phân loại bởi máy chủ đồng bá»™ hóa.", + "pad.modals.badChangeset.cause": "Äiá»u nà y có thể là do má»™t cấu hình máy chủ sai hoặc má»™t số hà nh vi không mong muốn khác. Xin vui lòng liên hệ vá»›i quản trị viên dịch vụ, nếu bạn cảm thấy đây là má»™t lá»—i. Cố gắng kết nối lại để tiếp tục chỉnh sá»a.", + "pad.modals.corruptPad.explanation": "Các phÃm bạn Ä‘ang cố truy cáºp bị há»ng.", + "pad.modals.corruptPad.cause": "Äiá»u nà y có thể là do má»™t cấu hình máy chủ sai hoặc má»™t số hà nh vi không mong muốn khác. Xin vui lòng liên hệ vá»›i ngÆ°á»i quản trị dịch vụ.", + "pad.modals.deleted": "Äã xóa", + "pad.modals.deleted.explanation": "Pad nà y đã được gỡ", + "pad.modals.disconnected": "Bạn đã ngắt kết nối", + "pad.modals.disconnected.explanation": "Kết nối tá»›i máy chủ đã bị mất", + "pad.modals.disconnected.cause": "Hệ phục vụ có thể không sẵn dùng. Xin vui lòng thông báo cho ngÆ°á»i quản trị dịch vụ nếu Ä‘iá»u nà y tiếp tục xảy ra.", + "pad.share": "Chia sẻ pad nà y", + "pad.share.readonly": "Chỉ Ä‘á»c", + "pad.share.link": "Liên kết", + "pad.share.emebdcode": "URL nhúng", + "pad.chat": "Trò chuyện", + "pad.chat.title": "Mở trò chuyện cho pad nà y.", + "pad.chat.loadmessages": "Tải thêm tin nhắn", + "timeslider.pageTitle": "Thanh thá»i gian của {{appTitle}}", + "timeslider.toolbar.returnbutton": "Trở vá» pad", + "timeslider.toolbar.authors": "Tác giả:", + "timeslider.toolbar.authorsList": "Không có tác giả", + "timeslider.toolbar.exportlink.title": "Xuất", + "timeslider.exportCurrent": "Xuất phiên bản hiện tại thà nh:", + "timeslider.version": "Phiên bản {{version}}", + "timeslider.saved": "Äã lÆ°u và o ngà y {{day}} {{month}} năm {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Tháng Giêng", + "timeslider.month.february": "Tháng Hai", + "timeslider.month.march": "Tháng Ba", + "timeslider.month.april": "Tháng TÆ°", + "timeslider.month.may": "Tháng Năm", + "timeslider.month.june": "Tháng Sáu", + "timeslider.month.july": "Tháng Bảy", + "timeslider.month.august": "Tháng Tám", + "timeslider.month.september": "Tháng ChÃn", + "timeslider.month.october": "Tháng MÆ°á»i", + "timeslider.month.november": "Tháng MÆ°á»i Má»™t", + "timeslider.month.december": "Tháng MÆ°á»i Hai", + "timeslider.unnamedauthors": "Không tên {{in a}} {[plural(num) má»™t: tác giả, khác: tác giả]}", + "pad.savedrevs.marked": "Phiên bản nà y đã được đánh dấu là má»™t phiên bản đã lÆ°u", + "pad.userlist.entername": "Nháºp tên của bạn", + "pad.userlist.unnamed": "Không tên", + "pad.userlist.guest": "Khách", + "pad.userlist.deny": "Chặn", + "pad.userlist.approve": "Chấp nháºn", + "pad.editbar.clearcolors": "Xóa mà u chỉ tác giả trên toà n bá»™ tà i liệu?", + "pad.impexp.importbutton": "Nháºp ngay bây giá»", + "pad.impexp.importing": "Äang nháºp…", + "pad.impexp.confirmimport": "Nháºp má»™t táºp tin sẽ ghi đè ná»™i dung hiện tại của pad. Bạn có muốn là m nhÆ° váºy không?", + "pad.impexp.convertFailed": "Chúng tôi không thể nháºp táºp tin nà y. Hãy sá» dụng định dạng táºp tin khác hay sao chéo và dán má»™t cách thủ công.", + "pad.impexp.uploadFailed": "Tải lên không thà nh công, vui lòng thá» lại", + "pad.impexp.importfailed": "Nháºp thất bại", + "pad.impexp.copypaste": "Xin vui lòng sao chép và dán", + "pad.impexp.exportdisabled": "Xuất ra định dạng {{type}} đã bị vô hiệu hóa. Xin hãy liên hệ vá»›i quản trị viên hệ thống để biết thêm thông tin chi tiết." +} diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index a98ebfce..556ab8a1 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -3,114 +3,129 @@ "authors": [ "Dimension", "Hydra", + "Hzy980512", + "Liuxinyu970226", + "Qiyue2001", + "Shangkuanlc", + "Shizhao", "Yfdyh000", - "\u4e4c\u62c9\u8de8\u6c2a", - "\u71c3\u7389" + "乌拉跨氪", + "燃玉" ] }, - "index.newPad": "\u65b0\u8bb0\u4e8b\u672c", - "pad.toolbar.bold.title": "\u7c97\u4f53\uff08Ctrl-B\uff09", - "pad.toolbar.italic.title": "\u659c\u4f53 (Ctrl-I)", - "pad.toolbar.underline.title": "\u5e95\u7ebf\uff08Ctrl-U\uff09", - "pad.toolbar.strikethrough.title": "\u5220\u9664\u7ebf", - "pad.toolbar.ol.title": "\u6709\u5e8f\u5217\u8868", - "pad.toolbar.ul.title": "\u65e0\u5e8f\u5217\u8868", - "pad.toolbar.indent.title": "\u7f29\u6392", - "pad.toolbar.unindent.title": "\u51f8\u6392", - "pad.toolbar.undo.title": "\u64a4\u6d88 (Ctrl-Z)", - "pad.toolbar.redo.title": "\u91cd\u505a (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u989c\u8272", - "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6587\u4ef6\u683c\u5f0f\u5bfc\u5165\/\u5bfc\u51fa", - "pad.toolbar.timeslider.title": "\u65f6\u95f4\u8f74", - "pad.toolbar.savedRevision.title": "\u4fdd\u5b58\u4fee\u8ba2", - "pad.toolbar.settings.title": "\u8bbe\u7f6e", - "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64\u8bb0\u4e8b\u672c", - "pad.toolbar.showusers.title": "\u663e\u793a\u6b64\u8bb0\u4e8b\u672c\u7684\u7528\u6237", - "pad.colorpicker.save": "\u4fdd\u5b58", - "pad.colorpicker.cancel": "\u53d6\u6d88", - "pad.loading": "\u8f7d\u5165\u4e2d\u2026\u2026", - "pad.passwordRequired": "\u60a8\u9700\u8981\u4e00\u4e2a\u89c2\u770b\u8fd9\u4e2a\u8bb0\u4e8b\u672c\u7684\u5bc6\u7801", - "pad.permissionDenied": "\u60a8\u6ca1\u6709\u89c2\u770b\u8fd9\u4e2a\u8bb0\u4e8b\u672c\u7684\u6743\u9650", - "pad.wrongPassword": "\u60a8\u7684\u5bc6\u7801\u9519\u4e86", - "pad.settings.padSettings": "\u8bb0\u4e8b\u672c\u8bbe\u7f6e", - "pad.settings.myView": "\u6211\u7684\u89c6\u7a97", - "pad.settings.stickychat": "\u603b\u662f\u5728\u5c4f\u5e55\u4e0a\u663e\u793a\u804a\u5929", - "pad.settings.colorcheck": "\u4f5c\u8005\u989c\u8272", - "pad.settings.linenocheck": "\u884c\u53f7", - "pad.settings.fontType": "\u5b57\u4f53\u7c7b\u578b\uff1a", - "pad.settings.fontType.normal": "\u6b63\u5e38", - "pad.settings.fontType.monospaced": "\u7b49\u5bbd\u5b57\u4f53", - "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u89c6\u7a97", - "pad.settings.language": "\u8bed\u8a00\uff1a", - "pad.importExport.import_export": "\u5bfc\u5165\/\u5bfc\u51fa", - "pad.importExport.import": "\u4e0a\u8f7d\u4efb\u4f55\u6587\u5b57\u6863\u6216\u6587\u6863", - "pad.importExport.importSuccessful": "\u6210\u529f\uff01", - "pad.importExport.export": "\u5bfc\u51fa\u76ee\u524d\u7684\u8bb0\u4e8b\u7c3f\u4e3a\uff1a", + "index.newPad": "新记事本", + "index.createOpenPad": "或者创建/打开带åå—的记事本:", + "pad.toolbar.bold.title": "粗体(Ctrl-B)", + "pad.toolbar.italic.title": "斜体 (Ctrl-I)", + "pad.toolbar.underline.title": "下划线(Ctrl-U)", + "pad.toolbar.strikethrough.title": "åˆ é™¤çº¿", + "pad.toolbar.ol.title": "有åºåˆ—表", + "pad.toolbar.ul.title": "æ— åºåˆ—表", + "pad.toolbar.indent.title": "å¢žåŠ ç¼©è¿›ï¼ˆTAB)", + "pad.toolbar.unindent.title": "å‡å°‘缩进(Shift+TAB)", + "pad.toolbar.undo.title": "撤消 (Ctrl-Z)", + "pad.toolbar.redo.title": "é‡åš (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "清除作者颜色", + "pad.toolbar.import_export.title": "从ä¸åŒçš„æ–‡ä»¶æ ¼å¼å¯¼å…¥/导出", + "pad.toolbar.timeslider.title": "时间轴", + "pad.toolbar.savedRevision.title": "ä¿å˜ä¿®è®¢", + "pad.toolbar.settings.title": "设置", + "pad.toolbar.embed.title": "共享并嵌入æ¤è®°äº‹æœ¬", + "pad.toolbar.showusers.title": "显示æ¤è®°äº‹æœ¬ä¸Šçš„用户", + "pad.colorpicker.save": "ä¿å˜", + "pad.colorpicker.cancel": "å–消", + "pad.loading": "载入ä¸â€¦â€¦", + "pad.passwordRequired": "您需è¦å¯†ç æ‰èƒ½è®¿é—®è¿™ä¸ªè®°äº‹æœ¬", + "pad.permissionDenied": "您没有访问这个记事本的æƒé™", + "pad.wrongPassword": "您的密ç 错了", + "pad.settings.padSettings": "记事本设置", + "pad.settings.myView": "我的视窗", + "pad.settings.stickychat": "总是显示èŠå¤©å±å¹•", + "pad.settings.colorcheck": "作者颜色", + "pad.settings.linenocheck": "è¡Œå·", + "pad.settings.rtlcheck": "从å³åˆ°å·¦é˜…读内容å—?", + "pad.settings.fontType": "å—体类型:", + "pad.settings.fontType.normal": "æ£å¸¸", + "pad.settings.fontType.monospaced": "ç‰å®½å—体", + "pad.settings.globalView": "所有人视窗", + "pad.settings.language": "è¯è¨€ï¼š", + "pad.importExport.import_export": "导入/导出", + "pad.importExport.import": "上载任何文本文件或档案", + "pad.importExport.importSuccessful": "æˆåŠŸï¼", + "pad.importExport.export": "当å‰è®°äº‹æœ¬å¯¼å‡ºä¸ºï¼š", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u7eaf\u6587\u672c", + "pad.importExport.exportplain": "纯文本", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF\uff08\u5f00\u653e\u6587\u6863\u683c\u5f0f\uff09", + "pad.importExport.exportopen": "ODFï¼ˆå¼€æ”¾æ–‡æ¡£æ ¼å¼ï¼‰", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.modals.connected": "\u5df2\u8fde\u63a5\u3002", - "pad.modals.reconnecting": "\u91cd\u65b0\u8fde\u63a5\u5230\u60a8\u7684\u8bb0\u4e8b\u7c3f...", - "pad.modals.forcereconnect": "\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5", - "pad.modals.userdup": "\u5728\u53e6\u4e00\u4e2a\u89c6\u7a97\u4e2d\u6253\u5f00", - "pad.modals.userdup.explanation": "\u6b64\u8bb0\u4e8b\u7c3f\u4f3c\u4e4e\u5728\u6b64\u7535\u8111\u4e0a\u5728\u591a\u4e2a\u6d4f\u89c8\u5668\u89c6\u7a97\u4e2d\u6253\u5f00\u3002", - "pad.modals.userdup.advice": "\u91cd\u65b0\u8fde\u63a5\u5230\u6b64\u89c6\u7a97\u3002", - "pad.modals.unauth": "\u672a\u6388\u6743", - "pad.modals.looping": "\u5df2\u79bb\u7ebf\u3002", - "pad.modals.initsocketfail": "\u65e0\u6cd5\u8bbf\u95ee\u670d\u52a1\u5668\u3002", - "pad.modals.initsocketfail.explanation": "\u65e0\u6cd5\u8fde\u63a5\u5230\u540c\u6b65\u670d\u52a1\u5668\u3002", - "pad.modals.initsocketfail.cause": "\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u60a8\u7684\u6d4f\u89c8\u5668\u6216\u60a8\u7684\u4e92\u8054\u7f51\u8fde\u63a5\u7684\u95ee\u9898\u3002", - "pad.modals.slowcommit": "\u5df2\u79bb\u7ebf\u3002", - "pad.modals.slowcommit.explanation": "\u670d\u52a1\u5668\u6ca1\u6709\u54cd\u5e94\u3002", - "pad.modals.slowcommit.cause": "\u8fd9\u53ef\u80fd\u662f\u7531\u4e8e\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u3002", - "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", - "pad.modals.deleted.explanation": "\u6b64\u8bb0\u4e8b\u672c\u5df2\u88ab\u79fb\u9664\u3002", - "pad.modals.disconnected": "\u60a8\u5df2\u88ab\u79bb\u7ebf\u3002", - "pad.modals.disconnected.explanation": "\u5230\u670d\u52a1\u5668\u7684\u8fde\u63a5\u5df2\u4e22\u5931", - "pad.modals.disconnected.cause": "\u670d\u52a1\u5668\u53ef\u80fd\u65e0\u6cd5\u4f7f\u7528\u3002\u82e5\u6b64\u60c5\u51b5\u6301\u7eed\u53d1\u751f\uff0c\u8bf7\u901a\u77e5\u6211\u4eec\u3002", - "pad.share": "\u5206\u4eab\u6b64\u8bb0\u4e8b\u672c", - "pad.share.readonly": "\u53ea\u80fd\u8bfb", - "pad.share.link": "\u94fe\u63a5", - "pad.share.emebdcode": "\u5d4c\u5165\u7f51\u5740", - "pad.chat": "\u804a\u5929", - "pad.chat.title": "\u6253\u5f00\u6b64\u8bb0\u4e8b\u7c3f\u7684\u804a\u5929\u3002", - "pad.chat.loadmessages": "\u52a0\u8f7d\u66f4\u591a\u4fe1\u606f", - "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u8bb0\u4e8b\u672c", - "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", - "timeslider.toolbar.authorsList": "\u6ca1\u6709\u4f5c\u8005", - "timeslider.toolbar.exportlink.title": "\u5bfc\u51fa", - "timeslider.exportCurrent": "\u5bfc\u51fa\u76ee\u524d\u7248\u672c\u4e3a\uff1a", - "timeslider.version": "\u7b2c {{version}} \u7248\u672c", - "timeslider.saved": "\u5728{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", - "timeslider.month.january": "\u4e00\u6708", - "timeslider.month.february": "\u4e8c\u6708", - "timeslider.month.march": "\u4e09\u6708", - "timeslider.month.april": "\u56db\u6708", - "timeslider.month.may": "\u4e94\u6708", - "timeslider.month.june": "\u516d\u6708", - "timeslider.month.july": "\u4e03\u6708", - "timeslider.month.august": "\u516b\u6708", - "timeslider.month.september": "\u4e5d\u6708", - "timeslider.month.october": "\u5341\u6708", - "timeslider.month.november": "\u5341\u4e00\u6708", - "timeslider.month.december": "\u5341\u4e8c\u6708", - "timeslider.unnamedauthor": "{{num}}\u533f\u540d\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}}\u533f\u540d\u4f5c\u8005", - "pad.savedrevs.marked": "\u6b64\u4fee\u8ba2\u5df2\u6807\u8bb0\u4e3a\u4fdd\u5b58\u4fee\u8ba2", - "pad.userlist.entername": "\u8f93\u5165\u60a8\u7684\u59d3\u540d", - "pad.userlist.unnamed": "\u65e0\u540d", - "pad.userlist.guest": "\u8bbf\u5ba2", - "pad.userlist.deny": "\u62d2\u7edd", - "pad.userlist.approve": "\u6279\u51c6", - "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u4e2a\u6587\u6863\u7684\u4f5c\u8005\u989c\u8272\u5417\uff1f", - "pad.impexp.importbutton": "\u73b0\u5728\u5bfc\u5165", - "pad.impexp.importing": "\u6b63\u5728\u5bfc\u5165...", - "pad.impexp.convertFailed": "\u6211\u4eec\u65e0\u6cd5\u5bfc\u5165\u6b64\u6587\u6863\u3002\u8bf7\u4f7f\u7528\u4ed6\u6587\u6863\u683c\u5f0f\u6216\u624b\u52a8\u590d\u5236\u8d34\u4e0a\u3002", - "pad.impexp.uploadFailed": "\u4e0a\u8f7d\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5", - "pad.impexp.importfailed": "\u5bfc\u5165\u5931\u8d25", - "pad.impexp.copypaste": "\u8bf7\u590d\u5236\u7c98\u8d34", - "pad.impexp.exportdisabled": "{{type}} \u683c\u5f0f\u7684\u5bfc\u51fa\u88ab\u7981\u7528\u3002\u6709\u5173\u8be6\u60c5\uff0c\u8bf7\u4e0e\u60a8\u7684\u7cfb\u7edf\u7ba1\u7406\u5458\u8054\u7cfb\u3002" -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "您åªèƒ½å¯¼å…¥çº¯æ–‡æœ¬æˆ–HTMLæ ¼å¼ã€‚<a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">安è£abiword</a>å–得更多高级的导入功能。", + "pad.modals.connected": "已连接。", + "pad.modals.reconnecting": "é‡æ–°è¿žæŽ¥åˆ°æ‚¨çš„记事本...", + "pad.modals.forcereconnect": "强制é‡æ–°è¿žæŽ¥", + "pad.modals.userdup": "在å¦ä¸€ä¸ªçª—å£ä¸æ‰“å¼€", + "pad.modals.userdup.explanation": "æ¤è®°äº‹æœ¬ä¼¼ä¹Žåœ¨æœ¬ç”µè„‘上的多个æµè§ˆå™¨çª—å£ä¸æ‰“开。", + "pad.modals.userdup.advice": "é‡æ–°è¿žæŽ¥ï¼Œä½¿ç”¨æ¤çª—å£ã€‚", + "pad.modals.unauth": "未授æƒ", + "pad.modals.unauth.explanation": "您的æƒé™åœ¨æŸ¥çœ‹æ¤é¡µé¢æ—¶å·²æ”¹å˜ã€‚å°è¯•é‡æ–°è¿žæŽ¥ã€‚", + "pad.modals.looping.explanation": "与åŒæ¥æœåŠ¡å™¨çš„通信出现问题。", + "pad.modals.looping.cause": "也许您是通过ä¸å…¼å®¹çš„防ç«å¢™æˆ–代ç†æœåŠ¡å™¨è¿žæŽ¥ã€‚", + "pad.modals.initsocketfail": "æ— æ³•è®¿é—®æœåŠ¡å™¨ã€‚", + "pad.modals.initsocketfail.explanation": "æ— æ³•è¿žæŽ¥åˆ°åŒæ¥æœåŠ¡å™¨ã€‚", + "pad.modals.initsocketfail.cause": "è¿™å¯èƒ½æ˜¯ç”±äºŽæ‚¨çš„æµè§ˆå™¨æˆ–您的互è”网连接的问题。", + "pad.modals.slowcommit.explanation": "æœåŠ¡å™¨æ²¡æœ‰å“应。", + "pad.modals.slowcommit.cause": "è¿™å¯èƒ½æ˜¯ç”±äºŽç½‘络连接问题。", + "pad.modals.badChangeset.explanation": "您的一个编辑被åŒæ¥æœåŠ¡å™¨åˆ†ç±»ä¸ºéžæ³•ã€‚", + "pad.modals.badChangeset.cause": "è¿™å¯èƒ½æ˜¯å› 为æœåŠ¡å™¨é…置的错误或者其他未预料到的行为。如果您认为这是错误,请è”ç³»æœåŠ¡ç®¡ç†å‘˜ã€‚è¦ç»§ç»ç¼–辑,请å°è¯•é‡æ–°è¿žæŽ¥ã€‚", + "pad.modals.corruptPad.explanation": "您试图连接的平æ¿å·²æŸå。", + "pad.modals.corruptPad.cause": "è¿™å¯èƒ½æ˜¯å› 为æœåŠ¡å™¨é…置的错误或者其他未预料到的行为。请è”ç³»æœåŠ¡ç®¡ç†å‘˜ã€‚", + "pad.modals.deleted": "已刪除。", + "pad.modals.deleted.explanation": "æ¤è®°äº‹æœ¬å·²è¢«ç§»é™¤ã€‚", + "pad.modals.disconnected": "ä½ å·²æ–开连接。", + "pad.modals.disconnected.explanation": "到æœåŠ¡å™¨çš„连接已丢失", + "pad.modals.disconnected.cause": "æœåŠ¡å™¨å¯èƒ½æ— 法使用。若æ¤æƒ…况æŒç»å‘生,请通知æœåŠ¡å™¨ç®¡ç†å‘˜ã€‚", + "pad.share": "分享æ¤è®°äº‹æœ¬", + "pad.share.readonly": "åªè¯»", + "pad.share.link": "链接", + "pad.share.emebdcode": "嵌入网å€", + "pad.chat": "èŠå¤©", + "pad.chat.title": "打开æ¤è®°äº‹æœ¬çš„èŠå¤©çª—å£ã€‚", + "pad.chat.loadmessages": "åŠ è½½æ›´å¤šä¿¡æ¯", + "timeslider.pageTitle": "{{appTitle}} 时间轴", + "timeslider.toolbar.returnbutton": "返回记事本", + "timeslider.toolbar.authors": "作者:", + "timeslider.toolbar.authorsList": "没有作者", + "timeslider.toolbar.exportlink.title": "导出", + "timeslider.exportCurrent": "当å‰ç‰ˆæœ¬å¯¼å‡ºä¸ºï¼š", + "timeslider.version": "版本 {{version}}", + "timeslider.saved": "在{{year}}å¹´{{month}}{{day}}æ—¥ä¿å˜", + "timeslider.dateformat": "{{year}}å¹´{{month}}{{day}}æ—¥ {{hours}}æ—¶:{{minutes}}分:{{seconds}}秒", + "timeslider.month.january": "一月", + "timeslider.month.february": "二月", + "timeslider.month.march": "三月", + "timeslider.month.april": "四月", + "timeslider.month.may": "五月", + "timeslider.month.june": "å…月", + "timeslider.month.july": "七月", + "timeslider.month.august": "八月", + "timeslider.month.september": "ä¹æœˆ", + "timeslider.month.october": "å月", + "timeslider.month.november": "å一月", + "timeslider.month.december": "å二月", + "timeslider.unnamedauthors": "{{num}}个匿å作者", + "pad.savedrevs.marked": "è¿™ä¸€ä¿®è®¢çŽ°åœ¨è¢«æ ‡è®°ä¸ºå·²ä¿å˜çš„修订版本", + "pad.userlist.entername": "输入您的姓å", + "pad.userlist.unnamed": "匿å", + "pad.userlist.guest": "访客", + "pad.userlist.deny": "æ‹’ç»", + "pad.userlist.approve": "批准", + "pad.editbar.clearcolors": "清除整个文档的作者颜色å—?", + "pad.impexp.importbutton": "现在导入", + "pad.impexp.importing": "æ£åœ¨å¯¼å…¥...", + "pad.impexp.confirmimport": "导入的文件将覆盖记事本的当å‰æ–‡æœ¬ã€‚ä½ ç¡®å®šè¦ç»§ç»å—?", + "pad.impexp.convertFailed": "æˆ‘ä»¬æ— æ³•å¯¼å…¥æ¤æ–‡æ¡£ã€‚è¯·ä½¿ç”¨ä»–æ–‡æ¡£æ ¼å¼æˆ–手动å¤åˆ¶è´´ä¸Šã€‚", + "pad.impexp.uploadFailed": "上载失败,请é‡è¯•", + "pad.impexp.importfailed": "导入失败", + "pad.impexp.copypaste": "请å¤åˆ¶ç²˜è´´", + "pad.impexp.exportdisabled": "{{type}} æ ¼å¼çš„导出被ç¦ç”¨ã€‚有关详情,请与您的系统管ç†å‘˜è”系。" +} diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index efe4da61..72d316eb 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -1,121 +1,126 @@ { "@metadata": { - "authors": { - "0": "Shirayuki", - "2": "Simon Shek" - } + "authors": [ + "Justincheng12345", + "Liuxinyu970226", + "Shangkuanlc", + "Shirayuki", + "Simon Shek" + ] }, - "index.newPad": "\u65b0Pad", - "index.createOpenPad": "\u6216\u5275\u5efa\uff0f\u958b\u555f\u4ee5\u4e0b\u540d\u7a31\u7684pad\uff1a", - "pad.toolbar.bold.title": "\u7c97\u9ad4\uff08Ctrl-B\uff09", - "pad.toolbar.italic.title": "\u659c\u9ad4\uff08Ctrl-I\uff09", - "pad.toolbar.underline.title": "\u5e95\u7dda\uff08Ctrl-U\uff09", - "pad.toolbar.strikethrough.title": "\u522a\u9664\u7dda", - "pad.toolbar.ol.title": "\u6709\u5e8f\u6e05\u55ae", - "pad.toolbar.ul.title": "\u7121\u5e8f\u6e05\u55ae", - "pad.toolbar.indent.title": "\u7e2e\u6392", - "pad.toolbar.unindent.title": "\u51f8\u6392", - "pad.toolbar.undo.title": "\u64a4\u92b7\uff08Ctrl-Z\uff09", - "pad.toolbar.redo.title": "\u91cd\u505a\uff08Ctrl-Y\uff09", - "pad.toolbar.clearAuthorship.title": "\u6e05\u9664\u4f5c\u540d\u984f\u8272", - "pad.toolbar.import_export.title": "\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u5c0e\u5165\uff0f\u532f\u51fa", - "pad.toolbar.timeslider.title": "\u6642\u9593\u8ef8", - "pad.toolbar.savedRevision.title": "\u5132\u5b58\u4fee\u8a02", - "pad.toolbar.settings.title": "\u8a2d\u5b9a", - "pad.toolbar.embed.title": "\u5d4c\u5165\u6b64pad", - "pad.toolbar.showusers.title": "\u986f\u793a\u6b64pad\u7684\u7528\u6236", - "pad.colorpicker.save": "\u5132\u5b58", - "pad.colorpicker.cancel": "\u53d6\u6d88", - "pad.loading": "\u8f09\u5165\u4e2d...", - "pad.passwordRequired": "\u60a8\u9700\u8981\u5bc6\u78bc\u624d\u80fd\u8a2a\u554f\u9019\u500bpad", - "pad.permissionDenied": "\u4f60\u6c92\u6709\u8a2a\u554f\u9019\u500bpad\u7684\u6b0a\u9650", - "pad.wrongPassword": "\u5bc6\u78bc\u932f\u8aa4", - "pad.settings.padSettings": "Pad\u8a2d\u5b9a", - "pad.settings.myView": "\u6211\u7684\u8996\u7a97", - "pad.settings.stickychat": "\u6c38\u9060\u5728\u5c4f\u5e55\u4e0a\u986f\u793a\u804a\u5929", - "pad.settings.colorcheck": "\u4f5c\u8005\u984f\u8272", - "pad.settings.linenocheck": "\u884c\u865f", - "pad.settings.fontType": "\u5b57\u9ad4\u985e\u578b\uff1a", - "pad.settings.fontType.normal": "\u6b63\u5e38", - "pad.settings.fontType.monospaced": "\u7b49\u5bec", - "pad.settings.globalView": "\u6240\u6709\u4eba\u7684\u8996\u7a97", - "pad.settings.language": "\u8a9e\u8a00\uff1a", - "pad.importExport.import_export": "\u5c0e\u5165\uff0f\u532f\u51fa", - "pad.importExport.import": "\u4e0a\u8f09\u4efb\u4f55\u6587\u5b57\u6a94\u6216\u6587\u6a94", - "pad.importExport.importSuccessful": "\u5b8c\u6210\uff01", - "pad.importExport.export": "\u532f\u51fa\u7576\u524dpad\u70ba\uff1a", + "index.newPad": "æ–°Pad", + "index.createOpenPad": "或創建ï¼é–‹å•Ÿä»¥ä¸‹å稱的pad:", + "pad.toolbar.bold.title": "粗體(Ctrl-B)", + "pad.toolbar.italic.title": "斜體(Ctrl-I)", + "pad.toolbar.underline.title": "底線(Ctrl-U)", + "pad.toolbar.strikethrough.title": "刪除線", + "pad.toolbar.ol.title": "有åºæ¸…å–®", + "pad.toolbar.ul.title": "ç„¡åºæ¸…å–®", + "pad.toolbar.indent.title": "縮排(TAB)", + "pad.toolbar.unindent.title": "凸排(Shift+TAB)", + "pad.toolbar.undo.title": "撤銷(Ctrl-Z)", + "pad.toolbar.redo.title": "é‡åšï¼ˆCtrl-Y)", + "pad.toolbar.clearAuthorship.title": "清除å”作者é¡è‰²å€åˆ¥", + "pad.toolbar.import_export.title": "ä»¥å…¶ä»–æª”æ¡ˆæ ¼å¼åŒ¯å…¥ï¼åŒ¯å‡º", + "pad.toolbar.timeslider.title": "時間軸", + "pad.toolbar.savedRevision.title": "儲å˜ä¿®è¨‚", + "pad.toolbar.settings.title": "è¨å®š", + "pad.toolbar.embed.title": "分享和嵌入æ¤pad", + "pad.toolbar.showusers.title": "顯示æ¤pad的用戶", + "pad.colorpicker.save": "儲å˜", + "pad.colorpicker.cancel": "å–消", + "pad.loading": "載入ä¸...", + "pad.passwordRequired": "您需è¦å¯†ç¢¼æ‰èƒ½è¨ªå•é€™å€‹pad", + "pad.permissionDenied": "ä½ æ²’æœ‰è¨ªå•é€™å€‹pad的權é™", + "pad.wrongPassword": "密碼錯誤", + "pad.settings.padSettings": "Padè¨å®š", + "pad.settings.myView": "我的視窗", + "pad.settings.stickychat": "æ°¸é 在å±å¹•ä¸Šé¡¯ç¤ºèŠå¤©", + "pad.settings.colorcheck": "å”作者é¡è‰²", + "pad.settings.linenocheck": "行號", + "pad.settings.rtlcheck": "從å³è‡³å·¦è®€å–內容?", + "pad.settings.fontType": "å—體類型:", + "pad.settings.fontType.normal": "æ£å¸¸", + "pad.settings.fontType.monospaced": "ç‰å¯¬", + "pad.settings.globalView": "所有人的視窗", + "pad.settings.language": "語言:", + "pad.importExport.import_export": "匯入ï¼åŒ¯å‡º", + "pad.importExport.import": "上載任何文å—檔或文檔", + "pad.importExport.importSuccessful": "完æˆï¼", + "pad.importExport.export": "匯出當å‰pad為:", "pad.importExport.exporthtml": "HTML", - "pad.importExport.exportplain": "\u7d14\u6587\u5b57", + "pad.importExport.exportplain": "純文å—", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", - "pad.importExport.exportopen": "ODF\uff08\u958b\u653e\u6587\u4ef6\u683c\u5f0f\uff09", + "pad.importExport.exportopen": "ODFï¼ˆé–‹æ”¾æ–‡ä»¶æ ¼å¼ï¼‰", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "\u60a8\u53ea\u53ef\u4ee5\u7d14\u6587\u5b57\u6216html\u683c\u5f0f\u6a94\u532f\u5165\u3002<a href=\"https:\/\/github.com\/ether\/etherpad-lite\/wiki\/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">\u5b89\u88ddabiword<\/a>\u53d6\u5f97\u66f4\u591a\u9032\u968e\u7684\u532f\u5165\u529f\u80fd\u3002", - "pad.modals.connected": "\u5df2\u9023\u7dda\u3002", - "pad.modals.reconnecting": "\u91cd\u65b0\u9023\u63a5\u5230\u60a8\u7684pad...", - "pad.modals.forcereconnect": "\u5f37\u5236\u91cd\u65b0\u9023\u7dda", - "pad.modals.userdup": "\u5728\u53e6\u4e00\u500b\u8996\u7a97\u4e2d\u958b\u555f", - "pad.modals.userdup.explanation": "\u6b64pad\u4f3c\u4e4e\u5728\u6b64\u96fb\u8166\u4e0a\u7684\u591a\u500b\u700f\u89bd\u5668\u8996\u7a97\u4e2d\u958b\u555f\u3002", - "pad.modals.userdup.advice": "\u91cd\u65b0\u9023\u63a5\u5230\u6b64\u8996\u7a97\u3002", - "pad.modals.unauth": "\u672a\u6388\u6b0a", - "pad.modals.unauth.explanation": "\u60a8\u7684\u6b0a\u9650\u5728\u67e5\u770b\u6b64\u9801\u6642\u767c\u751f\u66f4\u6539\u3002\u8acb\u5617\u8a66\u91cd\u65b0\u9023\u63a5\u3002", - "pad.modals.looping": "\u5df2\u96e2\u7dda\u3002", - "pad.modals.looping.explanation": "\u8207\u540c\u6b65\u4f3a\u670d\u5668\u9593\u6709\u901a\u4fe1\u554f\u984c\u3002", - "pad.modals.looping.cause": "\u4e5f\u8a31\u60a8\u901a\u904e\u4e00\u500b\u4e0d\u76f8\u5bb9\u7684\u9632\u706b\u7246\u6216\u4ee3\u7406\u4f3a\u670d\u5668\u9023\u63a5\u3002", - "pad.modals.initsocketfail": "\u7121\u6cd5\u8a2a\u554f\u4f3a\u670d\u5668\u3002", - "pad.modals.initsocketfail.explanation": "\u7121\u6cd5\u9023\u63a5\u5230\u540c\u6b65\u4f3a\u670d\u5668\u3002", - "pad.modals.initsocketfail.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u60a8\u7684\u700f\u89bd\u5668\u6216\u60a8\u7684\u4e92\u806f\u7db2\u9023\u63a5\u7684\u554f\u984c\u3002", - "pad.modals.slowcommit": "\u5df2\u96e2\u7dda\u3002", - "pad.modals.slowcommit.explanation": "\u4f3a\u670d\u5668\u6c92\u6709\u56de\u61c9\u3002", - "pad.modals.slowcommit.cause": "\u53ef\u80fd\u662f\u7531\u65bc\u7db2\u8def\u9023\u63a5\u554f\u984c\u3002", - "pad.modals.deleted": "\u5df2\u522a\u9664\u3002", - "pad.modals.deleted.explanation": "\u6b64pad\u5df2\u88ab\u79fb\u9664\u3002", - "pad.modals.disconnected": "\u60a8\u5df2\u4e2d\u65b7\u9023\u7dda\u3002", - "pad.modals.disconnected.explanation": "\u4f3a\u670d\u5668\u9023\u63a5\u66fe\u4e2d\u65b7", - "pad.modals.disconnected.cause": "\u4f3a\u670d\u5668\u53ef\u80fd\u7121\u6cd5\u4f7f\u7528\u3002\u82e5\u6b64\u60c5\u6cc1\u6301\u7e8c\u767c\u751f\uff0c\u8acb\u901a\u77e5\u6211\u5011\u3002", - "pad.share": "\u5206\u4eab\u6b64pad", - "pad.share.readonly": "\u552f\u8b80", - "pad.share.link": "\u9023\u7d50", - "pad.share.emebdcode": "\u5d4c\u5165\u7db2\u5740", - "pad.chat": "\u804a\u5929", - "pad.chat.title": "\u6253\u958b\u6b64pad\u7684\u804a\u5929\u3002", - "pad.chat.loadmessages": "\u8f09\u5165\u66f4\u591a\u8a0a\u606f", - "timeslider.pageTitle": "{{appTitle}}\u6642\u9593\u8ef8", - "timeslider.toolbar.returnbutton": "\u8fd4\u56de\u5230pad", - "timeslider.toolbar.authors": "\u4f5c\u8005\uff1a", - "timeslider.toolbar.authorsList": "\u7121\u4f5c\u8005", - "timeslider.toolbar.exportlink.title": "\u532f\u51fa", - "timeslider.exportCurrent": "\u532f\u51fa\u7576\u524d\u7248\u672c\u70ba\uff1a", - "timeslider.version": "\u7248\u672c{{version}}", - "timeslider.saved": "{{year}}\u5e74{{month}}{{day}}\u65e5\u4fdd\u5b58", - "timeslider.dateformat": "{{year}}\u5e74{{month}}\u6708{{day}}\u65e5 {{hours}}:{{minutes}}:{{seconds}}", - "timeslider.month.january": "1\u6708", - "timeslider.month.february": "2\u6708", - "timeslider.month.march": "3\u6708", - "timeslider.month.april": "4\u6708", - "timeslider.month.may": "5\u6708", - "timeslider.month.june": "6\u6708", - "timeslider.month.july": "7\u6708", - "timeslider.month.august": "8\u6708", - "timeslider.month.september": "9\u6708", - "timeslider.month.october": "10\u6708", - "timeslider.month.november": "11\u6708", - "timeslider.month.december": "12\u6708", - "timeslider.unnamedauthor": "{{num}} \u533f\u540d\u4f5c\u8005", - "timeslider.unnamedauthors": "{{num}} \u533f\u540d\u4f5c\u8005", - "pad.savedrevs.marked": "\u6b64\u4fee\u8a02\u5df2\u6a19\u8a18\u70ba\u5df2\u4fdd\u5b58\u3002", - "pad.userlist.entername": "\u8f38\u5165\u60a8\u7684\u59d3\u540d", - "pad.userlist.unnamed": "\u672a\u547d\u540d", - "pad.userlist.guest": "\u8a2a\u5ba2", - "pad.userlist.deny": "\u62d2\u7d55", - "pad.userlist.approve": "\u6279\u51c6", - "pad.editbar.clearcolors": "\u6e05\u9664\u6574\u500b\u6587\u6a94\u7684\u4f5c\u8005\u984f\u8272\u55ce\uff1f", - "pad.impexp.importbutton": "\u73fe\u5728\u532f\u5165", - "pad.impexp.importing": "\u532f\u5165\u4e2d...", - "pad.impexp.confirmimport": "\u532f\u5165\u7684\u6a94\u6848\u5c07\u6703\u8986\u84cbpad\u5167\u76ee\u524d\u7684\u6587\u5b57\u3002\u60a8\u78ba\u5b9a\u8981\u7e7c\u7e8c\u55ce\uff1f", - "pad.impexp.convertFailed": "\u672a\u80fd\u532f\u5165\u6b64\u6a94\u6848\u3002\u8acb\u4ee5\u5176\u4ed6\u6a94\u6848\u683c\u5f0f\u6216\u624b\u52d5\u8907\u88fd\u8cbc\u4e0a\u532f\u5165\u3002", - "pad.impexp.uploadFailed": "\u4e0a\u8f09\u5931\u6557\uff0c\u8acb\u91cd\u8a66", - "pad.impexp.importfailed": "\u532f\u5165\u5931\u6557", - "pad.impexp.copypaste": "\u8acb\u8907\u88fd\u8cbc\u4e0a", - "pad.impexp.exportdisabled": "{{type}}\u683c\u5f0f\u7684\u532f\u51fa\u88ab\u7981\u7528\u3002\u6709\u95dc\u8a73\u60c5\uff0c\u8acb\u8207\u60a8\u7684\u7cfb\u7d71\u7ba1\u7406\u54e1\u806f\u7e6b\u3002" -}
\ No newline at end of file + "pad.importExport.abiword.innerHTML": "您åªå¯ä»¥ç´”æ–‡å—或htmlæ ¼å¼æª”匯入。<a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">安è£abiword</a>å–得更多進階的匯入功能。", + "pad.modals.connected": "已連線。", + "pad.modals.reconnecting": "é‡æ–°é€£æŽ¥åˆ°æ‚¨çš„pad...", + "pad.modals.forcereconnect": "強制é‡æ–°é€£ç·š", + "pad.modals.userdup": "在å¦ä¸€å€‹è¦–窗ä¸é–‹å•Ÿ", + "pad.modals.userdup.explanation": "æ¤pad似乎在æ¤é›»è…¦ä¸Šçš„多個ç€è¦½å™¨è¦–窗ä¸é–‹å•Ÿã€‚", + "pad.modals.userdup.advice": "é‡æ–°é€£æŽ¥åˆ°æ¤è¦–窗。", + "pad.modals.unauth": "未授權", + "pad.modals.unauth.explanation": "您的權é™åœ¨æŸ¥çœ‹æ¤é 時發生更改。請嘗試é‡æ–°é€£æŽ¥ã€‚", + "pad.modals.looping.explanation": "與åŒæ¥ä¼ºæœå™¨é–“有通信å•é¡Œã€‚", + "pad.modals.looping.cause": "也許您是通éŽä¸ç›¸å®¹çš„防ç«ç‰†æˆ–代ç†ä¼ºæœå™¨é€£ç·šã€‚", + "pad.modals.initsocketfail": "無法訪å•ä¼ºæœå™¨ã€‚", + "pad.modals.initsocketfail.explanation": "無法連接到åŒæ¥ä¼ºæœå™¨ã€‚", + "pad.modals.initsocketfail.cause": "這å¯èƒ½æ˜¯å› 為ç€è¦½å™¨æˆ–網際網路連線å•é¡Œæ‰€é€ æˆã€‚", + "pad.modals.slowcommit.explanation": "伺æœå™¨æ²’有回應。", + "pad.modals.slowcommit.cause": "這å¯èƒ½æ˜¯å› 為網路連線å•é¡Œæ‰€é€ æˆã€‚", + "pad.modals.badChangeset.explanation": "您的一個編輯被åŒæ¥ä¼ºæœå™¨é¡žç‚ºéžæ³•ã€‚", + "pad.modals.badChangeset.cause": "這å¯èƒ½ç”±æ–¼ä¼ºæœå™¨çš„é…置錯誤或é‡åˆ°æ„外å•é¡Œã€‚若您èªç‚ºé€™æ˜¯éŒ¯èª¤ï¼Œè«‹è¯ç¹«ä¼ºæœå™¨ç®¡ç†å“¡ã€‚如è¦ç¹¼çºŒç·¨è¼¯ï¼Œè«‹å˜—試é‡æ–°é€£æŽ¥ã€‚", + "pad.modals.corruptPad.explanation": "您試圖訪å•çš„å¹³æ¿å·²æ壞。", + "pad.modals.corruptPad.cause": "這å¯èƒ½ç”±æ–¼ä¼ºæœå™¨çš„é…置錯誤或é‡åˆ°æ„外å•é¡Œã€‚è«‹è¯ç¹«ä¼ºæœå™¨ç®¡ç†å“¡ã€‚", + "pad.modals.deleted": "已刪除。", + "pad.modals.deleted.explanation": "æ¤pad已被移除。", + "pad.modals.disconnected": "您已ä¸æ–·é€£ç·šã€‚", + "pad.modals.disconnected.explanation": "伺æœå™¨é€£æŽ¥æ›¾ä¸æ–·", + "pad.modals.disconnected.cause": "伺æœå™¨å¯èƒ½ç„¡æ³•ä½¿ç”¨ã€‚è‹¥æ¤æƒ…æ³æŒçºŒç™¼ç”Ÿï¼Œè«‹é€šçŸ¥ä¼ºæœå™¨ç®¡ç†å“¡ã€‚", + "pad.share": "分享æ¤pad", + "pad.share.readonly": "唯讀", + "pad.share.link": "連çµ", + "pad.share.emebdcode": "嵌入網å€", + "pad.chat": "èŠå¤©åŠŸèƒ½", + "pad.chat.title": "打開padèŠå¤©åŠŸèƒ½", + "pad.chat.loadmessages": "載入更多訊æ¯", + "timeslider.pageTitle": "{{appTitle}}時間軸", + "timeslider.toolbar.returnbutton": "返回到pad", + "timeslider.toolbar.authors": "å”作者:", + "timeslider.toolbar.authorsList": "ç„¡å”作者", + "timeslider.toolbar.exportlink.title": "匯出", + "timeslider.exportCurrent": "匯出當å‰ç‰ˆæœ¬ç‚ºï¼š", + "timeslider.version": "版本{{version}}", + "timeslider.saved": "{{year}}å¹´{{month}}月{{day}}日儲å˜", + "timeslider.dateformat": "{{year}}å¹´{{month}}月{{day}}æ—¥ {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "1月", + "timeslider.month.february": "2月", + "timeslider.month.march": "3月", + "timeslider.month.april": "4月", + "timeslider.month.may": "5月", + "timeslider.month.june": "6月", + "timeslider.month.july": "7月", + "timeslider.month.august": "8月", + "timeslider.month.september": "9月", + "timeslider.month.october": "10月", + "timeslider.month.november": "11月", + "timeslider.month.december": "12月", + "timeslider.unnamedauthors": "{{num}}匿å{[plural(num) 作者]}", + "pad.savedrevs.marked": "標記æ¤ä¿®è¨‚版本為已儲å˜ä¿®è¨‚版本。", + "pad.userlist.entername": "輸入您的姓å", + "pad.userlist.unnamed": "未命å", + "pad.userlist.guest": "訪客", + "pad.userlist.deny": "拒絕", + "pad.userlist.approve": "批准", + "pad.editbar.clearcolors": "清除整個文檔的å”作者é¡è‰²å€åˆ¥å—Žï¼Ÿ", + "pad.impexp.importbutton": "ç¾åœ¨åŒ¯å…¥", + "pad.impexp.importing": "匯入ä¸...", + "pad.impexp.confirmimport": "匯入的檔案將會覆蓋pad內目å‰çš„æ–‡å—。您確定è¦ç¹¼çºŒå—Žï¼Ÿ", + "pad.impexp.convertFailed": "未能匯入æ¤æª”æ¡ˆã€‚è«‹ä»¥å…¶ä»–æª”æ¡ˆæ ¼å¼æˆ–手動複製貼上匯入。", + "pad.impexp.uploadFailed": "上載失敗,請é‡è©¦", + "pad.impexp.importfailed": "匯入失敗", + "pad.impexp.copypaste": "請複製貼上", + "pad.impexp.exportdisabled": "{{type}}æ ¼å¼çš„匯出被ç¦ç”¨ã€‚有關詳情,請與您的系統管ç†å“¡è¯ç¹«ã€‚" +} diff --git a/src/node/db/API.js b/src/node/db/API.js index 3955d495..4a912368 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -75,6 +75,129 @@ exports.listSessionsOfAuthor = sessionManager.listSessionsOfAuthor; /************************/ /** +getAttributePool(padID) returns the attribute pool of a pad + +Example returns: +{ + "code":0, + "message":"ok", + "data": { + "pool":{ + "numToAttrib":{ + "0":["author","a.X4m8bBWJBZJnWGSh"], + "1":["author","a.TotfBPzov54ihMdH"], + "2":["author","a.StiblqrzgeNTbK05"], + "3":["bold","true"] + }, + "attribToNum":{ + "author,a.X4m8bBWJBZJnWGSh":0, + "author,a.TotfBPzov54ihMdH":1, + "author,a.StiblqrzgeNTbK05":2, + "bold,true":3 + }, + "nextNum":4 + } + } +} + +*/ +exports.getAttributePool = function (padID, callback) +{ + getPadSafe(padID, true, function(err, pad) + { + if (ERR(err, callback)) return; + callback(null, {pool: pad.pool}); + }); +} + +/** +getRevisionChangeset (padID, [rev]) + +get the changeset at a given revision, or last revision if 'rev' is not defined. + +Example returns: +{ + "code" : 0, + "message" : "ok", + "data" : "Z:1>6b|5+6b$Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http://etherpad.org\n" +} + +*/ +exports.getRevisionChangeset = function(padID, rev, callback) +{ + // check if rev is set + if (typeof rev === "function") + { + callback = rev; + rev = undefined; + } + + // check if rev is a number + if (rev !== undefined && typeof rev !== "number") + { + // try to parse the number + if (!isNaN(parseInt(rev))) + { + rev = parseInt(rev); + } + else + { + callback(new customError("rev is not a number", "apierror")); + return; + } + } + + // ensure this is not a negative number + if (rev !== undefined && rev < 0) + { + callback(new customError("rev is not a negative number", "apierror")); + return; + } + + // ensure this is not a float value + if (rev !== undefined && !is_int(rev)) + { + callback(new customError("rev is a float value", "apierror")); + return; + } + + // get the pad + getPadSafe(padID, true, function(err, pad) + { + if(ERR(err, callback)) return; + + //the client asked for a special revision + if(rev !== undefined) + { + //check if this is a valid revision + if(rev > pad.getHeadRevisionNumber()) + { + callback(new customError("rev is higher than the head revision of the pad","apierror")); + return; + } + + //get the changeset for this revision + pad.getRevisionChangeset(rev, function(err, changeset) + { + if(ERR(err, callback)) return; + + callback(null, changeset); + }) + } + //the client wants the latest changeset, lets return it to him + else + { + pad.getRevisionChangeset(pad.getHeadRevisionNumber(), function(err, changeset) + { + if(ERR(err, callback)) return; + + callback(null, changeset); + }) + } + }); +} + +/** getText(padID, [rev]) returns the text of a pad Example returns: @@ -243,6 +366,8 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, rev, function(err, html) { if(ERR(err, callback)) return; + html = "<!DOCTYPE HTML><html><body>" +html; // adds HTML head + html += "</body></html>"; data = {html: html}; callback(null, data); }); @@ -253,6 +378,8 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, undefined, function (err, html) { if(ERR(err, callback)) return; + html = "<!DOCTYPE HTML><html><body>" +html; // adds HTML head + html += "</body></html>"; data = {html: html}; callback(null, data); }); @@ -260,15 +387,30 @@ exports.getHTML = function(padID, rev, callback) }); } +/** +setHTML(padID, html) sets the text of a pad based on HTML + +Example returns: + +{code: 0, message:"ok", data: null} +{code: 1, message:"padID does not exist", data: null} +*/ exports.setHTML = function(padID, html, callback) { + //html is required + if(typeof html != "string") + { + callback(new customError("html is no string","apierror")); + return; + } + //get the pad getPadSafe(padID, true, function(err, pad) { if(ERR(err, callback)) return; // add a new changeset with the new html to the pad - importHtml.setPadHTML(pad, cleanText(html)); + importHtml.setPadHTML(pad, cleanText(html), callback); //update the clients on the pad padMessageHandler.updatePadClients(pad, callback); @@ -322,8 +464,8 @@ exports.getChatHistory = function(padID, start, end, callback) // fall back to getting the whole chat-history if a parameter is missing if(!start || !end) { - start = 0; - end = pad.chatHead; + start = 0; + end = pad.chatHead; } if(start >= chatHead && chatHead > 0) @@ -435,6 +577,46 @@ exports.deletePad = function(padID, callback) } /** +copyPad(sourceID, destinationID[, force=false]) copies a pad. If force is true, + the destination will be overwritten if it exists. + +Example returns: + +{code: 0, message:"ok", data: {padID: destinationID}} +{code: 1, message:"padID does not exist", data: null} +*/ +exports.copyPad = function(sourceID, destinationID, force, callback) +{ + getPadSafe(sourceID, true, function(err, pad) + { + if(ERR(err, callback)) return; + + pad.copy(destinationID, force, callback); + }); +} + +/** +movePad(sourceID, destinationID[, force=false]) moves a pad. If force is true, + the destination will be overwritten if it exists. + +Example returns: + +{code: 0, message:"ok", data: {padID: destinationID}} +{code: 1, message:"padID does not exist", data: null} +*/ +exports.movePad = function(sourceID, destinationID, force, callback) +{ + getPadSafe(sourceID, true, function(err, pad) + { + if(ERR(err, callback)) return; + + pad.copy(destinationID, force, function(err) { + if(ERR(err, callback)) return; + pad.remove(callback); + }); + }); +} +/** getReadOnlyLink(padID) returns the read only link of a pad Example returns: @@ -459,6 +641,32 @@ exports.getReadOnlyID = function(padID, callback) } /** +getPadID(roID) returns the padID of a pad based on the readonlyID(roID) + +Example returns: + +{code: 0, message:"ok", data: {padID: padID}} +{code: 1, message:"padID does not exist", data: null} +*/ +exports.getPadID = function(roID, callback) +{ + //get the PadId + readOnlyManager.getPadId(roID, function(err, retrievedPadID) + { + if(ERR(err, callback)) return; + + if(retrievedPadID == null) + { + callback(new customError("padID does not exist","apierror")); + } + else + { + callback(null, {padID: retrievedPadID}); + } + }); +} + +/** setPublicStatus(padID, publicStatus) sets a boolean for the public status of a pad Example returns: @@ -660,7 +868,7 @@ createDiffHTML(padID, startRev, endRev) returns an object of diffs from 2 points Example returns: -{"code":0,"message":"ok","data":{"html":"<style>\n.authora_HKIv23mEbachFYfH {background-color: #a979d9}\n.authora_n4gEeMLsv1GivNeh {background-color: #a9b5d9}\n.removed {text-decoration: line-through; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; filter: alpha(opacity=80); opacity: 0.8; }\n</style>Welcome to Etherpad Lite!<br><br>This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!<br><br>Get involved with Etherpad at <a href=\"http://etherpad.org\">http://etherpad.org</a><br><span class=\"authora_HKIv23mEbachFYfH\">aw</span><br><br>","authors":["a.HKIv23mEbachFYfH",""]}} +{"code":0,"message":"ok","data":{"html":"<style>\n.authora_HKIv23mEbachFYfH {background-color: #a979d9}\n.authora_n4gEeMLsv1GivNeh {background-color: #a9b5d9}\n.removed {text-decoration: line-through; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; filter: alpha(opacity=80); opacity: 0.8; }\n</style>Welcome to Etherpad!<br><br>This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!<br><br>Get involved with Etherpad at <a href=\"http://etherpad.org\">http://etherpad.org</a><br><span class=\"authora_HKIv23mEbachFYfH\">aw</span><br><br>","authors":["a.HKIv23mEbachFYfH",""]}} {"code":4,"message":"no or wrong API Key","data":null} */ exports.createDiffHTML = function(padID, startRev, endRev, callback){ diff --git a/src/node/db/AuthorManager.js b/src/node/db/AuthorManager.js index 667e0605..5ba608e9 100644 --- a/src/node/db/AuthorManager.js +++ b/src/node/db/AuthorManager.js @@ -22,6 +22,7 @@ var ERR = require("async-stacktrace"); var db = require("./DB").db; var async = require("async"); +var customError = require("../utils/customError"); var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; exports.getColorPalette = function(){ @@ -272,4 +273,4 @@ exports.removePad = function (authorID, padID) db.set("globalAuthor:" + authorID, author); } }); -}
\ No newline at end of file +} diff --git a/src/node/db/GroupManager.js b/src/node/db/GroupManager.js index 81b0cb9e..82c14c39 100644 --- a/src/node/db/GroupManager.js +++ b/src/node/db/GroupManager.js @@ -215,25 +215,32 @@ exports.createGroupIfNotExistsFor = function(groupMapper, callback) { if(ERR(err, callback)) return; + // there is a group for this mapper + if(groupID) { + exports.doesGroupExist(groupID, function(err, exists) { + if(ERR(err, callback)) return; + if(exists) return callback(null, {groupID: groupID}); + + // hah, the returned group doesn't exist, let's create one + createGroupForMapper(callback) + }) + } //there is no group for this mapper, let's create a group - if(groupID == null) - { + else { + createGroupForMapper(callback) + } + + function createGroupForMapper(cb) { exports.createGroup(function(err, responseObj) { - if(ERR(err, callback)) return; + if(ERR(err, cb)) return; //create the mapper entry for this group db.set("mapper2group:"+groupMapper, responseObj.groupID); - callback(null, responseObj); + cb(null, responseObj); }); } - //there is a group for this mapper, let's return it - else - { - if(ERR(err, callback)) return; - callback(null, {groupID: groupID}); - } }); } diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index 4701e82a..c7e0d50a 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -6,13 +6,14 @@ var ERR = require("async-stacktrace"); var Changeset = require("ep_etherpad-lite/static/js/Changeset"); var AttributePool = require("ep_etherpad-lite/static/js/AttributePool"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; var db = require("./DB").db; var async = require("async"); var settings = require('../utils/Settings'); var authorManager = require("./AuthorManager"); var padManager = require("./PadManager"); var padMessageHandler = require("../handler/PadMessageHandler"); +var groupManager = require("./GroupManager"); +var customError = require("../utils/customError"); var readOnlyManager = require("./ReadOnlyManager"); var crypto = require("crypto"); var randomString = require("../utils/randomstring"); @@ -201,7 +202,11 @@ Pad.prototype.getInternalRevisionAText = function getInternalRevisionAText(targe { curRev++; var cs = changesets[curRev]; - atext = Changeset.applyToAText(cs, atext, apool); + try{ + atext = Changeset.applyToAText(cs, atext, apool); + }catch(e) { + return callback(e) + } } callback(null); @@ -404,6 +409,152 @@ Pad.prototype.init = function init(text, callback) { }); }; +Pad.prototype.copy = function copy(destinationID, force, callback) { + var sourceID = this.id; + var _this = this; + + // make force optional + if (typeof force == "function") { + callback = force; + force = false; + } + else if (force == undefined || force.toLowerCase() != "true") { + force = false; + } + else force = true; + + //kick everyone from this pad + // TODO: this presents a message on the client saying that the pad was 'deleted'. Fix this? + padMessageHandler.kickSessionsFromPad(sourceID); + + // flush the source pad: + _this.saveToDatabase(); + + async.series([ + // if it's a group pad, let's make sure the group exists. + function(callback) + { + if (destinationID.indexOf("$") != -1) + { + groupManager.doesGroupExist(destinationID.split("$")[0], function (err, exists) + { + if(ERR(err, callback)) return; + + //group does not exist + if(exists == false) + { + callback(new customError("groupID does not exist for destinationID","apierror")); + return; + } + //everything is fine, continue + else + { + callback(); + } + }); + } + else + callback(); + }, + // if the pad exists, we should abort, unless forced. + function(callback) + { + console.log("destinationID", destinationID, force); + padManager.doesPadExists(destinationID, function (err, exists) + { + if(ERR(err, callback)) return; + + if(exists == true) + { + if (!force) + { + console.log("erroring out without force"); + callback(new customError("destinationID already exists","apierror")); + console.log("erroring out without force - after"); + return; + } + else // exists and forcing + { + padManager.getPad(destinationID, function(err, pad) { + if (ERR(err, callback)) return; + pad.remove(callback); + }); + } + } + else + { + callback(); + } + }); + }, + // copy the 'pad' entry + function(callback) + { + db.get("pad:"+sourceID, function(err, pad) { + db.set("pad:"+destinationID, pad); + }); + callback(); + }, + //copy all relations + function(callback) + { + async.parallel([ + //copy all chat messages + function(callback) + { + var chatHead = _this.chatHead; + + for(var i=0;i<=chatHead;i++) + { + db.get("pad:"+sourceID+":chat:"+i, function (err, chat) { + if (ERR(err, callback)) return; + db.set("pad:"+destinationID+":chat:"+i, chat); + }); + } + + callback(); + }, + //copy all revisions + function(callback) + { + var revHead = _this.head; + //console.log(revHead); + for(var i=0;i<=revHead;i++) + { + db.get("pad:"+sourceID+":revs:"+i, function (err, rev) { + //console.log("HERE"); + + if (ERR(err, callback)) return; + db.set("pad:"+destinationID+":revs:"+i, rev); + }); + } + + callback(); + }, + //add the new pad to all authors who contributed to the old one + function(callback) + { + var authorIDs = _this.getAllAuthors(); + + authorIDs.forEach(function (authorID) + { + console.log("authors"); + authorManager.addPad(authorID, destinationID); + }); + + callback(); + }, + // parallel + ], callback); + }, + // series + ], function(err) + { + if(ERR(err, callback)) return; + callback(null, {padID: destinationID}); + }); +}; + Pad.prototype.remove = function remove(callback) { var padID = this.id; var _this = this; @@ -487,7 +638,7 @@ Pad.prototype.remove = function remove(callback) { authorIDs.forEach(function (authorID) { - authorManager.removePad(authorID, padID); + authorManager.removePad(authorID, padID); }); callback(); diff --git a/src/node/db/PadManager.js b/src/node/db/PadManager.js index 7d546fc7..2ecd6e27 100644 --- a/src/node/db/PadManager.js +++ b/src/node/db/PadManager.js @@ -24,7 +24,9 @@ var Pad = require("../db/Pad").Pad; var db = require("./DB").db; /** - * An Object containing all known Pads. Provides "get" and "set" functions, + * A cache of all loaded Pads. + * + * Provides "get" and "set" functions, * which should be used instead of indexing with brackets. These prepend a * colon to the key, to avoid conflicting with built-in Object methods or with * these functions themselves. @@ -37,39 +39,55 @@ var globalPads = { set: function (name, value) { this[':'+name] = value; - padList.addPad(name); }, - remove: function (name) { delete this[':'+name]; } + remove: function (name) { + delete this[':'+name]; + } }; +/** + * A cache of the list of all pads. + * + * Updated without db access as new pads are created/old ones removed. + */ var padList = { list: [], sorted : false, - init: function() + initiated: false, + init: function(cb) { db.findKeys("pad:*", "*:*:*", function(err, dbData) { - if(ERR(err)) return; + if(ERR(err, cb)) return; if(dbData != null){ + padList.initiated = true dbData.forEach(function(val){ padList.addPad(val.replace(/pad:/,""),false); }); + cb && cb() } }); return this; }, + load: function(cb) { + if(this.initiated) cb && cb() + else this.init(cb) + }, /** * Returns all pads in alphabetical order as array. */ - getPads: function(){ - if(!this.sorted){ - this.list=this.list.sort(); - this.sorted=true; - } - return this.list; + getPads: function(cb){ + this.load(function() { + if(!padList.sorted){ + padList.list = padList.list.sort(); + padList.sorted = true; + } + cb && cb(padList.list); + }) }, addPad: function(name) { + if(!this.initiated) return; if(this.list.indexOf(name) == -1){ this.list.push(name); this.sorted=false; @@ -77,7 +95,8 @@ var padList = { }, removePad: function(name) { - var index=this.list.indexOf(name); + if(!this.initiated) return; + var index = this.list.indexOf(name); if(index>-1){ this.list.splice(index,1); this.sorted=false; @@ -85,7 +104,6 @@ var padList = { } }; //initialises the allknowing data structure -padList.init(); /** * An array of padId transformations. These represent changes in pad name policy over @@ -152,18 +170,17 @@ exports.getPad = function(id, text, callback) { if(ERR(err, callback)) return; globalPads.set(id, pad); + padList.addPad(id); callback(null, pad); }); } } -exports.listAllPads = function(callback) +exports.listAllPads = function(cb) { - if(callback != null){ - callback(null,{padIDs: padList.getPads()}); - }else{ - return {padIDs: padList.getPads()}; - } + padList.getPads(function(list) { + cb && cb(null, {padIDs: list}); + }); } //checks if a pad exists @@ -229,9 +246,8 @@ exports.removePad = function(padId){ padList.removePad(padId); } -//removes a pad from the array +//removes a pad from the cache exports.unloadPad = function(padId) { - if(globalPads.get(padId)) - globalPads.remove(padId); + globalPads.remove(padId); } diff --git a/src/node/db/ReadOnlyManager.js b/src/node/db/ReadOnlyManager.js index b135e613..f49f71e2 100644 --- a/src/node/db/ReadOnlyManager.js +++ b/src/node/db/ReadOnlyManager.js @@ -22,7 +22,7 @@ var ERR = require("async-stacktrace"); var db = require("./DB").db; var async = require("async"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("../utils/randomstring"); /** * returns a read only id for a pad @@ -77,28 +77,22 @@ exports.getPadId = function(readOnlyId, callback) * returns a the padId and readonlyPadId in an object for any id * @param {String} padIdOrReadonlyPadId read only id or real pad id */ -exports.getIds = function(padIdOrReadonlyPadId, callback) { - var handleRealPadId = function () { - exports.getReadOnlyId(padIdOrReadonlyPadId, function (err, value) { +exports.getIds = function(id, callback) { + if (id.indexOf("r.") == 0) + exports.getPadId(id, function (err, value) { + if(ERR(err, callback)) return; + callback(null, { + readOnlyPadId: id, + padId: value, // Might be null, if this is an unknown read-only id + readonly: true + }); + }); + else + exports.getReadOnlyId(id, function (err, value) { callback(null, { readOnlyPadId: value, - padId: padIdOrReadonlyPadId, + padId: id, readonly: false }); }); - } - - if (padIdOrReadonlyPadId.indexOf("r.") != 0) - return handleRealPadId(); - - exports.getPadId(padIdOrReadonlyPadId, function (err, value) { - if(ERR(err, callback)) return; - if (value == null) - return handleRealPadId(); - callback(null, { - readOnlyPadId: padIdOrReadonlyPadId, - padId: value, - readonly: true - }); - }); } diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 4289e39c..6388f096 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -26,7 +26,8 @@ var authorManager = require("./AuthorManager"); var padManager = require("./PadManager"); var sessionManager = require("./SessionManager"); var settings = require("../utils/Settings"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var log4js = require('log4js'); +var authLogger = log4js.getLogger("auth"); /** * This function controlls the access to a pad, it checks if the user can access a pad. @@ -39,6 +40,11 @@ var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; exports.checkAccess = function (padID, sessionCookie, token, password, callback) { var statusObject; + + if(!padID) { + callback(null, {accessStatus: "deny"}); + return; + } // a valid session is required (api-only mode) if(settings.requireSession) @@ -117,31 +123,43 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //get information about all sessions contained in this cookie function(callback) { - if (!sessionCookie) { + if (!sessionCookie) + { callback(); return; } var sessionIDs = sessionCookie.split(','); - async.forEach(sessionIDs, function(sessionID, callback) { - sessionManager.getSessionInfo(sessionID, function(err, sessionInfo) { + async.forEach(sessionIDs, function(sessionID, callback) + { + sessionManager.getSessionInfo(sessionID, function(err, sessionInfo) + { //skip session if it doesn't exist - if(err && err.message == "sessionID does not exist") return; + if(err && err.message == "sessionID does not exist") + { + authLogger.debug("Auth failed: unknown session"); + callback(); + return; + } if(ERR(err, callback)) return; var now = Math.floor(new Date().getTime()/1000); //is it for this group? - if(sessionInfo.groupID != groupID) { - callback(); - return; + if(sessionInfo.groupID != groupID) + { + authLogger.debug("Auth failed: wrong group"); + callback(); + return; } //is validUntil still ok? - if(sessionInfo.validUntil <= now){ - callback(); - return; + if(sessionInfo.validUntil <= now) + { + authLogger.debug("Auth failed: validUntil"); + callback(); + return; } // There is a valid session @@ -234,7 +252,11 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //--> grant access statusObject = {accessStatus: "grant", authorID: sessionAuthor}; //--> deny access if user isn't allowed to create the pad - if(settings.editOnly) statusObject.accessStatus = "deny"; + if(settings.editOnly) + { + authLogger.debug("Auth failed: valid session & pad does not exist"); + statusObject.accessStatus = "deny"; + } } // there is no valid session avaiable AND pad exists else if(!validSession && padExists) @@ -266,6 +288,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) //- its not public else if(!isPublic) { + authLogger.debug("Auth failed: invalid session & pad is not public"); //--> deny access statusObject = {accessStatus: "deny"}; } @@ -277,6 +300,7 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) // there is no valid session avaiable AND pad doesn't exists else { + authLogger.debug("Auth failed: invalid session & pad does not exist"); //--> deny access statusObject = {accessStatus: "deny"}; } diff --git a/src/node/db/SessionManager.js b/src/node/db/SessionManager.js index 60e0a7ac..71315adc 100644 --- a/src/node/db/SessionManager.js +++ b/src/node/db/SessionManager.js @@ -21,7 +21,7 @@ var ERR = require("async-stacktrace"); var customError = require("../utils/customError"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("../utils/randomstring"); var db = require("./DB").db; var async = require("async"); var groupMangager = require("./GroupManager"); @@ -263,12 +263,16 @@ exports.deleteSession = function(sessionID, callback) db.remove("session:" + sessionID); //remove session from group2sessions - delete group2sessions.sessionIDs[sessionID]; - db.set("group2sessions:" + groupID, group2sessions); - + if(group2sessions != null) { // Maybe the group was already deleted + delete group2sessions.sessionIDs[sessionID]; + db.set("group2sessions:" + groupID, group2sessions); + } + //remove session from author2sessions - delete author2sessions.sessionIDs[sessionID]; - db.set("author2sessions:" + authorID, author2sessions); + if(author2sessions != null) { // Maybe the author was already deleted + delete author2sessions.sessionIDs[sessionID]; + db.set("author2sessions:" + authorID, author2sessions); + } callback(); } diff --git a/src/node/db/SessionStore.js b/src/node/db/SessionStore.js index 09ea7333..52a504f1 100644 --- a/src/node/db/SessionStore.js +++ b/src/node/db/SessionStore.js @@ -22,7 +22,7 @@ SessionStore.prototype.get = function(sid, fn){ { if (sess) { sess.cookie.expires = 'string' == typeof sess.cookie.expires ? new Date(sess.cookie.expires) : sess.cookie.expires; - if (!sess.cookie.expires || new Date() < expires) { + if (!sess.cookie.expires || new Date() < sess.cookie.expires) { fn(null, sess); } else { self.destroy(sid, fn); diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 4b7dd951..273a58a6 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -23,7 +23,7 @@ var ERR = require("async-stacktrace"); var fs = require("fs"); var api = require("../db/API"); var padManager = require("../db/PadManager"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("../utils/randomstring"); //ensure we have an apikey var apikey = null; @@ -31,7 +31,7 @@ try { apikey = fs.readFileSync("./APIKEY.txt","utf8"); } -catch(e) +catch(e) { apikey = randomString(32); fs.writeFileSync("./APIKEY.txt",apikey,"utf8"); @@ -180,7 +180,7 @@ var version = , "deleteGroup" : ["groupID"] , "listPads" : ["groupID"] , "listAllPads" : [] - , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createDiffHTML" : ["padID", "startRev", "endRev"] , "createPad" : ["padID", "text"] , "createGroupPad" : ["groupID", "padName", "text"] , "createAuthor" : ["name"] @@ -214,10 +214,141 @@ var version = , "getChatHistory" : ["padID", "start", "end"] , "getChatHead" : ["padID"] } +, "1.2.8": + { "createGroup" : [] + , "createGroupIfNotExistsFor" : ["groupMapper"] + , "deleteGroup" : ["groupID"] + , "listPads" : ["groupID"] + , "listAllPads" : [] + , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createPad" : ["padID", "text"] + , "createGroupPad" : ["groupID", "padName", "text"] + , "createAuthor" : ["name"] + , "createAuthorIfNotExistsFor": ["authorMapper" , "name"] + , "listPadsOfAuthor" : ["authorID"] + , "createSession" : ["groupID", "authorID", "validUntil"] + , "deleteSession" : ["sessionID"] + , "getSessionInfo" : ["sessionID"] + , "listSessionsOfGroup" : ["groupID"] + , "listSessionsOfAuthor" : ["authorID"] + , "getText" : ["padID", "rev"] + , "setText" : ["padID", "text"] + , "getHTML" : ["padID", "rev"] + , "setHTML" : ["padID", "html"] + , "getAttributePool" : ["padID"] + , "getRevisionsCount" : ["padID"] + , "getRevisionChangeset" : ["padID", "rev"] + , "getLastEdited" : ["padID"] + , "deletePad" : ["padID"] + , "getReadOnlyID" : ["padID"] + , "setPublicStatus" : ["padID", "publicStatus"] + , "getPublicStatus" : ["padID"] + , "setPassword" : ["padID", "password"] + , "isPasswordProtected" : ["padID"] + , "listAuthorsOfPad" : ["padID"] + , "padUsersCount" : ["padID"] + , "getAuthorName" : ["authorID"] + , "padUsers" : ["padID"] + , "sendClientsMessage" : ["padID", "msg"] + , "listAllGroups" : [] + , "checkToken" : [] + , "getChatHistory" : ["padID"] + , "getChatHistory" : ["padID", "start", "end"] + , "getChatHead" : ["padID"] + } +, "1.2.9": + { "createGroup" : [] + , "createGroupIfNotExistsFor" : ["groupMapper"] + , "deleteGroup" : ["groupID"] + , "listPads" : ["groupID"] + , "listAllPads" : [] + , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createPad" : ["padID", "text"] + , "createGroupPad" : ["groupID", "padName", "text"] + , "createAuthor" : ["name"] + , "createAuthorIfNotExistsFor": ["authorMapper" , "name"] + , "listPadsOfAuthor" : ["authorID"] + , "createSession" : ["groupID", "authorID", "validUntil"] + , "deleteSession" : ["sessionID"] + , "getSessionInfo" : ["sessionID"] + , "listSessionsOfGroup" : ["groupID"] + , "listSessionsOfAuthor" : ["authorID"] + , "getText" : ["padID", "rev"] + , "setText" : ["padID", "text"] + , "getHTML" : ["padID", "rev"] + , "setHTML" : ["padID", "html"] + , "getAttributePool" : ["padID"] + , "getRevisionsCount" : ["padID"] + , "getRevisionChangeset" : ["padID", "rev"] + , "getLastEdited" : ["padID"] + , "deletePad" : ["padID"] + , "copyPad" : ["sourceID", "destinationID", "force"] + , "movePad" : ["sourceID", "destinationID", "force"] + , "getReadOnlyID" : ["padID"] + , "setPublicStatus" : ["padID", "publicStatus"] + , "getPublicStatus" : ["padID"] + , "setPassword" : ["padID", "password"] + , "isPasswordProtected" : ["padID"] + , "listAuthorsOfPad" : ["padID"] + , "padUsersCount" : ["padID"] + , "getAuthorName" : ["authorID"] + , "padUsers" : ["padID"] + , "sendClientsMessage" : ["padID", "msg"] + , "listAllGroups" : [] + , "checkToken" : [] + , "getChatHistory" : ["padID"] + , "getChatHistory" : ["padID", "start", "end"] + , "getChatHead" : ["padID"] + } +, "1.2.10": + { "createGroup" : [] + , "createGroupIfNotExistsFor" : ["groupMapper"] + , "deleteGroup" : ["groupID"] + , "listPads" : ["groupID"] + , "listAllPads" : [] + , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createPad" : ["padID", "text"] + , "createGroupPad" : ["groupID", "padName", "text"] + , "createAuthor" : ["name"] + , "createAuthorIfNotExistsFor": ["authorMapper" , "name"] + , "listPadsOfAuthor" : ["authorID"] + , "createSession" : ["groupID", "authorID", "validUntil"] + , "deleteSession" : ["sessionID"] + , "getSessionInfo" : ["sessionID"] + , "listSessionsOfGroup" : ["groupID"] + , "listSessionsOfAuthor" : ["authorID"] + , "getText" : ["padID", "rev"] + , "setText" : ["padID", "text"] + , "getHTML" : ["padID", "rev"] + , "setHTML" : ["padID", "html"] + , "getAttributePool" : ["padID"] + , "getRevisionsCount" : ["padID"] + , "getRevisionChangeset" : ["padID", "rev"] + , "getLastEdited" : ["padID"] + , "deletePad" : ["padID"] + , "copyPad" : ["sourceID", "destinationID", "force"] + , "movePad" : ["sourceID", "destinationID", "force"] + , "getReadOnlyID" : ["padID"] + , "getPadID" : ["roID"] + , "setPublicStatus" : ["padID", "publicStatus"] + , "getPublicStatus" : ["padID"] + , "setPassword" : ["padID", "password"] + , "isPasswordProtected" : ["padID"] + , "listAuthorsOfPad" : ["padID"] + , "padUsersCount" : ["padID"] + , "getAuthorName" : ["authorID"] + , "padUsers" : ["padID"] + , "sendClientsMessage" : ["padID", "msg"] + , "listAllGroups" : [] + , "checkToken" : [] + , "getChatHistory" : ["padID"] + , "getChatHistory" : ["padID", "start", "end"] + , "getChatHead" : ["padID"] + } }; // set the latest available API version here -exports.latestApiVersion = '1.2.7'; +exports.latestApiVersion = '1.2.10'; // exports the versions so it can be used by the new Swagger endpoint exports.version = version; @@ -241,7 +372,7 @@ exports.handle = function(apiVersion, functionName, fields, req, res) break; } } - + //say goodbye if this is an unkown API version if(!isKnownApiVersion) { @@ -249,7 +380,7 @@ exports.handle = function(apiVersion, functionName, fields, req, res) res.send({code: 3, message: "no such api version", data: null}); return; } - + //check if this is a valid function name var isKnownFunctionname = false; for(var knownFunctionname in version[apiVersion]) @@ -260,17 +391,17 @@ exports.handle = function(apiVersion, functionName, fields, req, res) break; } } - + //say goodbye if this is a unkown function if(!isKnownFunctionname) { res.send({code: 3, message: "no such function", data: null}); return; } - + //check the api key! fields["apikey"] = fields["apikey"] || fields["api_key"]; - + if(fields["apikey"] != apikey.trim()) { res.send({code: 4, message: "no or wrong API Key", data: null}); @@ -304,21 +435,19 @@ exports.handle = function(apiVersion, functionName, fields, req, res) function callAPI(apiVersion, functionName, fields, req, res) { //put the function parameters in an array - var functionParams = []; - for(var i=0;i<version[apiVersion][functionName].length;i++) - { - functionParams.push(fields[ version[apiVersion][functionName][i] ]); - } - + var functionParams = version[apiVersion][functionName].map(function (field) { + return fields[field] + }) + //add a callback function to handle the response functionParams.push(function(err, data) - { + { // no error happend, everything is fine if(err == null) { if(!data) data = null; - + res.send({code: 0, message: "ok", data: data}); } // parameters were wrong and the api stopped execution, pass the error @@ -333,7 +462,7 @@ function callAPI(apiVersion, functionName, fields, req, res) ERR(err); } }); - + //call the api function - api[functionName](functionParams[0],functionParams[1],functionParams[2],functionParams[3],functionParams[4]); + api[functionName].apply(this, functionParams); } diff --git a/src/node/handler/ExportHandler.js b/src/node/handler/ExportHandler.js index 8ff5bc48..a748d3f2 100644 --- a/src/node/handler/ExportHandler.js +++ b/src/node/handler/ExportHandler.js @@ -27,6 +27,7 @@ var async = require("async"); var fs = require("fs"); var settings = require('../utils/Settings'); var os = require('os'); +var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); //load abiword only if its enabled if(settings.abiword != null) @@ -45,175 +46,186 @@ if(os.type().indexOf("Windows") > -1) */ exports.doExport = function(req, res, padId, type) { - //tell the browser that this is a downloadable file - res.attachment(padId + "." + type); + var fileName = padId; - //if this is a plain text export, we can do this directly - // We have to over engineer this because tabs are stored as attributes and not plain text + // allow fileName to be overwritten by a hook, the type type is kept static for security reasons + hooks.aCallFirst("exportFileName", padId, + function(err, hookFileName){ + // if fileName is set then set it to the padId, note that fileName is returned as an array. + if(hookFileName) fileName = hookFileName; - if(type == "txt") - { - var txt; - var randNum; - var srcFile, destFile; - async.series([ - //render the txt document - function(callback) + //tell the browser that this is a downloadable file + res.attachment(fileName + "." + type); + + //if this is a plain text export, we can do this directly + // We have to over engineer this because tabs are stored as attributes and not plain text + + if(type == "txt") { - exporttxt.getPadTXTDocument(padId, req.params.rev, false, function(err, _txt) - { - if(ERR(err, callback)) return; - txt = _txt; - callback(); - }); - }, - //decide what to do with the txt export - function(callback) - { - //if this is a txt export, we can send this from here directly - res.send(txt); - callback("stop"); - }, - //send the convert job to abiword - function(callback) - { - //ensure html can be collected by the garbage collector - txt = null; - - destFile = tempDirectory + "/eplite_export_" + randNum + "." + type; - abiword.convertFile(srcFile, destFile, type, callback); - }, - //send the file - function(callback) - { - res.sendfile(destFile, null, callback); - }, - //clean up temporary files - function(callback) - { - async.parallel([ + var txt; + var randNum; + var srcFile, destFile; + + async.series([ + //render the txt document function(callback) { - fs.unlink(srcFile, callback); + exporttxt.getPadTXTDocument(padId, req.params.rev, false, function(err, _txt) + { + if(ERR(err, callback)) return; + txt = _txt; + callback(); + }); }, + //decide what to do with the txt export function(callback) { - //100ms delay to accomidate for slow windows fs - if(os.type().indexOf("Windows") > -1) - { - setTimeout(function() + //if this is a txt export, we can send this from here directly + res.send(txt); + callback("stop"); + }, + //send the convert job to abiword + function(callback) + { + //ensure html can be collected by the garbage collector + txt = null; + + destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; + abiword.convertFile(srcFile, destFile, type, callback); + }, + //send the file + function(callback) + { + res.sendfile(destFile, null, callback); + }, + //clean up temporary files + function(callback) + { + async.parallel([ + function(callback) { - fs.unlink(destFile, callback); - }, 100); - } - else - { - fs.unlink(destFile, callback); - } + fs.unlink(srcFile, callback); + }, + function(callback) + { + //100ms delay to accomidate for slow windows fs + if(os.type().indexOf("Windows") > -1) + { + setTimeout(function() + { + fs.unlink(destFile, callback); + }, 100); + } + else + { + fs.unlink(destFile, callback); + } + } + ], callback); } - ], callback); + ], function(err) + { + if(err && err != "stop") ERR(err); + }) } - ], function(err) - { - if(err && err != "stop") ERR(err); - }) - } - else if(type == 'dokuwiki') - { - var randNum; - var srcFile, destFile; - - async.series([ - //render the dokuwiki document - function(callback) + else if(type == 'dokuwiki') { - exportdokuwiki.getPadDokuWikiDocument(padId, req.params.rev, function(err, dokuwiki) + var randNum; + var srcFile, destFile; + + async.series([ + //render the dokuwiki document + function(callback) + { + exportdokuwiki.getPadDokuWikiDocument(padId, req.params.rev, function(err, dokuwiki) + { + res.send(dokuwiki); + callback("stop"); + }); + }, + ], function(err) { - res.send(dokuwiki); - callback("stop"); + if(err && err != "stop") throw err; }); - }, - ], function(err) - { - if(err && err != "stop") throw err; - }); - } - else - { - var html; - var randNum; - var srcFile, destFile; - - async.series([ - //render the html document - function(callback) - { - exporthtml.getPadHTMLDocument(padId, req.params.rev, false, function(err, _html) - { - if(ERR(err, callback)) return; - html = _html; - callback(); - }); - }, - //decide what to do with the html export - function(callback) - { - //if this is a html export, we can send this from here directly - if(type == "html") - { - res.send(html); - callback("stop"); - } - else //write the html export to a file - { - randNum = Math.floor(Math.random()*0xFFFFFFFF); - srcFile = tempDirectory + "/eplite_export_" + randNum + ".html"; - fs.writeFile(srcFile, html, callback); - } - }, - //send the convert job to abiword - function(callback) - { - //ensure html can be collected by the garbage collector - html = null; - - destFile = tempDirectory + "/eplite_export_" + randNum + "." + type; - abiword.convertFile(srcFile, destFile, type, callback); - }, - //send the file - function(callback) - { - res.sendfile(destFile, null, callback); - }, - //clean up temporary files - function(callback) + } + else { - async.parallel([ + var html; + var randNum; + var srcFile, destFile; + + async.series([ + //render the html document function(callback) { - fs.unlink(srcFile, callback); + exporthtml.getPadHTMLDocument(padId, req.params.rev, false, function(err, _html) + { + if(ERR(err, callback)) return; + html = _html; + callback(); + }); }, + //decide what to do with the html export function(callback) { - //100ms delay to accomidate for slow windows fs - if(os.type().indexOf("Windows") > -1) + //if this is a html export, we can send this from here directly + if(type == "html") { - setTimeout(function() - { - fs.unlink(destFile, callback); - }, 100); + res.send(html); + callback("stop"); } - else + else //write the html export to a file { - fs.unlink(destFile, callback); + randNum = Math.floor(Math.random()*0xFFFFFFFF); + srcFile = tempDirectory + "/etherpad_export_" + randNum + ".html"; + fs.writeFile(srcFile, html, callback); } + }, + //send the convert job to abiword + function(callback) + { + //ensure html can be collected by the garbage collector + html = null; + + destFile = tempDirectory + "/etherpad_export_" + randNum + "." + type; + abiword.convertFile(srcFile, destFile, type, callback); + }, + //send the file + function(callback) + { + res.sendfile(destFile, null, callback); + }, + //clean up temporary files + function(callback) + { + async.parallel([ + function(callback) + { + fs.unlink(srcFile, callback); + }, + function(callback) + { + //100ms delay to accomidate for slow windows fs + if(os.type().indexOf("Windows") > -1) + { + setTimeout(function() + { + fs.unlink(destFile, callback); + }, 100); + } + else + { + fs.unlink(destFile, callback); + } + } + ], callback); } - ], callback); + ], function(err) + { + if(err && err != "stop") ERR(err); + }) } - ], function(err) - { - if(err && err != "stop") ERR(err); - }) - } + } + ); }; diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index ac856a60..60fa5ffb 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -28,7 +28,9 @@ var ERR = require("async-stacktrace") , settings = require('../utils/Settings') , formidable = require('formidable') , os = require("os") - , importHtml = require("../utils/ImportHtml"); + , importHtml = require("../utils/ImportHtml") + , log4js = require("log4js") + , hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); //load abiword only if its enabled if(settings.abiword != null) @@ -42,13 +44,18 @@ var tmpDirectory = process.env.TEMP || process.env.TMPDIR || process.env.TMP || */ exports.doImport = function(req, res, padId) { + var apiLogger = log4js.getLogger("ImportHandler"); + //pipe to a file //convert file to html via abiword //set html in the pad var srcFile, destFile , pad - , text; + , text + , importHandledByPlugin; + + var randNum = Math.floor(Math.random()*0xFFFFFFFF); async.series([ //save the uploaded file to /tmp @@ -60,7 +67,7 @@ exports.doImport = function(req, res, padId) form.parse(req, function(err, fields, files) { //the upload failed, stop at this point if(err || files.file === undefined) { - console.warn("Uploading Error: " + err.stack); + if(err) console.warn("Uploading Error: " + err.stack); callback("uploadFailed"); } //everything ok, continue @@ -87,32 +94,71 @@ exports.doImport = function(req, res, padId) else { var oldSrcFile = srcFile; srcFile = path.join(path.dirname(srcFile),path.basename(srcFile, fileEnding)+".txt"); - fs.rename(oldSrcFile, srcFile, callback); } }, - + function(callback){ + destFile = path.join(tmpDirectory, "etherpad_import_" + randNum + ".htm"); + + // Logic for allowing external Import Plugins + hooks.aCallAll("import", {srcFile: srcFile, destFile: destFile}, function(err, result){ + if(ERR(err, callback)) return callback(); + if(result.length > 0){ // This feels hacky and wrong.. + importHandledByPlugin = true; + callback(); + }else{ + callback(); + } + }); + }, //convert file to html function(callback) { - var randNum = Math.floor(Math.random()*0xFFFFFFFF); - destFile = path.join(tmpDirectory, "eplite_import_" + randNum + ".htm"); - - if (abiword) { - abiword.convertFile(srcFile, destFile, "htm", function(err) { - //catch convert errors - if(err) { - console.warn("Converting Error:", err); - return callback("convertFailed"); - } else { + if(!importHandledByPlugin){ + var fileEnding = path.extname(srcFile).toLowerCase(); + var fileIsHTML = (fileEnding === ".html" || fileEnding === ".htm"); + if (abiword && !fileIsHTML) { + abiword.convertFile(srcFile, destFile, "htm", function(err) { + //catch convert errors + if(err) { + console.warn("Converting Error:", err); + return callback("convertFailed"); + } else { + callback(); + } + }); + } else { + // if no abiword only rename + fs.rename(srcFile, destFile, callback); + } + }else{ + callback(); + } + }, + + function(callback) { + if (!abiword) { + // Read the file with no encoding for raw buffer access. + fs.readFile(destFile, function(err, buf) { + if (err) throw err; + var isAscii = true; + // Check if there are only ascii chars in the uploaded file + for (var i=0, len=buf.length; i<len; i++) { + if (buf[i] > 240) { + isAscii=false; + break; + } + } + if (isAscii) { callback(); + } else { + callback("uploadFailed"); } }); } else { - // if no abiword only rename - fs.rename(srcFile, destFile, callback); + callback(); } }, - + //get the pad object function(callback) { padManager.getPad(padId, function(err, _pad){ @@ -127,7 +173,10 @@ exports.doImport = function(req, res, padId) fs.readFile(destFile, "utf8", function(err, _text){ if(ERR(err, callback)) return; text = _text; - + // Title needs to be stripped out else it appends it to the pad.. + text = text.replace("<title>", "<!-- <title>"); + text = text.replace("</title>","</title>-->"); + //node on windows has a delay on releasing of the file lock. //We add a 100ms delay to work around this if(os.type().indexOf("Windows") > -1){ @@ -142,7 +191,11 @@ exports.doImport = function(req, res, padId) function(callback) { var fileEnding = path.extname(srcFile).toLowerCase(); if (abiword || fileEnding == ".htm" || fileEnding == ".html") { - importHtml.setPadHTML(pad, text); + try{ + importHtml.setPadHTML(pad, text); + }catch(e){ + apiLogger.warn("Error importing, possibly caused by malformed HTML"); + } } else { pad.setText(text); } @@ -176,7 +229,7 @@ exports.doImport = function(req, res, padId) ERR(err); //close the connection - res.send("<head><script type='text/javascript' src='../../static/js/jquery.js'></script></head><script>$(window).load(function(){if ( (!$.browser.msie) && (!($.browser.mozilla && $.browser.version.indexOf(\"1.8.\") == 0)) ){document.domain = document.domain;}var impexp = window.parent.padimpexp.handleFrameCall('" + status + "');})</script>", 200); + res.send("<head><script type='text/javascript' src='../../static/js/jquery.js'></script><script type='text/javascript' src='../../static/js/jquery_browser.js'></script></head><script>$(window).load(function(){if ( (!$.browser.msie) && (!($.browser.mozilla && $.browser.version.indexOf(\"1.8.\") == 0)) ){document.domain = document.domain;}var impexp = window.parent.padimpexp.handleFrameCall('" + status + "');})</script>", 200); }); } diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 35f1ab4c..26eb17a6 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1,6 +1,6 @@ /** - * The MessageHandler handles all Messages that comes from Socket.IO and controls the sessions - */ + * The MessageHandler handles all Messages that comes from Socket.IO and controls the sessions + */ /* * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka (Primary Technology Ltd) @@ -35,6 +35,8 @@ 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"); +var stats = require('../stats'); /** * A associative array that saves informations about a session @@ -47,6 +49,17 @@ var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); * author = the author name of this session */ var sessioninfos = {}; +exports.sessioninfos = sessioninfos; + +// Measure total amount of users +stats.gauge('totalUsers', function() { + return Object.keys(socketio.sockets.sockets).length +}) + +/** + * 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 @@ -67,7 +80,9 @@ exports.setSocketIO = function(socket_io) * @param client the new client */ exports.handleConnect = function(client) -{ +{ + stats.meter('connects').mark(); + //Initalize sessioninfos for this new session sessioninfos[client.id]={}; } @@ -91,18 +106,29 @@ exports.kickSessionsFromPad = function(padID) * @param client the client that leaves */ exports.handleDisconnect = function(client) -{ +{ + stats.meter('disconnects').mark(); + //save the padname of this session var session = sessioninfos[client.id]; - + //if this connection was already etablished with a handshake, send a disconnect message to the others if(session && session.author) { + client.get('remoteAddress', function(er, ip) { + //Anonymize the IP address if IP logging is disabled + if(settings.disableIPlogging) { + ip = 'ANONYMOUS'; + } + + accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad') + }) + //get the author color out of the db authorManager.getAuthorColorId(session.author, function(err, color) { ERR(err); - + //prepare the notification for the other users on the pad, that this user left var messageToTheOtherUsers = { "type": "COLLABROOM", @@ -116,18 +142,14 @@ exports.handleDisconnect = function(client) } } }; - + //Go trough all user that are still on the pad, and send them the USER_LEAVE message client.broadcast.to(session.padId).json.send(messageToTheOtherUsers); - }); + }); } - - client.get('remoteAddress', function(er, ip) { - accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad') - }) - + //Delete the sessioninfos entrys of this session - delete sessioninfos[client.id]; + delete sessioninfos[client.id]; } /** @@ -136,33 +158,33 @@ exports.handleDisconnect = function(client) * @param message the message from the client */ exports.handleMessage = function(client, message) -{ - +{ if(message == null) { - messageLogger.warn("Message is null!"); return; } if(!message.type) { - messageLogger.warn("Message has no type attribute!"); + return; + } + var thisSession = sessioninfos[client.id] + if(!thisSession) { + messageLogger.warn("Dropped message from an unknown connection.") return; } var handleMessageHook = function(callback){ var dropMessage = false; - - // Call handleMessage hook. If a plugin returns null, the message will be dropped. Note that for all messages + // Call handleMessage hook. If a plugin returns null, the message will be dropped. Note that for all messages // handleMessage will be called, even if the client is not authorized hooks.aCallAll("handleMessage", { client: client, message: message }, function ( err, messages ) { if(ERR(err, callback)) return; - _.each(messages, function(newMessage){ if ( newMessage === null ) { dropMessage = true; } }); - + // If no plugins explicitly told us to drop the message, its ok to proceed if(!dropMessage){ callback() }; }); @@ -175,10 +197,11 @@ exports.handleMessage = function(client, message) } else if(message.type == "CHANGESET_REQ") { handleChangesetRequest(client, message); } else if(message.type == "COLLABROOM") { - if (sessioninfos[client.id].readonly) { + if (thisSession.readonly) { messageLogger.warn("Dropped message, COLLABROOM for readonly pad"); } else if (message.data.type == "USER_CHANGES") { - handleUserChanges(client, message); + stats.counter('pendingEdits').inc() + 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") { @@ -205,31 +228,61 @@ exports.handleMessage = function(client, message) //check permissions function(callback) { - - // If the message has a padId we assume the client is already known to the server and needs no re-authorization - if(!message.padId) - return callback(); + // client tried to auth for the first time (first msg from the client) + if(message.type == "CLIENT_READY") { + // Remember this information since we won't + // have the cookie in further socket.io messages. + // This information will be used to check if + // the sessionId of this connection is still valid + // since it could have been deleted by the API. + sessioninfos[client.id].auth = + { + sessionID: message.sessionID, + padID: message.padId, + token : message.token, + password: message.password + }; + } // Note: message.sessionID is an entirely different kind of - // session from the sessions we use here! Beware! FIXME: Call - // our "sessions" "connections". + // session from the sessions we use here! Beware! + // FIXME: Call our "sessions" "connections". // FIXME: Use a hook instead // FIXME: Allow to override readwrite access with readonly - securityManager.checkAccess(message.padId, message.sessionID, message.token, message.password, function(err, statusObject) - { - 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 + // 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; + var checkAccessCallback = function(err, statusObject) { - 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}) + } + }; + //check if pad is requested via readOnly + if (auth.padID.indexOf("r.") === 0) { + //Pad is readOnly, first get the real Pad ID + readOnlyManager.getPadId(auth.padID, function(err, value) { + ERR(err); + securityManager.checkAccess(value, auth.sessionID, auth.token, auth.password, checkAccessCallback); + }); + } else { + securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, checkAccessCallback); } - }); + } }, finalHandler ]); @@ -245,16 +298,35 @@ exports.handleMessage = function(client, message) function handleSaveRevisionMessage(client, message){ var padId = sessioninfos[client.id].padId; var userId = sessioninfos[client.id].author; - + padManager.getPad(padId, function(err, pad) { if(ERR(err)) return; - + pad.addSavedRevision(pad.head, userId); }); } /** + * Handles a custom message, different to the function below as it handles objects not strings and you can + * direct the message to specific sessionID + * + * @param msg {Object} the message we're sending + * @param sessionID {string} the socketIO session to which we're sending this message + */ +exports.handleCustomObjectMessage = function (msg, sessionID, cb) { + if(msg.data.type === "CUSTOM"){ + if(sessionID){ // If a sessionID is targeted then send directly to this sessionID + socketio.sockets.socket(sessionID).json.send(msg); // send a targeted message + }else{ + socketio.sockets.in(msg.data.payload.padId).json.send(msg); // broadcast to all clients on this pad + } + } + cb(null, {}); +} + + +/** * Handles a custom message (sent via HTTP API request) * * @param padID {Pad} the pad to which we're sending this message @@ -285,10 +357,10 @@ function handleChatMessage(client, message) var userId = sessioninfos[client.id].author; var text = message.data.text; var padId = sessioninfos[client.id].padId; - + var pad; var userName; - + async.series([ //get the pad function(callback) @@ -314,7 +386,7 @@ function handleChatMessage(client, message) { //save the chat message pad.appendChatMessage(text, userId, time); - + var msg = { type: "COLLABROOM", data: { @@ -325,10 +397,10 @@ function handleChatMessage(client, message) text: text } }; - + //broadcast the chat message to everyone on the pad socketio.sockets.in(padId).json.send(msg); - + callback(); } ], function(err) @@ -354,20 +426,20 @@ function handleGetChatMessages(client, message) messageLogger.warn("Dropped message, GetChatMessages Message has no start!"); return; } - + var start = message.data.start; var end = message.data.end; var count = start - count; - + if(count < 0 && count > 100) { messageLogger.warn("Dropped message, GetChatMessages Message, client requested invalid amout of messages!"); return; } - + var padId = sessioninfos[client.id].padId; var pad; - + async.series([ //get the pad function(callback) @@ -384,7 +456,7 @@ function handleGetChatMessages(client, message) pad.getChatMessages(start, end, function(err, chatMessages) { if(ERR(err, callback)) return; - + var infoMsg = { type: "COLLABROOM", data: { @@ -392,7 +464,7 @@ function handleGetChatMessages(client, message) messages: chatMessages } }; - + // send the messages back to the client client.json.send(infoMsg); }); @@ -417,10 +489,10 @@ function handleSuggestUserName(client, message) messageLogger.warn("Dropped message, suggestUserName Message has no unnamedId!"); return; } - + var padId = sessioninfos[client.id].padId, clients = socketio.sockets.clients(padId); - + //search the author and send him this message for(var i = 0; i < clients.length; i++) { var session = sessioninfos[clients[i].id]; @@ -449,14 +521,14 @@ function handleUserInfoUpdate(client, message) messageLogger.warn("Dropped message, USERINFO_UPDATE Message has no colorId!"); return; } - + //Find out the author name of this session var author = sessioninfos[client.id].author; - + //Tell the authorManager about the new attributes authorManager.setAuthorColorId(author, message.data.userInfo.colorId); authorManager.setAuthorName(author, message.data.userInfo.name); - + var padId = sessioninfos[client.id].padId; var infoMsg = { @@ -474,7 +546,7 @@ function handleUserInfoUpdate(client, message) } } }; - + //Send the other clients on the pad the update message client.broadcast.to(padId).json.send(infoMsg); } @@ -493,25 +565,39 @@ 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 + + // This one's no longer pending, as we're gonna process it now + stats.counter('pendingEdits').dec() + // 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(); } - + //TODO: this might happen with other messages too => find one place to copy the session + //and always use the copy. atm a message will be ignored if the session is gone even + //if the session was valid when the message arrived in the first place + if(!sessioninfos[client.id]) + { + messageLogger.warn("Dropped message, disconnect happened in the mean time"); + return cb(); + } + //get all Vars we need var baseRev = message.data.baseRev; var wireApool = (new AttributePool()).fromJsonable(message.data.apool); @@ -519,9 +605,12 @@ function handleUserChanges(client, message) // The client might disconnect between our callbacks. We should still // finish processing the changeset, so keep a reference to the session. var thisSession = sessioninfos[client.id]; - + var r, apool, pad; - + + // Measure time to process edit + var stopWatch = stats.timer('edits').start(); + async.series([ //get the pad function(callback) @@ -537,7 +626,7 @@ function handleUserChanges(client, message) function(callback) { //ex. _checkChangesetAndPool - + try { // Verify that the changeset has valid syntax and is in canonical form @@ -547,28 +636,37 @@ function handleUserChanges(client, message) // defined in the accompanying attribute pool. Changeset.eachAttribNumber(changeset, function(n) { if (! wireApool.getAttrib(n)) { - throw "Attribute pool is missing attribute "+n+" for changeset "+changeset; + throw new Error("Attribute pool is missing attribute "+n+" for changeset "+changeset); } }); - // Validate all 'author' attribs to be the same value as the current user - wireApool.eachAttrib(function(type, value) { - if('author' == type && value != thisSession.author) throw "Trying to submit changes as another author" - }) + // Validate all added 'author' attribs to be the same value as the current user + var iterator = Changeset.opIterator(Changeset.unpack(changeset).ops) + , op + while(iterator.hasNext()) { + op = iterator.next() + if(op.opcode != '+') continue; + op.attribs.split('*').forEach(function(attr) { + if(!attr) return + attr = wireApool.getAttrib(attr) + if(!attr) return + if('author' == attr[0] && attr[1] != thisSession.author) throw new Error("Trying to submit changes as another author in changeset "+changeset); + }) + } + + //ex. adoptChangesetAttribs + + //Afaik, it copies the new attributes from the changeset, to the global Attribute Pool + changeset = Changeset.moveOpsToNewPool(changeset, wireApool, pad.pool); } catch(e) { // There is an error in this changeset, so just refuse it - console.warn("Can't apply USER_CHANGES "+changeset+", because: "+e); client.json.send({disconnect:"badChangeset"}); - return; + stats.meter('failedChangesets').mark(); + return callback(new Error("Can't apply USER_CHANGES, because "+e.message)); } - - //ex. adoptChangesetAttribs - - //Afaik, it copies the new attributes from the changeset, to the global Attribute Pool - changeset = Changeset.moveOpsToNewPool(changeset, wireApool, pad.pool); - + //ex. applyUserChanges apool = pad.pool; r = baseRev; @@ -582,7 +680,7 @@ function handleUserChanges(client, message) function(callback) { r++; - + pad.getRevisionChangeset(r, function(err, c) { if(ERR(err, callback)) return; @@ -595,9 +693,9 @@ function handleUserChanges(client, message) { changeset = Changeset.follow(c, changeset, false, apool); }catch(e){ - console.warn("Can't apply USER_CHANGES "+changeset+", possibly because of mismatched follow error"); client.json.send({disconnect:"badChangeset"}); - return; + stats.meter('failedChangesets').mark(); + return callback(new Error("Can't apply USER_CHANGES, because "+e.message)); } if ((r - baseRev) % 200 == 0) { // don't let the stack get too deep @@ -615,17 +713,16 @@ function handleUserChanges(client, message) function (callback) { var prevText = pad.text(); - - if (Changeset.oldLen(changeset) != prevText.length) + + if (Changeset.oldLen(changeset) != prevText.length) { - console.warn("Can't apply USER_CHANGES "+changeset+" with oldLen " + Changeset.oldLen(changeset) + " to document of length " + prevText.length); client.json.send({disconnect:"badChangeset"}); - callback(); - return; + stats.meter('failedChangesets').mark(); + return callback(new Error("Can't apply USER_CHANGES "+changeset+" with oldLen " + Changeset.oldLen(changeset) + " to document of length " + prevText.length)); } - + pad.appendRevision(changeset, thisSession.author); - + var correctionChangeset = _correctMarkersInPad(pad.atext, pad.pool); if (correctionChangeset) { pad.appendRevision(correctionChangeset); @@ -636,26 +733,31 @@ function handleUserChanges(client, message) var nlChangeset = Changeset.makeSplice(pad.text(), pad.text().length-1, 0, "\n"); pad.appendRevision(nlChangeset); } - - exports.updatePadClients(pad, callback); + + exports.updatePadClients(pad, function(er) { + ERR(er) + }); + callback(); } ], function(err) { - ERR(err); + stopWatch.end() + cb(); + if(err) console.warn(err.stack || err) }); } exports.updatePadClients = function(pad, callback) -{ +{ //skip this step if noone is on this pad var roomClients = socketio.sockets.clients(pad.id); if(roomClients.length==0) return callback(); - + // since all clients usually get the same set of changesets, store them in local cache // to remove unnecessary roundtrip to the datalayer // TODO: in REAL world, if we're working without datalayer cache, all requests to revisions will be fired - // BEFORE first result will be landed to our cache object. The solution is to replace parallel processing + // BEFORE first result will be landed to our cache object. The solution is to replace parallel processing // via async.forEach with sequential for() loop. There is no real benefits of running this in parallel, // but benefit of reusing cached revision object is HUGE var revCache = {}; @@ -670,7 +772,7 @@ exports.updatePadClients = function(pad, callback) async.whilst( function (){ return sessioninfos[sid] && sessioninfos[sid].rev < pad.getHeadRevisionNumber()}, function(callback) - { + { var r = sessioninfos[sid].rev + 1; async.waterfall([ @@ -679,7 +781,7 @@ exports.updatePadClients = function(pad, callback) callback(null, revCache[r]); else pad.getRevision(r, callback); - }, + }, function(revision, callback) { revCache[r] = revision; @@ -707,8 +809,8 @@ exports.updatePadClients = function(pad, callback) author: author, currentTime: currentTime, timeDelta: currentTime - sessioninfos[sid].time - }}; - + }}; + client.json.send(wireMsg); } @@ -721,11 +823,11 @@ exports.updatePadClients = function(pad, callback) }, callback ); - },callback); + },callback); } /** - * Copied from the Etherpad Source Code. Don't know what this methode does excatly... + * Copied from the Etherpad Source Code. Don't know what this method does excatly... */ function _correctMarkersInPad(atext, apool) { var text = atext.text; @@ -737,11 +839,11 @@ function _correctMarkersInPad(atext, apool) { var offset = 0; while (iter.hasNext()) { var op = iter.next(); - + var hasMarker = _.find(AttributeManager.lineAttributes, function(attribute){ return Changeset.opAttributeValue(op, attribute, apool); }) !== undefined; - + if (hasMarker) { for(var i=0;i<op.chars;i++) { if (offset > 0 && text.charAt(offset-1) != '\n') { @@ -771,7 +873,7 @@ function _correctMarkersInPad(atext, apool) { } /** - * Handles a CLIENT_READY. A CLIENT_READY is the first message from the client to the server. The Client sends his token + * Handles a CLIENT_READY. A CLIENT_READY is the first message from the client to the server. The Client sends his token * and the pad it wants to enter. The Server answers with the inital values (clientVars) of the pad * @param client the client that send this message * @param message the message from the client @@ -829,7 +931,7 @@ function handleClientReady(client, message) securityManager.checkAccess (padIds.padId, message.sessionID, message.token, message.password, function(err, statusObject) { if(ERR(err, callback)) return; - + //access was granted if(statusObject.accessStatus == "grant") { @@ -842,7 +944,7 @@ function handleClientReady(client, message) client.json.send({accessStatus: statusObject.accessStatus}) } }); - }, + }, //get all authordata of this new user, and load the pad-object from the database function(callback) { @@ -874,7 +976,7 @@ function handleClientReady(client, message) function(callback) { var authors = pad.getAllAuthors(); - + async.parallel([ //get timestamp of latest revission needed for timeslider function(callback) @@ -894,14 +996,13 @@ function handleClientReady(client, message) authorManager.getAuthor(authorId, function(err, author) { if(ERR(err, callback)) return; - delete author.timestamp; - historicalAuthorData[authorId] = author; + historicalAuthorData[authorId] = {name: author.name, colorId: author.colorId}; // Filter author attribs (e.g. don't send author's pads to all clients) callback(); }); }, callback); } ], callback); - + }, //glue the clientVars together, send them and tell the other clients that a new one is there function(callback) @@ -921,14 +1022,19 @@ function handleClientReady(client, message) roomClients[i].json.send({disconnect:"userdup"}); } } - + //Save in sessioninfos that this session belonges to this pad sessioninfos[client.id].padId = padIds.padId; sessioninfos[client.id].readOnlyPadId = padIds.readOnlyPadId; sessioninfos[client.id].readonly = padIds.readonly; - + //Log creation/(re-)entering of a pad client.get('remoteAddress', function(er, ip) { + //Anonymize the IP address if IP logging is disabled + if(settings.disableIPlogging) { + ip = 'ANONYMOUS'; + } + if(pad.head > 0) { accessLogger.info('[ENTER] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" entered the pad'); } @@ -948,12 +1054,18 @@ function handleClientReady(client, message) //This is a normal first connect else { - //prepare all values for the wire - var atext = Changeset.cloneAText(pad.atext); - var attribsForWire = Changeset.prepareForWire(atext.attribs, pad.pool); - var apool = attribsForWire.pool.toJsonable(); - atext.attribs = attribsForWire.translated; - + //prepare all values for the wire, there'S a chance that this throws, if the pad is corrupted + try { + var atext = Changeset.cloneAText(pad.atext); + var attribsForWire = Changeset.prepareForWire(atext.attribs, pad.pool); + var apool = attribsForWire.pool.toJsonable(); + atext.attribs = attribsForWire.translated; + }catch(e) { + console.error(e.stack || e) + client.json.send({disconnect:"corruptPad"});// pull the breaks + return callback(); + } + // Warning: never ever send padIds.padId to the client. If the // client is read only you would open a security hole 1 swedish // mile wide... @@ -973,7 +1085,6 @@ function handleClientReady(client, message) "historicalAuthorData": historicalAuthorData, "apool": apool, "rev": pad.getHeadRevisionNumber(), - "globalPadId": message.padId, "time": currentTime, }, "colorPalette": authorManager.getColorPalette(), @@ -983,16 +1094,15 @@ function handleClientReady(client, message) "padId": message.padId, "initialTitle": "Pad: " + message.padId, "opts": {}, - // tell the client the number of the latest chat-message, which will be + // tell the client the number of the latest chat-message, which will be // used to request the latest 100 chat-messages later (GET_CHAT_MESSAGES) "chatHead": pad.chatHead, "numConnectedUsers": roomClients.length, "readOnlyId": padIds.readOnlyPadId, "readonly": padIds.readonly, "serverTimestamp": new Date().getTime(), - "globalPadId": message.padId, "userId": author, - "abiwordAvailable": settings.abiwordAvailable(), + "abiwordAvailable": settings.abiwordAvailable(), "plugins": { "plugins": plugins.plugins, "parts": plugins.parts, @@ -1005,18 +1115,18 @@ function handleClientReady(client, message) { clientVars.userName = authorName; } - + //call the clientVars-hook so plugins can modify them before they get sent to the client hooks.aCallAll("clientVars", { clientVars: clientVars, pad: pad }, function ( err, messages ) { if(ERR(err, callback)) return; - + _.each(messages, function(newVars) { //combine our old object with the new attributes from the hook for(var attr in newVars) { clientVars[attr] = newVars[attr]; } }); - + //Join the pad and start receiving updates client.join(padIds.padId); //Send the clientVars to the Client @@ -1025,9 +1135,9 @@ function handleClientReady(client, message) sessioninfos[client.id].rev = pad.getHeadRevisionNumber(); }); } - + sessioninfos[client.id].author = author; - + //prepare the notification for the other users on the pad, that this user joined var messageToTheOtherUsers = { "type": "COLLABROOM", @@ -1041,7 +1151,7 @@ function handleClientReady(client, message) } } }; - + //Add the authorname of this new User, if avaiable if(authorName != null) { @@ -1050,7 +1160,7 @@ function handleClientReady(client, message) // notify all existing users about new user client.broadcast.to(padIds.padId).json.send(messageToTheOtherUsers); - + //Run trough all sessions of this pad async.forEach(socketio.sockets.clients(padIds.padId), function(roomClient, callback) { @@ -1059,9 +1169,9 @@ function handleClientReady(client, message) //Jump over, if this session is the connection session if(roomClient.id == client.id) return callback(); - - - //Since sessioninfos might change while being enumerated, check if the + + + //Since sessioninfos might change while being enumerated, check if the //sessionID is still assigned to a valid session if(sessioninfos[roomClient.id] !== undefined) author = sessioninfos[roomClient.id].author; @@ -1077,7 +1187,7 @@ function handleClientReady(client, message) callback(null, historicalAuthorData[author]); else authorManager.getAuthor(author, callback); - }, + }, function (authorInfo, callback) { //Send the new User a Notification about this other user @@ -1106,7 +1216,7 @@ function handleClientReady(client, message) } /** - * Handles a request for a rough changeset, the timeslider client needs it + * Handles a request for a rough changeset, the timeslider client needs it */ function handleChangesetRequest(client, message) { @@ -1136,7 +1246,7 @@ function handleChangesetRequest(client, message) messageLogger.warn("Dropped message, changeset request has no requestID!"); return; } - + var granularity = message.data.granularity; var start = message.data.start; var end = start + (100 * granularity); @@ -1154,7 +1264,7 @@ function handleChangesetRequest(client, message) //build the requested rough changesets and send them back getChangesetInfo(padIds.padId, start, end, granularity, function(err, changesetInfo) { - ERR(err); + if(err) return console.error('Error while handling a changeset request for '+padIds.padId, err, message.data); var data = changesetInfo; data.requestID = message.data.requestID; @@ -1180,47 +1290,49 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) var composedChangesets = {}; var revisionDate = []; var lines; - + var head_revision = 0; + async.series([ //get the pad from the database function(callback) { padManager.getPad(padId, function(err, _pad) - { + { if(ERR(err, callback)) return; pad = _pad; + head_revision = pad.getHeadRevisionNumber(); callback(); }); }, function(callback) - { + { //calculate the last full endnum var lastRev = pad.getHeadRevisionNumber(); if (endNum > lastRev+1) { endNum = lastRev+1; } endNum = Math.floor(endNum / granularity)*granularity; - + var compositesChangesetNeeded = []; var revTimesNeeded = []; - + //figure out which composite Changeset and revTimes we need, to load them in bulk var compositeStart = startNum; - while (compositeStart < endNum) + while (compositeStart < endNum) { var compositeEnd = compositeStart + granularity; - + //add the composite Changeset we needed compositesChangesetNeeded.push({start: compositeStart, end: compositeEnd}); - + //add the t1 time we need revTimesNeeded.push(compositeStart == 0 ? 0 : compositeStart - 1); //add the t2 time we need revTimesNeeded.push(compositeEnd - 1); - + compositeStart += granularity; } - + //get all needed db values parallel async.parallel([ function(callback) @@ -1257,58 +1369,57 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) if(ERR(err, callback)) return; lines = _lines; callback(); - }); + }); } ], callback); }, //doesn't know what happens here excatly :/ function(callback) - { + { var compositeStart = startNum; - - while (compositeStart < endNum) + + while (compositeStart < endNum) { - if (compositeStart + granularity > endNum) + var compositeEnd = compositeStart + granularity; + if (compositeEnd > endNum || compositeEnd > head_revision+1) { break; } - - var compositeEnd = compositeStart + granularity; - + var forwards = composedChangesets[compositeStart + "/" + compositeEnd]; var backwards = Changeset.inverse(forwards, lines.textlines, lines.alines, pad.apool()); - + Changeset.mutateAttributionLines(forwards, lines.alines, pad.apool()); Changeset.mutateTextLines(forwards, lines.textlines); - + var forwards2 = Changeset.moveOpsToNewPool(forwards, pad.apool(), apool); var backwards2 = Changeset.moveOpsToNewPool(backwards, pad.apool(), apool); - + var t1, t2; - if (compositeStart == 0) + if (compositeStart == 0) { t1 = revisionDate[0]; } - else + else { t1 = revisionDate[compositeStart - 1]; } - + t2 = revisionDate[compositeEnd - 1]; - + timeDeltas.push(t2 - t1); forwardsChangesets.push(forwards2); backwardsChangesets.push(backwards2); - + compositeStart += granularity; } - + callback(); } ], function(err) { if(ERR(err, callback)) return; - + callback(null, {forwardsChangesets: forwardsChangesets, backwardsChangesets: backwardsChangesets, apool: apool.toJsonable(), @@ -1323,7 +1434,7 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) * Tries to rebuild the getPadLines function of the original Etherpad * https://github.com/ether/pad/blob/master/etherpad/src/etherpad/control/pad/pad_changeset_control.js#L263 */ -function getPadLines(padId, revNum, callback) +function getPadLines(padId, revNum, callback) { var atext; var result = {}; @@ -1334,7 +1445,7 @@ function getPadLines(padId, revNum, callback) function(callback) { padManager.getPad(padId, function(err, _pad) - { + { if(ERR(err, callback)) return; pad = _pad; callback(); @@ -1378,7 +1489,7 @@ function getPadLines(padId, revNum, callback) function composePadChangesets(padId, startNum, endNum, callback) { var pad; - var changesets = []; + var changesets = {}; var changeset; async.series([ @@ -1396,14 +1507,19 @@ function composePadChangesets(padId, startNum, endNum, callback) function(callback) { var changesetsNeeded=[]; - - //create a array for all changesets, we will + + var headNum = pad.getHeadRevisionNumber(); + if (endNum > headNum+1) + endNum = headNum+1; + if (startNum < 0) + startNum = 0; + //create a array for all changesets, we will //replace the values with the changeset later for(var r=startNum;r<endNum;r++) { changesetsNeeded.push(r); } - + //get all changesets async.forEach(changesetsNeeded, function(revNum,callback) { @@ -1420,13 +1536,13 @@ function composePadChangesets(padId, startNum, endNum, callback) { changeset = changesets[startNum]; var pool = pad.apool(); - + for(var r=startNum+1;r<endNum;r++) { var cs = changesets[r]; changeset = Changeset.compose(changeset, cs, pool); } - + callback(null); } ], @@ -1461,7 +1577,10 @@ exports.padUsers = function (padID, callback) { author.id = s.author; result.push(author); + callback(); }); + } else { + callback(); } }, function(err) { if(ERR(err, callback)) return; @@ -1469,3 +1588,5 @@ exports.padUsers = function (padID, callback) { callback(null, {padUsers: result}); }); } + +exports.sessioninfos = sessioninfos; diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 483bb1d1..b3e046d2 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -23,6 +23,8 @@ var ERR = require("async-stacktrace"); var log4js = require('log4js'); var messageLogger = log4js.getLogger("message"); var securityManager = require("../db/SecurityManager"); +var readOnlyManager = require("../db/ReadOnlyManager"); +var settings = require('../utils/Settings'); /** * Saves all components @@ -48,88 +50,68 @@ 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) { - client.set('remoteAddress', client.handshake.address.address); + if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){ + client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); + } + else{ + client.set('remoteAddress', client.handshake.address.address); + } 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) - { + if(clientAuthorized) { + handleMessage(client, message); + } else { //try to authorize the client + if(message.padId !== undefined && message.sessionID !== undefined && message.token !== undefined && message.password !== undefined) { + var checkAccessCallback = function(err, statusObject) { ERR(err); - + //access was granted, mark the client as authorized and handle the message - if(statusObject.accessStatus == "grant") - { + if(statusObject.accessStatus == "grant") { clientAuthorized = true; - handleMessage(message); + handleMessage(client, message); } //no access, send the client a message that tell him why - else - { + else { messageLogger.warn("Authentication try failed:" + stringifyWithoutPassword(message)); client.json.send({accessStatus: statusObject.accessStatus}); } - }); - } - //drop message - else - { + }; + if (message.padId.indexOf("r.") === 0) { + readOnlyManager.getPadId(message.padId, function(err, value) { + ERR(err); + securityManager.checkAccess (value, message.sessionID, message.token, message.password, checkAccessCallback); + }); + } else { + //this message has everything to try an authorization + securityManager.checkAccess (message.padId, message.sessionID, message.token, message.password, checkAccessCallback); + } + } else { //drop message messageLogger.warn("Dropped message cause of bad permissions:" + stringifyWithoutPassword(message)); } } @@ -146,6 +128,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/node/hooks/express.js b/src/node/hooks/express.js index 61d9ae89..c6573c80 100644 --- a/src/node/hooks/express.js +++ b/src/node/hooks/express.js @@ -19,7 +19,7 @@ exports.createServer = function () { var refPath = rootPath + "/.git/" + ref.substring(5, ref.indexOf("\n")); version = fs.readFileSync(refPath, "utf-8"); version = version.substring(0, 7); - console.log("Your Etherpad Lite git version is " + version); + console.log("Your Etherpad git version is " + version); } catch(e) { @@ -31,7 +31,7 @@ exports.createServer = function () { exports.restartServer(); - console.log("You can access your Etherpad-Lite instance at http://" + settings.ip + ":" + settings.port + "/"); + console.log("You can access your Etherpad instance at http://" + settings.ip + ":" + settings.port + "/"); if(!_.isEmpty(settings.users)){ console.log("The plugin admin page is at http://" + settings.ip + ":" + settings.port + "/admin/plugins"); } @@ -80,6 +80,10 @@ exports.restartServer = function () { next(); }); + if(settings.trustProxy){ + app.enable('trust proxy'); + } + app.configure(function() { hooks.callAll("expressConfigure", {"app": app}); }); diff --git a/src/node/hooks/express/adminplugins.js b/src/node/hooks/express/adminplugins.js index 7e221cf1..d8f19bba 100644 --- a/src/node/hooks/express/adminplugins.js +++ b/src/node/hooks/express/adminplugins.js @@ -27,49 +27,84 @@ exports.socketio = function (hook_name, args, cb) { io.on('connection', function (socket) { if (!socket.handshake.session.user || !socket.handshake.session.user.is_admin) return; - socket.on("load", function (query) { + socket.on("getInstalled", function (query) { // send currently installed plugins - socket.emit("installed-results", {results: plugins.plugins}); - socket.emit("progress", {progress:1}); + var installed = Object.keys(plugins.plugins).map(function(plugin) { + return plugins.plugins[plugin].package + }) + socket.emit("results:installed", {installed: installed}); }); socket.on("checkUpdates", function() { - socket.emit("progress", {progress:0, message:'Checking for plugin updates...'}); // Check plugins for updates - installer.search({offset: 0, pattern: '', limit: 500}, /*useCache:*/true, function(data) { // hacky - if (!data.results) return; + installer.getAvailablePlugins(/*maxCacheAge:*/60*10, function(er, results) { + if(er) { + console.warn(er); + socket.emit("results:updatable", {updatable: {}}); + return; + } var updatable = _(plugins.plugins).keys().filter(function(plugin) { - if(!data.results[plugin]) return false; - var latestVersion = data.results[plugin]['dist-tags'].latest + if(!results[plugin]) return false; + var latestVersion = results[plugin].version var currentVersion = plugins.plugins[plugin].package.version return semver.gt(latestVersion, currentVersion) }); - socket.emit("updatable", {updatable: updatable}); - socket.emit("progress", {progress:1}); + socket.emit("results:updatable", {updatable: updatable}); }); }) + + socket.on("getAvailable", function (query) { + installer.getAvailablePlugins(/*maxCacheAge:*/false, function (er, results) { + if(er) { + console.error(er) + results = {} + } + socket.emit("results:available", results); + }); + }); socket.on("search", function (query) { - socket.emit("progress", {progress:0, message:'Fetching results...'}); - installer.search(query, true, function (progress) { - if (progress.results) - socket.emit("search-result", progress); - socket.emit("progress", progress); + installer.search(query.searchTerm, /*maxCacheAge:*/60*10, function (er, results) { + if(er) { + console.error(er) + results = {} + } + var res = Object.keys(results) + .map(function(pluginName) { + return results[pluginName] + }) + .filter(function(plugin) { + return !plugins.plugins[plugin.name] + }); + res = sortPluginList(res, query.sortBy, query.sortDir) + .slice(query.offset, query.offset+query.limit); + socket.emit("results:search", {results: res, query: query}); }); }); socket.on("install", function (plugin_name) { - socket.emit("progress", {progress:0, message:'Downloading and installing ' + plugin_name + "..."}); - installer.install(plugin_name, function (progress) { - socket.emit("progress", progress); + installer.install(plugin_name, function (er) { + if(er) console.warn(er) + socket.emit("finished:install", {plugin: plugin_name, error: er? er.message : null}); }); }); socket.on("uninstall", function (plugin_name) { - socket.emit("progress", {progress:0, message:'Uninstalling ' + plugin_name + "..."}); - installer.uninstall(plugin_name, function (progress) { - socket.emit("progress", progress); + installer.uninstall(plugin_name, function (er) { + if(er) console.warn(er) + socket.emit("finished:uninstall", {plugin: plugin_name, error: er? er.message : null}); }); }); }); } + +function sortPluginList(plugins, property, /*ASC?*/dir) { + return plugins.sort(function(a, b) { + if (a[property] < b[property]) + return dir? -1 : 1; + if (a[property] > b[property]) + return dir? 1 : -1; + // a must be equal to b + return 0; + }) +}
\ No newline at end of file diff --git a/src/node/hooks/express/apicalls.js b/src/node/hooks/express/apicalls.js index 0971a877..db0fc81f 100644 --- a/src/node/hooks/express/apicalls.js +++ b/src/node/hooks/express/apicalls.js @@ -1,5 +1,6 @@ var log4js = require('log4js'); var apiLogger = log4js.getLogger("API"); +var clientLogger = log4js.getLogger("client"); var formidable = require('formidable'); var apiHandler = require('../../handler/APIHandler'); @@ -42,10 +43,10 @@ exports.expressCreateServer = function (hook_name, args, cb) { }); }); - //The Etherpad client side sends information about how a disconnect happen + //The Etherpad client side sends information about how a disconnect happened args.app.post('/ep/pad/connection-diagnostic-info', function(req, res) { new formidable.IncomingForm().parse(req, function(err, fields, files) { - console.log("DIAGNOSTIC-INFO: " + fields.diagnosticInfo); + clientLogger.info("DIAGNOSTIC-INFO: " + fields.diagnosticInfo); res.end("OK"); }); }); @@ -53,7 +54,12 @@ exports.expressCreateServer = function (hook_name, args, cb) { //The Etherpad client side sends information about client side javscript errors args.app.post('/jserror', function(req, res) { new formidable.IncomingForm().parse(req, function(err, fields, files) { - console.error("CLIENT SIDE JAVASCRIPT ERROR: " + fields.errorInfo); + try { + var data = JSON.parse(fields.errorInfo) + }catch(e){ + return res.end() + } + clientLogger.warn(data.msg+' --', data); res.end("OK"); }); }); diff --git a/src/node/hooks/express/errorhandling.js b/src/node/hooks/express/errorhandling.js index 3c595683..087dd50e 100644 --- a/src/node/hooks/express/errorhandling.js +++ b/src/node/hooks/express/errorhandling.js @@ -1,5 +1,6 @@ var os = require("os"); var db = require('../../db/DB'); +var stats = require('ep_etherpad-lite/node/stats') exports.onShutdown = false; @@ -28,6 +29,7 @@ exports.gracefulShutdown = function(err) { }, 3000); } +process.on('uncaughtException', exports.gracefulShutdown); exports.expressCreateServer = function (hook_name, args, cb) { exports.app = args.app; @@ -39,6 +41,7 @@ exports.expressCreateServer = function (hook_name, args, cb) { // allowing you to respond however you like res.send(500, { error: 'Sorry, something bad happened!' }); console.error(err.stack? err.stack : err.toString()); + stats.meter('http500').mark() }) //connect graceful shutdown with sigint and uncaughtexception @@ -47,6 +50,4 @@ exports.expressCreateServer = function (hook_name, args, cb) { //https://github.com/joyent/node/issues/1553 process.on('SIGINT', exports.gracefulShutdown); } - - process.on('uncaughtException', exports.gracefulShutdown); -} +}
\ No newline at end of file diff --git a/src/node/hooks/express/importexport.js b/src/node/hooks/express/importexport.js index 9754ffa6..f5a3e5a1 100644 --- a/src/node/hooks/express/importexport.js +++ b/src/node/hooks/express/importexport.js @@ -15,7 +15,7 @@ exports.expressCreateServer = function (hook_name, args, cb) { //if abiword is disabled, and this is a format we only support with abiword, output a message if (settings.abiword == null && ["odt", "pdf", "doc"].indexOf(req.params.type) !== -1) { - res.send("Abiword is not enabled at this Etherpad Lite instance. Set the path to Abiword in settings.json to enable this feature"); + res.send("Abiword is not enabled at this Etherpad instance. Set the path to Abiword in settings.json to enable this feature"); return; } diff --git a/src/node/hooks/express/padreadonly.js b/src/node/hooks/express/padreadonly.js index af5cbed3..9a0a52bf 100644 --- a/src/node/hooks/express/padreadonly.js +++ b/src/node/hooks/express/padreadonly.js @@ -16,50 +16,50 @@ exports.expressCreateServer = function (hook_name, args, cb) { //translate the read only pad to a padId function(callback) { - readOnlyManager.getPadId(req.params.id, function(err, _padId) - { - if(ERR(err, callback)) return; + readOnlyManager.getPadId(req.params.id, function(err, _padId) + { + if(ERR(err, callback)) return; - padId = _padId; + padId = _padId; - //we need that to tell hasPadAcess about the pad - req.params.pad = padId; + //we need that to tell hasPadAcess about the pad + req.params.pad = padId; - callback(); - }); + callback(); + }); }, //render the html document function(callback) { - //return if the there is no padId - if(padId == null) - { - callback("notfound"); - return; - } + //return if the there is no padId + if(padId == null) + { + callback("notfound"); + return; + } - hasPadAccess(req, res, function() - { - //render the html document - exporthtml.getPadHTMLDocument(padId, null, false, function(err, _html) - { - if(ERR(err, callback)) return; - html = _html; - callback(); - }); - }); + hasPadAccess(req, res, function() + { + //render the html document + exporthtml.getPadHTMLDocument(padId, null, false, function(err, _html) + { + if(ERR(err, callback)) return; + html = _html; + callback(); + }); + }); } ], function(err) { //throw any unexpected error if(err && err != "notfound") - ERR(err); + ERR(err); if(err == "notfound") - res.send(404, '404 - Not Found'); + res.send(404, '404 - Not Found'); else - res.send(html); + res.send(html); }); }); -}
\ No newline at end of file +} diff --git a/src/node/hooks/express/padurlsanitize.js b/src/node/hooks/express/padurlsanitize.js index 29782b69..2aadccdc 100644 --- a/src/node/hooks/express/padurlsanitize.js +++ b/src/node/hooks/express/padurlsanitize.js @@ -12,20 +12,20 @@ exports.expressCreateServer = function (hook_name, args, cb) { else { padManager.sanitizePadId(padId, function(sanitizedPadId) { - //the pad id was sanitized, so we redirect to the sanitized version - if(sanitizedPadId != padId) - { + //the pad id was sanitized, so we redirect to the sanitized version + if(sanitizedPadId != padId) + { var real_url = sanitizedPadId; var query = url.parse(req.url).query; if ( query ) real_url += '?' + query; - res.header('Location', real_url); - res.send(302, 'You should be redirected to <a href="' + real_url + '">' + real_url + '</a>'); - } - //the pad id was fine, so just render it - else - { - next(); - } + res.header('Location', real_url); + res.send(302, 'You should be redirected to <a href="' + real_url + '">' + real_url + '</a>'); + } + //the pad id was fine, so just render it + else + { + next(); + } }); } }); diff --git a/src/node/hooks/express/specialpages.js b/src/node/hooks/express/specialpages.js index 44002461..063328fb 100644 --- a/src/node/hooks/express/specialpages.js +++ b/src/node/hooks/express/specialpages.js @@ -1,7 +1,13 @@ var path = require('path'); var eejs = require('ep_etherpad-lite/node/eejs'); +var toolbar = require("ep_etherpad-lite/node/utils/toolbar"); +var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); exports.expressCreateServer = function (hook_name, args, cb) { + // expose current stats + args.app.get('/stats', function(req, res) { + res.json(require('ep_etherpad-lite/node/stats').toJSON()) + }) //serve index.html under / args.app.get('/', function(req, res) @@ -26,14 +32,28 @@ exports.expressCreateServer = function (hook_name, args, cb) { //serve pad.html under /p args.app.get('/p/:pad', function(req, res, next) - { - res.send(eejs.require("ep_etherpad-lite/templates/pad.html", {req: req})); + { + hooks.callAll("padInitToolbar", { + toolbar: toolbar + }); + + res.send(eejs.require("ep_etherpad-lite/templates/pad.html", { + req: req, + toolbar: toolbar + })); }); //serve timeslider.html under /p/$padname/timeslider args.app.get('/p/:pad/timeslider', function(req, res, next) { - res.send(eejs.require("ep_etherpad-lite/templates/timeslider.html", {req: req})); + hooks.callAll("padInitToolbar", { + toolbar: toolbar + }); + + res.send(eejs.require("ep_etherpad-lite/templates/timeslider.html", { + req: req, + toolbar: toolbar + })); }); //serve favicon.ico from all path levels except as a pad name @@ -45,11 +65,11 @@ exports.expressCreateServer = function (hook_name, args, cb) { //there is no custom favicon, send the default favicon if(err) { - filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); - res.sendfile(filePath); + filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); + res.sendfile(filePath); } }); }); -}
\ No newline at end of file +} diff --git a/src/node/hooks/express/swagger.js b/src/node/hooks/express/swagger.js index f4fc5cff..e8daa61c 100644 --- a/src/node/hooks/express/swagger.js +++ b/src/node/hooks/express/swagger.js @@ -86,7 +86,7 @@ var API = { }, "createIfNotExistsFor" : { "func": "createGroupIfNotExistsFor", - "description": "this functions helps you to map your application group ids to etherpad lite group ids", + "description": "this functions helps you to map your application group ids to Etherpad group ids", "response": {"groupID":{"type":"string"}} }, "delete" : { @@ -124,7 +124,7 @@ var API = { }, "createIfNotExistsFor": { "func": "createAuthorIfNotExistsFor", - "description": "this functions helps you to map your application author ids to etherpad lite author ids", + "description": "this functions helps you to map your application author ids to Etherpad author ids", "response": {"authorID":{"type":"string"}} }, "listPads": { @@ -354,7 +354,6 @@ exports.expressCreateServer = function (hook_name, args, cb) { // Let's put this under /rest for now var subpath = express(); - args.app.use(express.bodyParser()); args.app.use(basePath, subpath); swagger.setAppHandler(subpath); diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index c39f91da..6998853f 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -5,6 +5,7 @@ var settings = require('../../utils/Settings'); var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); var ueberStore = require('../../db/SessionStore'); +var stats = require('ep_etherpad-lite/node/stats') //checks for basic http auth exports.basicAuth = function (req, res, next) { @@ -32,15 +33,15 @@ exports.basicAuth = function (req, res, next) { // If auth headers are present use them to authenticate... if (req.headers.authorization && req.headers.authorization.search('Basic ') === 0) { var userpass = new Buffer(req.headers.authorization.split(' ')[1], 'base64').toString().split(":") - var username = userpass[0]; - var password = userpass[1]; + var username = userpass.shift(); + var password = userpass.join(':'); if (settings.users[username] != undefined && settings.users[username].password == password) { settings.users[username].username = username; req.session.user = settings.users[username]; return cb(true); } - return hooks.aCallFirst("authenticate", {req: req, res:res, next:next, username: username, password: password}, hookResultMangle(cb)); + return hooks.aCallFirst("authenticate", {req: req, res:res, next:next, username: username, password: password}, hookResultMangle(cb)); } hooks.aCallFirst("authenticate", {req: req, res:res, next:next}, hookResultMangle(cb)); } @@ -91,10 +92,21 @@ exports.basicAuth = function (req, res, next) { exports.secret = null; exports.expressConfigure = function (hook_name, args, cb) { + // Measure response time + args.app.use(function(req, res, next) { + var stopWatch = stats.timer('httpRequests').start(); + var sendFn = res.send + res.send = function() { + stopWatch.end() + sendFn.apply(res, arguments) + } + next() + }) + // If the log level specified in the config file is WARN or ERROR the application server never starts listening to requests as reported in issue #158. // Not installing the log4js connect logger when the log level has a higher severity than INFO since it would not log at that level anyway. if (!(settings.loglevel === "WARN" || settings.loglevel == "ERROR")) - args.app.use(log4js.connectLogger(httpLogger, { level: log4js.levels.INFO, format: ':status, :method :url'})); + args.app.use(log4js.connectLogger(httpLogger, { level: log4js.levels.DEBUG, format: ':status, :method :url'})); /* Do not let express create the session, so that we can retain a * reference to it for socket.io to use. Also, set the key (cookie diff --git a/src/node/server.js b/src/node/server.js index db75d7e3..605ce847 100755 --- a/src/node/server.js +++ b/src/node/server.js @@ -23,10 +23,15 @@ var log4js = require('log4js') , async = require('async') + , stats = require('./stats') ; log4js.replaceConsole(); +stats.gauge('memoryUsage', function() { + return process.memoryUsage().rss +}) + var settings , db , plugins @@ -48,7 +53,6 @@ async.waterfall([ plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); hooks.plugins = plugins; - callback(); }, diff --git a/src/node/stats.js b/src/node/stats.js new file mode 100644 index 00000000..24efaf4a --- /dev/null +++ b/src/node/stats.js @@ -0,0 +1,3 @@ +var measured = require('measured') + +module.exports = measured.createCollection();
\ No newline at end of file diff --git a/src/node/utils/Abiword.js b/src/node/utils/Abiword.js index 27138e64..5f12bd97 100644 --- a/src/node/utils/Abiword.js +++ b/src/node/utils/Abiword.js @@ -63,7 +63,7 @@ if(os.type().indexOf("Windows") > -1) callback(); }); - } + }; exports.convertFile = function(srcFile, destFile, type, callback) { @@ -100,7 +100,7 @@ else { //add data to buffer stdoutBuffer+=data.toString(); - + //we're searching for the prompt, cause this means everything we need is in the buffer if(stdoutBuffer.search("AbiWord:>") != -1) { @@ -121,27 +121,29 @@ else firstPrompt = false; } }); - } + }; spawnAbiword(); doConvertTask = function(task, callback) { abiword.stdin.write("convert " + task.srcFile + " " + task.destFile + " " + task.type + "\n"); - //create a callback that calls the task callback and the caller callback stdoutCallback = function (err) { callback(); console.log("queue continue"); - task.callback(err); + try{ + task.callback(err); + }catch(e){ + console.error("Abiword File failed to convert", e); + } }; - } + }; //Queue with the converts we have to do var queue = async.queue(doConvertTask, 1); - exports.convertFile = function(srcFile, destFile, type, callback) - { + { queue.push({"srcFile": srcFile, "destFile": destFile, "type": type, "callback": callback}); }; } diff --git a/src/node/utils/ExportDokuWiki.js b/src/node/utils/ExportDokuWiki.js index d2f71236..f5d2d177 100644 --- a/src/node/utils/ExportDokuWiki.js +++ b/src/node/utils/ExportDokuWiki.js @@ -316,7 +316,7 @@ exports.getPadDokuWikiDocument = function (padId, revNum, callback) getPadDokuWiki(pad, revNum, callback); }); -} +}; function _escapeDokuWiki(s) { diff --git a/src/node/utils/ExportHelper.js b/src/node/utils/ExportHelper.js index a939a8b6..136896f0 100644 --- a/src/node/utils/ExportHelper.js +++ b/src/node/utils/ExportHelper.js @@ -45,7 +45,7 @@ exports.getPadPlainText = function(pad, revNum){ } return pieces.join(''); -} +}; exports._analyzeLine = function(text, aline, apool){ @@ -77,11 +77,11 @@ exports._analyzeLine = function(text, aline, apool){ line.aline = aline; } return line; -} +}; exports._encodeWhitespace = function(s){ return s.replace(/[^\x21-\x7E\s\t\n\r]/g, function(c){ - return "&#" +c.charCodeAt(0) + ";" + return "&#" +c.charCodeAt(0) + ";"; }); -} +}; diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 585694d4..01920da7 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -21,7 +21,6 @@ var padManager = require("../db/PadManager"); var ERR = require("async-stacktrace"); var Security = require('ep_etherpad-lite/static/js/security'); var hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); -var getPadPlainText = require('./ExportHelper').getPadPlainText var _analyzeLine = require('./ExportHelper')._analyzeLine; var _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; @@ -79,6 +78,10 @@ function getHTMLFromAtext(pad, atext, authorColors) var tags = ['h1', 'h2', 'strong', 'em', 'u', 's']; var props = ['heading1', 'heading2', 'bold', 'italic', 'underline', 'strikethrough']; + // holds a map of used styling attributes (*1, *2, etc) in the apool + // and maps them to an index in props + // *3:2 -> the attribute *3 means strong + // *2:5 -> the attribute *2 means s(trikethrough) var anumMap = {}; var css = ""; @@ -88,24 +91,24 @@ function getHTMLFromAtext(pad, atext, authorColors) if(authorColors){ css+="<style>\n"; - + for (var a in apool.numToAttrib) { var attr = apool.numToAttrib[a]; - + //skip non author attributes if(attr[0] === "author" && attr[1] !== ""){ //add to props array var propName = "author" + stripDotFromAuthorID(attr[1]); var newLength = props.push(propName); anumMap[a] = newLength -1; - + css+="." + propName + " {background-color: " + authorColors[attr[1]]+ "}\n"; } else if(attr[0] === "removed") { var propName = "removed"; - + var newLength = props.push(propName); anumMap[a] = newLength -1; - + css+=".removed {text-decoration: line-through; " + "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; "+ "filter: alpha(opacity=80); "+ @@ -113,10 +116,12 @@ function getHTMLFromAtext(pad, atext, authorColors) "}\n"; } } - + css+="</style>"; } + // iterates over all props(h1,h2,strong,...), checks if it is used in + // this pad, and if yes puts its attrib id->props value into anumMap props.forEach(function (propName, i) { var propTrueNum = apool.putAttrib([propName, true], true); @@ -128,11 +133,6 @@ function getHTMLFromAtext(pad, atext, authorColors) function getLineHTML(text, attribs) { - var propVals = [false, false, false]; - var ENTER = 1; - var STAY = 2; - var LEAVE = 0; - // Use order of tags (b/i/u) as order of nesting, for simplicity // and decent nesting. For example, // <b>Just bold<b> <b><i>Bold and italics</i></b> <i>Just italics</i> @@ -145,17 +145,17 @@ function getHTMLFromAtext(pad, atext, authorColors) function getSpanClassFor(i){ //return if author colors are disabled if (!authorColors) return false; - + var property = props[i]; - + if(property.substr(0,6) === "author"){ return stripDotFromAuthorID(property); } - + if(property === "removed"){ return "removed"; } - + return false; } @@ -163,7 +163,7 @@ function getHTMLFromAtext(pad, atext, authorColors) { openTags.unshift(i); var spanClass = getSpanClassFor(i); - + if(spanClass){ assem.append('<span class="'); assem.append(spanClass); @@ -175,11 +175,12 @@ function getHTMLFromAtext(pad, atext, authorColors) } } + // this closes an open tag and removes its reference from openTags function emitCloseTag(i) { openTags.shift(); var spanClass = getSpanClassFor(i); - + if(spanClass){ assem.append('</span>'); } else { @@ -188,22 +189,6 @@ function getHTMLFromAtext(pad, atext, authorColors) assem.append('>'); } } - - function orderdCloseTags(tags2close) - { - for(var i=0;i<openTags.length;i++) - { - for(var j=0;j<tags2close.length;j++) - { - if(tags2close[j] == openTags[i]) - { - emitCloseTag(tags2close[j]); - i--; - break; - } - } - } - } var urls = _findURLs(text); @@ -219,118 +204,71 @@ function getHTMLFromAtext(pad, atext, authorColors) var iter = Changeset.opIterator(Changeset.subattribution(attribs, idx, idx + numChars)); idx += numChars; + // this iterates over every op string and decides which tags to open or to close + // based on the attribs used while (iter.hasNext()) { var o = iter.next(); - var propChanged = false; + var usedAttribs = []; + + // mark all attribs as used Changeset.eachAttribNumber(o.attribs, function (a) { if (a in anumMap) { - var i = anumMap[a]; // i = 0 => bold, etc. - if (!propVals[i]) - { - propVals[i] = ENTER; - propChanged = true; - } - else - { - propVals[i] = STAY; - } + usedAttribs.push(anumMap[a]); // i = 0 => bold, etc. } }); - for (var i = 0; i < propVals.length; i++) + var outermostTag = -1; + // find the outer most open tag that is no longer used + for (var i = openTags.length - 1; i >= 0; i--) { - if (propVals[i] === true) - { - propVals[i] = LEAVE; - propChanged = true; - } - else if (propVals[i] === STAY) + if (usedAttribs.indexOf(openTags[i]) === -1) { - propVals[i] = true; // set it back + outermostTag = i; + break; } } - // now each member of propVal is in {false,LEAVE,ENTER,true} - // according to what happens at start of span - if (propChanged) + + // close all tags upto the outer most + if (outermostTag != -1) { - // leaving bold (e.g.) also leaves italics, etc. - var left = false; - for (var i = 0; i < propVals.length; i++) + while ( outermostTag >= 0 ) { - var v = propVals[i]; - if (!left) - { - if (v === LEAVE) - { - left = true; - } - } - else - { - if (v === true) - { - propVals[i] = STAY; // tag will be closed and re-opened - } - } + emitCloseTag(openTags[0]); + outermostTag--; } + } - var tags2close = []; - - for (var i = propVals.length - 1; i >= 0; i--) - { - if (propVals[i] === LEAVE) - { - //emitCloseTag(i); - tags2close.push(i); - propVals[i] = false; - } - else if (propVals[i] === STAY) - { - //emitCloseTag(i); - tags2close.push(i); - } - } - - orderdCloseTags(tags2close); - - for (var i = 0; i < propVals.length; i++) + // open all tags that are used but not open + for (i=0; i < usedAttribs.length; i++) + { + if (openTags.indexOf(usedAttribs[i]) === -1) { - if (propVals[i] === ENTER || propVals[i] === STAY) - { - emitOpenTag(i); - propVals[i] = true; - } + emitOpenTag(usedAttribs[i]) } - // propVals is now all {true,false} again - } // end if (propChanged) + } + var chars = o.chars; if (o.lines) { chars--; // exclude newline at end of line, if present } - + var s = taker.take(chars); - + //removes the characters with the code 12. Don't know where they come //from but they break the abiword parser and are completly useless s = s.replace(String.fromCharCode(12), ""); - + assem.append(_encodeWhitespace(Security.escapeHTML(s))); } // end iteration over spans in line - - var tags2close = []; - for (var i = propVals.length - 1; i >= 0; i--) + + // close all the tags that are open after the last op + while (openTags.length > 0) { - if (propVals[i]) - { - tags2close.push(i); - propVals[i] = false; - } + emitCloseTag(openTags[0]) } - - orderdCloseTags(tags2close); } // end processNextChars if (urls) { @@ -363,7 +301,7 @@ function getHTMLFromAtext(pad, atext, authorColors) { var line = _analyzeLine(textLines[i], attribLines[i], apool); var lineContent = getLineHTML(line.text, line.aline); - + if (line.listLevel)//If we are inside a list { // do list stuff @@ -447,7 +385,7 @@ function getHTMLFromAtext(pad, atext, authorColors) pieces.push('</li></ul>'); } lists.length--; - } + } var lineContentFromHook = hooks.callAllStr("getLineHTMLForExport", { line: line, @@ -455,14 +393,14 @@ function getHTMLFromAtext(pad, atext, authorColors) attribLine: attribLines[i], text: textLines[i] }, " ", " ", ""); - if (lineContentFromHook) - { - pieces.push(lineContentFromHook, ''); - } - else - { - pieces.push(lineContent, '<br>'); - } + if (lineContentFromHook) + { + pieces.push(lineContentFromHook, ''); + } + else + { + pieces.push(lineContent, '<br>'); + } } } @@ -490,7 +428,7 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) var head = (noDocType ? '' : '<!doctype html>\n') + '<html lang="en">\n' + (noDocType ? '' : '<head>\n' + - '<title>' + Security.escapeHTML(padId) + '</title>\n' + + '<title>' + Security.escapeHTML(padId) + '</title>\n' + '<meta charset="utf-8">\n' + '<style> * { font-family: arial, sans-serif;\n' + 'font-size: 13px;\n' + @@ -515,7 +453,7 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) callback(null, head + html + foot); }); }); -} +}; // copied from ACE @@ -573,8 +511,8 @@ function _processSpaces(s){ } } // beginning of line is nbsp - for (var i = 0; i < parts.length; i++){ - var p = parts[i]; + for (i = 0; i < parts.length; i++){ + p = parts[i]; if (p == " "){ parts[i] = ' '; break; @@ -586,8 +524,8 @@ function _processSpaces(s){ } else { - for (var i = 0; i < parts.length; i++){ - var p = parts[i]; + for (i = 0; i < parts.length; i++){ + p = parts[i]; if (p == " "){ parts[i] = ' '; } @@ -595,4 +533,3 @@ function _processSpaces(s){ } return parts.join(''); } - diff --git a/src/node/utils/ExportTxt.js b/src/node/utils/ExportTxt.js index c57424f1..f0b62743 100644 --- a/src/node/utils/ExportTxt.js +++ b/src/node/utils/ExportTxt.js @@ -289,5 +289,4 @@ exports.getPadTXTDocument = function (padId, revNum, noDocType, callback) callback(null, html); }); }); -} - +}; diff --git a/src/node/utils/ImportHtml.js b/src/node/utils/ImportHtml.js index 7c638fb8..abba2ac1 100644 --- a/src/node/utils/ImportHtml.js +++ b/src/node/utils/ImportHtml.js @@ -25,21 +25,29 @@ function setPadHTML(pad, html, callback) { var apiLogger = log4js.getLogger("ImportHtml"); - // Clean the pad. This makes the rest of the code easier - // by several orders of magnitude. - pad.setText(""); - var padText = pad.text(); - // Parse the incoming HTML with jsdom - var doc = jsdom(html.replace(/>\n+</g, '><')); + try{ + var doc = jsdom(html.replace(/>\n+</g, '><')); + }catch(e){ + apiLogger.warn("Error importing, possibly caused by malformed HTML"); + var doc = jsdom("<html><body><div>Error during import, possibly malformed HTML</div></body></html>"); + } + apiLogger.debug('html:'); apiLogger.debug(html); // Convert a dom tree into a list of lines and attribute liens // using the content collector object var cc = contentcollector.makeContentCollector(true, null, pad.pool); - cc.collectContent(doc.childNodes[0]); + try{ // we use a try here because if the HTML is bad it will blow up + cc.collectContent(doc.childNodes[0]); + }catch(e){ + apiLogger.warn("HTML was not properly formed", e); + return; // We don't process the HTML because it was bad.. + } + var result = cc.finish(); + apiLogger.debug('Lines:'); var i; for (i = 0; i < result.lines.length; i += 1) @@ -84,6 +92,7 @@ function setPadHTML(pad, html, callback) // the changeset is ready! var theChangeset = builder.toString(); apiLogger.debug('The changeset: ' + theChangeset); + pad.setText(""); pad.appendRevision(theChangeset); } diff --git a/src/node/utils/Minify.js b/src/node/utils/Minify.js index 5fc8accb..58d08b30 100644 --- a/src/node/utils/Minify.js +++ b/src/node/utils/Minify.js @@ -125,11 +125,11 @@ function requestURIs(locations, method, headers, callback) { } function completed() { - var statuss = responses.map(function (x) {return x[0]}); - var headerss = responses.map(function (x) {return x[1]}); - var contentss = responses.map(function (x) {return x[2]}); + var statuss = responses.map(function (x) {return x[0];}); + var headerss = responses.map(function (x) {return x[1];}); + var contentss = responses.map(function (x) {return x[2];}); callback(statuss, headerss, contentss); - }; + } } /** @@ -263,7 +263,7 @@ function getAceFile(callback) { var filename = item.match(/"([^"]*)"/)[1]; var request = require('request'); - var baseURI = 'http://localhost:' + settings.port + var baseURI = 'http://localhost:' + settings.port; var resourceURI = baseURI + path.normalize(path.join('/static/', filename)); resourceURI = resourceURI.replace(/\\/g, '/'); // Windows (safe generally?) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 45f81aa5..4c6b7ea4 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -1,5 +1,5 @@ /** - * The Settings Modul reads the settings out of settings.json and provides + * The Settings Modul reads the settings out of settings.json and provides * this information to the other modules */ @@ -24,9 +24,9 @@ var os = require("os"); var path = require('path'); var argv = require('./Cli').argv; var npm = require("npm/lib/npm.js"); -var vm = require('vm'); +var jsonminify = require("jsonminify"); var log4js = require("log4js"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("./randomstring"); /* Root path of the installation */ @@ -35,7 +35,7 @@ exports.root = path.normalize(path.join(npm.dir, "..")); /** * The app title, visible e.g. in the browser window */ -exports.title = "Etherpad Lite"; +exports.title = "Etherpad"; /** * The app favicon fully specified url, visible e.g. in the browser window @@ -48,7 +48,7 @@ exports.faviconTimeslider = "../../" + exports.favicon; * The IP ep-lite should listen to */ exports.ip = "0.0.0.0"; - + /** * The Port ep-lite should listen to */ @@ -77,7 +77,27 @@ exports.dbSettings = { "filename" : path.join(exports.root, "dirty.db") }; /** * The default Text of a new pad */ -exports.defaultPadText = "Welcome to Etherpad Lite!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad Lite on Github: http:\/\/j.mp/ep-lite\n"; +exports.defaultPadText = "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad on Github: http:\/\/j.mp/ep-lite\n"; + +/** + * The toolbar buttons and order. + */ +exports.toolbar = { + left: [ + ["bold", "italic", "underline", "strikethrough"], + ["orderedlist", "unorderedlist", "indent", "outdent"], + ["undo", "redo"], + ["clearauthorship"] + ], + right: [ + ["importexport", "timeslider", "savedrevision"], + ["settings", "embed"], + ["showusers"] + ], + timeslider: [ + ["timeslider_export", "timeslider_returnToPad"] + ] +} /** * A flag that requires any user to have a valid session (via the api) before accessing a pad @@ -109,6 +129,11 @@ exports.abiword = null; */ exports.loglevel = "INFO"; +/** + * Disable IP logging + */ +exports.disableIPlogging = false; + /* * log4js appender configuration */ @@ -119,6 +144,11 @@ exports.logconfig = { appenders: [{ type: "console" }]}; */ exports.sessionKey = false; +/* +* Trust Proxy, whether or not trust the x-forwarded-for header. +*/ +exports.trustProxy = false; + /* This setting is used if you need authentication and/or * authorization. Note: /admin always requires authentication, and * either authorization by a module, or a user with is_admin set */ @@ -137,12 +167,12 @@ exports.abiwordAvailable = function() { return "no"; } -} +}; exports.reloadSettings = function reloadSettings() { // Discover where the settings file lives var settingsFilename = argv.settings || "settings.json"; - settingsFilename = path.resolve(path.join(root, settingsFilename)); + settingsFilename = path.resolve(path.join(exports.root, settingsFilename)); var settingsStr; try{ @@ -156,8 +186,8 @@ exports.reloadSettings = function reloadSettings() { var settings; try { if(settingsStr) { - settings = vm.runInContext('exports = '+settingsStr, vm.createContext(), "settings.json"); - settings = JSON.parse(JSON.stringify(settings)) // fix objects having constructors of other vm.context + settingsStr = jsonminify(settingsStr).replace(",]","]").replace(",}","}"); + settings = JSON.parse(settingsStr); } }catch(e){ console.error('There was an error processing your settings.json file: '+e.message); @@ -185,7 +215,7 @@ exports.reloadSettings = function reloadSettings() { console.warn("Unknown Setting: '" + i + "'. This setting doesn't exist or it was removed"); } } - + log4js.configure(exports.logconfig);//Configure the logging appenders log4js.setGlobalLogLevel(exports.loglevel);//set loglevel log4js.replaceConsole(); @@ -196,9 +226,9 @@ exports.reloadSettings = function reloadSettings() { } if(exports.dbType === "dirty"){ - console.warn("DirtyDB is used. This is fine for testing but not recommended for production.") + console.warn("DirtyDB is used. This is fine for testing but not recommended for production."); } -} +}; // initially load settings exports.reloadSettings(); diff --git a/src/node/utils/caching_middleware.js b/src/node/utils/caching_middleware.js index c6b23713..d30dc398 100644 --- a/src/node/utils/caching_middleware.js +++ b/src/node/utils/caching_middleware.js @@ -23,7 +23,7 @@ var util = require('util'); var settings = require('./Settings'); var semver = require('semver'); -var existsSync = (semver.satisfies(process.version, '>=0.8.0')) ? fs.existsSync : path.existsSync +var existsSync = (semver.satisfies(process.version, '>=0.8.0')) ? fs.existsSync : path.existsSync; var CACHE_DIR = path.normalize(path.join(settings.root, 'var/')); CACHE_DIR = existsSync(CACHE_DIR) ? CACHE_DIR : undefined; @@ -133,7 +133,7 @@ CachingMiddleware.prototype = new function () { old_res.write = res.write; old_res.end = res.end; res.write = function(data, encoding) {}; - res.end = function(data, encoding) { respond() }; + res.end = function(data, encoding) { respond(); }; } else { res.writeHead(status, headers); } @@ -168,7 +168,7 @@ CachingMiddleware.prototype = new function () { } else if (req.method == 'GET') { var readStream = fs.createReadStream(pathStr); res.writeHead(statusCode, headers); - util.pump(readStream, res); + readStream.pipe(res); } else { res.writeHead(statusCode, headers); res.end(); diff --git a/src/node/utils/padDiff.js b/src/node/utils/padDiff.js index 1b3cf58f..88fa5cba 100644 --- a/src/node/utils/padDiff.js +++ b/src/node/utils/padDiff.js @@ -68,7 +68,7 @@ PadDiff.prototype._isClearAuthorship = function(changeset){ return false; return true; -} +}; PadDiff.prototype._createClearAuthorship = function(rev, callback){ var self = this; @@ -84,7 +84,7 @@ PadDiff.prototype._createClearAuthorship = function(rev, callback){ callback(null, changeset); }); -} +}; PadDiff.prototype._createClearStartAtext = function(rev, callback){ var self = this; @@ -107,7 +107,7 @@ PadDiff.prototype._createClearStartAtext = function(rev, callback){ callback(null, newAText); }); }); -} +}; PadDiff.prototype._getChangesetsInBulk = function(startRev, count, callback) { var self = this; @@ -124,7 +124,7 @@ PadDiff.prototype._getChangesetsInBulk = function(startRev, count, callback) { async.forEach(revisions, function(rev, callback){ self._pad.getRevision(rev, function(err, revision){ if(err){ - return callback(err) + return callback(err); } var arrayNum = rev-startRev; @@ -137,7 +137,7 @@ PadDiff.prototype._getChangesetsInBulk = function(startRev, count, callback) { }, function(err){ callback(err, changesets, authors); }); -} +}; PadDiff.prototype._addAuthors = function(authors) { var self = this; @@ -147,7 +147,7 @@ PadDiff.prototype._addAuthors = function(authors) { self._authors.push(author); } }); -} +}; PadDiff.prototype._createDiffAtext = function(callback) { var self = this; @@ -219,7 +219,7 @@ PadDiff.prototype._createDiffAtext = function(callback) { } ); }); -} +}; PadDiff.prototype.getHtml = function(callback){ //cache the html @@ -279,7 +279,7 @@ PadDiff.prototype.getAuthors = function(callback){ } else { callback(null, self._authors); } -} +}; PadDiff.prototype._extendChangesetWithAuthor = function(changeset, author, apool) { //unpack @@ -312,7 +312,7 @@ PadDiff.prototype._extendChangesetWithAuthor = function(changeset, author, apool //return the modified changeset return Changeset.pack(unpacked.oldLen, unpacked.newLen, assem.toString(), unpacked.charBank); -} +}; //this method is 80% like Changeset.inverse. I just changed so instead of reverting, it adds deletions and attribute changes to to the atext. PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { @@ -331,14 +331,6 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { } } - function lines_length() { - if ((typeof lines.length) == "number") { - return lines.length; - } else { - return lines.length(); - } - } - function alines_get(idx) { if (alines.get) { return alines.get(idx); @@ -347,14 +339,6 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { } } - function alines_length() { - if ((typeof alines.length) == "number") { - return alines.length; - } else { - return alines.length(); - } - } - var curLine = 0; var curChar = 0; var curLineOpIter = null; @@ -463,7 +447,7 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { // If the text this operator applies to is only a star, than this is a false positive and should be ignored if (csOp.attribs && textBank != "*") { var deletedAttrib = apool.putAttrib(["removed", true]); - var authorAttrib = apool.putAttrib(["author", ""]);; + var authorAttrib = apool.putAttrib(["author", ""]); attribKeys.length = 0; attribValues.length = 0; @@ -473,7 +457,7 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { if(apool.getAttribKey(n) === "author"){ authorAttrib = n; - }; + } }); var undoBackToAttribs = cachedStrFunc(function (attribs) { diff --git a/src/node/utils/randomstring.js b/src/node/utils/randomstring.js index 4c1bba24..3815c66d 100644 --- a/src/node/utils/randomstring.js +++ b/src/node/utils/randomstring.js @@ -1,16 +1,11 @@ /** * Generates a random String with the given length. Is needed to generate the Author, Group, readonly, session Ids */ -var randomString = function randomString(len) +var crypto = require('crypto'); + +var randomString = function(len) { - var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - var randomstring = ''; - for (var i = 0; i < len; i++) - { - var rnum = Math.floor(Math.random() * chars.length); - randomstring += chars.substring(rnum, rnum + 1); - } - return randomstring; + return crypto.randomBytes(len).toString('hex') }; module.exports = randomString; diff --git a/src/node/utils/tar.json b/src/node/utils/tar.json index b010f851..70001f8f 100644 --- a/src/node/utils/tar.json +++ b/src/node/utils/tar.json @@ -46,7 +46,6 @@ , "Changeset.js" , "ChangesetUtils.js" , "skiplist.js" - , "virtual_lines.js" , "cssmanager.js" , "colorutils.js" , "undomodule.js" diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js new file mode 100644 index 00000000..a4ee202c --- /dev/null +++ b/src/node/utils/toolbar.js @@ -0,0 +1,239 @@ +/** + * The Toolbar Module creates and renders the toolbars and buttons + */ +var _ = require("underscore") + , tagAttributes + , tag + , defaultButtons + , Button + , ButtonsGroup + , Separator + , defaultButtonAttributes; + +defaultButtonAttributes = function (name, overrides) { + return { + command: name, + localizationId: "pad.toolbar." + name + ".title", + class: "buttonicon buttonicon-" + name + }; +}; + +tag = function (name, attributes, contents) { + var aStr = tagAttributes(attributes); + + if (_.isString(contents) && contents.length > 0) { + return '<' + name + aStr + '>' + contents + '</' + name + '>'; + } + else { + return '<' + name + aStr + '></' + name + '>'; + } +}; + +tagAttributes = function (attributes) { + attributes = _.reduce(attributes || {}, function (o, val, name) { + if (!_.isUndefined(val)) { + o[name] = val; + } + return o; + }, {}); + + return " " + _.map(attributes, function (val, name) { + return "" + name + '="' + _.escape(val) + '"'; + }).join(" "); +}; + +ButtonsGroup = function () { + this.buttons = []; +}; + +ButtonsGroup.fromArray = function (array) { + var btnGroup = new this; + _.each(array, function (btnName) { + btnGroup.addButton(Button.load(btnName)); + }); + return btnGroup; +}; + +ButtonsGroup.prototype.addButton = function (button) { + this.buttons.push(button); + return this; +}; + +ButtonsGroup.prototype.render = function () { + if (this.buttons.length == 1) { + this.buttons[0].grouping = ""; + } + else { + _.first(this.buttons).grouping = "grouped-left"; + _.last(this.buttons).grouping = "grouped-right"; + _.each(this.buttons.slice(1, -1), function (btn) { + btn.grouping = "grouped-middle" + }); + } + + return _.map(this.buttons, function (btn) { + return btn.render(); + }).join("\n"); +}; + +Button = function (attributes) { + this.attributes = attributes; +}; + +Button.load = function (btnName) { + var button = module.exports.availableButtons[btnName]; + if (button.constructor === Button || button.constructor === SelectButton) { + return button; + } + else { + return new Button(button); + } +}; + +_.extend(Button.prototype, { + grouping: "", + + render: function () { + var liAttributes = { + "data-type": "button", + "data-key": this.attributes.command, + }; + return tag("li", liAttributes, + tag("a", { "class": this.grouping }, + tag("span", { "class": " "+ this.attributes.class, "data-l10n-id": this.attributes.localizationId }) + ) + ); + } +}); + +SelectButton = function (attributes) { + this.attributes = attributes; + this.options = []; +}; + +_.extend(SelectButton.prototype, Button.prototype, { + addOption: function (value, text, attributes) { + this.options.push({ + value: value, + text: text, + attributes: attributes + }); + return this; + }, + + select: function (attributes) { + var self = this + , options = []; + + _.each(this.options, function (opt) { + var a = _.extend({ + value: opt.value + }, opt.attributes); + + options.push( tag("option", a, opt.text) ); + }); + return tag("select", attributes, options.join("")); + }, + + render: function () { + var attributes = { + id: this.attributes.id, + "data-key": this.attributes.command, + "data-type": "select" + }; + return tag("li", attributes, + this.select({ id: this.attributes.selectId }) + ); + } +}); + +Separator = function () {}; +Separator.prototype.render = function () { + return tag("li", { "class": "separator" }); +}; + +module.exports = { + availableButtons: { + bold: defaultButtonAttributes("bold"), + italic: defaultButtonAttributes("italic"), + underline: defaultButtonAttributes("underline"), + strikethrough: defaultButtonAttributes("strikethrough"), + + orderedlist: { + command: "insertorderedlist", + localizationId: "pad.toolbar.ol.title", + class: "buttonicon buttonicon-insertorderedlist" + }, + + unorderedlist: { + command: "insertunorderedlist", + localizationId: "pad.toolbar.ul.title", + class: "buttonicon buttonicon-insertunorderedlist" + }, + + indent: defaultButtonAttributes("indent"), + outdent: { + command: "outdent", + localizationId: "pad.toolbar.unindent.title", + class: "buttonicon buttonicon-outdent" + }, + + undo: defaultButtonAttributes("undo"), + redo: defaultButtonAttributes("redo"), + + clearauthorship: { + command: "clearauthorship", + localizationId: "pad.toolbar.clearAuthorship.title", + class: "buttonicon buttonicon-clearauthorship" + }, + + importexport: { + command: "import_export", + localizationId: "pad.toolbar.import_export.title", + class: "buttonicon buttonicon-import_export" + }, + + timeslider: { + command: "showTimeSlider", + localizationId: "pad.toolbar.timeslider.title", + class: "buttonicon buttonicon-history" + }, + + savedrevision: defaultButtonAttributes("savedRevision"), + settings: defaultButtonAttributes("settings"), + embed: defaultButtonAttributes("embed"), + showusers: defaultButtonAttributes("showusers"), + + timeslider_export: { + command: "import_export", + localizationId: "timeslider.toolbar.exportlink.title", + class: "buttonicon buttonicon-import_export" + }, + + timeslider_returnToPad: { + command: "timeslider_returnToPad", + localizationId: "timeslider.toolbar.returnbutton", + class: "buttontext" + } + }, + + registerButton: function (buttonName, buttonInfo) { + this.availableButtons[buttonName] = buttonInfo; + }, + + button: function (attributes) { + return new Button(attributes); + }, + separator: function () { + return (new Separator).render(); + }, + selectButton: function (attributes) { + return new SelectButton(attributes); + }, + menu: function (buttons) { + var groups = _.map(buttons, function (group) { + return ButtonsGroup.fromArray(group).render(); + }); + return groups.join(this.separator()); + } +}; diff --git a/src/package.json b/src/package.json index 0e418ede..535db23b 100644 --- a/src/package.json +++ b/src/package.json @@ -5,7 +5,7 @@ "keywords" : ["etherpad", "realtime", "collaborative", "editor"], "author" : "Peter 'Pita' Martischka <petermartischka@googlemail.com> - Primary Technology Ltd", "contributors" : [ - { "name": "John McLear" }, + { "name": "John McLear" }, { "name": "Hans Pinckaers" }, { "name": "Robin Buse" }, { "name": "Marcel Klehr" } @@ -16,18 +16,18 @@ "require-kernel" : "1.0.5", "resolve" : "0.2.x", "socket.io" : "0.9.x", - "ueberDB" : "0.1.94", + "ueberDB" : ">=0.2.2", + "express" : "3.1.0", "async" : "0.1.x", - "express" : "3.x", - "connect" : "2.4.x", + "connect" : "2.7.x", "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", - "npm" : "1.1.x", - "npm-registry-client" : "0.2.10", + "npm" : "1.4.x", "ejs" : "0.6.1", "graceful-fs" : "1.1.5", "slide" : "1.1.3", @@ -37,7 +37,10 @@ "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", + "jsonminify" : "0.2.2", + "measured" : "0.1.3" }, "bin": { "etherpad-lite": "./node/server.js" }, "devDependencies": { @@ -45,6 +48,9 @@ }, "engines" : { "node" : ">=0.6.3", "npm" : ">=1.0" - }, - "version" : "1.2.81" + }, + "repository" : { "type" : "git", + "url" : "http://github.com/ether/etherpad-lite.git" + }, + "version" : "1.4.0" } diff --git a/src/static/css/admin.css b/src/static/css/admin.css index b6823842..97104de9 100644 --- a/src/static/css/admin.css +++ b/src/static/css/admin.css @@ -43,7 +43,7 @@ div.innerwrapper { box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.2);
margin: auto;
max-width: 1150px;
- min-height: 100%;
+ min-height: 101%;/*always display a scrollbar*/
}
h1 {
@@ -102,12 +102,26 @@ input[type="text"] { max-width: 500px;
}
+.sort {
+ cursor: pointer;
+}
+.sort:after {
+ content: '▲▼'
+}
+.sort.up:after {
+ content:'â–²'
+}
+.sort.down:after {
+ content:'â–¼'
+}
+
table {
border: 1px solid #ddd;
border-radius: 3px;
border-spacing: 0;
width: 100%;
margin: 20px 0;
+ position:relative; /* Allows us to position the loading indicator relative to the table */
}
table thead tr {
@@ -122,13 +136,42 @@ td, th { display: none;
}
-#progress {
+#installed-plugins td>div {
+ position: relative;/* Allows us to position the loading indicator relative to this row */
+ display: inline-block; /*make this fill the whole cell*/
+ width:100%;
+}
+
+.messages {
+ height: 5em;
+}
+.messages * {
+ display: none;
+ text-align: center;
+}
+.messages .fetching {
+ display: block;
+}
+
+.progress {
position: absolute;
- bottom: 50px;
+ top: 0; left: 0; bottom:0; right:0;
+ padding: auto;
+
+ background: rgb(255,255,255);
+ display: none;
}
-#progress img {
- vertical-align: top;
+#search-progress.progress {
+ padding-top: 20%;
+ background: rgba(255,255,255,0.3);
+}
+
+.progress * {
+ display: block;
+ margin: 0 auto;
+ text-align: center;
+ color: #666;
}
.settings {
@@ -147,7 +190,25 @@ a:link, a:visited, a:hover, a:focus { }
a:focus, a:hover {
- border-bottom: #333333 1px solid;
+ text-decoration: underline;
+}
+
+.installed-results a:link,
+.search-results a:link,
+.installed-results a:visited,
+.search-results a:visited,
+.installed-results a:hover,
+.search-results a:hover,
+.installed-results a:focus,
+.search-results a:focus {
+ text-decoration: underline;
+}
+
+.installed-results a:focus,
+.search-results a:focus,
+.installed-results a:hover,
+.search-results a:hover {
+ text-decoration: none;
}
pre {
diff --git a/src/static/css/iframe_editor.css b/src/static/css/iframe_editor.css index 3e19cbbe..beec4971 100644 --- a/src/static/css/iframe_editor.css +++ b/src/static/css/iframe_editor.css @@ -17,6 +17,7 @@ ul, ol, li { padding: 0; margin: 0; } + ul { margin-left: 1.5em; } ul ul { margin-left: 0 !important; } ul.list-bullet1 { margin-left: 1.5em; } @@ -38,25 +39,6 @@ ul.list-bullet6 { list-style-type: square; } ul.list-bullet7 { list-style-type: disc; } ul.list-bullet8 { list-style-type: circle; } -ol.list-number1 { margin-left: 1.9em; } -ol.list-number2 { margin-left: 3em; } -ol.list-number3 { margin-left: 4.5em; } -ol.list-number4 { margin-left: 6em; } -ol.list-number5 { margin-left: 7.5em; } -ol.list-number6 { margin-left: 9em; } -ol.list-number7 { margin-left: 10.5em; } -ol.list-number8 { margin-left: 12em; } - -ol { list-style-type: decimal; } -ol.list-number1 { list-style-type: decimal; } -ol.list-number2 { list-style-type: lower-latin; } -ol.list-number3 { list-style-type: lower-roman; } -ol.list-number4 { list-style-type: decimal; } -ol.list-number5 { list-style-type: lower-latin; } -ol.list-number6 { list-style-type: lower-roman; } -ol.list-number7 { list-style-type: decimal; } -ol.list-number8 { list-style-type: lower-latin; } - ul.list-indent1 { margin-left: 1.5em; } ul.list-indent2 { margin-left: 3em; } ul.list-indent3 { margin-left: 4.5em; } @@ -78,7 +60,8 @@ ul.list-indent8 { list-style-type: none; } body { margin: 0; white-space: nowrap; -} + word-wrap: normal; +} #outerdocbody { background-color: #fff; @@ -92,7 +75,8 @@ body.grayedout { background-color: #eee !important } } body.doesWrap { - white-space: normal; + white-space: pre-wrap; /*Must be pre-wrap to keep trailing spaces. Otherwise you get a zombie caret, walking around your screen (see #1766) */ + word-wrap: break-word; /* fix for issue #1648 - firefox not wrapping long lines (without spaces) correctly */ } #innerdocbody { @@ -175,8 +159,6 @@ p { font-family: monospace; /* overridden by lineMetricsDiv.style */ } -#overlaysdiv { position: absolute; left: -1000px; top: -1000px; } - /* Stops super long lines without being spaces such as aaaaaaaaaaaaaa*100 breaking the editor Commented out because it stops IE from being able to render the document, crazy IE bug is crazy. */ /* @@ -184,3 +166,73 @@ p { overflow:hidden; } */ + +ol { + list-style-type: decimal; +} + +ol > li { + display:inline; +} + +/* Set the indentation */ +ol.list-number1{ text-indent: 0px; } +ol.list-number2{ text-indent: 10px; } +ol.list-number3{ text-indent: 20px; } +ol.list-number4{ text-indent: 30px; } +ol.list-number5{ text-indent: 40px; } +ol.list-number6{ text-indent: 50px; } +ol.list-number7{ text-indent: 60px; } +ol.list-number8{ text-indent: 70px; } + +/* Add styling to the first item in a list */ + +.list-start-number1 { counter-reset: first second; } +.list-start-number2 { counter-reset: second; } +.list-start-number3 { counter-reset: third; } +.list-start-number4 { counter-reset: fourth; } +.list-start-number5 { counter-reset: fifth; } +.list-start-number6 { counter-reset: sixth; } +.list-start-number7 { counter-reset: seventh; } +.list-start-number8 { counter-reset: eighth; } + +/* The behavior for incrementing and the prefix */ +.list-number1 li:before { + content: counter(first) ". " ; + counter-increment: first; +} + +.list-number2 li:before { + content: counter(first) "." counter(second) ". "; + counter-increment: second; +} + +.list-number3 li:before { + content: counter(first) "." counter(second) "." counter(third) ". "; + counter-increment: third 1; +} + +.list-number4 li:before { + content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) ". "; + counter-increment: fourth 1; +} + +.list-number5 li:before { + content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) ". "; + counter-increment: fifth 1; +} + +.list-number6 li:before { + content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) ". "; + counter-increment: sixth 1; +} + +.list-number7 li:before { + content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) ". "; + counter-increment: seventh 1; +} + +.list-number8 li:before { + content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(eighth) ". " ; + counter-increment: eighth 1; +} diff --git a/src/static/css/pad.css b/src/static/css/pad.css index e536b925..4053ebba 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -126,6 +126,10 @@ a img { position: relative; top: 1px; } +.toolbar ul li a .buttontext { + color: #222; + font-size: 14px; +} .toolbar ul li a.grouped-left { border-radius: 3px 0 0 3px; } @@ -168,9 +172,9 @@ a img { } #editorcontainer { position: absolute; - width: 100%; top: 37px; /* + 1px border */ left: 0px; + right: 0px; bottom: 0px; z-index: 1; } @@ -559,6 +563,15 @@ table#otheruserstable { margin: 4px 0 0 4px; position: absolute; } +#titlesticky{ + font-size: 10px; + padding-top:2px; + float: right; + text-align: right; + text-decoration: none; + cursor: pointer; + color: #555; +} #titlecross { font-size: 25px; float: right; @@ -576,6 +589,9 @@ table#otheruserstable { margin-right: 3px; margin-top: 2px; } +#exportColumn{ + margin-top:20px; +} .exporttype { margin-top: 4px; background-repeat: no-repeat; @@ -583,6 +599,7 @@ table#otheruserstable { background-image: url("../../static/img/etherpad_lite_icons.png"); color: #333; text-decoration: none; + padding-bottom:2px; } #exporthtml { background-position: 0px -299px @@ -617,9 +634,8 @@ table#otheruserstable { } #importsubmitinput { - height: 25px; - width: 85px; margin-top: 12px; + padding:2px 4px 2px 4px; } #importstatusball { height: 50px @@ -737,8 +753,9 @@ input[type=checkbox] { float: right } .popup { - font-size: 14px; - width: 450px; + font-size: 12px; + width: 80%; + max-width: 500px; padding: 10px; border-radius: 0 0 6px 6px; border: 1px solid #ccc; @@ -795,7 +812,6 @@ input[type=checkbox] { } .column { float: left; - width: 50%; } #settings, #importexport, @@ -828,7 +844,44 @@ input[type=checkbox] { padding: 4px 1px } } -@media screen and (max-width: 400px){ +@media all and (max-width: 400px){ + #gritter-notice-wrapper{ + max-height:172px; + overflow:hidden; + width:100% !important; + background-color: #ccc; + bottom:20px; + left:0px; + right:0px; + color:#000; + } + .gritter-close { + display:block !important; + left: auto !important; + right:5px; + } + #gritter-notice-wrapper.bottom-right{ + left:0px !important; + bottom:30px !important; + right:0px !important; + } + .gritter-item p{ + color:black; + font-size:16px; + } + .gritter-title{ + text-shadow: none !important; + color:black; + } + .gritter-item{ + padding:2px 11px 8px 4px; + } + .gritter-item-wrapper{ + margin:0; + } + .gritter-item-wrapper > div{ + background: none; + } #editorcontainer { top: 68px; } @@ -1018,3 +1071,14 @@ input[type=checkbox] { } /* End of gritter stuff */ +.activeButton{ + background: #eee; + background: -webkit-linear-gradient(#ddd, #fff); + background: -moz-linear-gradient(#ddd, #fff); + background: -o-linear-gradient(#ddd, #fff); + background: -ms-linear-gradient(#ddd, #fff); + background: linear-gradient(#ddd, #fff); + -webkit-box-shadow: 0 0 8px rgba(0,0,0,.1) inset; + -moz-box-shadow: 0 0 8px rgba(0,0,0,.1) inset; + box-shadow: 0 0 8px rgba(0,0,0,.1) inset; +} diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index b3c20184..f97d4f2b 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -157,13 +157,6 @@ #editbarright { float: right } -#returnbutton { - color: #222; - font-size: 16px; - line-height: 29px; - margin-top: 0; - padding-right: 6px; -} #settings, #importexport, #embed, diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index b1604212..355bef4a 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -42,15 +42,15 @@ exports.error = function error(msg) { }; /** - * This method is user for assertions with Messages - * if assert fails, the error function called. + * This method is used for assertions with Messages + * if assert fails, the error function is called. * @param b {boolean} assertion condition * @param msgParts {string} error to be passed if it fails */ exports.assert = function assert(b, msgParts) { if (!b) { var msg = Array.prototype.slice.call(arguments, 1).join(''); - exports.error("exports: " + msg); + exports.error("Failed assertion: " + msg); } }; @@ -281,7 +281,7 @@ exports.checkRep = function (cs) { assem.endDocument(); var normalized = exports.pack(oldLen, calcNewLen, assem.toString(), charBank); - exports.assert(normalized == cs, normalized, ' != ', cs); + exports.assert(normalized == cs, 'Invalid changeset (checkRep failed)'); return cs; } @@ -673,9 +673,9 @@ exports.textLinesMutator = function (lines) { } //print(inSplice+" / "+isCurLineInSplice()+" / "+curSplice[0]+" / "+curSplice[1]+" / "+lines.length); /*if (inSplice && (! isCurLineInSplice()) && (curSplice[0] + curSplice[1] < lines.length)) { - print("BLAH"); - putCurLineInSplice(); - }*/ + print("BLAH"); + putCurLineInSplice(); +}*/ // tests case foo in remove(), which isn't otherwise covered in current impl } //debugPrint("skip"); @@ -1296,7 +1296,7 @@ exports.compose = function (cs1, cs2, pool) { var unpacked2 = exports.unpack(cs2); var len1 = unpacked1.oldLen; var len2 = unpacked1.newLen; - exports.assert(len2 == unpacked2.oldLen, "mismatched composition"); + exports.assert(len2 == unpacked2.oldLen, "mismatched composition of two changesets"); var len3 = unpacked2.newLen; var bankIter1 = exports.stringIterator(unpacked1.charBank); var bankIter2 = exports.stringIterator(unpacked2.charBank); @@ -1504,6 +1504,7 @@ exports.moveOpsToNewPool = function (cs, oldPool, newPool) { return upToDollar.replace(/\*([0-9a-z]+)/g, function (_, a) { var oldNum = exports.parseNum(a); var pair = oldPool.getAttrib(oldNum); + if(!pair) exports.error('Can\'t copy unknown attrib (reference attrib string to non-existant pool entry). Inconsistent attrib state!'); var newNum = newPool.putAttrib(pair); return '*' + exports.numToString(newNum); }) + fromDollar; @@ -1840,14 +1841,6 @@ exports.inverse = function (cs, lines, alines, pool) { } } - function lines_length() { - if ((typeof lines.length) == "number") { - return lines.length; - } else { - return lines.length(); - } - } - function alines_get(idx) { if (alines.get) { return alines.get(idx); @@ -1856,14 +1849,6 @@ exports.inverse = function (cs, lines, alines, pool) { } } - function alines_length() { - if ((typeof alines.length) == "number") { - return alines.length; - } else { - return alines.length(); - } - } - var curLine = 0; var curChar = 0; var curLineOpIter = null; @@ -1882,7 +1867,7 @@ exports.inverse = function (cs, lines, alines, pool) { curLineOpIterLine = curLine; var indexIntoLine = 0; var done = false; - while (!done) { + while (!done && curLineOpIter.hasNext()) { curLineOpIter.next(curLineNextOp); if (indexIntoLine + curLineNextOp.chars >= curChar) { curLineNextOp.chars -= (curChar - indexIntoLine); @@ -2010,7 +1995,7 @@ exports.follow = function (cs1, cs2, reverseInsertOrder, pool) { var unpacked2 = exports.unpack(cs2); var len1 = unpacked1.oldLen; var len2 = unpacked2.oldLen; - exports.assert(len1 == len2, "mismatched follow"); + exports.assert(len1 == len2, "mismatched follow - cannot transform cs1 on top of cs2"); var chars1 = exports.stringIterator(unpacked1.charBank); var chars2 = exports.stringIterator(unpacked2.charBank); @@ -2105,7 +2090,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 @@ -2188,7 +2175,7 @@ exports.composeWithDeletions = function (cs1, cs2, pool) { var unpacked2 = exports.unpack(cs2); var len1 = unpacked1.oldLen; var len2 = unpacked1.newLen; - exports.assert(len2 == unpacked2.oldLen, "mismatched composition"); + exports.assert(len2 == unpacked2.oldLen, "mismatched composition of two changesets"); var len3 = unpacked2.newLen; var bankIter1 = exports.stringIterator(unpacked1.charBank); var bankIter2 = exports.stringIterator(unpacked2.charBank); diff --git a/src/static/js/ace.js b/src/static/js/ace.js index 83ad9447..addc412f 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); @@ -124,6 +124,7 @@ function Ace2Editor() editor.getInInternationalComposition = function() { + if (!loaded) return false; return info.ace_getInInternationalComposition(); }; @@ -221,16 +222,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 +305,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('<link rel="stylesheet" type="text/css" href="data:text/css,"/>', scriptTag(outerScript), '</head><body id="outerdocbody"><div id="sidediv"><!-- --></div><div id="linemetricsdiv">x</div><div id="overlaysdiv"><!-- --></div></body></html>'); + outerHTML.push('<style type="text/css" title="dynamicsyntax"></style>', '<link rel="stylesheet" type="text/css" href="data:text/css,"/>', scriptTag(outerScript), '</head><body id="outerdocbody"><div id="sidediv"><!-- --></div><div id="linemetricsdiv">x</div></body></html>'); 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 2dc6408b..07a9b971 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; @@ -51,11 +51,10 @@ function Ace2Inner(){ var linestylefilter = require('./linestylefilter').linestylefilter; var SkipList = require('./skiplist'); var undoModule = require('./undomodule').undoModule; - var makeVirtualLineView = require('./virtual_lines').makeVirtualLineView; var AttributeManager = require('./AttributeManager'); - + var DEBUG = false; //$$ build script replaces the string "var DEBUG=true;//$$" with "var DEBUG=false;" - // changed to false + // changed to false var isSetUp = false; var THE_TAB = ' '; //4 @@ -79,13 +78,12 @@ function Ace2Inner(){ iframe.ace_outerWin = null; // prevent IE 6 memory leak var sideDiv = iframe.nextSibling; var lineMetricsDiv = sideDiv.nextSibling; - var overlaysdiv = lineMetricsDiv.nextSibling; initLineNumbers(); var outsideKeyDown = noop; - + var outsideKeyPress = function(){return true;}; - + var outsideNotifyDirty = noop; // selFocusAtStart -- determines whether the selection extends "backwards", so that the focus @@ -101,19 +99,19 @@ function Ace2Inner(){ alines: [], apool: new AttribPool() }; - - // lines, alltext, alines, and DOM are set up in setup() + + // lines, alltext, alines, and DOM are set up in init() if (undoModule.enabled) { undoModule.apool = rep.apool; } - var root, doc; // set in setup() + var root, doc; // set in init() var isEditable = true; var doesWrap = true; var hasLineNumbers = true; 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 +120,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 +157,7 @@ function Ace2Inner(){ var textFace = 'monospace'; var textSize = 12; - + function textLineHeight() { @@ -167,12 +165,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,67 +208,89 @@ function Ace2Inner(){ }; editorInfo.ace_getAuthorInfos= getAuthorInfos; - function setAuthorInfo(author, info) + function setAuthorStyle(author, info) { - if ((typeof author) != "string") + 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 })) { - throw new Error("setAuthorInfo: author (" + author + ") is not a string"); + return } + if (!info) { - delete authorInfos[author]; - if (dynamicCSS) - { - dynamicCSS.removeSelectorStyle(getAuthorColorClassSelector(getAuthorClassName(author))); - parentDynamicCSS.removeSelectorStyle(getAuthorColorClassSelector(getAuthorClassName(author))); - } + dynamicCSS.removeSelectorStyle(authorSelector); + parentDynamicCSS.removeSelectorStyle(authorSelector); } else { - authorInfos[author] = info; if (info.bgcolor) { - if (dynamicCSS) + var bgcolor = info.bgcolor; + if ((typeof info.fade) == "number") { - 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; - } + 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") + { + throw new Error("setAuthorInfo: author (" + author + ") is not a string"); + } + if (!info) + { + delete authorInfos[author]; + } + else + { + authorInfos[author] = info; + } + setAuthorStyle(author, info); + } + function getAuthorClassName(author) { return "author-" + author.replace(/[^a-y0-9]/g, function(c) @@ -322,19 +344,6 @@ function Ace2Inner(){ } } - function boldColorFromColor(lightColorCSS) - { - var color = colorutils.css2triple(lightColorCSS); - - // amp up the saturation to full - color = colorutils.saturate(color); - - // normalize brightness based on luminosity - color = colorutils.scaleColor(color, 0, 0.5 / colorutils.luminosity(color)); - - return colorutils.triple2css(color); - } - function fadeColor(colorCSS, fadeFrac) { var color = colorutils.css2triple(colorCSS); @@ -527,22 +536,6 @@ function Ace2Inner(){ } editorInfo.ace_inCallStackIfNecessary = inCallStackIfNecessary; - function recolorLineByKey(key) - { - if (rep.lines.containsKey(key)) - { - var offset = rep.lines.offsetOfKey(key); - var width = rep.lines.atKey(key).width; - recolorLinesInRange(offset, offset + width); - } - } - - function getLineKeyForOffset(charOffset) - { - return rep.lines.atOffset(charOffset).key; - } - - function dispose() { disposed = true; @@ -897,14 +890,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 +923,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 +945,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 +958,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) } @@ -1013,6 +1006,11 @@ function Ace2Inner(){ return caughtErrors.slice(); }; + editorInfo.ace_getDocument = function() + { + return doc; + }; + editorInfo.ace_getDebugProperty = function(prop) { if (prop == "debugger") @@ -1072,7 +1070,7 @@ function Ace2Inner(){ return false; } }; - + isTimeUp.elapsed = function() { return now() - startTime; @@ -1144,34 +1142,6 @@ function Ace2Inner(){ } editorInfo.ace_fastIncorp = fastIncorp; - function incorpIfQuick() - { - var me = incorpIfQuick; - var failures = (me.failures || 0); - if (failures < 5) - { - var isTimeUp = newTimeLimit(40); - var madeChanges = incorporateUserChanges(isTimeUp); - if (isTimeUp()) - { - me.failures = failures + 1; - } - return true; - } - else - { - var skipCount = (me.skipCount || 0); - skipCount++; - if (skipCount == 20) - { - skipCount = 0; - me.failures = 0; - } - me.skipCount = skipCount; - } - return false; - } - var idleWorkTimer = makeIdleAction(function() { @@ -1453,7 +1423,7 @@ function Ace2Inner(){ var p = PROFILER("getSelection", false); var selection = getSelection(); p.end(); - + function topLevel(n) { if ((!n) || n == root) return null; @@ -1463,7 +1433,7 @@ function Ace2Inner(){ } return n; } - + if (selection) { var node1 = topLevel(selection.startPoint.node); @@ -1698,7 +1668,7 @@ function Ace2Inner(){ { //var id = n.uniqueId(); // parent of n may not be "root" in IE due to non-tree-shaped DOM (wtf) - n.parentNode.removeChild(n); + if(n.parentNode) n.parentNode.removeChild(n); //dmesg(htmlPrettyEscape(htmlForRemovedChild(n))); //console.log("removed: "+id); @@ -1721,7 +1691,7 @@ function Ace2Inner(){ root:root, point:selection.startPoint, documentAttributeManager: documentAttributeManager - }); + }); selStart = (selStartFromHook==null||selStartFromHook.length==0)?getLineAndCharForPoint(selection.startPoint):selStartFromHook; } if (selection && !selEnd) @@ -1734,7 +1704,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 @@ -1755,7 +1725,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"); @@ -1778,13 +1748,6 @@ function Ace2Inner(){ return domChanges; } - function htmlForRemovedChild(n) - { - var div = doc.createElement("DIV"); - div.appendChild(n); - return div.innerHTML; - } - var STYLE_ATTRIBS = { bold: true, italic: true, @@ -1890,19 +1853,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 @@ -2331,8 +2294,8 @@ function Ace2Inner(){ documentAttributeManager.setAttributesOnRange(lineAndColumnFromChar(start), lineAndColumnFromChar(end), attribs); } editorInfo.ace_performDocumentApplyAttributesToCharRange = performDocumentApplyAttributesToCharRange; - - + + function setAttributeOnSelection(attributeName, attributeValue) { if (!(rep.selStart && rep.selEnd)) return; @@ -2343,6 +2306,76 @@ function Ace2Inner(){ } editorInfo.ace_setAttributeOnSelection = setAttributeOnSelection; + function getAttributeOnSelection(attributeName){ + if (!(rep.selStart && rep.selEnd)) return; + var selectionAllHasIt = true; + var withIt = Changeset.makeAttribsString('+', [ + [attributeName, 'true'] + ], rep.apool); + var withItRegex = new RegExp(withIt.replace(/\*/g, '\\*') + "(\\*|$)"); + + function hasIt(attribs) + { + return withItRegex.test(attribs); + } + + var selStartLine = rep.selStart[0]; + var selEndLine = rep.selEnd[0]; + for (var n = selStartLine; n <= selEndLine; n++) + { + var opIter = Changeset.opIterator(rep.alines[n]); + var indexIntoLine = 0; + var selectionStartInLine = 0; + var selectionEndInLine = rep.lines.atIndex(n).text.length; // exclude newline + if(rep.lines.atIndex(n).text.length == 0){ + return false; // If the line length is 0 we basically treat it as having no formatting + } + if(rep.selStart[1] == rep.selEnd[1] && rep.selStart[1] == rep.lines.atIndex(n).text.length){ + return false; // If we're at the end of a line we treat it as having no formatting + } + if(rep.selStart[1] == 0 && rep.selEnd[1] == 0){ + rep.selEnd[1] == 1; + } + if(rep.selEnd[1] == -1){ + rep.selEnd[1] = 1; // sometimes rep.selEnd is -1, not sure why.. When it is we should look at the first char + } + if (n == selStartLine) + { + selectionStartInLine = rep.selStart[1]; + } + if (n == selEndLine) + { + selectionEndInLine = rep.selEnd[1]; + } + while (opIter.hasNext()) + { + var op = opIter.next(); + var opStartInLine = indexIntoLine; + var opEndInLine = opStartInLine + op.chars; + if (!hasIt(op.attribs)) + { + // does op overlap selection? + if (!(opEndInLine <= selectionStartInLine || opStartInLine >= selectionEndInLine)) + { + selectionAllHasIt = false; + break; + } + } + indexIntoLine = opEndInLine; + } + if (!selectionAllHasIt) + { + break; + } + } + if(selectionAllHasIt){ + return true; + }else{ + return false; + } + } + editorInfo.ace_getAttributeOnSelection = getAttributeOnSelection; + function toggleAttributeOnSelection(attributeName) { if (!(rep.selStart && rep.selEnd)) return; @@ -2895,7 +2928,7 @@ function Ace2Inner(){ { if (lineClass !== null) lineElem.className = lineClass; }; - + result.prepareForAdd = writeClass; result.finishUpdate = writeClass; result.getInnerHTML = function() @@ -3257,7 +3290,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)) { @@ -3293,7 +3326,7 @@ function Ace2Inner(){ { return; } - + var lineNum = rep.selStart[0]; var listType = getLineListType(lineNum); @@ -3418,9 +3451,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 @@ -3495,7 +3528,7 @@ function Ace2Inner(){ return !!REGEX_WORDCHAR.exec(c); } editorInfo.ace_isWordChar = isWordChar; - + function isSpaceChar(c) { return !!REGEX_SPACE.exec(c); @@ -3644,6 +3677,11 @@ function Ace2Inner(){ if ((!specialHandled) && isTypeForCmdKey && String.fromCharCode(which).toLowerCase() == "s" && (evt.metaKey || evt.ctrlKey)) /* Do a saved revision on ctrl S */ { evt.preventDefault(); + var originalBackground = parent.parent.$('#revisionlink').css("background") + parent.parent.$('#revisionlink').css({"background":"lightyellow"}); + scheduler.setTimeout(function(){ + parent.parent.$('#revisionlink').css({"background":originalBackground}); + }, 1000); parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ specialHandled = true; } @@ -3711,7 +3749,11 @@ function Ace2Inner(){ doDeleteKey(); specialHandled = true; } - if((evt.which == 33 || evt.which == 34) && type == 'keydown'){ + if((evt.which == 36 && evt.ctrlKey == true)){ setScrollY(0); } // Control Home send to Y = 0 + if((evt.which == 33 || evt.which == 34) && type == 'keydown' && !evt.ctrlKey){ + + evt.preventDefault(); // This is required, browsers will try to do normal default behavior on page up / down and the default behavior SUCKS + var oldVisibleLineRange = getVisibleLineRange(); var topOffset = rep.selStart[0] - oldVisibleLineRange[0]; if(topOffset < 0 ){ @@ -3722,62 +3764,89 @@ function Ace2Inner(){ var isPageUp = evt.which === 33; scheduler.setTimeout(function(){ - var newVisibleLineRange = getVisibleLineRange(); - var linesCount = rep.lines.length(); + var newVisibleLineRange = getVisibleLineRange(); // the visible lines IE 1,10 + var linesCount = rep.lines.length(); // total count of lines in pad IE 10 + var numberOfLinesInViewport = newVisibleLineRange[1] - newVisibleLineRange[0]; // How many lines are in the viewport right now? - var newCaretRow = rep.selStart[0]; if(isPageUp){ - newCaretRow = oldVisibleLineRange[0]; + rep.selEnd[0] = rep.selEnd[0] - numberOfLinesInViewport; // move to the bottom line +1 in the viewport (essentially skipping over a page) + rep.selStart[0] = rep.selStart[0] - numberOfLinesInViewport; // move to the bottom line +1 in the viewport (essentially skipping over a page) } - if(isPageDown){ - newCaretRow = newVisibleLineRange[0] + topOffset; + if(isPageDown){ // if we hit page down + if(rep.selEnd[0] >= oldVisibleLineRange[0]){ // If the new viewpoint position is actually further than where we are right now + rep.selStart[0] = oldVisibleLineRange[1] -1; // dont go further in the page down than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content + rep.selEnd[0] = oldVisibleLineRange[1] -1; // dont go further in the page down than what's visible IE go from 0 to 50 if 50 is visible on screen but dont go below that else we miss content + } } //ensure min and max - if(newCaretRow < 0){ - newCaretRow = 0; + if(rep.selEnd[0] < 0){ + rep.selEnd[0] = 0; } - if(newCaretRow >= linesCount){ - newCaretRow = linesCount-1; + if(rep.selStart[0] < 0){ + rep.selStart[0] = 0; + } + if(rep.selEnd[0] >= linesCount){ + rep.selEnd[0] = linesCount-1; } - - rep.selStart[0] = newCaretRow; - rep.selEnd[0] = newCaretRow; updateBrowserSelectionFromRep(); + var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop | myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214 + // top.console.log(caretOffsetTop); + setScrollY(caretOffsetTop); // set the scrollY offset of the viewport on the document + }, 200); } - /* Attempt to apply some sanity to cursor handling in Chrome after a copy / paste event We have to do this the way we do because rep. doesn't hold the value for keyheld events IE if the user - presses and holds the arrow key */ + presses and holds the arrow key .. Sorry if this is ugly, blame Chrome's weird handling of viewports after new content is added*/ if((evt.which == 37 || evt.which == 38 || evt.which == 39 || evt.which == 40) && $.browser.chrome){ - - var newVisibleLineRange = getVisibleLineRange(); // get the current visible range -- This works great. - var lineHeight = textLineHeight(); // what Is the height of each line? + var viewport = getViewPortTopBottom(); var myselection = document.getSelection(); // get the current caret selection, can't use rep. here because that only gives us the start position not the current - var caretOffsetTop = myselection.focusNode.parentNode.offsetTop; // get the carets selection offset in px IE 214 + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop || myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214 + var lineHeight = $(myselection.focusNode.parentNode).parent("div").height(); // get the line height of the caret line + // top.console.log("offsetTop", myselection.focusNode.parentNode.parentNode.offsetTop); + try { + lineHeight = $(myselection.focusNode).height() // needed for how chrome handles line heights of null objects + // console.log("lineHeight now", lineHeight); + }catch(e){} + var caretOffsetTopBottom = caretOffsetTop + lineHeight; + var visibleLineRange = getVisibleLineRange(); // the visible lines IE 1,10 if(caretOffsetTop){ // sometimes caretOffsetTop bugs out and returns 0, not sure why, possible Chrome bug? Either way if it does we don't wanna mess with it - var lineNum = Math.round(caretOffsetTop / lineHeight) ; // Get the current Line Number IE 84 - newVisibleLineRange[1] = newVisibleLineRange[1]-1; - var caretIsVisible = (lineNum > newVisibleLineRange[0] && lineNum < newVisibleLineRange[1]); // Is the cursor in the visible Range IE ie 84 > 14 and 84 < 90? + // top.console.log(caretOffsetTop, viewport.top, caretOffsetTopBottom, viewport.bottom); + var caretIsNotVisible = (caretOffsetTop < viewport.top || caretOffsetTopBottom >= viewport.bottom); // Is the Caret Visible to the user? + // Expect some weird behavior caretOffsetTopBottom is greater than viewport.bottom on a keypress down + var offsetTopSamePlace = caretOffsetTop == viewport.top; // sometimes moving key left & up leaves the caret at the same point as the viewport.top, technically the caret is visible but it's not fully visible so we should move to it + if(offsetTopSamePlace && (evt.which == 37 || evt.which == 38)){ + var newY = caretOffsetTop; + setScrollY(newY); + } - if(!caretIsVisible){ // is the cursor no longer visible to the user? + if(caretIsNotVisible){ // is the cursor no longer visible to the user? + // top.console.log("Caret is NOT visible to the user"); + // top.console.log(caretOffsetTop,viewport.top,caretOffsetTopBottom,viewport.bottom); // Oh boy the caret is out of the visible area, I need to scroll the browser window to lineNum. - // Get the new Y by getting the line number and multiplying by the height of each line. - if(evt.which == 37 || evt.which == 38){ // If left or up - var newY = lineHeight * (lineNum -1); // -1 to go to the line above - }else if(evt.which == 39 || evt.which == 40){ // if down or right - var newY = getScrollY() + (lineHeight*3); // the offset and one additional line + if(evt.which == 37 || evt.which == 38){ // If left or up arrow + var newY = caretOffsetTop; // That was easy! + } + if(evt.which == 39 || evt.which == 40){ // if down or right arrow + // only move the viewport if we're at the bottom of the viewport, if we hit down any other time the viewport shouldn't change + // NOTE: This behavior only fires if Chrome decides to break the page layout after a paste, it's annoying but nothing I can do + var selection = getSelection(); + top.console.log("line #", rep.selStart[0]); // the line our caret is on + top.console.log("firstvisible", visibleLineRange[0]); // the first visiblel ine + top.console.log("lastVisible", visibleLineRange[1]); // the last visible line + top.console.log(rep.selStart[0], visibleLineRange[1], rep.selStart[0], visibleLineRange[0]); + var newY = viewport.top + lineHeight; + } + if(newY){ + setScrollY(newY); // set the scrollY offset of the viewport on the document } - setScrollY(newY); // set the scroll height of the browser } - } - } - } if (type == "keydown") @@ -3797,7 +3866,7 @@ function Ace2Inner(){ } else if (type == "keyup") { - var wait = 200; + var wait = 0; idleWorkTimer.atLeast(wait); idleWorkTimer.atMost(wait); } @@ -3817,7 +3886,7 @@ function Ace2Inner(){ if ((!specialHandled) && (!thisKeyDoesntTriggerNormalize) && (!inInternationalComposition)) { - if (type != "keyup" || !incorpIfQuick()) + if (type != "keyup") { observeChangesAroundSelection(); } @@ -3885,6 +3954,7 @@ function Ace2Inner(){ selection.focusAtStart = !! rep.selFocusAtStart; setSelection(selection); } + editorInfo.ace_updateBrowserSelectionFromRep = updateBrowserSelectionFromRep; function nodeMaxIndex(nd) { @@ -4096,7 +4166,7 @@ function Ace2Inner(){ maxIndex: tn.nodeValue.length }; }; - + var selection = {}; if (origSelectionRange.compareEndPoints("StartToEnd", origSelectionRange) === 0) { @@ -4122,7 +4192,7 @@ function Ace2Inner(){ selection.startPoint.index+" / "+ selection.endPoint.node.uniqueId()+","+ selection.endPoint.index); - }*/ +}*/ } return selection; } @@ -4200,7 +4270,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; } @@ -4768,54 +4838,6 @@ function Ace2Inner(){ else $(elem).removeClass(className); } - function setup() - { - doc = document; // defined as a var in scope outside - inCallStackIfNecessary("setup", function() - { - var body = doc.getElementById("innerdocbody"); - root = body; // defined as a var in scope outside - if (browser.mozilla) addClass(root, "mozilla"); - if (browser.safari) addClass(root, "safari"); - if (browser.msie) addClass(root, "msie"); - if (browser.msie) - { - // cache CSS background images - try - { - doc.execCommand("BackgroundImageCache", false, true); - } - catch (e) - { /* throws an error in some IE 6 but not others! */ - } - } - setClassPresence(root, "authorColors", true); - setClassPresence(root, "doesWrap", doesWrap); - - initDynamicCSS(); - - enforceEditability(); - - // set up dom and rep - while (root.firstChild) root.removeChild(root.firstChild); - var oneEntry = createDomLineEntry(""); - doRepLineSplice(0, rep.lines.length(), [oneEntry]); - insertDomLines(null, [oneEntry.domInfo], null); - rep.alines = Changeset.splitAttributionLines( - Changeset.makeAttribution("\n"), "\n"); - - bindTheEventHandlers(); - - }); - - scheduler.setTimeout(function() - { - parent.readyFunc(); // defined in code that sets up the inner iframe - }, 0); - - isSetUp = true; - } - function focus() { window.focus(); @@ -4965,9 +4987,9 @@ function Ace2Inner(){ } } } - + var listAttributeName = 'list'; - + function getLineListType(lineNum) { return documentAttributeManager.getAttributeOnLine(lineNum, listAttributeName) @@ -4980,7 +5002,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 @@ -4990,7 +5012,7 @@ function Ace2Inner(){ renumberList(lineNum); } } - + function renumberList(lineNum){ //1-check we are in a list var type = getLineListType(lineNum); @@ -5003,7 +5025,7 @@ function Ace2Inner(){ { return null; } - + //2-find the first line of the list while(lineNum-1 >= 0 && (type=getLineListType(lineNum-1))) { @@ -5012,7 +5034,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()); @@ -5039,7 +5061,7 @@ function Ace2Inner(){ ChangesetUtils.buildKeepRange(rep, builder, loc, (loc = [line, 1]), [ ['start', position] ], rep.apool); - + position++; line++; } @@ -5054,19 +5076,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) { @@ -5104,12 +5126,12 @@ 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]); }); } - + function doInsertUnorderedList(){ doInsertList('bullet'); } @@ -5118,7 +5140,7 @@ function Ace2Inner(){ } editorInfo.ace_doInsertUnorderedList = doInsertUnorderedList; editorInfo.ace_doInsertOrderedList = doInsertOrderedList; - + var lineNumbersShown; var sideDivInner; @@ -5134,11 +5156,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) { @@ -5146,7 +5168,6 @@ function Ace2Inner(){ { if(n > lineNumbersShown) //all updated, break break; - var h = (b.clientHeight || b.offsetHeight); if (b.nextSibling) { @@ -5168,8 +5189,8 @@ function Ace2Inner(){ b = b.nextSibling; n++; } - } - + } + if (newNumLines != lineNumbersShown) { var container = sideDivInner; @@ -5179,21 +5200,27 @@ function Ace2Inner(){ { lineNumbersShown++; var n = lineNumbersShown; - var div = odoc.createElement("DIV"); + var div = odoc.createElement("DIV"); //calculate height for new line number - var h = (b.clientHeight || b.offsetHeight); - - if (b.nextSibling) - h = b.nextSibling.offsetTop - b.offsetTop; - - if(h) // apply style to div + 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); - b = b.nextSibling; + if(b){ + b = b.nextSibling; + } } - + container.appendChild(fragment); while (lineNumbersShown > newNumLines) { @@ -5202,8 +5229,8 @@ function Ace2Inner(){ } } } - - + + // Init documentAttributeManager documentAttributeManager = new AttributeManager(rep, performDocumentApplyChangeset); editorInfo.ace_performDocumentApplyAttributesToRange = function () { @@ -5249,13 +5276,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/admin/plugins.js b/src/static/js/admin/plugins.js index a973875c..e6c7a122 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -12,176 +12,270 @@ $(document).ready(function () { //connect socket = io.connect(url, {resource : resource}).of("/pluginfw/installer"); - $('.search-results').data('query', { - pattern: '', - offset: 0, - limit: 12, - }); + function search(searchTerm, limit) { + if(search.searchTerm != searchTerm) { + search.offset = 0 + search.results = [] + search.end = false + } + limit = limit? limit : search.limit + search.searchTerm = searchTerm; + socket.emit("search", {searchTerm: searchTerm, offset:search.offset, limit: limit, sortBy: search.sortBy, sortDir: search.sortDir}); + search.offset += limit; + + $('#search-progress').show() + search.messages.show('fetching') + storeScrollPosition() + search.searching = true + } + search.searching = false; + search.offset = 0; + search.limit = 25; + search.results = []; + search.sortBy = 'name'; + search.sortDir = /*DESC?*/true; + search.end = true;// have we received all results already? + search.messages = { + show: function(msg) { + //$('.search-results .messages').show() + $('.search-results .messages .'+msg+'').show() + $('.search-results .messages .'+msg+' *').show() + }, + hide: function(msg) { + //$('.search-results .messages').hide() + $('.search-results .messages .'+msg+'').hide() + $('.search-results .messages .'+msg+' *').hide() + } + } - var doUpdate = false; + var installed = { + progress: { + show: function(plugin, msg) { + $('.installed-results .'+plugin+' .progress').show() + $('.installed-results .'+plugin+' .progress .message').text(msg) + if($(window).scrollTop() > $('.'+plugin).offset().top)$(window).scrollTop($('.'+plugin).offset().top-100) + }, + hide: function(plugin) { + $('.installed-results .'+plugin+' .progress').hide() + $('.installed-results .'+plugin+' .progress .message').text('') + } + }, + messages: { + show: function(msg) { + $('.installed-results .messages').show() + $('.installed-results .messages .'+msg+'').show() + }, + hide: function(msg) { + $('.installed-results .messages').hide() + $('.installed-results .messages .'+msg+'').hide() + } + }, + list: [] + } - var search = function () { - socket.emit("search", $('.search-results').data('query')); - tasks++; + function displayPluginList(plugins, container, template) { + plugins.forEach(function(plugin) { + var row = template.clone(); + + for (attr in plugin) { + if(attr == "name"){ // Hack to rewrite URLS into name + row.find(".name").html("<a target='_blank' title='Plugin details' href='https://npmjs.org/package/"+plugin['name']+"'>"+plugin['name'].substr(3)+"</a>"); // remove 'ep_' + }else{ + row.find("." + attr).text(plugin[attr]); + } + } + row.find(".version").html( plugin.version ); + row.addClass(plugin.name) + row.data('plugin', plugin.name) + container.append(row); + }) + updateHandlers(); + } + + function sortPluginList(plugins, property, /*ASC?*/dir) { + return plugins.sort(function(a, b) { + if (a[property] < b[property]) + return dir? -1 : 1; + if (a[property] > b[property]) + return dir? 1 : -1; + // a must be equal to b + return 0; + }) + } + + // Infinite scroll + var scrollPosition + function storeScrollPosition() { + scrollPosition = $(window).scrollTop() + } + function restoreScrollPosition() { + setTimeout(function() { + $(window).scrollTop(scrollPosition) + }, 0) + } + + $(window).scroll(checkInfiniteScroll) + function checkInfiniteScroll() { + if(search.end || search.searching) return;// don't keep requesting if there are no more results + setTimeout(function() { + try{ + var top = $('.results>tr:last').offset().top + if($(window).scrollTop()+$(window).height() > top) search(search.searchTerm) + }catch(e){} + }, 1) } function updateHandlers() { - $("form").submit(function(){ - var query = $('.search-results').data('query'); - query.pattern = $("#search-query").val(); - query.offset = 0; - search(); - return false; - }); - + // Search $("#search-query").unbind('keyup').keyup(function () { - var query = $('.search-results').data('query'); - query.pattern = $("#search-query").val(); - query.offset = 0; - search(); + search($("#search-query").val()); }); + // update & install $(".do-install, .do-update").unbind('click').click(function (e) { - var row = $(e.target).closest("tr"); - doUpdate = true; - socket.emit("install", row.find(".name").text()); - tasks++; + var $row = $(e.target).closest("tr") + , plugin = $row.data('plugin'); + if($(this).hasClass('do-install')) { + $row.remove().appendTo('#installed-plugins') + installed.progress.show(plugin, 'Installing') + }else{ + installed.progress.show(plugin, 'Updating') + } + socket.emit("install", plugin); + installed.messages.hide("nothing-installed") }); + // uninstall $(".do-uninstall").unbind('click').click(function (e) { - var row = $(e.target).closest("tr"); - doUpdate = true; - socket.emit("uninstall", row.find(".name").text()); - tasks++; + var $row = $(e.target).closest("tr") + , pluginName = $row.data('plugin'); + socket.emit("uninstall", pluginName); + installed.progress.show(pluginName, 'Uninstalling') + installed.list = installed.list.filter(function(plugin) { + return plugin.name != pluginName + }) }); - $(".do-prev-page").unbind('click').click(function (e) { - var query = $('.search-results').data('query'); - query.offset -= query.limit; - if (query.offset < 0) { - query.offset = 0; - } - search(); - }); - $(".do-next-page").unbind('click').click(function (e) { - var query = $('.search-results').data('query'); - var total = $('.search-results').data('total'); - if (query.offset + query.limit < total) { - query.offset += query.limit; - } - search(); - }); + // Sort + $('.sort.up').unbind('click').click(function() { + search.sortBy = $(this).text().toLowerCase(); + search.sortDir = false; + search.offset = 0; + search(search.searchTerm, search.results.length); + search.results = []; + }) + $('.sort.down, .sort.none').unbind('click').click(function() { + search.sortBy = $(this).text().toLowerCase(); + search.sortDir = true; + search.offset = 0; + search(search.searchTerm, search.results.length); + search.results = []; + }) } - updateHandlers(); - - var tasks = 0; - socket.on('progress', function (data) { - $("#progress").show(); - $('#progress').data('progress', data.progress); - - var message = "Unknown status"; - if (data.message) { - message = data.message.toString(); - } - if (data.error) { - data.progress = 1; - } + socket.on('results:search', function (data) { + if(!data.results.length) search.end = true; + search.messages.hide('nothing-found') + search.messages.hide('fetching') + $("#search-query").removeAttr('disabled') - $("#progress .message").html(message); - - if (data.progress >= 1) { - tasks--; - if (tasks <= 0) { - // Hide the activity indicator once all tasks are done - $("#progress").hide(); - tasks = 0; - } - - if (data.error) { - alert('An error occurred: '+data.error+' -- the server log might know more...'); - }else { - if (doUpdate) { - doUpdate = false; - socket.emit("load"); - tasks++; - } - } - } - }); + console.log('got search results', data) - socket.on('search-result', function (data) { - var widget=$(".search-results"); + // add to results + search.results = search.results.concat(data.results); - widget.data('query', data.query); - widget.data('total', data.total); + // Update sorting head + $('.sort') + .removeClass('up down') + .addClass('none'); + $('.search-results thead th[data-label='+data.query.sortBy+']') + .removeClass('none') + .addClass(data.query.sortDir? 'up' : 'down'); - widget.find('.offset').html(data.query.offset); - if (data.query.offset + data.query.limit > data.total){ - widget.find('.limit').html(data.total); - }else{ - widget.find('.limit').html(data.query.offset + data.query.limit); + // re-render search results + var searchWidget = $(".search-results"); + searchWidget.find(".results *").remove(); + if(search.results.length > 0) { + displayPluginList(search.results, searchWidget.find(".results"), searchWidget.find(".template tr")) + }else { + search.messages.show('nothing-found') } - widget.find('.total').html(data.total); + search.messages.hide('fetching') + $('#search-progress').hide() + restoreScrollPosition() + checkInfiniteScroll() + search.searching = false + }); - widget.find(".results *").remove(); - for (plugin_name in data.results) { - var plugin = data.results[plugin_name]; - var row = widget.find(".template tr").clone(); - - for (attr in plugin) { - if(attr == "name"){ // Hack to rewrite URLS into name - row.find(".name").html("<a target='_blank' href='https://npmjs.org/package/"+plugin['name']+"'>"+plugin[attr]+"</a>"); - }else{ - row.find("." + attr).html(plugin[attr]); - } - } - row.find(".version").html( data.results[plugin_name]['dist-tags'].latest ); - - widget.find(".results").append(row); - } + socket.on('results:installed', function (data) { + installed.messages.hide("fetching") + installed.messages.hide("nothing-installed") - updateHandlers(); - }); + installed.list = data.installed + sortPluginList(installed.list, 'name', /*ASC?*/true); - socket.on('installed-results', function (data) { - $("#installed-plugins *").remove(); + // filter out epl + installed.list = installed.list.filter(function(plugin) { + return plugin.name != 'ep_etherpad-lite' + }) - for (plugin_name in data.results) { - if (plugin_name == "ep_etherpad-lite") continue; // Hack... - var plugin = data.results[plugin_name]; - var row = $("#installed-plugin-template").clone(); + // remove all installed plugins (leave plugins that are still being installed) + installed.list.forEach(function(plugin) { + $('#installed-plugins .'+plugin.name).remove() + }) - for (attr in plugin.package) { - if(attr == "name"){ // Hack to rewrite URLS into name - row.find(".name").html("<a target='_blank' href='https://npmjs.org/package/"+plugin.package['name']+"'>"+plugin.package[attr]+"</a>"); - }else{ - row.find("." + attr).html(plugin.package[attr]); - } - } - $("#installed-plugins").append(row); + if(installed.list.length > 0) { + displayPluginList(installed.list, $("#installed-plugins"), $("#installed-plugin-template")); + socket.emit('checkUpdates'); + }else { + installed.messages.show("nothing-installed") } - updateHandlers(); - - socket.emit('checkUpdates'); - tasks++; }); - socket.on('updatable', function(data) { - $('#installed-plugins>tr').each(function(i,tr) { - var pluginName = $(tr).find('.name').text() - - if (data.updatable.indexOf(pluginName) >= 0) { - var actions = $(tr).find('.actions') - actions.append('<input class="do-update" type="button" value="Update" />') - actions.css('width', 200) - } + socket.on('results:updatable', function(data) { + data.updatable.forEach(function(pluginName) { + var $row = $('#installed-plugins > tr.'+pluginName) + , actions = $row.find('.actions') + actions.append('<input class="do-update" type="button" value="Update" />') }) updateHandlers(); }) - socket.emit("load"); - tasks++; - - search(); + socket.on('finished:install', function(data) { + if(data.error) { + alert('An error occured while installing '+data.plugin+' \n'+data.error) + $('#installed-plugins .'+data.plugin).remove() + } + + socket.emit("getInstalled"); + + // update search results + search.offset = 0; + search(search.searchTerm, search.results.length); + search.results = []; + }) + + socket.on('finished:uninstall', function(data) { + if(data.error) alert('An error occured while uninstalling the '+data.plugin+' \n'+data.error) + + // remove plugin from installed list + $('#installed-plugins .'+data.plugin).remove() + + socket.emit("getInstalled"); + + // update search results + search.offset = 0; + search(search.searchTerm, search.results.length); + search.results = []; + }) + + // init + updateHandlers(); + socket.emit("getInstalled"); + search(''); + + // check for updates every 5mins + setInterval(function() { + socket.emit('checkUpdates'); + }, 1000*60*5) }); diff --git a/src/static/js/admin/settings.js b/src/static/js/admin/settings.js index ebe4a25a..fb3f2e97 100644 --- a/src/static/js/admin/settings.js +++ b/src/static/js/admin/settings.js @@ -55,6 +55,8 @@ $(document).ready(function () { function isJSONClean(data){ var cleanSettings = JSON.minify(data); + // this is a bit naive. In theory some key/value might contain the sequences ',]' or ',}' + cleanSettings = cleanSettings.replace(",]","]").replace(",}","}"); try{ var response = jQuery.parseJSON(cleanSettings); } diff --git a/src/static/js/broadcast.js b/src/static/js/broadcast.js index 6bd135bd..d4bda111 100644 --- a/src/static/js/broadcast.js +++ b/src/static/js/broadcast.js @@ -77,7 +77,6 @@ function loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, Bro } - var socketId; //var socket; var channelState = "DISCONNECTED"; diff --git a/src/static/js/broadcast_slider.js b/src/static/js/broadcast_slider.js index 9427c191..8179b7b5 100644 --- a/src/static/js/broadcast_slider.js +++ b/src/static/js/broadcast_slider.js @@ -198,11 +198,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) }); if (numAnonymous > 0) { - var anonymousAuthorString; - if(numAnonymous == 1) - anonymousAuthorString = html10n.get("timeslider.unnamedauthor", { num: numAnonymous }); - else - anonymousAuthorString = html10n.get("timeslider.unnamedauthors", { num: numAnonymous }); + var anonymousAuthorString = html10n.get("timeslider.unnamedauthors", { num: numAnonymous }); if (numNamed !== 0){ authorsList.append(' + ' + anonymousAuthorString); @@ -465,10 +461,10 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) var startPos = clientVars.collab_client_vars.rev; if(window.location.hash.length > 1) { - var hashRev = Number(window.location.hash.substr(1)); - if(!isNaN(hashRev)) - { - // this is necessary because of the socket.io-event which loads the changesets + var hashRev = Number(window.location.hash.substr(1)); + if(!isNaN(hashRev)) + { + // this is necessary because of the socket.io-event which loads the changesets setTimeout(function() { setSliderPosition(hashRev); }, 1); } } diff --git a/src/static/js/changesettracker.js b/src/static/js/changesettracker.js index 58ef21cb..f3efc407 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,6 +162,55 @@ 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<n; i++) + if (i in this) + action.call(that, this[i], i, this); + }; + } + + // Get my authorID + var authorId = parent.parent.pad.myUserInfo.userId; + + // Sanitize authorship + // We need to replace all author attribs with thisSession.author, in case they copy/pasted or otherwise inserted other peoples changes + if(apool.numToAttrib){ + for (var attr in apool.numToAttrib){ + if (apool.numToAttrib[attr][0] == 'author' && apool.numToAttrib[attr][1] == authorId) authorAttr = Number(attr).toString(36) + } + + // Replace all added 'author' attribs with the value of the current user + var cs = Changeset.unpack(userChangeset) + , iterator = Changeset.opIterator(cs.ops) + , op + , assem = Changeset.mergingOpAssembler(); + + while(iterator.hasNext()) { + op = iterator.next() + if(op.opcode == '+') { + var newAttrs = '' + + op.attribs.split('*').forEach(function(attrNum) { + if(!attrNum) return + var attr = apool.getAttrib(parseInt(attrNum, 36)) + if(!attr) return + if('author' == attr[0]) { + // replace that author with the current one + newAttrs += '*'+authorAttr; + } + else newAttrs += '*'+attrNum // overtake all other attribs as is + }) + op.attribs = newAttrs + } + assem.append(op) + } + assem.endDocument(); + userChangeset = Changeset.pack(cs.oldLen, cs.newLen, assem.toString(), cs.charBank) + Changeset.checkRep(userChangeset) + } if (Changeset.isIdentity(userChangeset)) toSubmit = null; else toSubmit = userChangeset; } diff --git a/src/static/js/chat.js b/src/static/js/chat.js index 83a487de..65fc8dd9 100644 --- a/src/static/js/chat.js +++ b/src/static/js/chat.js @@ -17,6 +17,7 @@ var padutils = require('./pad_utils').padutils; var padcookie = require('./pad_cookie').padcookie; var Tinycon = require('tinycon/tinycon'); +var hooks = require('./pluginfw/hooks'); var chat = (function() { @@ -41,13 +42,15 @@ var chat = (function() padcookie.setPref("chatAlwaysVisible", true); $('#chatbox').addClass("stickyChat"); $('#chattext').css({"top":"0px"}); - $('#editorcontainer').css({"right":"192px", "width":"auto"}); + $('#editorcontainer').css({"right":"192px"}); + $('.stickyChat').css("top",$('#editorcontainer').offset().top+"px"); isStuck = true; } else { // Unstick it padcookie.setPref("chatAlwaysVisible", false); + $('.stickyChat').css("top", "auto"); $('#chatbox').removeClass("stickyChat"); $('#chattext').css({"top":"25px"}); - $('#editorcontainer').css({"right":"0px", "width":"100%"}); + $('#editorcontainer').css({"right":"0px"}); isStuck = false; } }, @@ -77,7 +80,7 @@ var chat = (function() $("#chatinput").val(""); }, addMessage: function(msg, increment, isHistoryAdd) - { + { //correct the time msg.time += this._pad.clientTimeOffset; @@ -99,74 +102,68 @@ var chat = (function() var text = padutils.escapeHtmlWithClickableLinks(msg.text, "_blank"); - /* Performs an action if your name is mentioned */ + var authorName = msg.userName == null ? _('pad.userlist.unnamed') : padutils.escapeHtml(msg.userName); + + // the hook args + var ctx = { + "authorName" : authorName, + "author" : msg.userId, + "text" : text, + "sticky" : false, + "timestamp" : msg.time, + "timeStr" : timeStr + } + + // is the users focus already in the chatbox? + var alreadyFocused = $("#chatinput").is(":focus"); + + // does the user already have the chatbox open? + var chatOpen = $("#chatbox").is(":visible"); + + // does this message contain this user's name? (is the curretn user mentioned?) var myName = $('#myusernameedit').val(); - myName = myName.toLowerCase(); - var chatText = text.toLowerCase(); - var wasMentioned = false; - if (chatText.indexOf(myName) !== -1 && myName != "undefined"){ - wasMentioned = true; + var wasMentioned = (text.toLowerCase().indexOf(myName.toLowerCase()) !== -1 && myName != "undefined"); + + if(wasMentioned && !alreadyFocused && !isHistoryAdd && !chatOpen) + { // If the user was mentioned show for twice as long and flash the browser window + chatMentions++; + Tinycon.setBubble(chatMentions); + ctx.sticky = true; } - /* End of new action */ - var authorName = msg.userName == null ? _('pad.userlist.unnamed') : padutils.escapeHtml(msg.userName); - - var html = "<p data-authorId='" + msg.userId + "' class='" + authorClass + "'><b>" + authorName + ":</b><span class='time " + authorClass + "'>" + timeStr + "</span> " + text + "</p>"; - if(isHistoryAdd) - $(html).insertAfter('#chatloadmessagesbutton'); - else - $("#chattext").append(html); - - //should we increment the counter?? - if(increment && !isHistoryAdd) - { - var count = Number($("#chatcounter").text()); - count++; - - // is the users focus already in the chatbox? - var alreadyFocused = $("#chatinput").is(":focus"); - - // does the user already have the chatbox open? - var chatOpen = $("#chatbox").is(":visible"); - - $("#chatcounter").text(count); - // chat throb stuff -- Just make it throw for twice as long - if(wasMentioned && !alreadyFocused && !isHistoryAdd && !chatOpen) - { // If the user was mentioned show for twice as long and flash the browser window - $.gritter.add({ - // (string | mandatory) the heading of the notification - title: authorName, - // (string | mandatory) the text inside the notification - text: text, - // (bool | optional) if you want it to fade out on its own or just sit there - sticky: true, - // (int | optional) the time you want it to be alive for before fading out - time: '2000' - }); - - chatMentions++; - Tinycon.setBubble(chatMentions); - } + // Call chat message hook + hooks.aCallAll("chatNewMessage", ctx, function() { + + var html = "<p data-authorId='" + msg.userId + "' class='" + authorClass + "'><b>" + authorName + ":</b><span class='time " + authorClass + "'>" + ctx.timeStr + "</span> " + ctx.text + "</p>"; + if(isHistoryAdd) + $(html).insertAfter('#chatloadmessagesbutton'); else + $("#chattext").append(html); + + //should we increment the counter?? + if(increment && !isHistoryAdd) { - if(!chatOpen){ + // Update the counter of unread messages + var count = Number($("#chatcounter").text()); + count++; + $("#chatcounter").text(count); + + if(!chatOpen) { $.gritter.add({ // (string | mandatory) the heading of the notification - title: authorName, + title: ctx.authorName, // (string | mandatory) the text inside the notification - text: text, - + text: ctx.text, // (bool | optional) if you want it to fade out on its own or just sit there - sticky: false, + sticky: ctx.sticky, // (int | optional) the time you want it to be alive for before fading out time: '4000' }); - Tinycon.setBubble(count); - } } - } - // Clear the chat mentions when the user clicks on the chat input box + }); + + // Clear the chat mentions when the user clicks on the chat input box $('#chatinput').click(function(){ chatMentions = 0; Tinycon.setBubble(0); @@ -186,12 +183,12 @@ var chat = (function() self.send(); } }); - - // initial messages are loaded in pad.js' _afterHandshake - - $("#chatcounter").text(0); - $("#chatloadmessagesbutton").click(function() - { + + // initial messages are loaded in pad.js' _afterHandshake + + $("#chatcounter").text(0); + $("#chatloadmessagesbutton").click(function() + { var start = Math.max(self.historyPointer - 20, 0); var end = self.historyPointer; @@ -203,7 +200,7 @@ var chat = (function() pad.collabClient.sendMessage({"type": "GET_CHAT_MESSAGES", "start": start, "end": end}); self.historyPointer = start; - }); + }); } } diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 94149123..146ec51b 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -40,11 +40,9 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) var rev = serverVars.rev; var padId = serverVars.padId; - var globalPadId = serverVars.globalPadId; var state = "IDLE"; var stateMessage; - var stateMessageSocketId; var channelState = "CONNECTING"; var appLevelDisconnectReason = null; @@ -52,12 +50,10 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) var initialStartConnectTime = 0; var userId = initialUserInfo.userId; - var socketId; //var socket; var userSet = {}; // userId -> userInfo userSet[userId] = initialUserInfo; - var reconnectTimes = []; var caughtErrors = []; var caughtErrorCatchers = []; var caughtErrorTimes = []; @@ -196,7 +192,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) changeset: userChangesData.changeset, apool: userChangesData.apool }; - stateMessageSocketId = socketId; sendMessage(stateMessage); sentMessage = true; callbacks.onInternalAction("commitPerformed"); @@ -209,17 +204,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } } - function getStats() - { - var stats = {}; - - stats.screen = [$(window).width(), $(window).height(), window.screen.availWidth, window.screen.availHeight, window.screen.width, window.screen.height].join(','); - stats.ip = serverVars.clientIp; - stats.useragent = serverVars.clientAgent; - - return stats; - } - function setUpSocket() { hiccupCount = 0; @@ -278,8 +262,9 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (!getSocket()) return; if (!evt.data) return; var wrapper = evt; - if (wrapper.type != "COLLABROOM") return; + if (wrapper.type != "COLLABROOM" && wrapper.type != "CUSTOM") return; var msg = wrapper.data; + if (msg.type == "NEW_CHANGES") { var newRev = msg.newRev; @@ -294,7 +279,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (oldRev + 1)) { - top.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); + parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (oldRev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -304,7 +289,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - top.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); + parent.parent.console.warn("bad message revision on NEW_CHANGES: " + newRev + " not " + (rev + 1)); // setChannelState("DISCONNECTED", "badmessage_newchanges"); return; } @@ -318,7 +303,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) { if (newRev != (msgQueue[msgQueue.length - 1].newRev + 1)) { - top.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); + parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (msgQueue[msgQueue.length - 1][0] + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } @@ -328,7 +313,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) if (newRev != (rev + 1)) { - top.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); + parent.parent.console.warn("bad message revision on ACCEPT_COMMIT: " + newRev + " not " + (rev + 1)); // setChannelState("DISCONNECTED", "badmessage_acceptcommit"); return; } @@ -390,6 +375,7 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) callbacks.onUserLeave(userInfo); } } + else if (msg.type == "DISCONNECT_REASON") { appLevelDisconnectReason = msg.reason; @@ -503,16 +489,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } } - function keys(obj) - { - var array = []; - $.each(obj, function(k, v) - { - array.push(k); - }); - return array; - } - function valuesArray(obj) { var array = []; @@ -591,7 +567,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) { obj.committedChangeset = stateMessage.changeset; obj.committedChangesetAPool = stateMessage.apool; - obj.committedChangesetSocketId = stateMessageSocketId; editor.applyPreparedChangesetToBase(); } var userChangesData = editor.prepareUserChangeset(); diff --git a/src/static/js/contentcollector.js b/src/static/js/contentcollector.js index 645b7fce..ee0a1c27 100644 --- a/src/static/js/contentcollector.js +++ b/src/static/js/contentcollector.js @@ -311,7 +311,6 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, class ['insertorder', 'first'] ].concat( _.map(state.lineAttributes,function(value,key){ - if (typeof(window)!= 'undefined' && window.console) console.log([key, value]) return [key, value]; }) ); @@ -399,7 +398,7 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, class if (endPoint && node == endPoint.node) { selEnd = _pointHere(0, state); - } + } } while (txt.length > 0) { @@ -468,7 +467,7 @@ function makeContentCollector(collectStyles, browser, apool, domInterface, class var startNewLine= (typeof(induceLineBreak)=='object'&&induceLineBreak.length==0)?true:induceLineBreak[0]; if(startNewLine){ cc.startNewLine(state); - } + } } else if (tname == "script" || tname == "style") { diff --git a/src/static/js/cssmanager.js b/src/static/js/cssmanager.js index 62f17496..710cdbe5 100644 --- a/src/static/js/cssmanager.js +++ b/src/static/js/cssmanager.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 */ @@ -20,14 +20,32 @@ * limitations under the License. */ -function makeCSSManager(emptyStylesheetTitle, parentCss) +function makeCSSManager(emptyStylesheetTitle, doc) { + if (doc === true) + { + doc = 'parent'; + } else if (!doc) { + doc = 'inner'; + } function getSheetByTitle(title) { - if (parentCss) var allSheets = window.parent.parent.document.styleSheets; - else var allSheets = document.styleSheets; - + if (doc === 'parent') + { + win = window.parent.parent; + } + else if (doc === 'inner') { + win = window; + } + else if (doc === 'outer') { + win = window.parent; + } + else { + throw "Unknown dynamic style container"; + } + var allSheets = win.document.styleSheets; + for (var i = 0; i < allSheets.length; i++) { var s = allSheets[i]; @@ -38,8 +56,8 @@ function makeCSSManager(emptyStylesheetTitle, parentCss) } return null; } - - var browserSheet = getSheetByTitle(emptyStylesheetTitle, parentCss); + + var browserSheet = getSheetByTitle(emptyStylesheetTitle); function browserRules() { diff --git a/src/static/js/domline.js b/src/static/js/domline.js index 43b5f21a..b1927b16 100644 --- a/src/static/js/domline.js +++ b/src/static/js/domline.js @@ -101,26 +101,42 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { var listType = /(?:^| )list:(\S+)/.exec(cls); var start = /(?:^| )start:(\S+)/.exec(cls); + + _.map(hooks.callAll("aceDomLinePreProcessLineAttributes", { + domline: domline, + cls: cls + }), function(modifier) + { + preHtml += modifier.preHtml; + postHtml += modifier.postHtml; + processedMarker |= modifier.processedMarker; + }); + if (listType) { listType = listType[1]; - start = start?'start="'+Security.escapeHTMLAttribute(start[1])+'"':''; if (listType) { if(listType.indexOf("number") < 0) { - preHtml = '<ul class="list-' + Security.escapeHTMLAttribute(listType) + '"><li>'; - postHtml = '</li></ul>'; + preHtml += '<ul class="list-' + Security.escapeHTMLAttribute(listType) + '"><li>'; + postHtml = '</li></ul>' + postHtml; } else { - preHtml = '<ol '+start+' class="list-' + Security.escapeHTMLAttribute(listType) + '"><li>'; - postHtml = '</li></ol>'; + if(start){ // is it a start of a list with more than one item in? + if(start[1] == 1){ // if its the first one at this level? + lineClass = lineClass + " " + "list-start-" + listType; // Add start class to DIV node + } + preHtml += '<ol start='+start[1]+' class="list-' + Security.escapeHTMLAttribute(listType) + '"><li>'; + }else{ + preHtml += '<ol class="list-' + Security.escapeHTMLAttribute(listType) + '"><li>'; // Handles pasted contents into existing lists + } + postHtml += '</li></ol>'; } } processedMarker = true; } - _.map(hooks.callAll("aceDomLineProcessLineAttributes", { domline: domline, cls: cls @@ -130,13 +146,10 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) postHtml += modifier.postHtml; processedMarker |= modifier.processedMarker; }); - if( processedMarker ){ result.lineMarker += txt.length; return; // don't append any text } - - } var href = null; var simpleTags = null; @@ -179,7 +192,7 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { if (href) { - if(!~href.indexOf("http")) // if the url doesn't include http or https etc prefix it. + if(!~href.indexOf("://") && !~href.indexOf("mailto:")) // if the url doesn't include a protocol prefix, assume http { href = "http://"+href; } @@ -228,10 +241,10 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) result.node.innerHTML = curHTML; } if (lineClass !== null) result.node.className = lineClass; - - hooks.callAll("acePostWriteDomLineHTML", { - node: result.node - }); + + hooks.callAll("acePostWriteDomLineHTML", { + node: result.node + }); } result.prepareForAdd = writeHTML; result.finishUpdate = writeHTML; @@ -239,7 +252,6 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { return curHTML || ''; }; - return result; }; diff --git a/src/static/js/draggable.js b/src/static/js/draggable.js deleted file mode 100644 index 8d197545..00000000 --- a/src/static/js/draggable.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * This code is mostly from the old Etherpad. Please help us to comment this code. - * This helps other people to understand this code better and helps them to improve it. - * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED - */ - -/** - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS-IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function makeDraggable(jqueryNodes, eventHandler) -{ - jqueryNodes.each(function() - { - var node = $(this); - var state = {}; - var inDrag = false; - - function dragStart(evt) - { - if (inDrag) - { - return; - } - inDrag = true; - if (eventHandler('dragstart', evt, state) !== false) - { - $(document).bind('mousemove', dragUpdate); - $(document).bind('mouseup', dragEnd); - } - evt.preventDefault(); - return false; - } - - function dragUpdate(evt) - { - if (!inDrag) - { - return; - } - eventHandler('dragupdate', evt, state); - evt.preventDefault(); - return false; - } - - function dragEnd(evt) - { - if (!inDrag) - { - return; - } - inDrag = false; - try - { - eventHandler('dragend', evt, state); - } - finally - { - $(document).unbind('mousemove', dragUpdate); - $(document).unbind('mouseup', dragEnd); - evt.preventDefault(); - } - return false; - } - node.bind('mousedown', dragStart); - }); -} - -function makeResizableVPane(top, sep, bottom, minTop, minBottom, callback) -{ - if (minTop === undefined) minTop = 0; - if (minBottom === undefined) minBottom = 0; - - makeDraggable($(sep), function(eType, evt, state) - { - if (eType == 'dragstart') - { - state.startY = evt.pageY; - state.topHeight = $(top).height(); - state.bottomHeight = $(bottom).height(); - state.minTop = minTop; - state.maxTop = (state.topHeight + state.bottomHeight) - minBottom; - } - else if (eType == 'dragupdate') - { - var change = evt.pageY - state.startY; - - var topHeight = state.topHeight + change; - if (topHeight < state.minTop) - { - topHeight = state.minTop; - } - if (topHeight > state.maxTop) - { - topHeight = state.maxTop; - } - change = topHeight - state.topHeight; - - var bottomHeight = state.bottomHeight - change; - var sepHeight = $(sep).height(); - - var totalHeight = topHeight + sepHeight + bottomHeight; - topHeight = 100.0 * topHeight / totalHeight; - sepHeight = 100.0 * sepHeight / totalHeight; - bottomHeight = 100.0 * bottomHeight / totalHeight; - - $(top).css('bottom', 'auto'); - $(top).css('height', topHeight + "%"); - $(sep).css('top', topHeight + "%"); - $(bottom).css('top', (topHeight + sepHeight) + '%'); - $(bottom).css('height', 'auto'); - if (callback) callback(); - } - }); -} - -function makeResizableHPane(left, sep, right, minLeft, minRight, sepWidth, sepOffset, callback) -{ - if (minLeft === undefined) minLeft = 0; - if (minRight === undefined) minRight = 0; - - makeDraggable($(sep), function(eType, evt, state) - { - if (eType == 'dragstart') - { - state.startX = evt.pageX; - state.leftWidth = $(left).width(); - state.rightWidth = $(right).width(); - state.minLeft = minLeft; - state.maxLeft = (state.leftWidth + state.rightWidth) - minRight; - } - else if (eType == 'dragend' || eType == 'dragupdate') - { - var change = evt.pageX - state.startX; - - var leftWidth = state.leftWidth + change; - if (leftWidth < state.minLeft) - { - leftWidth = state.minLeft; - } - if (leftWidth > state.maxLeft) - { - leftWidth = state.maxLeft; - } - change = leftWidth - state.leftWidth; - - var rightWidth = state.rightWidth - change; - newSepWidth = sepWidth; - if (newSepWidth == undefined) newSepWidth = $(sep).width(); - newSepOffset = sepOffset; - if (newSepOffset == undefined) newSepOffset = 0; - - if (change == 0) - { - if (rightWidth != minRight || state.lastRightWidth == undefined) - { - state.lastRightWidth = rightWidth; - rightWidth = minRight; - } - else - { - rightWidth = state.lastRightWidth; - state.lastRightWidth = minRight; - } - change = state.rightWidth - rightWidth; - leftWidth = change + state.leftWidth; - } - - var totalWidth = leftWidth + newSepWidth + rightWidth; - leftWidth = 100.0 * leftWidth / totalWidth; - newSepWidth = 100.0 * newSepWidth / totalWidth; - newSepOffset = 100.0 * newSepOffset / totalWidth; - rightWidth = 100.0 * rightWidth / totalWidth; - - $(left).css('right', 'auto'); - $(left).css('width', leftWidth + "%"); - $(sep).css('left', (leftWidth + newSepOffset) + "%"); - $(right).css('left', (leftWidth + newSepWidth) + '%'); - $(right).css('width', 'auto'); - if (callback) callback(); - } - }); -} - -exports.makeDraggable = makeDraggable; diff --git a/src/static/js/farbtastic.js b/src/static/js/farbtastic.js index 0045703d..114c4d72 100644 --- a/src/static/js/farbtastic.js +++ b/src/static/js/farbtastic.js @@ -2,7 +2,7 @@ (function ($) { var __debug = false; -var __factor = 0.5; +var __factor = 0.8; $.fn.farbtastic = function (options) { $.farbtastic(this, options); diff --git a/src/static/js/gritter.js b/src/static/js/gritter.js index c32cc758..9778707e 100644 --- a/src/static/js/gritter.js +++ b/src/static/js/gritter.js @@ -21,8 +21,6 @@ $.gritter.options = { position: '', class_name: '', // could be set to 'gritter-light' to use white notifications - fade_in_speed: 'medium', // how fast notifications fade in - fade_out_speed: 1000, // how fast the notices fade out time: 6000 // hang on the screen for... } diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index e1c025c4..49a0a80d 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -23,30 +23,43 @@ window.html10n = (function(window, document, undefined) { // fix console - var console = window.console; + var console = window.console function interceptConsole(method){ - if (!console) return function() {}; + if (!console) return function() {} - var original = console[method]; + var original = console[method] // do sneaky stuff if (original.bind){ // Do this for normal browsers - return original.bind(console); + return original.bind(console) }else{ return function() { // Do this for IE - var message = Array.prototype.slice.apply(arguments).join(' '); - original(message); + var message = Array.prototype.slice.apply(arguments).join(' ') + original(message) } } } var consoleLog = interceptConsole('log') , consoleWarn = interceptConsole('warn') - , consoleError = interceptConsole('warn'); + , consoleError = interceptConsole('warn') - // fix Array.prototype.instanceOf in, guess what, IE! <3 + // fix Array#forEach in IE + // taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach + if (!Array.prototype.forEach) { + Array.prototype.forEach = function(fn, scope) { + for(var i = 0, len = this.length; i < len; ++i) { + if (i in this) { + fn.call(scope, this[i], i, this); + } + } + }; + } + + // fix Array#indexOf in, guess what, IE! <3 + // taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { "use strict"; @@ -84,23 +97,23 @@ window.html10n = (function(window, document, undefined) { * MicroEvent - to make any js object an event emitter (server or browser) */ - var MicroEvent = function(){} - MicroEvent.prototype = { - bind : function(event, fct){ + var MicroEvent = function(){} + MicroEvent.prototype = { + bind: function(event, fct){ this._events = this._events || {}; - this._events[event] = this._events[event] || []; + this._events[event] = this._events[event] || []; this._events[event].push(fct); }, - unbind : function(event, fct){ + unbind: function(event, fct){ this._events = this._events || {}; - if( event in this._events === false ) return; + if( event in this._events === false ) return; this._events[event].splice(this._events[event].indexOf(fct), 1); }, - trigger : function(event /* , args... */){ + trigger: function(event /* , args... */){ this._events = this._events || {}; - if( event in this._events === false ) return; + if( event in this._events === false ) return; for(var i = 0; i < this._events[event].length; i++){ - this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); + this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)) } } }; @@ -108,8 +121,8 @@ window.html10n = (function(window, document, undefined) { * mixin will delegate all MicroEvent.js function in the destination object * @param {Object} the object which will support MicroEvent */ - MicroEvent.mixin = function(destObject){ - var props = ['bind', 'unbind', 'trigger']; + MicroEvent.mixin = function(destObject){ + var props = ['bind', 'unbind', 'trigger']; if(!destObject) return; for(var i = 0; i < props.length; i ++){ destObject[props[i]] = MicroEvent.prototype[props[i]]; @@ -122,50 +135,50 @@ window.html10n = (function(window, document, undefined) { * and caching all necessary resources */ function Loader(resources) { - this.resources = resources; - this.cache = {}; // file => contents - this.langs = {}; // lang => strings + this.resources = resources + this.cache = {} // file => contents + this.langs = {} // lang => strings } Loader.prototype.load = function(lang, cb) { - if(this.langs[lang]) return cb(); + if(this.langs[lang]) return cb() if (this.resources.length > 0) { var reqs = 0; for (var i=0, n=this.resources.length; i < n; i++) { this.fetch(this.resources[i], lang, function(e) { reqs++; - if(e) return setTimeout(function(){ throw e }, 0); + if(e) consoleWarn(e) if (reqs < n) return;// Call back once all reqs are completed - cb && cb(); + cb && cb() }) } } } Loader.prototype.fetch = function(href, lang, cb) { - var that = this; + var that = this if (this.cache[href]) { this.parse(lang, href, this.cache[href], cb) return; } - var xhr = new XMLHttpRequest(); - xhr.open('GET', href, /*async: */true); + var xhr = new XMLHttpRequest() + xhr.open('GET', href, /*async: */true) if (xhr.overrideMimeType) { xhr.overrideMimeType('application/json; charset=utf-8'); } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status === 0) { - var data = JSON.parse(xhr.responseText); - that.cache[href] = data; + var data = JSON.parse(xhr.responseText) + that.cache[href] = data // Pass on the contents for parsing - that.parse(lang, href, data, cb); + that.parse(lang, href, data, cb) } else { - cb(new Error('Failed to load '+href)); + cb(new Error('Failed to load '+href)) } } }; @@ -174,39 +187,47 @@ window.html10n = (function(window, document, undefined) { Loader.prototype.parse = function(lang, currHref, data, cb) { if ('object' != typeof data) { - cb(new Error('A file couldn\'t be parsed as json.')); - return; + cb(new Error('A file couldn\'t be parsed as json.')) + return } - - if (!data[lang]) lang = lang.substr(0, lang.indexOf('-') == -1? lang.length : lang.indexOf('-')); + + // dat alng ain't here, man! if (!data[lang]) { - cb(new Error('Couldn\'t find translations for '+lang)); - return; + var msg = 'Couldn\'t find translations for '+lang + , l + if(~lang.indexOf('-')) lang = lang.split('-')[0] // then let's try related langs + for(l in data) { + if(lang != l && l.indexOf(lang) === 0 && data[l]) { + lang = l + break; + } + } + if(lang != l) return cb(new Error(msg)) } if ('string' == typeof data[lang]) { // Import rule // absolute path - var importUrl = data[lang]; + var importUrl = data[lang] // relative path if(data[lang].indexOf("http") != 0 && data[lang].indexOf("/") != 0) { - importUrl = currHref+"/../"+data[lang]; + importUrl = currHref+"/../"+data[lang] } - this.fetch(importUrl, lang, cb); - return; + this.fetch(importUrl, lang, cb) + return } if ('object' != typeof data[lang]) { - cb(new Error('Translations should be specified as JSON objects!')); - return; + cb(new Error('Translations should be specified as JSON objects!')) + return } - this.langs[lang] = data[lang]; + this.langs[lang] = data[lang] // TODO: Also store accompanying langs - cb(); + cb() } @@ -216,11 +237,11 @@ window.html10n = (function(window, document, undefined) { var html10n = { language : null } - MicroEvent.mixin(html10n); + MicroEvent.mixin(html10n) - html10n.macros = {}; + html10n.macros = {} - html10n.rtl = ["ar","dv","fa","ha","he","ks","ku","ps","ur","yi"]; + html10n.rtl = ["ar","dv","fa","ha","he","ks","ku","ps","ur","yi"] /** * Get rules for plural forms (shared with JetPack), see: @@ -635,25 +656,26 @@ window.html10n = (function(window, document, undefined) { /** * pre-defined 'plural' macro */ - html10n.macros.plural = function(translations, key, str, param) { - var n = parseFloat(param); + html10n.macros.plural = function(key, param, opts) { + var str + , n = parseFloat(param); if (isNaN(n)) - return str; + return; // initialize _pluralRules if (!this._pluralRules) this._pluralRules = getPluralRules(html10n.language); - var index = '[' + this._pluralRules(n) + ']'; + var index = this._pluralRules(n); // try to find a [zero|one|two] key if it's defined - if (n === 0 && (key + '[zero]') in translations) { - str = translations[key + '[zero]']; - } else if (n == 1 && (key + '[one]') in translations) { - str = translations[key + '[one]']; - } else if (n == 2 && (key + '[two]') in translations) { - str = translations[key + '[two]']; - } else if ((key + index) in translations) { - str = translations[key + index][prop]; + if (n === 0 && ('zero') in opts) { + str = opts['zero']; + } else if (n == 1 && ('one') in opts) { + str = opts['one']; + } else if (n == 2 && ('two') in opts) { + str = opts['two']; + } else if (index in opts) { + str = opts[index]; } return str; @@ -664,14 +686,22 @@ window.html10n = (function(window, document, undefined) { * @param langs An array of lang codes defining fallbacks */ html10n.localize = function(langs) { - var that = this; + var that = this // if only one string => create an array - if ('string' == typeof langs) langs = [langs]; - + if ('string' == typeof langs) langs = [langs] + + // Expand two-part locale specs + var i=0 + langs.forEach(function(lang) { + if(!lang) return + langs[i++] = lang + if(~lang.indexOf('-')) langs[i++] = lang.substr(0, lang.indexOf('-')) + }) + this.build(langs, function(er, translations) { - html10n.translations = translations; - html10n.translateElement(translations); - that.trigger('localized'); + html10n.translations = translations + html10n.translateElement(translations) + that.trigger('localized') }) } @@ -682,132 +712,148 @@ window.html10n = (function(window, document, undefined) { * @param element A DOM element, if omitted, the document element will be used */ html10n.translateElement = function(translations, element) { - element = element || document.documentElement; + element = element || document.documentElement var children = element? getTranslatableChildren(element) : document.childNodes; for (var i=0, n=children.length; i < n; i++) { - this.translateNode(translations, children[i]); + this.translateNode(translations, children[i]) } // translate element itself if necessary - this.translateNode(translations, element); + this.translateNode(translations, element) } function asyncForEach(list, iterator, cb) { var i = 0 - , n = list.length; + , n = list.length iterator(list[i], i, function each(err) { - if(err) consoleLog(err); - i++; + if(err) consoleLog(err) + i++ if (i < n) return iterator(list[i],i, each); - cb(); + cb() }) } function getTranslatableChildren(element) { if(!document.querySelectorAll) { - if (!element) return []; + if (!element) return [] var nodes = element.getElementsByTagName('*') - , l10nElements = []; + , l10nElements = [] for (var i=0, n=nodes.length; i < n; i++) { if (nodes[i].getAttribute('data-l10n-id')) l10nElements.push(nodes[i]); } - return l10nElements; + return l10nElements } - return element.querySelectorAll('*[data-l10n-id]'); + return element.querySelectorAll('*[data-l10n-id]') } html10n.get = function(id, args) { - var translations = html10n.translations; - if(!translations) return consoleWarn('No translations available (yet)'); - if(!translations[id]) return consoleWarn('Could not find string '+id); + var translations = html10n.translations + if(!translations) return consoleWarn('No translations available (yet)') + if(!translations[id]) return consoleWarn('Could not find string '+id) + + // apply macros + var str = translations[id] + + str = substMacros(id, str, args) // apply args - var str = substArguments(translations[id], args); + str = substArguments(str, args) - // apply macros - return substMacros(id, str, args); + return str + } + + // replace {{arguments}} with their values or the + // associated translation string (based on its key) + function substArguments(str, args) { + var reArgs = /\{\{\s*([a-zA-Z\.]+)\s*\}\}/ + , match - // replace {{arguments}} with their values or the - // associated translation string (based on its key) - function substArguments(str, args) { - var reArgs = /\{\{\s*([a-zA-Z\.]+)\s*\}\}/ - , match; - - while (match = reArgs.exec(str)) { - if (!match || match.length < 2) - return str; // argument key not found - - var arg = match[1] - , sub = ''; - if (arg in args) { - sub = args[arg]; - } else if (arg in translations) { - sub = translations[arg]; - } else { - consoleWarn('Could not find argument {{' + arg + '}}'); - return str; - } - - str = str.substring(0, match.index) + sub + str.substr(match.index + match[0].length); + while (match = reArgs.exec(str)) { + if (!match || match.length < 2) + return str // argument key not found + + var arg = match[1] + , sub = '' + if (arg in args) { + sub = args[arg] + } else if (arg in translations) { + sub = translations[arg] + } else { + consoleWarn('Could not find argument {{' + arg + '}}') + return str } - - return str; + + str = str.substring(0, match.index) + sub + str.substr(match.index + match[0].length) } - // replace {[macros]} with their values - function substMacros(key, str, args) { - var regex = /\{\[\s*([a-zA-Z]+):([a-zA-Z]+)\s*\]\}/ - , match = regex.exec(str); - if (!match || !match.length) - return str; - + return str + } + + // replace {[macros]} with their values + function substMacros(key, str, args) { + var regex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)((\s*([a-zA-Z]+)\: ?([ a-zA-Z{}]+),?)+)*\s*\]\}/ //.exec('{[ plural(n) other: are {{n}}, one: is ]}') + , match + + while(match = regex.exec(str)) { // a macro has been found // Note: at the moment, only one parameter is supported - var macroName = reMatch[1] - , paramName = reMatch[2]; + var macroName = match[1] + , paramName = match[2] + , optv = match[3] + , opts = {} + + if (!(macroName in html10n.macros)) continue - if (!(macroName in gMacros)) return str; + if(optv) { + optv.match(/(?=\s*)([a-zA-Z]+)\: ?([ a-zA-Z{}]+)(?=,?)/g).forEach(function(arg) { + var parts = arg.split(':') + , name = parts[0] + , value = parts[1].trim() + opts[name] = value + }) + } - var param; + var param if (args && paramName in args) { - param = args[paramName]; - } else if (paramName in translations) { - param = translations[paramName]; + param = args[paramName] + } else if (paramName in html10n.translations) { + param = translations[paramName] } - // there's no macro parser yet: it has to be defined in gMacros - var macro = html10n.macros[macroName]; - str = macro(translations, key, str, param); - return str; + // there's no macro parser: it has to be defined in html10n.macros + var macro = html10n.macros[macroName] + str = str.substr(0, match.index) + macro(key, param, opts) + str.substr(match.index+match[0].length) } + + return str } /** * Applies translations to a DOM node (recursive) */ html10n.translateNode = function(translations, node) { - var str = {}; + var str = {} // get id - str.id = node.getAttribute('data-l10n-id'); - if (!str.id) return; + str.id = node.getAttribute('data-l10n-id') + if (!str.id) return - if(!translations[str.id]) return consoleWarn('Couldn\'t find translation key '+str.id); + if(!translations[str.id]) return consoleWarn('Couldn\'t find translation key '+str.id) // get args if(window.JSON) { - str.args = JSON.parse(node.getAttribute('data-l10n-args')); + str.args = JSON.parse(node.getAttribute('data-l10n-args')) }else{ try{ - str.args = eval(node.getAttribute('data-l10n-args')); + str.args = eval(node.getAttribute('data-l10n-args')) }catch(e) { - consoleWarn('Couldn\'t parse args for '+str.id); + consoleWarn('Couldn\'t parse args for '+str.id) } } - str.str = html10n.get(str.id, str.args); + str.str = html10n.get(str.id, str.args) // get attribute name to apply str to var prop @@ -817,31 +863,31 @@ window.html10n = (function(window, document, undefined) { , "innerHTML": 1 , "alt": 1 , "textContent": 1 - }; + } if (index > 0 && str.id.substr(index + 1) in attrList) { // an attribute has been specified - prop = str.id.substr(index + 1); + prop = str.id.substr(index + 1) } else { // no attribute: assuming text content by default - prop = document.body.textContent ? 'textContent' : 'innerText'; + prop = document.body.textContent ? 'textContent' : 'innerText' } // Apply translation if (node.children.length === 0 || prop != 'textContent') { - node[prop] = str.str; + node[prop] = str.str } else { var children = node.childNodes, - found = false; + found = false for (var i=0, n=children.length; i < n; i++) { if (children[i].nodeType === 3 && /\S/.test(children[i].textContent)) { if (!found) { - children[i].nodeValue = str.str; - found = true; + children[i].nodeValue = str.str + found = true } else { - children[i].nodeValue = ''; + children[i].nodeValue = '' } } } if (!found) { - consoleWarn('Unexpected error: could not translate element content for key '+str.id, node); + consoleWarn('Unexpected error: could not translate element content for key '+str.id, node) } } } @@ -852,32 +898,43 @@ window.html10n = (function(window, document, undefined) { */ html10n.build = function(langs, cb) { var that = this - , build = {}; + , build = {} asyncForEach(langs, function (lang, i, next) { if(!lang) return next(); - that.loader.load(lang, next); + that.loader.load(lang, next) }, function() { - var lang; - langs.reverse(); + var lang + langs.reverse() - // loop through priority array... + // loop through the priority array... for (var i=0, n=langs.length; i < n; i++) { - lang = langs[i]; + lang = langs[i] - if(!lang || !(lang in that.loader.langs)) continue; + if(!lang) continue; + if(!(lang in that.loader.langs)) {// uh, we don't have this lang availbable.. + // then check for related langs + if(~lang.indexOf('-')) lang = lang.split('-')[0]; + for(var l in that.loader.langs) { + if(lang != l && l.indexOf(lang) === 0) { + lang = l + break; + } + } + if(lang != l) continue; + } // ... and apply all strings of the current lang in the list // to our build object for (var string in that.loader.langs[lang]) { - build[string] = that.loader.langs[lang][string]; + build[string] = that.loader.langs[lang][string] } // the last applied lang will be exposed as the // lang the page was translated to - that.language = lang; + that.language = lang } - cb(null, build); + cb(null, build) }) } @@ -893,8 +950,9 @@ window.html10n = (function(window, document, undefined) { * Returns the direction of the language returned be html10n#getLanguage */ html10n.getDirection = function() { - var langCode = this.language.indexOf('-') == -1? this.language : this.language.substr(0, this.language.indexOf('-')); - return html10n.rtl.indexOf(langCode) == -1? 'ltr' : 'rtl'; + if(!this.language) return + var langCode = this.language.indexOf('-') == -1? this.language : this.language.substr(0, this.language.indexOf('-')) + return html10n.rtl.indexOf(langCode) == -1? 'ltr' : 'rtl' } /** @@ -903,28 +961,28 @@ window.html10n = (function(window, document, undefined) { html10n.index = function () { // Find all <link>s var links = document.getElementsByTagName('link') - , resources = []; + , resources = [] for (var i=0, n=links.length; i < n; i++) { if (links[i].type != 'application/l10n+json') continue; - resources.push(links[i].href); + resources.push(links[i].href) } - this.loader = new Loader(resources); - this.trigger('indexed'); + this.loader = new Loader(resources) + this.trigger('indexed') } if (document.addEventListener) // modern browsers and IE9+ document.addEventListener('DOMContentLoaded', function() { - html10n.index(); - }, false); + html10n.index() + }, false) else if (window.attachEvent) window.attachEvent('onload', function() { - html10n.index(); - }, false); + html10n.index() + }, false) // gettext-like shortcut if (window._ === undefined) window._ = html10n.get; - return html10n; -})(window, document); + return html10n +})(window, document) diff --git a/src/static/js/linestylefilter.js b/src/static/js/linestylefilter.js index e6fbc209..cb1ee1d5 100644 --- a/src/static/js/linestylefilter.js +++ b/src/static/js/linestylefilter.js @@ -146,7 +146,7 @@ linestylefilter.getLineStyleFilter = function(lineLength, aline, textAndClassFun return function(txt, cls) { - + var disableAuthColorForThisLine = hooks.callAll("disableAuthorColorsForThisLine", { linestylefilter: linestylefilter, text: txt, @@ -259,8 +259,8 @@ linestylefilter.getRegexpFilter = function(regExp, tag) linestylefilter.REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; -linestylefilter.REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#!;()$]/.source + '|' + linestylefilter.REGEX_WORDCHAR.source + ')'); -linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:|www\.)/.source + linestylefilter.REGEX_URLCHAR.source + '*(?![:.,;])' + linestylefilter.REGEX_URLCHAR.source, 'g'); +linestylefilter.REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#!;()\[\]$]/.source + '|' + linestylefilter.REGEX_WORDCHAR.source + ')'); +linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|mailto:|www\.)/.source + linestylefilter.REGEX_URLCHAR.source + '*(?![:.,;])' + linestylefilter.REGEX_URLCHAR.source, 'g'); linestylefilter.getURLFilter = linestylefilter.getRegexpFilter( linestylefilter.REGEX_URL, 'url'); diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 60a43557..73fcd3d6 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -191,7 +191,7 @@ function handshake() createCookie("token", token, 60); } - var sessionID = readCookie("sessionID"); + var sessionID = decodeURIComponent(readCookie("sessionID")); var password = readCookie("password"); var msg = { @@ -242,7 +242,7 @@ function handshake() pad.collabClient.setChannelState("RECONNECTING"); - disconnectTimeout = setTimeout(disconnectEvent, 10000); + disconnectTimeout = setTimeout(disconnectEvent, 20000); } }); @@ -252,14 +252,23 @@ function handshake() socket.on('message', function(obj) { //the access was not granted, give the user a message - if(!receivedClientVars && obj.accessStatus) + if(obj.accessStatus) { - $('.passForm').submit(require(module.id).savePassword); + if(!receivedClientVars){ + $('.passForm').submit(require(module.id).savePassword); + } if(obj.accessStatus == "deny") { $('#loading').hide(); $("#permissionDenied").show(); + + if(receivedClientVars) + { + // got kicked + $("#editorcontainer").hide(); + $("#editorloadingbox").show(); + } } else if(obj.accessStatus == "needPassword") { @@ -326,7 +335,7 @@ function handshake() { pad.notifyChangeName(settings.globalUserName); // Notifies the server pad.myUserInfo.name = settings.globalUserName; - $('#myusernameedit').attr({"value":settings.globalUserName}); // Updates the current users UI + $('#myusernameedit').val(settings.globalUserName); // Updates the current users UI } if (settings.globalUserColor !== false && colorutils.isCssHex(settings.globalUserColor)) { @@ -365,8 +374,7 @@ function handshake() $.extend($.gritter.options, { position: 'bottom-right', // defaults to 'top-right' but can be 'bottom-left', 'bottom-right', 'top-left', 'top-right' (added in 1.7.1) - fade_in_speed: 'medium', // how fast notifications fade in (string or int) - fade_out_speed: 2000, // how fast the notices fade out + fade: false, // dont fade, too jerky on mobile time: 6000 // hang on the screen for... }); @@ -442,6 +450,7 @@ var pad = { //initialize the chat chat.init(this); + padcookie.init(); // initialize the cookies pad.initTime = +(new Date()); pad.padOptions = clientVars.initialOptions; @@ -455,7 +464,7 @@ var pad = { { try { - doc.execCommand("BackgroundImageCache", false, true); + document.execCommand("BackgroundImageCache", false, true); } catch (e) {} @@ -516,7 +525,7 @@ var pad = { if(padcookie.getPref("showAuthorshipColors") == false){ pad.changeViewOption('showAuthorColors', false); } - hooks.aCallAll("postAceInit", {ace: padeditor.ace}); + hooks.aCallAll("postAceInit", {ace: padeditor.ace, pad: pad}); } }, dispose: function() diff --git a/src/static/js/pad_connectionstatus.js b/src/static/js/pad_connectionstatus.js index 2d9354ab..76eedbc4 100644 --- a/src/static/js/pad_connectionstatus.js +++ b/src/static/js/pad_connectionstatus.js @@ -21,7 +21,6 @@ */ var padmodals = require('./pad_modals').padmodals; -var padeditbar = require('./pad_editbar').padeditbar; var padconnectionstatus = (function() { @@ -65,18 +64,17 @@ var padconnectionstatus = (function() why: msg }; - var k = String(msg).toLowerCase(); // known reason why - if (!(k == 'userdup' || k == 'deleted' || k == 'looping' || k == 'slowcommit' || k == 'initsocketfail' || k == 'unauth')) + var k = String(msg); // known reason why + if (!(k == 'userdup' || k == 'deleted' || k == 'looping' || k == 'slowcommit' || k == 'initsocketfail' || k == 'unauth' || k == 'badChangeset' || k == 'corruptPad')) { k = 'disconnected'; } - + padmodals.showModal(k); padmodals.showOverlay(); }, isFullyConnected: function() { - padmodals.hideOverlay(); return status.what == 'connected'; }, getStatus: function() diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index cc9f8758..85963217 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.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 */ @@ -20,18 +20,60 @@ * limitations under the License. */ +var hooks = require('./pluginfw/hooks'); var padutils = require('./pad_utils').padutils; var padeditor = require('./pad_editor').padeditor; var padsavedrevs = require('./pad_savedrevs'); -function indexOf(array, value) { - for (var i = 0, ii = array.length; i < ii; i++) { - if (array[i] == value) { - return i; - } +var ToolbarItem = function (element) { + this.$el = element; +}; + +ToolbarItem.prototype.getCommand = function () { + return this.$el.attr("data-key"); +}; + +ToolbarItem.prototype.getValue = function () { + if (this.isSelect()) { + return this.$el.find("select").val(); + } +}; + +ToolbarItem.prototype.setValue = function (val) { + if (this.isSelect()) { + return this.$el.find("select").val(val); } - return -1; -} +}; + + +ToolbarItem.prototype.getType = function () { + return this.$el.attr("data-type"); +}; + +ToolbarItem.prototype.isSelect = function () { + return this.getType() == "select"; +}; + +ToolbarItem.prototype.isButton = function () { + return this.getType() == "button"; +}; + +ToolbarItem.prototype.bind = function (callback) { + var self = this; + + if (self.isButton()) { + self.$el.click(function (event) { + callback(self.getCommand(), self); + event.preventDefault(); + }); + } + else if (self.isSelect()) { + self.$el.find("select").change(function () { + callback(self.getCommand(), self); + }); + } +}; + var padeditbar = (function() { @@ -95,17 +137,24 @@ var padeditbar = (function() }()); var self = { - init: function() - { + init: function() { var self = this; + self.dropdowns = []; + $("#editbar .editbarbutton").attr("unselectable", "on"); // for IE $("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar"); - $("#editbar [data-key]").each(function (i, e) { - $(e).click(function (event) { - self.toolbarClick($(e).attr('data-key')); - event.preventDefault(); + $("#editbar [data-key]").each(function () { + (new ToolbarItem($(this))).bind(function (command, item) { + self.triggerCommand(command, item); }); }); + + registerDefaultCommands(self); + + hooks.callAll("postToolbarInit", { + toolbar: self, + ace: padeditor.ace + }); }, isEnabled: function() { @@ -116,114 +165,70 @@ var padeditbar = (function() { $("#editbar").addClass('disabledtoolbar').removeClass("enabledtoolbar"); }, - toolbarClick: function(cmd) - { - if (self.isEnabled()) - { - if(cmd == "showusers") - { - self.toggleDropDown("users"); - } - else if (cmd == 'settings') - { - self.toggleDropDown("settings"); - } - else if (cmd == 'connectivity') - { - self.toggleDropDown("connectivity"); - } - else if (cmd == 'embed') - { - self.setEmbedLinks(); - $('#linkinput').focus().select(); - self.toggleDropDown("embed"); - } - else if (cmd == 'import_export') - { - self.toggleDropDown("importexport"); - } - else if (cmd == 'savedRevision') - { - padsavedrevs.saveNow(); - } - else - { - padeditor.ace.callWithAce(function(ace) - { - if (cmd == 'bold' || cmd == 'italic' || cmd == 'underline' || cmd == 'strikethrough') ace.ace_toggleAttributeOnSelection(cmd); - else if (cmd == 'undo' || cmd == 'redo') ace.ace_doUndoRedo(cmd); - else if (cmd == 'insertunorderedlist') ace.ace_doInsertUnorderedList(); - else if (cmd == 'insertorderedlist') ace.ace_doInsertOrderedList(); - else if (cmd == 'indent') - { - ace.ace_doIndentOutdent(false); - } - else if (cmd == 'outdent') - { - ace.ace_doIndentOutdent(true); - } - else if (cmd == 'clearauthorship') - { - if ((!(ace.ace_getRep().selStart && ace.ace_getRep().selEnd)) || ace.ace_isCaret()) - { - if (window.confirm(html10n.get("pad.editbar.clearcolors"))) - { - ace.ace_performDocumentApplyAttributesToCharRange(0, ace.ace_getRep().alltext.length, [ - ['author', ''] - ]); - } - } - else - { - ace.ace_setAttributeOnSelection('author', ''); - } - } - }, cmd, true); - } + commands: {}, + registerCommand: function (cmd, callback) { + this.commands[cmd] = callback; + return this; + }, + registerDropdownCommand: function (cmd, dropdown) { + dropdown = dropdown || cmd; + self.dropdowns.push(dropdown) + this.registerCommand(cmd, function () { + self.toggleDropDown(dropdown); + }); + }, + registerAceCommand: function (cmd, callback) { + this.registerCommand(cmd, function (cmd, ace) { + ace.callWithAce(function (ace) { + callback(cmd, ace); + }, cmd, true); + }); + }, + triggerCommand: function (cmd, item) { + if (self.isEnabled() && this.commands[cmd]) { + this.commands[cmd](cmd, padeditor.ace, item); } if(padeditor.ace) padeditor.ace.focus(); }, toggleDropDown: function(moduleName, cb) { - var modules = ["settings", "connectivity", "importexport", "embed", "users"]; - // hide all modules and remove highlighting of all buttons if(moduleName == "none") { var returned = false - for(var i=0;i<modules.length;i++) + for(var i=0;i<self.dropdowns.length;i++) { //skip the userlist - if(modules[i] == "users") + if(self.dropdowns[i] == "users") continue; - - var module = $("#" + modules[i]); - + + var module = $("#" + self.dropdowns[i]); + if(module.css('display') != "none") { - $("#" + modules[i] + "link").removeClass("selected"); + $("#" + self.dropdowns[i] + "link").removeClass("selected"); module.slideUp("fast", cb); returned = true; } } if(!returned && cb) return cb(); } - else + else { // hide all modules that are not selected and remove highlighting // respectively add highlighting to the corresponding button - for(var i=0;i<modules.length;i++) + for(var i=0;i<self.dropdowns.length;i++) { - var module = $("#" + modules[i]); - + var module = $("#" + self.dropdowns[i]); + if(module.css('display') != "none") { - $("#" + modules[i] + "link").removeClass("selected"); + $("#" + self.dropdowns[i] + "link").removeClass("selected"); module.slideUp("fast"); } - else if(modules[i]==moduleName) + else if(self.dropdowns[i]==moduleName) { - $("#" + modules[i] + "link").addClass("selected"); + $("#" + self.dropdowns[i] + "link").addClass("selected"); module.slideDown("fast", cb); } } @@ -257,6 +262,85 @@ var padeditbar = (function() } } }; + + function aceAttributeCommand(cmd, ace) { + ace.ace_toggleAttributeOnSelection(cmd); + } + + function registerDefaultCommands(toolbar) { + toolbar.registerDropdownCommand("showusers", "users"); + toolbar.registerDropdownCommand("settings"); + toolbar.registerDropdownCommand("connectivity"); + toolbar.registerDropdownCommand("import_export", "importexport"); + toolbar.registerDropdownCommand("embed"); + + toolbar.registerCommand("embed", function () { + toolbar.setEmbedLinks(); + $('#linkinput').focus().select(); + toolbar.toggleDropDown("embed"); + }); + + toolbar.registerCommand("savedRevision", function () { + padsavedrevs.saveNow(); + }); + + toolbar.registerCommand("showTimeSlider", function () { + document.location = document.location.pathname+ '/timeslider'; + }); + + toolbar.registerAceCommand("bold", aceAttributeCommand); + toolbar.registerAceCommand("italic", aceAttributeCommand); + toolbar.registerAceCommand("underline", aceAttributeCommand); + toolbar.registerAceCommand("strikethrough", aceAttributeCommand); + + toolbar.registerAceCommand("undo", function (cmd, ace) { + ace.ace_doUndoRedo(cmd); + }); + + toolbar.registerAceCommand("redo", function (cmd, ace) { + ace.ace_doUndoRedo(cmd); + }); + + toolbar.registerAceCommand("insertunorderedlist", function (cmd, ace) { + ace.ace_doInsertUnorderedList(); + }); + + toolbar.registerAceCommand("insertorderedlist", function (cmd, ace) { + ace.ace_doInsertOrderedList(); + }); + + toolbar.registerAceCommand("indent", function (cmd, ace) { + if (!ace.ace_doIndentOutdent(false)) { + ace.ace_doInsertUnorderedList(); + } + }); + + toolbar.registerAceCommand("outdent", function (cmd, ace) { + ace.ace_doIndentOutdent(true); + }); + + toolbar.registerAceCommand("clearauthorship", function (cmd, ace) { + if ((!(ace.ace_getRep().selStart && ace.ace_getRep().selEnd)) || ace.ace_isCaret()) { + if (window.confirm(html10n.get("pad.editbar.clearcolors"))) { + ace.ace_performDocumentApplyAttributesToCharRange(0, ace.ace_getRep().alltext.length, [ + ['author', ''] + ]); + } + } + else { + ace.ace_setAttributeOnSelection('author', ''); + } + }); + + toolbar.registerCommand('timeslider_returnToPad', function(cmd) { + if( document.referrer.length > 0 && document.referrer.substring(document.referrer.lastIndexOf("/")-1, document.referrer.lastIndexOf("/")) === "p") { + document.location = document.referrer; + } else { + document.location = document.location.href.substring(0,document.location.href.lastIndexOf("/")); + } + }); + } + return self; }()); diff --git a/src/static/js/pad_impexp.js b/src/static/js/pad_impexp.js index ae951ca7..aa48ad77 100644 --- a/src/static/js/pad_impexp.js +++ b/src/static/js/pad_impexp.js @@ -77,6 +77,7 @@ var padimpexp = (function() } currentImportTimer = null; importFailed("Request timed out."); + importDone(); }, 25000); // time out after some number of seconds $('#importsubmitinput').attr( { diff --git a/src/static/js/pad_modals.js b/src/static/js/pad_modals.js index 0292e048..67b03662 100644 --- a/src/static/js/pad_modals.js +++ b/src/static/js/pad_modals.js @@ -20,7 +20,6 @@ * limitations under the License. */ -var padutils = require('./pad_utils').padutils; var padeditbar = require('./pad_editbar').padeditbar; var padmodals = (function() @@ -39,23 +38,11 @@ var padmodals = (function() padeditbar.toggleDropDown("connectivity"); }); }, - showOverlay: function(duration) { - $("#overlay").show().css( - { - 'opacity': 0 - }).animate( - { - 'opacity': 1 - }, duration); + showOverlay: function() { + $("#overlay").show(); }, - hideOverlay: function(duration) { - $("#overlay").animate( - { - 'opacity': 0 - }, duration, function() - { - $("#modaloverlay").hide(); - }); + hideOverlay: function() { + $("#overlay").hide(); } }; return self; diff --git a/src/static/js/pad_userlist.js b/src/static/js/pad_userlist.js index c8f8e2c9..ebb057c8 100644 --- a/src/static/js/pad_userlist.js +++ b/src/static/js/pad_userlist.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 */ @@ -116,7 +116,7 @@ var paduserlist = (function() nameHtml = '<input data-l10n-id="pad.userlist.unnamed" type="text" class="editempty newinput" value="'+_('pad.userlist.unnamed')+'" ' + (isNameEditable(data) ? '' : 'disabled="disabled" ') + '/>'; } - return ['<td style="height:', height, 'px" class="usertdswatch"><div class="swatch" style="background:' + data.color + '"> </div></td>', '<td style="height:', height, 'px" class="usertdname">', nameHtml, '</td>', '<td style="height:', height, 'px" class="activity">', padutils.escapeHtml(data.activity), '</td>'].join(''); + return ['<td style="height:', height, 'px" class="usertdswatch"><div class="swatch" style="background:' + padutils.escapeHtml(data.color) + '"> </div></td>', '<td style="height:', height, 'px" class="usertdname">', nameHtml, '</td>', '<td style="height:', height, 'px" class="activity">', padutils.escapeHtml(data.activity), '</td>'].join(''); } function getRowHtml(id, innerHtml, authorId) @@ -513,7 +513,7 @@ var paduserlist = (function() { info.colorId = clientVars.colorPalette[info.colorId]; } - + myUserInfo = $.extend( {}, info); @@ -602,7 +602,13 @@ var paduserlist = (function() online++; } } - $("#online_count").text(online); + var $btn = $("#editbar [data-key=showusers] > a") + , $counter = $('#online_count', $btn) + if(!$counter.length) { + $counter = $('<span id="online_count">') + $btn.append($counter) + } + $counter.text(online); return online; }, @@ -633,6 +639,9 @@ var paduserlist = (function() otherUsersInfo.splice(newExistingIndex, 1); otherUsersData.splice(newExistingIndex, 1); rowManager.removeRow(newExistingIndex); + hooks.callAll('userLeave', { + userInfo: info + }); updateInviteNotice(); } } @@ -721,15 +730,15 @@ var paduserlist = (function() { $("#myswatchbox").addClass('myswatchboxhoverable').removeClass('myswatchboxunhoverable'); } - + $("#myswatch").css({'background-color': myUserInfo.colorId}); - + if ($.browser.msie && parseInt($.browser.version) <= 8) { - $("#usericon a").css({'box-shadow': 'inset 0 0 30px ' + myUserInfo.colorId,'background-color': myUserInfo.colorId}); + $("li[data-key=showusers] > a").css({'box-shadow': 'inset 0 0 30px ' + myUserInfo.colorId,'background-color': myUserInfo.colorId}); } else { - $("#usericon a").css({'box-shadow': 'inset 0 0 30px ' + myUserInfo.colorId}); + $("li[data-key=showusers] > a").css({'box-shadow': 'inset 0 0 30px ' + myUserInfo.colorId}); } } }; @@ -745,7 +754,7 @@ function getColorPickerSwatchIndex(jnode) function closeColorPicker(accept) { if (accept) - { + { var newColor = $("#mycolorpickerpreview").css("background-color"); var parts = newColor.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); // parts now should be ["rgb(0, 70, 255", "0", "70", "255"] diff --git a/src/static/js/pad_utils.js b/src/static/js/pad_utils.js index deee2dfd..bab6aa43 100644 --- a/src/static/js/pad_utils.js +++ b/src/static/js/pad_utils.js @@ -176,7 +176,7 @@ var padutils = { // copied from ACE var _REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; var _REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/?=&#;()$]/.source + '|' + _REGEX_WORDCHAR.source + ')'); - var _REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:)/.source + _REGEX_URLCHAR.source + '*(?![:.,;])' + _REGEX_URLCHAR.source, 'g'); + var _REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|mailto:)/.source + _REGEX_URLCHAR.source + '*(?![:.,;])' + _REGEX_URLCHAR.source, 'g'); // returns null if no URLs, or [[startIndex1, url1], [startIndex2, url2], ...] @@ -519,7 +519,7 @@ function setupGlobalExceptionHandler() { //show javascript errors to the user $("#editorloadingbox").css("padding", "10px"); $("#editorloadingbox").css("padding-top", "45px"); - $("#editorloadingbox").html("<div style='text-align:left;color:red;font-size:16px;'><b>An error occured</b><br>The error was reported with the following id: '" + errorId + "'<br><br><span style='color:black;font-weight:bold;font-size:16px'>Please send this error message to us: </span><div style='color:black;font-size:14px'>'" + $("#editorloadingbox").html("<div style='text-align:left;color:red;font-size:16px;'><b>An error occured</b><br>The error was reported with the following id: '" + errorId + "'<br><br><span style='color:black;font-weight:bold;font-size:16px'>Please press and hold Ctrl and press F5 to reload this page, if the problem persists please send this error message to your webmaster: </span><div style='color:black;font-size:14px'>'" + "ErrorId: " + errorId + "<br>URL: " + window.location.href + "<br>UserAgent: " + navigator.userAgent + "<br>" + msg + " in " + url + " at line " + linenumber + "'</div></div>"); } diff --git a/src/static/js/pluginfw/hooks.js b/src/static/js/pluginfw/hooks.js index 4d505794..a8ac413f 100644 --- a/src/static/js/pluginfw/hooks.js +++ b/src/static/js/pluginfw/hooks.js @@ -8,7 +8,7 @@ var hookCallWrapper = function (hook, hook_name, args, cb) { // Normalize output to list for both sync and async cases var normalize = function(x) { - if (x == undefined) return []; + if (x === undefined) return []; return x; } var normalizedhook = function () { @@ -61,7 +61,7 @@ exports.flatten = function (lst) { if (lst[i] != undefined && lst[i] != null) { for (var j = 0; j < lst[i].length; j++) { res.push(lst[i][j]); - } + } } } } diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 15d87940..e5602616 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -1,118 +1,92 @@ var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var npm = require("npm"); -var RegClient = require("npm-registry-client") -var registry = new RegClient( -{ registry: "http://registry.npmjs.org" -, cache: npm.cache } -); - -var withNpm = function (npmfn, final, cb) { +var npmIsLoaded = false; +var withNpm = function (npmfn) { + if(npmIsLoaded) return npmfn(); npm.load({}, function (er) { - if (er) return cb({progress:1, error:er}); + if (er) return npmfn(er); + npmIsLoaded = true; npm.on("log", function (message) { - cb({progress: 0.5, message:message.msg + ": " + message.pref}); - }); - npmfn(function (er, data) { - if (er) { - console.error(er); - return cb({progress:1, error: er.message}); - } - if (!data) data = {}; - data.progress = 1; - data.message = "Done."; - cb(data); - final(); + console.log('npm: ',message) }); + npmfn(); }); } -// All these functions call their callback multiple times with -// {progress:[0,1], message:STRING, error:object}. They will call it -// with progress = 1 at least once, and at all times will either -// message or error be present, not both. It can be called multiple -// times for all values of propgress except for 1. +var tasks = 0 +function wrapTaskCb(cb) { + tasks++ + return function() { + cb && cb.apply(this, arguments); + tasks--; + if(tasks == 0) onAllTasksFinished(); + } +} +function onAllTasksFinished() { + hooks.aCallAll("restartServer", {}, function () {}); +} exports.uninstall = function(plugin_name, cb) { - withNpm( - function (cb) { - npm.commands.uninstall([plugin_name], function (er) { + cb = wrapTaskCb(cb); + withNpm(function (er) { + if (er) return cb && cb(er); + npm.commands.uninstall([plugin_name], function (er) { + if (er) return cb && cb(er); + hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); - hooks.aCallAll("pluginUninstall", {plugin_name: plugin_name}, function (er, data) { - if (er) return cb(er); - plugins.update(cb); - }); + plugins.update(cb); }); - }, - function () { - hooks.aCallAll("restartServer", {}, function () {}); - }, - cb - ); + }); + }); }; exports.install = function(plugin_name, cb) { - withNpm( - function (cb) { - npm.commands.install([plugin_name], function (er) { + cb = wrapTaskCb(cb) + withNpm(function (er) { + if (er) return cb && cb(er); + npm.commands.install([plugin_name], function (er) { + if (er) return cb && cb(er); + hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { if (er) return cb(er); - hooks.aCallAll("pluginInstall", {plugin_name: plugin_name}, function (er, data) { - if (er) return cb(er); - plugins.update(cb); - }); + plugins.update(cb); }); - }, - function () { - hooks.aCallAll("restartServer", {}, function () {}); - }, - cb - ); + }); + }); +}; + +exports.availablePlugins = null; +var cacheTimestamp = 0; + +exports.getAvailablePlugins = function(maxCacheAge, cb) { + withNpm(function (er) { + if (er) return cb && cb(er); + if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { + return cb && cb(null, exports.availablePlugins) + } + npm.commands.search(['ep_'], /*silent?*/true, function(er, results) { + if(er) return cb && cb(er); + exports.availablePlugins = results; + cacheTimestamp = Math.round(+new Date/1000); + cb && cb(null, results) + }) + }); }; -exports.searchCache = null; -exports.search = function(query, cache, cb) { - withNpm( - function (cb) { - var getData = function (cb) { - if (cache && exports.searchCache) { - cb(null, exports.searchCache); - } else { - registry.get( - "/-/all", 600, false, true, - function (er, data) { - if (er) return cb(er); - exports.searchCache = data; - cb(er, data); - } - ); - } - } - getData( - function (er, data) { - if (er) return cb(er); - var res = {}; - var i = 0; - var pattern = query.pattern.toLowerCase(); - for (key in data) { // for every plugin in the data from npm - if ( key.indexOf(plugins.prefix) == 0 - && key.indexOf(pattern) != -1 - || key.indexOf(plugins.prefix) == 0 - && data[key].description.indexOf(pattern) != -1 - ) { // If the name contains ep_ and the search string is in the name or description - i++; - if (i > query.offset - && i <= query.offset + query.limit) { - res[key] = data[key]; - } - } - } - cb(null, {results:res, query: query, total:i}); - } - ); - }, - function () { }, - cb - ); +exports.search = function(searchTerm, maxCacheAge, cb) { + exports.getAvailablePlugins(maxCacheAge, function(er, results) { + if(er) return cb && cb(er); + var res = {}; + if (searchTerm) + searchTerm = searchTerm.toLowerCase(); + for (var pluginName in results) { // for every available plugin + if (pluginName.indexOf(plugins.prefix) != 0) continue; // TODO: Also search in keywords here! + + if(searchTerm && !~pluginName.toLowerCase().indexOf(searchTerm) && !~results[pluginName].description.toLowerCase().indexOf(searchTerm)) continue; + res[pluginName] = results[pluginName]; + } + cb && cb(null, res) + }) }; diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index eb3703d9..b3c10b8a 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -28,7 +28,6 @@ JSON = require('./json2'); var createCookie = require('./pad_utils').createCookie; var readCookie = require('./pad_utils').readCookie; var randomString = require('./pad_utils').randomString; -var _ = require('./underscore'); var hooks = require('./pluginfw/hooks'); var token, padId, export_links; @@ -96,18 +95,13 @@ function init() { //get all the export links export_links = $('#export > .exportlink') - if(document.referrer.length > 0 && document.referrer.substring(document.referrer.lastIndexOf("/")-1,document.referrer.lastIndexOf("/")) === "p") { - $("#returnbutton").attr("href", document.referrer); - } else { - $("#returnbutton").attr("href", document.location.href.substring(0,document.location.href.lastIndexOf("/"))); - } - $('button#forcereconnect').click(function() { window.location.reload(); }); exports.socket = socket; // make the socket available + exports.BroadcastSlider = BroadcastSlider; // Make the slider available hooks.aCallAll("postTimesliderInit"); }); @@ -116,7 +110,7 @@ function init() { //sends a message over the socket function sendSocketMsg(type, data) { - var sessionID = readCookie("sessionID"); + var sessionID = decodeURIComponent(readCookie("sessionID")); var password = readCookie("password"); var msg = { "component" : "pad", // FIXME: Remove this stupidity! @@ -133,7 +127,7 @@ function sendSocketMsg(type, data) var fireWhenAllScriptsAreLoaded = []; -var BroadcastSlider, changesetLoader; +var changesetLoader; function handleClientVars(message) { //save the client Vars diff --git a/src/static/js/virtual_lines.js b/src/static/js/virtual_lines.js deleted file mode 100644 index 2bcf5ed6..00000000 --- a/src/static/js/virtual_lines.js +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This code is mostly from the old Etherpad. Please help us to comment this code. - * This helps other people to understand this code better and helps them to improve it. - * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED - */ - -/** - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS-IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function makeVirtualLineView(lineNode) -{ - - // how much to jump forward or backward at once in a charSeeker before - // constructing a DOM node and checking the coordinates (which takes a - // significant fraction of a millisecond). From the - // coordinates and the approximate line height we can estimate how - // many lines we have moved. We risk being off if the number of lines - // we move is on the order of the line height in pixels. Fortunately, - // when the user boosts the font-size they increase both. - var maxCharIncrement = 20; - var seekerAtEnd = null; - - function getNumChars() - { - return lineNode.textContent.length; - } - - function getNumVirtualLines() - { - if (!seekerAtEnd) - { - var seeker = makeCharSeeker(); - seeker.forwardByWhile(maxCharIncrement); - seekerAtEnd = seeker; - } - return seekerAtEnd.getVirtualLine() + 1; - } - - function getVLineAndOffsetForChar(lineChar) - { - var seeker = makeCharSeeker(); - seeker.forwardByWhile(maxCharIncrement, null, lineChar); - var theLine = seeker.getVirtualLine(); - seeker.backwardByWhile(8, function() - { - return seeker.getVirtualLine() == theLine; - }); - seeker.forwardByWhile(1, function() - { - return seeker.getVirtualLine() != theLine; - }); - var lineStartChar = seeker.getOffset(); - return { - vline: theLine, - offset: (lineChar - lineStartChar) - }; - } - - function getCharForVLineAndOffset(vline, offset) - { - // returns revised vline and offset as well as absolute char index within line. - // if offset is beyond end of line, for example, will give new offset at end of line. - var seeker = makeCharSeeker(); - // go to start of line - seeker.binarySearch(function() - { - return seeker.getVirtualLine() >= vline; - }); - var lineStart = seeker.getOffset(); - var theLine = seeker.getVirtualLine(); - // go to offset, overshooting the virtual line only if offset is too large for it - seeker.forwardByWhile(maxCharIncrement, null, lineStart + offset); - // get back into line - seeker.backwardByWhile(1, function() - { - return seeker.getVirtualLine() != theLine; - }, lineStart); - var lineChar = seeker.getOffset(); - var theOffset = lineChar - lineStart; - // handle case of last virtual line; should be able to be at end of it - if (theOffset < offset && theLine == (getNumVirtualLines() - 1)) - { - var lineLen = getNumChars(); - theOffset += lineLen - lineChar; - lineChar = lineLen; - } - - return { - vline: theLine, - offset: theOffset, - lineChar: lineChar - }; - } - - return { - getNumVirtualLines: getNumVirtualLines, - getVLineAndOffsetForChar: getVLineAndOffsetForChar, - getCharForVLineAndOffset: getCharForVLineAndOffset, - makeCharSeeker: function() - { - return makeCharSeeker(); - } - }; - - function deepFirstChildTextNode(nd) - { - nd = nd.firstChild; - while (nd && nd.firstChild) nd = nd.firstChild; - if (nd.data) return nd; - return null; - } - - function makeCharSeeker( /*lineNode*/ ) - { - - function charCoords(tnode, i) - { - var container = tnode.parentNode; - - // treat space specially; a space at the end of a virtual line - // will have weird coordinates - var isSpace = (tnode.nodeValue.charAt(i) === " "); - if (isSpace) - { - if (i == 0) - { - if (container.previousSibling && deepFirstChildTextNode(container.previousSibling)) - { - tnode = deepFirstChildTextNode(container.previousSibling); - i = tnode.length - 1; - container = tnode.parentNode; - } - else - { - return { - top: container.offsetTop, - left: container.offsetLeft - }; - } - } - else - { - i--; // use previous char - } - } - - - var charWrapper = document.createElement("SPAN"); - - // wrap the character - var tnodeText = tnode.nodeValue; - var frag = document.createDocumentFragment(); - frag.appendChild(document.createTextNode(tnodeText.substring(0, i))); - charWrapper.appendChild(document.createTextNode(tnodeText.substr(i, 1))); - frag.appendChild(charWrapper); - frag.appendChild(document.createTextNode(tnodeText.substring(i + 1))); - container.replaceChild(frag, tnode); - - var result = { - top: charWrapper.offsetTop, - left: charWrapper.offsetLeft + (isSpace ? charWrapper.offsetWidth : 0), - height: charWrapper.offsetHeight - }; - - while (container.firstChild) container.removeChild(container.firstChild); - container.appendChild(tnode); - - return result; - } - - var lineText = lineNode.textContent; - var lineLength = lineText.length; - - var curNode = null; - var curChar = 0; - var curCharWithinNode = 0 - var curTop; - var curLeft; - var approxLineHeight; - var whichLine = 0; - - function nextNode() - { - var n = curNode; - if (!n) n = lineNode.firstChild; - else n = n.nextSibling; - while (n && !deepFirstChildTextNode(n)) - { - n = n.nextSibling; - } - return n; - } - - function prevNode() - { - var n = curNode; - if (!n) n = lineNode.lastChild; - else n = n.previousSibling; - while (n && !deepFirstChildTextNode(n)) - { - n = n.previousSibling; - } - return n; - } - - var seeker; - if (lineLength > 0) - { - curNode = nextNode(); - var firstCharData = charCoords(deepFirstChildTextNode(curNode), 0); - approxLineHeight = firstCharData.height; - curTop = firstCharData.top; - curLeft = firstCharData.left; - - function updateCharData(tnode, i) - { - var coords = charCoords(tnode, i); - whichLine += Math.round((coords.top - curTop) / approxLineHeight); - curTop = coords.top; - curLeft = coords.left; - } - - seeker = { - forward: function(numChars) - { - var oldChar = curChar; - var newChar = curChar + numChars; - if (newChar > (lineLength - 1)) newChar = lineLength - 1; - while (curChar < newChar) - { - var curNodeLength = deepFirstChildTextNode(curNode).length; - var toGo = curNodeLength - curCharWithinNode; - if (curChar + toGo > newChar || !nextNode()) - { - // going to next node would be too far - var n = newChar - curChar; - if (n >= toGo) n = toGo - 1; - curChar += n; - curCharWithinNode += n; - break; - } - else - { - // go to next node - curChar += toGo; - curCharWithinNode = 0; - curNode = nextNode(); - } - } - updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode); - return curChar - oldChar; - }, - backward: function(numChars) - { - var oldChar = curChar; - var newChar = curChar - numChars; - if (newChar < 0) newChar = 0; - while (curChar > newChar) - { - if (curChar - curCharWithinNode <= newChar || !prevNode()) - { - // going to prev node would be too far - var n = curChar - newChar; - if (n > curCharWithinNode) n = curCharWithinNode; - curChar -= n; - curCharWithinNode -= n; - break; - } - else - { - // go to prev node - curChar -= curCharWithinNode + 1; - curNode = prevNode(); - curCharWithinNode = deepFirstChildTextNode(curNode).length - 1; - } - } - updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode); - return oldChar - curChar; - }, - getVirtualLine: function() - { - return whichLine; - }, - getLeftCoord: function() - { - return curLeft; - } - }; - } - else - { - curLeft = lineNode.offsetLeft; - seeker = { - forward: function(numChars) - { - return 0; - }, - backward: function(numChars) - { - return 0; - }, - getVirtualLine: function() - { - return 0; - }, - getLeftCoord: function() - { - return curLeft; - } - }; - } - seeker.getOffset = function() - { - return curChar; - }; - seeker.getLineLength = function() - { - return lineLength; - }; - seeker.toString = function() - { - return "seeker[curChar: " + curChar + "(" + lineText.charAt(curChar) + "), left: " + seeker.getLeftCoord() + ", vline: " + seeker.getVirtualLine() + "]"; - }; - - function moveByWhile(isBackward, amount, optCondFunc, optCharLimit) - { - var charsMovedLast = null; - var hasCondFunc = ((typeof optCondFunc) == "function"); - var condFunc = optCondFunc; - var hasCharLimit = ((typeof optCharLimit) == "number"); - var charLimit = optCharLimit; - while (charsMovedLast !== 0 && ((!hasCondFunc) || condFunc())) - { - var toMove = amount; - if (hasCharLimit) - { - var untilLimit = (isBackward ? curChar - charLimit : charLimit - curChar); - if (untilLimit < toMove) toMove = untilLimit; - } - if (toMove < 0) break; - charsMovedLast = (isBackward ? seeker.backward(toMove) : seeker.forward(toMove)); - } - } - - seeker.forwardByWhile = function(amount, optCondFunc, optCharLimit) - { - moveByWhile(false, amount, optCondFunc, optCharLimit); - } - seeker.backwardByWhile = function(amount, optCondFunc, optCharLimit) - { - moveByWhile(true, amount, optCondFunc, optCharLimit); - } - seeker.binarySearch = function(condFunc) - { - // returns index of boundary between false chars and true chars; - // positions seeker at first true char, or else last char - var trueFunc = condFunc; - var falseFunc = function() - { - return !condFunc(); - }; - seeker.forwardByWhile(20, falseFunc); - seeker.backwardByWhile(20, trueFunc); - seeker.forwardByWhile(10, falseFunc); - seeker.backwardByWhile(5, trueFunc); - seeker.forwardByWhile(1, falseFunc); - return seeker.getOffset() + (condFunc() ? 0 : 1); - } - - return seeker; - } - -} - -exports.makeVirtualLineView = makeVirtualLineView; diff --git a/src/templates/admin/index.html b/src/templates/admin/index.html index 48776515..750a4b52 100644 --- a/src/templates/admin/index.html +++ b/src/templates/admin/index.html @@ -1,24 +1,24 @@ -<!doctype html>
-<html>
- <head>
- <title>Admin Dashboard - Etherpad</title>
- <meta name="viewport" content="width=device-width">
- <link rel="stylesheet" href="../static/css/admin.css">
- <script src="../static/js/jquery.js"></script>
- <script src="../socket.io/socket.io.js"></script>
- </head>
- <body>
- <div id="wrapper">
- <div class="menu">
- <h1>Etherpad</h1>
- <ul>
- <% e.begin_block("adminMenu"); %>
- <li><a href="plugins">Plugin manager</a> </li>
- <li><a href="settings">Settings</a> </li>
- <li><a href="plugins/info">Troubleshooting information</a> </li>
- <% e.end_block(); %>
- </ul>
- </div>
- </div>
- </body>
-</html>
+<!doctype html> +<html> + <head> + <title>Admin Dashboard - Etherpad</title> + <meta name="viewport" content="width=device-width"> + <link rel="stylesheet" href="../static/css/admin.css"> + <script src="../static/js/jquery.js"></script> + <script src="../socket.io/socket.io.js"></script> + </head> + <body> + <div id="wrapper"> + <div class="menu"> + <h1><a href="../../">Etherpad</a></h1> + <ul> + <% e.begin_block("adminMenu"); %> + <li><a href="plugins">Plugin manager</a> </li> + <li><a href="settings">Settings</a> </li> + <li><a href="plugins/info">Troubleshooting information</a> </li> + <% e.end_block(); %> + </ul> + </div> + </div> + </body> +</html> diff --git a/src/templates/admin/plugins-info.html b/src/templates/admin/plugins-info.html index d1ca9a11..ca6fbc82 100644 --- a/src/templates/admin/plugins-info.html +++ b/src/templates/admin/plugins-info.html @@ -1,7 +1,7 @@ <% var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); %> -<!doctype html> +<!doctype html> <html> <head> <title>Plugin information - Etherpad</title> @@ -11,7 +11,7 @@ <body> <div id="wrapper"> <div class="menu"> - <h1>Etherpad</h1> + <h1><a href="../../../">Etherpad</a></h1> <ul> <% e.begin_block("adminMenu"); %> <li><a href="../plugins">Plugin manager</a> </li> @@ -35,7 +35,7 @@ <h3>Client side hooks</h3> <div><%- plugins.formatHooks("client_hooks") %></div> - + </div> </div> </body> diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 7c2a7abf..75c47ad4 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -1,97 +1,114 @@ -<!doctype html>
-<html>
- <head>
- <title>Plugin manager - Etherpad</title>
- <meta name="viewport" content="width=device-width">
- <link rel="stylesheet" href="../static/css/admin.css">
- <script src="../static/js/jquery.js"></script>
- <script src="../socket.io/socket.io.js"></script>
- <script src="../static/js/admin/plugins.js"></script>
- </head>
- <body>
- <div id="wrapper">
-
- <% if (errors.length) { %>
- <div class="errors">
- <% errors.forEach(function (item) { %>
- <div class="error"><%= item.toString() %></div>
- <% }) %>
- </div>
- <% } %>
-
- <div class="menu">
- <h1>Etherpad</h1>
- <ul>
- <% e.begin_block("adminMenu"); %>
- <li><a href="plugins">Plugin manager</a> </li>
- <li><a href="settings">Settings</a> </li>
- <li><a href="plugins/info">Troubleshooting information</a> </li>
- <% e.end_block(); %>
- </ul>
- <div id="progress"><img src="../static/img/loading.gif"> <span class="message"></span></div>
- </div>
-
- <div class="innerwrapper">
- <h2>Installed plugins</h2>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Description</th>
- <th>Version</th>
- <td></td>
- </tr>
- </thead>
- <tbody class="template">
- <tr id="installed-plugin-template">
- <td class="name" data-label="Name"></td>
- <td class="description" data-label="Description"></td>
- <td class="version" data-label="Version"></td>
- <td class="actions">
- <input type="button" value="Uninstall" class="do-uninstall">
- </td>
- </tr>
- </tbody>
- <tbody id="installed-plugins">
- </tbody>
- </table>
-
- <div class="paged listing search-results">
- <div class="separator"></div>
-
- <h2>Available plugins</h2>
- <form>
- <input type="text" name="search" placeholder="Search for plugins to install" id="search-query">
- </form>
-
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Description</th>
- <th>Version</th>
- <td></td>
- </tr>
- </thead>
- <tbody class="template">
- <tr>
- <td class="name" data-label="Name"></td>
- <td class="description" data-label="Description"></td>
- <td class="version" data-label="Version"></td>
- <td class="actions">
- <input type="button" value="Install" class="do-install">
- </td>
- </tr>
- </tbody>
- <tbody class="results">
- </tbody>
- </table>
- <input type="button" value="<<" class="do-prev-page">
- <span class="offset"></span>..<span class="limit"></span> of <span class="total"></span>.
- <input type="button" value=">>" class="do-next-page">
- </div>
-
- </div>
- </div>
- </body>
-</html>
+<!doctype html> +<html> + <head> + <title>Plugin manager - Etherpad</title> + <meta name="viewport" content="width=device-width"> + <link rel="stylesheet" href="../static/css/admin.css"> + <script src="../static/js/jquery.js"></script> + <script src="../socket.io/socket.io.js"></script> + <script src="../static/js/admin/plugins.js"></script> + </head> + <body> + <div id="wrapper"> + + <% if (errors.length) { %> + <div class="errors"> + <% errors.forEach(function (item) { %> + <div class="error"><%= item.toString() %></div> + <% }) %> + </div> + <% } %> + + <div class="menu"> + <h1><a href="../../">Etherpad</a></h1> + <ul> + <% e.begin_block("adminMenu"); %> + <li><a href="plugins">Plugin manager</a> </li> + <li><a href="settings">Settings</a> </li> + <li><a href="plugins/info">Troubleshooting information</a> </li> + <% e.end_block(); %> + </ul> + </div> + + <div class="innerwrapper"> + <h2>Installed plugins</h2> + <table class="installed-results"> + <thead> + <tr> + <th>Name</th> + <th>Description</th> + <th>Version</th> + <td></td> + </tr> + </thead> + <tbody class="template"> + <tr id="installed-plugin-template"> + <td class="name" data-label="Name"></td> + <td class="description" data-label="Description"></td> + <td class="version" data-label="Version"></td> + <td> + <div class="actions"> + <input type="button" value="Uninstall" class="do-uninstall"> + <div class="progress"><p><img src="../static/img/loading.gif"/></p><p><span class="message"></span></p></div> + </div> + </td> + </tr> + </tbody> + <tbody id="installed-plugins"> + </tbody> + <tbody class="messages"> + <tr><td></td><td> + <p class="nothing-installed">You haven't installed any plugins yet.</p> + <p class="fetching"><img src="../static/img/loading.gif"/><br/>Fetching installed plugins...</p> + </td><td></td></tr> + </tbody> + </table> + + <div class="paged listing search-results"> + <div class="separator"></div> + + <h2>Available plugins</h2> + <form> + <input type="text" name="search" disabled placeholder="Search for plugins to install" id="search-query"> + </form> + + <table> + <thead> + <tr> + <th class="sort up" data-label="name">Name</th> + <th class="sort none" data-label="description">Description</th> + <th class="sort none" data-label="version">Version</th> + <td></td> + </tr> + </thead> + <tbody class="template"> + <tr> + <td class="name" data-label="Name"></td> + <td class="description" data-label="Description"></td> + <td class="version" data-label="Version"></td> + <td> + <div class="actions"> + <input type="button" value="Install" class="do-install"> + <div class="progress"><p><img src="../static/img/loading.gif"/></p><p><span class="message"></span></p></div> + </div> + </td> + </tr> + </tbody> + <tbody class="results"> + </tbody> + <tbody> + <tr><td></td><td> + <div class="messages"> + <div id="search-progress" class="progress"><p> </p></div> + <p class="nothing-found">No plugins found.</p> + <p class="fetching"><img src="../static/img/loading.gif"/><br/>Fetching...</p> + </div> + </td><td></td></tr> + </tbody> + </table> + </div> + + </div> + </div> + </body> +</html> diff --git a/src/templates/admin/settings.html b/src/templates/admin/settings.html index 4476b733..f6b8087c 100644 --- a/src/templates/admin/settings.html +++ b/src/templates/admin/settings.html @@ -1,49 +1,49 @@ -<!doctype html>
-<html>
- <head>
- <title>Settings - Etherpad</title>
- <meta name="viewport" content="width=device-width">
- <link rel="stylesheet" href="../static/css/admin.css">
- <script src="../static/js/jquery.js"></script>
- <script src="../socket.io/socket.io.js"></script>
- <script src="../static/js/admin/minify.json.js"></script>
- <script src="../static/js/admin/settings.js"></script>
- <script src="../static/js/admin/jquery.autosize.js"></script>
-
- </head>
- <body>
- <div id="wrapper">
-
- <% if (errors.length) { %>
- <div class="errors">
- <% errors.forEach(function (item) { %>
- <div class="error"><%= item.toString() %></div>
- <% }) %>
- </div>
- <% } %>
-
-
- <div class="menu">
- <h1>Etherpad</h1>
- <ul>
- <% e.begin_block("adminMenu"); %>
- <li><a href="plugins">Plugin manager</a> </li>
- <li><a href="settings">Settings</a> </li>
- <li><a href="plugins/info">Troubleshooting information</a> </li>
- <% e.end_block(); %>
- </ul>
- </div>
-
- <div class="innerwrapper">
- <h2>Current configuration</h2>
- <textarea class="settings"></textarea>
- <input type="button" class="settingsButton" id="saveSettings" value="Save Settings">
- <input type="button" class="settingsButton" id="restartEtherpad" value="Restart Etherpad">
- <div id="response"></div>
- <div class="separator"></div>
- <a href='https://github.com/ether/etherpad-lite/wiki/Example-Production-Settings.JSON'>Example production settings template</a>
- <a href='https://github.com/ether/etherpad-lite/wiki/Example-Development-Settings.JSON'>Example development settings template</a>
- </div>
- </div>
- </body>
-</html>
+<!doctype html> +<html> + <head> + <title>Settings - Etherpad</title> + <meta name="viewport" content="width=device-width"> + <link rel="stylesheet" href="../static/css/admin.css"> + <script src="../static/js/jquery.js"></script> + <script src="../socket.io/socket.io.js"></script> + <script src="../static/js/admin/minify.json.js"></script> + <script src="../static/js/admin/settings.js"></script> + <script src="../static/js/admin/jquery.autosize.js"></script> + + </head> + <body> + <div id="wrapper"> + + <% if (errors.length) { %> + <div class="errors"> + <% errors.forEach(function (item) { %> + <div class="error"><%= item.toString() %></div> + <% }) %> + </div> + <% } %> + + + <div class="menu"> + <h1><a href="../../">Etherpad</a></h1> + <ul> + <% e.begin_block("adminMenu"); %> + <li><a href="plugins">Plugin manager</a> </li> + <li><a href="settings">Settings</a> </li> + <li><a href="plugins/info">Troubleshooting information</a> </li> + <% e.end_block(); %> + </ul> + </div> + + <div class="innerwrapper"> + <h2>Current configuration</h2> + <textarea class="settings"></textarea> + <input type="button" class="settingsButton" id="saveSettings" value="Save Settings"> + <input type="button" class="settingsButton" id="restartEtherpad" value="Restart Etherpad"> + <div id="response"></div> + <div class="separator"></div> + <a href='https://github.com/ether/etherpad-lite/wiki/Example-Production-Settings.JSON'>Example production settings template</a> + <a href='https://github.com/ether/etherpad-lite/wiki/Example-Development-Settings.JSON'>Example development settings template</a> + </div> + </div> + </body> +</html> diff --git a/src/templates/index.html b/src/templates/index.html index 4f6d500b..02ecf67a 100644 --- a/src/templates/index.html +++ b/src/templates/index.html @@ -5,29 +5,29 @@ <html> <title><%=settings.title%></title> - <script> - /* - |@licstart The following is the entire license notice for the - JavaScript code in this page.| + <script> + /* + |@licstart The following is the entire license notice for the + JavaScript code in this page.| - Copyright 2011 Peter Martischka, Primary Technology. + Copyright 2011 Peter Martischka, Primary Technology. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. - |@licend The above is the entire license notice - for the JavaScript code in this page.| - */ - </script> + |@licend The above is the entire license notice + for the JavaScript code in this page.| + */ + </script> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"> diff --git a/src/templates/pad.html b/src/templates/pad.html index 1d8c069a..50fac86b 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -1,6 +1,8 @@ <% var settings = require("ep_etherpad-lite/node/utils/Settings") + , hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks') , langs = require("ep_etherpad-lite/node/hooks/i18n").availableLangs + ; %> <!doctype html> <% e.begin_block("htmlHead"); %> @@ -54,106 +56,19 @@ <div id="overlay"> <div id="overlay-inner"></div> </div> + <ul class="menu_left"> <% e.begin_block("editbarMenuLeft"); %> - <li class="acl-write" id="bold" data-key="bold"> - <a class="grouped-left" data-l10n-id="pad.toolbar.bold.title"> - <span class="buttonicon buttonicon-bold"></span> - </a> - </li> - <li class="acl-write" id="italic" data-key="italic"> - <a class="grouped-middle" data-l10n-id="pad.toolbar.italic.title"> - <span class="buttonicon buttonicon-italic"></span> - </a> - </li> - <li class="acl-write" id="underline" data-key="underline"> - <a class="grouped-middle" data-l10n-id="pad.toolbar.underline.title"> - <span class="buttonicon buttonicon-underline"></span> - </a> - </li> - <li class="acl-write" id="strikethrough" data-key="strikethrough"> - <a class="grouped-right" data-l10n-id="pad.toolbar.strikethrough.title"> - <span class="buttonicon buttonicon-strikethrough"></span> - </a> - </li> - <li class="acl-write separator"></li> - <li class="acl-write" id="oderedlist" data-key="insertorderedlist"> - <a class="grouped-left" data-l10n-id="pad.toolbar.ol.title"> - <span class="buttonicon buttonicon-insertorderedlist"></span> - </a> - </li> - <li class="acl-write" id="unoderedlist" data-key="insertunorderedlist"> - <a class="grouped-middle" data-l10n-id="pad.toolbar.ul.title"> - <span class="buttonicon buttonicon-insertunorderedlist"></span> - </a> - </li> - <li class="acl-write" id="indent" data-key="indent"> - <a class="grouped-middle" data-l10n-id="pad.toolbar.indent.title"> - <span class="buttonicon buttonicon-indent"></span> - </a> - </li> - <li class="acl-write" id="outdent" data-key="outdent"> - <a class="grouped-right" data-l10n-id="pad.toolbar.unindent.title"> - <span class="buttonicon buttonicon-outdent"></span> - </a> - </li> - <li class="acl-write separator"></li> - <li class="acl-write" id="undo" data-key="undo"> - <a class="grouped-left" data-l10n-id="pad.toolbar.undo.title"> - <span class="buttonicon buttonicon-undo"></span> - </a> - </li> - <li class="acl-write" id="redo" data-key="redo"> - <a class="grouped-right" data-l10n-id="pad.toolbar.redo.title"> - <span class="buttonicon buttonicon-redo"></span> - </a> - </li> - <li class="acl-write separator"></li> - <li class="acl-write" id="clearAuthorship" data-key="clearauthorship"> - <a data-l10n-id="pad.toolbar.clearAuthorship.title"> - <span class="buttonicon buttonicon-clearauthorship"></span> - </a> - </li> + <%- toolbar.menu(settings.toolbar.left) %> <% e.end_block(); %> </ul> <ul class="menu_right"> <% e.begin_block("editbarMenuRight"); %> - <li data-key="import_export"> - <a class="grouped-left" id="importexportlink" data-l10n-id="pad.toolbar.import_export.title"> - <span class="buttonicon buttonicon-import_export"></span> - </a> - </li> - <li onClick="document.location = document.location.pathname+ '/timeslider'"> - <a id="timesliderlink" class="grouped-middle" data-l10n-id="pad.toolbar.timeslider.title"> - <span class="buttonicon buttonicon-history"></span> - </a> - </li> - <li class="acl-write" data-key="savedRevision"> - <a class="grouped-right" id="revisionlink" data-l10n-id="pad.toolbar.savedRevision.title"> - <span class="buttonicon buttonicon-savedRevision"></span> - </a> - </li> - <li class="acl-write separator"></li> - <li class="acl-write" data-key="settings"> - <a class="grouped-left" id="settingslink" data-l10n-id="pad.toolbar.settings.title"> - <span class="buttonicon buttonicon-settings"></span> - </a> - </li> - <li data-key="embed"> - <a class="grouped-right" id="embedlink" data-l10n-id="pad.toolbar.embed.title"> - <span class="grouped-right buttonicon buttonicon-embed"></span> - </a> - </li> - <li class="separator"></li> - <li id="usericon" data-key="showusers"> - <a data-l10n-id="pad.toolbar.showusers.title"> - <span class="buttonicon buttonicon-showusers"></span> - <span id="online_count">1</span> - </a> - </li> + <%- toolbar.menu(settings.toolbar.right) %> <% e.end_block(); %> </ul> </div> + <% e.begin_block("afterEditbar"); %><% e.end_block(); %> <div id="users"> <% e.begin_block("userlist"); %> @@ -195,7 +110,9 @@ <div id="wrongPassword"> <p data-l10n-id="pad.wrongPassword">Your password was wrong</p> </div> + <% e.begin_block("loading"); %> <p data-l10n-id="pad.loading" id="loading">Loading...</p> + <% e.end_block(); %> <noscript><strong>Sorry, you have to enable Javascript in order to use this.</strong></noscript> </div> </div> @@ -271,7 +188,6 @@ <div id="import"></div> <div class="importmessage" id="importmessagesuccess" data-l10n-id="pad.importExport.importSuccessful"></div> <div class="importformdiv" id="importformsubmitdiv"> - <input type="hidden" name="padId" value="blpmaXT35R"> <span class="nowrap"> <input type="submit" name="submit" value="Import Now" disabled="disabled" id="importsubmitinput"> <img alt="" id="importstatusball" src="../static/img/loading.gif" align="top"> @@ -281,7 +197,7 @@ </form> <% e.end_block(); %> </div> - <div class="column"> + <div class="column" id="exportColumn"> <h2 data-l10n-id="pad.importExport.export"></h2> <% e.begin_block("exportColumn"); %> <a id="exporthtmla" target="_blank" class="exportlink"><div class="exporttype" id="exporthtml" data-l10n-id="pad.importExport.exporthtml"></div></a> @@ -293,7 +209,7 @@ <% e.end_block(); %> </div> </div> - + <div id="connectivity" class="popup"> <% e.begin_block("modals"); %> <div class="connected visible"> @@ -315,7 +231,7 @@ <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> </div> <div class="looping"> - <h1 data-l10n-id="pad.modals.looping"></h1> + <h1 data-l10n-id="pad.modals.disconnected"></h1> <h2 data-l10n-id="pad.modals.looping.explanation"></h2> <p data-l10n-id="pad.modals.looping.cause"></p> </div> @@ -325,11 +241,22 @@ <p data-l10n-id="pad.modals.initsocketfail.cause"></p> </div> <div class="slowcommit"> - <h1 data-l10n-id="pad.modals.slowcommit"></h1> + <h1 data-l10n-id="pad.modals.disconnected"></h1> <h2 data-l10n-id="pad.modals.slowcommit.explanation"></h2> <p data-l10n-id="pad.modals.slowcommit.cause"></p> <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> </div> + <div class="badChangeset"> + <h1 data-l10n-id="pad.modals.disconnected"></h1> + <h2 data-l10n-id="pad.modals.badChangeset.explanation"></h2> + <p data-l10n-id="pad.modals.badChangeset.cause"></p> + <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> + </div> + <div class="corruptPad"> + <h1 data-l10n-id="pad.modals.disconnected"></h1> + <h2 data-l10n-id="pad.modals.corruptPad.explanation"></h2> + <p data-l10n-id="pad.modals.corruptPad.cause"></p> + </div> <div class="deleted"> <h1 data-l10n-id="pad.modals.deleted"></h1> <p data-l10n-id="pad.modals.deleted.explanation"></p> @@ -359,12 +286,12 @@ <h1 data-l10n-id="pad.share"></h1> <div id="linkcode"> <h2 data-l10n-id="pad.share.link"></h2> - <input id="linkinput" type="text" value=""> + <input id="linkinput" type="text" value="" onclick="this.select()"> </div> <br> <div id="embedcode"> <h2 data-l10n-id="pad.share.emebdcode"></h2> - <input id="embedinput" type="text" value=""> + <input id="embedinput" type="text" value="" onclick="this.select()"> </div> <% e.end_block(); %> </div> @@ -376,7 +303,10 @@ </div> <div id="chatbox"> - <div id="titlebar"><span id ="titlelabel" data-l10n-id="pad.chat"></span><a id="titlecross" onClick="chat.hide();return false;">- </a></div> + <div id="titlebar"><span id ="titlelabel" data-l10n-id="pad.chat"></span> + <a id="titlecross" onClick="chat.hide();return false;">- </a> + <a id="titlesticky" onClick="chat.stickToScreen(true);$('#options-stickychat').prop('checked', true);return false;" title="Stick chat to screen">â–ˆ </a> + </div> <div id="chattext" class="authorColors"> <img alt="loading.." id="chatloadmessagesball" class="chatloadmessages" src="../static/img/loading.gif" align="top"> <button id="chatloadmessagesbutton" class="chatloadmessages" data-l10n-id="pad.chat.loadmessages"></button> @@ -395,7 +325,7 @@ <% e.begin_block("scripts"); %> <script type="text/javascript"> (function() { - // Display errors on page load to the user + // Display errors on page load to the user // (Gets overridden by padutils.setupGlobalExceptionHandler) var originalHandler = window.onerror; window.onerror = function(msg, url, line) { @@ -408,7 +338,7 @@ }; })(); </script> - + <script type="text/javascript" src="../static/js/require-kernel.js"></script> <script type="text/javascript" src="../socket.io/socket.io.js"></script> @@ -423,10 +353,10 @@ var clientVars = {}; (function () { var pathComponents = location.pathname.split('/'); - + // Strip 'p' and the padname from the pathname and set as baseURL var baseURL = pathComponents.slice(0,pathComponents.length-2).join('/') + '/'; - + require.setRootURI(baseURL + "javascripts/src"); require.setLibraryURI(baseURL + "javascripts/lib"); require.setGlobalKeyPath("require"); diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index d3062449..559b51b5 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -80,14 +80,9 @@ <div class="editbarright toolbar" id="editbar"> <% e.begin_block("timesliderEditbarRight"); %> <ul> - <li onClick="window.padeditbar.toolbarClick('import_export');return false;"> - <a id="exportlink" data-l10n-id="timeslider.toolbar.exportlink.title"> - <div class="buttonicon buttonicon-import_export"></div> - </a> - </li> + <%- toolbar.menu(settings.toolbar.timeslider) %> </ul> - <a id="returnbutton" data-l10n-id="timeslider.toolbar.returnbutton"></a> - <% e.end_block(); %> + <% e.end_block(); %> </div> <div> @@ -135,7 +130,7 @@ <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> </div> <div class="looping"> - <h1 data-l10n-id="pad.modals.looping"></h1> + <h1 data-l10n-id="pad.modals.disconnected"></h1> <h2 data-l10n-id="pad.modals.looping.explanation"></h2> <p data-l10n-id="pad.modals.looping.cause"></p> </div> @@ -145,20 +140,33 @@ <p data-l10n-id="pad.modals.initsocketfail.cause"></p> </div> <div class="slowcommit"> - <h1 data-l10n-id="pad.modals.slowcommit"></h1> + <h1 data-l10n-id="pad.modals.disconnected"></h1> <h2 data-l10n-id="pad.modals.slowcommit.explanation"></h2> <p data-l10n-id="pad.modals.slowcommit.cause"></p> <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> </div> + <div class="badChangeset"> + <h1 data-l10n-id="pad.modals.disconnected"></h1> + <h2 data-l10n-id="pad.modals.badChangeset.explanation"></h2> + <p data-l10n-id="pad.modals.badChangeset.cause"></p> + <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> + </div> + <div class="corruptPad"> + <h1 data-l10n-id="pad.modals.disconnected"></h1> + <h2 data-l10n-id="pad.modals.corruptPad.explanation"></h2> + <p data-l10n-id="pad.modals.corruptPad.cause"></p> + </div> <div class="deleted"> <h1 data-l10n-id="pad.modals.deleted"></h1> <p data-l10n-id="pad.modals.deleted.explanation"></p> </div> <div class="disconnected"> + <% e.begin_block("disconnected"); %> <h1 data-l10n-id="pad.modals.disconnected"></h1> <h2 data-l10n-id="pad.modals.disconnected.explanation"></h2> <p data-l10n-id="pad.modals.disconnected.cause"></p> <button id="forcereconnect" data-l10n-id="pad.modals.forcereconnect"></button> + <% e.end_block(); %> </div> <form id="reconnectform" method="post" action="/ep/pad/reconnect" accept-charset="UTF-8" style="display: none;"> <input type="hidden" class="padId" name="padId"> @@ -194,7 +202,7 @@ <!-- Bootstrap --> <script type="text/javascript" > var clientVars = {}; - + var BroadcastSlider; (function () { var pathComponents = location.pathname.split('/'); @@ -214,7 +222,7 @@ var plugins = require('ep_etherpad-lite/static/js/pluginfw/client_plugins'); var socket = require('ep_etherpad-lite/static/js/timeslider').socket; - + BroadcastSlider = require('ep_etherpad-lite/static/js/timeslider').BroadcastSlider; plugins.baseURL = baseURL; plugins.update(function () { @@ -228,6 +236,8 @@ /* TODO: These globals shouldn't exist. */ padeditbar = require('ep_etherpad-lite/static/js/pad_editbar').padeditbar; padimpexp = require('ep_etherpad-lite/static/js/pad_impexp').padimpexp; + + padeditbar.init() }); })(); </script> diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 00000000..1851305f --- /dev/null +++ b/tests/README.md @@ -0,0 +1,5 @@ +# About this folder: Tests + +## Frontend + +To run the tests, point your browser to `<yourdomainhere>/tests/frontend` diff --git a/tests/frontend/lib/sendkeys.js b/tests/frontend/lib/sendkeys.js index 9170fe7e..b5761847 100644 --- a/tests/frontend/lib/sendkeys.js +++ b/tests/frontend/lib/sendkeys.js @@ -27,278 +27,278 @@ (function($){ bililiteRange = function(el, debug){ - var ret; - if (debug){ - ret = new NothingRange(); // Easier to force it to use the no-selection type than to try to find an old browser - }else if (document.selection && !document.addEventListener){ - // Internet Explorer 8 and lower - ret = new IERange(); - }else if (window.getSelection && el.setSelectionRange){ - // Standards. Element is an input or textarea - ret = new InputRange(); - }else if (window.getSelection){ - // Standards, with any other kind of element - ret = new W3CRange() - }else{ - // doesn't support selection - ret = new NothingRange(); - } - ret._el = el; - ret._doc = el.ownerDocument; - ret._win = 'defaultView' in ret._doc ? ret._doc.defaultView : ret._doc.parentWindow; - ret._textProp = textProp(el); - ret._bounds = [0, ret.length()]; - return ret; + var ret; + if (debug){ + ret = new NothingRange(); // Easier to force it to use the no-selection type than to try to find an old browser + }else if (document.selection && !document.addEventListener){ + // Internet Explorer 8 and lower + ret = new IERange(); + }else if (window.getSelection && el.setSelectionRange){ + // Standards. Element is an input or textarea + ret = new InputRange(); + }else if (window.getSelection){ + // Standards, with any other kind of element + ret = new W3CRange() + }else{ + // doesn't support selection + ret = new NothingRange(); + } + ret._el = el; + ret._doc = el.ownerDocument; + ret._win = 'defaultView' in ret._doc ? ret._doc.defaultView : ret._doc.parentWindow; + ret._textProp = textProp(el); + ret._bounds = [0, ret.length()]; + return ret; } function textProp(el){ - // returns the property that contains the text of the element - if (typeof el.value != 'undefined') return 'value'; - if (typeof el.text != 'undefined') return 'text'; - if (typeof el.textContent != 'undefined') return 'textContent'; - return 'innerText'; + // returns the property that contains the text of the element + if (typeof el.value != 'undefined') return 'value'; + if (typeof el.text != 'undefined') return 'text'; + if (typeof el.textContent != 'undefined') return 'textContent'; + return 'innerText'; } // base class function Range(){} Range.prototype = { - length: function() { - return this._el[this._textProp].replace(/\r/g, '').length; // need to correct for IE's CrLf weirdness - }, - bounds: function(s){ - if (s === 'all'){ - this._bounds = [0, this.length()]; - }else if (s === 'start'){ - this._bounds = [0, 0]; - }else if (s === 'end'){ - this._bounds = [this.length(), this.length()]; - }else if (s === 'selection'){ - this.bounds ('all'); // first select the whole thing for constraining - this._bounds = this._nativeSelection(); - }else if (s){ - this._bounds = s; // don't error check now; the element may change at any moment, so constrain it when we need it. - }else{ - var b = [ - Math.max(0, Math.min (this.length(), this._bounds[0])), - Math.max(0, Math.min (this.length(), this._bounds[1])) - ]; - return b; // need to constrain it to fit - } - return this; // allow for chaining - }, - select: function(){ - this._nativeSelect(this._nativeRange(this.bounds())); - return this; // allow for chaining - }, - text: function(text, select){ - if (arguments.length){ - this._nativeSetText(text, this._nativeRange(this.bounds())); - if (select == 'start'){ - this.bounds ([this._bounds[0], this._bounds[0]]); - this.select(); - }else if (select == 'end'){ - this.bounds ([this._bounds[0]+text.length, this._bounds[0]+text.length]); - this.select(); - }else if (select == 'all'){ - this.bounds ([this._bounds[0], this._bounds[0]+text.length]); - this.select(); - } - return this; // allow for chaining - }else{ - return this._nativeGetText(this._nativeRange(this.bounds())); - } - }, - insertEOL: function (){ - this._nativeEOL(); - this._bounds = [this._bounds[0]+1, this._bounds[0]+1]; // move past the EOL marker - return this; - } + length: function() { + return this._el[this._textProp].replace(/\r/g, '').length; // need to correct for IE's CrLf weirdness + }, + bounds: function(s){ + if (s === 'all'){ + this._bounds = [0, this.length()]; + }else if (s === 'start'){ + this._bounds = [0, 0]; + }else if (s === 'end'){ + this._bounds = [this.length(), this.length()]; + }else if (s === 'selection'){ + this.bounds ('all'); // first select the whole thing for constraining + this._bounds = this._nativeSelection(); + }else if (s){ + this._bounds = s; // don't error check now; the element may change at any moment, so constrain it when we need it. + }else{ + var b = [ + Math.max(0, Math.min (this.length(), this._bounds[0])), + Math.max(0, Math.min (this.length(), this._bounds[1])) + ]; + return b; // need to constrain it to fit + } + return this; // allow for chaining + }, + select: function(){ + this._nativeSelect(this._nativeRange(this.bounds())); + return this; // allow for chaining + }, + text: function(text, select){ + if (arguments.length){ + this._nativeSetText(text, this._nativeRange(this.bounds())); + if (select == 'start'){ + this.bounds ([this._bounds[0], this._bounds[0]]); + this.select(); + }else if (select == 'end'){ + this.bounds ([this._bounds[0]+text.length, this._bounds[0]+text.length]); + this.select(); + }else if (select == 'all'){ + this.bounds ([this._bounds[0], this._bounds[0]+text.length]); + this.select(); + } + return this; // allow for chaining + }else{ + return this._nativeGetText(this._nativeRange(this.bounds())); + } + }, + insertEOL: function (){ + this._nativeEOL(); + this._bounds = [this._bounds[0]+1, this._bounds[0]+1]; // move past the EOL marker + return this; + } }; function IERange(){} IERange.prototype = new Range(); IERange.prototype._nativeRange = function (bounds){ - var rng; - if (this._el.tagName == 'INPUT'){ - // IE 8 is very inconsistent; textareas have createTextRange but it doesn't work - rng = this._el.createTextRange(); - }else{ - rng = this._doc.body.createTextRange (); - rng.moveToElementText(this._el); - } - if (bounds){ - if (bounds[1] < 0) bounds[1] = 0; // IE tends to run elements out of bounds - if (bounds[0] > this.length()) bounds[0] = this.length(); - if (bounds[1] < rng.text.replace(/\r/g, '').length){ // correct for IE's CrLf wierdness - // block-display elements have an invisible, uncounted end of element marker, so we move an extra one and use the current length of the range - rng.moveEnd ('character', -1); - rng.moveEnd ('character', bounds[1]-rng.text.replace(/\r/g, '').length); - } - if (bounds[0] > 0) rng.moveStart('character', bounds[0]); - } - return rng; + var rng; + if (this._el.tagName == 'INPUT'){ + // IE 8 is very inconsistent; textareas have createTextRange but it doesn't work + rng = this._el.createTextRange(); + }else{ + rng = this._doc.body.createTextRange (); + rng.moveToElementText(this._el); + } + if (bounds){ + if (bounds[1] < 0) bounds[1] = 0; // IE tends to run elements out of bounds + if (bounds[0] > this.length()) bounds[0] = this.length(); + if (bounds[1] < rng.text.replace(/\r/g, '').length){ // correct for IE's CrLf wierdness + // block-display elements have an invisible, uncounted end of element marker, so we move an extra one and use the current length of the range + rng.moveEnd ('character', -1); + rng.moveEnd ('character', bounds[1]-rng.text.replace(/\r/g, '').length); + } + if (bounds[0] > 0) rng.moveStart('character', bounds[0]); + } + return rng; }; IERange.prototype._nativeSelect = function (rng){ - rng.select(); + rng.select(); }; IERange.prototype._nativeSelection = function (){ - // returns [start, end] for the selection constrained to be in element - var rng = this._nativeRange(); // range of the element to constrain to - var len = this.length(); - if (this._doc.selection.type != 'Text') return [0,0]; // append to the end - var sel = this._doc.selection.createRange(); - try{ - return [ - iestart(sel, rng), - ieend (sel, rng) - ]; - }catch (e){ - // IE gets upset sometimes about comparing text to input elements, but the selections cannot overlap, so make a best guess - return (sel.parentElement().sourceIndex < this._el.sourceIndex) ? [0,0] : [len, len]; - } + // returns [start, end] for the selection constrained to be in element + var rng = this._nativeRange(); // range of the element to constrain to + var len = this.length(); + if (this._doc.selection.type != 'Text') return [0,0]; // append to the end + var sel = this._doc.selection.createRange(); + try{ + return [ + iestart(sel, rng), + ieend (sel, rng) + ]; + }catch (e){ + // IE gets upset sometimes about comparing text to input elements, but the selections cannot overlap, so make a best guess + return (sel.parentElement().sourceIndex < this._el.sourceIndex) ? [0,0] : [len, len]; + } }; IERange.prototype._nativeGetText = function (rng){ - return rng.text.replace(/\r/g, ''); // correct for IE's CrLf weirdness + return rng.text.replace(/\r/g, ''); // correct for IE's CrLf weirdness }; IERange.prototype._nativeSetText = function (text, rng){ - rng.text = text; + rng.text = text; }; IERange.prototype._nativeEOL = function(){ - if (typeof this._el.value != 'undefined'){ - this.text('\n'); // for input and textarea, insert it straight - }else{ - this._nativeRange(this.bounds()).pasteHTML('<br/>'); - } + if (typeof this._el.value != 'undefined'){ + this.text('\n'); // for input and textarea, insert it straight + }else{ + this._nativeRange(this.bounds()).pasteHTML('<br/>'); + } }; // IE internals function iestart(rng, constraint){ - // returns the position (in character) of the start of rng within constraint. If it's not in constraint, returns 0 if it's before, length if it's after - var len = constraint.text.replace(/\r/g, '').length; // correct for IE's CrLf wierdness - if (rng.compareEndPoints ('StartToStart', constraint) <= 0) return 0; // at or before the beginning - if (rng.compareEndPoints ('StartToEnd', constraint) >= 0) return len; - for (var i = 0; rng.compareEndPoints ('StartToStart', constraint) > 0; ++i, rng.moveStart('character', -1)); - return i; + // returns the position (in character) of the start of rng within constraint. If it's not in constraint, returns 0 if it's before, length if it's after + var len = constraint.text.replace(/\r/g, '').length; // correct for IE's CrLf wierdness + if (rng.compareEndPoints ('StartToStart', constraint) <= 0) return 0; // at or before the beginning + if (rng.compareEndPoints ('StartToEnd', constraint) >= 0) return len; + for (var i = 0; rng.compareEndPoints ('StartToStart', constraint) > 0; ++i, rng.moveStart('character', -1)); + return i; } function ieend (rng, constraint){ - // returns the position (in character) of the end of rng within constraint. If it's not in constraint, returns 0 if it's before, length if it's after - var len = constraint.text.replace(/\r/g, '').length; // correct for IE's CrLf wierdness - if (rng.compareEndPoints ('EndToEnd', constraint) >= 0) return len; // at or after the end - if (rng.compareEndPoints ('EndToStart', constraint) <= 0) return 0; - for (var i = 0; rng.compareEndPoints ('EndToStart', constraint) > 0; ++i, rng.moveEnd('character', -1)); - return i; + // returns the position (in character) of the end of rng within constraint. If it's not in constraint, returns 0 if it's before, length if it's after + var len = constraint.text.replace(/\r/g, '').length; // correct for IE's CrLf wierdness + if (rng.compareEndPoints ('EndToEnd', constraint) >= 0) return len; // at or after the end + if (rng.compareEndPoints ('EndToStart', constraint) <= 0) return 0; + for (var i = 0; rng.compareEndPoints ('EndToStart', constraint) > 0; ++i, rng.moveEnd('character', -1)); + return i; } // an input element in a standards document. "Native Range" is just the bounds array function InputRange(){} InputRange.prototype = new Range(); InputRange.prototype._nativeRange = function(bounds) { - return bounds || [0, this.length()]; + return bounds || [0, this.length()]; }; InputRange.prototype._nativeSelect = function (rng){ - this._el.setSelectionRange(rng[0], rng[1]); + this._el.setSelectionRange(rng[0], rng[1]); }; InputRange.prototype._nativeSelection = function(){ - return [this._el.selectionStart, this._el.selectionEnd]; + return [this._el.selectionStart, this._el.selectionEnd]; }; InputRange.prototype._nativeGetText = function(rng){ - return this._el.value.substring(rng[0], rng[1]); + return this._el.value.substring(rng[0], rng[1]); }; InputRange.prototype._nativeSetText = function(text, rng){ - var val = this._el.value; - this._el.value = val.substring(0, rng[0]) + text + val.substring(rng[1]); + var val = this._el.value; + this._el.value = val.substring(0, rng[0]) + text + val.substring(rng[1]); }; InputRange.prototype._nativeEOL = function(){ - this.text('\n'); + this.text('\n'); }; function W3CRange(){} W3CRange.prototype = new Range(); W3CRange.prototype._nativeRange = function (bounds){ - var rng = this._doc.createRange(); - rng.selectNodeContents(this._el); - if (bounds){ - w3cmoveBoundary (rng, bounds[0], true, this._el); - rng.collapse (true); - w3cmoveBoundary (rng, bounds[1]-bounds[0], false, this._el); - } - return rng; + var rng = this._doc.createRange(); + rng.selectNodeContents(this._el); + if (bounds){ + w3cmoveBoundary (rng, bounds[0], true, this._el); + rng.collapse (true); + w3cmoveBoundary (rng, bounds[1]-bounds[0], false, this._el); + } + return rng; }; W3CRange.prototype._nativeSelect = function (rng){ - this._win.getSelection().removeAllRanges(); - this._win.getSelection().addRange (rng); + this._win.getSelection().removeAllRanges(); + this._win.getSelection().addRange (rng); }; W3CRange.prototype._nativeSelection = function (){ - // returns [start, end] for the selection constrained to be in element - var rng = this._nativeRange(); // range of the element to constrain to - if (this._win.getSelection().rangeCount == 0) return [this.length(), this.length()]; // append to the end - var sel = this._win.getSelection().getRangeAt(0); - return [ - w3cstart(sel, rng), - w3cend (sel, rng) - ]; - } + // returns [start, end] for the selection constrained to be in element + var rng = this._nativeRange(); // range of the element to constrain to + if (this._win.getSelection().rangeCount == 0) return [this.length(), this.length()]; // append to the end + var sel = this._win.getSelection().getRangeAt(0); + return [ + w3cstart(sel, rng), + w3cend (sel, rng) + ]; + } W3CRange.prototype._nativeGetText = function (rng){ - return rng.toString(); + return rng.toString(); }; W3CRange.prototype._nativeSetText = function (text, rng){ - rng.deleteContents(); - rng.insertNode (this._doc.createTextNode(text)); - this._el.normalize(); // merge the text with the surrounding text + rng.deleteContents(); + rng.insertNode (this._doc.createTextNode(text)); + this._el.normalize(); // merge the text with the surrounding text }; W3CRange.prototype._nativeEOL = function(){ - var rng = this._nativeRange(this.bounds()); - rng.deleteContents(); - var br = this._doc.createElement('br'); - br.setAttribute ('_moz_dirty', ''); // for Firefox - rng.insertNode (br); - rng.insertNode (this._doc.createTextNode('\n')); - rng.collapse (false); + var rng = this._nativeRange(this.bounds()); + rng.deleteContents(); + var br = this._doc.createElement('br'); + br.setAttribute ('_moz_dirty', ''); // for Firefox + rng.insertNode (br); + rng.insertNode (this._doc.createTextNode('\n')); + rng.collapse (false); }; // W3C internals function nextnode (node, root){ - // in-order traversal - // we've already visited node, so get kids then siblings - if (node.firstChild) return node.firstChild; - if (node.nextSibling) return node.nextSibling; - if (node===root) return null; - while (node.parentNode){ - // get uncles - node = node.parentNode; - if (node == root) return null; - if (node.nextSibling) return node.nextSibling; - } - return null; + // in-order traversal + // we've already visited node, so get kids then siblings + if (node.firstChild) return node.firstChild; + if (node.nextSibling) return node.nextSibling; + if (node===root) return null; + while (node.parentNode){ + // get uncles + node = node.parentNode; + if (node == root) return null; + if (node.nextSibling) return node.nextSibling; + } + return null; } function w3cmoveBoundary (rng, n, bStart, el){ - // move the boundary (bStart == true ? start : end) n characters forward, up to the end of element el. Forward only! - // if the start is moved after the end, then an exception is raised - if (n <= 0) return; - var node = rng[bStart ? 'startContainer' : 'endContainer']; - if (node.nodeType == 3){ - // we may be starting somewhere into the text - n += rng[bStart ? 'startOffset' : 'endOffset']; - } - while (node){ - if (node.nodeType == 3){ - if (n <= node.nodeValue.length){ - rng[bStart ? 'setStart' : 'setEnd'](node, n); - // special case: if we end next to a <br>, include that node. - if (n == node.nodeValue.length){ - // skip past zero-length text nodes - for (var next = nextnode (node, el); next && next.nodeType==3 && next.nodeValue.length == 0; next = nextnode(next, el)){ - rng[bStart ? 'setStartAfter' : 'setEndAfter'](next); - } - if (next && next.nodeType == 1 && next.nodeName == "BR") rng[bStart ? 'setStartAfter' : 'setEndAfter'](next); - } - return; - }else{ - rng[bStart ? 'setStartAfter' : 'setEndAfter'](node); // skip past this one - n -= node.nodeValue.length; // and eat these characters - } - } - node = nextnode (node, el); - } + // move the boundary (bStart == true ? start : end) n characters forward, up to the end of element el. Forward only! + // if the start is moved after the end, then an exception is raised + if (n <= 0) return; + var node = rng[bStart ? 'startContainer' : 'endContainer']; + if (node.nodeType == 3){ + // we may be starting somewhere into the text + n += rng[bStart ? 'startOffset' : 'endOffset']; + } + while (node){ + if (node.nodeType == 3){ + if (n <= node.nodeValue.length){ + rng[bStart ? 'setStart' : 'setEnd'](node, n); + // special case: if we end next to a <br>, include that node. + if (n == node.nodeValue.length){ + // skip past zero-length text nodes + for (var next = nextnode (node, el); next && next.nodeType==3 && next.nodeValue.length == 0; next = nextnode(next, el)){ + rng[bStart ? 'setStartAfter' : 'setEndAfter'](next); + } + if (next && next.nodeType == 1 && next.nodeName == "BR") rng[bStart ? 'setStartAfter' : 'setEndAfter'](next); + } + return; + }else{ + rng[bStart ? 'setStartAfter' : 'setEndAfter'](node); // skip past this one + n -= node.nodeValue.length; // and eat these characters + } + } + node = nextnode (node, el); + } } var START_TO_START = 0; // from the w3c definitions var START_TO_END = 1; @@ -311,39 +311,39 @@ var END_TO_START = 3; // * Range.START_TO_END compares the start boundary-point of sourceRange to the end boundary-point of range. // * Range.START_TO_START compares the start boundary-point of sourceRange to the start boundary-point of range. function w3cstart(rng, constraint){ - if (rng.compareBoundaryPoints (START_TO_START, constraint) <= 0) return 0; // at or before the beginning - if (rng.compareBoundaryPoints (END_TO_START, constraint) >= 0) return constraint.toString().length; - rng = rng.cloneRange(); // don't change the original - rng.setEnd (constraint.endContainer, constraint.endOffset); // they now end at the same place - return constraint.toString().length - rng.toString().length; + if (rng.compareBoundaryPoints (START_TO_START, constraint) <= 0) return 0; // at or before the beginning + if (rng.compareBoundaryPoints (END_TO_START, constraint) >= 0) return constraint.toString().length; + rng = rng.cloneRange(); // don't change the original + rng.setEnd (constraint.endContainer, constraint.endOffset); // they now end at the same place + return constraint.toString().length - rng.toString().length; } function w3cend (rng, constraint){ - if (rng.compareBoundaryPoints (END_TO_END, constraint) >= 0) return constraint.toString().length; // at or after the end - if (rng.compareBoundaryPoints (START_TO_END, constraint) <= 0) return 0; - rng = rng.cloneRange(); // don't change the original - rng.setStart (constraint.startContainer, constraint.startOffset); // they now start at the same place - return rng.toString().length; + if (rng.compareBoundaryPoints (END_TO_END, constraint) >= 0) return constraint.toString().length; // at or after the end + if (rng.compareBoundaryPoints (START_TO_END, constraint) <= 0) return 0; + rng = rng.cloneRange(); // don't change the original + rng.setStart (constraint.startContainer, constraint.startOffset); // they now start at the same place + return rng.toString().length; } function NothingRange(){} NothingRange.prototype = new Range(); NothingRange.prototype._nativeRange = function(bounds) { - return bounds || [0,this.length()]; + return bounds || [0,this.length()]; }; NothingRange.prototype._nativeSelect = function (rng){ // do nothing }; NothingRange.prototype._nativeSelection = function(){ - return [0,0]; + return [0,0]; }; NothingRange.prototype._nativeGetText = function (rng){ - return this._el[this._textProp].substring(rng[0], rng[1]); + return this._el[this._textProp].substring(rng[0], rng[1]); }; NothingRange.prototype._nativeSetText = function (text, rng){ - var val = this._el[this._textProp]; - this._el[this._textProp] = val.substring(0, rng[0]) + text + val.substring(rng[1]); + var val = this._el[this._textProp]; + this._el[this._textProp] = val.substring(0, rng[0]) + text + val.substring(rng[1]); }; NothingRange.prototype._nativeEOL = function(){ - this.text('\n'); + this.text('\n'); }; })(jQuery); @@ -378,90 +378,90 @@ NothingRange.prototype._nativeEOL = function(){ (function($){ $.fn.sendkeys = function (x, opts){ - return this.each( function(){ - var localkeys = $.extend({}, opts, $(this).data('sendkeys')); // allow for element-specific key functions - // most elements to not keep track of their selection when they lose focus, so we have to do it for them - var rng = $.data (this, 'sendkeys.selection'); - if (!rng){ - rng = bililiteRange(this).bounds('selection'); - $.data(this, 'sendkeys.selection', rng); - $(this).bind('mouseup.sendkeys', function(){ - // we have to update the saved range. The routines here update the bounds with each press, but actual keypresses and mouseclicks do not - $.data(this, 'sendkeys.selection').bounds('selection'); - }).bind('keyup.sendkeys', function(evt){ - // restore the selection if we got here with a tab (a click should select what was clicked on) - if (evt.which == 9){ - // there's a flash of selection when we restore the focus, but I don't know how to avoid that. - $.data(this, 'sendkeys.selection').select(); - }else{ - $.data(this, 'sendkeys.selection').bounds('selection'); - } - }); - } - this.focus(); - if (typeof x === 'undefined') return; // no string, so we just set up the event handlers - $.data(this, 'sendkeys.originalText', rng.text()); - x.replace(/\n/g, '{enter}'). // turn line feeds into explicit break insertions - replace(/{[^}]*}|[^{]+/g, function(s){ - (localkeys[s] || $.fn.sendkeys.defaults[s] || $.fn.sendkeys.defaults.simplechar)(rng, s); - }); - $(this).trigger({type: 'sendkeys', which: x}); - }); + return this.each( function(){ + var localkeys = $.extend({}, opts, $(this).data('sendkeys')); // allow for element-specific key functions + // most elements to not keep track of their selection when they lose focus, so we have to do it for them + var rng = $.data (this, 'sendkeys.selection'); + if (!rng){ + rng = bililiteRange(this).bounds('selection'); + $.data(this, 'sendkeys.selection', rng); + $(this).bind('mouseup.sendkeys', function(){ + // we have to update the saved range. The routines here update the bounds with each press, but actual keypresses and mouseclicks do not + $.data(this, 'sendkeys.selection').bounds('selection'); + }).bind('keyup.sendkeys', function(evt){ + // restore the selection if we got here with a tab (a click should select what was clicked on) + if (evt.which == 9){ + // there's a flash of selection when we restore the focus, but I don't know how to avoid that + $.data(this, 'sendkeys.selection').select(); + }else{ + $.data(this, 'sendkeys.selection').bounds('selection'); + } + }); + } + this.focus(); + if (typeof x === 'undefined') return; // no string, so we just set up the event handlers + $.data(this, 'sendkeys.originalText', rng.text()); + x.replace(/\n/g, '{enter}'). // turn line feeds into explicit break insertions + replace(/{[^}]*}|[^{]+/g, function(s){ + (localkeys[s] || $.fn.sendkeys.defaults[s] || $.fn.sendkeys.defaults.simplechar)(rng, s); + }); + $(this).trigger({type: 'sendkeys', which: x}); + }); }; // sendkeys // add the functions publicly so they can be overridden $.fn.sendkeys.defaults = { - simplechar: function (rng, s){ - rng.text(s, 'end'); - for (var i =0; i < s.length; ++i){ - var x = s.charCodeAt(i); - // a bit of cheating: rng._el is the element associated with rng. - $(rng._el).trigger({type: 'keypress', keyCode: x, which: x, charCode: x}); - } - }, - '{{}': function (rng){ - $.fn.sendkeys.defaults.simplechar (rng, '{') - }, - '{enter}': function (rng){ - rng.insertEOL(); - rng.select(); - var x = '\n'.charCodeAt(0); - $(rng._el).trigger({type: 'keypress', keyCode: x, which: x, charCode: x}); - }, - '{backspace}': function (rng){ - var b = rng.bounds(); - if (b[0] == b[1]) rng.bounds([b[0]-1, b[0]]); // no characters selected; it's just an insertion point. Remove the previous character - rng.text('', 'end'); // delete the characters and update the selection - }, - '{del}': function (rng){ - var b = rng.bounds(); - if (b[0] == b[1]) rng.bounds([b[0], b[0]+1]); // no characters selected; it's just an insertion point. Remove the next character - rng.text('', 'end'); // delete the characters and update the selection - }, - '{rightarrow}': function (rng){ - var b = rng.bounds(); - if (b[0] == b[1]) ++b[1]; // no characters selected; it's just an insertion point. Move to the right - rng.bounds([b[1], b[1]]).select(); - }, - '{leftarrow}': function (rng){ - var b = rng.bounds(); - if (b[0] == b[1]) --b[0]; // no characters selected; it's just an insertion point. Move to the left - rng.bounds([b[0], b[0]]).select(); - }, - '{selectall}' : function (rng){ - rng.bounds('all').select(); - }, - '{selection}': function (rng){ - $.fn.sendkeys.defaults.simplechar(rng, $.data(rng._el, 'sendkeys.originalText')); - }, - '{mark}' : function (rng){ - var bounds = rng.bounds(); - $(rng._el).one('sendkeys', function(){ - // set up the event listener to change the selection after the sendkeys is done - rng.bounds(bounds).select(); - }); - } + simplechar: function (rng, s){ + rng.text(s, 'end'); + for (var i =0; i < s.length; ++i){ + var x = s.charCodeAt(i); + // a bit of cheating: rng._el is the element associated with rng. + $(rng._el).trigger({type: 'keypress', keyCode: x, which: x, charCode: x}); + } + }, + '{{}': function (rng){ + $.fn.sendkeys.defaults.simplechar (rng, '{') + }, + '{enter}': function (rng){ + rng.insertEOL(); + rng.select(); + var x = '\n'.charCodeAt(0); + $(rng._el).trigger({type: 'keypress', keyCode: x, which: x, charCode: x}); + }, + '{backspace}': function (rng){ + var b = rng.bounds(); + if (b[0] == b[1]) rng.bounds([b[0]-1, b[0]]); // no characters selected; it's just an insertion point. Remove the previous character + rng.text('', 'end'); // delete the characters and update the selection + }, + '{del}': function (rng){ + var b = rng.bounds(); + if (b[0] == b[1]) rng.bounds([b[0], b[0]+1]); // no characters selected; it's just an insertion point. Remove the next character + rng.text('', 'end'); // delete the characters and update the selection + }, + '{rightarrow}': function (rng){ + var b = rng.bounds(); + if (b[0] == b[1]) ++b[1]; // no characters selected; it's just an insertion point. Move to the right + rng.bounds([b[1], b[1]]).select(); + }, + '{leftarrow}': function (rng){ + var b = rng.bounds(); + if (b[0] == b[1]) --b[0]; // no characters selected; it's just an insertion point. Move to the left + rng.bounds([b[0], b[0]]).select(); + }, + '{selectall}' : function (rng){ + rng.bounds('all').select(); + }, + '{selection}': function (rng){ + $.fn.sendkeys.defaults.simplechar(rng, $.data(rng._el, 'sendkeys.originalText')); + }, + '{mark}' : function (rng){ + var bounds = rng.bounds(); + $(rng._el).one('sendkeys', function(){ + // set up the event listener to change the selection after the sendkeys is done + rng.bounds(bounds).select(); + }); + } }; })(jQuery) diff --git a/tests/frontend/runner.js b/tests/frontend/runner.js index 55f0a45b..8f722125 100644 --- a/tests/frontend/runner.js +++ b/tests/frontend/runner.js @@ -188,14 +188,14 @@ $(function(){ //initalize the test helper helper.init(function(){ - //configure and start the test framework + //configure and start the test framework var grep = getURLParameter("grep"); if(grep != "null"){ mocha.grep(grep); } - mocha.ignoreLeaks(); - + mocha.ignoreLeaks(); + mocha.reporter(WebdriverAndHtmlReporter(mocha._reporter)); mocha.run(); diff --git a/tests/frontend/specs/alphabet.js b/tests/frontend/specs/alphabet.js index 131a81c0..ae9570e4 100644 --- a/tests/frontend/specs/alphabet.js +++ b/tests/frontend/specs/alphabet.js @@ -18,7 +18,7 @@ describe("All the alphabet works n stuff", function(){ firstTextElement.sendkeys('{selectall}'); // select all firstTextElement.sendkeys('{del}'); // clear the first line firstTextElement.sendkeys(expectedString); // insert the string - + helper.waitFor(function(){ return inner$("div").first().text() === expectedString; }, 2000).done(done); diff --git a/tests/frontend/specs/bold.js b/tests/frontend/specs/bold.js index 2fb6bbfe..95da7331 100644 --- a/tests/frontend/specs/bold.js +++ b/tests/frontend/specs/bold.js @@ -43,8 +43,13 @@ describe("bold button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); + if(inner$.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } - var e = inner$.Event("keydown"); + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 66; // b inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/caret.js b/tests/frontend/specs/caret.js new file mode 100644 index 00000000..b33f5168 --- /dev/null +++ b/tests/frontend/specs/caret.js @@ -0,0 +1,334 @@ +describe("As the caret is moved is the UI properly updated?", function(){ + var padName; + var numberOfRows = 50; + + it("creates a pad", function(done) { + padName = helper.newPad(done); + this.timeout(60000); + }); + + /* Tests to do + * Keystroke up (38), down (40), left (37), right (39) with and without special keys IE control / shift + * Page up (33) / down (34) with and without special keys + * Page up on the first line shouldn't move the viewport + * Down down on the last line shouldn't move the viewport + * Down arrow on any other line except the last lines shouldn't move the viewport + * Do all of the above tests after a copy/paste event + */ + + /* Challenges + * How do we keep the authors focus on a line if the lines above the author are modified? We should only redraw the user to a location if they are typing and make sure shift and arrow keys aren't redrawing the UI else highlight - copy/paste would get broken + * How can we simulate an edit event in the test framework? + */ + + // THIS DOESNT WORK AS IT DOESNT MOVE THE CURSOR! + it("down arrow", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + $newFirstTextElement.focus(); + keyEvent(inner$, 37, false, false); // arrow down + keyEvent(inner$, 37, false, false); // arrow down + + done(); + }); +/* + it("Creates N lines", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + var $newFirstTextElement = inner$("div").first(); + + prepareDocument(numberOfRows, $newFirstTextElement); // N lines into the first div as a target + helper.waitFor(function(){ // Wait for the DOM to register the new items + return inner$("div").first().text().length == 6; + }).done(function(){ // Once the DOM has registered the items + done(); + }); + }); + + it("Moves caret up a line", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 38, false, false); // arrow up + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + it("Moves caret down a line", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 40, false, false); // arrow down + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos > originalPos); + }).done(function(){ + expect(newCaretPos).to.be.moreThan(originalPos); + done(); + }); + }); + + it("Moves caret to top of doc", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + + var i = 0; + while(i < numberOfRows){ // press pageup key N times + keyEvent(inner$, 33, false, false); + i++; + } + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + it("Moves caret right a position", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.x; + var newCaretPos; + keyEvent(inner$, 39, false, false); // arrow right + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.x; + return (newCaretPos > originalPos); + }).done(function(){ + expect(newCaretPos).to.be.moreThan(originalPos); + done(); + }); + }); + + it("Moves caret left a position", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.x; + var newCaretPos; + keyEvent(inner$, 33, false, false); // arrow left + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.x; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + it("Moves caret to the next line using right arrow", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + keyEvent(inner$, 39, false, false); // arrow right + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos > originalPos); + }).done(function(){ + expect(newCaretPos).to.be.moreThan(originalPos); + done(); + }); + }); + + it("Moves caret to the previous line using left arrow", function(done){ + var inner$ = helper.padInner$; + var $newFirstTextElement = inner$("div").first(); + var originalCaretPosition = caretPosition(inner$); + var originalPos = originalCaretPosition.y; + var newCaretPos; + keyEvent(inner$, 33, false, false); // arrow left + + helper.waitFor(function(){ // Wait for the DOM to register the new items + var newCaretPosition = caretPosition(inner$); + newCaretPos = newCaretPosition.y; + return (newCaretPos < originalPos); + }).done(function(){ + expect(newCaretPos).to.be.lessThan(originalPos); + done(); + }); + }); + + + +/* + it("Creates N rows, changes height of rows, updates UI by caret key events", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + var numberOfRows = 50; + + //ace creates a new dom element when you press a keystroke, so just get the first text element again + var $newFirstTextElement = inner$("div").first(); + var originalDivHeight = inner$("div").first().css("height"); + prepareDocument(numberOfRows, $newFirstTextElement); // N lines into the first div as a target + + helper.waitFor(function(){ // Wait for the DOM to register the new items + return inner$("div").first().text().length == 6; + }).done(function(){ // Once the DOM has registered the items + inner$("div").each(function(index){ // Randomize the item heights (replicates images / headings etc) + var random = Math.floor(Math.random() * (50)) + 20; + $(this).css("height", random+"px"); + }); + + console.log(caretPosition(inner$)); + var newDivHeight = inner$("div").first().css("height"); + var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height + expect(heightHasChanged).to.be(true); // expect the first line to be blank + }); + + // Is this Element now visible to the pad user? + helper.waitFor(function(){ // Wait for the DOM to register the new items + return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place + }).done(function(){ // Once the DOM has registered the items + inner$("div").each(function(index){ // Randomize the item heights (replicates images / headings etc) + var random = Math.floor(Math.random() * (80 - 20 + 1)) + 20; + $(this).css("height", random+"px"); + }); + + var newDivHeight = inner$("div").first().css("height"); + var heightHasChanged = originalDivHeight != newDivHeight; // has the new div height changed from the original div height + expect(heightHasChanged).to.be(true); // expect the first line to be blank + }); + var i = 0; + while(i < numberOfRows){ // press down arrow +console.log("dwn"); + keyEvent(inner$, 40, false, false); + i++; + } + + // Does scrolling back up the pad with the up arrow show the correct contents? + helper.waitFor(function(){ // Wait for the new position to be in place + try{ + return isScrolledIntoView(inner$("div:nth-child("+numberOfRows+")"), inner$); // Wait for the DOM to scroll into place + }catch(e){ + return false; + } + }).done(function(){ // Once the DOM has registered the items + + var i = 0; + while(i < numberOfRows){ // press down arrow + keyEvent(inner$, 33, false, false); // doesn't work + i++; + } + + // Does scrolling back up the pad with the up arrow show the correct contents? + helper.waitFor(function(){ // Wait for the new position to be in place + try{ + return isScrolledIntoView(inner$("div:nth-child(0)"), inner$); // Wait for the DOM to scroll into place + }catch(e){ + return false; + } + }).done(function(){ // Once the DOM has registered the items + + + + }); + }); + + + var i = 0; + while(i < numberOfRows){ // press down arrow + keyEvent(inner$, 33, false, false); // doesn't work + i++; + } + + + // Does scrolling back up the pad with the up arrow show the correct contents? + helper.waitFor(function(){ // Wait for the new position to be in place + return isScrolledIntoView(inner$("div:nth-child(1)"), inner$); // Wait for the DOM to scroll into place + }).done(function(){ // Once the DOM has registered the items + expect(true).to.be(true); + done(); + }); +*/ + +}); + +function prepareDocument(n, target){ // generates a random document with random content on n lines + var i = 0; + while(i < n){ // for each line + target.sendkeys(makeStr()); // generate a random string and send that to the editor + target.sendkeys('{enter}'); // generator an enter keypress + i++; // rinse n times + } +} + +function keyEvent(target, charCode, ctrl, shift){ // sends a charCode to the window + if(target.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + var e = target.Event(evtType); + console.log(e); + if(ctrl){ + e.ctrlKey = true; // Control key + } + if(shift){ + e.shiftKey = true; // Shift Key + } + e.which = charCode; + e.keyCode = charCode; + target("#innerdocbody").trigger(e); +} + + +function makeStr(){ // from http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + for( var i=0; i < 5; i++ ) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + return text; +} + +function isScrolledIntoView(elem, $){ // from http://stackoverflow.com/questions/487073/check-if-element-is-visible-after-scrolling + var docViewTop = $(window).scrollTop(); + var docViewBottom = docViewTop + $(window).height(); + var elemTop = $(elem).offset().top; // how far the element is from the top of it's container + var elemBottom = elemTop + $(elem).height(); // how far plus the height of the elem.. IE is it all in? + elemBottom = elemBottom - 16; // don't ask, sorry but this is needed.. + return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); +} + +function caretPosition($){ + var doc = $.window.document; + var pos = doc.getSelection(); + pos.y = pos.anchorNode.parentElement.offsetTop; + pos.x = pos.anchorNode.parentElement.offsetLeft; + console.log(pos); + return pos; +} diff --git a/tests/frontend/specs/chat.js b/tests/frontend/specs/chat.js index a488193f..ccb8b569 100644 --- a/tests/frontend/specs/chat.js +++ b/tests/frontend/specs/chat.js @@ -41,7 +41,7 @@ describe("Chat messages and UI", function(){ it("makes sure that an empty message can't be sent", function(done) { var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; - + //click on the chat button to make chat visible var $chatButton = chrome$("#chaticon"); $chatButton.click(); diff --git a/tests/frontend/specs/helper.js b/tests/frontend/specs/helper.js index 621b3c3a..d5bff629 100644 --- a/tests/frontend/specs/helper.js +++ b/tests/frontend/specs/helper.js @@ -6,14 +6,14 @@ describe("the test helper", function(){ var times = 10; var loadPad = function(){ - helper.newPad(function(){ + helper.newPad(function(){ times--; if(times > 0){ loadPad(); } else { done(); } - }) + }) } loadPad(); @@ -22,8 +22,8 @@ describe("the test helper", function(){ it("gives me 3 jquery instances of chrome, outer and inner", function(done){ this.timeout(5000); - helper.newPad(function(){ - //check if the jquery selectors have the desired elements + helper.newPad(function(){ + //check if the jquery selectors have the desired elements expect(helper.padChrome$("#editbar").length).to.be(1); expect(helper.padOuter$("#outerdocbody").length).to.be(1); expect(helper.padInner$("#innerdocbody").length).to.be(1); @@ -39,61 +39,61 @@ describe("the test helper", function(){ }); describe("the waitFor method", function(){ - it("takes a timeout and waits long enough", function(done){ - this.timeout(2000); + it("takes a timeout and waits long enough", function(done){ + this.timeout(2000); var startTime = new Date().getTime(); helper.waitFor(function(){ - return false; + return false; }, 1500).fail(function(){ - var duration = new Date().getTime() - startTime; + var duration = new Date().getTime() - startTime; expect(duration).to.be.greaterThan(1400); done(); }); - }); + }); - it("takes an interval and checks on every interval", function(done){ + it("takes an interval and checks on every interval", function(done){ this.timeout(4000); var checks = 0; helper.waitFor(function(){ checks++; - return false; + return false; }, 2000, 100).fail(function(){ expect(checks).to.be.greaterThan(10); expect(checks).to.be.lessThan(30); done(); }); - }); + }); - describe("returns a deferred object", function(){ + describe("returns a deferred object", function(){ it("it calls done after success", function(done){ helper.waitFor(function(){ - return true; - }).done(function(){ + return true; + }).done(function(){ done(); - }); + }); }); it("calls fail after failure", function(done){ - helper.waitFor(function(){ - return false; - },0).fail(function(){ + helper.waitFor(function(){ + return false; + },0).fail(function(){ done(); - }); + }); }); xit("throws if you don't listen for fails", function(done){ - var onerror = window.onerror; - window.onerror = function(){ + var onerror = window.onerror; + window.onerror = function(){ window.onerror = onerror; - done(); - } + done(); + } - helper.waitFor(function(){ - return false; - },100); + helper.waitFor(function(){ + return false; + },100); }); - }); + }); }); -});
\ No newline at end of file +}); diff --git a/tests/frontend/specs/indentation.js b/tests/frontend/specs/indentation.js index 06d90aa8..3d14a7a8 100644 --- a/tests/frontend/specs/indentation.js +++ b/tests/frontend/specs/indentation.js @@ -15,7 +15,13 @@ describe("indentation button", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keydown"); + if(inner$.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.keyCode = 9; // tab :| inner$("#innerdocbody").trigger(e); @@ -152,8 +158,8 @@ describe("indentation button", function(){ testHelper.selectText(firstTextElement[0], $inner); /* this test creates the below content, both should have double indentation - line1 - line2 + line1 + line2 firstTextElement.sendkeys('{rightarrow}'); // simulate a keypress of enter diff --git a/tests/frontend/specs/italic.js b/tests/frontend/specs/italic.js index 052d2df4..29dbae59 100644 --- a/tests/frontend/specs/italic.js +++ b/tests/frontend/specs/italic.js @@ -44,7 +44,13 @@ describe("italic some text", function(){ //select this text element $firstTextElement.sendkeys('{selectall}'); - var e = inner$.Event("keydown"); + if(inner$.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 105; // i inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/redo.js b/tests/frontend/specs/redo.js index c1497221..c2f8a95a 100644 --- a/tests/frontend/specs/redo.js +++ b/tests/frontend/specs/redo.js @@ -47,12 +47,18 @@ describe("undo button then redo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - var e = inner$.Event("keydown"); + if(inner$.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 90; // z inner$("#innerdocbody").trigger(e); - var e = inner$.Event("keydown"); + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 121; // y inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/responsiveness.js b/tests/frontend/specs/responsiveness.js new file mode 100644 index 00000000..44bdd611 --- /dev/null +++ b/tests/frontend/specs/responsiveness.js @@ -0,0 +1,80 @@ +// Test for https://github.com/ether/etherpad-lite/issues/1763 + +// This test fails in Opera, IE and Safari +// Opera fails due to a weird way of handling the order of execution, yet actual performance seems fine +// Safari fails due the delay being too great yet the actual performance seems fine +// Firefox might panic that the script is taking too long so will fail +// IE will fail due to running out of memory as it can't fit 2M chars in memory. + +// Just FYI Google Docs crashes on large docs whilst trying to Save, it's likely the limitations we are +// experiencing are more to do with browser limitations than improper implementation. +// A ueber fix for this would be to have a separate lower cpu priority thread that handles operations that aren't +// visible to the user. + +// Adapted from John McLear's original test case. + +describe('Responsiveness of Editor', function() { + // create a new pad before each test run + beforeEach(function(cb) { + helper.newPad(cb); + this.timeout(6000); + }); + it('Fast response to keypress in pad with large amount of contents', function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + var chars = '0000000000'; // row of placeholder chars + var amount = 200000; //number of blocks of chars we will insert + var length = (amount * (chars.length) +1); // include a counter for each space + var text = ''; // the text we're gonna insert + this.timeout(amount * 100); + + // get keys to send + var keyMultiplier = 10; // multiplier * 10 == total number of key events + var keysToSend = ''; + for(var i=0; i <= keyMultiplier; i++) { + keysToSend += chars; + } + + var textElement = inner$('div'); + textElement.sendkeys('{selectall}'); // select all + textElement.sendkeys('{del}'); // clear the pad text + + for(var i=0; i <= amount; i++) { + text = text + chars + ' '; // add the chars and space to the text contents + } + inner$('div').first().text(text); // Put the text contents into the pad + + helper.waitFor(function(){ // Wait for the new contents to be on the pad + return inner$('div').text().length > length; + }).done(function(){ + + expect( inner$('div').text().length ).to.be.greaterThan( length ); // has the text changed? + var start = new Date().getTime(); // get the start time + + // send some new text to the screen (ensure all 3 key events are sent) + var el = inner$('div').first(); + for(var i = 0; i < keysToSend.length; ++i) { + var x = keysToSend.charCodeAt(i); + ['keyup', 'keypress', 'keydown'].forEach(function(type) { + var e = $.Event(type); + e.keyCode = x; + el.trigger(e); + }); + } + + helper.waitFor(function(){ // Wait for the ability to process + return true; // Ghetto but works for now + }).done(function(){ + var end = new Date().getTime(); // get the current time + var delay = end - start; // get the delay as the current time minus the start time + + console.log('delay:', delay); + expect(delay).to.be.below(200); + done(); + }, 1000); + + }, 10000); + }); + +}); + diff --git a/tests/frontend/specs/undo.js b/tests/frontend/specs/undo.js index 8ba752ac..0c58c9b8 100644 --- a/tests/frontend/specs/undo.js +++ b/tests/frontend/specs/undo.js @@ -44,7 +44,13 @@ describe("undo button", function(){ var modifiedValue = $firstTextElement.text(); // get the modified value expect(modifiedValue).not.to.be(originalValue); // expect the value to change - var e = inner$.Event("keydown"); + if(inner$.browser.mozilla){ // if it's a mozilla browser + var evtType = "keypress"; + }else{ + var evtType = "keydown"; + } + + var e = inner$.Event(evtType); e.ctrlKey = true; // Control key e.which = 90; // z inner$("#innerdocbody").trigger(e); diff --git a/tests/frontend/specs/urls_become_clickable.js b/tests/frontend/specs/urls_become_clickable.js index 8c72d748..2de60bf9 100644 --- a/tests/frontend/specs/urls_become_clickable.js +++ b/tests/frontend/specs/urls_become_clickable.js @@ -16,7 +16,7 @@ describe("urls", function(){ firstTextElement.sendkeys('{selectall}'); // select all firstTextElement.sendkeys('{del}'); // clear the first line firstTextElement.sendkeys('http://etherpad.org'); // insert a URL - + helper.waitFor(function(){ return inner$("div").first().find("a").length === 1; }, 2000).done(done); diff --git a/tests/frontend/travis/remote_runner.js b/tests/frontend/travis/remote_runner.js index a4f1dac1..b94d8c3e 100644 --- a/tests/frontend/travis/remote_runner.js +++ b/tests/frontend/travis/remote_runner.js @@ -3,10 +3,10 @@ var wd = require(srcFolder + "wd"); var async = require(srcFolder + "async"); var config = { - host: "ondemand.saucelabs.com" + host: "ondemand.saucelabs.com" , port: 80 , username: process.env.SAUCE_USER - , accessKey: process.env.SAUCE_KEY + , accessKey: process.env.SAUCE_ACCESS_KEY } var allTestsPassed = true; @@ -107,4 +107,4 @@ sauceTestWorker.drain = function() { setTimeout(function(){ process.exit(allTestsPassed ? 0 : 1); }, 3000); -}
\ No newline at end of file +} diff --git a/tests/frontend/travis/runner.sh b/tests/frontend/travis/runner.sh index ae53e667..1ae5f6ff 100755 --- a/tests/frontend/travis/runner.sh +++ b/tests/frontend/travis/runner.sh @@ -3,7 +3,7 @@ #Move to the base folder cd `dirname $0` -#start etherpad lite +#start Etherpad ../../../bin/run.sh > /dev/null & sleep 10 diff --git a/tests/frontend/travis/sauce_tunnel.sh b/tests/frontend/travis/sauce_tunnel.sh index ac8f7ac7..f519f8d9 100755 --- a/tests/frontend/travis/sauce_tunnel.sh +++ b/tests/frontend/travis/sauce_tunnel.sh @@ -4,7 +4,7 @@ curl http://saucelabs.com/downloads/Sauce-Connect-latest.zip > /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 diff --git a/tools/doc/README.md b/tools/doc/README.md index 743bfaae..3646e46e 100644 --- a/tools/doc/README.md +++ b/tools/doc/README.md @@ -72,5 +72,5 @@ Each type of heading has a description block. Run the following from the etherpad-lite root directory: ```sh -$ node tools/doc/generate doc/all.md --format=html --template=doc/template.html > out.htm +$ node tools/doc/generate doc/index.md --format=html --template=doc/template.html > out.html ```
\ No newline at end of file |