Merge branch 'develop'

This commit is contained in:
John McLear 2023-06-20 15:54:10 +01:00
commit a562d44d9b
195 changed files with 11863 additions and 6201 deletions

View file

@ -19,6 +19,7 @@ Dockerfile
.git/ORIG_HEAD .git/ORIG_HEAD
.git/packed-refs .git/packed-refs
.git/refs/remotes/ .git/refs/remotes/
.git/rr-cache/
.gitignore .gitignore
settings.json settings.json

View file

@ -1,5 +1,3 @@
IMPORTANT: Please disable plugins prior to posting a bug report. If you have a problem with a plugin please post on the plugin repository. Thanks!
--- ---
name: Bug report name: Bug report
about: Create a report to help us improve about: Create a report to help us improve
@ -9,6 +7,8 @@ assignees: ''
--- ---
<!-- IMPORTANT: Please disable plugins prior to posting a bug report. If you have a problem with a plugin please post on the plugin repository. Thanks! -->
**Describe the bug** **Describe the bug**
A clear and concise description of what the bug is. A clear and concise description of what the bug is.

21
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,21 @@
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "npm"
directory: "/src"
schedule:
interval: "daily"
versioning-strategy: "increase"
- package-ecosystem: "npm"
directory: "/src/bin/doc"
schedule:
interval: "daily"
versioning-strategy: "increase"

24
.github/stale.yml vendored
View file

@ -1,24 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
- Bug
- Serious Bug
- Minor bug
- Black hole bug
- Special case Bug
- Upstream bug
- Feature Request
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

View file

@ -3,6 +3,9 @@ name: "Backend tests"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
on: [push, pull_request] on: [push, pull_request]
permissions:
contents: read
jobs: jobs:
withoutpluginsLinux: withoutpluginsLinux:
# run on pushes to any branch # run on pushes to any branch
@ -15,11 +18,11 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
node: [12, 14, 16] node: [14, 16, 18]
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@ -52,11 +55,11 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
node: [12, 14, 16] node: [14, 16, 18]
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@ -117,11 +120,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json
@ -150,11 +153,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json

View file

@ -9,14 +9,21 @@ on:
schedule: schedule:
- cron: '0 13 * * 1' - cron: '0 13 * * 1'
permissions:
contents: read
jobs: jobs:
analyze: analyze:
permissions:
actions: read # for github/codeql-action/init to get workflow details
contents: read # for actions/checkout to fetch code
security-events: write # for github/codeql-action/autobuild to send a status report
name: Analyze name: Analyze
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
# We must fetch at least the immediate parents so that if this is # We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head. # a pull request then we can checkout the head.
@ -28,10 +35,10 @@ jobs:
if: ${{ github.event_name == 'pull_request' }} if: ${{ github.event_name == 'pull_request' }}
- -
name: Initialize CodeQL name: Initialize CodeQL
uses: github/codeql-action/init@v1 uses: github/codeql-action/init@v2
- -
name: Autobuild name: Autobuild
uses: github/codeql-action/autobuild@v1 uses: github/codeql-action/autobuild@v2
- -
name: Perform CodeQL Analysis name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1 uses: github/codeql-action/analyze@v2

20
.github/workflows/dependency-review.yml vendored Normal file
View file

@ -0,0 +1,20 @@
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
#
# Source repository: https://github.com/actions/dependency-review-action
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
name: 'Dependency Review'
on: [pull_request]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
uses: actions/checkout@v3
- name: 'Dependency Review'
uses: actions/dependency-review-action@v1

View file

@ -8,19 +8,26 @@ on:
- 'v?[0-9]+.[0-9]+.[0-9]+' - 'v?[0-9]+.[0-9]+.[0-9]+'
env: env:
TEST_TAG: etherpad/etherpad:test TEST_TAG: etherpad/etherpad:test
permissions:
contents: read
jobs: jobs:
docker: docker:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- -
name: Check out name: Check out
uses: actions/checkout@v2 uses: actions/checkout@v3
-
name: Set up QEMU
if: github.event_name == 'push'
uses: docker/setup-qemu-action@v2
- -
name: Set up Docker Buildx name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v2
- -
name: Build and export to Docker name: Build and export to Docker
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
context: . context: .
load: true load: true
@ -39,16 +46,25 @@ jobs:
- -
name: Test name: Test
run: | run: |
docker run --rm -d -p 9001:9001 ${{ env.TEST_TAG }} docker run --rm -d -p 9001:9001 --name test ${{ env.TEST_TAG }}
docker logs -f test &
./src/bin/installDeps.sh ./src/bin/installDeps.sh
sleep 3 while true; do
echo "Waiting for Docker container to start..."
status=$(docker container inspect -f '{{.State.Health.Status}}' test) || exit 1
case ${status} in
healthy) break;;
starting) sleep 2;;
*) printf %s\\n "unexpected status: ${status}" >&2; exit 1;;
esac
done
(cd src && npm run test-container) (cd src && npm run test-container)
git clean -dxf . git clean -dxf .
- -
name: Docker meta name: Docker meta
if: github.event_name == 'push' if: github.event_name == 'push'
id: meta id: meta
uses: docker/metadata-action@v3 uses: docker/metadata-action@v4
with: with:
images: etherpad/etherpad images: etherpad/etherpad
tags: | tags: |
@ -59,16 +75,17 @@ jobs:
- -
name: Log in to Docker Hub name: Log in to Docker Hub
if: github.event_name == 'push' if: github.event_name == 'push'
uses: docker/login-action@v1 uses: docker/login-action@v2
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- -
name: Build and push name: Build and push
if: github.event_name == 'push' if: github.event_name == 'push'
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64
push: true push: true
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}

View file

@ -3,6 +3,9 @@ name: "Frontend admin tests powered by Sauce Labs"
on: [push] on: [push]
permissions:
contents: read # to fetch code (actions/checkout)
jobs: jobs:
withplugins: withplugins:
name: with plugins name: with plugins
@ -11,7 +14,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
node: [12, 14, 16] node: [14, 16, 18]
steps: steps:
- -
@ -33,7 +36,7 @@ jobs:
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}-node${{ matrix.node }}' printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}-node${{ matrix.node }}'
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:

View file

@ -3,6 +3,9 @@ name: "Frontend tests powered by Sauce Labs"
on: [push] on: [push]
permissions:
contents: read # to fetch code (actions/checkout)
jobs: jobs:
withoutplugins: withoutplugins:
name: without plugins name: without plugins
@ -27,11 +30,11 @@ jobs:
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}' printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}'
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json
@ -91,11 +94,11 @@ jobs:
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}' printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}'
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json

View file

@ -3,6 +3,9 @@ name: "Lint"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
on: [push, pull_request] on: [push, pull_request]
permissions:
contents: read
jobs: jobs:
lint-package-lock: lint-package-lock:
# run on pushes to any branch # run on pushes to any branch
@ -15,11 +18,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json

View file

@ -3,6 +3,9 @@ name: "Loadtest"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
on: [push, pull_request] on: [push, pull_request]
permissions:
contents: read
jobs: jobs:
withoutplugins: withoutplugins:
# run on pushes to any branch # run on pushes to any branch
@ -15,11 +18,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json
@ -45,11 +48,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json
@ -102,11 +105,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json

View file

@ -3,6 +3,9 @@ name: "rate limit"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
on: [push, pull_request] on: [push, pull_request]
permissions:
contents: read
jobs: jobs:
ratelimit: ratelimit:
# run on pushes to any branch # run on pushes to any branch
@ -15,11 +18,11 @@ jobs:
steps: steps:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json

18
.github/workflows/stale.yml vendored Normal file
View file

@ -0,0 +1,18 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 6 * * *'
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v7
with:
close-issue-label: wontfix
close-pr-label: wontfix
days-before-close: -1
exempt-issue-labels: 'pinned,security,Bug,Serious Bug,Minor bug,Black hole bug,Special case Bug,Upstream bug,Feature Request'
exempt-pr-labels: 'pinned,security,Bug,Serious Bug,Minor bug,Black hole bug,Special case Bug,Upstream bug,Feature Request'

View file

@ -3,6 +3,9 @@ name: "Upgrade from latest release"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
on: [push, pull_request] on: [push, pull_request]
permissions:
contents: read
jobs: jobs:
withpluginsLinux: withpluginsLinux:
# run on pushes to any branch # run on pushes to any branch
@ -15,11 +18,11 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
node: [12, 14, 16] node: [14, 16, 18]
steps: steps:
- -
name: Check out latest release name: Check out latest release
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
ref: master ref: master
- -
@ -64,7 +67,7 @@ jobs:
- -
name: Run the backend tests name: Run the backend tests
run: cd src && npm test run: cd src && npm test
# Because actions/checkout@v2 is called with "ref: master" and without # Because actions/checkout@v3 is called with "ref: master" and without
# "fetch-depth: 0", the local clone does not have the ${GITHUB_SHA} # "fetch-depth: 0", the local clone does not have the ${GITHUB_SHA}
# commit. Fetch ${GITHUB_REF} to get the ${GITHUB_SHA} commit. Note that a # commit. Fetch ${GITHUB_REF} to get the ${GITHUB_SHA} commit. Note that a
# plain "git fetch" only fetches "normal" references (refs/heads/* and # plain "git fetch" only fetches "normal" references (refs/heads/* and
@ -87,11 +90,10 @@ jobs:
run: cd src && npm test run: cd src && npm test
- -
name: Install Cypress name: Install Cypress
run: npm install cypress -g run: cd src && npm install cypress
- -
name: Run Etherpad & Test Frontend name: Run Etherpad & Test Frontend
run: | run: |
node src/node/server.js & node src/node/server.js &
curl --connect-timeout 10 --max-time 20 --retry 5 --retry-delay 10 --retry-max-time 60 --retry-connrefused http://127.0.0.1:9001/p/test curl --connect-timeout 10 --max-time 20 --retry 5 --retry-delay 10 --retry-max-time 60 --retry-connrefused http://127.0.0.1:9001/p/test
cd src/tests/frontend ./src/node_modules/cypress/bin/cypress run --config-file src/tests/frontend/cypress/cypress.config.js
cypress run --spec cypress/integration/test.js --config-file cypress/cypress.json

View file

@ -1,64 +0,0 @@
name: "Windows Installer"
# any branch is useful for testing before a PR is submitted
on: [push, pull_request]
jobs:
build:
# run on pushes to any branch
# run on PRs from external forks
if: |
(github.event_name != 'pull_request')
|| (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
name: Build Zip & Exe
runs-on: windows-latest
steps:
-
uses: msys2/setup-msys2@v2
with:
path-type: inherit
install: >-
zip
-
name: Checkout repository
uses: actions/checkout@v2
-
uses: actions/setup-node@v3
with:
node-version: 12
cache: 'npm'
cache-dependency-path: |
src/package-lock.json
src/bin/doc/package-lock.json
-
name: Install all dependencies and symlink for ep_etherpad-lite
shell: msys2 {0}
run: src/bin/installDeps.sh
-
name: Run the backend tests
shell: msys2 {0}
run: cd src && npm test
-
name: Build the .zip
shell: msys2 {0}
run: src/bin/buildForWindows.sh
-
name: Extract the .zip into folder
run: 7z x etherpad-lite-win.zip -oetherpad-lite-new
-
name: Grab nsis config
run: git clone https://github.com/ether/etherpad_nsis.git
-
name: Create installer
uses: joncloud/makensis-action@v3.6
with:
script-file: 'etherpad_nsis/etherpad.nsi'
-
name: Check something..
run: ls etherpad_nsis
-
name: Archive production artifacts
uses: actions/upload-artifact@v2
with:
name: etherpad-server-windows.exe
path: etherpad_nsis/etherpad-server-windows.exe

View file

@ -1,16 +1,19 @@
name: "Windows Zip" name: "Windows Build"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
on: [push, pull_request] on: [push, pull_request]
permissions:
contents: read
jobs: jobs:
build: build-zip:
# run on pushes to any branch # run on pushes to any branch
# run on PRs from external forks # run on PRs from external forks
if: | if: |
(github.event_name != 'pull_request') (github.event_name != 'pull_request')
|| (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
name: Build name: Build .zip
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- -
@ -21,11 +24,11 @@ jobs:
zip zip
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
src/package-lock.json src/package-lock.json
@ -44,45 +47,79 @@ jobs:
run: src/bin/buildForWindows.sh run: src/bin/buildForWindows.sh
- -
name: Archive production artifacts name: Archive production artifacts
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v3
with: with:
name: etherpad-lite-win.zip name: etherpad-win.zip
path: etherpad-lite-win.zip path: etherpad-win.zip
deploy: build-exe:
if: |
(github.event_name != 'pull_request')
|| (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
name: Build .exe
needs: build-zip
runs-on: windows-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v3
-
name: Download .zip
uses: actions/download-artifact@v3
with:
name: etherpad-win.zip
path: ..
-
name: Extract .zip
working-directory: ..
run: 7z x etherpad-win.zip -oetherpad-zip
-
name: Create installer
uses: joncloud/makensis-action@v3.6
with:
script-file: 'src/bin/nsis/etherpad.nsi'
-
name: Archive production artifacts
uses: actions/upload-artifact@v3
with:
name: etherpad-win.exe
path: etherpad-win.exe
deploy-zip:
# run on pushes to any branch # run on pushes to any branch
# run on PRs from external forks # run on PRs from external forks
permissions:
contents: none
if: | if: |
(github.event_name != 'pull_request') (github.event_name != 'pull_request')
|| (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
name: Deploy name: Deploy
needs: build needs: build-zip
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- -
name: Download zip name: Download zip
uses: actions/download-artifact@v2 uses: actions/download-artifact@v3
with: with:
name: etherpad-lite-win.zip name: etherpad-win.zip
- -
name: Extract Etherpad name: Extract Etherpad
run: 7z x etherpad-lite-win.zip -oetherpad run: 7z x etherpad-win.zip -oetherpad
- -
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 14
cache: 'npm' cache: 'npm'
cache-dependency-path: | cache-dependency-path: |
etherpad/src/package-lock.json etherpad/src/package-lock.json
etherpad/src/bin/doc/package-lock.json etherpad/src/bin/doc/package-lock.json
- -
name: Install Cypress name: Install Cypress
run: npm install cypress -g run: cd src && npm install cypress
- -
name: Run Etherpad name: Run Etherpad
run: | run: |
cd etherpad cd etherpad
node node_modules\ep_etherpad-lite\node\server.js & node node_modules\ep_etherpad-lite\node\server.js &
curl --connect-timeout 10 --max-time 20 --retry 5 --retry-delay 10 --retry-max-time 60 --retry-connrefused http://127.0.0.1:9001/p/test curl --connect-timeout 10 --max-time 20 --retry 5 --retry-delay 10 --retry-max-time 60 --retry-connrefused http://127.0.0.1:9001/p/test
cd src\tests\frontend src\node_modules\cypress\bin\cypress run --config-file src\tests\frontendcypress\cypress.config.js
cypress run --spec cypress\integration\test.js --config-file cypress\cypress.json

3
.gitignore vendored
View file

@ -1,9 +1,10 @@
/etherpad-win.exe
/etherpad-win.zip
node_modules node_modules
/settings.json /settings.json
!settings.json.template !settings.json.template
APIKEY.txt APIKEY.txt
SESSIONKEY.txt SESSIONKEY.txt
etherpad-lite-win.zip
var/dirty.db var/dirty.db
*~ *~
*.patch *.patch

View file

@ -1,3 +1,123 @@
# 1.9.0
### Notable enhancements and fixes
* Windows build:
* The bundled `node.exe` was upgraded from v12 to v16.
* The bundled `node.exe` is now a 64-bit executable. If you need the 32-bit
version you must download and install Node.js yourself.
* Improvements to login session management:
* `express_sid` cookies and `sessionstorage:*` database records are no longer
created unless `requireAuthentication` is `true` (or a plugin causes them to
be created).
* Login sessions now have a finite lifetime by default (10 days after
leaving).
* `sessionstorage:*` database records are automatically deleted when the login
session expires (with some exceptions that will be fixed in the future).
* Requests for static content (e.g., `/robots.txt`) and special pages (e.g.,
the HTTP API, `/stats`) no longer create login session state.
* The following settings from `settings.json` are now applied as expected (they
were unintentionally ignored before):
* `padOptions.lang`
* `padOptions.showChat`
* `padOptions.userColor`
* `padOptions.userName`
* HTTP API:
* Fixed the return value of `getText` when called with a specific revision.
* Fixed a potential attribute pool corruption bug with
`copyPadWithoutHistory`.
* Mappings created by `createGroupIfNotExistsFor` are now removed from the
database when the group is deleted.
* Fixed race conditions in the `setText`, `appendText`, and `restoreRevision`
functions.
* Added an optional `authorId` parameter to `appendText`,
`copyPadWithoutHistory`, `createGroupPad`, `createPad`, `restoreRevision`,
`setHTML`, and `setText`, and bumped the latest API version to 1.3.0.
* Fixed a crash if the database is busy enough to cause a query timeout.
* New `/health` endpoint for getting information about Etherpad's health (see
[draft-inadarei-api-health-check-06](https://www.ietf.org/archive/id/draft-inadarei-api-health-check-06.html)).
* Docker now uses the new `/health` endpoint for health checks, which avoids
issues when authentication is enabled. It also avoids the unnecessary creation
of database records for managing browser sessions.
* When copying a pad, the pad's records are copied in batches to avoid database
timeouts with large pads.
* Exporting a large pad to `.etherpad` format should be faster thanks to bulk
database record fetches.
* When importing an `.etherpad` file, records are now saved to the database in
batches to avoid database timeouts with large pads.
#### For plugin authors
* New `expressPreSession` server-side hook.
* Pad server-side hook changes:
* `padCheck`: New hook.
* `padCopy`: New `srcPad` and `dstPad` context properties.
* `padDefaultContent`: New hook.
* `padRemove`: New `pad` context property.
* The `db` property on Pad objects is now public.
* New `getAuthorId` server-side hook.
* New APIs for processing attributes: `ep_etherpad-lite/static/js/attributes`
(low-level API) and `ep_etherpad-lite/static/js/AttributeMap` (high-level
API).
* The `import` server-side hook has a new `ImportError` context property.
* New `exportEtherpad` and `importEtherpad` server-side hooks.
* The `handleMessageSecurity` and `handleMessage` server-side hooks have a new
`sessionInfo` context property that includes the user's author ID, the pad ID,
and whether the user only has read-only access.
* The `handleMessageSecurity` server-side hook can now be used to grant write
access for the current message only.
* The `init_<pluginName>` server-side hooks have a new `logger` context
property that plugins can use to log messages.
* Prevent infinite loop when exiting the server
* Bump dependencies
### Compatibility changes
* Node.js v14.15.0 or later is now required.
* The default login session expiration (applicable if `requireAuthentication` is
`true`) changed from never to 10 days after the user leaves.
#### For plugin authors
* The `client` context property for the `handleMessageSecurity` and
`handleMessage` server-side hooks is deprecated; use the `socket` context
property instead.
* Pad server-side hook changes:
* `padCopy`:
* The `originalPad` context property is deprecated; use `srcPad` instead.
* The `destinationID` context property is deprecated; use `dstPad.id`
instead.
* `padCreate`: The `author` context property is deprecated; use the new
`authorId` context property instead. Also, the hook now runs asynchronously.
* `padLoad`: Now runs when a temporary Pad object is created during import.
Also, it now runs asynchronously.
* `padRemove`: The `padID` context property is deprecated; use `pad.id`
instead.
* `padUpdate`: The `author` context property is deprecated; use the new
`authorId` context property instead. Also, the hook now runs asynchronously.
* Returning `true` from a `handleMessageSecurity` hook function is deprecated;
return `'permitOnce'` instead.
* Changes to the `src/static/js/Changeset.js` library:
* The following attribute processing functions are deprecated (use the new
attribute APIs instead):
* `attribsAttributeValue()`
* `eachAttribNumber()`
* `makeAttribsString()`
* `opAttributeValue()`
* `opIterator()`: Deprecated in favor of the new `deserializeOps()` generator
function.
* `appendATextToAssembler()`: Deprecated in favor of the new `opsFromAText()`
generator function.
* `newOp()`: Deprecated in favor of the new `Op` class.
* The `AuthorManager.getAuthor4Token()` function is deprecated; use the new
`AuthorManager.getAuthorId()` function instead.
* The exported database records covered by the `exportEtherpadAdditionalContent`
server-side hook now include keys like `${customPrefix}:${padId}:*`, not just
`${customPrefix}:${padId}`.
* Plugin locales should overwrite core's locales Stale
* Plugin locales overwrite core locales
# 1.8.18 # 1.8.18
Released: 2022-05-05 Released: 2022-05-05

View file

@ -4,9 +4,16 @@
# #
# Author: muxator # Author: muxator
FROM node:14-buster-slim FROM node:lts-slim
LABEL maintainer="Etherpad team, https://github.com/ether/etherpad-lite" LABEL maintainer="Etherpad team, https://github.com/ether/etherpad-lite"
ARG TIMEZONE=
RUN \
[ -z "${TIMEZONE}" ] || { \
ln -sf /usr/share/zoneinfo/"${TIMEZONE#/usr/share/zoneinfo/}" /etc/localtime; \
dpkg-reconfigure -f noninteractive tzdata; \
}
# plugins to install while building the container. By default no plugins are # plugins to install while building the container. By default no plugins are
# installed. # installed.
# If given a value, it has to be a space-separated, quoted list of plugin names. # If given a value, it has to be a space-separated, quoted list of plugin names.
@ -60,12 +67,12 @@ RUN mkdir -p "${EP_DIR}" && chown etherpad:etherpad "${EP_DIR}"
RUN export DEBIAN_FRONTEND=noninteractive; \ RUN export DEBIAN_FRONTEND=noninteractive; \
mkdir -p /usr/share/man/man1 && \ mkdir -p /usr/share/man/man1 && \
apt-get -qq update && \ apt-get -qq update && \
apt-get -qq dist-upgrade && \
apt-get -qq --no-install-recommends install \ apt-get -qq --no-install-recommends install \
ca-certificates \ ca-certificates \
git \ git \
curl \
${INSTALL_ABIWORD:+abiword} \ ${INSTALL_ABIWORD:+abiword} \
${INSTALL_SOFFICE:+libreoffice} \ ${INSTALL_SOFFICE:+libreoffice default-jre libreoffice-java-common} \
&& \ && \
apt-get -qq clean && \ apt-get -qq clean && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
@ -85,7 +92,7 @@ COPY --chown=etherpad:etherpad ./ ./
# seems to confuse tools such as `npm outdated`, `npm update`, and some ESLint # seems to confuse tools such as `npm outdated`, `npm update`, and some ESLint
# rules. # rules.
RUN { [ -z "${ETHERPAD_PLUGINS}" ] || \ RUN { [ -z "${ETHERPAD_PLUGINS}" ] || \
npm install --no-save ${ETHERPAD_PLUGINS}; } && \ npm install --no-save --legacy-peer-deps ${ETHERPAD_PLUGINS}; } && \
src/bin/installDeps.sh && \ src/bin/installDeps.sh && \
rm -rf ~/.npm rm -rf ~/.npm
@ -95,7 +102,11 @@ COPY --chown=etherpad:etherpad ./settings.json.docker "${EP_DIR}"/settings.json
# Fix group permissions # Fix group permissions
RUN chmod -R g=u . RUN chmod -R g=u .
HEALTHCHECK --interval=20s --timeout=3s CMD curl -f http://localhost:9001 || exit 1 USER root
RUN cd src && npm link
USER etherpad
HEALTHCHECK --interval=20s --timeout=3s CMD ["etherpad-healthcheck"]
EXPOSE 9001 EXPOSE 9001
CMD ["node", "src/node/server.js"] CMD ["etherpad"]

323
README.md
View file

@ -1,43 +1,78 @@
# A real-time collaborative editor for the web # Etherpad: A real-time collaborative editor for the web
![Demo Etherpad Animated Jif](doc/images/etherpad_demo.gif "Etherpad in action") ![Demo Etherpad Animated Jif](doc/images/etherpad_demo.gif "Etherpad in action")
# About ## About
Etherpad is a real-time collaborative editor [scalable to thousands of simultaneous real time users](http://scale.etherpad.org/). It provides [full data export](https://github.com/ether/etherpad-lite/wiki/Understanding-Etherpad's-Full-Data-Export-capabilities) capabilities, and runs on _your_ server, under _your_ control.
# Try it out Etherpad is a real-time collaborative editor [scalable to thousands of
Etherpad is extremely flexible providing you the means to modify it to solve whatever problem your community has. We provide some demo instances for you try different experiences available within Etherpad. Pad content is automatically removed after 24 hours. simultaneous real time users](http://scale.etherpad.org/). It provides [full
data
export](https://github.com/ether/etherpad-lite/wiki/Understanding-Etherpad's-Full-Data-Export-capabilities)
capabilities, and runs on _your_ server, under _your_ control.
* [Rich Editing](https://rich.etherpad.com) - A full rich text WYSIWYG editor. ## Try it out
* [Minimalist editor](https://minimalist.etherpad.com) - A minimalist editor that can be embedded within your tool.
* [Dark Mode](https://dark.etherpad.com) - Theme settings to have Etherpad start in dark mode, ideal for using Etherpad at night or for long durations.
* [Images](https://image.etherpad.com) - Plugins to improve provide Image support within a pad.
* [Video Chat](https://video.etherpad.com) - Plugins to enable Video and Audio chat in a pad.
* [Collaboration++](https://collab.etherpad.com) - Plugins to improve the really-real time collaboration experience, suitable for busy pads.
* [Document Analysis](https://analysis.etherpad.com) - Plugins to improve author and document analysis during and post creation.
* [Scale](https://shard.etherpad.com) - Etherpad running at scale with pad sharding which allows Etherpad to scale to ∞ number of Active Pads with up to ~20,000 edits per second, per pad.
# Project Status Etherpad is extremely flexible providing you the means to modify it to solve
whatever problem your community has. We provide some demo instances for you try
different experiences available within Etherpad. Pad content is automatically
removed after 24 hours.
* [Rich Editing](https://rich.etherpad.com) - A full rich text WYSIWYG editor.
* [Minimalist editor](https://minimalist.etherpad.com) - A minimalist editor
that can be embedded within your tool.
* [Dark Mode](https://dark.etherpad.com) - Theme settings to have Etherpad
start in dark mode, ideal for using Etherpad at night or for long durations.
* [Images](https://image.etherpad.com) - Plugins to improve provide Image
support within a pad.
* [Video Chat](https://video.etherpad.com) - Plugins to enable Video and Audio
chat in a pad.
* [Collaboration++](https://collab.etherpad.com) - Plugins to improve the
really-real time collaboration experience, suitable for busy pads.
* [Document Analysis](https://analysis.etherpad.com) - Plugins to improve
author and document analysis during and post creation.
* [Scale](https://shard.etherpad.com) - Etherpad running at scale with pad
sharding which allows Etherpad to scale to ∞ number of Active Pads with up
to ~20,000 edits per second, per pad.
## Project Status
We're looking for maintainers and have some funding available. Please contact John McLear if you can help.
### Code Quality ### Code Quality
[![Code Quality](https://github.com/ether/etherpad-lite/actions/workflows/codeql-analysis.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/codeql-analysis.yml) [![Total alerts](https://img.shields.io/lgtm/alerts/g/ether/etherpad-lite.svg?logo=lgtm&logoWidth=18&color=%2344b492)](https://lgtm.com/projects/g/ether/etherpad-lite/alerts/) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/ether/etherpad-lite.svg?logo=lgtm&logoWidth=18&color=%2344b492)](https://lgtm.com/projects/g/ether/etherpad-lite/context:javascript) [![package.lock](https://github.com/ether/etherpad-lite/actions/workflows/lint-package-lock.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/lint-package-lock.yml)
[![Code Quality](https://github.com/ether/etherpad-lite/actions/workflows/codeql-analysis.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/codeql-analysis.yml)
[![package.lock](https://github.com/ether/etherpad-lite/actions/workflows/lint-package-lock.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/lint-package-lock.yml)
### Testing ### Testing
[![Backend tests](https://github.com/ether/etherpad-lite/actions/workflows/backend-tests.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/backend-tests.yml) [![Simulated Load](https://github.com/ether/etherpad-lite/actions/workflows/load-test.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/load-test.yml) [![Rate Limit](https://github.com/ether/etherpad-lite/actions/workflows/rate-limit.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/rate-limit.yml) [![Windows Zip](https://github.com/ether/etherpad-lite/actions/workflows/windows-zip.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/windows-zip.yml) [![Docker file](https://github.com/ether/etherpad-lite/actions/workflows/dockerfile.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/dockerfile.yml)
[![Frontend admin tests powered by Sauce Labs](https://github.com/ether/etherpad-lite/actions/workflows/frontend-admin-tests.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/frontend-admin-tests.yml) [![Frontend tests powered by Sauce Labs](https://github.com/ether/etherpad-lite/actions/workflows/frontend-tests.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/frontend-tests.yml) [![Sauce Test Status](https://saucelabs.com/buildstatus/etherpad.svg)](https://saucelabs.com/u/etherpad) [![Windows Installer](https://github.com/ether/etherpad-lite/actions/workflows/windows-installer.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/windows-installer.yml) [![Backend tests](https://github.com/ether/etherpad-lite/actions/workflows/backend-tests.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/backend-tests.yml)
[![Simulated Load](https://github.com/ether/etherpad-lite/actions/workflows/load-test.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/load-test.yml)
[![Rate Limit](https://github.com/ether/etherpad-lite/actions/workflows/rate-limit.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/rate-limit.yml)
[![Docker file](https://github.com/ether/etherpad-lite/actions/workflows/dockerfile.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/dockerfile.yml)
[![Frontend admin tests powered by Sauce Labs](https://github.com/ether/etherpad-lite/actions/workflows/frontend-admin-tests.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/frontend-admin-tests.yml)
[![Frontend tests powered by Sauce Labs](https://github.com/ether/etherpad-lite/actions/workflows/frontend-tests.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/frontend-tests.yml)
[![Sauce Test Status](https://saucelabs.com/buildstatus/etherpad.svg)](https://saucelabs.com/u/etherpad)
[![Windows Build](https://github.com/ether/etherpad-lite/actions/workflows/windows.yml/badge.svg?color=%2344b492)](https://github.com/ether/etherpad-lite/actions/workflows/windows.yml)
### Engagement ### Engagement
<a href="https://hub.docker.com/r/etherpad/etherpad"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/etherpad/etherpad?color=%2344b492"></a> [![Discord](https://img.shields.io/discord/741309013593030667?color=%2344b492)](https://discord.com/invite/daEjfhw) [![Etherpad plugins](https://img.shields.io/endpoint?url=https%3A%2F%2Fstatic.etherpad.org%2Fshields.json&color=%2344b492 "Etherpad plugins")](https://static.etherpad.org/index.html) ![Languages](https://img.shields.io/static/v1?label=Languages&message=105&color=%2344b492) ![Translation Coverage](https://img.shields.io/static/v1?label=Languages&message=98%&color=%2344b492)
# Installation [![Docker Pulls](https://img.shields.io/docker/pulls/etherpad/etherpad?color=%2344b492)](https://hub.docker.com/r/etherpad/etherpad)
[![Discord](https://img.shields.io/discord/741309013593030667?color=%2344b492)](https://discord.com/invite/daEjfhw)
[![Etherpad plugins](https://img.shields.io/endpoint?url=https%3A%2F%2Fstatic.etherpad.org%2Fshields.json&color=%2344b492 "Etherpad plugins")](https://static.etherpad.org/index.html)
![Languages](https://img.shields.io/static/v1?label=Languages&message=105&color=%2344b492)
![Translation Coverage](https://img.shields.io/static/v1?label=Languages&message=98%&color=%2344b492)
## Requirements ## Installation
- [Node.js](https://nodejs.org/) >= **12.13.0**.
## GNU/Linux and other UNIX-like systems ### Requirements
### Quick install on Debian/Ubuntu [Node.js](https://nodejs.org/) >= **14.0.0**.
```
### GNU/Linux and other UNIX-like systems
#### Quick install on Debian/Ubuntu
```sh
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install -y nodejs sudo apt install -y nodejs
git clone --branch master https://github.com/ether/etherpad-lite.git && git clone --branch master https://github.com/ether/etherpad-lite.git &&
@ -45,103 +80,172 @@ cd etherpad-lite &&
src/bin/run.sh src/bin/run.sh
``` ```
### Manual install #### Manual install
You'll need Git and [Node.js](https://nodejs.org/) installed. You'll need Git and [Node.js](https://nodejs.org/) installed.
**As any user (we recommend creating a separate user called etherpad):** **As any user (we recommend creating a separate user called etherpad):**
1. Move to a folder where you want to install Etherpad. Clone the git repository: `git clone --branch master git://github.com/ether/etherpad-lite.git` 1. Move to a folder where you want to install Etherpad.
2. Change into the new directory containing the cloned source code: `cd etherpad-lite` 2. Clone the Git repository: `git clone --branch master
3. run `src/bin/run.sh` and open <http://127.0.0.1:9001> in your browser. https://github.com/ether/etherpad-lite.git`
3. Change into the new directory containing the cloned source code: `cd
etherpad-lite`
4. Run `src/bin/run.sh` and open http://127.0.0.1:9001 in your browser.
To update to the latest released version, execute `git pull origin`. The next To update to the latest released version, execute `git pull origin`. The next
start with `src/bin/run.sh` will update the dependencies. start with `src/bin/run.sh` will update the dependencies.
[Next steps](#next-steps). ### Windows
## Windows #### Prebuilt Windows package
### Prebuilt Windows package This package runs on any Windows machine. You can perform a manual installation
This package runs on any Windows machine. You can perform a manual installation via git for development purposes, but as this uses symlinks which performs unreliably on Windows, please stick to the prebuilt package if possible. via git for development purposes, but as this uses symlinks which performs
unreliably on Windows, please stick to the prebuilt package if possible.
1. [Download the latest Windows package](https://etherpad.org/#download) 1. [Download the latest Windows package](https://etherpad.org/#download)
2. Extract the folder 2. Extract the folder
Run `start.bat` and open <http://localhost:9001> in your browser. You like it? [Next steps](#next-steps). Run `start.bat` and open <http://localhost:9001> in your browser.
### Manually install on Windows #### Manually install on Windows
You'll need [node.js](https://nodejs.org) and (optionally, though recommended) git.
1. Grab the source, either You'll need [Node.js](https://nodejs.org) and (optionally, though recommended)
- download <https://github.com/ether/etherpad-lite/zipball/master> git.
- or `git clone --branch master https://github.com/ether/etherpad-lite.git`
2. With a "Run as administrator" command prompt execute 1. Grab the source, either:
* download <https://github.com/ether/etherpad-lite/zipball/master>
* or `git clone --branch master
https://github.com/ether/etherpad-lite.git`
2. With a "Run as administrator" command prompt execute
`src\bin\installOnWindows.bat` `src\bin\installOnWindows.bat`
Now, run `start.bat` and open <http://localhost:9001> in your browser. Now, run `start.bat` and open http://localhost:9001 in your browser.
Update to the latest version with `git pull origin`, then run Update to the latest version with `git pull origin`, then run
`src\bin\installOnWindows.bat`, again. `src\bin\installOnWindows.bat`, again.
If cloning to a subdirectory within another project, you may need to do the following: If cloning to a subdirectory within another project, you may need to do the
following:
1. Start the server manually (e.g. `node src/node/server.js`) 1. Start the server manually (e.g. `node src/node/server.js`)
2. Edit the db `filename` in `settings.json` to the relative directory with the file (e.g. `application/lib/etherpad-lite/var/dirty.db`) 2. Edit the db `filename` in `settings.json` to the relative directory with
3. Add auto-generated files to the main project `.gitignore` the file (e.g. `application/lib/etherpad-lite/var/dirty.db`)
3. Add auto-generated files to the main project `.gitignore`
## Docker container ### Docker container
Find [here](doc/docker.md) information on running Etherpad in a container. Find [here](doc/docker.md) information on running Etherpad in a container.
# Next Steps ## Plugins
## Tweak the settings Etherpad is very customizable through plugins.
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 `src/bin/run.sh` using the `-s|--settings` option: this allows
you to run multiple Etherpad instances from the same installation.
Similarly, `--credentials` can be used to give a settings override file, `--apikey` to give a different APIKEY.txt file and `--sessionkey` to give a non-default SESSIONKEY.txt.
**Each configuration parameter can also be set via an environment variable**, using the syntax `"${ENV_VAR}"` or `"${ENV_VAR:default_value}"`. For details, refer to `settings.json.template`.
Once you have access to your `/admin` section settings can be modified through the web browser.
If you are planning to use Etherpad in a production environment, you should use a dedicated database such as `mysql`, since the `dirtyDB` database driver is only for testing and/or development purposes.
## Secure your installation
If you have enabled authentication in `users` section in `settings.json`, it is a good security practice to **store hashes instead of plain text passwords** in that file. This is _especially_ advised if you are running a production installation.
Please install [ep_hash_auth plugin](https://www.npmjs.com/package/ep_hash_auth) and configure it.
If you prefer, `ep_hash_auth` also gives you the option of storing the users in a custom directory in the file system, without having to edit `settings.json` and restart Etherpad each time.
## Customize functionalities with plugins
![Basic install](doc/images/etherpad_basic.png "Basic Installation") ![Basic install](doc/images/etherpad_basic.png "Basic Installation")
![Full Features](doc/images/etherpad_full_features.png "You can add a lot of plugins !") ![Full Features](doc/images/etherpad_full_features.png "You can add a lot of plugins !")
Etherpad is very customizable through plugins. Instructions for installing themes and plugins can be found in [the plugin wiki article](https://github.com/ether/etherpad-lite/wiki/Available-Plugins). ### Available Plugins
## Getting the full features For a list of available plugins, see the [plugins
Run the following command in your Etherpad folder to get all of the features visible in the demo gif: site](https://static.etherpad.org).
``` ### Plugin Installation
npm install --no-save --legacy-peer-deps ep_headings2 ep_markdown ep_comments_page ep_align ep_font_color ep_webrtc ep_embedded_hyperlinks2
You can install plugins from the admin web interface (e.g.,
http://127.0.0.1:9001/admin/plugins).
Alternatively, you can install plugins from the command line:
```sh
cd /path/to/etherpad-lite
# The `--no-save` and `--legacy-peer-deps` arguments are necessary to work
# around npm quirks.
npm install --no-save --legacy-peer-deps ep_${plugin_name}
``` ```
## Customize the style with skin variants Also see [the plugin wiki
article](https://github.com/ether/etherpad-lite/wiki/Available-Plugins).
Open <http://127.0.0.1:9001/p/test#skinvariantsbuilder> in your browser and start playing ! ### Suggested Plugins
Run the following command in your Etherpad folder to get all of the features
visible in the above demo gif:
```sh
npm install --no-save --legacy-peer-deps \
ep_align \
ep_comments_page \
ep_embedded_hyperlinks2 \
ep_font_color \
ep_headings2 \
ep_markdown \
ep_webrtc
```
For user authentication, you are encouraged to run an [OpenID
Connect](https://openid.net/connect/) identity provider (OP) and install the
following plugins:
* [ep_openid_connect](https://github.com/ether/ep_openid_connect#readme) to
authenticate against your OP.
* [ep_guest](https://github.com/ether/ep_guest#readme) to create a
"guest" account that has limited access (e.g., read-only access).
* [ep_user_displayname](https://github.com/ether/ep_user_displayname#readme)
to automatically populate each user's displayed name from your OP.
* [ep_stable_authorid](https://github.com/ether/ep_stable_authorid#readme) so
that each user's chosen color, display name, comment ownership, etc. is
strongly linked to their account.
## 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 `src/bin/run.sh`
using the `-s|--settings` option: this allows you to run multiple Etherpad
instances from the same installation. Similarly, `--credentials` can be used to
give a settings override file, `--apikey` to give a different APIKEY.txt file
and `--sessionkey` to give a non-default `SESSIONKEY.txt`. **Each configuration
parameter can also be set via an environment variable**, using the syntax
`"${ENV_VAR}"` or `"${ENV_VAR:default_value}"`. For details, refer to
`settings.json.template`. Once you have access to your `/admin` section,
settings can be modified through the web browser.
If you are planning to use Etherpad in a production environment, you should use
a dedicated database such as `mysql`, since the `dirtyDB` database driver is
only for testing and/or development purposes.
### Secure your installation
If you have enabled authentication in `users` section in `settings.json`, it is
a good security practice to **store hashes instead of plain text passwords** in
that file. This is _especially_ advised if you are running a production
installation.
Please install [ep_hash_auth plugin](https://www.npmjs.com/package/ep_hash_auth)
and configure it. If you prefer, `ep_hash_auth` also gives you the option of
storing the users in a custom directory in the file system, without having to
edit `settings.json` and restart Etherpad each time.
### Customize the style with skin variants
Open http://127.0.0.1:9001/p/test#skinvariantsbuilder in your browser and start
playing!
![Skin Variant](doc/images/etherpad_skin_variants.gif "Skin variants") ![Skin Variant](doc/images/etherpad_skin_variants.gif "Skin variants")
## Helpful resources ## Helpful resources
The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's.
The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop
resource for Tutorials and How-to's.
Documentation can be found in `doc/`. Documentation can be found in `doc/`.
# Development ## Development
## Things you should know ### Things you should know
You can debug Etherpad using `src/bin/debugRun.sh`. You can debug Etherpad using `src/bin/debugRun.sh`.
@ -150,36 +254,63 @@ developers and advanced users. Be aware that it will skip the dependencies
update, so remember to run `src/bin/installDeps.sh` after installing a new update, so remember to run `src/bin/installDeps.sh` after installing a new
dependency or upgrading version. dependency or upgrading version.
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). 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).
## Contributing ### Contributing
Read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md)
# Get in touch Read our [**Developer
The official channel for contacting the development team is via the [Github issues](https://github.com/ether/etherpad-lite/issues). Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md)
For **responsible disclosure of vulnerabilities**, please write a mail to the maintainers (a.mux@inwind.it and contact@etherpad.org). ### HTTP API
Join the official [Etherpad Discord Channel](https://discord.com/invite/daEjfhw)
# HTTP API Etherpad is designed to be easily embeddable and provides a [HTTP
Etherpad is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) that allows your web
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. 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.
OpenAPI (previously swagger) definitions for the API are exposed under `/api/openapi.json`. OpenAPI (previously swagger) definitions for the API are exposed under
`/api/openapi.json`.
# jQuery plugin ### jQuery plugin
There is a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website.
# Plugin Framework There is a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin)
Etherpad offers a plugin framework, allowing you to easily add your own features. By default your Etherpad is extremely light-weight and it's up to you to customize your experience. Once you have Etherpad installed you should [visit the plugin page](https://static.etherpad.org/) and take control. that helps you to embed Pads into your website.
# Translations / Localizations (i18n / l10n) ### Plugin Framework
Etherpad comes with translations into all languages thanks to the team at [TranslateWiki](https://translatewiki.net/).
If you require translations in [plugins](https://static.etherpad.org/) please send pull request to each plugin individually. Etherpad offers a plugin framework, allowing you to easily add your own
features. By default your Etherpad is extremely light-weight and it's up to you
to customize your experience. Once you have Etherpad installed you should [visit
the plugin page](https://static.etherpad.org/) and take control.
### Translations / Localizations (i18n / l10n)
Etherpad comes with translations into all languages thanks to the team at
[TranslateWiki](https://translatewiki.net/).
If you require translations in [plugins](https://static.etherpad.org/) please
send pull request to each plugin individually.
## FAQ
# FAQ
Visit the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**. Visit the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**.
# License ## Get in touch
The official channel for contacting the development team is via the [GitHub
issues](https://github.com/ether/etherpad-lite/issues).
For **responsible disclosure of vulnerabilities**, please write a mail to the
maintainers (a.mux@inwind.it and contact@etherpad.org).
Join the official [Etherpad Discord
Channel](https://discord.com/invite/daEjfhw).
## License
[Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html) [Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html)

View file

@ -56,26 +56,68 @@ Called from: `src/static/js/pluginfw/plugins.js`
Run during startup after the named plugin is initialized. Run during startup after the named plugin is initialized.
Context properties: None Context properties:
## expressConfigure * `logger`: An object with the following `console`-like methods: `debug`,
Called from: src/node/hooks/express.js `info`, `log`, `warn`, `error`.
Things in context: ## `expressPreSession`
1. app - the main application object Called from: `src/node/hooks/express.js`
This is a helpful hook for changing the behavior and configuration of the application. It's called right after the application gets configured. Called during server startup just before the
[`express-session`](https://www.npmjs.com/package/express-session) middleware is
added to the Express Application object. Use this hook to add route handlers or
middleware that executes before `express-session` state is created and
authentication is performed. This is useful for creating public endpoints that
don't spam the database with new `express-session` records or trigger
authentication.
## expressCreateServer **WARNING:** All handlers registered during this hook run before the built-in
Called from: src/node/hooks/express.js authentication checks, so any handled endpoints will be public unless the
handler itself authenticates the user.
Things in context: Context properties:
1. app - the main express application object (helpful for adding new paths and such) * `app`: The Express [Application](https://expressjs.com/en/4x/api.html#app)
2. server - the http server object object.
This hook gets called after the application object has been created, but before it starts listening. This is similar to the expressConfigure hook, but it's not guaranteed that the application object will have all relevant configuration variables. Example:
```javascript
exports.expressPreSession = async (hookName, {app}) => {
app.get('/hello-world', (req, res) => res.send('hello world'));
};
```
## `expressConfigure`
Called from: `src/node/hooks/express.js`
Called during server startup just after the
[`express-session`](https://www.npmjs.com/package/express-session) middleware is
added to the Express Application object. Use this hook to add route handlers or
middleware that executes after `express-session` state is created and
authentication is performed.
Context properties:
* `app`: The Express [Application](https://expressjs.com/en/4x/api.html#app)
object.
## `expressCreateServer`
Called from: `src/node/hooks/express.js`
Identical to the `expressConfigure` hook (the two run in parallel with each
other) except this hook's context includes the HTTP Server object.
Context properties:
* `app`: The Express [Application](https://expressjs.com/en/4x/api.html#app)
object.
* `server`: The [http.Server](https://nodejs.org/api/http.html#class-httpserver)
or [https.Server](https://nodejs.org/api/https.html#class-httpsserver) object.
## expressCloseServer ## expressCloseServer
@ -165,15 +207,98 @@ Things in context:
This hook gets called when the access to the concrete pad is being checked. This hook gets called when the access to the concrete pad is being checked.
Return `false` to deny access. Return `false` to deny access.
## padCreate ## `getAuthorId`
Called from: src/node/db/Pad.js
Things in context: Called from `src/node/db/AuthorManager.js`
1. pad - the pad instance Called when looking up (or creating) the author ID for a user, except for author
2. author - the id of the author who created the pad IDs obtained via the HTTP API. Registered hook functions are called until one
returns a non-`undefined` value. If a truthy value is returned by a hook
function, it is used as the user's author ID. Otherwise, the value of the
`dbKey` context property is used to look up the author ID. If there is no such
author ID at that key, a new author ID is generated and associated with that
key.
This hook gets called when a new pad was created. Context properties:
* `dbKey`: Database key to use when looking up the user's author ID if no hook
function returns an author ID. This is initialized to the user-supplied token
value (see the `token` context property), but hook functions can modify this
to control how author IDs are allocated to users. If no author ID is
associated with this database key, a new author ID will be randomly generated
and associated with the key. For security reasons, if this is modified it
should be modified to not look like a valid token (see the `token` context
property) unless the plugin intentionally wants the user to be able to
impersonate another user.
* `token`: The user-supplied token, or nullish for an anonymous user. Tokens are
secret values that must not be disclosed to others. If non-null, the token is
guaranteed to be a string with the form `t.<base64url>` where `<base64url>` is
any valid non-empty base64url string (RFC 4648 section 5 with padding).
Example: `t.twim3X2_KGiRj8cJ-3602g==`.
* `user`: If the user has authenticated, this is an object from `settings.users`
(or similar from an authentication plugin). Etherpad core and all good
authentication plugins set the `username` property of this object to a string
that uniquely identifies the authenticated user. This object is nullish if the
user has not authenticated.
Example:
```javascript
exports.getAuthorId = async (hookName, context) => {
const {username} = context.user || {};
// If the user has not authenticated, or has "authenticated" as the guest
// user, do the default behavior (try another plugin if any, falling through
// to using the token as the database key).
if (!username || username === 'guest') return;
// The user is authenticated and has a username. Give the user a stable author
// ID so that they appear to be the same author even after clearing cookies or
// accessing the pad from another device. Note that this string is guaranteed
// to never have the form of a valid token; without that guarantee an
// unauthenticated user might be able to impersonate an authenticated user.
context.dbKey = `username=${username}`;
// Return a falsy but non-undefined value to stop Etherpad from calling any
// more getAuthorId hook functions and look up the author ID using the
// username-derived database key.
return '';
};
```
## `padCreate`
Called from: `src/node/db/Pad.js`
Called when a new pad is created.
Context properties:
* `pad`: The Pad object.
* `authorId`: The ID of the author who created the pad.
* `author` (**deprecated**): Synonym of `authorId`.
## `padDefaultContent`
Called from `src/node/db/Pad.js`
Called to obtain a pad's initial content, unless the pad is being created with
specific content. The return value is ignored; to change the content, modify the
`content` context property.
This hook is run asynchronously. All registered hook functions are run
concurrently (via `Promise.all()`), so be careful to avoid race conditions when
reading and modifying the context properties.
Context properties:
* `pad`: The newly created Pad object.
* `authorId`: The author ID of the user that is creating the pad.
* `type`: String identifying the content type. Currently this is `'text'` and
must not be changed. Future versions of Etherpad may add support for HTML,
jsdom objects, or other formats, so plugins must assert that this matches a
supported content type before reading `content`.
* `content`: The pad's initial content. Change this property to change the pad's
initial content. If the content type is changed, the `type` property must also
be updated to match. Plugins must check the value of the `type` property
before reading this value.
## `padLoad` ## `padLoad`
@ -185,44 +310,73 @@ Context properties:
* `pad`: The Pad object. * `pad`: The Pad object.
## padUpdate ## `padUpdate`
Called from: src/node/db/Pad.js
Things in context: Called from: `src/node/db/Pad.js`
1. pad - the pad instance Called when an existing pad is updated.
2. author - the id of the author who updated the pad
3. revs - the index of the new revision
4. changeset - the changeset of this revision (see [Changeset Library](#index_changeset_library))
This hook gets called when an existing pad was updated. Context properties:
## padCopy * `pad`: The Pad object.
Called from: src/node/db/Pad.js * `authorId`: The ID of the author who updated the pad.
* `author` (**deprecated**): Synonym of `authorId`.
* `revs`: The index of the new revision.
* `changeset`: The changeset of this revision (see [Changeset
Library](#index_changeset_library)).
Things in context: ## `padCopy`
1. originalPad - the source pad instance Called from: `src/node/db/Pad.js`
2. destinationID - the id of the pad copied from originalPad
This hook gets called when an existing pad was copied. Called when a pad is copied so that plugins can copy plugin-specific database
records or perform some other plugin-specific initialization.
Order of events when a pad is copied:
1. Destination pad is deleted if it exists and overwrite is permitted. This
causes the `padRemove` hook to run.
2. Pad-specific database records are copied in the database, except for
records with plugin-specific database keys.
3. A new Pad object is created for the destination pad. This causes the
`padLoad` hook to run.
4. This hook runs.
Context properties:
* `srcPad`: The source Pad object.
* `dstPad`: The destination Pad object.
Usage examples: Usage examples:
* https://github.com/ether/ep_comments * https://github.com/ether/ep_comments_page
## padRemove ## `padRemove`
Called from: src/node/db/Pad.js
Things in context: Called from: `src/node/db/Pad.js`
1. padID Called when an existing pad is removed/deleted. Plugins should use this to clean
up any plugin-specific pad records from the database.
This hook gets called when an existing pad was removed/deleted. Context properties:
* `pad`: Pad object for the pad that is being deleted.
Usage examples: Usage examples:
* https://github.com/ether/ep_comments * https://github.com/ether/ep_comments_page
## `padCheck`
Called from: `src/node/db/Pad.js`
Called when a consistency check is run on a pad, after the core checks have
completed successfully. An exception should be thrown if the pad is faulty in
some way.
Context properties:
* `pad`: The Pad object that is being checked.
## socketio ## socketio
Called from: src/node/hooks/express/socketio.js Called from: src/node/hooks/express/socketio.js
@ -235,47 +389,52 @@ Things in context:
I have no idea what this is useful for, someone else will have to add this description. I have no idea what this is useful for, someone else will have to add this description.
## preAuthorize ## `preAuthorize`
Called from: src/node/hooks/express/webaccess.js
Things in context: Called from: `src/node/hooks/express/webaccess.js`
1. req - the request object Called for each HTTP request before any authentication checks are performed. The
2. res - the response object registered `preAuthorize` hook functions are called one at a time until one
3. next - bypass callback. If this is called instead of the normal callback then explicitly grants or denies the request by returning `true` or `false`,
all remaining access checks are skipped. respectively. If none of the hook functions return anything, the access decision
is deferred to the normal authentication and authorization checks.
This hook is called for each HTTP request before any authentication checks are Example uses:
performed. Example uses:
* Always grant access to static content. * Always grant access to static content.
* Process an OAuth callback. * Process an OAuth callback.
* Drop requests from IP addresses that have failed N authentication checks * Drop requests from IP addresses that have failed N authentication checks
within the past X minutes. within the past X minutes.
A preAuthorize function is always called for each request unless a preAuthorize Return values:
function from another plugin (if any) has already explicitly granted or denied
the request.
You can pass the following values to the provided callback: * `undefined` (or `[]`) defers the access decision to the next registered
`preAuthorize` hook function, or to the normal authentication and
authorization checks if no more `preAuthorize` hook functions remain.
* `true` (or `[true]`) immediately grants access to the requested resource,
unless the request is for an `/admin` page in which case it is treated the
same as returning `undefined`. (This prevents buggy plugins from accidentally
granting admin access to the general public.)
* `false` (or `[false]`) immediately denies the request. The `preAuthnFailure`
hook will be called to handle the failure.
* `[]` defers the access decision to the normal authentication and authorization Context properties:
checks (or to a preAuthorize function from another plugin, if one exists).
* `[true]` immediately grants access to the requested resource, unless the * `req`: The Express [Request](https://expressjs.com/en/4x/api.html#req) object.
request is for an `/admin` page in which case it is treated the same as `[]`. * `res`: The Express [Response](https://expressjs.com/en/4x/api.html#res)
(This prevents buggy plugins from accidentally granting admin access to the object.
general public.) * `next`: Callback to immediately hand off handling to the next Express
* `[false]` immediately denies the request. The preAuthnFailure hook will be middleware/handler, or to the next matching route if `'route'` is passed as
called to handle the failure. the first argument. Do not call this unless you understand the consequences.
Example: Example:
``` ```javascript
exports.preAuthorize = (hookName, context, cb) => { exports.preAuthorize = async (hookName, {req}) => {
if (ipAddressIsFirewalled(context.req)) return cb([false]); if (await ipAddressIsFirewalled(req)) return false;
if (requestIsForStaticContent(context.req)) return cb([true]); if (requestIsForStaticContent(req)) return true;
if (requestIsForOAuthCallback(context.req)) return cb([true]); if (requestIsForOAuthCallback(req)) return true;
return cb([]); // Defer the decision to the next step by returning undefined.
}; };
``` ```
@ -530,26 +689,29 @@ exports.authzFailure = (hookName, context, cb) => {
}; };
``` ```
## handleMessage ## `handleMessage`
Called from: src/node/handler/PadMessageHandler.js
Things in context: Called from: `src/node/handler/PadMessageHandler.js`
1. message - the message being handled
2. socket - the socket.io Socket object
3. client - **deprecated** synonym of socket
This hook allows plugins to drop or modify incoming socket.io messages from This hook allows plugins to drop or modify incoming socket.io messages from
clients, before Etherpad processes them. clients, before Etherpad processes them. If any hook function returns `null`
then the message will not be subject to further processing.
The handleMessage function must return a Promise. If the Promise resolves to Context properties:
`null`, the message is dropped. Returning `callback(value)` will return a
Promise that is resolved to `value`.
Examples: * `message`: The message being handled.
* `sessionInfo`: Object describing the socket.io session with the following
properties:
* `authorId`: The user's author ID.
* `padId`: The real (not read-only) ID of the pad.
* `readOnly`: Whether the client has read-only access (true) or read/write
access (false).
* `socket`: The socket.io Socket object.
* `client`: (**Deprecated**; use `socket` instead.) Synonym of `socket`.
``` Example:
// Using an async function:
```javascript
exports.handleMessage = async (hookName, {message, socket}) => { exports.handleMessage = async (hookName, {message, socket}) => {
if (message.type === 'USERINFO_UPDATE') { if (message.type === 'USERINFO_UPDATE') {
// Force the display name to the name associated with the account. // Force the display name to the name associated with the account.
@ -557,51 +719,47 @@ exports.handleMessage = async (hookName, {message, socket}) => {
if (user.name) message.data.userInfo.name = user.name; if (user.name) message.data.userInfo.name = user.name;
} }
}; };
// Using a regular function:
exports.handleMessage = (hookName, {message, socket}, callback) => {
if (message.type === 'USERINFO_UPDATE') {
// Force the display name to the name associated with the account.
const user = socket.client.request.session.user || {};
if (user.name) message.data.userInfo.name = user.name;
}
return callback();
};
``` ```
## handleMessageSecurity ## `handleMessageSecurity`
Called from: src/node/handler/PadMessageHandler.js
Things in context: Called from: `src/node/handler/PadMessageHandler.js`
1. message - the message being handled Called for each incoming message from a client. Allows plugins to grant
2. socket - the socket.io Socket object temporary write access to a pad.
3. client - **deprecated** synonym of socket
This hook allows plugins to grant temporary write access to a pad. It is called Supported return values:
for each incoming message from a client. If write access is granted, it applies
to the current message and all future messages from the same socket.io
connection until the next `CLIENT_READY` message. Read-only access is reset
**after** each `CLIENT_READY` message, so granting write access has no effect
for those message types.
The handleMessageSecurity function must return a Promise. If the Promise * `undefined`: No change in access status.
resolves to `true`, write access is granted as described above. Returning * `'permitOnce'`: Override the user's read-only access for the current
`callback(value)` will return a Promise that is resolved to `value`. `COLLABROOM` message only. Has no effect if the current message is not a
`COLLABROOM` message, or if the user already has write access to the pad.
* `true`: (**Deprecated**; return `'permitOnce'` instead.) Override the user's
read-only access for all `COLLABROOM` messages from the same socket.io
connection (including the current message, if applicable) until the client's
next `CLIENT_READY` message. Has no effect if the user already has write
access to the pad. Read-only access is reset **after** each `CLIENT_READY`
message, so returning `true` has no effect for `CLIENT_READY` messages.
Examples: Context properties:
``` * `message`: The message being handled.
// Using an async function: * `sessionInfo`: Object describing the socket.io connection with the following
exports.handleMessageSecurity = async (hookName, {message, socket}) => { properties:
if (shouldGrantWriteAccess(message, socket)) return true; * `authorId`: The user's author ID.
return; * `padId`: The real (not read-only) ID of the pad.
}; * `readOnly`: Whether the client has read-only access (true) or read/write
access (false).
* `socket`: The socket.io Socket object.
* `client`: (**Deprecated**; use `socket` instead.) Synonym of `socket`.
// Using a regular function: Example:
exports.handleMessageSecurity = (hookName, {message, socket}, callback) => {
if (shouldGrantWriteAccess(message, socket)) return callback(true); ```javascript
return callback(); exports.handleMessageSecurity = async (hookName, context) => {
const {message, sessionInfo: {readOnly}} = context;
if (!readOnly || message.type !== 'COLLABROOM') return;
if (await messageIsBenign(message)) return 'permitOnce';
}; };
``` ```
@ -647,39 +805,36 @@ exports.clientVars = (hookName, context, callback) => {
}; };
``` ```
## getLineHTMLForExport ## `getLineHTMLForExport`
Called from: src/node/utils/ExportHtml.js
Things in context: Called from: `src/node/utils/ExportHtml.js`
1. apool - pool object This hook will allow a plug-in developer to re-write each line when exporting to
2. attribLine - line attributes HTML.
3. text - line text
This hook will allow a plug-in developer to re-write each line when exporting to HTML. Context properties:
* `apool`: Pool object.
* `attribLine`: Line attributes.
* `line`:
* `lineContent`:
* `text`: Line text.
* `padId`: Writable (not read-only) pad identifier.
Example: Example:
```
var Changeset = require("ep_etherpad-lite/static/js/Changeset");
exports.getLineHTMLForExport = function (hook, context) { ```javascript
var header = _analyzeLine(context.attribLine, context.apool); const AttributeMap = require('ep_etherpad-lite/static/js/AttributeMap');
if (header) { const Changeset = require('ep_etherpad-lite/static/js/Changeset');
return "<" + header + ">" + context.lineContent + "</" + header + ">";
}
}
function _analyzeLine(alineAttrs, apool) { exports.getLineHTMLForExport = async (hookName, context) => {
var header = null; if (!context.attribLine) return;
if (alineAttrs) { const [op] = Changeset.deserializeOps(context.attribLine);
var opIter = Changeset.opIterator(alineAttrs); if (op == null) return;
if (opIter.hasNext()) { const heading = AttributeMap.fromString(op.attribs, context.apool).get('heading');
var op = opIter.next(); if (!heading) return;
header = Changeset.opAttributeValue(op, 'heading', apool); context.lineContent = `<${heading}>${context.lineContent}</${heading}>`;
} };
}
return header;
}
``` ```
## exportHTMLAdditionalContent ## exportHTMLAdditionalContent
@ -790,17 +945,19 @@ exports.exportHtmlAdditionalTagsWithData = function(hook, pad, cb){
}; };
``` ```
## exportEtherpadAdditionalContent ## `exportEtherpadAdditionalContent`
Called from src/node/utils/ExportEtherpad.js and
src/node/utils/ImportEtherpad.js
Things in context: Nothing Called from `src/node/utils/ExportEtherpad.js` and
`src/node/utils/ImportEtherpad.js`.
Useful for exporting and importing pad metadata that is stored in the database Called when exporting to an `.etherpad` file or when importing from an
but not in the pad's content or attributes. For example, in ep_comments_page the `.etherpad` file. The hook function should return prefixes for pad-specific
comments are stored as `comments:padId:uniqueIdOfComment` so a complete export records that should be included in the export/import. On export, all
of all pad data to an `.etherpad` file must include the `comments:padId:*` `${prefix}:${padId}` and `${prefix}:${padId}:*` records are included in the
records. generated `.etherpad` file. On import, all `${prefix}:${padId}` and
`${prefix}:${padId}:*` records are loaded into the database.
Context properties: None.
Example: Example:
@ -809,6 +966,48 @@ Example:
exports.exportEtherpadAdditionalContent = () => ['comments']; exports.exportEtherpadAdditionalContent = () => ['comments'];
``` ```
## `exportEtherpad`
Called from `src/node/utils/ExportEtherpad.js`.
Called when exporting to an `.etherpad` file.
Context properties:
* `pad`: The exported pad's Pad object.
* `data`: JSONable output object. This is pre-populated with records from core
Etherpad as well as pad-specific records with prefixes from the
`exportEtherpadAdditionalContent` hook. Registered hook functions can modify
this object (but not replace the object) to perform any desired
transformations to the exported data (such as the inclusion of
plugin-specific records). All registered hook functions are executed
concurrently, so care should be taken to avoid race conditions with other
plugins.
* `dstPadId`: The pad ID that should be used when writing pad-specific records
to `data` (instead of `pad.id`). This avoids leaking the writable pad ID
when a user exports a read-only pad. This might be a dummy value; plugins
should not assume that it is either the pad's real writable ID or its
read-only ID.
## `importEtherpad`
Called from `src/node/utils/ImportEtherpad.js`.
Called when importing from an `.etherpad` file.
Context properties:
* `pad`: Temporary Pad object containing the pad's data read from the imported
`.etherpad` file. The `pad.db` object is a temporary in-memory database
whose records will be copied to the real database after they are validated
(see the `padCheck` hook). Registered hook functions MUST NOT use the real
database to access (read or write) pad-specific records; they MUST instead
use `pad.db`. All registered hook functions are executed concurrently, so
care should be taken to avoid race conditions with other plugins.
* `data`: Raw JSONable object from the `.etherpad` file. This data must not be
modified.
* `srcPadId`: The pad ID used for the pad-specific information in `data`.
## `import` ## `import`
Called from: `src/node/handler/ImportHandler.js` Called from: `src/node/handler/ImportHandler.js`
@ -824,6 +1023,19 @@ Context properties:
period** (examples: `'.docx'`, `'.html'`, `'.etherpad'`). period** (examples: `'.docx'`, `'.html'`, `'.etherpad'`).
* `padId`: The identifier of the destination pad. * `padId`: The identifier of the destination pad.
* `srcFile`: The document to convert. * `srcFile`: The document to convert.
* `ImportError`: Subclass of Error that can be thrown to provide a specific
error message to the user. The constructor's first argument must be a string
matching one of the [known error
identifiers](https://github.com/ether/etherpad-lite/blob/1.8.16/src/static/js/pad_impexp.js#L80-L86).
Example:
```javascript
exports.import = async (hookName, {fileEnding, ImportError}) => {
// Reject all *.etherpad imports with a permission denied message.
if (fileEnding === '.etherpad') throw new ImportError('permission');
};
```
## `userJoin` ## `userJoin`

View file

@ -65,7 +65,7 @@ Portal submits content into new blog post
## Usage ## Usage
### API version ### API version
The latest version is `1.2.14` The latest version is `1.2.15`
The current version can be queried via /api. The current version can be queried via /api.
@ -173,14 +173,15 @@ returns all pads of this group
* `{code: 0, message:"ok", data: {padIDs : ["g.s8oes9dhwrvt0zif$test", "g.s8oes9dhwrvt0zif$test2"]}` * `{code: 0, message:"ok", data: {padIDs : ["g.s8oes9dhwrvt0zif$test", "g.s8oes9dhwrvt0zif$test2"]}`
* `{code: 1, message:"groupID does not exist", data: null}` * `{code: 1, message:"groupID does not exist", data: null}`
#### createGroupPad(groupID, padName [, text]) #### createGroupPad(groupID, padName, [text], [authorId])
* API >= 1 * API >= 1
* `authorId` in API >= 1.3.0
creates a new pad in this group creates a new pad in this group
*Example returns:* *Example returns:*
* `{code: 0, message:"ok", data: null}` * `{code: 0, message:"ok", data: {padID: "g.s8oes9dhwrvt0zif$test"}`
* `{code: 1, message:"pad does already exist", data: null}` * `{code: 1, message:"padName does already exist", data: null}`
* `{code: 1, message:"groupID does not exist", data: null}` * `{code: 1, message:"groupID does not exist", data: null}`
#### listAllGroups() #### listAllGroups()
@ -293,8 +294,9 @@ returns the text of a pad
* `{code: 0, message:"ok", data: {text:"Welcome Text"}}` * `{code: 0, message:"ok", data: {text:"Welcome Text"}}`
* `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"padID does not exist", data: null}`
#### setText(padID, text) #### setText(padID, text, [authorId])
* API >= 1 * API >= 1
* `authorId` in API >= 1.3.0
Sets the text of a pad. Sets the text of a pad.
@ -305,8 +307,9 @@ If your text is long (>8 KB), please invoke via POST and include `text` paramete
* `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"padID does not exist", data: null}`
* `{code: 1, message:"text too long", data: null}` * `{code: 1, message:"text too long", data: null}`
#### appendText(padID, text) #### appendText(padID, text, [authorId])
* API >= 1.2.13 * API >= 1.2.13
* `authorId` in API >= 1.3.0
Appends text to a pad. Appends text to a pad.
@ -326,8 +329,9 @@ returns the text of a pad formatted as HTML
* `{code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}}` * `{code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}}`
* `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"padID does not exist", data: null}`
#### setHTML(padID, html) #### setHTML(padID, html, [authorId])
* API >= 1 * API >= 1
* `authorId` in API >= 1.3.0
sets the text of a pad based on HTML, HTML must be well-formed. Malformed HTML will send a warning to the API log. sets the text of a pad based on HTML, HTML must be well-formed. Malformed HTML will send a warning to the API log.
@ -387,8 +391,9 @@ returns an object of diffs from 2 points in a pad
* `{"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&#x3a;&#x2F;&#x2F;etherpad&#x2e;org\">http:&#x2F;&#x2F;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&#x3a;&#x2F;&#x2F;etherpad&#x2e;org\">http:&#x2F;&#x2F;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}` * `{"code":4,"message":"no or wrong API Key","data":null}`
#### restoreRevision(padId, rev) #### restoreRevision(padId, rev, [authorId])
* API >= 1.2.11 * API >= 1.2.11
* `authorId` in API >= 1.3.0
Restores revision from past as new changeset Restores revision from past as new changeset
@ -437,8 +442,9 @@ creates a chat message, saves it to the database and sends it to all connected c
### Pad ### Pad
Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and it's forbidden for normal pads to include a $ in the name. Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and it's forbidden for normal pads to include a $ in the name.
#### createPad(padID [, text]) #### createPad(padID, [text], [authorId])
* API >= 1 * API >= 1
* `authorId` in API >= 1.3.0
creates a new (non-group) pad. Note that if you need to create a group Pad, you should call **createGroupPad**. creates a new (non-group) pad. Note that if you need to create a group Pad, you should call **createGroupPad**.
You get an error message if you use one of the following characters in the padID: "/", "?", "&" or "#". You get an error message if you use one of the following characters in the padID: "/", "?", "&" or "#".
@ -519,8 +525,9 @@ copies a pad with full history and chat. If force is true and the destination pa
* `{code: 0, message:"ok", data: null}` * `{code: 0, message:"ok", data: null}`
* `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"padID does not exist", data: null}`
#### copyPadWithoutHistory(sourceID, destinationID[, force=false]) #### copyPadWithoutHistory(sourceID, destinationID, [force=false], [authorId])
* API >= 1.2.15 * API >= 1.2.15
* `authorId` in API >= 1.3.0
copies a pad without copying the history and chat. If force is true and the destination pad exists, it will be overwritten. copies a pad without copying the history and chat. If force is true and the destination pad exists, it will be overwritten.
Note that all the revisions will be lost! In most of the cases one should use `copyPad` API instead. Note that all the revisions will be lost! In most of the cases one should use `copyPad` API instead.
@ -559,11 +566,12 @@ returns the id of a pad which is assigned to the readOnlyID
#### setPublicStatus(padID, publicStatus) #### setPublicStatus(padID, publicStatus)
* API >= 1 * API >= 1
sets a boolean for the public status of a pad sets a boolean for the public status of a group pad
*Example returns:* *Example returns:*
* `{code: 0, message:"ok", data: null}` * `{code: 0, message:"ok", data: null}`
* `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"padID does not exist", data: null}`
* `{code: 1, message:"You can only get/set the publicStatus of pads that belong to a group", data: null}`
#### getPublicStatus(padID) #### getPublicStatus(padID)
* API >= 1 * API >= 1
@ -573,6 +581,7 @@ return true of false
*Example returns:* *Example returns:*
* `{code: 0, message:"ok", data: {publicStatus: true}}` * `{code: 0, message:"ok", data: {publicStatus: true}}`
* `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"padID does not exist", data: null}`
* `{code: 1, message:"You can only get/set the publicStatus of pads that belong to a group", data: null}`
#### listAuthorsOfPad(padID) #### listAuthorsOfPad(padID)
* API >= 1 * API >= 1

View file

@ -116,12 +116,12 @@ If your database needs additional settings, you will have to use a personalized
| `PAD_OPTIONS_SHOW_CHAT` | | `true` | | `PAD_OPTIONS_SHOW_CHAT` | | `true` |
| `PAD_OPTIONS_SHOW_LINE_NUMBERS` | | `true` | | `PAD_OPTIONS_SHOW_LINE_NUMBERS` | | `true` |
| `PAD_OPTIONS_USE_MONOSPACE_FONT` | | `false` | | `PAD_OPTIONS_USE_MONOSPACE_FONT` | | `false` |
| `PAD_OPTIONS_USER_NAME` | | `false` | | `PAD_OPTIONS_USER_NAME` | | `null` |
| `PAD_OPTIONS_USER_COLOR` | | `false` | | `PAD_OPTIONS_USER_COLOR` | | `null` |
| `PAD_OPTIONS_RTL` | | `false` | | `PAD_OPTIONS_RTL` | | `false` |
| `PAD_OPTIONS_ALWAYS_SHOW_CHAT` | | `false` | | `PAD_OPTIONS_ALWAYS_SHOW_CHAT` | | `false` |
| `PAD_OPTIONS_CHAT_AND_USERS` | | `false` | | `PAD_OPTIONS_CHAT_AND_USERS` | | `false` |
| `PAD_OPTIONS_LANG` | | `en-gb` | | `PAD_OPTIONS_LANG` | | `null` |
### Shortcuts ### Shortcuts
@ -187,6 +187,9 @@ For the editor container, you can also make it full width by adding `full-width-
| Variable | Description | Default | | Variable | Description | Default |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
| `COOKIE_SAME_SITE` | Value of the SameSite cookie property. | `"Lax"` |
| `COOKIE_SESSION_LIFETIME` | How long (ms) a user can be away before they must log in again. | `864000000` (10 days) |
| `COOKIE_SESSION_REFRESH_INTERVAL` | How often (ms) to write the latest cookie expiration time. | `86400000` (1 day) |
| `SHOW_SETTINGS_IN_ADMIN_PAGE` | hide/show the settings.json in admin page | `true` | | `SHOW_SETTINGS_IN_ADMIN_PAGE` | hide/show the settings.json in admin page | `true` |
| `TRUST_PROXY` | set to `true` if you are using a reverse proxy in front of Etherpad (for example: Traefik for SSL termination via Let's Encrypt). This will affect security and correctness of the logs if not done | `false` | | `TRUST_PROXY` | set to `true` if you are using a reverse proxy in front of Etherpad (for example: Traefik for SSL termination via Let's Encrypt). This will affect security and correctness of the logs if not done | `false` |
| `IMPORT_MAX_FILE_SIZE` | maximum allowed file size when importing a pad, in bytes. | `52428800` (50 MB) | | `IMPORT_MAX_FILE_SIZE` | maximum allowed file size when importing a pad, in bytes. | `52428800` (50 MB) |

View file

@ -225,7 +225,7 @@ publish your plugin.
"author": "USERNAME (REAL NAME) <MAIL@EXAMPLE.COM>", "author": "USERNAME (REAL NAME) <MAIL@EXAMPLE.COM>",
"contributors": [], "contributors": [],
"dependencies": {"MODULE": "0.3.20"}, "dependencies": {"MODULE": "0.3.20"},
"engines": {"node": ">=12.13.0"} "engines": {"node": ">=12.17.0"}
} }
``` ```

View file

@ -234,12 +234,12 @@
"showChat": "${PAD_OPTIONS_SHOW_CHAT:true}", "showChat": "${PAD_OPTIONS_SHOW_CHAT:true}",
"showLineNumbers": "${PAD_OPTIONS_SHOW_LINE_NUMBERS:true}", "showLineNumbers": "${PAD_OPTIONS_SHOW_LINE_NUMBERS:true}",
"useMonospaceFont": "${PAD_OPTIONS_USE_MONOSPACE_FONT:false}", "useMonospaceFont": "${PAD_OPTIONS_USE_MONOSPACE_FONT:false}",
"userName": "${PAD_OPTIONS_USER_NAME:false}", "userName": "${PAD_OPTIONS_USER_NAME:null}",
"userColor": "${PAD_OPTIONS_USER_COLOR:false}", "userColor": "${PAD_OPTIONS_USER_COLOR:null}",
"rtl": "${PAD_OPTIONS_RTL:false}", "rtl": "${PAD_OPTIONS_RTL:false}",
"alwaysShowChat": "${PAD_OPTIONS_ALWAYS_SHOW_CHAT:false}", "alwaysShowChat": "${PAD_OPTIONS_ALWAYS_SHOW_CHAT:false}",
"chatAndUsers": "${PAD_OPTIONS_CHAT_AND_USERS:false}", "chatAndUsers": "${PAD_OPTIONS_CHAT_AND_USERS:false}",
"lang": "${PAD_OPTIONS_LANG:en-gb}" "lang": "${PAD_OPTIONS_LANG:null}"
}, },
/* /*
@ -374,7 +374,51 @@
* significant usability drawbacks vs. "Lax". See * significant usability drawbacks vs. "Lax". See
* https://stackoverflow.com/q/41841880 for discussion. * https://stackoverflow.com/q/41841880 for discussion.
*/ */
"sameSite": "${COOKIE_SAME_SITE:Lax}" "sameSite": "${COOKIE_SAME_SITE:Lax}",
/*
* How long (in milliseconds) after navigating away from Etherpad before the
* user is required to log in again. (The express_sid cookie is set to
* expire at time now + sessionLifetime when first created, and its
* expiration time is periodically refreshed to a new now + sessionLifetime
* value.) If requireAuthentication is false then this value does not really
* matter.
*
* The "best" value depends on your users' usage patterns and the amount of
* convenience you desire. A long lifetime is more convenient (users won't
* have to log back in as often) but has some drawbacks:
* - It increases the amount of state kept in the database.
* - It might weaken security somewhat: The cookie expiration is refreshed
* indefinitely without consulting authentication or authorization
* hooks, so once a user has accessed a pad, the user can continue to
* use the pad until the user leaves for longer than sessionLifetime.
*
* Session lifetime can be set to infinity (not recommended) by setting this
* to null or 0. Note that if the session does not expire, most browsers
* will delete the cookie when the browser exits, but a session record is
* kept in the database forever.
*/
// 864000000 = 10d * 24h/d * 60m/h * 60s/m * 1000ms/s
"sessionLifetime": "${COOKIE_SESSION_LIFETIME:864000000}",
/*
* How long (in milliseconds) before the expiration time of an active user's
* session is refreshed (to now + sessionLifetime). This setting affects the
* following:
* - How often a new session expiration time will be written to the
* database.
* - How often each user's browser will ping the Etherpad server to
* refresh the expiration time of the session cookie.
*
* High values reduce the load on the database and the load from browsers,
* but can shorten the effective session lifetime if Etherpad is restarted
* or the user navigates away.
*
* Automatic session refreshes can be disabled (not recommended) by setting
* this to null.
*/
// 86400000 = 1d * 24h/d * 60m/h * 60s/m * 1000ms/s
"sessionRefreshInterval": "${COOKIE_SESSION_REFRESH_INTERVAL:86400000}"
}, },
/* /*
@ -587,5 +631,8 @@
"loglevel": "${LOGLEVEL:INFO}", "loglevel": "${LOGLEVEL:INFO}",
/* Override any strings found in locale directories */ /* Override any strings found in locale directories */
"customLocaleStrings": {} "customLocaleStrings": {},
/* Disable Admin UI tests */
"enableAdminUITests": false
} }

View file

@ -235,12 +235,12 @@
"showChat": true, "showChat": true,
"showLineNumbers": true, "showLineNumbers": true,
"useMonospaceFont": false, "useMonospaceFont": false,
"userName": false, "userName": null,
"userColor": false, "userColor": null,
"rtl": false, "rtl": false,
"alwaysShowChat": false, "alwaysShowChat": false,
"chatAndUsers": false, "chatAndUsers": false,
"lang": "en-gb" "lang": null
}, },
/* /*
@ -375,7 +375,49 @@
* significant usability drawbacks vs. "Lax". See * significant usability drawbacks vs. "Lax". See
* https://stackoverflow.com/q/41841880 for discussion. * https://stackoverflow.com/q/41841880 for discussion.
*/ */
"sameSite": "Lax" "sameSite": "Lax",
/*
* How long (in milliseconds) after navigating away from Etherpad before the
* user is required to log in again. (The express_sid cookie is set to
* expire at time now + sessionLifetime when first created, and its
* expiration time is periodically refreshed to a new now + sessionLifetime
* value.) If requireAuthentication is false then this value does not really
* matter.
*
* The "best" value depends on your users' usage patterns and the amount of
* convenience you desire. A long lifetime is more convenient (users won't
* have to log back in as often) but has some drawbacks:
* - It increases the amount of state kept in the database.
* - It might weaken security somewhat: The cookie expiration is refreshed
* indefinitely without consulting authentication or authorization
* hooks, so once a user has accessed a pad, the user can continue to
* use the pad until the user leaves for longer than sessionLifetime.
*
* Session lifetime can be set to infinity (not recommended) by setting this
* to null or 0. Note that if the session does not expire, most browsers
* will delete the cookie when the browser exits, but a session record is
* kept in the database forever.
*/
"sessionLifetime": 864000000, // = 10d * 24h/d * 60m/h * 60s/m * 1000ms/s
/*
* How long (in milliseconds) before the expiration time of an active user's
* session is refreshed (to now + sessionLifetime). This setting affects the
* following:
* - How often a new session expiration time will be written to the
* database.
* - How often each user's browser will ping the Etherpad server to
* refresh the expiration time of the session cookie.
*
* High values reduce the load on the database and the load from browsers,
* but can shorten the effective session lifetime if Etherpad is restarted
* or the user navigates away.
*
* Automatic session refreshes can be disabled (not recommended) by setting
* this to null.
*/
"sessionRefreshInterval": 86400000 // = 1d * 24h/d * 60m/h * 60s/m * 1000ms/s
}, },
/* /*
@ -550,7 +592,6 @@
"points": 10 "points": 10
}, },
/* /*
* Toolbar buttons configuration. * Toolbar buttons configuration.
* *

141
src/.eslintrc.cjs Normal file
View file

@ -0,0 +1,141 @@
'use strict';
// This is a workaround for https://github.com/eslint/eslint/issues/3458
require('eslint-config-etherpad/patch/modern-module-resolution');
module.exports = {
ignorePatterns: [
'/static/js/admin/jquery.autosize.js',
'/static/js/admin/minify.json.js',
'/static/js/vendors/browser.js',
'/static/js/vendors/farbtastic.js',
'/static/js/vendors/gritter.js',
'/static/js/vendors/html10n.js',
'/static/js/vendors/jquery.js',
'/static/js/vendors/nice-select.js',
'/tests/frontend/lib/',
],
overrides: [
{
files: [
'**/.eslintrc.*',
],
extends: 'etherpad/node',
},
{
files: [
'**/*',
],
excludedFiles: [
'**/.eslintrc.*',
'tests/frontend/**/*',
],
extends: 'etherpad/node',
},
{
files: [
'static/**/*',
'tests/frontend/helper.js',
'tests/frontend/helper/**/*',
],
excludedFiles: [
'**/.eslintrc.*',
],
extends: 'etherpad/browser',
env: {
'shared-node-browser': true,
},
overrides: [
{
files: [
'tests/frontend/helper/**/*',
],
globals: {
helper: 'readonly',
},
},
],
},
{
files: [
'tests/**/*',
],
excludedFiles: [
'**/.eslintrc.*',
'tests/frontend/cypress/**/*',
'tests/frontend/helper.js',
'tests/frontend/helper/**/*',
'tests/frontend/travis/**/*',
'tests/ratelimit/**/*',
],
extends: 'etherpad/tests',
rules: {
'mocha/no-exports': 'off',
'mocha/no-top-level-hooks': 'off',
},
},
{
files: [
'tests/backend/**/*',
],
excludedFiles: [
'**/.eslintrc.*',
],
extends: 'etherpad/tests/backend',
overrides: [
{
files: [
'tests/backend/**/*',
],
excludedFiles: [
'tests/backend/specs/**/*',
],
rules: {
'mocha/no-exports': 'off',
'mocha/no-top-level-hooks': 'off',
},
},
],
},
{
files: [
'tests/frontend/**/*',
],
excludedFiles: [
'**/.eslintrc.*',
'tests/frontend/cypress/**/*',
'tests/frontend/helper.js',
'tests/frontend/helper/**/*',
'tests/frontend/travis/**/*',
],
extends: 'etherpad/tests/frontend',
overrides: [
{
files: [
'tests/frontend/**/*',
],
excludedFiles: [
'tests/frontend/specs/**/*',
],
rules: {
'mocha/no-exports': 'off',
'mocha/no-top-level-hooks': 'off',
},
},
],
},
{
files: [
'tests/frontend/cypress/**/*',
],
extends: 'etherpad/tests/cypress',
},
{
files: [
'tests/frontend/travis/**/*',
],
extends: 'etherpad/node',
},
],
root: true,
};

View file

@ -1,62 +1,57 @@
#!/bin/sh #!/bin/sh
set -e
pecho() { printf %s\\n "$*"; } pecho() { printf %s\\n "$*"; }
log() { pecho "$@"; } log() { pecho "$@"; }
error() { log "ERROR: $@" >&2; } error() { log "ERROR: $@" >&2; }
fatal() { error "$@"; exit 1; } fatal() { error "$@"; exit 1; }
try() { "$@" || fatal "'$@' failed"; }
is_cmd() { command -v "$@" >/dev/null 2>&1; } is_cmd() { command -v "$@" >/dev/null 2>&1; }
# Move to the folder where ep-lite is installed for x in git unzip wget zip; do
cd "$(cd "${0%/*}" && pwd -P)/../.." is_cmd "${x}" || fatal "Please install ${x}"
done
# Is wget installed? # Move to the folder where Etherpad is checked out
is_cmd wget || fatal "Please install wget" try cd "${0%/*}"
workdir=$(try git rev-parse --show-toplevel) || exit 1
try cd "${workdir}"
[ -f src/package.json ] || fatal "failed to cd to etherpad root directory"
# Is zip installed? OUTPUT=${workdir}/etherpad-win.zip
is_cmd zip || fatal "Please install zip"
# Is zip installed? TMP_FOLDER=$(try mktemp -d) || exit 1
is_cmd unzip || fatal "Please install unzip" trap 'exit 1' HUP INT TERM
trap 'log "cleaning up..."; try cd / && try rm -rf "${TMP_FOLDER}"' EXIT
START_FOLDER=$(pwd);
TMP_FOLDER=$(mktemp -d)
log "create a clean environment in $TMP_FOLDER..." log "create a clean environment in $TMP_FOLDER..."
cp -ar . "$TMP_FOLDER" try git archive --format=tar HEAD | (try cd "${TMP_FOLDER}" && try tar xf -) \
cd "$TMP_FOLDER" || fatal "failed to copy etherpad to temporary folder"
rm -rf node_modules try mkdir "${TMP_FOLDER}"/.git
rm -f etherpad-lite-win.zip try git rev-parse HEAD >${TMP_FOLDER}/.git/HEAD
try cd "${TMP_FOLDER}"
[ -f src/package.json ] || fatal "failed to copy etherpad to temporary folder"
# setting NODE_ENV=production ensures that dev dependencies are not installed, # setting NODE_ENV=production ensures that dev dependencies are not installed,
# making the windows package smaller # making the windows package smaller
export NODE_ENV=production export NODE_ENV=production
log "do a normal unix install first..." log "do a normal unix install first..."
src/bin/installDeps.sh || exit 1 try ./src/bin/installDeps.sh
log "copy the windows settings template..." log "copy the windows settings template..."
cp settings.json.template settings.json try cp settings.json.template settings.json
log "resolve symbolic links..." log "resolve symbolic links..."
cp -rL node_modules node_modules_resolved try cp -rL node_modules node_modules_resolved
rm -rf node_modules try rm -rf node_modules
mv node_modules_resolved node_modules try mv node_modules_resolved node_modules
log "download windows node..." log "download windows node..."
wget "https://nodejs.org/dist/latest-erbium/win-x86/node.exe" -O node.exe try wget "https://nodejs.org/dist/latest-v16.x/win-x64/node.exe" -O node.exe
log "remove git history to reduce folder size"
rm -rf .git/objects
log "remove windows jsdom-nocontextify/test folder"
rm -rf "$TMP_FOLDER"/src/node_modules/wd/node_modules/request/node_modules/form-data/node_modules/combined-stream/test
rm -rf "$TMP_FOLDER"/src/node_modules/nodemailer/node_modules/mailcomposer/node_modules/mimelib/node_modules/encoding/node_modules/iconv-lite/encodings/tables
log "create the zip..." log "create the zip..."
cd "$TMP_FOLDER" try zip -9 -r "${OUTPUT}" ./*
zip -9 -r "$START_FOLDER"/etherpad-lite-win.zip ./* -x var
log "clean up..." log "Finished. You can find the zip at ${OUTPUT}"
rm -rf "$TMP_FOLDER"
log "Finished. You can find the zip in the Etherpad root folder, it's called etherpad-lite-win.zip"

View file

@ -145,12 +145,12 @@ function push_builds {
cd $TMP_DIR/etherpad-lite/ cd $TMP_DIR/etherpad-lite/
echo "Copying windows build and docs to website repo..." echo "Copying windows build and docs to website repo..."
GIT_SHA=$(git rev-parse HEAD | cut -c1-10) GIT_SHA=$(git rev-parse HEAD | cut -c1-10)
mv etherpad-lite-win.zip $TMP_DIR/ether.github.com/downloads/etherpad-lite-win-$VERSION-$GIT_SHA.zip mv etherpad-win.zip $TMP_DIR/ether.github.com/downloads/etherpad-win-$VERSION-$GIT_SHA.zip
mv out/doc $TMP_DIR/ether.github.com/doc/v$VERSION mv out/doc $TMP_DIR/ether.github.com/doc/v$VERSION
cd $TMP_DIR/ether.github.com/ cd $TMP_DIR/ether.github.com/
sed -i "s/etherpad-lite-win.*\.zip/etherpad-lite-win-$VERSION-$GIT_SHA.zip/" index.html sed -i "s/etherpad-win.*\.zip/etherpad-win-$VERSION-$GIT_SHA.zip/" index.html
sed -i "s/$LATEST_GIT_TAG/$VERSION/g" index.html sed -i "s/$LATEST_GIT_TAG/$VERSION/g" index.html
git checkout -b release_$VERSION git checkout -b release_$VERSION
[[ $? != 0 ]] && echo "Aborting: Error creating new release branch" && exit 1 [[ $? != 0 ]] && echo "Aborting: Error creating new release branch" && exit 1

View file

@ -5,9 +5,9 @@
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"marked": { "marked": {
"version": "2.1.3", "version": "4.2.12",
"resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
"integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==" "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw=="
} }
} }
} }

View file

@ -4,10 +4,10 @@
"description": "Internal tool for generating Node.js API docs", "description": "Internal tool for generating Node.js API docs",
"version": "0.0.0", "version": "0.0.0",
"engines": { "engines": {
"node": ">=12.13.0" "node": ">=12.17.0"
}, },
"dependencies": { "dependencies": {
"marked": "^2.0.0" "marked": "^4.2.12"
}, },
"devDependencies": {}, "devDependencies": {},
"optionalDependencies": {}, "optionalDependencies": {},

26
src/bin/etherpad-healthcheck Executable file
View file

@ -0,0 +1,26 @@
#!/usr/bin/env node
// Checks the health of Etherpad by visiting http://localhost:9001/health. Returns 0 on success, 1
// on error as required by the Dockerfile HEALTHCHECK instruction.
'use strict';
// As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an
// unhandled rejection into an uncaught exception, which does cause Node.js to exit.
process.on('unhandledRejection', (err) => { throw err; });
const assert = require('assert').strict;
const superagent = require('superagent');
(async () => {
const res = await superagent.get('http://localhost:9001/health')
.accept('application/health+json')
.buffer(true)
.parse(superagent.parse['application/json']);
assert(res.ok, `Unexpected HTTP status: ${res.status}`);
assert.equal(res.type, 'application/health+json');
const {body: {status} = {}} = res;
assert(status != null);
assert.equal(typeof status, 'string');
assert(['pass', 'ok', 'up'].includes(status.toLowerCase()), `Unexpected status: ${status}`);
})();

View file

@ -30,9 +30,7 @@ const padId = process.argv[2];
// initialize output database // initialize output database
const dirty = dirtyDB(`${padId}.db`); const dirty = dirtyDB(`${padId}.db`);
// Promise wrapped get and set function // Promise set function
const wrapped = db.db.db.wrappedDB;
const get = util.promisify(wrapped.get.bind(wrapped));
const set = util.promisify(dirty.set.bind(dirty)); const set = util.promisify(dirty.set.bind(dirty));
// array in which required key values will be accumulated // array in which required key values will be accumulated
@ -55,7 +53,7 @@ const padId = process.argv[2];
} }
for (const dbkey of neededDBValues) { for (const dbkey of neededDBValues) {
let dbvalue = await get(dbkey); let dbvalue = await db.get(dbkey);
if (dbvalue && typeof dbvalue !== 'object') { if (dbvalue && typeof dbvalue !== 'object') {
dbvalue = JSON.parse(dbvalue); dbvalue = JSON.parse(dbvalue);
} }

9
src/bin/nsis/README.md Normal file
View file

@ -0,0 +1,9 @@
A simple NSIS script to Install Etherpad (Server) on Windows and start it.
# TODO
1. i18n
1. Run as Service
1. Display messages during install
# License
Apache 2

BIN
src/bin/nsis/brand.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

55
src/bin/nsis/etherpad.nsi Normal file
View file

@ -0,0 +1,55 @@
;Include Modern UI
!include "MUI2.nsh"
!include x64.nsh
;--------------------------------
;Styling
!define MUI_ICON "brand.ico"
Icon "brand.ico"
BrandingText "Etherpad Foundation"
Name "Etherpad Server"
OutFile "..\..\..\etherpad-win.exe"
!insertmacro MUI_LANGUAGE "English"
Page directory
Page instfiles
; The default installation directory
InstallDir "$PROGRAMFILES64\Etherpad Foundation\Etherpad Server"
Section
SectionIn RO
${If} ${RunningX64}
DetailPrint "Installer running on x64 host"
${Else}
Abort "Unsupported CPU architecture (only x64 is supported)"
${Endif}
; Set output path to the installation directory.
SetOutPath $INSTDIR
; Put files there
File /r "..\..\..\..\etherpad-zip\*"
SectionEnd
Section
CreateDirectory "$SMPROGRAMS\Etherpad Foundation"
CreateShortCut "$SMPROGRAMS\Etherpad Foundation\Etherpad Server.lnk" "$INSTDIR\start.bat" "brand.ico" "Etherpad Server"
CreateShortCut "$SMPROGRAMS\Etherpad Foundation\Etherpad.lnk" "http://127.0.0.1:9001" "brand.ico" "Etherpad"
CreateShortCut "$SMPROGRAMS\Etherpad Foundation\Etherpad Admin.lnk" "http://127.0.0.1:9001/admin" "brand.ico" "Etherpad Admin"
CreateShortCut "$SMPROGRAMS\Etherpad Foundation\Uninstall Etherpad Server.lnk" "$INSTDIR\uninstall.exe"
WriteUninstaller "$INSTDIR\uninstall.exe"
Exec '$INSTDIR\start.bat'
SectionEnd
UninstPage instfiles
Section Uninstall
Delete "$INSTDIR\*"
Delete "$INSTDIR\uninstall.exe"
RMDir "$INSTDIR"
SetAutoClose false
SectionEnd

View file

@ -21,12 +21,18 @@ node src/bin/plugins/checkPlugin.js ep_webrtc
node src/bin/plugins/checkPlugin.js ep_whatever autofix node src/bin/plugins/checkPlugin.js ep_whatever autofix
``` ```
## Autocommitting, push, npm minor patch and npm publish (highly dangerous) ## Autocommitting - fix issues and commit
``` ```
node src/bin/plugins/checkPlugin.js ep_whatever autocommit node src/bin/plugins/checkPlugin.js ep_whatever autocommit
``` ```
## Autopush - fix issues, commit, push, and publish (highly dangerous)
```
node src/bin/plugins/checkPlugin.js ep_whatever autopush
```
# All the plugins # All the plugins
Replace johnmclear with your github username Replace johnmclear with your github username

View file

@ -5,423 +5,377 @@
* *
* Normal usage: node src/bin/plugins/checkPlugin.js ep_whatever * Normal usage: node src/bin/plugins/checkPlugin.js ep_whatever
* Auto fix the things it can: node src/bin/plugins/checkPlugin.js ep_whatever autofix * Auto fix the things it can: node src/bin/plugins/checkPlugin.js ep_whatever autofix
* Auto commit, push and publish to npm (highly dangerous): * Auto fix and commit: node src/bin/plugins/checkPlugin.js ep_whatever autocommit
* node src/bin/plugins/checkPlugin.js ep_whatever autocommit * Auto fix, commit, push and publish to npm (highly dangerous):
* node src/bin/plugins/checkPlugin.js ep_whatever autopush
*/ */
const process = require('process');
// As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an // As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an
// unhandled rejection into an uncaught exception, which does cause Node.js to exit. // unhandled rejection into an uncaught exception, which does cause Node.js to exit.
process.on('unhandledRejection', (err) => { throw err; }); process.on('unhandledRejection', (err) => { throw err; });
const assert = require('assert').strict;
const fs = require('fs'); const fs = require('fs');
const fsp = fs.promises;
const childProcess = require('child_process'); const childProcess = require('child_process');
const log4js = require('log4js');
const path = require('path');
// get plugin name & path from user input const logger = log4js.getLogger('checkPlugin');
const pluginName = process.argv[2];
if (!pluginName) throw new Error('no plugin name specified'); (async () => {
// get plugin name & path from user input
const pluginName = process.argv[2];
const pluginPath = `node_modules/${pluginName}`; if (!pluginName) throw new Error('no plugin name specified');
logger.info(`Checking the plugin: ${pluginName}`);
console.log(`Checking the plugin: ${pluginName}`); const epRootDir = await fsp.realpath(path.join(await fsp.realpath(__dirname), '../../..'));
logger.info(`Etherpad root directory: ${epRootDir}`);
process.chdir(epRootDir);
const pluginPath = await fsp.realpath(`node_modules/${pluginName}`);
logger.info(`Plugin directory: ${pluginPath}`);
const epSrcDir = await fsp.realpath(path.join(epRootDir, 'src'));
const optArgs = process.argv.slice(3); const optArgs = process.argv.slice(3);
const autoCommit = optArgs.indexOf('autocommit') !== -1; const autoPush = optArgs.includes('autopush');
const autoFix = autoCommit || optArgs.indexOf('autofix') !== -1; const autoCommit = autoPush || optArgs.includes('autocommit');
const autoFix = autoCommit || optArgs.includes('autofix');
const execSync = (cmd, opts = {}) => (childProcess.execSync(cmd, { const execSync = (cmd, opts = {}) => (childProcess.execSync(cmd, {
cwd: `${pluginPath}/`, cwd: `${pluginPath}/`,
...opts, ...opts,
}) || '').toString().replace(/\n+$/, ''); }) || '').toString().replace(/\n+$/, '');
const writePackageJson = (obj) => { const writePackageJson = async (obj) => {
let s = JSON.stringify(obj, null, 2); let s = JSON.stringify(obj, null, 2);
if (s.length && s.slice(s.length - 1) !== '\n') s += '\n'; if (s.length && s.slice(s.length - 1) !== '\n') s += '\n';
return fs.writeFileSync(`${pluginPath}/package.json`, s); return await fsp.writeFile(`${pluginPath}/package.json`, s);
}; };
const updateDeps = (parsedPackageJson, key, wantDeps) => { const checkEntries = (got, want) => {
let changed = false;
for (const [key, val] of Object.entries(want)) {
try {
assert.deepEqual(got[key], val);
} catch (err) {
logger.warn(`${key} possibly outdated.`);
logger.warn(err.message);
if (autoFix) {
got[key] = val;
changed = true;
}
}
}
return changed;
};
const updateDeps = async (parsedPackageJson, key, wantDeps) => {
const {[key]: deps = {}} = parsedPackageJson; const {[key]: deps = {}} = parsedPackageJson;
let changed = false; let changed = false;
for (const [pkg, verInfo] of Object.entries(wantDeps)) { for (const [pkg, verInfo] of Object.entries(wantDeps)) {
const {ver, overwrite = true} = typeof verInfo === 'string' ? {ver: verInfo} : verInfo; const {ver, overwrite = true} =
if (deps[pkg] === ver) continue; typeof verInfo === 'string' || verInfo == null ? {ver: verInfo} : verInfo;
if (deps[pkg] === ver || (deps[pkg] == null && ver == null)) continue;
if (deps[pkg] == null) { if (deps[pkg] == null) {
console.warn(`Missing dependency in ${key}: '${pkg}': '${ver}'`); logger.warn(`Missing dependency in ${key}: '${pkg}': '${ver}'`);
} else { } else {
if (!overwrite) continue; if (!overwrite) continue;
console.warn(`Dependency mismatch in ${key}: '${pkg}': '${ver}' (current: ${deps[pkg]})`); logger.warn(`Dependency mismatch in ${key}: '${pkg}': '${ver}' (current: ${deps[pkg]})`);
} }
if (autoFix) { if (autoFix) {
deps[pkg] = ver; if (ver == null) delete deps[pkg];
else deps[pkg] = ver;
changed = true; changed = true;
} }
} }
if (changed) { if (changed) {
parsedPackageJson[key] = deps; parsedPackageJson[key] = deps;
writePackageJson(parsedPackageJson); await writePackageJson(parsedPackageJson);
} }
}; };
const prepareRepo = () => { const prepareRepo = () => {
let branch = execSync('git symbolic-ref HEAD');
if (branch !== 'refs/heads/master' && branch !== 'refs/heads/main') {
throw new Error('master/main must be checked out');
}
branch = branch.replace(/^refs\/heads\//, '');
execSync('git rev-parse --verify -q HEAD^0 || ' +
`{ echo "Error: no commits on ${branch}" >&2; exit 1; }`);
execSync('git rev-parse --verify @{u}'); // Make sure there's a remote tracking branch.
const modified = execSync('git diff-files --name-status'); const modified = execSync('git diff-files --name-status');
if (modified !== '') throw new Error(`working directory has modifications:\n${modified}`); if (modified !== '') throw new Error(`working directory has modifications:\n${modified}`);
const untracked = execSync('git ls-files -o --exclude-standard'); const untracked = execSync('git ls-files -o --exclude-standard');
if (untracked !== '') throw new Error(`working directory has untracked files:\n${untracked}`); if (untracked !== '') throw new Error(`working directory has untracked files:\n${untracked}`);
const indexStatus = execSync('git diff-index --cached --name-status HEAD'); const indexStatus = execSync('git diff-index --cached --name-status HEAD');
if (indexStatus !== '') throw new Error(`uncommitted staged changes to files:\n${indexStatus}`); if (indexStatus !== '') throw new Error(`uncommitted staged changes to files:\n${indexStatus}`);
execSync('git pull --ff-only', {stdio: 'inherit'}); let br;
if (execSync('git rev-list @{u}...') !== '') throw new Error('repo contains unpushed commits');
if (autoCommit) { if (autoCommit) {
br = execSync('git symbolic-ref HEAD');
if (!br.startsWith('refs/heads/')) throw new Error('detached HEAD');
br = br.replace(/^refs\/heads\//, '');
execSync('git rev-parse --verify -q HEAD^0 || ' +
`{ echo "Error: no commits on ${br}" >&2; exit 1; }`);
execSync('git config --get user.name'); execSync('git config --get user.name');
execSync('git config --get user.email'); execSync('git config --get user.email');
} }
}; if (autoPush) {
if (!['master', 'main'].includes(br)) throw new Error('master/main not checked out');
execSync('git rev-parse --verify @{u}');
execSync('git pull --ff-only', {stdio: 'inherit'});
if (execSync('git rev-list @{u}...') !== '') throw new Error('repo contains unpushed commits');
}
};
if (autoCommit) { const checkFile = async (srcFn, dstFn, overwrite = true) => {
console.warn('Auto commit is enabled, I hope you know what you are doing...'); const outFn = path.join(pluginPath, dstFn);
} const wantContents = await fsp.readFile(srcFn, {encoding: 'utf8'});
let gotContents = null;
try {
gotContents = await fsp.readFile(outFn, {encoding: 'utf8'});
} catch (err) { /* treat as if the file doesn't exist */ }
try {
assert.equal(gotContents, wantContents);
} catch (err) {
logger.warn(`File ${dstFn} does not match the default`);
logger.warn(err.message);
if (!overwrite && gotContents != null) {
logger.warn('Leaving existing contents alone.');
return;
}
if (autoFix) {
await fsp.mkdir(path.dirname(outFn), {recursive: true});
await fsp.writeFile(outFn, wantContents);
}
}
};
fs.readdir(pluginPath, (err, rootFiles) => { if (autoPush) {
// handling error logger.warn('Auto push is enabled, I hope you know what you are doing...');
if (err) {
return console.log(`Unable to scan directory: ${err}`);
} }
// rewriting files to lower case const files = await fsp.readdir(pluginPath);
const files = [];
// some files we need to know the actual file name. Not compulsory but might help in the future. // some files we need to know the actual file name. Not compulsory but might help in the future.
let readMeFileName; const readMeFileName = files.filter((f) => f === 'README' || f === 'README.md')[0];
let repository;
for (let i = 0; i < rootFiles.length; i++) { if (!files.includes('.git')) throw new Error('No .git folder, aborting');
if (rootFiles[i].toLowerCase().indexOf('readme') !== -1) readMeFileName = rootFiles[i];
files.push(rootFiles[i].toLowerCase());
}
if (files.indexOf('.git') === -1) throw new Error('No .git folder, aborting');
prepareRepo(); prepareRepo();
try { const workflows = ['backend-tests.yml', 'frontend-tests.yml', 'npmpublish.yml'];
const path = `${pluginPath}/.github/workflows/npmpublish.yml`; await Promise.all(workflows.map(async (fn) => {
if (!fs.existsSync(path)) { await checkFile(`src/bin/plugins/lib/${fn}`, `.github/workflows/${fn}`);
console.log('no .github/workflows/npmpublish.yml'); }));
console.log('create one and set npm secret to auto publish to npm on commit'); await checkFile('src/bin/plugins/lib/dependabot.yml', '.github/dependabot.yml');
if (autoFix) {
const npmpublish = if (!files.includes('package.json')) {
fs.readFileSync('src/bin/plugins/lib/npmpublish.yml', {encoding: 'utf8', flag: 'r'}); logger.warn('no package.json, please create');
fs.mkdirSync(`${pluginPath}/.github/workflows`, {recursive: true});
fs.writeFileSync(path, npmpublish);
console.log("If you haven't already, setup autopublish for this plugin https://github.com/ether/etherpad-lite/wiki/Plugins:-Automatically-publishing-to-npm-on-commit-to-Github-Repo");
} else { } else {
console.log('Setup autopublish for this plugin https://github.com/ether/etherpad-lite/wiki/Plugins:-Automatically-publishing-to-npm-on-commit-to-Github-Repo');
}
} else {
// autopublish exists, we should check the version..
// checkVersion takes two file paths and checks for a version string in them.
const currVersionFile = fs.readFileSync(path, {encoding: 'utf8', flag: 'r'});
const existingConfigLocation = currVersionFile.indexOf('##ETHERPAD_NPM_V=');
const existingValue = parseInt(
currVersionFile.substr(existingConfigLocation + 17, existingConfigLocation.length));
const reqVersionFile =
fs.readFileSync('src/bin/plugins/lib/npmpublish.yml', {encoding: 'utf8', flag: 'r'});
const reqConfigLocation = reqVersionFile.indexOf('##ETHERPAD_NPM_V=');
const reqValue =
parseInt(reqVersionFile.substr(reqConfigLocation + 17, reqConfigLocation.length));
if (!existingValue || (reqValue > existingValue)) {
const npmpublish =
fs.readFileSync('src/bin/plugins/lib/npmpublish.yml', {encoding: 'utf8', flag: 'r'});
fs.mkdirSync(`${pluginPath}/.github/workflows`, {recursive: true});
fs.writeFileSync(path, npmpublish);
}
}
} catch (err) {
console.error(err);
}
try {
const path = `${pluginPath}/.github/workflows/backend-tests.yml`;
if (!fs.existsSync(path)) {
console.log('no .github/workflows/backend-tests.yml');
console.log('create one and set npm secret to auto publish to npm on commit');
if (autoFix) {
const backendTests =
fs.readFileSync('src/bin/plugins/lib/backend-tests.yml', {encoding: 'utf8', flag: 'r'});
fs.mkdirSync(`${pluginPath}/.github/workflows`, {recursive: true});
fs.writeFileSync(path, backendTests);
}
} else {
// autopublish exists, we should check the version..
// checkVersion takes two file paths and checks for a version string in them.
const currVersionFile = fs.readFileSync(path, {encoding: 'utf8', flag: 'r'});
const existingConfigLocation = currVersionFile.indexOf('##ETHERPAD_NPM_V=');
const existingValue = parseInt(
currVersionFile.substr(existingConfigLocation + 17, existingConfigLocation.length));
const reqVersionFile =
fs.readFileSync('src/bin/plugins/lib/backend-tests.yml', {encoding: 'utf8', flag: 'r'});
const reqConfigLocation = reqVersionFile.indexOf('##ETHERPAD_NPM_V=');
const reqValue =
parseInt(reqVersionFile.substr(reqConfigLocation + 17, reqConfigLocation.length));
if (!existingValue || (reqValue > existingValue)) {
const backendTests =
fs.readFileSync('src/bin/plugins/lib/backend-tests.yml', {encoding: 'utf8', flag: 'r'});
fs.mkdirSync(`${pluginPath}/.github/workflows`, {recursive: true});
fs.writeFileSync(path, backendTests);
}
}
} catch (err) {
console.error(err);
}
if (files.indexOf('package.json') === -1) {
console.warn('no package.json, please create');
}
if (files.indexOf('package.json') !== -1) {
const packageJSON = const packageJSON =
fs.readFileSync(`${pluginPath}/package.json`, {encoding: 'utf8', flag: 'r'}); await fsp.readFile(`${pluginPath}/package.json`, {encoding: 'utf8', flag: 'r'});
const parsedPackageJSON = JSON.parse(packageJSON); const parsedPackageJSON = JSON.parse(packageJSON);
if (autoFix) {
let updatedPackageJSON = false;
if (!parsedPackageJSON.funding) {
updatedPackageJSON = true;
parsedPackageJSON.funding = {
type: 'individual',
url: 'https://etherpad.org/',
};
}
if (updatedPackageJSON) {
writePackageJson(parsedPackageJSON);
}
}
if (packageJSON.toLowerCase().indexOf('repository') === -1) { await updateDeps(parsedPackageJSON, 'devDependencies', {
console.warn('No repository in package.json'); 'eslint': '^8.14.0',
if (autoFix) { 'eslint-config-etherpad': '^3.0.13',
console.warn('Repository not detected in package.json. Add repository section.'); // Changing the TypeScript version can break plugin code, so leave it alone if present.
} 'typescript': {ver: '^4.6.4', overwrite: false},
} else { // These were moved to eslint-config-etherpad's dependencies so they can be removed:
// useful for creating README later. '@typescript-eslint/eslint-plugin': null,
repository = parsedPackageJSON.repository.url; '@typescript-eslint/parser': null,
} 'eslint-import-resolver-typescript': null,
'eslint-plugin-cypress': null,
updateDeps(parsedPackageJSON, 'devDependencies', { 'eslint-plugin-eslint-comments': null,
'eslint': '^7.28.0', 'eslint-plugin-import': null,
'eslint-config-etherpad': '^2.0.0', 'eslint-plugin-mocha': null,
'eslint-plugin-cypress': '^2.11.3', 'eslint-plugin-node': null,
'eslint-plugin-eslint-comments': '^3.2.0', 'eslint-plugin-prefer-arrow': null,
'eslint-plugin-mocha': '^9.0.0', 'eslint-plugin-promise': null,
'eslint-plugin-node': '^11.1.0', 'eslint-plugin-you-dont-need-lodash-underscore': null,
'eslint-plugin-prefer-arrow': '^1.2.3',
'eslint-plugin-promise': '^5.1.0',
'eslint-plugin-you-dont-need-lodash-underscore': '^6.12.0',
}); });
updateDeps(parsedPackageJSON, 'peerDependencies', { await updateDeps(parsedPackageJSON, 'peerDependencies', {
// Some plugins require a newer version of Etherpad so don't overwrite if already set. // Some plugins require a newer version of Etherpad so don't overwrite if already set.
'ep_etherpad-lite': {ver: '>=1.8.6', overwrite: false}, 'ep_etherpad-lite': {ver: '>=1.8.6', overwrite: false},
}); });
if (packageJSON.toLowerCase().indexOf('eslintconfig') === -1) { await updateDeps(parsedPackageJSON, 'engines', {
console.warn('No esLintConfig in package.json'); node: '>=12.17.0',
if (autoFix) { });
const eslintConfig = {
root: true, if (parsedPackageJSON.eslintConfig != null && autoFix) {
extends: 'etherpad/plugin', delete parsedPackageJSON.eslintConfig;
}; await writePackageJson(parsedPackageJSON);
parsedPackageJSON.eslintConfig = eslintConfig;
writePackageJson(parsedPackageJSON);
} }
if (files.includes('.eslintrc.js')) {
const [from, to] = [`${pluginPath}/.eslintrc.js`, `${pluginPath}/.eslintrc.cjs`];
if (!files.includes('.eslintrc.cjs')) {
if (autoFix) {
await fsp.rename(from, to);
} else {
logger.warn(`please rename ${from} to ${to}`);
}
} else {
logger.error(`both ${from} and ${to} exist; delete ${from}`);
}
} else {
checkFile('src/bin/plugins/lib/eslintrc.cjs', '.eslintrc.cjs', false);
} }
if (packageJSON.toLowerCase().indexOf('scripts') === -1) { if (checkEntries(parsedPackageJSON, {
console.warn('No scripts in package.json'); funding: {
if (autoFix) { type: 'individual',
const scripts = { url: 'https://etherpad.org/',
},
})) await writePackageJson(parsedPackageJSON);
if (parsedPackageJSON.scripts == null) parsedPackageJSON.scripts = {};
if (checkEntries(parsedPackageJSON.scripts, {
'lint': 'eslint .', 'lint': 'eslint .',
'lint:fix': 'eslint --fix .', 'lint:fix': 'eslint --fix .',
}; })) await writePackageJson(parsedPackageJSON);
parsedPackageJSON.scripts = scripts;
writePackageJson(parsedPackageJSON);
}
} }
if ((packageJSON.toLowerCase().indexOf('engines') === -1) || !parsedPackageJSON.engines.node) { if (!files.includes('package-lock.json')) {
console.warn('No engines or node engine in package.json'); logger.warn('package-lock.json not found');
if (autoFix) {
const engines = {
node: '>=12.13.0',
};
parsedPackageJSON.engines = engines;
writePackageJson(parsedPackageJSON);
}
}
}
if (files.indexOf('package-lock.json') === -1) {
console.warn('package-lock.json not found');
if (!autoFix) { if (!autoFix) {
console.warn('Run npm install in the plugin folder and commit the package-lock.json file.'); logger.warn('Run npm install in the plugin folder and commit the package-lock.json file.');
}
}
if (files.indexOf('readme') === -1 && files.indexOf('readme.md') === -1) {
console.warn('README.md file not found, please create');
if (autoFix) {
console.log('Autofixing missing README.md file');
console.log('please edit the README.md file further to include plugin specific details.');
let readme = fs.readFileSync('src/bin/plugins/lib/README.md', {encoding: 'utf8', flag: 'r'});
readme = readme.replace(/\[plugin_name\]/g, pluginName);
if (repository) {
const org = repository.split('/')[3];
const name = repository.split('/')[4];
readme = readme.replace(/\[org_name\]/g, org);
readme = readme.replace(/\[repo_url\]/g, name);
fs.writeFileSync(`${pluginPath}/README.md`, readme);
} else {
console.warn('Unable to find repository in package.json, aborting.');
}
} }
} }
if (files.indexOf('contributing') === -1 && files.indexOf('contributing.md') === -1) { const fillTemplate = async (templateFilename, outputFilename) => {
console.warn('CONTRIBUTING.md file not found, please create'); const contents = (await fsp.readFile(templateFilename, 'utf8'))
.replace(/\[name of copyright owner\]/g, execSync('git config user.name'))
.replace(/\[plugin_name\]/g, pluginName)
.replace(/\[yyyy\]/g, new Date().getFullYear());
await fsp.writeFile(outputFilename, contents);
};
if (!readMeFileName) {
logger.warn('README.md file not found, please create');
if (autoFix) { if (autoFix) {
console.log('Autofixing missing CONTRIBUTING.md file, please edit the CONTRIBUTING.md ' + logger.info('Autofixing missing README.md file');
logger.info('please edit the README.md file further to include plugin specific details.');
await fillTemplate('src/bin/plugins/lib/README.md', `${pluginPath}/README.md`);
}
}
if (!files.includes('CONTRIBUTING') && !files.includes('CONTRIBUTING.md')) {
logger.warn('CONTRIBUTING.md file not found, please create');
if (autoFix) {
logger.info('Autofixing missing CONTRIBUTING.md file, please edit the CONTRIBUTING.md ' +
'file further to include plugin specific details.'); 'file further to include plugin specific details.');
let contributing = await fillTemplate('src/bin/plugins/lib/CONTRIBUTING.md', `${pluginPath}/CONTRIBUTING.md`);
fs.readFileSync('src/bin/plugins/lib/CONTRIBUTING.md', {encoding: 'utf8', flag: 'r'});
contributing = contributing.replace(/\[plugin_name\]/g, pluginName);
fs.writeFileSync(`${pluginPath}/CONTRIBUTING.md`, contributing);
} }
} }
if (readMeFileName) { if (readMeFileName) {
let readme = let readme =
fs.readFileSync(`${pluginPath}/${readMeFileName}`, {encoding: 'utf8', flag: 'r'}); await fsp.readFile(`${pluginPath}/${readMeFileName}`, {encoding: 'utf8', flag: 'r'});
if (readme.toLowerCase().indexOf('license') === -1) { if (!readme.toLowerCase().includes('license')) {
console.warn('No license section in README'); logger.warn('No license section in README');
if (autoFix) { if (autoFix) {
console.warn('Please add License section to README manually.'); logger.warn('Please add License section to README manually.');
} }
} }
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
const publishBadge = `![Publish Status](https://github.com/ether/${pluginName}/workflows/Node.js%20Package/badge.svg)`; const publishBadge = `![Publish Status](https://github.com/ether/${pluginName}/workflows/Node.js%20Package/badge.svg)`;
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
const testBadge = `![Backend Tests Status](https://github.com/ether/${pluginName}/workflows/Backend%20tests/badge.svg)`; const testBadge = `![Backend Tests Status](https://github.com/ether/${pluginName}/workflows/Backend%20tests/badge.svg)`;
if (readme.toLowerCase().indexOf('travis') !== -1) { if (readme.toLowerCase().includes('travis')) {
console.warn('Remove Travis badges'); logger.warn('Remove Travis badges');
} }
if (readme.indexOf('workflows/Node.js%20Package/badge.svg') === -1) { if (!readme.includes('workflows/Node.js%20Package/badge.svg')) {
console.warn('No Github workflow badge detected'); logger.warn('No Github workflow badge detected');
if (autoFix) { if (autoFix) {
readme = `${publishBadge} ${testBadge}\n\n${readme}`; readme = `${publishBadge} ${testBadge}\n\n${readme}`;
// write readme to file system // write readme to file system
fs.writeFileSync(`${pluginPath}/${readMeFileName}`, readme); await fsp.writeFile(`${pluginPath}/${readMeFileName}`, readme);
console.log('Wrote Github workflow badges to README'); logger.info('Wrote Github workflow badges to README');
} }
} }
} }
if (files.indexOf('license') === -1 && files.indexOf('license.md') === -1) { if (!files.includes('LICENSE') && !files.includes('LICENSE.md')) {
console.warn('LICENSE.md file not found, please create'); logger.warn('LICENSE file not found, please create');
if (autoFix) { if (autoFix) {
console.log('Autofixing missing LICENSE.md file, including Apache 2 license.'); logger.info('Autofixing missing LICENSE file (Apache 2.0).');
let license = await fsp.copyFile('src/bin/plugins/lib/LICENSE', `${pluginPath}/LICENSE`);
fs.readFileSync('src/bin/plugins/lib/LICENSE.md', {encoding: 'utf8', flag: 'r'});
license = license.replace('[yyyy]', new Date().getFullYear());
license = license.replace('[name of copyright owner]', execSync('git config user.name'));
fs.writeFileSync(`${pluginPath}/LICENSE.md`, license);
} }
} }
if (files.indexOf('.gitignore') === -1) { if (!files.includes('.gitignore')) {
console.warn('.gitignore file not found, please create. .gitignore files are useful to ' + logger.warn('.gitignore file not found, please create. .gitignore files are useful to ' +
"ensure files aren't incorrectly commited to a repository."); "ensure files aren't incorrectly commited to a repository.");
if (autoFix) { if (autoFix) {
console.log('Autofixing missing .gitignore file'); logger.info('Autofixing missing .gitignore file');
const gitignore = const gitignore =
fs.readFileSync('src/bin/plugins/lib/gitignore', {encoding: 'utf8', flag: 'r'}); await fsp.readFile('src/bin/plugins/lib/gitignore', {encoding: 'utf8', flag: 'r'});
fs.writeFileSync(`${pluginPath}/.gitignore`, gitignore); await fsp.writeFile(`${pluginPath}/.gitignore`, gitignore);
} }
} else { } else {
let gitignore = let gitignore =
fs.readFileSync(`${pluginPath}/.gitignore`, {encoding: 'utf8', flag: 'r'}); await fsp.readFile(`${pluginPath}/.gitignore`, {encoding: 'utf8', flag: 'r'});
if (gitignore.indexOf('node_modules/') === -1) { if (!gitignore.includes('node_modules/')) {
console.warn('node_modules/ missing from .gitignore'); logger.warn('node_modules/ missing from .gitignore');
if (autoFix) { if (autoFix) {
gitignore += 'node_modules/'; gitignore += 'node_modules/';
fs.writeFileSync(`${pluginPath}/.gitignore`, gitignore); await fsp.writeFile(`${pluginPath}/.gitignore`, gitignore);
} }
} }
} }
// if we include templates but don't have translations... // if we include templates but don't have translations...
if (files.indexOf('templates') !== -1 && files.indexOf('locales') === -1) { if (files.includes('templates') && !files.includes('locales')) {
console.warn('Translations not found, please create. ' + logger.warn('Translations not found, please create. ' +
'Translation files help with Etherpad accessibility.'); 'Translation files help with Etherpad accessibility.');
} }
if (files.indexOf('.ep_initialized') !== -1) { if (files.includes('.ep_initialized')) {
console.warn( logger.warn(
'.ep_initialized found, please remove. .ep_initialized should never be commited to git ' + '.ep_initialized found, please remove. .ep_initialized should never be commited to git ' +
'and should only exist once the plugin has been executed one time.'); 'and should only exist once the plugin has been executed one time.');
if (autoFix) { if (autoFix) {
console.log('Autofixing incorrectly existing .ep_initialized file'); logger.info('Autofixing incorrectly existing .ep_initialized file');
fs.unlinkSync(`${pluginPath}/.ep_initialized`); await fsp.unlink(`${pluginPath}/.ep_initialized`);
} }
} }
if (files.indexOf('npm-debug.log') !== -1) { if (files.includes('npm-debug.log')) {
console.warn('npm-debug.log found, please remove. npm-debug.log should never be commited to ' + logger.warn('npm-debug.log found, please remove. npm-debug.log should never be commited to ' +
'your repository.'); 'your repository.');
if (autoFix) { if (autoFix) {
console.log('Autofixing incorrectly existing npm-debug.log file'); logger.info('Autofixing incorrectly existing npm-debug.log file');
fs.unlinkSync(`${pluginPath}/npm-debug.log`); await fsp.unlink(`${pluginPath}/npm-debug.log`);
} }
} }
if (files.indexOf('static') !== -1) { if (files.includes('static')) {
fs.readdir(`${pluginPath}/static`, (errRead, staticFiles) => { const staticFiles = await fsp.readdir(`${pluginPath}/static`);
if (staticFiles.indexOf('tests') === -1) { if (!staticFiles.includes('tests')) {
console.warn('Test files not found, please create tests. https://github.com/ether/etherpad-lite/wiki/Creating-a-plugin#writing-and-running-front-end-tests-for-your-plugin'); logger.warn('Test files not found, please create tests. https://github.com/ether/etherpad-lite/wiki/Creating-a-plugin#writing-and-running-front-end-tests-for-your-plugin');
} }
});
} else { } else {
console.warn('Test files not found, please create tests. https://github.com/ether/etherpad-lite/wiki/Creating-a-plugin#writing-and-running-front-end-tests-for-your-plugin'); logger.warn('Test files not found, please create tests. https://github.com/ether/etherpad-lite/wiki/Creating-a-plugin#writing-and-running-front-end-tests-for-your-plugin');
} }
// Install dependencies so we can run ESLint. This should also create or update package-lock.json // Install dependencies so we can run ESLint. This should also create or update package-lock.json
// if autoFix is enabled. // if autoFix is enabled.
const npmInstall = `npm install${autoFix ? '' : ' --no-package-lock'}`; const npmInstall = `npm install${autoFix ? '' : ' --no-package-lock'}`;
execSync(npmInstall, {stdio: 'inherit'}); execSync(npmInstall, {stdio: 'inherit'});
// The ep_etherpad-lite peer dep must be installed last otherwise `npm install` will nuke it. An // Create the ep_etherpad-lite symlink if necessary. This must be done after running `npm install`
// absolute path to etherpad-lite/src is used here so that pluginPath can be a symlink. // because that command nukes the symlink.
execSync( try {
`${npmInstall} --no-save ep_etherpad-lite@file:${__dirname}/../../`, {stdio: 'inherit'}); const d = await fsp.realpath(path.join(pluginPath, 'node_modules/ep_etherpad-lite'));
assert.equal(d, epSrcDir);
} catch (err) {
execSync(`${npmInstall} --no-save ep_etherpad-lite@file:${epSrcDir}`, {stdio: 'inherit'});
}
// linting begins // linting begins
try { try {
console.log('Linting...'); logger.info('Linting...');
const lintCmd = autoFix ? 'npx eslint --fix .' : 'npx eslint'; const lintCmd = autoFix ? 'npx eslint --fix .' : 'npx eslint';
execSync(lintCmd, {stdio: 'inherit'}); execSync(lintCmd, {stdio: 'inherit'});
} catch (e) { } catch (e) {
// it is gonna throw an error anyway // it is gonna throw an error anyway
console.log('Manual linting probably required, check with: npm run lint'); logger.info('Manual linting probably required, check with: npm run lint');
} }
// linting ends. // linting ends.
@ -436,24 +390,31 @@ fs.readdir(pluginPath, (err, rootFiles) => {
env: {...process.env, GIT_INDEX_FILE: '.git/checkPlugin.index'}, env: {...process.env, GIT_INDEX_FILE: '.git/checkPlugin.index'},
stdio: 'inherit', stdio: 'inherit',
}); });
fs.unlinkSync(`${pluginPath}/.git/checkPlugin.index`); await fsp.unlink(`${pluginPath}/.git/checkPlugin.index`);
const cmd = [ const commitCmd = [
'git add -A', 'git add -A',
'git commit -m "autofixes from Etherpad checkPlugin.js"', 'git commit -m "autofixes from Etherpad checkPlugin.js"',
'git push',
].join(' && '); ].join(' && ');
if (autoCommit) { if (autoCommit) {
console.log('Attempting autocommit and auto publish to npm'); logger.info('Committing changes...');
execSync(cmd, {stdio: 'inherit'}); execSync(commitCmd, {stdio: 'inherit'});
} else { } else {
console.log('Fixes applied. Check the above git diff then run the following command:'); logger.info('Fixes applied. Check the above git diff then run the following command:');
console.log(`(cd node_modules/${pluginName} && ${cmd})`); logger.info(`(cd node_modules/${pluginName} && ${commitCmd})`);
}
const pushCmd = 'git push';
if (autoPush) {
logger.info('Pushing new commit...');
execSync(pushCmd, {stdio: 'inherit'});
} else {
logger.info('Changes committed. To push, run the following command:');
logger.info(`(cd node_modules/${pluginName} && ${pushCmd})`);
} }
} else { } else {
console.log('No changes.'); logger.info('No changes.');
} }
} }
console.log('Finished'); logger.info('Finished');
}); })();

View file

@ -1,4 +1,39 @@
cd node_modules/ #!/bin/sh
GHUSER=ether; curl "https://api.github.com/users/$GHUSER/repos?per_page=100" | grep -o 'git@[^"]*' | grep /ep_ | xargs -L1 git clone
GHUSER=ether; curl "https://api.github.com/users/$GHUSER/repos?per_page=100&page=2&" | grep -o 'git@[^"]*' | grep /ep_ | xargs -L1 git clone set -e
GHUSER=ether; curl "https://api.github.com/users/$GHUSER/repos?per_page=100&page=3&" | grep -o 'git@[^"]*' | grep /ep_ | xargs -L1 git clone
newline='
'
pecho () { printf %s\\n "$*"; }
log () { pecho "$@"; }
error () { log "ERROR: $@" >&2; }
fatal () { error "$@"; exit 1; }
mydir=$(cd "${0%/*}" && pwd -P) || exit 1
cd "${mydir}/../../.."
pdir=$(cd .. && pwd -P) || exit 1
plugins=$("${mydir}/listOfficialPlugins") || exit 1
for d in ${plugins}; do
log "============================================================"
log "${d}"
log "============================================================"
fd=${pdir}/${d}
repo=git@github.com:ether/${plugin}.git
[ -d "${fd}" ] || {
log "Cloning ${repo} to ${fd}..."
(cd "${pdir}" && git clone "${repo}" "${d}") || exit 1
} || exit 1
log "Fetching latest commits..."
(cd "${fd}" && git pull --ff-only) || exit 1
log "Getting plugin name..."
pn=$(cd "${fd}" && npx -c 'printf %s\\n "${npm_package_name}"') || exit 1
[ -n "${pn}" ] || fatal "Unable to determine plugin name for ${d}"
md=node_modules/${pn}
[ -d "${md}" ] || {
log "Installing plugin to ${md}..."
ln -s ../../"${d}" "${md}"
} || exit 1
[ "${md}" -ef "${fd}" ] || fatal "${md} is not a symlink to ${fd}"
done

201
src/bin/plugins/lib/LICENSE Normal file
View file

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.

View file

@ -1,13 +0,0 @@
Copyright [yyyy] [name of copyright owner]
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.

View file

@ -1,32 +1,47 @@
[![Travis (.com)](https://api.travis-ci.com/[org_name]/[repo_url].svg?branch=develop)](https://travis-ci.com/github/[org_name]/[repo_url]) # [plugin_name]
# My awesome plugin README example TODO: Describe the plugin.
Explain what your plugin does and who it's useful for.
## Example animated gif of usage if appropriate ## Example animated gif of usage if appropriate
![screenshot](https://user-images.githubusercontent.com/220864/99979953-97841d80-2d9f-11eb-9782-5f65817c58f4.PNG) ![screenshot](https://user-images.githubusercontent.com/220864/99979953-97841d80-2d9f-11eb-9782-5f65817c58f4.PNG)
## Installing ## Installation
``` From the Etherpad working directory, run:
```shell
npm install --no-save --legacy-peer-deps [plugin_name] npm install --no-save --legacy-peer-deps [plugin_name]
``` ```
or Use the Etherpad ``/admin`` interface. Or, install from Etherpad's `/admin/plugins` page.
## Settings ## Configuration
Document settings if any
TODO
## Testing ## Testing
Document how to run backend / frontend tests.
### Frontend To run the backend tests, run the following from the Etherpad working directory:
Visit http://whatever/tests/frontend/ to run the frontend tests. ```shell
(cd src && npm test)
```
### backend To run the frontend tests, visit: http://localhost:9001/tests/frontend/
Type ``cd src && npm run test`` to run the backend tests. ## Copyright and License
## LICENSE Copyright © [yyyy] [name of copyright owner]
Apache 2.0 and the [plugin_name] authors and contributors
Licensed under the [Apache License, Version 2.0](LICENSE) (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.

View file

@ -1,6 +1,3 @@
# You need to change lines 38 and 46 in case the plugin's name on npmjs.com is different
# from the repository name
name: "Backend tests" name: "Backend tests"
# any branch is useful for testing before a PR is submitted # any branch is useful for testing before a PR is submitted
@ -17,34 +14,62 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Install libreoffice -
name: Install libreoffice
run: | run: |
sudo add-apt-repository -y ppa:libreoffice/ppa sudo add-apt-repository -y ppa:libreoffice/ppa
sudo apt update sudo apt update
sudo apt install -y --no-install-recommends libreoffice libreoffice-pdfimport sudo apt install -y --no-install-recommends libreoffice libreoffice-pdfimport
-
# clone etherpad-lite name: Install etherpad core
- name: Install etherpad core uses: actions/checkout@v3
uses: actions/checkout@v2
with: with:
repository: ether/etherpad-lite repository: ether/etherpad-lite
-
- name: Install all dependencies and symlink for ep_etherpad-lite name: Checkout plugin repository
run: src/bin/installDeps.sh uses: actions/checkout@v3
# clone this repository into node_modules/ep_plugin-name
- name: Checkout plugin repository
uses: actions/checkout@v2
with: with:
path: ./node_modules/${{github.event.repository.name}} path: ./node_modules/__tmp
-
- name: Install plugin dependencies name: Determine plugin name
id: plugin_name
run: | run: |
cd node_modules/${{github.event.repository.name}} cd ./node_modules/__tmp
npx -c 'printf %s\\n "::set-output name=plugin_name::${npm_package_name}"'
-
name: Rename plugin directory
run: |
mv ./node_modules/__tmp ./node_modules/"${PLUGIN_NAME}"
env:
PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }}
-
uses: actions/setup-node@v3
with:
node-version: 12
cache: 'npm'
cache-dependency-path: |
src/package-lock.json
src/bin/doc/package-lock.json
node_modules/${{ steps.plugin_name.outputs.plugin_name }}/package-lock.json
-
name: Install plugin dependencies
run: |
cd ./node_modules/"${PLUGIN_NAME}"
npm ci npm ci
env:
- name: Run the backend tests PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }}
# Etherpad core dependencies must be installed after installing the
# plugin's dependencies, otherwise npm will try to hoist common
# dependencies by removing them from src/node_modules and installing them
# in the top-level node_modules. As of v6.14.10, npm's hoist logic appears
# to be buggy, because it sometimes removes dependencies from
# src/node_modules but fails to add them to the top-level node_modules.
# Even if npm correctly hoists the dependencies, the hoisting seems to
# confuse tools such as `npm outdated`, `npm update`, and some ESLint
# rules.
-
name: Install Etherpad core dependencies
run: src/bin/installDeps.sh
-
name: Run the backend tests
run: cd src && npm test run: cd src && npm test
##ETHERPAD_NPM_V=2
## NPM configuration automatically created using src/bin/plugins/updateAllPluginsScript.sh

View file

@ -0,0 +1,11 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
versioning-strategy: "increase"

View file

@ -0,0 +1,9 @@
'use strict';
// This is a workaround for https://github.com/eslint/eslint/issues/3458
require('eslint-config-etherpad/patch/modern-module-resolution');
module.exports = {
root: true,
extends: 'etherpad/plugin',
};

View file

@ -0,0 +1,110 @@
# Publicly credit Sauce Labs because they generously support open source
# projects.
name: "frontend tests powered by Sauce Labs"
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
-
name: Fail if Dependabot
if: github.actor == 'dependabot[bot]'
run: |
cat <<EOF >&2
Frontend tests skipped because Dependabot can't access secrets.
Manually re-run the jobs to run the frontend tests.
For more information, see:
https://github.blog/changelog/2021-02-19-github-actions-workflows-triggered-by-dependabot-prs-will-run-with-read-only-permissions/
EOF
exit 1
-
name: Generate Sauce Labs strings
id: sauce_strings
run: |
printf %s\\n '::set-output name=name::${{github.event.repository.name}} ${{ github.workflow }} - ${{ github.job }}'
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}'
-
name: Check out Etherpad core
uses: actions/checkout@v3
with:
repository: ether/etherpad-lite
-
uses: actions/setup-node@v3
with:
node-version: 12
cache: 'npm'
cache-dependency-path: |
src/package-lock.json
src/bin/doc/package-lock.json
-
name: Check out the plugin
uses: actions/checkout@v3
with:
path: ./node_modules/__tmp
-
name: export GIT_HASH to env
id: environment
run: |
cd ./node_modules/__tmp
echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})"
-
name: Determine plugin name
id: plugin_name
run: |
cd ./node_modules/__tmp
npx -c 'printf %s\\n "::set-output name=plugin_name::${npm_package_name}"'
-
name: Rename plugin directory
env:
PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }}
run: |
mv ./node_modules/__tmp ./node_modules/"${PLUGIN_NAME}"
-
name: Install plugin dependencies
env:
PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }}
run: |
cd ./node_modules/"${PLUGIN_NAME}"
npm ci
# Etherpad core dependencies must be installed after installing the
# plugin's dependencies, otherwise npm will try to hoist common
# dependencies by removing them from src/node_modules and installing them
# in the top-level node_modules. As of v6.14.10, npm's hoist logic appears
# to be buggy, because it sometimes removes dependencies from
# src/node_modules but fails to add them to the top-level node_modules.
# Even if npm correctly hoists the dependencies, the hoisting seems to
# confuse tools such as `npm outdated`, `npm update`, and some ESLint
# rules.
-
name: Install Etherpad core dependencies
run: src/bin/installDeps.sh
-
name: Create settings.json
run: cp settings.json.template settings.json
-
name: Disable import/export rate limiting
run: |
sed -e '/^ *"importExportRateLimiting":/,/^ *\}/ s/"max":.*/"max": 0/' -i settings.json
-
name: Remove standard frontend test files
run: rm -rf src/tests/frontend/specs
-
uses: saucelabs/sauce-connect-action@v2.1.1
with:
username: ${{ secrets.SAUCE_USERNAME }}
accessKey: ${{ secrets.SAUCE_ACCESS_KEY }}
tunnelIdentifier: ${{ steps.sauce_strings.outputs.tunnel_id }}
-
name: Run the frontend tests
shell: bash
env:
SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
SAUCE_NAME: ${{ steps.sauce_strings.outputs.name }}
TRAVIS_JOB_NUMBER: ${{ steps.sauce_strings.outputs.tunnel_id }}
GIT_HASH: ${{ steps.environment.outputs.sha_short }}
run: |
src/tests/frontend/travis/runner.sh

View file

@ -21,50 +21,86 @@ jobs:
# cloned to etherpad-lite then moved to ../etherpad-lite. To avoid # cloned to etherpad-lite then moved to ../etherpad-lite. To avoid
# conflicts with this plugin's clone, etherpad-lite must be cloned and # conflicts with this plugin's clone, etherpad-lite must be cloned and
# moved out before this plugin's repo is cloned to $GITHUB_WORKSPACE. # moved out before this plugin's repo is cloned to $GITHUB_WORKSPACE.
- uses: actions/checkout@v2 -
uses: actions/checkout@v3
with: with:
repository: ether/etherpad-lite repository: ether/etherpad-lite
path: etherpad-lite path: etherpad-lite
- run: mv etherpad-lite .. -
run: mv etherpad-lite ..
# etherpad-lite has been moved outside of $GITHUB_WORKSPACE, so it is now # etherpad-lite has been moved outside of $GITHUB_WORKSPACE, so it is now
# safe to clone this plugin's repo to $GITHUB_WORKSPACE. # safe to clone this plugin's repo to $GITHUB_WORKSPACE.
- uses: actions/checkout@v2 -
- uses: actions/setup-node@v1 uses: actions/checkout@v3
# This is necessary for actions/setup-node because '..' can't be used in
# cache-dependency-path.
-
name: Create ep_etherpad-lite symlink
run: |
mkdir -p node_modules
ln -s ../../etherpad-lite/src node_modules/ep_etherpad-lite
-
uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 12
cache: 'npm'
cache-dependency-path: |
node_modules/ep_etherpad-lite/package-lock.json
node_modules/ep_etherpad-lite/bin/doc/package-lock.json
package-lock.json
# All of ep_etherpad-lite's devDependencies are installed because the # All of ep_etherpad-lite's devDependencies are installed because the
# plugin might do `require('ep_etherpad-lite/node_modules/${devDep}')`. # plugin might do `require('ep_etherpad-lite/node_modules/${devDep}')`.
# Eventually it would be nice to create an ESLint plugin that prohibits # Eventually it would be nice to create an ESLint plugin that prohibits
# Etherpad plugins from piggybacking off of ep_etherpad-lite's # Etherpad plugins from piggybacking off of ep_etherpad-lite's
# devDependencies. If we had that, we could change this line to only # devDependencies. If we had that, we could change this line to only
# install production dependencies. # install production dependencies.
- run: cd ../etherpad-lite/src && npm ci -
- run: npm ci run: cd ../etherpad-lite/src && npm ci
-
run: npm ci
# This runs some sanity checks and creates a symlink at # This runs some sanity checks and creates a symlink at
# node_modules/ep_etherpad-lite that points to ../../etherpad-lite/src. # node_modules/ep_etherpad-lite that points to ../../etherpad-lite/src.
# This step must be done after `npm ci` installs the plugin's dependencies # This step must be done after `npm ci` installs the plugin's dependencies
# because npm "helpfully" cleans up such symlinks. :( Installing # because npm "helpfully" cleans up such symlinks. :( Installing
# ep_etherpad-lite in the plugin's node_modules prevents lint errors and # ep_etherpad-lite in the plugin's node_modules prevents lint errors and
# unit test failures if the plugin does `require('ep_etherpad-lite/foo')`. # unit test failures if the plugin does `require('ep_etherpad-lite/foo')`.
- run: npm install --no-save ep_etherpad-lite@file:../etherpad-lite/src -
- run: npm test run: npm install --no-save ep_etherpad-lite@file:../etherpad-lite/src
- run: npm run lint -
run: npm test
-
run: npm run lint
publish-npm: publish-npm:
if: github.event_name == 'push' if: github.event_name == 'push'
needs: test needs: test
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 -
- uses: actions/setup-node@v1 uses: actions/checkout@v3
with:
fetch-depth: 0
-
uses: actions/setup-node@v3
with: with:
node-version: 12 node-version: 12
registry-url: https://registry.npmjs.org/ registry-url: https://registry.npmjs.org/
- run: git config user.name 'github-actions[bot]' cache: 'npm'
- run: git config user.email '41898282+github-actions[bot]@users.noreply.github.com' -
- run: npm ci name: Bump version (patch)
- run: npm version patch run: |
- run: git push --follow-tags LATEST_TAG=$(git describe --tags --abbrev=0) || exit 1
NEW_COMMITS=$(git rev-list --count "${LATEST_TAG}"..) || exit 1
[ "${NEW_COMMITS}" -gt 0 ] || exit 0
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
npm ci
npm version patch
git push --follow-tags
# This is required if the package has a prepare script that uses something
# in dependencies or devDependencies.
-
run: npm ci
# `npm publish` must come after `git push` otherwise there is a race # `npm publish` must come after `git push` otherwise there is a race
# condition: If two PRs are merged back-to-back then master/main will be # condition: If two PRs are merged back-to-back then master/main will be
# updated with the commits from the second PR before the first PR's # updated with the commits from the second PR before the first PR's
@ -75,9 +111,12 @@ jobs:
# already-used version number. By running `npm publish` after `git push`, # already-used version number. By running `npm publish` after `git push`,
# back-to-back merges will cause the first merge's workflow to fail but # back-to-back merges will cause the first merge's workflow to fail but
# the second's will succeed. # the second's will succeed.
- run: npm publish -
run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
-
name: Add package to etherpad organization
run: npm access grant read-write etherpad:developers
env: env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
##ETHERPAD_NPM_V=2
## NPM configuration automatically created using src/bin/plugins/updateAllPluginsScript.sh

View file

@ -0,0 +1,14 @@
#!/bin/sh
set -e
newline='
'
mydir=$(cd "${0%/*}" && pwd -P) || exit 1
cd "${mydir}/../../.."
pdir=$(cd .. && pwd -P) || exit 1
plugins=
for p in "" "&page=2" "&page=3"; do
curlOut=$(curl "https://api.github.com/users/ether/repos?per_page=100${p}") || exit 1
plugins=${plugins}${newline}$(printf %s\\n "${curlOut}" \
| sed -n -e 's;.*git@github.com:ether/\(ep_[^"]*\)\.git.*;\1;p');
done
printf %s\\n "${plugins}" | sort -u | grep -v '^[[:space:]]*$'

View file

@ -4,7 +4,7 @@ do
echo $dir echo $dir
if [[ $dir == *"ep_"* ]]; then if [[ $dir == *"ep_"* ]]; then
if [[ $dir != "ep_etherpad-lite" ]]; then if [[ $dir != "ep_etherpad-lite" ]]; then
# node src/bin/plugins/checkPlugin.js $dir autofix autocommit autoupdate # node src/bin/plugins/checkPlugin.js $dir autopush
cd node_modules/$dir cd node_modules/$dir
git commit -m "Automatic update: bump update to re-run latest Etherpad tests" --allow-empty git commit -m "Automatic update: bump update to re-run latest Etherpad tests" --allow-empty
git push origin master git push origin master

View file

@ -10,7 +10,7 @@ do
# echo $0 # echo $0
if [[ $dir == *"ep_"* ]]; then if [[ $dir == *"ep_"* ]]; then
if [[ $dir != "ep_etherpad-lite" ]]; then if [[ $dir != "ep_etherpad-lite" ]]; then
node src/bin/plugins/checkPlugin.js $dir autofix autocommit autoupdate node src/bin/plugins/checkPlugin.js $dir autopush
fi fi
fi fi
# echo $dir # echo $dir

View file

@ -5,5 +5,5 @@ set -e
for dir in node_modules/ep_*; do for dir in node_modules/ep_*; do
dir=${dir#node_modules/} dir=${dir#node_modules/}
[ "$dir" != ep_etherpad-lite ] || continue [ "$dir" != ep_etherpad-lite ] || continue
node src/bin/plugins/checkPlugin.js "$dir" autofix autocommit autoupdate node src/bin/plugins/checkPlugin.js "$dir" autopush
done done

View file

@ -132,9 +132,9 @@ try {
// Many users will be using the latest LTS version of npm, and the latest LTS version of npm uses // Many users will be using the latest LTS version of npm, and the latest LTS version of npm uses
// lockfileVersion 1. Enforce v1 so that users don't see a (benign) compatibility warning. // lockfileVersion 1. Enforce v1 so that users don't see a (benign) compatibility warning.
if (readJson('./src/package-lock.json').lockfileVersion !== 1) { const pkglock = readJson('./src/package-lock.json');
throw new Error('Please regenerate package-lock.json with npm v6.x.'); pkglock.lockfileVersion = 1;
} writeJson('./src/package-lock.json', pkglock);
run('git add src/package.json'); run('git add src/package.json');
run('git add src/package-lock.json'); run('git add src/package-lock.json');

View file

@ -23,7 +23,7 @@
{ {
"name": "static", "name": "static",
"hooks": { "hooks": {
"expressCreateServer": "ep_etherpad-lite/node/hooks/express/static" "expressPreSession": "ep_etherpad-lite/node/hooks/express/static"
} }
}, },
{ {
@ -35,13 +35,14 @@
{ {
"name": "i18n", "name": "i18n",
"hooks": { "hooks": {
"expressCreateServer": "ep_etherpad-lite/node/hooks/i18n" "expressPreSession": "ep_etherpad-lite/node/hooks/i18n"
} }
}, },
{ {
"name": "specialpages", "name": "specialpages",
"hooks": { "hooks": {
"expressCreateServer": "ep_etherpad-lite/node/hooks/express/specialpages" "expressCreateServer": "ep_etherpad-lite/node/hooks/express/specialpages",
"expressPreSession": "ep_etherpad-lite/node/hooks/express/specialpages"
} }
}, },
{ {
@ -50,16 +51,10 @@
"expressCreateServer": "ep_etherpad-lite/node/hooks/express/padurlsanitize" "expressCreateServer": "ep_etherpad-lite/node/hooks/express/padurlsanitize"
} }
}, },
{
"name": "webaccess",
"hooks": {
"expressConfigure": "ep_etherpad-lite/node/hooks/express/webaccess"
}
},
{ {
"name": "apicalls", "name": "apicalls",
"hooks": { "hooks": {
"expressCreateServer": "ep_etherpad-lite/node/hooks/express/apicalls" "expressPreSession": "ep_etherpad-lite/node/hooks/express/apicalls"
} }
}, },
{ {
@ -85,7 +80,7 @@
{ {
"name": "tests", "name": "tests",
"hooks": { "hooks": {
"expressCreateServer": "ep_etherpad-lite/node/hooks/express/tests" "expressPreSession": "ep_etherpad-lite/node/hooks/express/tests"
} }
}, },
{ {
@ -111,7 +106,7 @@
{ {
"name": "openapi", "name": "openapi",
"hooks": { "hooks": {
"expressCreateServer": "ep_etherpad-lite/node/hooks/express/openapi" "expressPreSession": "ep_etherpad-lite/node/hooks/express/openapi"
} }
} }
] ]

View file

@ -15,21 +15,29 @@
"محمد أحمد عبد الفتاح" "محمد أحمد عبد الفتاح"
] ]
}, },
"admin_plugins": "مدير المساعد", "admin.page-title": "لوحة تحكم المسؤول - Etherpad",
"admin_plugins.available": "الإضافات المتوفرة",
"admin_plugins.available_not-found": "لم يتم العثور على مكونات إضافية.",
"admin_plugins.available_fetching": "جارٍ الجلب...",
"admin_plugins.available_install.value": "تنصيب",
"admin_plugins.available_search.placeholder": " تنصيب عن الإضافات لتثبيتها",
"admin_plugins.description": "الوصف", "admin_plugins.description": "الوصف",
"admin_plugins.installed_uninstall.value": "فك التنصيب", "admin_plugins.installed": "الإضافات المثبتة",
"admin_plugins.last-update": "آخر تحديث", "admin_plugins.installed_fetching": "جارٍ إحضار المكونات الإضافية المثبتة ...",
"admin_plugins.installed_nothing": "لم تقم بتثبيت أي مكونات إضافية حتى الآن.",
"admin_plugins.name": "الاسم", "admin_plugins.name": "الاسم",
"admin_plugins.page-title": "مدير البرنامج المساعد - Etherpad",
"admin_plugins.version": "الإصدار", "admin_plugins.version": "الإصدار",
"admin_plugins_info.version_latest": "أحدث نسخة متاحة", "admin_plugins_info": "معلومات استكشاف الأخطاء وإصلاحها",
"admin_plugins_info.hooks": "خطافات مثبتة",
"admin_plugins_info.hooks_client": "خطاطيف من جانب العميل",
"admin_plugins_info.hooks_server": "خطاطيف من جانب الخادم",
"admin_plugins_info.parts": "الأجزاء المثبتة",
"admin_plugins_info.plugins": "الإضافات المثبتة",
"admin_plugins_info.page-title": "معلومات البرنامج المساعد - Etherpad",
"admin_plugins_info.version": "إصدار Etherpad",
"admin_plugins_info.version_number": "رقم الإصدار", "admin_plugins_info.version_number": "رقم الإصدار",
"admin_settings": "إعدادات", "admin_settings": "إعدادات",
"admin_settings.current": "التكوين الحالي", "admin_settings.current_example-devel": "مثال على قالب إعدادات التطوير",
"admin_settings.current_example-prod": "مثال على قالب إعدادات الإنتاج",
"admin_settings.current_restart.value": "أعد تشغيل Etherpad",
"admin_settings.current_save.value": "حفظ الإعدادات",
"admin_settings.page-title": "الإعدادات - Etherpad",
"index.newPad": "باد جديد", "index.newPad": "باد جديد",
"index.createOpenPad": "أو صنع/فتح باد بوضع اسمه:", "index.createOpenPad": "أو صنع/فتح باد بوضع اسمه:",
"index.openPad": "افتح باد موجودة بالاسم:", "index.openPad": "افتح باد موجودة بالاسم:",
@ -101,8 +109,8 @@
"pad.modals.corruptPad.cause": "قد يكون هذا بسبب تكوين ملقم خاطئ أو بسبب سلوك آخر غير متوقع. يرجى الاتصال بمسؤول الخدمة.", "pad.modals.corruptPad.cause": "قد يكون هذا بسبب تكوين ملقم خاطئ أو بسبب سلوك آخر غير متوقع. يرجى الاتصال بمسؤول الخدمة.",
"pad.modals.deleted": "محذوف.", "pad.modals.deleted": "محذوف.",
"pad.modals.deleted.explanation": "تمت إزالة هذا الباد.", "pad.modals.deleted.explanation": "تمت إزالة هذا الباد.",
"pad.modals.rateLimited.explanation": "لقد أرسلت عددًا كبيرًا جدًا من الرسائل إلى هذه اللوحة ، لذا فقد قطع اتصالك.", "pad.modals.rateLimited": "معدل محدود.",
"pad.modals.rejected.explanation": "رفض الخادم رسالة أرسلها متصفحك.", "pad.modals.rejected.cause": "ربما تم تحديث الخادم أثناء عرض اللوحة ، أو ربما كان هناك خطأ في Etherpad. حاول إعادة تحميل الصفحة.",
"pad.modals.disconnected": "لم تعد متصلا.", "pad.modals.disconnected": "لم تعد متصلا.",
"pad.modals.disconnected.explanation": "تم فقدان الاتصال بالخادم", "pad.modals.disconnected.explanation": "تم فقدان الاتصال بالخادم",
"pad.modals.disconnected.cause": "قد يكون الخادم غير متوفر. يرجى إعلام مسؤول الخدمة إذا كان هذا لا يزال يحدث.", "pad.modals.disconnected.cause": "قد يكون الخادم غير متوفر. يرجى إعلام مسؤول الخدمة إذا كان هذا لا يزال يحدث.",
@ -115,6 +123,7 @@
"pad.chat.loadmessages": "تحميل المزيد من الرسائل", "pad.chat.loadmessages": "تحميل المزيد من الرسائل",
"pad.chat.stick.title": "ألصق الدردشة بالشاشة", "pad.chat.stick.title": "ألصق الدردشة بالشاشة",
"pad.chat.writeMessage.placeholder": "اكتب رسالتك هنا", "pad.chat.writeMessage.placeholder": "اكتب رسالتك هنا",
"timeslider.followContents": "اتبع تحديثات محتوى الوسادة",
"timeslider.pageTitle": "{{appTitle}} متصفح التاريخ", "timeslider.pageTitle": "{{appTitle}} متصفح التاريخ",
"timeslider.toolbar.returnbutton": "العودة إلى الباد", "timeslider.toolbar.returnbutton": "العودة إلى الباد",
"timeslider.toolbar.authors": "المؤلفون:", "timeslider.toolbar.authors": "المؤلفون:",

View file

@ -1,7 +1,8 @@
{ {
"@metadata": { "@metadata": {
"authors": [ "authors": [
"1AnuraagPandey" "1AnuraagPandey",
"बडा काजी"
] ]
}, },
"index.newPad": "नयाँ प्याड", "index.newPad": "नयाँ प्याड",
@ -35,7 +36,7 @@
"pad.modals.unauth": "अनाधिकृत", "pad.modals.unauth": "अनाधिकृत",
"pad.modals.initsocketfail": "सर्भरमा पहुँच से बहरे है ।", "pad.modals.initsocketfail": "सर्भरमा पहुँच से बहरे है ।",
"pad.share.readonly": "पढय वाला खाली", "pad.share.readonly": "पढय वाला खाली",
"pad.share.link": "लिङ्क", "pad.share.link": "डी",
"pad.share.emebdcode": "URL जोडा जाय", "pad.share.emebdcode": "URL जोडा जाय",
"pad.chat": "बातचीत", "pad.chat": "बातचीत",
"timeslider.pageTitle": "{{appTitle}} समय रेखा", "timeslider.pageTitle": "{{appTitle}} समय रेखा",

View file

@ -13,6 +13,28 @@
"admin_plugins.available_not-found": "Плагіны ня знойдзеныя.", "admin_plugins.available_not-found": "Плагіны ня знойдзеныя.",
"admin_plugins.available_fetching": "Атрымліваем…", "admin_plugins.available_fetching": "Атрымліваем…",
"admin_plugins.available_install.value": "Усталяваць", "admin_plugins.available_install.value": "Усталяваць",
"admin_plugins.available_search.placeholder": "Шукаць пашырэньні для ўсталяваньня",
"admin_plugins.description": "Апісаньне",
"admin_plugins.installed": "Усталяваныя пашырэньні",
"admin_plugins.installed_fetching": "Атрыманьне ўсталяваных пашырэньняў…",
"admin_plugins.installed_nothing": "Вы пакуль не ўсталявалі ніводнага пашырэньня.",
"admin_plugins.installed_uninstall.value": "Выдаліць",
"admin_plugins.last-update": "Апошняе абнаўленьне",
"admin_plugins.name": "Назва",
"admin_plugins.page-title": "Кіраўнік пашырэньняў — Etherpad",
"admin_plugins.version": "Вэрсія",
"admin_plugins_info": "Інфармацыя пра вырашэньне няспраўнасьцяў",
"admin_plugins_info.hooks": "Усталяваныя кручкі",
"admin_plugins_info.hooks_client": "Кліенцкія кручкі",
"admin_plugins_info.hooks_server": "Сэрвэрныя кручкі",
"admin_plugins_info.parts": "Усталяваныя часткі",
"admin_plugins_info.plugins": "Усталяваныя пашырэньні",
"admin_plugins_info.page-title": "Інфармацыя пра пашырэньне — Etherpad",
"admin_plugins_info.version": "Вэрсія Etherpad",
"admin_plugins_info.version_latest": "Апошняя даступная вэрсія",
"admin_plugins_info.version_number": "Нумар вэрсіі",
"admin_settings": "Налады",
"admin_settings.current": "Цяперашняя канфігурацыя",
"admin_settings.page-title": "Налады — Etherpad", "admin_settings.page-title": "Налады — Etherpad",
"index.newPad": "Стварыць", "index.newPad": "Стварыць",
"index.createOpenPad": "ці тварыць/адкрыць дакумэнт з назвай:", "index.createOpenPad": "ці тварыць/адкрыць дакумэнт з назвай:",

View file

@ -9,6 +9,7 @@
"Nasir8891", "Nasir8891",
"Sankarshan", "Sankarshan",
"Sibabrata Banerjee", "Sibabrata Banerjee",
"আজিজ",
"আফতাবুজ্জামান" "আফতাবুজ্জামান"
] ]
}, },
@ -22,6 +23,7 @@
"admin_plugins.description": "বিবরণ", "admin_plugins.description": "বিবরণ",
"admin_plugins.installed": "ইন্সটল হওয়া প্লাগিনসমূহ", "admin_plugins.installed": "ইন্সটল হওয়া প্লাগিনসমূহ",
"admin_plugins.installed_fetching": "ইন্সটলকৃত প্লাগিন আনা হচ্ছে", "admin_plugins.installed_fetching": "ইন্সটলকৃত প্লাগিন আনা হচ্ছে",
"admin_plugins.installed_nothing": "আপনি এখনও কোনো প্লাগইন ইনস্টল করেননি।",
"admin_plugins.installed_uninstall.value": "আনইনস্টল করুন", "admin_plugins.installed_uninstall.value": "আনইনস্টল করুন",
"admin_plugins.last-update": "সর্বশেষ হালনাগাদ", "admin_plugins.last-update": "সর্বশেষ হালনাগাদ",
"admin_plugins.name": "নাম", "admin_plugins.name": "নাম",
@ -39,10 +41,14 @@
"admin_plugins_info.version_number": "সংস্করণ সংখ্যা", "admin_plugins_info.version_number": "সংস্করণ সংখ্যা",
"admin_settings": "সেটিংসমূহ", "admin_settings": "সেটিংসমূহ",
"admin_settings.current": "বর্তমান কনফিগারেশন", "admin_settings.current": "বর্তমান কনফিগারেশন",
"admin_settings.current_example-devel": "উদাহরণ ডেভেলপমেন্ট সেটিংস টেমপ্লেট",
"admin_settings.current_example-prod": "উদাহরণ উৎপাদন সেটিংস টেমপ্লেট",
"admin_settings.current_restart.value": "ইথারপ্যাড পুনরায় চালু করুন", "admin_settings.current_restart.value": "ইথারপ্যাড পুনরায় চালু করুন",
"admin_settings.current_save.value": "সেটিংসমূহ সংরক্ষণ করুন", "admin_settings.current_save.value": "সেটিংসমূহ সংরক্ষণ করুন",
"admin_settings.page-title": "সেটিংস - ইথারপ্যাড",
"index.newPad": "নতুন প্যাড", "index.newPad": "নতুন প্যাড",
"index.createOpenPad": "অথবা নাম লিখে প্যাড খুলুন/তৈরী করুন:", "index.createOpenPad": "অথবা নাম লিখে প্যাড খুলুন/তৈরী করুন:",
"index.openPad": "নাম সহ একটি বিদ্যমান প্যাড খুলুন:",
"pad.toolbar.bold.title": "গাঢ় (Ctrl-B)", "pad.toolbar.bold.title": "গাঢ় (Ctrl-B)",
"pad.toolbar.italic.title": "বাঁকা (Ctrl+I)", "pad.toolbar.italic.title": "বাঁকা (Ctrl+I)",
"pad.toolbar.underline.title": "নিম্নরেখা (Ctrl+U)", "pad.toolbar.underline.title": "নিম্নরেখা (Ctrl+U)",
@ -90,12 +96,27 @@
"pad.modals.connected": "সংযোগস্থাপন করা হয়েছে।", "pad.modals.connected": "সংযোগস্থাপন করা হয়েছে।",
"pad.modals.reconnecting": "আপনার প্যাডের সাথে সংযোগস্থাপন করা হচ্ছে…", "pad.modals.reconnecting": "আপনার প্যাডের সাথে সংযোগস্থাপন করা হচ্ছে…",
"pad.modals.forcereconnect": "পুনরায় সংযোগস্থাপনের চেষ্টা", "pad.modals.forcereconnect": "পুনরায় সংযোগস্থাপনের চেষ্টা",
"pad.modals.reconnecttimer": "পুনঃসংযোগের চেষ্টা করা হচ্ছে",
"pad.modals.cancel": "বাতিল",
"pad.modals.userdup": "অন্য উইন্ডো-তে খোলা হয়েছে", "pad.modals.userdup": "অন্য উইন্ডো-তে খোলা হয়েছে",
"pad.modals.userdup.explanation": "এই প্যাডটি এই কম্পিউটারে একাধিক ব্রাউজার উইন্ডোতে খোলা হয়েছে বলে মনে হচ্ছে৷",
"pad.modals.userdup.advice": "পরিবর্তে এই উইন্ডোটি ব্যবহার করতে পুনঃসংযোগ করুন৷",
"pad.modals.unauth": "আপনার অধিকার নেই", "pad.modals.unauth": "আপনার অধিকার নেই",
"pad.modals.unauth.explanation": "এই পৃষ্ঠাটি দেখার সময় আপনার অনুমতি পরিবর্তিত হয়েছে৷ পুনঃসংযোগের চেষ্টা করুন।",
"pad.modals.looping.explanation": "সিঙ্ক্রোনাইজেশন সার্ভারের সাথে যোগাযোগের সমস্যা রয়েছে।",
"pad.modals.looping.cause": "সম্ভবত আপনি একটি বেমানান ফায়ারওয়াল বা প্রক্সির মাধ্যমে সংযুক্ত হয়েছেন৷",
"pad.modals.initsocketfail": "সার্ভারে পৌঁছানো যাচ্ছে না।", "pad.modals.initsocketfail": "সার্ভারে পৌঁছানো যাচ্ছে না।",
"pad.modals.initsocketfail.explanation": "সিঙ্ক্রোনাইজেশন সার্ভারের সাথে সংযোগ করা যায়নি৷",
"pad.modals.initsocketfail.cause": "এটি সম্ভবত আপনার ব্রাউজার বা আপনার ইন্টারনেট সংযোগের কোনও সমস্যার কারণে হয়েছে৷",
"pad.modals.slowcommit.explanation": "সার্ভার সাড়া দিচ্ছে না।", "pad.modals.slowcommit.explanation": "সার্ভার সাড়া দিচ্ছে না।",
"pad.modals.slowcommit.cause": "এটি নেটওয়ার্ক সংযোগের সমস্যার কারণে হতে পারে।",
"pad.modals.badChangeset.explanation": "আপনার করা একটি সম্পাদনা সিঙ্ক্রোনাইজেশন সার্ভার কর্তৃক বেআইনি হিসেবে শ্রেণীবদ্ধ করা হয়েছে৷",
"pad.modals.corruptPad.explanation": "আপনি যে প্যাডে প্রবেশ করার চেষ্টা করছেন সেটি দূষিত।",
"pad.modals.corruptPad.cause": "এটি একটি ভুল সার্ভার কনফিগারেশন বা অন্য কোনও অপ্রত্যাশিত আচরণের কারণে হতে পারে। পরিষেবা প্রশাসকের সাথে যোগাযোগ করুন।",
"pad.modals.deleted": "অপসারিত।", "pad.modals.deleted": "অপসারিত।",
"pad.modals.deleted.explanation": "এই প্যাডটি অপসারণ করা হয়েছে।", "pad.modals.deleted.explanation": "এই প্যাডটি অপসারণ করা হয়েছে।",
"pad.modals.rateLimited.explanation": "আপনি এই প্যাডে অনেকগুলি বার্তা পাঠিয়েছেন তাই এটি আপনাকে সংযোগ বিচ্ছিন্ন করেছে৷",
"pad.modals.rejected.explanation": "সার্ভার আপনার ব্রাউজারের পাঠানো একটি বার্তা প্রত্যাখ্যান করেছে৷",
"pad.modals.disconnected": "আপনি সংযোগ বিচ্ছিন্ন হয়েছে গেছে।", "pad.modals.disconnected": "আপনি সংযোগ বিচ্ছিন্ন হয়েছে গেছে।",
"pad.modals.disconnected.explanation": "সার্ভারের সাথে যোগাযোগ করা যাচ্ছে না", "pad.modals.disconnected.explanation": "সার্ভারের সাথে যোগাযোগ করা যাচ্ছে না",
"pad.share": "শেয়ার করুন", "pad.share": "শেয়ার করুন",
@ -127,6 +148,7 @@
"timeslider.month.november": "নভেম্বর", "timeslider.month.november": "নভেম্বর",
"timeslider.month.december": "ডিসেম্বর", "timeslider.month.december": "ডিসেম্বর",
"timeslider.unnamedauthors": "নামবিহীন {{num}} জন {[plural(num) one: লেখক, other: লেখক ]}", "timeslider.unnamedauthors": "নামবিহীন {{num}} জন {[plural(num) one: লেখক, other: লেখক ]}",
"pad.savedrevs.marked": "এই সংশোধনটি এখন সংরক্ষিত সংশোধন হিসেবে চিহ্নিত করা হয়েছে",
"pad.userlist.entername": "আপনার নাম লিখুন", "pad.userlist.entername": "আপনার নাম লিখুন",
"pad.userlist.unnamed": "কোন নাম নির্বাচন করা হয়নি", "pad.userlist.unnamed": "কোন নাম নির্বাচন করা হয়নি",
"pad.impexp.importbutton": "এখন আমদানি করুন", "pad.impexp.importbutton": "এখন আমদানি করুন",
@ -135,5 +157,6 @@
"pad.impexp.uploadFailed": "আপলোড করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন", "pad.impexp.uploadFailed": "আপলোড করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন",
"pad.impexp.importfailed": "আমদানি ব্যর্থ", "pad.impexp.importfailed": "আমদানি ব্যর্থ",
"pad.impexp.copypaste": "দয়া করে অনুলিপি প্রতিলেপন করুন", "pad.impexp.copypaste": "দয়া করে অনুলিপি প্রতিলেপন করুন",
"pad.impexp.exportdisabled": "{{type}} হিসেবে রপ্তানি করা নিষ্ক্রিয় আছে। বিস্তারিত জানার জন্য আপনার সিস্টেম প্রশাসকের সাথে যোগাযোগ করুন।" "pad.impexp.exportdisabled": "{{type}} হিসেবে রপ্তানি করা নিষ্ক্রিয় আছে। বিস্তারিত জানার জন্য আপনার সিস্টেম প্রশাসকের সাথে যোগাযোগ করুন।",
"pad.impexp.maxFileSize": "ফাইল খুব বড়। আমদানির জন্য অনুমোদিত ফাইলের আকার বাড়াতে আপনার সাইট প্রশাসকের সাথে যোগাযোগ করুন"
} }

View file

@ -4,6 +4,7 @@
"Fohanno", "Fohanno",
"Fulup", "Fulup",
"Gwenn-Ael", "Gwenn-Ael",
"Huñvreüs",
"Y-M D" "Y-M D"
] ]
}, },
@ -86,7 +87,7 @@
"pad.chat.title": "Digeriñ ar flap kevelet gant ar pad-mañ.", "pad.chat.title": "Digeriñ ar flap kevelet gant ar pad-mañ.",
"pad.chat.loadmessages": "Kargañ muioc'h a gemennadennoù", "pad.chat.loadmessages": "Kargañ muioc'h a gemennadennoù",
"pad.chat.stick.title": "Gwriziennañ an diviz war ar skramm", "pad.chat.stick.title": "Gwriziennañ an diviz war ar skramm",
"pad.chat.writeMessage.placeholder": "Skrivañ ho kemenadenn amañ", "pad.chat.writeMessage.placeholder": "Skrivañ ho kemennadenn amañ",
"timeslider.pageTitle": "Istor dinamek eus {{appTitle}}", "timeslider.pageTitle": "Istor dinamek eus {{appTitle}}",
"timeslider.toolbar.returnbutton": "Distreiñ d'ar pad-mañ.", "timeslider.toolbar.returnbutton": "Distreiñ d'ar pad-mañ.",
"timeslider.toolbar.authors": "Aozerien :", "timeslider.toolbar.authors": "Aozerien :",

View file

@ -3,6 +3,7 @@
"authors": [ "authors": [
"Bjarncraft", "Bjarncraft",
"Dom", "Dom",
"Justman10000",
"Killarnee", "Killarnee",
"Metalhead64", "Metalhead64",
"Mklehr", "Mklehr",
@ -44,6 +45,7 @@
"admin_settings": "Einstellungen", "admin_settings": "Einstellungen",
"admin_settings.current": "Derzeitige Konfiguration", "admin_settings.current": "Derzeitige Konfiguration",
"admin_settings.current_example-devel": "Beispielhafte Entwicklungseinstellungs-Templates", "admin_settings.current_example-devel": "Beispielhafte Entwicklungseinstellungs-Templates",
"admin_settings.current_example-prod": "Beispiel einer Vorlage für Produktionseinstellungen",
"admin_settings.current_restart.value": "Etherpad neustarten", "admin_settings.current_restart.value": "Etherpad neustarten",
"admin_settings.current_save.value": "Einstellungen speichern", "admin_settings.current_save.value": "Einstellungen speichern",
"admin_settings.page-title": "Einstellungen - Etherpad", "admin_settings.page-title": "Einstellungen - Etherpad",
@ -121,6 +123,7 @@
"pad.modals.rateLimited": "Begrenzte Rate.", "pad.modals.rateLimited": "Begrenzte Rate.",
"pad.modals.rateLimited.explanation": "Sie haben zu viele Nachrichten an dieses Pad gesendet, so dass die Verbindung unterbrochen wurde.", "pad.modals.rateLimited.explanation": "Sie haben zu viele Nachrichten an dieses Pad gesendet, so dass die Verbindung unterbrochen wurde.",
"pad.modals.rejected.explanation": "Der Server hat eine Nachricht abgelehnt, die von deinem Browser gesendet wurde.", "pad.modals.rejected.explanation": "Der Server hat eine Nachricht abgelehnt, die von deinem Browser gesendet wurde.",
"pad.modals.rejected.cause": "Möglicherweise wurde der Server aktualisiert, während du das Pad angesehen hast, oder es existiert ein Fehler in Etherpad. Versuche, die Seite neu zu laden.",
"pad.modals.disconnected": "Ihre Verbindung wurde getrennt.", "pad.modals.disconnected": "Ihre Verbindung wurde getrennt.",
"pad.modals.disconnected.explanation": "Die Verbindung zum Server wurde unterbrochen.", "pad.modals.disconnected.explanation": "Die Verbindung zum Server wurde unterbrochen.",
"pad.modals.disconnected.cause": "Möglicherweise ist der Server nicht erreichbar. Bitte benachrichtige den Dienstadministrator, falls dies weiterhin passiert.", "pad.modals.disconnected.cause": "Möglicherweise ist der Server nicht erreichbar. Bitte benachrichtige den Dienstadministrator, falls dies weiterhin passiert.",

View file

@ -4,19 +4,53 @@
"Michawiki" "Michawiki"
] ]
}, },
"admin.page-title": "Administratorowa delka Etherpad",
"admin_plugins": "Zastojnik tykacow",
"admin_plugins.available": "K dispoziciji stojece tykace",
"admin_plugins.available_not-found": "Žedne tykace namakane.",
"admin_plugins.available_fetching": "Wobstarujo se …",
"admin_plugins.available_install.value": "Instalěrowaś",
"admin_plugins.available_search.placeholder": "Tykace za instalaciju pytaś",
"admin_plugins.description": "Wopisanje",
"admin_plugins.installed": "Zainstalěrowane tykace",
"admin_plugins.installed_fetching": "Zainstalěrowane tykace se wobstaruju …",
"admin_plugins.installed_nothing": "Hyšći njejsćo zainstalěrował tykace.",
"admin_plugins.installed_uninstall.value": "Wótinstalěrowaś",
"admin_plugins.last-update": "Slědna aktualizacija",
"admin_plugins.name": "Mě",
"admin_plugins.page-title": "Zastojnik tykacow Etherpad",
"admin_plugins.version": "Wersija",
"admin_plugins_info": "Informacije wó rozwězanju problemow",
"admin_plugins_info.hooks": "Zainstalěrowane kokulki",
"admin_plugins_info.hooks_client": "Kokulki z boka klienta",
"admin_plugins_info.hooks_server": "Kokulki z boka serwera",
"admin_plugins_info.parts": "Zainstalěrowane źěle",
"admin_plugins_info.plugins": "Zainstalěrowane tykace",
"admin_plugins_info.page-title": "Tykacowe informacije Ehterpad",
"admin_plugins_info.version": "Wersija Etherpad",
"admin_plugins_info.version_latest": "Nejnowša wersija",
"admin_plugins_info.version_number": "Wersijowy numer",
"admin_settings": "Nastajenja",
"admin_settings.current": "Aktualna konfiguracija",
"admin_settings.current_example-devel": "Pśikładowa pśedłoga wuwijańskich nastajenjow",
"admin_settings.current_example-prod": "Pśikładowa pśedłoga produkciskich nastajenjow",
"admin_settings.current_restart.value": "Etherpad znowego startowaś",
"admin_settings.current_save.value": "Nastajenja składowaś",
"admin_settings.page-title": "Nastajenja Etherpad",
"index.newPad": "Nowy zapisnik", "index.newPad": "Nowy zapisnik",
"index.createOpenPad": "abo napóraj/wócyń zapisnik z mjenim:", "index.createOpenPad": "abo napóraj/wócyń zapisnik z mjenim:",
"index.openPad": "wócyńśo eksistěrujucy Pad z mjenim:",
"pad.toolbar.bold.title": "Tucny (Strg-B)", "pad.toolbar.bold.title": "Tucny (Strg-B)",
"pad.toolbar.italic.title": "Kursiwny (Strg-I)", "pad.toolbar.italic.title": "Kursiwny (Strg-I)",
"pad.toolbar.underline.title": "Pódšmarnuś (Strg-U)", "pad.toolbar.underline.title": "Pódšmarnuś (Strg-U)",
"pad.toolbar.strikethrough.title": "Pśešmarnuś", "pad.toolbar.strikethrough.title": "Pśešmarnuś (Strg+5)",
"pad.toolbar.ol.title": "Numerěrowana lisćina", "pad.toolbar.ol.title": "Numerěrowana lisćina (Strg+Umsch+N)",
"pad.toolbar.ul.title": "Nalicenje", "pad.toolbar.ul.title": "Nalicenje (Strg+Umsch+L)",
"pad.toolbar.indent.title": "Zasunuś (TAB)", "pad.toolbar.indent.title": "Zasunuś (TAB)",
"pad.toolbar.unindent.title": "Wusunuś (Umsch+TAB)", "pad.toolbar.unindent.title": "Wusunuś (Umsch+TAB)",
"pad.toolbar.undo.title": "Anulěrowaś (Strg-Z)", "pad.toolbar.undo.title": "Anulěrowaś (Strg-Z)",
"pad.toolbar.redo.title": "Wóspjetowaś (Strg-Y)", "pad.toolbar.redo.title": "Wóspjetowaś (Strg-Y)",
"pad.toolbar.clearAuthorship.title": "Awtorowe barwy lašowaś", "pad.toolbar.clearAuthorship.title": "Awtorowe barwy lašowaś (Strg+Umsch+C)",
"pad.toolbar.import_export.title": "Import/Eksport z/do drugich datajowych formatow", "pad.toolbar.import_export.title": "Import/Eksport z/do drugich datajowych formatow",
"pad.toolbar.timeslider.title": "Wersijowa historija", "pad.toolbar.timeslider.title": "Wersijowa historija",
"pad.toolbar.savedRevision.title": "Wersiju składowaś", "pad.toolbar.savedRevision.title": "Wersiju składowaś",
@ -26,29 +60,36 @@
"pad.colorpicker.save": "Składowaś", "pad.colorpicker.save": "Składowaś",
"pad.colorpicker.cancel": "Pśetergnuś", "pad.colorpicker.cancel": "Pśetergnuś",
"pad.loading": "Zacytujo se...", "pad.loading": "Zacytujo se...",
"pad.noCookie": "Cookie njejo se namakał. Pšosym dowólśo cookieje w swójom wobglědowaku! Wašo pósejźenje a waše nastajenja se mjazy dwěma woglědoma njeskładuju. To móžo se stas, gaž Etherpad jo w někotarych wobglědowakach w iFrame wopśimjony. Pšosym zawěsććo, až Etherpad jo na samskej póddomenje/domenje ako nadrědowany iFrame",
"pad.permissionDenied": "Njamaš pśistupne pšawo za toś ten zapisnik.", "pad.permissionDenied": "Njamaš pśistupne pšawo za toś ten zapisnik.",
"pad.settings.padSettings": "Nastajenja zapisnika", "pad.settings.padSettings": "Nastajenja zapisnika",
"pad.settings.myView": "Mój naglěd", "pad.settings.myView": "Mój naglěd",
"pad.settings.stickychat": "Chat pśecej na wobrazowce pokazaś", "pad.settings.stickychat": "Chat pśecej na wobrazowce pokazaś",
"pad.settings.chatandusers": "Chat a wužywarje pokazaś",
"pad.settings.colorcheck": "Awtorowe barwy", "pad.settings.colorcheck": "Awtorowe barwy",
"pad.settings.linenocheck": "Smužkowe numery", "pad.settings.linenocheck": "Smužkowe numery",
"pad.settings.rtlcheck": "Wopśimjeśe wótpšawa nalěwo cytaś?", "pad.settings.rtlcheck": "Wopśimjeśe wótpšawa nalěwo cytaś?",
"pad.settings.fontType": "Pismowa družyna:", "pad.settings.fontType": "Pismowa družyna:",
"pad.settings.fontType.normal": "Normalny", "pad.settings.fontType.normal": "Normalny",
"pad.settings.language": "Rěc:", "pad.settings.language": "Rěc:",
"pad.settings.about": "Wó",
"pad.settings.poweredBy": "Pódpěrany wót",
"pad.importExport.import_export": "Import/Eksport", "pad.importExport.import_export": "Import/Eksport",
"pad.importExport.import": "Tekstowu dataju abo dokument nagraś", "pad.importExport.import": "Tekstowu dataju abo dokument nagraś",
"pad.importExport.importSuccessful": "Wuspěšny!", "pad.importExport.importSuccessful": "Wuspěšny!",
"pad.importExport.export": "Aktualny zapisnik eksportěrowaś ako:", "pad.importExport.export": "Aktualny zapisnik eksportěrowaś ako:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML", "pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Lutny tekst", "pad.importExport.exportplain": "Lutny tekst",
"pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"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.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-with-AbiWord\">instalěruj pšosym Abiword abo LibreOffice</a>.",
"pad.modals.connected": "Zwězany.", "pad.modals.connected": "Zwězany.",
"pad.modals.reconnecting": "Zwězujo se znowego z twójim zapisnikom...", "pad.modals.reconnecting": "Zwězujo se znowego z twójim zapisnikom...",
"pad.modals.forcereconnect": "Znowego zwězaś", "pad.modals.forcereconnect": "Znowego zwězaś",
"pad.modals.reconnecttimer": "Wopytaj se znowego zwězaś w",
"pad.modals.cancel": "Pśetergnuś",
"pad.modals.userdup": "W drugem woknje wócynjony", "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.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.userdup.advice": "Zwězaj znowego, aby toś to wokno město togo wužywał.",
@ -67,6 +108,10 @@
"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.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": "Wulašowany.",
"pad.modals.deleted.explanation": "Toś ten zapisnik jo se wótpórał.", "pad.modals.deleted.explanation": "Toś ten zapisnik jo se wótpórał.",
"pad.modals.rateLimited": "Wobgranicowana rata.",
"pad.modals.rateLimited.explanation": "Sćo pósłał pśewjele powěsćow na zapisnik, togodla jo se zwisk źělił.",
"pad.modals.rejected.explanation": "Serwer jo wótpokazał powěsć, kótaraž jo se pósłał pśez waš wobglědowak pósłał.",
"pad.modals.rejected.cause": "Serwer jo se snaź zaktualizěrował, mjaztym až sy se woglědał zapisnik, abo dajo snaź zmólku w Etherpad. Wopytaj bok znowego zacytaś.",
"pad.modals.disconnected": "Zwisk jo pśetergnjony.", "pad.modals.disconnected": "Zwisk jo pśetergnjony.",
"pad.modals.disconnected.explanation": "Zwisk ze serwerom jo se zgubił", "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.modals.disconnected.cause": "Serwer njestoj k dispoziciji. Pšosym informěruj słužbowego administratora, jolic to se dalej stawa.",
@ -77,6 +122,9 @@
"pad.chat": "Chat", "pad.chat": "Chat",
"pad.chat.title": "Chat za toś ten zapisnik wócyniś", "pad.chat.title": "Chat za toś ten zapisnik wócyniś",
"pad.chat.loadmessages": "Dalšne powěsći zacytaś", "pad.chat.loadmessages": "Dalšne powěsći zacytaś",
"pad.chat.stick.title": "Chat k wobrazowce pśipěś",
"pad.chat.writeMessage.placeholder": "Piš swóju powěsć how",
"timeslider.followContents": "Aktualizacijam wopśimjeśa zapisnika slědowaś",
"timeslider.pageTitle": "{{appTitle}} - wersijowa historija", "timeslider.pageTitle": "{{appTitle}} - wersijowa historija",
"timeslider.toolbar.returnbutton": "Slědk k zapisnikoju", "timeslider.toolbar.returnbutton": "Slědk k zapisnikoju",
"timeslider.toolbar.authors": "Awtory:", "timeslider.toolbar.authors": "Awtory:",
@ -85,6 +133,9 @@
"timeslider.exportCurrent": "Aktualnu wersiju eksportěrowaś ako:", "timeslider.exportCurrent": "Aktualnu wersiju eksportěrowaś ako:",
"timeslider.version": "Wersija {{version}}", "timeslider.version": "Wersija {{version}}",
"timeslider.saved": "Składowany {{day}}. {{month}} {{year}}", "timeslider.saved": "Składowany {{day}}. {{month}} {{year}}",
"timeslider.playPause": "Wopśimjeśe zapisnika wótgraś/pawzěrowaś",
"timeslider.backRevision": "Wó jadnu wersiju w toś tom dokumenśe slědk hyś",
"timeslider.forwardRevision": "Wó jadnu wersiju w toś tom dokumenśe doprědka hyś",
"timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "januara", "timeslider.month.january": "januara",
"timeslider.month.february": "februara", "timeslider.month.february": "februara",
@ -100,15 +151,18 @@
"timeslider.month.december": "decembra", "timeslider.month.december": "decembra",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: awtor, two: awtora, few: awtory, other: awtorow ]} bźez mjenja", "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.savedrevs.marked": "Toś ta wersija jo se něnto ako składowana wersija markěrowała",
"pad.savedrevs.timeslider": "Móžoš se skłaźone wersije woglědowaś, gaž se k historiji dokumenta woglědujoś.",
"pad.userlist.entername": "Zapódaj swójo mě", "pad.userlist.entername": "Zapódaj swójo mě",
"pad.userlist.unnamed": "bźez mjenja", "pad.userlist.unnamed": "bźez mjenja",
"pad.editbar.clearcolors": "Awtorowe barwy w cełem dokumenśe lašowaś?", "pad.editbar.clearcolors": "Awtorowe barwy w cełem dokumenśe lašowaś? To njedajo se anulěrowaś",
"pad.impexp.importbutton": "Něnto importěrowaś", "pad.impexp.importbutton": "Něnto importěrowaś",
"pad.impexp.importing": "Importěrujo se...", "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.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.convertFailed": "Njejsmy mógli toś tu dataju importěrowaś. Pšosym wužyj drugi dokumentowy format abo kopěruj manuelnje",
"pad.impexp.padHasData": "Njejsmy mógli toś tu dataju importěrowaś, dokulaž toś ten dokument južo změny wopśimujo, pšosym importěruj nowy dokument.",
"pad.impexp.uploadFailed": "Nagraśe njejo se raźiło, pšosym wopytaj hyšći raz", "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.importfailed": "Import njejo se raził",
"pad.impexp.copypaste": "Pšosym kopěrowaś a zasajźiś", "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." "pad.impexp.exportdisabled": "Eksport ako format {{type}} jo znjemóžnjony. Pšosym staj se ze swójim systemowym administratorom za drobnostki do zwiska.",
"pad.impexp.maxFileSize": "Dataja jo pśewjelika. Staj se ze swójim sedłowym administratorom do zwiska, aby dowólonu datajowu wjelikosć za import pówušył"
} }

View file

@ -2,6 +2,7 @@
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Nirajan pant", "Nirajan pant",
"बडा काजी",
"रमेश सिंह बोहरा", "रमेश सिंह बोहरा",
"राम प्रसाद जोशी" "राम प्रसाद जोशी"
] ]
@ -78,7 +79,7 @@
"pad.modals.disconnected.cause": "सर्भर अनुपलब्ध होइसकन्छ। यदि यो हुनोइ रयाबर कृपया सेवा व्यवस्थापकलाई सूचित अरऽ।", "pad.modals.disconnected.cause": "सर्भर अनुपलब्ध होइसकन्छ। यदि यो हुनोइ रयाबर कृपया सेवा व्यवस्थापकलाई सूचित अरऽ।",
"pad.share": "यस प्याडलाई बाड्न्या", "pad.share": "यस प्याडलाई बाड्न्या",
"pad.share.readonly": "पड्‍ड्या मात्तरै", "pad.share.readonly": "पड्‍ड्या मात्तरै",
"pad.share.link": "लिङ्क", "pad.share.link": "डी",
"pad.share.emebdcode": "URL थप्प्या", "pad.share.emebdcode": "URL थप्प्या",
"pad.chat": "कुरणिकानी", "pad.chat": "कुरणिकानी",
"pad.chat.title": "येइ प्याड खिलाइ गफ खोलऽ", "pad.chat.title": "येइ प्याड खिलाइ गफ खोलऽ",

View file

@ -6,35 +6,66 @@
"Glavkos", "Glavkos",
"Monopatis", "Monopatis",
"Norhorn", "Norhorn",
"Papspyr",
"Protnet" "Protnet"
] ]
}, },
"index.newPad": "Νέο Pad", "admin.page-title": "Πίνακας ελέγχου διαχειριστή - Etherpad",
"index.createOpenPad": "ή δημιουργία/άνοιγμα ενός Pad με όνομα:", "admin_plugins": "Διαχειριστής πρόσθετων",
"index.openPad": "άνοιγμα υπάρχων Pad με όνομα:", "admin_plugins.available": "Διαθέσιμα πρόσθετα",
"pad.toolbar.bold.title": "Έντονη (Ctrl-B)", "admin_plugins.available_not-found": "Δεν βρέθηκαν πρόσθετα.",
"admin_plugins.available_install.value": "Εγκατάσταση",
"admin_plugins.available_search.placeholder": "Αναζητήστε πρόσθετα για εγκατάσταση",
"admin_plugins.description": "Περιγραφή",
"admin_plugins.installed": "Εγκατεστημένα πρόσθετα",
"admin_plugins.installed_nothing": "Δεν έχετε εγκαταστήσει πρόσθετα ακόμη.",
"admin_plugins.installed_uninstall.value": "Απεγκατάσταση",
"admin_plugins.last-update": "Τελευταία ενημέρωση",
"admin_plugins.name": "Όνομα",
"admin_plugins.page-title": "Διαχειριστής πρόσθετων - Etherpad",
"admin_plugins.version": "Έκδοση",
"admin_plugins_info": "Πληροφορίες αντιμετώπισης προβλημάτων",
"admin_plugins_info.hooks": "Εγκατεστημένα άγκιστρα",
"admin_plugins_info.hooks_server": "Άγκιστρα από την πλευρά του διακομιστή",
"admin_plugins_info.parts": "Εγκατεστημένα εξαρτήματα",
"admin_plugins_info.plugins": "Εγκατεστημένα πρόσθετα",
"admin_plugins_info.page-title": "Πληροφορίες πρόσθετου - Etherpad",
"admin_plugins_info.version": "Έκδοση Etherpad",
"admin_plugins_info.version_latest": "Τελευταία διαθέσιμη έκδοση",
"admin_plugins_info.version_number": "Αριθμός έκδοσης",
"admin_settings": "Ρυθμίσεις",
"admin_settings.current": "Τρέχουσα διαμόρφωση",
"admin_settings.current_example-devel": "Παράδειγμα προτύπου ρυθμίσεων ανάπτυξης",
"admin_settings.current_example-prod": "Παράδειγμα προτύπου ρυθμίσεων παραγωγής",
"admin_settings.current_restart.value": "Επανεκκινήστε το Etherpad",
"admin_settings.current_save.value": "Αποθήκευση Ρυθμίσεων",
"admin_settings.page-title": "Ρυθμίσεις - Etherpad",
"index.newPad": "Νέος Κοινόχρηστος Πίνακας",
"index.createOpenPad": "ή δημιουργία/άνοιγμα ενός κοινόχρηστου πίνακα με όνομα:",
"index.openPad": "άνοιγμα υπάρχοντος κοινόχρηστού πίνακα με όνομα:",
"pad.toolbar.bold.title": "Έντονα (Ctrl-B)",
"pad.toolbar.italic.title": "Πλάγια (Ctrl-I)", "pad.toolbar.italic.title": "Πλάγια (Ctrl-I)",
"pad.toolbar.underline.title": "Υπογράμμιση (Ctrl-U)", "pad.toolbar.underline.title": "Υπογραμμισμένα (Ctrl-U)",
"pad.toolbar.strikethrough.title": "Διακριτή διαγραφή (Ctrl+5)", "pad.toolbar.strikethrough.title": "Διακριτή διαγραφή (Ctrl+5)",
"pad.toolbar.ol.title": "Ταξινομημένη λίστα (Ctrl+Shift+N)", "pad.toolbar.ol.title": "Ταξινομημένη λίστα (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Λίστα χωρίς σειρά (Ctrl+Shift+L)", "pad.toolbar.ul.title": "Λίστα χωρίς ταξινόμηση (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Αριστερά εσοχή (TAB)", "pad.toolbar.indent.title": "Εσοχή (TAB)",
"pad.toolbar.unindent.title": "Δεξιά εσοχή (Shift+TAB)", "pad.toolbar.unindent.title": "Εσοχή (Shift+TAB)",
"pad.toolbar.undo.title": "Αναίρεση (Ctrl-Z)", "pad.toolbar.undo.title": "Αναίρεση (Ctrl-Z)",
"pad.toolbar.redo.title": "Επανάληψη (Ctrl-Y)", "pad.toolbar.redo.title": "Επανάληψη (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "Εκκαθάριση των χρωμάτων των συντακτών (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "Εκκαθάριση χρωμάτων σύνταξης κειμένου (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Εισαγωγή/Εξαγωγή από/σε διαφορετικούς τύπους αρχείων", "pad.toolbar.import_export.title": "Εισαγωγή/Εξαγωγή από/σε διαφορετικούς τύπους αρχείων",
"pad.toolbar.timeslider.title": "Χρονοδιάγραμμα", "pad.toolbar.timeslider.title": "Χρονοδιάγραμμα",
"pad.toolbar.savedRevision.title": "Αποθήκευση Αναθεώρησης", "pad.toolbar.savedRevision.title": "Αποθήκευση Αναθεώρησης",
"pad.toolbar.settings.title": "Ρυθμίσεις", "pad.toolbar.settings.title": "Ρυθμίσεις",
"pad.toolbar.embed.title": "Διαμοίραση και Ενσωμάτωση αυτού του pad", "pad.toolbar.embed.title": "Διαμοίραση και Ενσωμάτωση αυτού του κοινόχρηστου πίνακα",
"pad.toolbar.showusers.title": "Εμφάνιση των χρηστών αυτού του pad", "pad.toolbar.showusers.title": "Εμφάνιση των χρηστών αυτού του κοινόχρηστου πίνακα",
"pad.colorpicker.save": "Αποθήκευση", "pad.colorpicker.save": "Αποθήκευση",
"pad.colorpicker.cancel": "Άκυρο", "pad.colorpicker.cancel": "Ακύρωση",
"pad.loading": "Φόρτωση...", "pad.loading": "Φόρτωση...",
"pad.noCookie": "Το cookie δεν βρέθηκε. Παρακαλώ επιτρέψτε τα cookies στον περιηγητή σας! Η περίοδος σύνδεσης και οι ρυθμίσεις σας δεν θα αποθηκευτούν μεταξύ των επισκέψεων. Αυτό μπορεί να οφείλεται στο ότι το Etherpad περιλαμβάνεται σε ένα iFrame σε ορισμένα προγράμματα περιήγησης. Βεβαιωθείτε ότι το Etherpad βρίσκεται στον ίδιο υποτομέα/τομέα με το γονικό iFrame", "pad.noCookie": "Το cookie δε βρέθηκε. Παρακαλούμε επιτρέψτε τα cookies στο φυλλομετρητή σας! Η περίοδος σύνδεσης και οι ρυθμίσεις σας δε θα αποθηκευτούν μεταξύ των επισκέψεων. Αυτό μπορεί να οφείλεται επειδή το Etherpad περιλαμβάνεται στο iFrame σε ορισμένα προγράμματα πλοήγησης. Παρακαλούμε βεβαιωθείτε ότι το Etherpad βρίσκεται στον ίδιο υποτομέα/τομέα με το iFrame",
"pad.permissionDenied": "Δεν έχετε δικαίωμα πρόσβασης σε αυτό το pad", "pad.permissionDenied": "Δεν έχετε δικαίωμα πρόσβασης σε αυτόν τον κοινόχρηστο πίνακα",
"pad.settings.padSettings": "Ρυθμίσεις Pad", "pad.settings.padSettings": "Ρυθμίσεις κοινόχρηστου πίνακα",
"pad.settings.myView": "Η προβολή μου", "pad.settings.myView": "Η προβολή μου",
"pad.settings.stickychat": "Να είναι πάντα ορατή η συνομιλία", "pad.settings.stickychat": "Να είναι πάντα ορατή η συνομιλία",
"pad.settings.chatandusers": "Εμφάνιση Συνομιλίας και Χρηστών", "pad.settings.chatandusers": "Εμφάνιση Συνομιλίας και Χρηστών",
@ -63,7 +94,7 @@
"pad.modals.reconnecttimer": "Προσπάθεια επανασύνδεσης σε", "pad.modals.reconnecttimer": "Προσπάθεια επανασύνδεσης σε",
"pad.modals.cancel": "Ακύρωση", "pad.modals.cancel": "Ακύρωση",
"pad.modals.userdup": "Ανοιγμένο σε άλλο παράθυρο", "pad.modals.userdup": "Ανοιγμένο σε άλλο παράθυρο",
"pad.modals.userdup.explanation": "Αυτό το pad φαίνεται να είναι ανοιχτό σε περισσότερα από ένα παράθυρο του προγράμματος περιήγησης σε αυτόν τον υπολογιστή.", "pad.modals.userdup.explanation": "Αυτός ο κοινόχρηστος πίνακας φαίνεται να είναι ανοιχτός σε περισσότερα από ένα παράθυρο του προγράμματος περιήγησης σε αυτόν τον υπολογιστή.",
"pad.modals.userdup.advice": "Επανασυνδεθείτε για να χρησιμοποιήσετε αυτό το παράθυρο.", "pad.modals.userdup.advice": "Επανασυνδεθείτε για να χρησιμοποιήσετε αυτό το παράθυρο.",
"pad.modals.unauth": "Δεν επιτρέπεται", "pad.modals.unauth": "Δεν επιτρέπεται",
"pad.modals.unauth.explanation": "Τα δικαιώματά σας άλλαξαν όσο βλέπατε αυτήν τη σελίδα. Δοκιμάστε να επανασυνδεθείτε.", "pad.modals.unauth.explanation": "Τα δικαιώματά σας άλλαξαν όσο βλέπατε αυτήν τη σελίδα. Δοκιμάστε να επανασυνδεθείτε.",
@ -80,6 +111,7 @@
"pad.modals.corruptPad.cause": "Αυτό μπορεί να οφείλεται σε ένα λάθος στη ρύθμιση του διακομιστή ή κάποια άλλη απρόβλεπτη συμπεριφορά. Παρακαλώ επικοινωνήστε με τον διαχειριστή της υπηρεσίας.", "pad.modals.corruptPad.cause": "Αυτό μπορεί να οφείλεται σε ένα λάθος στη ρύθμιση του διακομιστή ή κάποια άλλη απρόβλεπτη συμπεριφορά. Παρακαλώ επικοινωνήστε με τον διαχειριστή της υπηρεσίας.",
"pad.modals.deleted": "Διεγράφη.", "pad.modals.deleted": "Διεγράφη.",
"pad.modals.deleted.explanation": "Αυτό το pad έχει καταργηθεί.", "pad.modals.deleted.explanation": "Αυτό το pad έχει καταργηθεί.",
"pad.modals.rejected.explanation": "Ο διακομιστής απέρριψε ένα μήνυμα που στάλθηκε από το πρόγραμμα περιήγησής σας.",
"pad.modals.disconnected": "Είστε αποσυνδεδεμένοι.", "pad.modals.disconnected": "Είστε αποσυνδεδεμένοι.",
"pad.modals.disconnected.explanation": "Χάθηκε η σύνδεση με τον διακομιστή", "pad.modals.disconnected.explanation": "Χάθηκε η σύνδεση με τον διακομιστή",
"pad.modals.disconnected.cause": "Ο διακομιστής μπορεί να μην είναι διαθέσιμος. Παρακαλούμε ειδοποιήστε τον διαχειριστή της υπηρεσίας εάν εξακολουθεί να συμβαίνει αυτό.", "pad.modals.disconnected.cause": "Ο διακομιστής μπορεί να μην είναι διαθέσιμος. Παρακαλούμε ειδοποιήστε τον διαχειριστή της υπηρεσίας εάν εξακολουθεί να συμβαίνει αυτό.",

View file

@ -2,8 +2,10 @@
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Armando-Martin", "Armando-Martin",
"DDPAT",
"Dgstranz", "Dgstranz",
"Fitoschido", "Fitoschido",
"Ice bulldog",
"Jacobo", "Jacobo",
"Joker", "Joker",
"Larjona", "Larjona",
@ -98,7 +100,7 @@
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Solo es posible importar texto sin formato o en HTML. Para obtener funciones de importación más avanzadas es necesario <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instalar AbiWord</a>.", "pad.importExport.abiword.innerHTML": "Solo es posible importar texto sin formato o en HTML. Para obtener funciones de importación más avanzadas es necesario <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instalar AbiWord</a>.",
"pad.modals.connected": "Conectado.", "pad.modals.connected": "Conectado.",
"pad.modals.reconnecting": "Reconectando a tu pad..", "pad.modals.reconnecting": "Reconectando a tu pad...",
"pad.modals.forcereconnect": "Forzar reconexión", "pad.modals.forcereconnect": "Forzar reconexión",
"pad.modals.reconnecttimer": "Se intentará reconectar en", "pad.modals.reconnecttimer": "Se intentará reconectar en",
"pad.modals.cancel": "Cancelar", "pad.modals.cancel": "Cancelar",

View file

@ -2,6 +2,7 @@
"@metadata": { "@metadata": {
"authors": [ "authors": [
"BMRG14", "BMRG14",
"Beginneruser",
"Dalba", "Dalba",
"Ebraminio", "Ebraminio",
"FarsiNevis", "FarsiNevis",
@ -12,7 +13,7 @@
"الناز" "الناز"
] ]
}, },
"admin.page-title": "داشبورد مدیر - اترپد", "admin.page-title": "پیش‌خوان مدیر - اترپد",
"admin_plugins": "مدیریت افزونه", "admin_plugins": "مدیریت افزونه",
"admin_plugins.available": "افزونه‌های موجود", "admin_plugins.available": "افزونه‌های موجود",
"admin_plugins.available_not-found": "هیچ افزونه‌ای یافت نشد.", "admin_plugins.available_not-found": "هیچ افزونه‌ای یافت نشد.",
@ -59,7 +60,7 @@
"pad.toolbar.undo.title": "باطل‌کردن (Ctrl-Z)", "pad.toolbar.undo.title": "باطل‌کردن (Ctrl-Z)",
"pad.toolbar.redo.title": "از نو (Ctrl-Y)", "pad.toolbar.redo.title": "از نو (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "پاک‌کردن رنگ‌های نویسندگی (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "پاک‌کردن رنگ‌های نویسندگی (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "درون‌ریزی/برون‌ریزی از/به قالب‌های مختلف", "pad.toolbar.import_export.title": "درون‌ریزی/برون‌بری از/به قالب‌های مختلف پرونده",
"pad.toolbar.timeslider.title": "لغزندهٔ زمان", "pad.toolbar.timeslider.title": "لغزندهٔ زمان",
"pad.toolbar.savedRevision.title": "ذخیره‌سازی نسخه", "pad.toolbar.savedRevision.title": "ذخیره‌سازی نسخه",
"pad.toolbar.settings.title": "تنظیمات", "pad.toolbar.settings.title": "تنظیمات",
@ -82,10 +83,10 @@
"pad.settings.language": "زبان:", "pad.settings.language": "زبان:",
"pad.settings.about": "درباره", "pad.settings.about": "درباره",
"pad.settings.poweredBy": "قدرست‌گرفته از", "pad.settings.poweredBy": "قدرست‌گرفته از",
"pad.importExport.import_export": "درون‌ریزی/برون‌ریزی", "pad.importExport.import_export": "درون‌ریزی/برون‌بری",
"pad.importExport.import": "بارگذاری پرونده‌ی متنی یا سند", "pad.importExport.import": "بارگذاری پرونده‌ی متنی یا سند",
"pad.importExport.importSuccessful": "موفقیت آمیز بود!", "pad.importExport.importSuccessful": "موفقیت آمیز بود!",
"pad.importExport.export": "برون‌ریزی این دفترچه یادداشت با قالب:", "pad.importExport.export": "برون‌بری این دفترچه یادداشت با قالب:",
"pad.importExport.exportetherpad": "اترپد", "pad.importExport.exportetherpad": "اترپد",
"pad.importExport.exporthtml": "HTML", "pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "متن ساده", "pad.importExport.exportplain": "متن ساده",
@ -133,7 +134,7 @@
"timeslider.toolbar.returnbutton": "بازگشت به دفترچه یادداشت", "timeslider.toolbar.returnbutton": "بازگشت به دفترچه یادداشت",
"timeslider.toolbar.authors": "نویسندگان:", "timeslider.toolbar.authors": "نویسندگان:",
"timeslider.toolbar.authorsList": "بدون نویسنده", "timeslider.toolbar.authorsList": "بدون نویسنده",
"timeslider.toolbar.exportlink.title": "برون‌ریزی", "timeslider.toolbar.exportlink.title": "برون‌بری",
"timeslider.exportCurrent": "برون‌ریزی نگارش کنونی به عنوان:", "timeslider.exportCurrent": "برون‌ریزی نگارش کنونی به عنوان:",
"timeslider.version": "نگارش {{version}}", "timeslider.version": "نگارش {{version}}",
"timeslider.saved": "{{month}} {{day}}، {{year}} ذخیره شد", "timeslider.saved": "{{month}} {{day}}، {{year}} ذخیره شد",
@ -163,9 +164,9 @@
"pad.impexp.importing": "در حال درون‌ریزی...", "pad.impexp.importing": "در حال درون‌ریزی...",
"pad.impexp.confirmimport": "با درون‌ریزی یک پرونده نوشتهٔ کنونی دفترچه پاک می‌شود. آیا می‌خواهید ادامه دهید؟", "pad.impexp.confirmimport": "با درون‌ریزی یک پرونده نوشتهٔ کنونی دفترچه پاک می‌شود. آیا می‌خواهید ادامه دهید؟",
"pad.impexp.convertFailed": "ما نمی‌توانیم این پرونده را درون‌ریزی کنیم. خواهشمندیم قالب دیگری برای سندتان انتخاب کرده یا بصورت دستی آنرا کپی کنید", "pad.impexp.convertFailed": "ما نمی‌توانیم این پرونده را درون‌ریزی کنیم. خواهشمندیم قالب دیگری برای سندتان انتخاب کرده یا بصورت دستی آنرا کپی کنید",
"pad.impexp.padHasData": "امکان درون‌ریز این پرونده نیست زیرا این پد تغییر کرده‌است. لطفاً در پد جدید درون‌ریزی کنید.", "pad.impexp.padHasData": "امکان درون‌ریزی این پرونده نیست زیرا این پد تغییر کرده‌است. لطفاً در پد جدید درون‌ریزی کنید.",
"pad.impexp.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید", "pad.impexp.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید",
"pad.impexp.importfailed": "درون‌ریزی انجام نشد", "pad.impexp.importfailed": "درون‌ریزی انجام نشد",
"pad.impexp.copypaste": "کپی پیست کنید", "pad.impexp.copypaste": "کپی پیست کنید",
"pad.impexp.exportdisabled": "برون‌ریزی با قالب {{type}} از کار افتاده است. برای جزئیات بیشتر با مدیر سیستمتان تماس بگیرید." "pad.impexp.exportdisabled": "برون‌ریزی با قالب {{type}} از کار افتاده است. برای جزئیات بیشتر با مدیر سامانه خودتان تماس بگیرید."
} }

167
src/locales/ff.json Normal file
View file

@ -0,0 +1,167 @@
{
"@metadata": {
"authors": [
"Ibrahima Malal Sarr"
]
},
"admin.page-title": "Tiimtorde Jiiloowo - Etherpad",
"admin_plugins": "Toppitorde Ceŋe",
"admin_plugins.available": "Ceŋe goodaaɗe",
"admin_plugins.available_not-found": "Alaa ceŋe njiytaa.",
"admin_plugins.available_fetching": "Nana balloo…",
"admin_plugins.available_install.value": "Aaf",
"admin_plugins.available_search.placeholder": "Yiylo ceŋe aafeteeɗe",
"admin_plugins.description": "Cifol",
"admin_plugins.installed": "Ceŋe aafaaɗe",
"admin_plugins.installed_fetching": "Nana yiyloo ceŋe aafaaɗe…",
"admin_plugins.installed_nothing": "A aafaani ceŋe tawo.",
"admin_plugins.installed_uninstall.value": "Aaftu",
"admin_plugins.last-update": "Kesɗitinal cakkitiingal",
"admin_plugins.name": "Innde",
"admin_plugins.page-title": "Toppitorde ceŋe - Etherpad",
"admin_plugins.version": "Yamre",
"admin_plugins_info": "Humpito njiylaw caɗe",
"admin_plugins_info.hooks": "Logge aafaaɗe",
"admin_plugins_info.hooks_client": "Logge senngo-kuutoro",
"admin_plugins_info.hooks_server": "Logge senngo-sarworde",
"admin_plugins_info.parts": "Terɗe aafaaɗe",
"admin_plugins_info.plugins": "Ceŋe aafaaɗe",
"admin_plugins_info.page-title": "Humpito ceŋe - Etherpad",
"admin_plugins_info.version": "Yamre Etherpad",
"admin_plugins_info.version_latest": "Yamre sakkitiinde woodunde",
"admin_plugins_info.version_number": "Tonngoode yamre",
"admin_settings": "Teelte",
"admin_settings.current": "Teeltannde wonaango",
"admin_settings.current_example-devel": "Yeru tugnorgal teelte topagol",
"admin_settings.current_example-prod": "Yeru tugnorgal teelte baayino",
"admin_settings.current_restart.value": "Hurmitin Etherpad",
"admin_settings.current_save.value": "Danndu Teelte",
"admin_settings.page-title": "Teelte - Etherpad",
"index.newPad": "Alluwal Kesal",
"index.createOpenPad": "walla sos/uddit Alluwal e innde:",
"index.openPad": "Uddit paɗo woodungo e ndee innde:",
"pad.toolbar.bold.title": "Buutol (Ctrl+B)",
"pad.toolbar.italic.title": "Italik (Ctrl+I)",
"pad.toolbar.underline.title": "Diidoles (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Baar (Ctrl+5)",
"pad.toolbar.ol.title": "Doggol leemtangol(Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Doggol ngol lemtaaka",
"pad.toolbar.indent.title": "Ɓeydu taaɓal (TAB)",
"pad.toolbar.unindent.title": "Ruttu taaɓal (Shift+TAB)",
"pad.toolbar.undo.title": "Firtu (Ctrl+Z)",
"pad.toolbar.redo.title": "Waɗtu (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Momtu Noone Wallifɓe (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Jiggo/Jiggito iwde/faade mbayka piille goɗɗe",
"pad.toolbar.timeslider.title": "Daasorde tuma",
"pad.toolbar.savedRevision.title": "Dannde Baylital",
"pad.toolbar.settings.title": "Teelte",
"pad.toolbar.embed.title": "Lollin maa soomtor ngoo faɗo",
"pad.toolbar.showusers.title": "Hollu huutorɓe e ngoo faɗo",
"pad.colorpicker.save": "Danndu",
"pad.colorpicker.cancel": "Haaytin",
"pad.loading": "Nana loowa...",
"pad.noCookie": "Kukii yiytaaka. Tiiɗno yamir kukiije e wanngorde maa!\nNaatal maa e teelte maa danndetaake hakkunde njulluuji. Ɗuum ena waawi tawa Etherpad ena soomaa e nder iFrame e won e banngorɗe. Tiiɗno ƴeewto so Etherpad woni ko e domen/lesdomen iFrame yumma oo.",
"pad.permissionDenied": "A alaa yamiroore naatde e ngoo faɗo",
"pad.settings.padSettings": "Teelte Faɗo",
"pad.settings.myView": "Jiytol am",
"pad.settings.stickychat": "Yeewtere e yaynirde sahaa kala",
"pad.settings.chatandusers": "Hollu Yeewtere e Huutorɓe",
"pad.settings.colorcheck": "Noone Wallifɓe",
"pad.settings.linenocheck": "Tonngooɗe gori",
"pad.settings.rtlcheck": "Tar loowdi iwde ñaamo faya nano?",
"pad.settings.fontType": "Fannu binndi:",
"pad.settings.language": "Ɗemngal:",
"pad.settings.about": "Baɗte",
"pad.settings.poweredBy": "Dognata ko",
"pad.importExport.import_export": "Jiggo/Jiggito",
"pad.importExport.import": "Yollu fiilde binndol maa fiilannde",
"pad.importExport.importSuccessful": "Ɓennii no haaniri!",
"pad.importExport.export": "Jiggito faɗo wonaango e innde:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Binndi ɓolɓolti",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Mbaaw-ɗaa jiggaade tan ko baykaaji binndi ɓolɓolti maa HTML. Ngam heɓde fannuuji jiggagol ɓurɗi seeɓde, tiiɗno yillo <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">install AbiWord or LibreOffice</a>.",
"pad.modals.connected": "Seŋiima.",
"pad.modals.reconnecting": "Nana seŋoo e faɗo maa…",
"pad.modals.forcereconnect": "Forsu ceŋagol kadi",
"pad.modals.reconnecttimer": "Nana etoo seŋaade kadi ɗoo e",
"pad.modals.cancel": "Haaytin",
"pad.modals.userdup": "Uddit e henorde woɗnde",
"pad.modals.userdup.explanation": "Ngoo faɗo ellee ena udditii e ko ɓuri henorde wanngorde wootere e ndee komputere.",
"pad.modals.userdup.advice": "Seŋo kadi ngam huutoraade ndee henorde kisa.",
"pad.modals.unauth": "Yamiraaka",
"pad.modals.unauth.explanation": "Jamirooje maa mbayliima tuma nde ƴeewataa ngoo hello. Eto seŋaade kadi.",
"pad.modals.looping.explanation": "Caɗeele jokkondiral ena ngoodi faade e sarworde canngoɗinal ndee.",
"pad.modals.looping.cause": "Ma a taw ko a ceŋoriiɗo proxy maa ɓalal-jayngue.",
"pad.modals.initsocketfail": "Sorworde heɓotaako.",
"pad.modals.initsocketfail.explanation": "Horiima seŋaade e sarworde canngoɗinal ndee.",
"pad.modals.initsocketfail.cause": "Ɗuum ena gasa waɗi ɗum ko saɗeede wonnde e wanngorde maa maa ceŋol Enternet maa.",
"pad.modals.slowcommit.explanation": "Sarworde ndee jaabaaki.",
"pad.modals.slowcommit.cause": "Ɗuum ena gasa ko caɗeele ceŋagol laylaytol.",
"pad.modals.badChangeset.explanation": "Taƴtol ngol mbaɗ-ɗaa joopaama rewaani laawol to sarworde canngoɗinal ndee.",
"pad.modals.badChangeset.cause": "Ɗuum ena gasa ko teeltol sarworde ngol moƴƴaani maa geɗel ngel tijjanooka. Tiiɗno jokkondir e jiiloowo sarwiis oo, so aɗa sikki ɗuum ko juumre. Eto seŋaade kadi ngam jokkude taƴtagol maa.",
"pad.modals.corruptPad.explanation": "Faɗo ngo etoto-ɗaa naatde ngoo nattii moƴƴude.",
"pad.modals.corruptPad.cause": "Ɗuum ena gasa addi ɗum ko teeltol sarworde ngol feewaani maa geɗel ngel tijjanooka. Tiiɗno jokkondir e jiiloowo.",
"pad.modals.deleted": "Momtaama.",
"pad.modals.deleted.explanation": "Ngoo faɗo ko momtaango.",
"pad.modals.rateLimited": "Cookol happinaama.",
"pad.modals.rateLimited.explanation": "A neldii ɓatakuuje keewɗe haa ɓurti e ngoo faɗo, wadde e seŋtaama.",
"pad.modals.rejected.explanation": "Sarworde ndee riiwtii ɓatakuru ngu wanngorde maa neldunoo.",
"pad.modals.rejected.cause": "Sarworde ndee ena gasa koko hesɗitinanoo tuma nde ngon-ɗaa e ƴeewde faɗo ngoo, walla ma a taw ena woodi buggere e Etherpad. Eto loowtude hello ngoo.",
"pad.modals.disconnected": "A seŋtaama.",
"pad.modals.disconnected.explanation": "Ceŋagol to sarworde waasaama",
"pad.modals.disconnected.cause": "Sarworde ndee ena gasa heɓotaako. Tiiɗno habru jiiloowo sarwii soo so ɗum nattaani.",
"pad.share": "Lollin ngoo faɗo",
"pad.share.readonly": "Targol tan",
"pad.share.link": "Jokkorde",
"pad.share.emebdcode": "Soomtor URL",
"pad.chat": "Yeewtere",
"pad.chat.title": "Uddit yeewtere ngoo faɗo.",
"pad.chat.loadmessages": "Loow ɓatakuuje goɗɗe",
"pad.chat.stick.title": "Hedde e yaynirde yeewtere",
"pad.chat.writeMessage.placeholder": "Winndu ɗoo ɓatakuru maa",
"timeslider.followContents": "Rewindo kesɗitine loowdi faɗo",
"timeslider.pageTitle": "{{appTitle}} Daasorde tuma",
"timeslider.toolbar.returnbutton": "Rutto to faɗo",
"timeslider.toolbar.authors": "Willifɓe:",
"timeslider.toolbar.authorsList": "Alaa ballifo",
"timeslider.toolbar.exportlink.title": "Jiggito",
"timeslider.exportCurrent": "Jiggito yamre wonaande e innde:",
"timeslider.version": "Yamre {{version}}",
"timeslider.saved": "Danndaama {{month}} {{day}} {{year}}",
"timeslider.playPause": "Tar / Dartin Loowdi Faɗo",
"timeslider.backRevision": "Rutto to baylital e ngoo Faɗo",
"timeslider.forwardRevision": "Yah yeeso to baylital en ngoo Faɗo",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Siilo",
"timeslider.month.february": "Colte",
"timeslider.month.march": "MBooy",
"timeslider.month.april": "Seeɗto",
"timeslider.month.may": "Duujal",
"timeslider.month.june": "Korse",
"timeslider.month.july": "Morso",
"timeslider.month.august": "Juko",
"timeslider.month.september": "Silto",
"timeslider.month.october": "Yarkomaa",
"timeslider.month.november": "Jolal",
"timeslider.month.december": "Bowte",
"timeslider.unnamedauthors": "{{num}} innitaaka {[plural(num) goo: ballifo, goɗɗo: wallifɓe]}",
"pad.savedrevs.marked": "Ndee yamre maantaama jooni ko baylital danndangal",
"pad.savedrevs.timeslider": "Aɗa waawi yiyde baylitte danndaaɗe so yillaade daasorde tuma ndee",
"pad.userlist.entername": " Naatnu innde maa",
"pad.userlist.unnamed": "innitaaki",
"pad.editbar.clearcolors": "Momtu noone wallifɓe e fiilannde ndee fof? Ɗum waawaa firteede",
"pad.impexp.importbutton": "Jiggito Jooni",
"pad.impexp.importing": "Nana Jiggitoo...",
"pad.impexp.confirmimport": "Jiggitaade fiilde maa winndito e dow winndannde wonaande ndee. Aɗa yenanaa yiɗde jokkude?",
"pad.impexp.convertFailed": "Min koriima jiggitaade ndee fiilde. Tiiɗno huutoro mbayka fiilannde ngoɗka walla natto ɗakkiraa junngo",
"pad.impexp.padHasData": "Min koriima jiggitaade ndee fiilde sabu ngoo Faɗo meeɗii wayleede, tiiɗno jiggito faade e faɗo heso",
"pad.impexp.uploadFailed": "Jollugol woorii, tiiɗno fuɗɗito",
"pad.impexp.importfailed": "Jiggitol woorii",
"pad.impexp.copypaste": "Tiiɗno natto ɗakkaa",
"pad.impexp.exportdisabled": "Jiggitaade e mbayka {{type}} koko daaƴaa. Tuuɗno jokkondir e jiiloowo yuɓɓo maa ngam ɓeydude faamade.",
"pad.impexp.maxFileSize": "Fiilde ena mawni haa ɓurti. Jokkondir e jiiloowo ngam ɓeydude ɓetol fiilde jamirangol ngam jiggeede"
}

View file

@ -17,13 +17,15 @@
"Stryn", "Stryn",
"Tomi Toivio", "Tomi Toivio",
"Veikk0.ma", "Veikk0.ma",
"VezonThunder" "VezonThunder",
"Yupik"
] ]
}, },
"admin.page-title": "Ylläpitäjän kojelauta - Etherpad", "admin.page-title": "Ylläpitäjän kojelauta - Etherpad",
"admin_plugins": "Lisäosien hallinta", "admin_plugins": "Lisäosien hallinta",
"admin_plugins.available": "Saatavilla olevat liitännäiset", "admin_plugins.available": "Saatavilla olevat liitännäiset",
"admin_plugins.available_not-found": "Lisäosia ei löytynyt.", "admin_plugins.available_not-found": "Lisäosia ei löytynyt.",
"admin_plugins.available_fetching": "Noudetaan…",
"admin_plugins.available_install.value": "Asenna", "admin_plugins.available_install.value": "Asenna",
"admin_plugins.available_search.placeholder": "Etsi asennettavia laajennuksia", "admin_plugins.available_search.placeholder": "Etsi asennettavia laajennuksia",
"admin_plugins.description": "Kuvaus", "admin_plugins.description": "Kuvaus",
@ -48,6 +50,7 @@
"admin_settings": "Asetukset", "admin_settings": "Asetukset",
"admin_settings.current": "Nykyinen kokoonpano", "admin_settings.current": "Nykyinen kokoonpano",
"admin_settings.current_example-devel": "Esimerkki kehitysasetusten mallista", "admin_settings.current_example-devel": "Esimerkki kehitysasetusten mallista",
"admin_settings.current_restart.value": "Käynnistä Etherpad uudelleen",
"admin_settings.current_save.value": "Tallenna asetukset", "admin_settings.current_save.value": "Tallenna asetukset",
"admin_settings.page-title": "asetukset - Etherpad", "admin_settings.page-title": "asetukset - Etherpad",
"index.newPad": "Uusi muistio", "index.newPad": "Uusi muistio",
@ -166,7 +169,7 @@
"pad.impexp.importing": "Tuodaan...", "pad.impexp.importing": "Tuodaan...",
"pad.impexp.confirmimport": "Tiedoston tuonti korvaa kaiken muistiossa olevan tekstin. Haluatko varmasti jatkaa?", "pad.impexp.confirmimport": "Tiedoston tuonti korvaa kaiken muistiossa olevan tekstin. Haluatko varmasti jatkaa?",
"pad.impexp.convertFailed": "TIedoston tuonti epäonnistui. Käytä eri tiedostomuotoa tai kopioi ja liitä käsin.", "pad.impexp.convertFailed": "TIedoston tuonti epäonnistui. Käytä eri tiedostomuotoa tai kopioi ja liitä käsin.",
"pad.impexp.padHasData": "Tiedostoa ei voitu lisätä lehtiöön, koska lehtiötä on jo muokattu ole hyvä ja lisää tiedosto uuteen lehtiöön", "pad.impexp.padHasData": "Tiedostoa ei voitu lisätä muistioon, koska muistiota on jo muokattu ole hyvä ja lisää tiedosto uuteen muistioon",
"pad.impexp.uploadFailed": "Lähetys epäonnistui. Yritä uudelleen.", "pad.impexp.uploadFailed": "Lähetys epäonnistui. Yritä uudelleen.",
"pad.impexp.importfailed": "Tuonti epäonnistui", "pad.impexp.importfailed": "Tuonti epäonnistui",
"pad.impexp.copypaste": "Kopioi ja liitä", "pad.impexp.copypaste": "Kopioi ja liitä",

View file

@ -65,17 +65,17 @@
"index.newPad": "Nouveau bloc-notes", "index.newPad": "Nouveau bloc-notes",
"index.createOpenPad": "ou créer/ouvrir un bloc-notes intitulé:", "index.createOpenPad": "ou créer/ouvrir un bloc-notes intitulé:",
"index.openPad": "ouvrir un bloc-note existant avec le nom:", "index.openPad": "ouvrir un bloc-note existant avec le nom:",
"pad.toolbar.bold.title": "Gras (Ctrl+B)", "pad.toolbar.bold.title": "Gras (Ctrl+B)",
"pad.toolbar.italic.title": "Italique (Ctrl+I)", "pad.toolbar.italic.title": "Italique (Ctrl+I)",
"pad.toolbar.underline.title": "Souligné (Ctrl+U)", "pad.toolbar.underline.title": "Souligné (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Barré (Ctrl+5)", "pad.toolbar.strikethrough.title": "Barré (Ctrl+5)",
"pad.toolbar.ol.title": "Liste ordonnée (Ctrl+Shift+N)", "pad.toolbar.ol.title": "Liste ordonnée (Ctrl+Maj+N)",
"pad.toolbar.ul.title": "Liste non ordonnée (Ctrl+Shift+L)", "pad.toolbar.ul.title": "Liste non ordonnée (Ctrl+Maj+L)",
"pad.toolbar.indent.title": "Indenter (TAB)", "pad.toolbar.indent.title": "Indenter (TAB)",
"pad.toolbar.unindent.title": "Désindenter (Maj+TAB)", "pad.toolbar.unindent.title": "Désindenter (Maj+TAB)",
"pad.toolbar.undo.title": "Annuler (Ctrl+Z)", "pad.toolbar.undo.title": "Annuler (Ctrl+Z)",
"pad.toolbar.redo.title": "Rétablir (Ctrl+Y)", "pad.toolbar.redo.title": "Rétablir (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Effacer le surlignage par auteur (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "Effacer le surlignage par auteur (Ctrl+Maj+C)",
"pad.toolbar.import_export.title": "Importer/Exporter des formats de fichiers différents", "pad.toolbar.import_export.title": "Importer/Exporter des formats de fichiers différents",
"pad.toolbar.timeslider.title": "Historique dynamique", "pad.toolbar.timeslider.title": "Historique dynamique",
"pad.toolbar.savedRevision.title": "Enregistrer la révision", "pad.toolbar.savedRevision.title": "Enregistrer la révision",
@ -84,7 +84,7 @@
"pad.toolbar.showusers.title": "Afficher les utilisateurs du bloc-notes", "pad.toolbar.showusers.title": "Afficher les utilisateurs du bloc-notes",
"pad.colorpicker.save": "Enregistrer", "pad.colorpicker.save": "Enregistrer",
"pad.colorpicker.cancel": "Annuler", "pad.colorpicker.cancel": "Annuler",
"pad.loading": "Chargement...", "pad.loading": "Chargement en cours...",
"pad.noCookie": "Un fichier témoin (ou ''cookie'') na pas pu être trouvé. Veuillez autoriser les fichiers témoins dans votre navigateur! Votre session et vos paramètres ne seront pas enregistrés entre les visites. Cela peut être dû au fait quEtherpad est inclus dans un ''iFrame'' dans certains navigateurs. Veuillez vous assurer quEtherpad est dans le même sous-domaine/domaine que son ''iFrame'' parent.", "pad.noCookie": "Un fichier témoin (ou ''cookie'') na pas pu être trouvé. Veuillez autoriser les fichiers témoins dans votre navigateur! Votre session et vos paramètres ne seront pas enregistrés entre les visites. Cela peut être dû au fait quEtherpad est inclus dans un ''iFrame'' dans certains navigateurs. Veuillez vous assurer quEtherpad est dans le même sous-domaine/domaine que son ''iFrame'' parent.",
"pad.permissionDenied": "Vous nêtes pas autorisé à accéder à ce bloc-notes", "pad.permissionDenied": "Vous nêtes pas autorisé à accéder à ce bloc-notes",
"pad.settings.padSettings": "Paramètres du bloc-notes", "pad.settings.padSettings": "Paramètres du bloc-notes",
@ -177,11 +177,11 @@
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: auteur anonyme, other: auteurs anonymes ]}", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: auteur anonyme, other: auteurs anonymes ]}",
"pad.savedrevs.marked": "Cette révision est maintenant marquée comme révision enregistrée", "pad.savedrevs.marked": "Cette révision est maintenant marquée comme révision enregistrée",
"pad.savedrevs.timeslider": "Vous pouvez voir les révisions enregistrées en ouvrant lhistorique", "pad.savedrevs.timeslider": "Vous pouvez voir les révisions enregistrées en ouvrant lhistorique",
"pad.userlist.entername": "Entrez votre nom", "pad.userlist.entername": "Saisissez votre nom",
"pad.userlist.unnamed": "anonyme", "pad.userlist.unnamed": "anonyme",
"pad.editbar.clearcolors": "Effacer le surlignage par auteur dans tout le document? Cette action ne peut être annulée.", "pad.editbar.clearcolors": "Effacer le surlignage par auteur dans tout le document? Cette action ne peut être annulée.",
"pad.impexp.importbutton": "Importer maintenant", "pad.impexp.importbutton": "Importer maintenant",
"pad.impexp.importing": "Import en cours...", "pad.impexp.importing": "Importation en cours...",
"pad.impexp.confirmimport": "Importer un fichier écrasera le contenu actuel du bloc-notes. Êtes-vous sûr de vouloir le faire?", "pad.impexp.confirmimport": "Importer un fichier écrasera le contenu actuel du bloc-notes. Ê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 manuellement un copier/coller du texte brut", "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire manuellement un copier/coller du texte brut",
"pad.impexp.padHasData": "Nous navons pas pu importer ce fichier parce que ce bloc-notes a déjà été modifié; veuillez limporter vers un nouveau bloc-notes.", "pad.impexp.padHasData": "Nous navons pas pu importer ce fichier parce que ce bloc-notes a déjà été modifié; veuillez limporter vers un nouveau bloc-notes.",

View file

@ -48,13 +48,13 @@
"pad.toolbar.strikethrough.title": "Riscar (Ctrl+5)", "pad.toolbar.strikethrough.title": "Riscar (Ctrl+5)",
"pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)", "pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Lista sen ordenar (Ctrl+Shift+L)", "pad.toolbar.ul.title": "Lista sen ordenar (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Sangría (TAB)", "pad.toolbar.indent.title": "Sangrar (TAB)",
"pad.toolbar.unindent.title": "Sen sangría (Maiús.+TAB)", "pad.toolbar.unindent.title": "Sen sangrar (Maiús.+TAB)",
"pad.toolbar.undo.title": "Desfacer (Ctrl-Z)", "pad.toolbar.undo.title": "Desfacer (Ctrl-Z)",
"pad.toolbar.redo.title": "Refacer (Ctrl-Y)", "pad.toolbar.redo.title": "Refacer (Ctrl-Y)",
"pad.toolbar.clearAuthorship.title": "Eliminar as cores que identifican ás autoras (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "Eliminar as cores que identifican ás participantes (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importar/Exportar desde/a diferentes formatos de ficheiro", "pad.toolbar.import_export.title": "Importar/Exportar desde/a diferentes formatos de ficheiro",
"pad.toolbar.timeslider.title": "Liña do tempo", "pad.toolbar.timeslider.title": "Cronoloxía",
"pad.toolbar.savedRevision.title": "Gardar a revisión", "pad.toolbar.savedRevision.title": "Gardar a revisión",
"pad.toolbar.settings.title": "Axustes", "pad.toolbar.settings.title": "Axustes",
"pad.toolbar.embed.title": "Compartir e incorporar este documento", "pad.toolbar.embed.title": "Compartir e incorporar este documento",
@ -65,9 +65,9 @@
"pad.noCookie": "Non se puido atopar a cookie. Por favor, habilita as cookies no teu navegador! A túa sesión e axustes non se gardarán entre visitas. Esto podería deberse a que Etherpad está incluído nalgún iFrame nalgúns navegadores. Asegúrate de que Etherpad está no mesmo subdominio/dominio que o iFrame pai", "pad.noCookie": "Non se puido atopar a cookie. Por favor, habilita as cookies no teu navegador! A túa sesión e axustes non se gardarán entre visitas. Esto podería deberse a que Etherpad está incluído nalgún iFrame nalgúns navegadores. Asegúrate de que Etherpad está no mesmo subdominio/dominio que o iFrame pai",
"pad.permissionDenied": "Non tes permiso para acceder a este documento", "pad.permissionDenied": "Non tes permiso para acceder a este documento",
"pad.settings.padSettings": "Configuracións do documento", "pad.settings.padSettings": "Configuracións do documento",
"pad.settings.myView": "A miña vista", "pad.settings.myView": "Ver",
"pad.settings.stickychat": "Chat sempre visible", "pad.settings.stickychat": "Chat sempre visible",
"pad.settings.chatandusers": "Mostrar o chat e os usuarios", "pad.settings.chatandusers": "Mostrar o chat e as usuarias",
"pad.settings.colorcheck": "Cores de identificación", "pad.settings.colorcheck": "Cores de identificación",
"pad.settings.linenocheck": "Números de liña", "pad.settings.linenocheck": "Números de liña",
"pad.settings.rtlcheck": "Queres ler o contido da dereita á esquerda?", "pad.settings.rtlcheck": "Queres ler o contido da dereita á esquerda?",
@ -88,7 +88,7 @@
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Só podes 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-with-AbiWord\">instala AbiWord</a>.", "pad.importExport.abiword.innerHTML": "Só podes 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-with-AbiWord\">instala AbiWord</a>.",
"pad.modals.connected": "Conectado.", "pad.modals.connected": "Conectado.",
"pad.modals.reconnecting": "Reconectando co teu documento...", "pad.modals.reconnecting": "Reconectando co seu documento...",
"pad.modals.forcereconnect": "Forzar a reconexión", "pad.modals.forcereconnect": "Forzar a reconexión",
"pad.modals.reconnecttimer": "Intentarase reconectar en", "pad.modals.reconnecttimer": "Intentarase reconectar en",
"pad.modals.cancel": "Cancelar", "pad.modals.cancel": "Cancelar",
@ -127,10 +127,10 @@
"pad.chat.stick.title": "Pegar a conversa á pantalla", "pad.chat.stick.title": "Pegar a conversa á pantalla",
"pad.chat.writeMessage.placeholder": "Escribe aquí a túa mensaxe", "pad.chat.writeMessage.placeholder": "Escribe aquí a túa mensaxe",
"timeslider.followContents": "Segue as actualizacións do contido", "timeslider.followContents": "Segue as actualizacións do contido",
"timeslider.pageTitle": "Liña do tempo de {{appTitle}}", "timeslider.pageTitle": "Cronoloxía de {{appTitle}}",
"timeslider.toolbar.returnbutton": "Volver ao documento", "timeslider.toolbar.returnbutton": "Volver ao documento",
"timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authors": "Editoras:",
"timeslider.toolbar.authorsList": "Ningún autor", "timeslider.toolbar.authorsList": "Sen Editoras",
"timeslider.toolbar.exportlink.title": "Exportar", "timeslider.toolbar.exportlink.title": "Exportar",
"timeslider.exportCurrent": "Exportar a versión actual en formato:", "timeslider.exportCurrent": "Exportar a versión actual en formato:",
"timeslider.version": "Versión {{version}}", "timeslider.version": "Versión {{version}}",
@ -151,12 +151,12 @@
"timeslider.month.october": "outubro", "timeslider.month.october": "outubro",
"timeslider.month.november": "novembro", "timeslider.month.november": "novembro",
"timeslider.month.december": "decembro", "timeslider.month.december": "decembro",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: autor anónimo, other: autores anónimos ]}", "timeslider.unnamedauthors": "{{num}} {[plural(num) one: editora anónima, other: editora anónima ]}",
"pad.savedrevs.marked": "Esta revisión está agora marcada como revisión gardada", "pad.savedrevs.marked": "Esta revisión está agora marcada como revisión gardada",
"pad.savedrevs.timeslider": "Pode consultar as revisións gardadas visitando a liña do tempo", "pad.savedrevs.timeslider": "Pode consultar as revisións gardadas visitando a cronoloxía",
"pad.userlist.entername": "Insira o seu nome", "pad.userlist.entername": "Insira o seu nome",
"pad.userlist.unnamed": "anónimo", "pad.userlist.unnamed": "anónimo",
"pad.editbar.clearcolors": "Eliminar as cores relativas aos autores en todo o documento? Non se poderán recuperar", "pad.editbar.clearcolors": "Eliminar as cores relativas ás participantes en todo o documento? Non se poderán recuperar",
"pad.impexp.importbutton": "Importar agora", "pad.impexp.importbutton": "Importar agora",
"pad.impexp.importing": "Importando...", "pad.impexp.importing": "Importando...",
"pad.impexp.confirmimport": "A importación dun ficheiro ha sobrescribir o texto actual do documento. Está seguro de querer continuar?", "pad.impexp.confirmimport": "A importación dun ficheiro ha sobrescribir o texto actual do documento. Está seguro de querer continuar?",

View file

@ -55,7 +55,7 @@
"pad.toolbar.undo.title": "ביטול (Ctrl-Z)", "pad.toolbar.undo.title": "ביטול (Ctrl-Z)",
"pad.toolbar.redo.title": "ביצוע מחדש", "pad.toolbar.redo.title": "ביצוע מחדש",
"pad.toolbar.clearAuthorship.title": "ניקוי צבעי כותבים (Ctrl-Shift-C)", "pad.toolbar.clearAuthorship.title": "ניקוי צבעי כותבים (Ctrl-Shift-C)",
"pad.toolbar.import_export.title": "ייבוא/ייצוא בתסדירי קבצים שונים", "pad.toolbar.import_export.title": "יבוא/יצוא בתסדירי קבצים שונים",
"pad.toolbar.timeslider.title": "גולל זמן", "pad.toolbar.timeslider.title": "גולל זמן",
"pad.toolbar.savedRevision.title": "שמירת גרסה", "pad.toolbar.savedRevision.title": "שמירת גרסה",
"pad.toolbar.settings.title": "הגדרות", "pad.toolbar.settings.title": "הגדרות",
@ -78,17 +78,17 @@
"pad.settings.language": "שפה:", "pad.settings.language": "שפה:",
"pad.settings.about": "על אודות", "pad.settings.about": "על אודות",
"pad.settings.poweredBy": "מופעל על גבי", "pad.settings.poweredBy": "מופעל על גבי",
"pad.importExport.import_export": "ייבוא/ייצוא", "pad.importExport.import_export": "יבוא/יצוא",
"pad.importExport.import": "העלאת כל קובץ טקסט או מסמך", "pad.importExport.import": "העלאת כל קובץ טקסט או מסמך",
"pad.importExport.importSuccessful": "זה עבד!", "pad.importExport.importSuccessful": "זה עבד!",
"pad.importExport.export": "ייצוא הפנקס הנוכחי בתור:", "pad.importExport.export": "יצוא הפנקס הנוכחי בתור:",
"pad.importExport.exportetherpad": "את'רפד", "pad.importExport.exportetherpad": "את'רפד",
"pad.importExport.exporthtml": "HTML", "pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "טקסט רגיל", "pad.importExport.exportplain": "טקסט רגיל",
"pad.importExport.exportword": "מיקרוסופט וורד", "pad.importExport.exportword": "מיקרוסופט וורד",
"pad.importExport.exportpdf": "PDF", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "באפשרותך לייבא מטקסט פשוט או מ־HTML. לאפשרויות ייבוא מתקדמות יותר יש <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">להתקין AbiWord או LibreOffice</a>.", "pad.importExport.abiword.innerHTML": "באפשרותך לייבא מטקסט פשוט או מ־HTML. לאפשרויות יבוא מתקדמות יותר יש <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">להתקין AbiWord או LibreOffice</a>.",
"pad.modals.connected": "מחובר.", "pad.modals.connected": "מחובר.",
"pad.modals.reconnecting": "מתבצע חיבור מחדש למחברת שלך…", "pad.modals.reconnecting": "מתבצע חיבור מחדש למחברת שלך…",
"pad.modals.forcereconnect": "לכפות חיבור מחדש", "pad.modals.forcereconnect": "לכפות חיבור מחדש",
@ -133,8 +133,8 @@
"timeslider.toolbar.returnbutton": "חזרה אל הפנקס", "timeslider.toolbar.returnbutton": "חזרה אל הפנקס",
"timeslider.toolbar.authors": "כותבים:", "timeslider.toolbar.authors": "כותבים:",
"timeslider.toolbar.authorsList": "אין כותבים", "timeslider.toolbar.authorsList": "אין כותבים",
"timeslider.toolbar.exportlink.title": "ייצוא", "timeslider.toolbar.exportlink.title": "יצוא",
"timeslider.exportCurrent": "ייצוא הגרסה הנוכחית בתור:", "timeslider.exportCurrent": "יצוא הגרסה הנוכחית בתור:",
"timeslider.version": "גרסה {{version}}", "timeslider.version": "גרסה {{version}}",
"timeslider.saved": "נשמרה ב־{{day}} ב{{month}} {{year}}", "timeslider.saved": "נשמרה ב־{{day}} ב{{month}} {{year}}",
"timeslider.playPause": "לנגן / לעצור את תוכן הפנקס", "timeslider.playPause": "לנגן / לעצור את תוכן הפנקס",
@ -160,13 +160,13 @@
"pad.userlist.unnamed": "ללא שם", "pad.userlist.unnamed": "ללא שם",
"pad.editbar.clearcolors": "לנקות צבעים לסימון כותבים בכל המסמך? זו פעולה בלתי הפיכה", "pad.editbar.clearcolors": "לנקות צבעים לסימון כותבים בכל המסמך? זו פעולה בלתי הפיכה",
"pad.impexp.importbutton": "לייבא כעת", "pad.impexp.importbutton": "לייבא כעת",
"pad.impexp.importing": "מתבצע ייבוא…", "pad.impexp.importing": "מתבצע יבוא...",
"pad.impexp.confirmimport": "ייבוא של קובץ יבטל את הטקסט הנוכחי בפנקס. להמשיך?", "pad.impexp.confirmimport": "יבוא של קובץ יבטל את הטקסט הנוכחי בפנקס. להמשיך?",
"pad.impexp.convertFailed": "לא הצלחנו לייבא את הקובץ הזה. נא להשתמש בתסדיר מסמך שונה או להעתיק ולהדביק ידנית", "pad.impexp.convertFailed": "לא הצלחנו לייבא את הקובץ הזה. נא להשתמש בתסדיר מסמך שונה או להעתיק ולהדביק ידנית",
"pad.impexp.padHasData": "לא הצלחנו לייבא את הקובץ הזה, כי בפנקס הזה כבר יש שינויים. נא לייבא לפנקס חדש.", "pad.impexp.padHasData": "לא הצלחנו לייבא את הקובץ הזה, כי בפנקס הזה כבר יש שינויים. נא לייבא לפנקס חדש.",
"pad.impexp.uploadFailed": "ההעלאה נכשלה, נא לנסות שוב", "pad.impexp.uploadFailed": "ההעלאה נכשלה, נא לנסות שוב",
"pad.impexp.importfailed": "הייבוא נכשל", "pad.impexp.importfailed": "היבוא נכשל",
"pad.impexp.copypaste": "נא להעתיק ולהדביק", "pad.impexp.copypaste": "נא להעתיק ולהדביק",
"pad.impexp.exportdisabled": "ייצוא בתסדיר {{type}} אינו פעיל. מנהל המערכת שלך יוכל לספר לך על זה עוד פרטים.", "pad.impexp.exportdisabled": "יצוא בתסדיר {{type}} אינו פעיל. מנהל המערכת שלך יוכל לספר לך על זה עוד פרטים.",
"pad.impexp.maxFileSize": "הקובץ גדול מדי. נא ליצור קשר עם הנהלת האתר כדי להגדיל את הגודל המרבי שמותר לייבא." "pad.impexp.maxFileSize": "הקובץ גדול מדי. נא ליצור קשר עם הנהלת האתר כדי להגדיל את הגודל המרבי שמותר לייבא."
} }

View file

@ -2,7 +2,8 @@
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Bugoslav", "Bugoslav",
"Hmxhmx" "Hmxhmx",
"Ponor"
] ]
}, },
"index.newPad": "Novi blokić", "index.newPad": "Novi blokić",
@ -89,7 +90,7 @@
"pad.chat.title": "Otvori čavrljanje uz ovaj blokić.", "pad.chat.title": "Otvori čavrljanje uz ovaj blokić.",
"pad.chat.loadmessages": "Učitaj više poruka", "pad.chat.loadmessages": "Učitaj više poruka",
"pad.chat.stick.title": "Prilijepi razgovor na zaslon", "pad.chat.stick.title": "Prilijepi razgovor na zaslon",
"pad.chat.writeMessage.placeholder": "Napišite Vašu poruku ovdje", "pad.chat.writeMessage.placeholder": "Ovdje napišite svoju poruku",
"timeslider.followContents": "Prati ažuriranja sadržaja blokića", "timeslider.followContents": "Prati ažuriranja sadržaja blokića",
"timeslider.pageTitle": "{{appTitle}} Vremenska lenta", "timeslider.pageTitle": "{{appTitle}} Vremenska lenta",
"timeslider.toolbar.returnbutton": "Vrati se natrag na blokić", "timeslider.toolbar.returnbutton": "Vrati se natrag na blokić",

View file

@ -4,8 +4,42 @@
"Michawiki" "Michawiki"
] ]
}, },
"admin.page-title": "Administratorowa deska Etherpad",
"admin_plugins": "Zrjadowak tykačow",
"admin_plugins.available": "K dispoziciji stejace tykače",
"admin_plugins.available_not-found": "Žane tykače namakane.",
"admin_plugins.available_fetching": "Wobstaruje so …",
"admin_plugins.available_install.value": "Instalować",
"admin_plugins.available_search.placeholder": "Tykače za instalaciju pytać",
"admin_plugins.description": "Wopisanje",
"admin_plugins.installed": "Instalowane tykače",
"admin_plugins.installed_fetching": "Instalowane tykače so wobstaruja …",
"admin_plugins.installed_nothing": "Hišće njejsće tykače instalował.",
"admin_plugins.installed_uninstall.value": "Wotinstalować",
"admin_plugins.last-update": "Poslednja aktualizacija",
"admin_plugins.name": "Mjeno",
"admin_plugins.page-title": "Zrjadowak tykačow Etherpad",
"admin_plugins.version": "Wersija",
"admin_plugins_info": "Informacije wo rozrisanju problemow",
"admin_plugins_info.hooks": "Instalowane hoki",
"admin_plugins_info.hooks_client": "Hoki ze strony klienta",
"admin_plugins_info.hooks_server": "Hoki ze strony serwera",
"admin_plugins_info.parts": "Instalowane dźěle",
"admin_plugins_info.plugins": "Instalowane tykače",
"admin_plugins_info.page-title": "Tykačowe informacije Ehterpad",
"admin_plugins_info.version": "Wersija Etherpad",
"admin_plugins_info.version_latest": "Najnowša wersija",
"admin_plugins_info.version_number": "Wersijowe čisło",
"admin_settings": "Nastajenja",
"admin_settings.current": "Aktualna konfiguracija",
"admin_settings.current_example-devel": "Přikładowa předłoha wuwiwanskich nastajenjow",
"admin_settings.current_example-prod": "Přikładowa předłoha produkciskich nastajenjow",
"admin_settings.current_restart.value": "Etherpad znowa startować",
"admin_settings.current_save.value": "Nastajenja składować",
"admin_settings.page-title": "Nastajenja Etherpad",
"index.newPad": "Nowy zapisnik", "index.newPad": "Nowy zapisnik",
"index.createOpenPad": "abo wutwor/wočiń zapisnik z mjenom:", "index.createOpenPad": "abo wutwor/wočiń zapisnik z mjenom:",
"index.openPad": "wočińće eksistowacy Pad z mjenom:",
"pad.toolbar.bold.title": "Tučny (Strg-B)", "pad.toolbar.bold.title": "Tučny (Strg-B)",
"pad.toolbar.italic.title": "Kursiwny (Strg-I)", "pad.toolbar.italic.title": "Kursiwny (Strg-I)",
"pad.toolbar.underline.title": "Podšmórnyć (Strg-U)", "pad.toolbar.underline.title": "Podšmórnyć (Strg-U)",
@ -26,7 +60,7 @@
"pad.colorpicker.save": "Składować", "pad.colorpicker.save": "Składować",
"pad.colorpicker.cancel": "Přetorhnyć", "pad.colorpicker.cancel": "Přetorhnyć",
"pad.loading": "Začituje so...", "pad.loading": "Začituje so...",
"pad.noCookie": "Plack njeje so namakał. Prošu dopušćće placki w swojim wobhladowaku!", "pad.noCookie": "Plack njeje so namakał. Prošu dowolće placki w swojim wobhladowaku! Waše posedźenje a nastajenja so mjez dwěmaj wopytomaj njeskładuja. To móže so stać, hdyž Etherpad je w někotrych wobhladowakach w iFrame wobsahowany. Prošu zawěsćće, zo Etherpad je na samsnej poddomenje/domenje kaž nadrjadowany iFrame",
"pad.permissionDenied": "Nimaće prawo za přistup na tutón zapisnik.", "pad.permissionDenied": "Nimaće prawo za přistup na tutón zapisnik.",
"pad.settings.padSettings": "Nastajenja zapisnika", "pad.settings.padSettings": "Nastajenja zapisnika",
"pad.settings.myView": "Mój napohlad", "pad.settings.myView": "Mój napohlad",
@ -38,6 +72,8 @@
"pad.settings.fontType": "Pismowa družina:", "pad.settings.fontType": "Pismowa družina:",
"pad.settings.fontType.normal": "Normalny", "pad.settings.fontType.normal": "Normalny",
"pad.settings.language": "Rěč:", "pad.settings.language": "Rěč:",
"pad.settings.about": "Wo",
"pad.settings.poweredBy": "Spěchowany wot",
"pad.importExport.import_export": "Import/Eksport", "pad.importExport.import_export": "Import/Eksport",
"pad.importExport.import": "Tekstowu dataju abo dokument nahrać", "pad.importExport.import": "Tekstowu dataju abo dokument nahrać",
"pad.importExport.importSuccessful": "Wuspěšny!", "pad.importExport.importSuccessful": "Wuspěšny!",
@ -48,10 +84,12 @@
"pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"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.importExport.abiword.innerHTML": "Móžeš jenož z formatow luteho teksta abo z HTML-formata importować. Za bóle rozšěrjene importowe funkcije <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instaluj prošu Abiword abo LibreOffice</a>.",
"pad.modals.connected": "Zwjazany.", "pad.modals.connected": "Zwjazany.",
"pad.modals.reconnecting": "Zwjazuje so znowa z twojim zapisnikom...", "pad.modals.reconnecting": "Zwjazuje so znowa z twojim zapisnikom...",
"pad.modals.forcereconnect": "Znowa zwjazać", "pad.modals.forcereconnect": "Znowa zwjazać",
"pad.modals.reconnecttimer": "Spytaj so znowa zwjazać w",
"pad.modals.cancel": "Přetorhnyć",
"pad.modals.userdup": "W druhim woknje wočinjeny", "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.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.userdup.advice": "Zwjazaj znowa, zo by tute wokno město toho wužiwał.",
@ -70,6 +108,10 @@
"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.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": "Zhašany.",
"pad.modals.deleted.explanation": "Tutón zapisnik je so wotstronił.", "pad.modals.deleted.explanation": "Tutón zapisnik je so wotstronił.",
"pad.modals.rateLimited": "Wobmjezowana rata.",
"pad.modals.rateLimited.explanation": "Sće přewjele powěsćow na zapisnik pósłał, tohodla je so zwisk dźělił.",
"pad.modals.rejected.explanation": "Serwer je powěsć wotpokazał, kotraž je so přez waš wobhladowak pósłał.",
"pad.modals.rejected.cause": "Serwer je so snano zaktualizował, mjeztym zo sy sej zapisnik wobhladał, abo je snano zmylk w Etherpad. Spytaj stronu znowa začitać.",
"pad.modals.disconnected": "Zwisk je přetorhnjeny.", "pad.modals.disconnected": "Zwisk je přetorhnjeny.",
"pad.modals.disconnected.explanation": "Zwisk ze serwerom je so zhubił", "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.modals.disconnected.cause": "Serwer k dispoziciji njesteji. Prošu informuj słužboweho administratora, jeli to so dale stawa.",
@ -80,6 +122,9 @@
"pad.chat": "Chat", "pad.chat": "Chat",
"pad.chat.title": "Chat za tutón zapisnik wočinić", "pad.chat.title": "Chat za tutón zapisnik wočinić",
"pad.chat.loadmessages": "Dalše powěsće začitać", "pad.chat.loadmessages": "Dalše powěsće začitać",
"pad.chat.stick.title": "Chat k wobrazowce připjeć",
"pad.chat.writeMessage.placeholder": "Pisajće swoju powěsć tu",
"timeslider.followContents": "Aktualizacijam wobsaha zapisnika slědować",
"timeslider.pageTitle": "{{appTitle}} - wersijowa historija", "timeslider.pageTitle": "{{appTitle}} - wersijowa historija",
"timeslider.toolbar.returnbutton": "Wróćo k zapisnikej", "timeslider.toolbar.returnbutton": "Wróćo k zapisnikej",
"timeslider.toolbar.authors": "Awtorojo:", "timeslider.toolbar.authors": "Awtorojo:",
@ -88,7 +133,7 @@
"timeslider.exportCurrent": "Aktualnu wersiju eksportować jako:", "timeslider.exportCurrent": "Aktualnu wersiju eksportować jako:",
"timeslider.version": "Wersija {{version}}", "timeslider.version": "Wersija {{version}}",
"timeslider.saved": "Składowany {{day}}. {{month}} {{year}}", "timeslider.saved": "Składowany {{day}}. {{month}} {{year}}",
"timeslider.playPause": "Wobdźěłanje wothrać/pawzować", "timeslider.playPause": "Wobsah zapisnika wothrać/pawsěrować",
"timeslider.backRevision": "Wo jednu wersiju w tutym dokumenće wróćo hić", "timeslider.backRevision": "Wo jednu wersiju w tutym dokumenće wróćo hić",
"timeslider.forwardRevision": "Wo jednu wersiju w tutym dokumenće doprědka hić", "timeslider.forwardRevision": "Wo jednu wersiju w tutym dokumenće doprědka hić",
"timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}",
@ -109,7 +154,7 @@
"pad.savedrevs.timeslider": "Móžeš sej składowane wersije wobhladować, wopytujo historiju dokumenta.", "pad.savedrevs.timeslider": "Móžeš sej składowane wersije wobhladować, wopytujo historiju dokumenta.",
"pad.userlist.entername": "Zapodaj swoje mjeno", "pad.userlist.entername": "Zapodaj swoje mjeno",
"pad.userlist.unnamed": "bjez mjena", "pad.userlist.unnamed": "bjez mjena",
"pad.editbar.clearcolors": "Awtorowe barby w cyłym dokumenće zhašeć?", "pad.editbar.clearcolors": "Awtorowe barby w cyłym dokumenće zhašeć? To njeda so cofnyć",
"pad.impexp.importbutton": "Nětko importować", "pad.impexp.importbutton": "Nětko importować",
"pad.impexp.importing": "Importuje so...", "pad.impexp.importing": "Importuje so...",
"pad.impexp.confirmimport": "Importowanje dataje přepisa aktualny tekst zapisnika. Chceš woprawdźe pokročować?", "pad.impexp.confirmimport": "Importowanje dataje přepisa aktualny tekst zapisnika. Chceš woprawdźe pokročować?",
@ -118,5 +163,6 @@
"pad.impexp.uploadFailed": "Nahraće njeje so poradźiło, prošu spytaj hišće raz", "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.importfailed": "Import njeje so poradźiło",
"pad.impexp.copypaste": "Prošu kopěrować a zasadźić", "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." "pad.impexp.exportdisabled": "Eksport jako format {{type}} je znjemóžnjeny. Prošu staj so ze swojim systemowym administratorom za podrobnosće do zwiska.",
"pad.impexp.maxFileSize": "Dataja je přewulka. Stajće so ze swojim sydłowym administratorom do zwiska, zo by dowolenu datajowu wulkosć za import powyšił"
} }

View file

@ -1,6 +1,7 @@
{ {
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Armenoid",
"Kareyac" "Kareyac"
] ]
}, },
@ -26,7 +27,7 @@
"pad.settings.fontType": "Տառատեսակի տեսակը", "pad.settings.fontType": "Տառատեսակի տեսակը",
"pad.settings.language": "Լեզու", "pad.settings.language": "Լեզու",
"pad.importExport.import_export": "Ներմուծում/արտահանում", "pad.importExport.import_export": "Ներմուծում/արտահանում",
"pad.importExport.import": "Բեռնել ցանկացած տեքստային ֆայլը կամ փաստաթուղթ", "pad.importExport.import": "Վերբեռնել ցանկացած տեքստային նիշք կամ փաստաթուղթ",
"pad.importExport.importSuccessful": "Հաջողություն", "pad.importExport.importSuccessful": "Հաջողություն",
"pad.importExport.export": "Արտահանել ընթացիկ փաստաթուղթ է որպես", "pad.importExport.export": "Արտահանել ընթացիկ փաստաթուղթ է որպես",
"pad.importExport.exportplain": "Պարզ տեքստ", "pad.importExport.exportplain": "Պարզ տեքստ",

View file

@ -4,8 +4,42 @@
"McDutchie" "McDutchie"
] ]
}, },
"admin.page-title": "Pannello administrative Etherpad",
"admin_plugins": "Gestor de plug-ins",
"admin_plugins.available": "Plug-ins disponibile",
"admin_plugins.available_not-found": "Necun plug-in trovate.",
"admin_plugins.available_fetching": "Obtention…",
"admin_plugins.available_install.value": "Installar",
"admin_plugins.available_search.placeholder": "Cercar plug-ins a installar",
"admin_plugins.description": "Description",
"admin_plugins.installed": "Plug-ins installate",
"admin_plugins.installed_fetching": "Obtene plug-ins installate…",
"admin_plugins.installed_nothing": "Tu non ha ancora installate alcun plug-in.",
"admin_plugins.installed_uninstall.value": "Disinstallar",
"admin_plugins.last-update": "Ultime actualisation",
"admin_plugins.name": "Nomine",
"admin_plugins.page-title": "Gestor de plug-ins Etherpad",
"admin_plugins.version": "Version",
"admin_plugins_info": "Resolution de problemas",
"admin_plugins_info.hooks": "Uncinos installate",
"admin_plugins_info.hooks_client": "Uncinos al latere del cliente",
"admin_plugins_info.hooks_server": "Uncinos al latere del servitor",
"admin_plugins_info.parts": "Partes installate",
"admin_plugins_info.plugins": "Plug-ins installate",
"admin_plugins_info.page-title": "Information sur le plug-in  Etherpad",
"admin_plugins_info.version": "Version de Etherpad",
"admin_plugins_info.version_latest": "Ultime version disponibile",
"admin_plugins_info.version_number": "Numero de version",
"admin_settings": "Parametros",
"admin_settings.current": "Configuration actual",
"admin_settings.current_example-devel": "Exemplo de patrono de parametros de disveloppamento",
"admin_settings.current_example-prod": "Exemplo de patrono de parametros de production",
"admin_settings.current_restart.value": "Reinitiar Etherpad",
"admin_settings.current_save.value": "Salveguardar parametros",
"admin_settings.page-title": "Parametros  Etherpad",
"index.newPad": "Nove pad", "index.newPad": "Nove pad",
"index.createOpenPad": "o crear/aperir un pad con le nomine:", "index.createOpenPad": "o crear/aperir un pad con le nomine:",
"index.openPad": "aperir un Pad existente con le nomine:",
"pad.toolbar.bold.title": "Grasse (Ctrl-B)", "pad.toolbar.bold.title": "Grasse (Ctrl-B)",
"pad.toolbar.italic.title": "Italic (Ctrl-I)", "pad.toolbar.italic.title": "Italic (Ctrl-I)",
"pad.toolbar.underline.title": "Sublinear (Ctrl-U)", "pad.toolbar.underline.title": "Sublinear (Ctrl-U)",
@ -38,6 +72,8 @@
"pad.settings.fontType": "Typo de litteras:", "pad.settings.fontType": "Typo de litteras:",
"pad.settings.fontType.normal": "Normal", "pad.settings.fontType.normal": "Normal",
"pad.settings.language": "Lingua:", "pad.settings.language": "Lingua:",
"pad.settings.about": "A proposito",
"pad.settings.poweredBy": "Actionate per",
"pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import_export": "Importar/Exportar",
"pad.importExport.import": "Incargar qualcunque file de texto o documento", "pad.importExport.import": "Incargar qualcunque file de texto o documento",
"pad.importExport.importSuccessful": "Succedite!", "pad.importExport.importSuccessful": "Succedite!",
@ -72,6 +108,10 @@
"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.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": "Delite.",
"pad.modals.deleted.explanation": "Iste pad ha essite removite.", "pad.modals.deleted.explanation": "Iste pad ha essite removite.",
"pad.modals.rateLimited": "Frequentia limitate.",
"pad.modals.rateLimited.explanation": "Tu ha inviate troppo de messages a iste pad, dunque illo te ha disconnectite.",
"pad.modals.rejected.explanation": "Le servitor ha rejectate un message que tu navigator ha inviate.",
"pad.modals.rejected.cause": "Es possibile que le servitor ha essite actualisate durante que tu legeva le pad, o que il ha un falta in Etherpad. Tenta recargar le pagina.",
"pad.modals.disconnected": "Tu ha essite disconnectite.", "pad.modals.disconnected": "Tu ha essite disconnectite.",
"pad.modals.disconnected.explanation": "Le connexion al servitor ha essite perdite.", "pad.modals.disconnected.explanation": "Le connexion al servitor ha essite perdite.",
"pad.modals.disconnected.cause": "Le servitor pote esser indisponibile. Per favor notifica le administrator del servicio 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.",
@ -82,6 +122,9 @@
"pad.chat": "Chat", "pad.chat": "Chat",
"pad.chat.title": "Aperir le chat pro iste pad.", "pad.chat.title": "Aperir le chat pro iste pad.",
"pad.chat.loadmessages": "Cargar plus messages", "pad.chat.loadmessages": "Cargar plus messages",
"pad.chat.stick.title": "Ancorar le chat sur le schermo",
"pad.chat.writeMessage.placeholder": "Scribe tu message hic",
"timeslider.followContents": "Sequer le actualisationes de contento del pad",
"timeslider.pageTitle": "Glissa-tempore pro {{appTitle}}", "timeslider.pageTitle": "Glissa-tempore pro {{appTitle}}",
"timeslider.toolbar.returnbutton": "Retornar al pad", "timeslider.toolbar.returnbutton": "Retornar al pad",
"timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authors": "Autores:",
@ -120,5 +163,6 @@
"pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.", "pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.",
"pad.impexp.importfailed": "Importation fallite", "pad.impexp.importfailed": "Importation fallite",
"pad.impexp.copypaste": "Per favor copia e colla", "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." "pad.impexp.exportdisabled": "Le exportation in formato {{type}} es disactivate. Per favor contacta le administrator del systema pro detalios.",
"pad.impexp.maxFileSize": "Le file es troppo grande. Contacta le administrator de tu sito pro augmentar le grandor de file autorisate pro importation."
} }

View file

@ -3,9 +3,18 @@
"authors": [ "authors": [
"Bennylin", "Bennylin",
"IvanLanin", "IvanLanin",
"Marwan Mohamad" "Marwan Mohamad",
"Veracious"
] ]
}, },
"admin.page-title": "Dasbor Pengurus - Etherpad",
"admin_plugins": "Manajer plugin",
"admin_plugins.available": "Plugin yang tersedia",
"admin_plugins.available_install.value": "Instal",
"admin_plugins.version": "Versi",
"admin_settings": "Pengaturan",
"admin_settings.current_save.value": "Simpan pengaturan",
"admin_settings.page-title": "Pengaturan - Etherpad",
"index.newPad": "Pad baru", "index.newPad": "Pad baru",
"index.createOpenPad": "atau buat/buka Pad dengan nama:", "index.createOpenPad": "atau buat/buka Pad dengan nama:",
"pad.toolbar.bold.title": "Tebal (Ctrl-B)", "pad.toolbar.bold.title": "Tebal (Ctrl-B)",
@ -39,6 +48,7 @@
"pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?",
"pad.settings.fontType": "Jenis fonta:", "pad.settings.fontType": "Jenis fonta:",
"pad.settings.language": "Bahasa:", "pad.settings.language": "Bahasa:",
"pad.settings.about": "Tentang",
"pad.importExport.import_export": "Impor/Ekspor", "pad.importExport.import_export": "Impor/Ekspor",
"pad.importExport.import": "Unggah setiap berkas teks atau dokumen", "pad.importExport.import": "Unggah setiap berkas teks atau dokumen",
"pad.importExport.importSuccessful": "Berhasil!", "pad.importExport.importSuccessful": "Berhasil!",

View file

@ -5,8 +5,39 @@
"Sveinn í Felli" "Sveinn í Felli"
] ]
}, },
"admin.page-title": "Stjórnborð fyrir stjórnendur - Etherpad",
"admin_plugins": "Stýring viðbóta",
"admin_plugins.available": "Tiltækar viðbætur",
"admin_plugins.available_not-found": "Engar viðbætur fundust.",
"admin_plugins.available_fetching": "Sæki…",
"admin_plugins.available_install.value": "Setja upp",
"admin_plugins.available_search.placeholder": "Leita að viðbótum til uppsetningar",
"admin_plugins.description": "Lýsing",
"admin_plugins.installed": "Uppsettar viðbætur",
"admin_plugins.installed_fetching": "Sæki uppsettar viðbætur…",
"admin_plugins.installed_nothing": "Þú hefur ekki ennþá sett upp neinarar viðbætur.",
"admin_plugins.installed_uninstall.value": "Taka út",
"admin_plugins.last-update": "Síðast uppfært",
"admin_plugins.name": "Heiti",
"admin_plugins.page-title": "Stýring viðbóta - Etherpad",
"admin_plugins.version": "Útgáfa",
"admin_plugins_info": "Upplýsingar fyrir úrræðaleit",
"admin_plugins_info.parts": "Uppsettir hlutar",
"admin_plugins_info.plugins": "Uppsettar viðbætur",
"admin_plugins_info.page-title": "Upplýsingar um viðbætur - Etherpad",
"admin_plugins_info.version": "Útgáfa Etherpad",
"admin_plugins_info.version_latest": "Nýjasta tiltæka útgáfa",
"admin_plugins_info.version_number": "Útgáfunúmer",
"admin_settings": "Stillingar",
"admin_settings.current": "Fyrirliggjandi uppsetning",
"admin_settings.current_example-devel": "Sniðmát með dæmigerðum þróunarstillingum",
"admin_settings.current_example-prod": "Sniðmát með dæmigerðum keyrslustillingum",
"admin_settings.current_restart.value": "Endurræsa Etherpad",
"admin_settings.current_save.value": "Vista stillingar",
"admin_settings.page-title": "Stillingar - Etherpad",
"index.newPad": "Ný skrifblokk", "index.newPad": "Ný skrifblokk",
"index.createOpenPad": "eða búa til/opna skrifblokk með heitinu:", "index.createOpenPad": "eða búa til/opna skrifblokk með heitinu:",
"index.openPad": "opna skrifblokk með heitinu:",
"pad.toolbar.bold.title": "Feitletrað (Ctrl+B)", "pad.toolbar.bold.title": "Feitletrað (Ctrl+B)",
"pad.toolbar.italic.title": "Skáletrað (Ctrl+I)", "pad.toolbar.italic.title": "Skáletrað (Ctrl+I)",
"pad.toolbar.underline.title": "Undirstrikað (Ctrl+U)", "pad.toolbar.underline.title": "Undirstrikað (Ctrl+U)",
@ -27,7 +58,7 @@
"pad.colorpicker.save": "Vista", "pad.colorpicker.save": "Vista",
"pad.colorpicker.cancel": "Hætta við", "pad.colorpicker.cancel": "Hætta við",
"pad.loading": "Hleð inn...", "pad.loading": "Hleð inn...",
"pad.noCookie": "Smákaka fannst ekki. Þú verður að leyfa smákökur í vafranum þínum!", "pad.noCookie": "Vefkaka fannst ekki. Þú verður að leyfa vefkökur í vafranum þínum! Setan þín og stillingar verða ekki vistaðar á milli heimsókna. Þetta gæti stafað af því Etherpad sé innan í iFrame-ramma í sumum vöfrum. Gakktu úr skugga um að Etherpad sé á sama undirléni/léni eins og yfir-iFrame-ramminn",
"pad.permissionDenied": "Þú hefur ekki réttindi til að nota þessa skrifblokk", "pad.permissionDenied": "Þú hefur ekki réttindi til að nota þessa skrifblokk",
"pad.settings.padSettings": "Stillingar skrifblokkar", "pad.settings.padSettings": "Stillingar skrifblokkar",
"pad.settings.myView": "Mitt yfirlit", "pad.settings.myView": "Mitt yfirlit",
@ -53,7 +84,7 @@
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Þú getur aðeins flutt inn úr hreinum texta eða HTML sniðum. Til að geta nýtt \nfleiri þróaðri innflutningssnið <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">settu þá upp AbiWord forritið eða LibreOffice</a>.", "pad.importExport.abiword.innerHTML": "Þú getur aðeins flutt inn úr hreinum texta eða HTML sniðum. Til að geta nýtt \nfleiri þróaðri innflutningssnið <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">settu þá upp AbiWord forritið eða LibreOffice</a>.",
"pad.modals.connected": "Tengt.", "pad.modals.connected": "Tengt.",
"pad.modals.reconnecting": "Endurtengist skrifblokkinni þinni...", "pad.modals.reconnecting": "Endurtengist skrifblokkinni þinni",
"pad.modals.forcereconnect": "Þvinga endurtengingu", "pad.modals.forcereconnect": "Þvinga endurtengingu",
"pad.modals.reconnecttimer": "Reyni aftur að tengjast eftir", "pad.modals.reconnecttimer": "Reyni aftur að tengjast eftir",
"pad.modals.cancel": "Hætta við", "pad.modals.cancel": "Hætta við",
@ -75,6 +106,9 @@
"pad.modals.corruptPad.cause": "Þetta gæti verið vegna rangrar uppsetningar á þjóninum eða annarar óvæntrar hegðunar. Hafðu samband við stjórnanda þjónustunnar.", "pad.modals.corruptPad.cause": "Þetta gæti verið vegna rangrar uppsetningar á þjóninum eða annarar óvæntrar hegðunar. Hafðu samband við stjórnanda þjónustunnar.",
"pad.modals.deleted": "Eytt.", "pad.modals.deleted": "Eytt.",
"pad.modals.deleted.explanation": "Þessi skrifblokk hefur verið fjarlægð.", "pad.modals.deleted.explanation": "Þessi skrifblokk hefur verið fjarlægð.",
"pad.modals.rateLimited": "Með takmörkum.",
"pad.modals.rateLimited.explanation": "Þú hefur sent of mörg skilaboð á þessa skrifblokk, þannig að hún aftengdi þig.",
"pad.modals.rejected.explanation": "Þjónninn hafnaði skilaboðum sem vafrinn þinn sendi.",
"pad.modals.disconnected": "Þú hefur verið aftengd(ur).", "pad.modals.disconnected": "Þú hefur verið aftengd(ur).",
"pad.modals.disconnected.explanation": "Missti tengingu við miðlara", "pad.modals.disconnected.explanation": "Missti tengingu við miðlara",
"pad.modals.disconnected.cause": "Miðlarinn gæti verið ekki tiltækur. Láttu kerfisstjóra vita ef þetta heldur áfram að gerast.", "pad.modals.disconnected.cause": "Miðlarinn gæti verið ekki tiltækur. Láttu kerfisstjóra vita ef þetta heldur áfram að gerast.",
@ -87,6 +121,7 @@
"pad.chat.loadmessages": "Hlaða inn fleiri skeytum", "pad.chat.loadmessages": "Hlaða inn fleiri skeytum",
"pad.chat.stick.title": "Festa spjallið á skjáinn", "pad.chat.stick.title": "Festa spjallið á skjáinn",
"pad.chat.writeMessage.placeholder": "Skrifaðu skilaboðin þín hér", "pad.chat.writeMessage.placeholder": "Skrifaðu skilaboðin þín hér",
"timeslider.followContents": "Fylgja uppfærslum á efni skrifblokkar",
"timeslider.pageTitle": "Tímalína {{appTitle}}", "timeslider.pageTitle": "Tímalína {{appTitle}}",
"timeslider.toolbar.returnbutton": "Fara til baka í skrifblokk", "timeslider.toolbar.returnbutton": "Fara til baka í skrifblokk",
"timeslider.toolbar.authors": "Höfundar:", "timeslider.toolbar.authors": "Höfundar:",
@ -125,5 +160,6 @@
"pad.impexp.uploadFailed": "Sending mistókst, endilega reyndu aftur", "pad.impexp.uploadFailed": "Sending mistókst, endilega reyndu aftur",
"pad.impexp.importfailed": "Innflutningur mistókst", "pad.impexp.importfailed": "Innflutningur mistókst",
"pad.impexp.copypaste": "Afritaðu og límdu", "pad.impexp.copypaste": "Afritaðu og límdu",
"pad.impexp.exportdisabled": "Útflutningur á {{type}} sniði er óvirkur. Hafðu samband við kerfisstjóra til að fá frekari aðstoð." "pad.impexp.exportdisabled": "Útflutningur á {{type}} sniði er óvirkur. Hafðu samband við kerfisstjóra til að fá frekari aðstoð.",
"pad.impexp.maxFileSize": "Of stór skrá. Hafðu samband við kerfisstjóra til að láta auka leyfilega stærð skráa í innflutningi"
} }

View file

@ -8,15 +8,21 @@
"Macofe", "Macofe",
"Muxator", "Muxator",
"Nivit", "Nivit",
"VamosErik88",
"Vituzzu" "Vituzzu"
] ]
}, },
"admin.page-title": "Pannello amministrativo - Etherpad",
"admin_plugins": "Gestione plugin",
"admin_plugins.available": "Plugin disponibili",
"admin_plugins.available_not-found": "Nessun plugin trovato.",
"admin_plugins.available_install.value": "Installa", "admin_plugins.available_install.value": "Installa",
"admin_plugins.installed_uninstall.value": "Disinstalla", "admin_plugins.installed_uninstall.value": "Disinstalla",
"admin_plugins.last-update": "Ultimo aggiornamento", "admin_plugins.last-update": "Ultimo aggiornamento",
"admin_plugins.name": "Nome", "admin_plugins.name": "Nome",
"admin_plugins.version": "Versione", "admin_plugins.version": "Versione",
"admin_settings": "Impostazioni", "admin_settings": "Impostazioni",
"admin_settings.current_save.value": "Salva impostazioni",
"index.newPad": "Nuovo pad", "index.newPad": "Nuovo pad",
"index.createOpenPad": "o crea/apre un pad con il nome:", "index.createOpenPad": "o crea/apre un pad con il nome:",
"index.openPad": "apri un Pad esistente col nome:", "index.openPad": "apri un Pad esistente col nome:",

65
src/locales/kn.json Normal file
View file

@ -0,0 +1,65 @@
{
"@metadata": {
"authors": [
"Nayvik",
"ಮಲ್ನಾಡಾಚ್ ಕೊಂಕ್ಣೊ"
]
},
"admin_plugins.available": "ಲಭ್ಯವಿರುವ ಪ್ಲಗಿನ್‌ಗಳು",
"admin_plugins.available_not-found": "ಯಾವುದೇ ಪ್ಲಗಿನ್‌ಗಳು ಸಿಗಲಿಲ್ಲ",
"admin_plugins.available_fetching": "ಪಡೆಯಲಾಗುತ್ತಿದೆ...",
"admin_plugins.available_install.value": "ಅಳವಡಿಸು",
"admin_plugins.available_search.placeholder": "ಅಳವಡಿಸಲು ಪ್ಲಗಿನ್‌ಗಳನ್ನು ಹುಡುಕಿ",
"admin_plugins.description": "ವಿವರ",
"admin_plugins.installed": "ಅಳವಡಿಸಿದ ಪ್ಲಗಿನ್‌ಗಳು",
"admin_plugins.installed_fetching": "ಅಳವಡಿಸಿದ ಪ್ಲಗಿನ್‌ಗಳನ್ನು ಪಡೆಯಲಾಗುತ್ತಿದೆ...",
"admin_plugins.installed_nothing": "ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಪ್ಲಗಿನ್‌ಗಳನ್ನು ಅಳವಡಿಸಿಲ್ಲ.",
"admin_plugins.name": "ಹೆಸರು",
"admin_plugins.version": "ಆವೃತ್ತಿ",
"admin_plugins_info.plugins": "ಅಳವಡಿಸಿದ ಪ್ಲಗಿನ್‌ಗಳು",
"admin_plugins_info.page-title": "ಪ್ಲಗಿನ್ ಮಾಹಿತಿ - ಈಥರ್‌ಪ್ಯಾಡ್",
"admin_plugins_info.version": "ಈಥರ್‌ಪ್ಯಾಡ್ ಆವೃತ್ತಿ",
"admin_plugins_info.version_number": "ಆವೃತ್ತಿ ಸಂಖ್ಯೆ",
"admin_settings": "ವ್ಯವಸ್ಥೆಗಳು",
"admin_settings.page-title": "ವ್ಯವಸ್ಥೆಗಳು - ಈಥರ್‌ಪ್ಯಾಡ್",
"index.newPad": "ಹೊಸ ಪ್ಯಾಡ್",
"index.createOpenPad": "ಅಥವಾ ಈ ಹೆಸರಿನ ಪ್ಯಾಡನ್ನು ಸೃಷ್ಟಿಸು/ತೆರೆ:",
"pad.toolbar.bold.title": "ದಟ್ಟ (Ctrl-B)",
"pad.toolbar.italic.title": "ಓರೆ (Ctrl-I)",
"pad.toolbar.underline.title": "ಕೆಳಗೆರೆ (Ctrl-U)",
"pad.toolbar.settings.title": "ವ್ಯವಸ್ಥೆಗಳು",
"pad.colorpicker.save": "ಉಳಿಸಿ",
"pad.colorpicker.cancel": "ರದ್ದು ಮಾಡು",
"pad.loading": "ತುಂಬಿಸಲಾಗುತ್ತಿದೆ....",
"pad.settings.myView": "ನನ್ನ ನೋಟ",
"pad.settings.linenocheck": "ಗೆರೆ ಸಂಖ್ಯೆಗಳು",
"pad.settings.language": "ಭಾಷೆ:",
"pad.settings.about": "ಕುರಿತು",
"pad.importExport.import_export": "ಆಮದು/ರಫ್ತು",
"pad.importExport.importSuccessful": "ಯಶಸ್ವಿ!",
"pad.importExport.exportetherpad": "ಈಥರ್‌ಪ್ಯಾಡ್",
"pad.importExport.exporthtml": "ಎಚ್‍ಟಿಎಂಎಲ್",
"pad.importExport.exportplain": "ಸಾದಾ ಪಠ್ಯ",
"pad.importExport.exportword": "ಮೈಕ್ರೋಸಾಫ್ಟ್ ವರ್ಡ್",
"pad.importExport.exportpdf": "ಪಿಡಿಎಫ಼್",
"pad.importExport.exportopen": "ಓಡಿಫ಼್ (ಓಪನ್ ಡಾಕ್ಯುಮೆಂಟ್ ಫ಼ಾರ್ಮ್ಯಾಟ್)",
"pad.modals.cancel": "ರದ್ದು ಮಾಡು",
"pad.share.link": "ಕೊಂಡಿ",
"timeslider.toolbar.authors": "ಕರ್ತೃಗಳು:",
"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": "ಡಿಸೆಂಬರ್"
}

View file

@ -59,7 +59,7 @@
"pad.toolbar.unindent.title": "내어쓰기 (Shift+TAB)", "pad.toolbar.unindent.title": "내어쓰기 (Shift+TAB)",
"pad.toolbar.undo.title": "실행 취소 (Ctrl+Z)", "pad.toolbar.undo.title": "실행 취소 (Ctrl+Z)",
"pad.toolbar.redo.title": "다시 실행 (Ctrl+Y)", "pad.toolbar.redo.title": "다시 실행 (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "저자의 색 지우기 (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "작성자 표시 색상 지우기 (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "다른 파일 형식으로 가져오기/내보내기", "pad.toolbar.import_export.title": "다른 파일 형식으로 가져오기/내보내기",
"pad.toolbar.timeslider.title": "시간슬라이더", "pad.toolbar.timeslider.title": "시간슬라이더",
"pad.toolbar.savedRevision.title": "판 저장", "pad.toolbar.savedRevision.title": "판 저장",
@ -75,7 +75,7 @@
"pad.settings.myView": "내 보기", "pad.settings.myView": "내 보기",
"pad.settings.stickychat": "화면에 항상 대화 보기", "pad.settings.stickychat": "화면에 항상 대화 보기",
"pad.settings.chatandusers": "대화와 사용자 보기", "pad.settings.chatandusers": "대화와 사용자 보기",
"pad.settings.colorcheck": "저자 색", "pad.settings.colorcheck": "작성자 표시 색상",
"pad.settings.linenocheck": "줄 번호", "pad.settings.linenocheck": "줄 번호",
"pad.settings.rtlcheck": "우횡서(오른쪽에서 왼쪽으로)입니까?", "pad.settings.rtlcheck": "우횡서(오른쪽에서 왼쪽으로)입니까?",
"pad.settings.fontType": "글꼴 종류:", "pad.settings.fontType": "글꼴 종류:",
@ -136,7 +136,7 @@
"timeslider.followContents": "패드 콘텐츠의 갱신 주시하기", "timeslider.followContents": "패드 콘텐츠의 갱신 주시하기",
"timeslider.pageTitle": "{{appTitle}} 시간슬라이더", "timeslider.pageTitle": "{{appTitle}} 시간슬라이더",
"timeslider.toolbar.returnbutton": "패드로 돌아가기", "timeslider.toolbar.returnbutton": "패드로 돌아가기",
"timeslider.toolbar.authors": "자:", "timeslider.toolbar.authors": "작성자:",
"timeslider.toolbar.authorsList": "저자 없음", "timeslider.toolbar.authorsList": "저자 없음",
"timeslider.toolbar.exportlink.title": "내보내기", "timeslider.toolbar.exportlink.title": "내보내기",
"timeslider.exportCurrent": "현재 버전으로 내보내기:", "timeslider.exportCurrent": "현재 버전으로 내보내기:",
@ -158,12 +158,12 @@
"timeslider.month.october": "10월", "timeslider.month.october": "10월",
"timeslider.month.november": "11월", "timeslider.month.november": "11월",
"timeslider.month.december": "12월", "timeslider.month.december": "12월",
"timeslider.unnamedauthors": "이름 없는 {[plural(num) one: 저자, other: 저자 ]} {{num}}명", "timeslider.unnamedauthors": "이름 없는 {[plural(num) one: 작성자, other: 작성자]} {{num}}명",
"pad.savedrevs.marked": "이 판은 이제 저장한 판으로 표시합니다.", "pad.savedrevs.marked": "이 판은 이제 저장한 판으로 표시합니다.",
"pad.savedrevs.timeslider": "당신은 타임슬라이더를 통해 저장된 버전을 볼 수 있습니다", "pad.savedrevs.timeslider": "당신은 타임슬라이더를 통해 저장된 버전을 볼 수 있습니다",
"pad.userlist.entername": "이름을 입력하세요", "pad.userlist.entername": "이름을 입력하세요",
"pad.userlist.unnamed": "이름없음", "pad.userlist.unnamed": "이름없음",
"pad.editbar.clearcolors": "전체 문서의 저자 색을 지우시겠습니까? 이 작업은 취소할 수 없습니다", "pad.editbar.clearcolors": "전체 문서의 작성자 표시 색상을 지우시겠습니까? 이 작업은 취소할 수 없습니다",
"pad.impexp.importbutton": "지금 가져오기", "pad.impexp.importbutton": "지금 가져오기",
"pad.impexp.importing": "가져오는 중...", "pad.impexp.importing": "가져오는 중...",
"pad.impexp.confirmimport": "파일을 가져오면 패드의 현재 텍스트를 덮어쓰게 됩니다. 진행하시겠습니까?", "pad.impexp.confirmimport": "파일을 가져오면 패드의 현재 텍스트를 덮어쓰게 됩니다. 진행하시겠습니까?",

View file

@ -1,26 +1,142 @@
{ {
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Ernác" "Ernác",
"Къарачайлы"
] ]
}, },
"admin.page-title": "Администраторну панели — Etherpad",
"admin_plugins": "Плагин менеджер",
"admin_plugins.available": "Киришли плагинле",
"admin_plugins.available_not-found": "Плагинле табылмадыла.",
"admin_plugins.available_fetching": "Келтириле турады...",
"admin_plugins.available_install.value": "Къур",
"admin_plugins.available_search.placeholder": "Къурур ючюн плагинлени изле",
"admin_plugins.description": "Ачыкълау",
"admin_plugins.installed": "Къурулгъан плагинле",
"admin_plugins.installed_fetching": "Къурулгъан плагинле алына турадыла...",
"admin_plugins.installed_nothing": "Алкъын бир плагин да къурмагъансыз.",
"admin_plugins.installed_uninstall.value": "Къорат",
"admin_plugins.last-update": "Ахыр джангыртыу",
"admin_plugins.name": "Ат",
"admin_plugins.page-title": "Плагин менеджер - Etherpad",
"admin_plugins.version": "Версия",
"admin_plugins_info": "Бузукъланы кетериулени юсюнден информация",
"admin_plugins_info.hooks": "Къурулгъан ыргъакъла",
"admin_plugins_info.hooks_client": "Клиентни джанындагъы ыргъакъла",
"admin_plugins_info.hooks_server": "Сервер джанындагъы ыргъакъла",
"admin_plugins_info.parts": "Къурулгъан юлюшле",
"admin_plugins_info.plugins": "Къурулгъан плагинле",
"admin_plugins_info.page-title": "Плагин информация — Etherpad",
"admin_plugins_info.version": "Etherpad версия",
"admin_plugins_info.version_latest": "Ахыр киришли версия",
"admin_plugins_info.version_number": "Версияны номери",
"admin_settings": "Джарашдырыўла",
"admin_settings.current": "Баргъан конфигурация",
"admin_settings.current_example-devel": "Юлгю хазырлау джарашдырыуланы шаблону",
"admin_settings.current_example-prod": "Юлгю чыгъарыу джарашдырыуланы шаблону",
"admin_settings.current_restart.value": "Etherpad-ны джангыдан башлат",
"admin_settings.current_save.value": "Джарашдырыуланы Сакъла",
"admin_settings.page-title": "Джарашдырыула — Etherpad",
"index.newPad": "Джангы Блокнот",
"index.createOpenPad": "неда бу ат бла Блокнот болдур/ач:",
"index.openPad": "бу ат бла бар болгъан Блокнотну ачыгъыз:",
"pad.toolbar.bold.title": "Къалын (Ctrl+B)",
"pad.toolbar.italic.title": "Курсив (Ctrl-I)",
"pad.toolbar.underline.title": "Тюбю чертилген (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Юсю сызылгъан (Ctrl+5)",
"pad.toolbar.ol.title": "Кёзюулю тизме (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Кёзюуге этилмеген тизме (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Абзац (TAB)",
"pad.toolbar.unindent.title": "Чыгъыш (Shift+TAB)",
"pad.toolbar.undo.title": "Кери ал (Ctrl+Z)",
"pad.toolbar.redo.title": "Къайтар (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Авторлукъну боялурын тазала (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Файлланы башха форматларын (а/дан) импорт/экспорт",
"pad.toolbar.timeslider.title": "Заман шкала",
"pad.toolbar.savedRevision.title": "Версияны сакъла",
"pad.toolbar.settings.title": "Джарашдырыула", "pad.toolbar.settings.title": "Джарашдырыула",
"pad.toolbar.embed.title": "Бу блокнотну Джай эмда Ичине сал",
"pad.toolbar.showusers.title": "Хайырланыучуланы бу блокнотда кёргюзт",
"pad.colorpicker.save": "Сакъла", "pad.colorpicker.save": "Сакъла",
"pad.colorpicker.cancel": "Ызына ал",
"pad.loading": "Джюклениу...", "pad.loading": "Джюклениу...",
"pad.noCookie": "Куки табылмадыла. Бразуеригизде кукилени бир джандырсагъыз! Сизни кириулеригизни арасында сессиягъыз эмда джарашдырыуларыгъыз сакъланныкъ тюлдюле. Буну чуруму, бир къауум браузерледе Etherpad iFrame ичинде болгъаны болургъа болур. Тилейбиз, Etherpad эмда аны башындагъы iFrame бир тюбдоменде/доменде болгъанындан ишексиз болугъуз.",
"pad.permissionDenied": "Бу блокнотха кириш эркинлигигиз джокъду",
"pad.settings.padSettings": "Блокнотну джарашдырыулары",
"pad.settings.myView": "Кёрюнюмюм",
"pad.settings.stickychat": "Ушакъны хар заман да экранда кёргюзт",
"pad.settings.chatandusers": "Ушакъ бла къошулуучуланы кёргюзт",
"pad.settings.colorcheck": "Авторлукъ бояула",
"pad.settings.linenocheck": "Сатырланы номерлери",
"pad.settings.rtlcheck": "Ичиндеги онгдан солгъа окъулсунму?",
"pad.settings.fontType": "Шрифтни типи:",
"pad.settings.fontType.normal": "Нормал", "pad.settings.fontType.normal": "Нормал",
"pad.settings.language": "Тил:", "pad.settings.language": "Тил:",
"pad.settings.about": "Юсюнден",
"pad.settings.poweredBy": "Этген:",
"pad.importExport.import_export": "Импорт/экспорт", "pad.importExport.import_export": "Импорт/экспорт",
"pad.importExport.import": "Къаллай болса да текст файл неда документ джюкле",
"pad.importExport.importSuccessful": "Тыйыншлы!", "pad.importExport.importSuccessful": "Тыйыншлы!",
"pad.importExport.export": "Баргъан блокнотну бу шекилде экспорт эт:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML", "pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Тюз текст", "pad.importExport.exportplain": "Тюз текст",
"pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (OpenOffice'ни документи)", "pad.importExport.exportopen": "ODF (OpenOffice'ни документи)",
"pad.importExport.abiword.innerHTML": "Сиз къуру тюз текстни неда HTML импорт этерге боллукъсуз. Импортну андан кенг функциялары ючюн <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">AbiWord не LibreOffice къуругъуз</a>.",
"pad.modals.connected": "Байланды.",
"pad.modals.reconnecting": "Блокнотугъузгъа джангыдан байлана турады...",
"pad.modals.forcereconnect": "Джангыдан зор бла байланыу",
"pad.modals.reconnecttimer": "Джангыдан байланыргъа кюрешеди",
"pad.modals.cancel": "Ызына алыу",
"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.rateLimited": "Терклик чеклендирилгенди.",
"pad.modals.rateLimited.explanation": "Бу блокнотха асыры кёб билдириу джибергенигиз ючюн, байлам кесилди.",
"pad.modals.rejected.explanation": "Браузеригиз джибергени билдириуюгюзню алыргъа унамады.",
"pad.modals.rejected.cause": "Блоконтха къарай тургъанлайыгъызгъа, сервер джангыртылыргъа болур неда Etherpad халатлы болургъа болур. Бетни джангыдан джюклеб кёрюгюз.",
"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": "Чат",
"pad.chat.title": "Бу блокнот ючюн ушакъны ач",
"pad.chat.loadmessages": "Мындан аслам билдириу джюкле",
"pad.chat.stick.title": "Ушакъны экраннга джабышдыр",
"pad.chat.writeMessage.placeholder": "Билдириуюгюзню былайда джазыгъыз",
"timeslider.followContents": "Блокнот ичин джангыртыуун марагъыз",
"timeslider.pageTitle": "{{appTitle}} Заман Шкала",
"timeslider.toolbar.returnbutton": "Документге", "timeslider.toolbar.returnbutton": "Документге",
"timeslider.toolbar.authors": "Авторла:", "timeslider.toolbar.authors": "Авторла:",
"timeslider.toolbar.authorsList": "Автор джокъду",
"timeslider.toolbar.exportlink.title": "Эспорт эт", "timeslider.toolbar.exportlink.title": "Эспорт эт",
"timeslider.exportCurrent": "Баргъан версияны бу шекилде экспорт эт:",
"timeslider.version": "{{version}} версия", "timeslider.version": "{{version}} версия",
"timeslider.saved": "{{day}} {{month}} {{year}} датада сакъланнганды",
"timeslider.playPause": "Блокнотну ичин Ойнат / Пауза",
"timeslider.backRevision": "Бу блокнотдагъы версиягъа кери къайт",
"timeslider.forwardRevision": "Блокнотда эндиги версиягъа бар",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}",
"timeslider.month.january": "январь", "timeslider.month.january": "январь",
"timeslider.month.february": "февраль", "timeslider.month.february": "февраль",
@ -34,5 +150,20 @@
"timeslider.month.october": "октябрь", "timeslider.month.october": "октябрь",
"timeslider.month.november": "ноябрь", "timeslider.month.november": "ноябрь",
"timeslider.month.december": "декабрь", "timeslider.month.december": "декабрь",
"pad.impexp.importing": "Импорт этиу…" "timeslider.unnamedauthors": "{{num}} атсыз {[plural(num) one: автор, other: автор ]}",
"pad.savedrevs.marked": "Бу версия, артыкъ сакъланнган версия болуб белгиленнгенди",
"pad.savedrevs.timeslider": "Заман шкалагъа кириб, сакъланнган версияланы кёрюрге боллукъсуз",
"pad.userlist.entername": "Атынгы киргизт",
"pad.userlist.unnamed": "атсыз",
"pad.editbar.clearcolors": "Буютеу документдеги автор бояула сюртюлсюнмю? Бу этиу кери алынамаз",
"pad.impexp.importbutton": "Энди импорт эт",
"pad.impexp.importing": "Импорт этиу…",
"pad.impexp.confirmimport": "Файлны импорту баргъан текстни джангыдан джазарыкъды. Андан ары бардырыргъа излегенигизден ишексизмисиз?",
"pad.impexp.convertFailed": "Бу файлны импорт эталмадыкъ. Тилейбиз, башха форматны хайырланыгъыз, неда къол бла копия этиб джабышдырыгъыз",
"pad.impexp.padHasData": "Бу блокнотда алайсыз да тюрлениуле болгъаны ючюн бу файлны импорт эталмадыкъ, тилейбиз джангы блокнотха импорт этигиз",
"pad.impexp.uploadFailed": "Джюклеу джетишимсиз болду, тилейбизщ джангыдан сынагъыз",
"pad.impexp.importfailed": "Импорт этилалмады",
"pad.impexp.copypaste": "Тилейбиз, копия этиб джабышдыргъыз",
"pad.impexp.exportdisabled": "{{type}} форматда экспорт джукъланыбды. Ачыкълаула ючюн система администраторлагъа байланыгъыз.",
"pad.impexp.maxFileSize": "Файл асыры уллуду. Импорт ючюн эркинлик берилген файл ёлчемини уллу этер ючюн сайтны администратору бла байланыгъыз"
} }

View file

@ -1,6 +1,7 @@
{ {
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Balyozxane",
"Bikarhêner", "Bikarhêner",
"Dilyaramude", "Dilyaramude",
"George Animal", "George Animal",
@ -59,7 +60,7 @@
"timeslider.toolbar.returnbutton": "Vegere bloknotê", "timeslider.toolbar.returnbutton": "Vegere bloknotê",
"timeslider.toolbar.authors": "Nivîser:", "timeslider.toolbar.authors": "Nivîser:",
"timeslider.toolbar.authorsList": "Nivîser Tine", "timeslider.toolbar.authorsList": "Nivîser Tine",
"timeslider.version": "Guhertoya {{version}}", "timeslider.version": "Guhartoya {{version}}",
"timeslider.saved": "Di dîroka {{day}} {{month}} {{year}} de hate tomarkirin", "timeslider.saved": "Di dîroka {{day}} {{month}} {{year}} de hate tomarkirin",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}.{{minutes}}.{{seconds}}",
"timeslider.month.january": "kanûna paşîn", "timeslider.month.january": "kanûna paşîn",

View file

@ -3,12 +3,21 @@
"authors": [ "authors": [
"Gromper", "Gromper",
"Robby", "Robby",
"Soued031" "Soued031",
"Volvox"
] ]
}, },
"admin_plugins_info.version": "Etherpad Versioun", "admin_plugins.available_install.value": "Installéieren",
"admin_plugins.description": "Beschreiwung",
"admin_plugins.installed_uninstall.value": "Desinstalléieren",
"admin_plugins.name": "Numm",
"admin_plugins.version": "Versioun",
"admin_plugins_info.version": "Etherpad-Versioun",
"admin_plugins_info.version_latest": "Lescht disponibel Versioun", "admin_plugins_info.version_latest": "Lescht disponibel Versioun",
"admin_plugins_info.version_number": "Versiounsnummer",
"admin_settings": "Astellungen", "admin_settings": "Astellungen",
"admin_settings.current_save.value": "Astellunge späicheren",
"admin_settings.page-title": "Astellungen - Etherpad",
"index.newPad": "Neie Pad", "index.newPad": "Neie Pad",
"index.createOpenPad": "oder maacht ee Pad mat dësem Numm op:", "index.createOpenPad": "oder maacht ee Pad mat dësem Numm op:",
"pad.toolbar.bold.title": "Fett (Strg-B)", "pad.toolbar.bold.title": "Fett (Strg-B)",
@ -29,7 +38,8 @@
"pad.loading": "Lueden...", "pad.loading": "Lueden...",
"pad.noCookie": "Cookie gouf net fonnt. Erlaabt wgl. Cookien an Ärem Browser! Är Sessioun an Är Astellungen ginn net tëscht de Visitte gespäichert. Dëst kann doduerch bedéngt sinn datt Etherpad a verschiddene Browser an iFrameën agebaut ass. Vergewëssert Iech wgl. datt Etherpad am selwechten Subdomain/Domain ass wéi den iwwergeuerdneten iFrame", "pad.noCookie": "Cookie gouf net fonnt. Erlaabt wgl. Cookien an Ärem Browser! Är Sessioun an Är Astellungen ginn net tëscht de Visitte gespäichert. Dëst kann doduerch bedéngt sinn datt Etherpad a verschiddene Browser an iFrameën agebaut ass. Vergewëssert Iech wgl. datt Etherpad am selwechten Subdomain/Domain ass wéi den iwwergeuerdneten iFrame",
"pad.permissionDenied": "Dir hutt net déi néideg Rechter fir dëse Pad opzemaachen", "pad.permissionDenied": "Dir hutt net déi néideg Rechter fir dëse Pad opzemaachen",
"pad.settings.myView": "Méng Usiicht", "pad.settings.padSettings": "Pad-Astellungen",
"pad.settings.myView": "Meng Usiicht",
"pad.settings.linenocheck": "Zeilennummeren", "pad.settings.linenocheck": "Zeilennummeren",
"pad.settings.rtlcheck": "Inhalt vu riets no lénks liesen?", "pad.settings.rtlcheck": "Inhalt vu riets no lénks liesen?",
"pad.settings.fontType": "Schrëftart:", "pad.settings.fontType": "Schrëftart:",
@ -49,17 +59,21 @@
"pad.modals.connected": "Verbonnen.", "pad.modals.connected": "Verbonnen.",
"pad.modals.cancel": "Ofbriechen", "pad.modals.cancel": "Ofbriechen",
"pad.modals.userdup": "An enger anerer Fënster opgemaach", "pad.modals.userdup": "An enger anerer Fënster opgemaach",
"pad.modals.userdup.explanation": "Et schéngt, datt dëse Pad a méi wéi enger Browserfënster op dësem Computer opgemaach ginn ass.",
"pad.modals.unauth": "Net autoriséiert", "pad.modals.unauth": "Net autoriséiert",
"pad.modals.unauth.explanation": "Är Rechter hu geännert während deem Dir dës säit gekuckt hutt. Probéiert fir Iech nei ze connectéieren.", "pad.modals.unauth.explanation": "Är Rechter hu geännert während deem Dir dës säit gekuckt hutt. Probéiert fir Iech nei ze connectéieren.",
"pad.modals.looping.explanation": "Et gëtt Kommunikatiounsproblemer mam Synchronisatiouns-Server.", "pad.modals.looping.explanation": "Et gëtt Kommunikatiounsproblemer mam Synchronisatiouns-Server.",
"pad.modals.initsocketfail": "De Server kann net erreecht ginn.", "pad.modals.initsocketfail": "De Server kann net erreecht ginn.",
"pad.modals.slowcommit.explanation": "De Server äntwert net.", "pad.modals.slowcommit.explanation": "De Server äntwert net.",
"pad.modals.deleted": "Geläscht.", "pad.modals.deleted": "Geläscht.",
"pad.modals.deleted.explanation": "Dëse Pad gouf geläscht.",
"pad.modals.disconnected": "Äre Verbindung ass ofgebrach.", "pad.modals.disconnected": "Äre Verbindung ass ofgebrach.",
"pad.modals.disconnected.explanation": "D'Verbindung mam Server ass verluergaang.", "pad.modals.disconnected.explanation": "D'Verbindung mam Server ass verluergaang.",
"pad.share": "Dëse Pad deelen",
"pad.share.readonly": "Nëmme liesen", "pad.share.readonly": "Nëmme liesen",
"pad.share.link": "Link", "pad.share.link": "Link",
"pad.chat": "Chat", "pad.chat": "Chat",
"pad.chat.title": "Den Chat fir dëse Pad opmaachen.",
"pad.chat.loadmessages": "Méi Message lueden", "pad.chat.loadmessages": "Méi Message lueden",
"pad.chat.writeMessage.placeholder": "Schreift Äre Message hei", "pad.chat.writeMessage.placeholder": "Schreift Äre Message hei",
"timeslider.toolbar.authors": "Auteuren:", "timeslider.toolbar.authors": "Auteuren:",

View file

@ -5,10 +5,17 @@
"I-svetaines", "I-svetaines",
"Mantak111", "Mantak111",
"Naktis", "Naktis",
"Nokeoo",
"Vogone", "Vogone",
"Zygimantus" "Zygimantus"
] ]
}, },
"admin.page-title": "Administratoriaus prietaisų skydelis Etherpad",
"admin_plugins": "Įskiepių tvarkyklė",
"admin_plugins.available": "Galimi įskiepiai",
"admin_plugins.available_not-found": "Įskiepių nerasta.",
"admin_plugins.available_fetching": "Gaunama…",
"admin_plugins.available_install.value": "Įdiegti",
"index.newPad": "Naujas bloknotas", "index.newPad": "Naujas bloknotas",
"index.createOpenPad": "arba sukurkite/atidarykite Bloknotą su pavadinimu:", "index.createOpenPad": "arba sukurkite/atidarykite Bloknotą su pavadinimu:",
"pad.toolbar.bold.title": "Paryškintasis (Ctrl-B)", "pad.toolbar.bold.title": "Paryškintasis (Ctrl-B)",

View file

@ -2,6 +2,7 @@
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Akapochtli", "Akapochtli",
"Languaeditor",
"Taresi" "Taresi"
] ]
}, },
@ -15,7 +16,7 @@
"pad.toolbar.redo.title": "Occeppa (Ctrl+Y)", "pad.toolbar.redo.title": "Occeppa (Ctrl+Y)",
"pad.toolbar.settings.title": "Tlatlālīliztli", "pad.toolbar.settings.title": "Tlatlālīliztli",
"pad.colorpicker.save": "Xicpiya", "pad.colorpicker.save": "Xicpiya",
"pad.colorpicker.cancel": "Moxitiniz", "pad.colorpicker.cancel": "Xikxolewa",
"pad.settings.padSettings": "Pad Ītlatlālīliz", "pad.settings.padSettings": "Pad Ītlatlālīliz",
"pad.settings.myView": "Notlachiyaliz", "pad.settings.myView": "Notlachiyaliz",
"pad.settings.language": "Tlahtolli:", "pad.settings.language": "Tlahtolli:",
@ -24,20 +25,20 @@
"pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.modals.cancel": "Moxitiniz", "pad.modals.cancel": "Xikxolewa",
"pad.modals.deleted": "Omopohpoloh.", "pad.modals.deleted": "Omopohpoloh.",
"pad.modals.deleted.explanation": "Ōmopoloh inīn Pad.", "pad.modals.deleted.explanation": "Ōmopoloh inīn Pad.",
"timeslider.version": "Inīc {{version}} Cuepaliztli", "timeslider.version": "Inīc {{version}} Cuepaliztli",
"timeslider.month.january": "Īccēmētztli", "timeslider.month.january": "Eneroh",
"timeslider.month.february": "Īcōmemētztli", "timeslider.month.february": "Febreroh",
"timeslider.month.march": "Īcyēyimētztli", "timeslider.month.march": "Marsoh",
"timeslider.month.april": "Īcnāhuimētztli", "timeslider.month.april": "April",
"timeslider.month.may": "Īcmācuīllimētztli", "timeslider.month.may": "Mayoh",
"timeslider.month.june": "Īcchicuacemmētztli", "timeslider.month.june": "Honioh",
"timeslider.month.july": "Īcchicōmemētztli", "timeslider.month.july": "Holioh",
"timeslider.month.august": "Īcchicuēyimētztli", "timeslider.month.august": "Ahostoh",
"timeslider.month.september": "Īcchiucnāhuimētztli", "timeslider.month.september": "Septiempreh",
"timeslider.month.october": "Īcmahtlactlimētztli", "timeslider.month.october": "Oktopreh",
"timeslider.month.november": "Īcmahtlactlioncēmētztli", "timeslider.month.november": "Noviempreh",
"timeslider.month.december": "Īcmahtlactliomōmemētztli" "timeslider.month.december": "Tisiempreh"
} }

View file

@ -3,9 +3,11 @@
"authors": [ "authors": [
"C.R.", "C.R.",
"Chelin", "Chelin",
"Finizio",
"Ruthven" "Ruthven"
] ]
}, },
"admin_plugins.name": "Nomme",
"index.newPad": "Nuovo Pad", "index.newPad": "Nuovo Pad",
"index.createOpenPad": "o crià o arape nu Pad cu 'o nomme:", "index.createOpenPad": "o crià o arape nu Pad cu 'o nomme:",
"pad.toolbar.bold.title": "Grassetto (Ctrl-B)", "pad.toolbar.bold.title": "Grassetto (Ctrl-B)",

View file

@ -3,12 +3,17 @@
"authors": [ "authors": [
"Chameleon222", "Chameleon222",
"Cocu", "Cocu",
"EdoAug",
"Jon Harald Søby", "Jon Harald Søby",
"Laaknor", "Laaknor",
"Orjanmen", "Orjanmen",
"SuperPotato" "SuperPotato"
] ]
}, },
"admin_plugins.available_install.value": "Installer",
"admin_plugins.version": "Versjon",
"admin_settings": "Innstillinger",
"admin_settings.current_save.value": "Lagre innstillinger",
"index.newPad": "Ny pad", "index.newPad": "Ny pad",
"index.createOpenPad": "eller opprett/åpne en pad med dette navnet:", "index.createOpenPad": "eller opprett/åpne en pad med dette navnet:",
"index.openPad": "åpne en eksisterende Pad med følgende navn:", "index.openPad": "åpne en eksisterende Pad med følgende navn:",

View file

@ -1,8 +1,10 @@
{ {
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Bada Kaji",
"Nirajan pant", "Nirajan pant",
"Nirjal stha", "Nirjal stha",
"बडा काजी",
"राम प्रसाद जोशी", "राम प्रसाद जोशी",
"सरोज कुमार ढकाल", "सरोज कुमार ढकाल",
"हिमाल सुबेदी" "हिमाल सुबेदी"
@ -23,14 +25,14 @@
"pad.toolbar.clearAuthorship.title": "लेखकीय रङ्ग हटाउने (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "लेखकीय रङ्ग हटाउने (Ctrl+Shift+C)",
"pad.toolbar.timeslider.title": "टाइमस्लाइडर", "pad.toolbar.timeslider.title": "टाइमस्लाइडर",
"pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहगर्ने", "pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहगर्ने",
"pad.toolbar.settings.title": "सेटिङ्गहरू", "pad.toolbar.settings.title": "अभिरुचिहरू",
"pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने", "pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने",
"pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने", "pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने",
"pad.colorpicker.save": "सङ्ग्रह गर्ने", "pad.colorpicker.save": "सङ्ग्रह गर्ने",
"pad.colorpicker.cancel": "रद्द", "pad.colorpicker.cancel": "रद्द गर्नुहोस्",
"pad.loading": "खुल्दै छ…", "pad.loading": "खुल्दै छ…",
"pad.permissionDenied": "तपाईंलाई यो प्याड खोल्न अनुमति छैन", "pad.permissionDenied": "तपाईंलाई यो प्याड खोल्न अनुमति छैन",
"pad.settings.padSettings": "प्याड सेटिङ्गहरू", "pad.settings.padSettings": "प्याड अभिरुचिहरू",
"pad.settings.myView": "मेरो दृष्य", "pad.settings.myView": "मेरो दृष्य",
"pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने", "pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने",
"pad.settings.chatandusers": "वार्ता तथा प्रयोगकर्ताहरू देखाउने", "pad.settings.chatandusers": "वार्ता तथा प्रयोगकर्ताहरू देखाउने",
@ -65,7 +67,7 @@
"pad.modals.disconnected.explanation": "तपाईंको सर्भरसँगको जडान अवरुद्ध भयो", "pad.modals.disconnected.explanation": "तपाईंको सर्भरसँगको जडान अवरुद्ध भयो",
"pad.share": "यस प्यडलाई बाड्ने", "pad.share": "यस प्यडलाई बाड्ने",
"pad.share.readonly": "पढ्ने मात्र", "pad.share.readonly": "पढ्ने मात्र",
"pad.share.link": "लिङ्क", "pad.share.link": "डी",
"pad.share.emebdcode": "URL थप्ने", "pad.share.emebdcode": "URL थप्ने",
"pad.chat": "कुराकानी", "pad.chat": "कुराकानी",
"pad.chat.title": "यस प्याडको लागि कुराकानी खोल्ने", "pad.chat.title": "यस प्याडको लागि कुराकानी खोल्ने",
@ -78,7 +80,7 @@
"timeslider.exportCurrent": "हालको संस्करण निम्म रुपमा निर्यात गर्ने :", "timeslider.exportCurrent": "हालको संस्करण निम्म रुपमा निर्यात गर्ने :",
"timeslider.version": "संस्करण {{version}}", "timeslider.version": "संस्करण {{version}}",
"timeslider.saved": "सङ्ग्रह गरिएको {{month}} {{day}}, {{year}}", "timeslider.saved": "सङ्ग्रह गरिएको {{month}} {{day}}, {{year}}",
"timeslider.playPause": "प्याडको सामग्रीहरूलाई चालु/बन्द गर्नुहोस", "timeslider.playPause": "प्याडको सामग्रीहरूलाई चालु / बन्द गर्नुहोस",
"timeslider.backRevision": "यो प्याडको एक संस्करण पहिले जानुहोस्", "timeslider.backRevision": "यो प्याडको एक संस्करण पहिले जानुहोस्",
"timeslider.forwardRevision": "यो प्याडको एक संस्करण पछि जानुहोस्", "timeslider.forwardRevision": "यो प्याडको एक संस्करण पछि जानुहोस्",
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",

View file

@ -13,6 +13,7 @@
"Robin van der Vliet", "Robin van der Vliet",
"Robin0van0der0vliet", "Robin0van0der0vliet",
"Siebrand", "Siebrand",
"Spinster",
"woeterman94" "woeterman94"
] ]
}, },
@ -32,7 +33,7 @@
"admin_plugins.name": "Naam", "admin_plugins.name": "Naam",
"admin_plugins.page-title": "Plugin beheer - Etherpad", "admin_plugins.page-title": "Plugin beheer - Etherpad",
"admin_plugins.version": "Versie", "admin_plugins.version": "Versie",
"admin_plugins_info": "Info", "admin_plugins_info": "Probleemoplossingsinformatie",
"admin_plugins_info.hooks": "Geïnstalleerde hooks", "admin_plugins_info.hooks": "Geïnstalleerde hooks",
"admin_plugins_info.hooks_client": "Client-side hooks", "admin_plugins_info.hooks_client": "Client-side hooks",
"admin_plugins_info.hooks_server": "Server-side hooks", "admin_plugins_info.hooks_server": "Server-side hooks",
@ -44,13 +45,14 @@
"admin_plugins_info.version_number": "Versie nummer", "admin_plugins_info.version_number": "Versie nummer",
"admin_settings": "Instellingen", "admin_settings": "Instellingen",
"admin_settings.current": "Huidige configuratie", "admin_settings.current": "Huidige configuratie",
"admin_settings.current_example-devel": "Development instellingen template", "admin_settings.current_example-devel": "Voorbeeldsjabloon voor ontwikkelingsinstellingen",
"admin_settings.current_example-prod": "Productie instellingen template", "admin_settings.current_example-prod": "Productie instellingen template",
"admin_settings.current_restart.value": "Herstart Etherpad", "admin_settings.current_restart.value": "Herstart Etherpad",
"admin_settings.current_save.value": "Bewaar instellingen", "admin_settings.current_save.value": "Bewaar instellingen",
"admin_settings.page-title": "Instellingen - Etherpad", "admin_settings.page-title": "Instellingen - Etherpad",
"index.newPad": "Nieuw pad", "index.newPad": "Nieuw pad",
"index.createOpenPad": "of maak/open een pad met de naam:", "index.createOpenPad": "of maak/open een pad met de naam:",
"index.openPad": "open een bestaande Pad met de naam:",
"pad.toolbar.bold.title": "Vet (Ctrl-B)", "pad.toolbar.bold.title": "Vet (Ctrl-B)",
"pad.toolbar.italic.title": "Cursief (Ctrl-I)", "pad.toolbar.italic.title": "Cursief (Ctrl-I)",
"pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)", "pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)",
@ -84,6 +86,7 @@
"pad.settings.fontType.normal": "Normaal", "pad.settings.fontType.normal": "Normaal",
"pad.settings.language": "Taal:", "pad.settings.language": "Taal:",
"pad.settings.about": "Over", "pad.settings.about": "Over",
"pad.settings.poweredBy": "Aangedreven door",
"pad.importExport.import_export": "Importeren/exporteren", "pad.importExport.import_export": "Importeren/exporteren",
"pad.importExport.import": "Tekstbestand of document uploaden", "pad.importExport.import": "Tekstbestand of document uploaden",
"pad.importExport.importSuccessful": "Afgerond", "pad.importExport.importSuccessful": "Afgerond",
@ -118,6 +121,10 @@
"pad.modals.corruptPad.cause": "Dit kan komen door een onjuiste serverinstelling of door ander onverwacht gedrag. Neem contact op met de servicebeheerder.", "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": "Verwijderd.",
"pad.modals.deleted.explanation": "Dit pad is verwijderd.", "pad.modals.deleted.explanation": "Dit pad is verwijderd.",
"pad.modals.rateLimited": "Snelheid begrensd.",
"pad.modals.rateLimited.explanation": "Je hebt te veel berichten naar deze pad gestuurd. Daarom is je verbinding verbroken.",
"pad.modals.rejected.explanation": "De server heeft een bericht afgewezen dat door je browser is verzonden.",
"pad.modals.rejected.cause": "Mogelijks is de server bijgewerkt terwijl je de pad aan het bekijken was. Of misschien is er een bug in Etherpad. Probeer de pagina opnieuw te laden.",
"pad.modals.disconnected": "Uw verbinding is verbroken.", "pad.modals.disconnected": "Uw verbinding is verbroken.",
"pad.modals.disconnected.explanation": "De verbinding met de server is verbroken", "pad.modals.disconnected.explanation": "De verbinding met de server is verbroken",
"pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel de servicebeheerder op de hoogte.", "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel de servicebeheerder op de hoogte.",
@ -128,8 +135,9 @@
"pad.chat": "Chatten", "pad.chat": "Chatten",
"pad.chat.title": "Chat voor dit pad opnenen", "pad.chat.title": "Chat voor dit pad opnenen",
"pad.chat.loadmessages": "Meer berichten laden", "pad.chat.loadmessages": "Meer berichten laden",
"pad.chat.stick.title": "Zet de chat op het scherm", "pad.chat.stick.title": "Chat op scherm vastzetten",
"pad.chat.writeMessage.placeholder": "Schrijf je bericht hier", "pad.chat.writeMessage.placeholder": "Schrijf je bericht hier",
"timeslider.followContents": "Volg de inhoudelijke updates van de pad",
"timeslider.pageTitle": "Tijdlijn voor {{appTitle}}", "timeslider.pageTitle": "Tijdlijn voor {{appTitle}}",
"timeslider.toolbar.returnbutton": "Terug naar pad", "timeslider.toolbar.returnbutton": "Terug naar pad",
"timeslider.toolbar.authors": "Auteurs:", "timeslider.toolbar.authors": "Auteurs:",
@ -168,5 +176,6 @@
"pad.impexp.uploadFailed": "Het uploaden is mislukt. Probeer het opnieuw", "pad.impexp.uploadFailed": "Het uploaden is mislukt. Probeer het opnieuw",
"pad.impexp.importfailed": "Importeren is mislukt", "pad.impexp.importfailed": "Importeren is mislukt",
"pad.impexp.copypaste": "Gebruik kopiëren 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." "pad.impexp.exportdisabled": "Exporteren als {{type}} is uitgeschakeld. Neem contact op met de systeembeheerder voor details.",
"pad.impexp.maxFileSize": "Het bestand is te groot. Neem contact op met je sitebeheerder om de toegestane bestandsgrootte voor importeren te vergroten."
} }

View file

@ -18,7 +18,8 @@
"Titoncio", "Titoncio",
"Tuliouel", "Tuliouel",
"Walesson", "Walesson",
"Webysther" "Webysther",
"YuriNikolai"
] ]
}, },
"admin.page-title": "Painel administrativo - Etherpad", "admin.page-title": "Painel administrativo - Etherpad",
@ -55,18 +56,18 @@
"admin_settings.current_save.value": "Salvar configurações", "admin_settings.current_save.value": "Salvar configurações",
"admin_settings.page-title": "Configurações - Etherpad", "admin_settings.page-title": "Configurações - Etherpad",
"index.newPad": "Nova Nota", "index.newPad": "Nova Nota",
"index.createOpenPad": "ou criar-abrir uma Nota com o nome:", "index.createOpenPad": "ou criar/abrir uma Nota com o nome:",
"index.openPad": "abra um bloco existente com o nome:", "index.openPad": "abra uma Nota existente com o nome:",
"pad.toolbar.bold.title": "Negrito (Ctrl-B)", "pad.toolbar.bold.title": "Negrito (Ctrl+B)",
"pad.toolbar.italic.title": "Itálico (Ctrl-I)", "pad.toolbar.italic.title": "Itálico (Ctrl+I)",
"pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", "pad.toolbar.underline.title": "Sublinhado (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Tachado (Ctrl+5)", "pad.toolbar.strikethrough.title": "Tachado (Ctrl+5)",
"pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)", "pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Lista não ordenada (Ctrl+Shift+L)", "pad.toolbar.ul.title": "Lista não ordenada (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Aumentar Recuo (TAB)", "pad.toolbar.indent.title": "Aumentar Recuo (TAB)",
"pad.toolbar.unindent.title": "Diminuir Recuo (Shift+TAB)", "pad.toolbar.unindent.title": "Diminuir Recuo (Shift+TAB)",
"pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", "pad.toolbar.undo.title": "Desfazer (Ctrl+Z)",
"pad.toolbar.redo.title": "Refazer (Ctrl-Y)", "pad.toolbar.redo.title": "Refazer (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Limpar as cores de identificação de autoria (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "Limpar as cores de identificação de autoria (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importar/Exportar de/para diferentes formatos de arquivo", "pad.toolbar.import_export.title": "Importar/Exportar de/para diferentes formatos de arquivo",
"pad.toolbar.timeslider.title": "Linha do tempo", "pad.toolbar.timeslider.title": "Linha do tempo",
@ -103,7 +104,7 @@
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Só é possível importar texto sem formatação ou HTML. Para obter funcionalidades de importação mais avançadas, por favor <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instale o AbiWordor ou LibreOffice</a>.", "pad.importExport.abiword.innerHTML": "Só é possível importar texto sem formatação ou HTML. Para obter funcionalidades de importação mais avançadas, por favor <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instale o AbiWordor ou LibreOffice</a>.",
"pad.modals.connected": "Conectado.", "pad.modals.connected": "Conectado.",
"pad.modals.reconnecting": "Reconectando à sua nota...", "pad.modals.reconnecting": "Reconectando à sua nota",
"pad.modals.forcereconnect": "Forçar reconexão", "pad.modals.forcereconnect": "Forçar reconexão",
"pad.modals.reconnecttimer": "Tentando se reconectar", "pad.modals.reconnecttimer": "Tentando se reconectar",
"pad.modals.cancel": "Cancelar", "pad.modals.cancel": "Cancelar",
@ -128,6 +129,7 @@
"pad.modals.rateLimited": "Limitado.", "pad.modals.rateLimited": "Limitado.",
"pad.modals.rateLimited.explanation": "Você enviou muitas mensagens para este pad por isso será desconectado.", "pad.modals.rateLimited.explanation": "Você enviou muitas mensagens para este pad por isso será desconectado.",
"pad.modals.rejected.explanation": "O servidor rejeitou uma mensagem que foi enviada pelo seu navegador.", "pad.modals.rejected.explanation": "O servidor rejeitou uma mensagem que foi enviada pelo seu navegador.",
"pad.modals.rejected.cause": "O server pode ter sido atualizado enquanto visualizava esta nota, ou talvez seja apenas um bug do Etherpad. Tenta recarregar a página.",
"pad.modals.disconnected": "Você foi desconectado.", "pad.modals.disconnected": "Você foi desconectado.",
"pad.modals.disconnected.explanation": "A conexão com o servidor foi perdida", "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.modals.disconnected.cause": "O servidor pode estar indisponível. Por favor, notifique o administrador caso isso continue.",

168
src/locales/sc.json Normal file
View file

@ -0,0 +1,168 @@
{
"@metadata": {
"authors": [
"Adr mm"
]
},
"admin.page-title": "Pannellu de amministratzione - Etherpad",
"admin_plugins": "Gestore de connetores",
"admin_plugins.available": "Connetores a disponimentu",
"admin_plugins.available_not-found": "Nissunu connetore a disponimentu",
"admin_plugins.available_fetching": "Recuperende...",
"admin_plugins.available_install.value": "Installa",
"admin_plugins.available_search.placeholder": "Chirca connetores de installare",
"admin_plugins.description": "Descritzione",
"admin_plugins.installed": "Connetores installados",
"admin_plugins.installed_fetching": "Recuperende connetores installados...",
"admin_plugins.installed_nothing": "No as installadu ancora nissunu connetore.",
"admin_plugins.installed_uninstall.value": "Disinstalla",
"admin_plugins.last-update": "Ùrtima atualizatzione",
"admin_plugins.name": "Nòmine",
"admin_plugins.page-title": "Gestore de connetores - Etherpad",
"admin_plugins.version": "Versione",
"admin_plugins_info": "Informatzione pro sa risolutzione de problemas",
"admin_plugins_info.hooks": "Gantzos installados",
"admin_plugins_info.hooks_client": "Gantzos dae su costadu de su cliente",
"admin_plugins_info.hooks_server": "Gantzos dae su costadu de su serbidore",
"admin_plugins_info.parts": "Partes installadas",
"admin_plugins_info.plugins": "Connetores installados",
"admin_plugins_info.page-title": "Informatzione de su connetore - Etherpad",
"admin_plugins_info.version": "Versione de Etherpad",
"admin_plugins_info.version_latest": "Ùrtima versione a disponimentu",
"admin_plugins_info.version_number": "Nùmeru de versione",
"admin_settings": "Cunfiguratzione",
"admin_settings.current": "Cunfiguratzione atuale",
"admin_settings.current_example-devel": "Modellu de esempru de cunfiguratzione de isvilupu",
"admin_settings.current_example-prod": "Modellu de esempru de cunfiguratzione de produtzione",
"admin_settings.current_restart.value": "Torra a aviare Etherpad",
"admin_settings.current_save.value": "Sarva sa cunfiguratzione",
"admin_settings.page-title": "Cunfiguratzione - Etherpad",
"index.newPad": "Pad nou",
"index.createOpenPad": "o crea/aberi unu pad cun su nòmine:",
"index.openPad": "aberi unu pad esistente cun su nòmine:",
"pad.toolbar.bold.title": "Grassetu (Ctrl+B)",
"pad.toolbar.italic.title": "Cursivu (Ctrl+I)",
"pad.toolbar.underline.title": "Sutaliniadu (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Istangadu (Ctrl+5)",
"pad.toolbar.ol.title": "Lista numerada (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Lista cun puntos (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Indentatzione a dereta (Tab)",
"pad.toolbar.unindent.title": "Indentatzione a manca (Shift+Tab)",
"pad.toolbar.undo.title": "Iscontza (Ctrl+Z)",
"pad.toolbar.redo.title": "Torra a fàghere (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Lìmpia is colores de autoria (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importa/esporta dae/a formados de archìviu diferentes",
"pad.toolbar.timeslider.title": "Presentatzione cronologia",
"pad.toolbar.savedRevision.title": "Sarva sa versione",
"pad.toolbar.settings.title": "Cunfiguratzione",
"pad.toolbar.embed.title": "Cumpartzi e incòrpora custu pad",
"pad.toolbar.showusers.title": "Ammustra is utentes in custu pad",
"pad.colorpicker.save": "Sarva",
"pad.colorpicker.cancel": "Annulla",
"pad.loading": "Carrighende...",
"pad.noCookie": "Su testimòngiu no est istètiu agatadu. Permite is testimòngios in su navigadore tuo. Sa sessione e sa cunfiguratzione tuas no ant a èssere sarvadas intre bìsitas. Podet èssere pro more de s'inclusione de Etherpad comente iFrame in tzertos navigadores. Assegura·ti chi Etherpad s'agatat in su pròpiu sutadomìniu/domìniu chi s'iFrame printzipale",
"pad.permissionDenied": "Non tenes permissu pro atzèdere a custu pad",
"pad.settings.padSettings": "Cunfiguratzione de su pad",
"pad.settings.myView": "Sa visualizatzione mia",
"pad.settings.stickychat": "Ammustra semper sa tzarrada",
"pad.settings.chatandusers": "Ammustra sa tzarrada e is utentes",
"pad.settings.colorcheck": "Colores de autoria",
"pad.settings.linenocheck": "Nùmeros de lìnia",
"pad.settings.rtlcheck": "Cuntenutu dae manca a dereta",
"pad.settings.fontType": "Tipu de caràtere:",
"pad.settings.fontType.normal": "Normale",
"pad.settings.language": "Lìngua:",
"pad.settings.about": "Informatziones",
"pad.settings.poweredBy": "Realizadu cun",
"pad.importExport.import_export": "Importatzione/esportatzione",
"pad.importExport.import": "Càrriga un'archìviu de testu o unu documentu",
"pad.importExport.importSuccessful": "Carrigadu.",
"pad.importExport.export": "Esporta su pad atuale comente:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Testu sèmplitze",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Documentu Formadu)",
"pad.importExport.abiword.innerHTML": "Isceti is formados de testu sèmplitze o HTML podent èssere importados. Pro mètodos avantzados de importatzione, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">installa AbiWord o LibreOffice</a>.",
"pad.modals.connected": "Connètidu.",
"pad.modals.reconnecting": "Connetende a su pad tuo...",
"pad.modals.forcereconnect": "Fortza sa connesione",
"pad.modals.reconnecttimer": "Torrende a connètere in",
"pad.modals.cancel": "Annulla",
"pad.modals.userdup": "Abertu in una àtera ventana",
"pad.modals.userdup.explanation": "Podet dare chi custu pad siat abertu in un'àtera ischeda de custu navigadore in custu ordinadore.",
"pad.modals.userdup.advice": "Torra a connètere pro impreare custa ventana.",
"pad.modals.unauth": "Chena autorizatzione",
"pad.modals.unauth.explanation": "Is permissos tuos sunt istados cambiados in su mentras chi fias bidende custa pàgina. Prova de ti torrare a connètere.",
"pad.modals.looping.explanation": "Bi sunt problemas de comunicatzione cun su serbidore de sincronizatzione.",
"pad.modals.looping.cause": "Forsis sa connessione at impreadu unu serbidore intermediàriu (proxy) o unu firewall chi no est cumpatìbile.",
"pad.modals.initsocketfail": "Su serbidore no est atzessìbile.",
"pad.modals.initsocketfail.explanation": "Impossìbile connètere cun su serbidore de sincronizatzione.",
"pad.modals.initsocketfail.cause": "Podet èssere a càusa de unu problema cun su navigadore tuo o cun sa connessione de internet.",
"pad.modals.slowcommit.explanation": "Su serbidore non rispondet.",
"pad.modals.slowcommit.cause": "Podet èssere a càusa de problemas cun sa connessione de internet.",
"pad.modals.badChangeset.explanation": "Una modìfica tua est istada cunsiderada illegale dae su serbidore de sincronizatzione.",
"pad.modals.badChangeset.cause": "Podet èssere a càusa de una cunfiguratzione de serbidore isballiada o calicunu àteru cumportamentu imprevistu. Iscrie a s'amministratzione de su servìtziu si pensas chi siat un'errore. Prova a connètere torra pro sighire a modificare.",
"pad.modals.corruptPad.explanation": "Su pad a su chi ses chirchende de atzèdere est dannadu.",
"pad.modals.corruptPad.cause": "Podet èssere a càusa de una cunfiguratzione de serbidore non curreta o pro unu cumportamentu imprevistu. Iscrie a s'amministratzione de su servìtziu.",
"pad.modals.deleted": "Cantzelladu.",
"pad.modals.deleted.explanation": "Pad cantzelladu.",
"pad.modals.rateLimited": "Frecuèntzia limitada.",
"pad.modals.rateLimited.explanation": "As imbiadu tropu messàgios a custu pad e t'at disconnètidu.",
"pad.modals.rejected.explanation": "Su serbidore at rifiutadu unu messàgiu imbiadu dae su navigadore tuo.",
"pad.modals.rejected.cause": "Podet èssere chi su serbidore siat istadu atualizadu in su mentras chi fias bidende su pad, o podet èssere chi bi siat un'errore in Etherpad. Prova a atualizare sa pàgina.",
"pad.modals.disconnected": "Disconnètidu.",
"pad.modals.disconnected.explanation": "Connessione cun su serbidore pèrdida.",
"pad.modals.disconnected.cause": "Su serbidore no est a disponimentu. Iscrie a s'amministratzione de su servìtziu si su problema persistet.",
"pad.share": "Cumpartzi custu pad",
"pad.share.readonly": "Letura isceti",
"pad.share.link": "Ligàmene",
"pad.share.emebdcode": "Incòrpora URL",
"pad.chat": "Tzarrada",
"pad.chat.title": "Aberi sa tzarrada pro custu pad.",
"pad.chat.loadmessages": "Càrriga àteros messàgios",
"pad.chat.stick.title": "Apica sa tzarrada in s'ischermu",
"pad.chat.writeMessage.placeholder": "Iscrie su messàgiu tuo inoghe",
"timeslider.followContents": "Sighi sas atualizatziones de cuntenutu de su pad",
"timeslider.pageTitle": "Cronologia {{appTitle}}",
"timeslider.toolbar.returnbutton": "Torra a su pad",
"timeslider.toolbar.authors": "Autores:",
"timeslider.toolbar.authorsList": "Nissunu autore",
"timeslider.toolbar.exportlink.title": "Esporta",
"timeslider.exportCurrent": "Esporta sa versione atuale comente:",
"timeslider.version": "Versione {{version}}",
"timeslider.saved": "Sarvadu su {{day}} de {{month}} de su {{year}}",
"timeslider.playPause": "Riprodutzione/pàusa de is cuntenutos de su pad",
"timeslider.backRevision": "Bae a una versione pretzedente de custu pad",
"timeslider.forwardRevision": "Bae a una versione imbeniente de custu pad",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Ghennàrgiu",
"timeslider.month.february": "Freàrgiu",
"timeslider.month.march": "Martzu",
"timeslider.month.april": "Abrile",
"timeslider.month.may": "Maju",
"timeslider.month.june": "Làmpadas",
"timeslider.month.july": "Mese de argiolas",
"timeslider.month.august": "Austu",
"timeslider.month.september": "Cabudanni",
"timeslider.month.october": "Ledàmine",
"timeslider.month.november": "Onniasantu",
"timeslider.month.december": "Mese de idas",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: autore, other: autores ]} chena nòmine",
"pad.savedrevs.marked": "Custa revisione est istada marcada comente revisione sarvada",
"pad.savedrevs.timeslider": "Podes bìdere is versiones sarvadas bisitende sa cronologia",
"pad.userlist.entername": "Inserta su nòmine tuo",
"pad.userlist.unnamed": "Chena nòmine",
"pad.editbar.clearcolors": "Seguru chi boles limpiare is colores de autoria de totu su documentu? Custa atzione no dda podes annullare",
"pad.impexp.importbutton": "Importa immoe",
"pad.impexp.importing": "Importende...",
"pad.impexp.confirmimport": "S'importatzione de un'archìviu at a subraiscrìere su testu atuale de su pad. Seguru chi boles sighire?",
"pad.impexp.convertFailed": "Impossìbile importare custu archìviu. Imprea unu formadu de documentu diferente o còpia e incolla a manu",
"pad.impexp.padHasData": "Impossìbile importare custu archìviu pro ite custu pad est istadu giai modificadu. Importa·ddu in unu pad nou",
"pad.impexp.uploadFailed": "Errore in sa càrriga. Torra a provare",
"pad.impexp.importfailed": "Errore de importatzione",
"pad.impexp.copypaste": "Còpia e incolla",
"pad.impexp.exportdisabled": "S'esportatzione comente {{type}} est disativada. Iscrie a s'amministratzione de su sistema pro àteras informatziones.",
"pad.impexp.maxFileSize": "S'archìviu est tropu manu. Iscrie a s'amministratzione pro ismanniare sa dimensione permìtida pro s'importatzione"
}

View file

@ -5,8 +5,16 @@
"Vlad5250" "Vlad5250"
] ]
}, },
"admin_plugins.available_not-found": "Nijedan plugin nije pronađen.",
"admin_plugins.description": "Opis",
"admin_plugins.installed_uninstall.value": "Deinstaliraj",
"admin_plugins.last-update": "Posljednja podnova",
"admin_plugins.name": "Naziv",
"admin_plugins.version": "Verzija",
"admin_settings.current_save.value": "Sačuvaj podešavanja",
"index.newPad": "Novi blokić", "index.newPad": "Novi blokić",
"index.createOpenPad": "ili napravite/otvorite blokić s imenom:", "index.createOpenPad": "ili napravite/otvorite blokić s imenom:",
"index.openPad": "otvori postojeći blokić Etherpada s imenom:",
"pad.toolbar.bold.title": "Podebljano (Ctrl+B)", "pad.toolbar.bold.title": "Podebljano (Ctrl+B)",
"pad.toolbar.italic.title": "Ukošeno (Ctrl+I)", "pad.toolbar.italic.title": "Ukošeno (Ctrl+I)",
"pad.toolbar.underline.title": "Podcrtano (Ctrl+U)", "pad.toolbar.underline.title": "Podcrtano (Ctrl+U)",
@ -14,7 +22,7 @@
"pad.toolbar.ol.title": "Poredani spisak (Ctrl+Shift+N)", "pad.toolbar.ol.title": "Poredani spisak (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Neporedani spisak (Ctrl+Shift+L)", "pad.toolbar.ul.title": "Neporedani spisak (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Uvlaka (TAB)", "pad.toolbar.indent.title": "Uvlaka (TAB)",
"pad.toolbar.unindent.title": "Izvlaka (Shift+TAB)", "pad.toolbar.unindent.title": "Izvlačenje (Shift+TAB)",
"pad.toolbar.undo.title": "Vrati (Ctrl+Z)", "pad.toolbar.undo.title": "Vrati (Ctrl+Z)",
"pad.toolbar.redo.title": "Ponovi (Ctrl+Y)", "pad.toolbar.redo.title": "Ponovi (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Ukloni boje autorstva (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "Ukloni boje autorstva (Ctrl+Shift+C)",
@ -27,7 +35,7 @@
"pad.colorpicker.save": "Snimi", "pad.colorpicker.save": "Snimi",
"pad.colorpicker.cancel": "Otkaži", "pad.colorpicker.cancel": "Otkaži",
"pad.loading": "Učitavam...", "pad.loading": "Učitavam...",
"pad.noCookie": "Nisam mogao pronaći kolačić. Omogućite kolačiće u vašem pregledniku!", "pad.noCookie": "Kolačić nije pronađen. Molimo Vas, omogućite kolačiće u Vašem pregledniku! Sesija i podešavanja neće biti sačuvana uz sljedeće posjećivanje. Razlog može biti uključenost Etherpada u iFrame u nekim preglednicima. Molimo Vas, osigurajte da je Etherpad na istoj poddomeni/domeni kao i roditeljski iFrame",
"pad.permissionDenied": "Za ovdje nije potrebna dozvola za pristup", "pad.permissionDenied": "Za ovdje nije potrebna dozvola za pristup",
"pad.settings.padSettings": "Postavke blokića", "pad.settings.padSettings": "Postavke blokića",
"pad.settings.myView": "Moj prikaz", "pad.settings.myView": "Moj prikaz",
@ -38,6 +46,8 @@
"pad.settings.rtlcheck": "Da prikažem sadržaj zdesna ulijevo?", "pad.settings.rtlcheck": "Da prikažem sadržaj zdesna ulijevo?",
"pad.settings.fontType": "Tip fonta:", "pad.settings.fontType": "Tip fonta:",
"pad.settings.language": "Jezik:", "pad.settings.language": "Jezik:",
"pad.settings.about": "O projektu",
"pad.settings.poweredBy": "Omogućeno od strane",
"pad.importExport.import_export": "Uvoz/Izvoz", "pad.importExport.import_export": "Uvoz/Izvoz",
"pad.importExport.import": "Otpremanje bilo koje tekstualne datoteke ili dokumenta", "pad.importExport.import": "Otpremanje bilo koje tekstualne datoteke ili dokumenta",
"pad.importExport.importSuccessful": "Uspješno!", "pad.importExport.importSuccessful": "Uspješno!",
@ -48,7 +58,7 @@
"pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Možete uvoziti samo iz običnog teksta te HTML-formata. Naprednije mogućnosti uvoza dobit ćete ako <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">uspostavite AbiWord</a>.", "pad.importExport.abiword.innerHTML": "Možete uvoziti samo iz običnog teksta te datoteke u formatima HTML-a. Naprednije mogućnosti uvoza dobit ćete ako <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instalirajte AbiWord ili LibreOffice</a>.",
"pad.modals.connected": "Povezano.", "pad.modals.connected": "Povezano.",
"pad.modals.reconnecting": "Prepovezujemo Vas s blokićem...", "pad.modals.reconnecting": "Prepovezujemo Vas s blokićem...",
"pad.modals.forcereconnect": "Nametni prepovezivanje", "pad.modals.forcereconnect": "Nametni prepovezivanje",
@ -72,6 +82,10 @@
"pad.modals.corruptPad.cause": "Ovo može biti zbog pogrešne postavljenosti poslužitelja ili nekog drugog neočekivanog ponašanja. Obratite se administratoru.", "pad.modals.corruptPad.cause": "Ovo može biti zbog pogrešne postavljenosti poslužitelja ili nekog drugog neočekivanog ponašanja. Obratite se administratoru.",
"pad.modals.deleted": "Obrisano.", "pad.modals.deleted": "Obrisano.",
"pad.modals.deleted.explanation": "Ovaj blokić je uklonjen.", "pad.modals.deleted.explanation": "Ovaj blokić je uklonjen.",
"pad.modals.rateLimited": "Ograničenje stopa.",
"pad.modals.rateLimited.explanation": "Poslali ste previše poruka na ovaj blokić, te ste stoga odspojeni.",
"pad.modals.rejected.explanation": "Poslužitelj je odbio poruku koju je poslao vaš preglednik.",
"pad.modals.rejected.cause": "Poslužitelj je možda podnovljen dok ste gledali blokić, ili možda postoji greška u Etherpadu. Pokušajte ponovo učitati stranicu.",
"pad.modals.disconnected": "Veza je prekinuta.", "pad.modals.disconnected": "Veza je prekinuta.",
"pad.modals.disconnected.explanation": "Veza s poslužiteljem je prekinuta", "pad.modals.disconnected.explanation": "Veza s poslužiteljem je prekinuta",
"pad.modals.disconnected.cause": "Moguće je da server nije dostupan. Obavijestite administratora ako se ovo nastavi događati.", "pad.modals.disconnected.cause": "Moguće je da server nije dostupan. Obavijestite administratora ako se ovo nastavi događati.",
@ -84,6 +98,7 @@
"pad.chat.loadmessages": "Učitaj više poruka", "pad.chat.loadmessages": "Učitaj više poruka",
"pad.chat.stick.title": "Zalijepi ćaskanje na ekranu", "pad.chat.stick.title": "Zalijepi ćaskanje na ekranu",
"pad.chat.writeMessage.placeholder": "Ovdje napišite poruku", "pad.chat.writeMessage.placeholder": "Ovdje napišite poruku",
"timeslider.followContents": "Prati podnove sadržaja blokića",
"timeslider.pageTitle": "{{appTitle}} Historijski pregled", "timeslider.pageTitle": "{{appTitle}} Historijski pregled",
"timeslider.toolbar.returnbutton": "Natrag na blokić", "timeslider.toolbar.returnbutton": "Natrag na blokić",
"timeslider.toolbar.authors": "Autori:", "timeslider.toolbar.authors": "Autori:",
@ -113,7 +128,7 @@
"pad.savedrevs.timeslider": "Možete pogledati spremljene inačice rabeći vremesledni klizač", "pad.savedrevs.timeslider": "Možete pogledati spremljene inačice rabeći vremesledni klizač",
"pad.userlist.entername": "Upišite svoje ime", "pad.userlist.entername": "Upišite svoje ime",
"pad.userlist.unnamed": "bez imena", "pad.userlist.unnamed": "bez imena",
"pad.editbar.clearcolors": "Ukloniti boje autorstva sa cijelog dokumenta?", "pad.editbar.clearcolors": "Ukloniti boje autorstva sa cijelog dokumenta? Radnju nije moguće poništiti",
"pad.impexp.importbutton": "Uvezi odmah", "pad.impexp.importbutton": "Uvezi odmah",
"pad.impexp.importing": "Uvozim...", "pad.impexp.importing": "Uvozim...",
"pad.impexp.confirmimport": "Uvoženje datoteke presnimit će trenutni sadržaj blokića.\nJeste li sigurni da želite nastaviti?", "pad.impexp.confirmimport": "Uvoženje datoteke presnimit će trenutni sadržaj blokića.\nJeste li sigurni da želite nastaviti?",
@ -122,5 +137,6 @@
"pad.impexp.uploadFailed": "Postavljanje nije uspjelo. Pokušajte ponovo.", "pad.impexp.uploadFailed": "Postavljanje nije uspjelo. Pokušajte ponovo.",
"pad.impexp.importfailed": "Uvoz nije uspio", "pad.impexp.importfailed": "Uvoz nije uspio",
"pad.impexp.copypaste": "Prekopirajte", "pad.impexp.copypaste": "Prekopirajte",
"pad.impexp.exportdisabled": "Izvoz u formatu {{type}} je onemogućen. Ako želite saznati više o ovome, obratite se administratoru sustava." "pad.impexp.exportdisabled": "Izvoz u formatu {{type}} je onemogućen. Ako želite saznati više o ovome, obratite se administratoru sustava.",
"pad.impexp.maxFileSize": "Datoteka je prevelika. Kontaktirajte administratora kako biste zatražili povećanje dopuštene veličine datoteke za uvoz"
} }

View file

@ -1,6 +1,7 @@
{ {
"@metadata": { "@metadata": {
"authors": [ "authors": [
"Jose1711",
"Kusavica", "Kusavica",
"Lexected", "Lexected",
"Mark", "Mark",
@ -39,7 +40,7 @@
"admin_settings.current": "Aktuálne nastavenia", "admin_settings.current": "Aktuálne nastavenia",
"admin_settings.current_example-devel": "Príklad šablóny vývojárskeho nastavenia", "admin_settings.current_example-devel": "Príklad šablóny vývojárskeho nastavenia",
"admin_settings.current_example-prod": "Príklad šablóny výrobného nastavenia", "admin_settings.current_example-prod": "Príklad šablóny výrobného nastavenia",
"admin_settings.current_restart.value": "Reštartovať Ehterpad", "admin_settings.current_restart.value": "Reštartovať Etherpad",
"admin_settings.current_save.value": "Uložiť nastavenia", "admin_settings.current_save.value": "Uložiť nastavenia",
"admin_settings.page-title": "Nastavenia - Etherpad", "admin_settings.page-title": "Nastavenia - Etherpad",
"index.newPad": "Nový poznámkový blok", "index.newPad": "Nový poznámkový blok",
@ -154,7 +155,7 @@
"timeslider.month.october": "októbra", "timeslider.month.october": "októbra",
"timeslider.month.november": "novembra", "timeslider.month.november": "novembra",
"timeslider.month.december": "decembra", "timeslider.month.december": "decembra",
"timeslider.unnamedauthors": "{[plural(num) one:Počet nemenovaných autorov:, other: Počet nemenovaných autorov:]} {{num}}", "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.savedrevs.marked": "Táto revízia bola označená ako uložená",
"pad.savedrevs.timeslider": "Návštevou časovej osi môžete zobraziť uložené revízie", "pad.savedrevs.timeslider": "Návštevou časovej osi môžete zobraziť uložené revízie",
"pad.userlist.entername": "Zadajte svoje meno", "pad.userlist.entername": "Zadajte svoje meno",

View file

@ -4,10 +4,29 @@
"Saraiki" "Saraiki"
] ]
}, },
"admin_plugins": "پلگ ان منیجر",
"admin_plugins.available": "دستیاب پلگ ان",
"admin_plugins.available_not-found": "کوئی پلگ ان کائنی لبھے۔",
"admin_plugins.available_install.value": "انسٹال",
"admin_plugins.description": "تفصیل",
"admin_plugins.installed_uninstall.value": "ان انسٹال",
"admin_plugins.last-update": "چھیکڑی تبدیلی",
"admin_plugins.name": "ناں",
"admin_plugins.version": "ورژن",
"admin_plugins_info.parts": "انسٹال تھئے حصے",
"admin_plugins_info.plugins": "انسٹال تھئے پلگ ان",
"admin_plugins_info.version_number": "ورشن نمبر",
"admin_settings": "ترتیباں",
"admin_settings.current_save.value": "ترتیباں محفوظ کرو",
"admin_settings.page-title": "ترتیباں ــ ایتھرپیڈ",
"index.newPad": "نواں پیڈ", "index.newPad": "نواں پیڈ",
"pad.toolbar.bold.title": "بولڈ(Ctrl+B)", "pad.toolbar.bold.title": "بولڈ(Ctrl+B)",
"pad.toolbar.italic.title": "ترچھے (Ctrl+I)", "pad.toolbar.italic.title": "ترچھے (Ctrl+I)",
"pad.toolbar.underline.title": "ہیٹھ لکیر (Ctrl+U)", "pad.toolbar.underline.title": "ہیٹھ لکیر (Ctrl+U)",
"pad.toolbar.indent.title": "حاشیہ (ٹیب)",
"pad.toolbar.unindent.title": "حاشیہ ٻاہر دوں (شفٹ + ٹیٻ)",
"pad.toolbar.undo.title": "اݨ کیتا (کنٹرول + زیڈ)",
"pad.toolbar.redo.title": "ولدا کرو (کنٹرول + وائی)",
"pad.toolbar.savedRevision.title": "رویژن بچاؤ", "pad.toolbar.savedRevision.title": "رویژن بچاؤ",
"pad.toolbar.settings.title": "ترتیباں", "pad.toolbar.settings.title": "ترتیباں",
"pad.colorpicker.save": "بچاؤ", "pad.colorpicker.save": "بچاؤ",
@ -16,6 +35,8 @@
"pad.settings.padSettings": "پیڈ ترتیباں", "pad.settings.padSettings": "پیڈ ترتیباں",
"pad.settings.fontType": "فونٹ قسم:", "pad.settings.fontType": "فونٹ قسم:",
"pad.settings.language": "زبان:", "pad.settings.language": "زبان:",
"pad.settings.about": "تعارف",
"pad.settings.poweredBy": "تکڑا کرݨ آلے",
"pad.importExport.importSuccessful": "کامیاب!", "pad.importExport.importSuccessful": "کامیاب!",
"pad.importExport.exportetherpad": "ایتھرپیڈ", "pad.importExport.exportetherpad": "ایتھرپیڈ",
"pad.importExport.exporthtml": "ایچ ٹی ایم ایل", "pad.importExport.exporthtml": "ایچ ٹی ایم ایل",

View file

@ -9,130 +9,165 @@
"Upwinxp" "Upwinxp"
] ]
}, },
"admin.page-title": "Administratorska nadzorna plošča Etherpad",
"admin_plugins": "Upravitelj vtičnikov",
"admin_plugins.available": "Razpoložljivi vtičniki",
"admin_plugins.available_not-found": "Ni najdenih vtičnikov.",
"admin_plugins.available_fetching": "Pridobivanje ...",
"admin_plugins.available_install.value": "Namesti",
"admin_plugins.available_search.placeholder": "Poiščite vtičnike za namestitev",
"admin_plugins.description": "Opis", "admin_plugins.description": "Opis",
"admin_plugins.installed": "Nameščeni vtičniki",
"admin_plugins.installed_fetching": "Pridobivanje nameščenih vtičnikov ...",
"admin_plugins.installed_nothing": "Namestili niste še nobenega vtičnika.",
"admin_plugins.installed_uninstall.value": "Odmesti",
"admin_plugins.last-update": "Zadnja posodobitev", "admin_plugins.last-update": "Zadnja posodobitev",
"admin_plugins.name": "Ime", "admin_plugins.name": "Ime",
"admin_plugins.page-title": "Upravitelj vtičnikov Etherpad",
"admin_plugins.version": "Različica", "admin_plugins.version": "Različica",
"admin_plugins_info": "Informacije o odpravljanju težav",
"admin_plugins_info.hooks": "Nameščene razširitvene točke",
"admin_plugins_info.hooks_client": "Razširitvene točke na strani odjemalca",
"admin_plugins_info.hooks_server": "Razširitvene točke na strani strežnika",
"admin_plugins_info.parts": "Nameščeni deli",
"admin_plugins_info.plugins": "Nameščeni vtičniki",
"admin_plugins_info.page-title": "Informacije o vtičniku Etherpad",
"admin_plugins_info.version": "Različica Etherpada",
"admin_plugins_info.version_latest": "Najnovejša razpoložljiva različica",
"admin_plugins_info.version_number": "Številka različice",
"admin_settings": "Nastavitve", "admin_settings": "Nastavitve",
"admin_settings.current": "Trenutna konfiguracija",
"admin_settings.current_example-devel": "Zgled predloge za razvojne nastavitve",
"admin_settings.current_example-prod": "Zgled predloge za roizvodne nastavitve",
"admin_settings.current_restart.value": "Znova zaženi Etherpad",
"admin_settings.current_save.value": "Shrani nastavitve", "admin_settings.current_save.value": "Shrani nastavitve",
"index.newPad": "Nov dokument", "admin_settings.page-title": "Nastavitve Etherpad",
"index.createOpenPad": "ali pa ustvari/odpri dokument z imenom:", "index.newPad": "Nov blokec",
"pad.toolbar.bold.title": "Krepko (Ctrl-B)", "index.createOpenPad": "ali pa ustvari/odpri blokec z imenom:",
"pad.toolbar.italic.title": "Ležeče (Ctrl-I)", "index.openPad": "odpri obstoječ blokec z imenom:",
"pad.toolbar.underline.title": "Podčrtano (Ctrl-U)", "pad.toolbar.bold.title": "Krepko (Ctrl + B)",
"pad.toolbar.strikethrough.title": "Prečrtano (Ctrl+5)", "pad.toolbar.italic.title": "Ležeče (Ctrl + I)",
"pad.toolbar.ol.title": "Urejen seznam (Ctrl+Shift+N)", "pad.toolbar.underline.title": "Podčrtano (Ctrl + U)",
"pad.toolbar.ul.title": "Neurejen seznam (Ctrl+Shift+L)", "pad.toolbar.strikethrough.title": "Prečrtano (Ctrl + 5)",
"pad.toolbar.ol.title": "Urejen seznam (Ctrl + dvigalka + N)",
"pad.toolbar.ul.title": "Neurejen seznam (Ctrl + dvigalka + L)",
"pad.toolbar.indent.title": "Zamik desno (TAB)", "pad.toolbar.indent.title": "Zamik desno (TAB)",
"pad.toolbar.unindent.title": "Zamik levo (Shift+TAB)", "pad.toolbar.unindent.title": "Zmanjšanje zamika (Shift+TAB)",
"pad.toolbar.undo.title": "Razveljavi (Ctrl-Z)", "pad.toolbar.undo.title": "Razveljavi (Ctrl + Z)",
"pad.toolbar.redo.title": "Ponovno uveljavi (Ctrl-Y)", "pad.toolbar.redo.title": "Znova uveljavi (Ctrl + Y)",
"pad.toolbar.clearAuthorship.title": "Počisti barve avtorstva (Ctrl+Shift+C)", "pad.toolbar.clearAuthorship.title": "Počisti barve avtorstva (Ctrl + dvigalka + C)",
"pad.toolbar.import_export.title": "Uvozi/Izvozi različne oblike zapisov", "pad.toolbar.import_export.title": "Uvozi/Izvozi iz/v različne datotečne formate",
"pad.toolbar.timeslider.title": "Časovni trak", "pad.toolbar.timeslider.title": "Časovni trak",
"pad.toolbar.savedRevision.title": "Shrani redakcijo", "pad.toolbar.savedRevision.title": "Shrani redakcijo",
"pad.toolbar.settings.title": "Nastavitve", "pad.toolbar.settings.title": "Nastavitve",
"pad.toolbar.embed.title": "Deli in vključi ta dokument", "pad.toolbar.embed.title": "Deli in vključi ta blokec",
"pad.toolbar.showusers.title": "Pokaži uporabnike dokumenta", "pad.toolbar.showusers.title": "Pokaži uporabnike blokca",
"pad.colorpicker.save": "Shrani", "pad.colorpicker.save": "Shrani",
"pad.colorpicker.cancel": "Prekliči", "pad.colorpicker.cancel": "Prekliči",
"pad.loading": "Nalaganje ...", "pad.loading": "Nalaganje ...",
"pad.noCookie": "Piškotka ni bilo mogoče najti. Prosimo, dovolite piškotke v vašem brskalniku!", "pad.noCookie": "Piškotka ni bilo mogoče najti. Prosimo, dovolite piškotke v vašem brskalniku! Vaša seja in nastavitve se med obiski ne bodo shranili. Razlog za to je morda, da je Etherpad v nekaterih brskalnikih vključen v iFrame. Zsgotovite, da je Etherpad na isti poddomeni/domeni kot nadrejeni iFrame.",
"pad.permissionDenied": "Nimate dovoljenja za dostop do tega dokumenta.", "pad.permissionDenied": "Nimate dovoljenja za dostop do tega bkokca.",
"pad.settings.padSettings": "Nastavitve dokumenta", "pad.settings.padSettings": "Nastavitve blokca.",
"pad.settings.myView": "Moj prikaz", "pad.settings.myView": "Moj prikaz",
"pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu", "pad.settings.stickychat": "Vsebina klepeta je vedno na zaslonu",
"pad.settings.chatandusers": "Prikaži klepet in uporabnike", "pad.settings.chatandusers": "Prikaži klepet in uporabnike",
"pad.settings.colorcheck": "Barve avtorstva", "pad.settings.colorcheck": "Barve avtorstva",
"pad.settings.linenocheck": "Številke vrstic", "pad.settings.linenocheck": "Številke vrstic",
"pad.settings.rtlcheck": "Ali naj se vsebina prebira od desne proti levi?", "pad.settings.rtlcheck": "Ali naj se vsebina bera od desne proti levi?",
"pad.settings.fontType": "Vrsta pisave:", "pad.settings.fontType": "Vrsta pisave:",
"pad.settings.fontType.normal": "Normalno", "pad.settings.fontType.normal": "Normalno",
"pad.settings.language": "Jezik:", "pad.settings.language": "Jezik:",
"pad.settings.about": "Kolofon",
"pad.settings.poweredBy": "Omogoča", "pad.settings.poweredBy": "Omogoča",
"pad.importExport.import_export": "Uvoz/Izvoz", "pad.importExport.import_export": "Uvoz/Izvoz",
"pad.importExport.import": "Naloži katerokoli besedilno datoteko ali dokument.", "pad.importExport.import": "Naložite katero koli besedilno datoteko ali dokument.",
"pad.importExport.importSuccessful": "Opravilo je uspešno končano!", "pad.importExport.importSuccessful": "Uspešno!",
"pad.importExport.export": "Izvozi trenutni dokument kot:", "pad.importExport.export": "Izvozi trenutni blokec kot:",
"pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML (oblikovano besedilo)", "pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "TXT (neoblikovano besedilo)", "pad.importExport.exportplain": "Golo besedilo",
"pad.importExport.exportword": "DOC (zapis Microsoft Word)", "pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF (zapis Acrobat PDF)", "pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (zapis Open Document)", "pad.importExport.exportopen": "ODF",
"pad.importExport.abiword.innerHTML": "Uvoziti je mogoče le neoblikovano besedilo in zapise HTML. Za naprednejše možnosti uvoza namestite program <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">AbiWord</a>.", "pad.importExport.abiword.innerHTML": "Uvoziti je mogoče le golo besedilo in formate HTML. Za naprednejše možnosti uvoza namestite program <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">AbiWord</a>.",
"pad.modals.connected": "Povezano.", "pad.modals.connected": "Povezano.",
"pad.modals.reconnecting": "Poteka povezovanje z dokumentom ...", "pad.modals.reconnecting": "Poteka povezovanje z blokcem ...",
"pad.modals.forcereconnect": "Vsili ponovno povezavo", "pad.modals.forcereconnect": "Vsili ponovno povezavo",
"pad.modals.reconnecttimer": "Poskus ponovne vzpostavitve povezave čez", "pad.modals.reconnecttimer": "Poskus ponovne vzpostavitve povezave čez",
"pad.modals.cancel": "Prekliči", "pad.modals.cancel": "Prekliči",
"pad.modals.userdup": "Dokument je že odprt v v drugem oknu", "pad.modals.userdup": "Blokec je že odprt 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.explanation": "Videti je, da je ta blokec na tem računalniku odprt v več kot enem oknu brskalnika.",
"pad.modals.userdup.advice": "Ponovno vzpostavite povezavo in uporabljajte to okno.", "pad.modals.userdup.advice": "Znova vzpostavite povezavo in uporabljajte to okno.",
"pad.modals.unauth": "Nepooblaščen dostop", "pad.modals.unauth": "Nepooblaščen dostop",
"pad.modals.unauth.explanation": "Med ogledovanjem strani so se dovoljenja za ogled spremenila. Poskusite se znova povezati.", "pad.modals.unauth.explanation": "Med ogledovanjem strani so se vaša dovoljenja za ogled spremenila. Poskusite se znova povezati.",
"pad.modals.looping.explanation": "Zaznane so težave pri komunikaciji s strežnikom za usklajevanje.", "pad.modals.looping.explanation": "Pri komunikaciji s sinhronizacijskim strežnikom je prišlo do težav.",
"pad.modals.looping.cause": "Morda ste se povezali skozi neustrezno nastavljen požarni zid ali s posredniškim strežnikom.", "pad.modals.looping.cause": "Morda ste se povezali skozi neustrezno nastavljen požarni zid ali prek posredniškega strežnika.",
"pad.modals.initsocketfail": "Strežnik je nedosegljiv.", "pad.modals.initsocketfail": "Strežnik je nedosegljiv.",
"pad.modals.initsocketfail.explanation": "Povezava s strežnikom za usklajevanje ni mogoča.", "pad.modals.initsocketfail.explanation": "Povezovanje s sinhronizacijskim strežnikom ni uspelo.",
"pad.modals.initsocketfail.cause": "Najverjetneje gre za težavo z vašim brskalnikom, ali internetno povezavo.", "pad.modals.initsocketfail.cause": "Najverjetneje gre za težavo z vašim brskalnikom ali internetno povezavo.",
"pad.modals.slowcommit.explanation": "Strežnik se ne odziva.", "pad.modals.slowcommit.explanation": "Strežnik se ne odziva.",
"pad.modals.slowcommit.cause": "Možen vzrok so težave z omrežno povezljivostjo.", "pad.modals.slowcommit.cause": "Možen vzrok so težave z omrežno povezljivostjo.",
"pad.modals.badChangeset.explanation": "Urejanje, ki ste ga naredili, je strežnik za usklajevanje označil kot nedovoljeno.", "pad.modals.badChangeset.explanation": "Urejanje, ki ste ga naredili, je sinhronizacijski strežnik prepoznal kot nedovoljeno.",
"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 skrbnikom storitve, če menite, da gre za napako. Poskusite se ponovno povezati, da nadaljujete z urejanjem.", "pad.modals.badChangeset.cause": "Razlog za to je morda napačna konfiguracija strežnika ali neko drugo nepričakovano vedenje. Če menite, da gre za napako, stopite v stik z administratorjem storitve. Za nadaljevanje urejanja se poskusite znova povezati.",
"pad.modals.corruptPad.explanation": "Dokument, do katerega želite dostopati, je poškodovan.", "pad.modals.corruptPad.explanation": "Blokec, 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 s skrbnikom storitve.", "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 administratorjem storitve.",
"pad.modals.deleted": "Izbrisano.", "pad.modals.deleted": "Izbrisano.",
"pad.modals.deleted.explanation": "Dokument je odstranjen.", "pad.modals.deleted.explanation": "Blokec je odstranjen.",
"pad.modals.rateLimited": "Omejena hitrost.",
"pad.modals.rateLimited.explanation": "Na ta blokec ste poslali preveč sporočil, zato ste bili odklopljeni.",
"pad.modals.rejected.explanation": "Strežnik je zavrnil sporočilo, ki ga je poslal vaš brskalnik.",
"pad.modals.rejected.cause": "Strežnik je bil morda posodobljen, ko ste si ogledovali blokec, ali pa je v Etherpadu napaka. Poskusite znova naložiti stran.",
"pad.modals.disconnected": "Vaša povezava je bila prekinjena.", "pad.modals.disconnected": "Vaša povezava je bila prekinjena.",
"pad.modals.disconnected.explanation": "Povezava s strežnikom je bila izgubljena.", "pad.modals.disconnected.explanation": "Povezava s strežnikom je bila izgubljena.",
"pad.modals.disconnected.cause": "Strežnik morda ni na voljo. Prosimo, obvestite skrbnika storitve, če se to zgodi večkrat.", "pad.modals.disconnected.cause": "Strežnik morda ni na voljo. Če se to ponavlja, obvestite administratorja storitve.",
"pad.share": "Določi souporabo dokumenta", "pad.share": "Deljenje blokca",
"pad.share.readonly": "Samo za branje", "pad.share.readonly": "Samo za branje",
"pad.share.link": "Povezava", "pad.share.link": "Povezava",
"pad.share.emebdcode": "URL za vključitev", "pad.share.emebdcode": "URL za vključitev",
"pad.chat": "Klepet", "pad.chat": "Klepet",
"pad.chat.title": "Odpri klepetalno okno dokumenta.", "pad.chat.title": "Odpri klepetalno okno za blokec.",
"pad.chat.loadmessages": "Naloži več sporočil", "pad.chat.loadmessages": "Naloži več sporočil",
"pad.chat.stick.title": "Prilepi klepet na zaslon", "pad.chat.stick.title": "Prilepi klepet na zaslon",
"pad.chat.writeMessage.placeholder": "Napišite sporočilo", "pad.chat.writeMessage.placeholder": "Napišite sporočilo",
"timeslider.followContents": "Spremljajte posodobitve vsebine blokca",
"timeslider.pageTitle": "Časovni trak {{appTitle}}", "timeslider.pageTitle": "Časovni trak {{appTitle}}",
"timeslider.toolbar.returnbutton": "Vrni se na dokument", "timeslider.toolbar.returnbutton": "Nazaj na blokec",
"timeslider.toolbar.authors": "Avtorji:", "timeslider.toolbar.authors": "Avtorji:",
"timeslider.toolbar.authorsList": "Ni določenih avtorjev", "timeslider.toolbar.authorsList": "Ni določenih avtorjev",
"timeslider.toolbar.exportlink.title": "Izvozi", "timeslider.toolbar.exportlink.title": "Izvozi",
"timeslider.exportCurrent": "Izvozi trenutno različico kot:", "timeslider.exportCurrent": "Izvozi trenutno različico kot:",
"timeslider.version": "Različica {{version}}", "timeslider.version": "Različica {{version}}",
"timeslider.saved": "Shranjeno {{day}}.{{month}}.{{year}}", "timeslider.saved": "Shranjeno {{day}}.{{month}}.{{year}}",
"timeslider.playPause": "Predvajaj/začasno ustavi vsebino dokumenta", "timeslider.playPause": "Predvajaj/zaustavi vsebino blokca",
"timeslider.backRevision": "Pojdi eno redakcijo nazaj v tem dokumentu", "timeslider.backRevision": "Pojdi v tem blokcu eno redakcijo nazaj",
"timeslider.forwardRevision": "Pojdi eno redakcijo naprej v tem dokumentu", "timeslider.forwardRevision": "Pojdi v tem blokcu eno redakcijo naprej",
"timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Januar", "timeslider.month.january": "januarja",
"timeslider.month.february": "Februar", "timeslider.month.february": "februarja",
"timeslider.month.march": "Marec", "timeslider.month.march": "marca",
"timeslider.month.april": "April", "timeslider.month.april": "aprila",
"timeslider.month.may": "Maj", "timeslider.month.may": "maja",
"timeslider.month.june": "Junij", "timeslider.month.june": "junija",
"timeslider.month.july": "Julij", "timeslider.month.july": "julija",
"timeslider.month.august": "August", "timeslider.month.august": "avgusta",
"timeslider.month.september": "September", "timeslider.month.september": "septembra",
"timeslider.month.october": "Oktober", "timeslider.month.october": "oktobra",
"timeslider.month.november": "November", "timeslider.month.november": "novembra",
"timeslider.month.december": "December", "timeslider.month.december": "decembra",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: neimenovan avtor, plural(num) two: neimenovana avtorja, plural(num) few: neimenovani avtorji, other: neimenovanih avtorjev ]}", "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 redakcija je zdaj označena kot shranjena redakcija", "pad.savedrevs.marked": "Ta redakcija je zdaj označena kot shranjena redakcija",
"pad.savedrevs.timeslider": "Shranjene redakcije si lahko ogledate s pomočjo časovnega traku", "pad.savedrevs.timeslider": "Shranjene redakcije si lahko ogledate z odprtjem časovnega traku",
"pad.userlist.entername": "Vnesite svoje ime", "pad.userlist.entername": "Vnesite svoje ime",
"pad.userlist.unnamed": "neimenovana oseba", "pad.userlist.unnamed": "neimenovana oseba",
"pad.editbar.clearcolors": "Ali naj se počistijo barve avtorstva v celotnem dokumentu?", "pad.editbar.clearcolors": "Ali naj se počistijo barve avtorstva v vsem dokumentu? Tega ni mogoče razveljaviti.",
"pad.impexp.importbutton": "Uvozi takoj", "pad.impexp.importbutton": "Uvozi takoj",
"pad.impexp.importing": "Poteka uvažanje ...", "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.confirmimport": "Uvoz datoteke bo prepisal obstoječe besedilo blokca. Ali res želite nadaljevati?",
"pad.impexp.convertFailed": "Datoteke ni bilo mogoče uvoziti. Prosimo uporabite drug podprt zapis dokumenta ali pa vsebino prilepite ročno", "pad.impexp.convertFailed": "Datoteke ni bilo mogoče uvoziti. Prosimo, uporabite drug format dokumenta ali pa vsebino kopirajte in prilepite ročno.",
"pad.impexp.padHasData": "Nismo mogli uvoziti datoteke, ker dokument že vsebuje spremembe. Prosimo, uvozite datoteko v nov dokument", "pad.impexp.padHasData": "Datoteke ni bilo mogoče uvoziti, ker blokec že vsebuje spremembe. Prosimo, uvozite datoteko v nov blokec.",
"pad.impexp.uploadFailed": "Nalaganje je spodletelo, prosimo poskusite znova", "pad.impexp.uploadFailed": "Nalaganje je spodletelo, prosimo poskusite znova",
"pad.impexp.importfailed": "Uvoz je spodletel", "pad.impexp.importfailed": "Uvoz je spodletel",
"pad.impexp.copypaste": "Vsebino kopirajte in prilepite", "pad.impexp.copypaste": "Vsebino kopirajte in prilepite",
"pad.impexp.exportdisabled": "Izvoz v zapis {{type}} je onemogočen. Za več podrobnosti stopite v stik s skrbnikom." "pad.impexp.exportdisabled": "Izvoz v format {{type}} je onemogočen. Za več podrobnosti stopite v stik z administratorjem.",
"pad.impexp.maxFileSize": "Datoteka je prevelika. Za povečanje dovoljene velikosti datoteke za uvoz se obrnite na administratorja spletnega mesta"
} }

60
src/locales/sms.json Normal file
View file

@ -0,0 +1,60 @@
{
"@metadata": {
"authors": [
"Yupik"
]
},
"admin_plugins.description": "Deskriptt",
"admin_plugins.name": "Nõmm",
"admin_plugins.version": "Versio",
"admin_plugins_info.version": "Etherpad-versio",
"admin_plugins_info.version_number": "Versionââmar",
"admin_settings": "Asetõõzz",
"admin_settings.current_save.value": "Ruõkk asetõõzzid",
"admin_settings.page-title": "Asetõõzz - Etherpad",
"index.newPad": "Ođđ mošttʼtõspõʹmmai",
"index.createOpenPad": "leʼbe raaj leʼbe ääʹved mošttʼtõspõʹmmai nõõmin:",
"pad.toolbar.underline.title": "Vuâllacertldâsttmõš (CTRL-U)",
"pad.toolbar.undo.title": "Kååʹmet (Ctrl+Z)",
"pad.toolbar.savedRevision.title": "Ruõkk muttâz",
"pad.toolbar.settings.title": "Asetõõzz",
"pad.toolbar.showusers.title": "Čuäʼjet tän mošttʼtõspõʹmmai õõʹnnʼjid",
"pad.colorpicker.save": "Ruõkk",
"pad.colorpicker.cancel": "Jõõsk",
"pad.settings.padSettings": "Mošttʼtõspõʹmmai asetõõzz",
"pad.settings.chatandusers": "Čuäʹjet čääʹtt da õõʹnnʼjid",
"pad.settings.language": "Ǩiõll:",
"pad.settings.about": "Lââʹssteâđ",
"pad.settings.poweredBy": "Kääzzkõõzz vueiʹtlvâstt",
"pad.importExport.importSuccessful": "Oʹnnsti!",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.modals.cancel": "Jõõsk",
"pad.modals.slowcommit.explanation": "Server ij vaʹstted.",
"pad.modals.deleted": "Jaukkuum.",
"pad.modals.deleted.explanation": "Tät mošttʼtõspõʹmmai lij jaukkuum.",
"pad.share": "Jueʼjj mošttʼtõspõʹmmai",
"pad.share.link": "Liŋkk",
"pad.chat": "Čäʹtt",
"pad.chat.writeMessage.placeholder": "Ǩeeʹrjet jiijjad saaǥǥ täzz",
"timeslider.toolbar.returnbutton": "Määʹcc mošttʼtõspõʹmma",
"timeslider.version": "Versio {{version}}",
"timeslider.saved": "Ruõkkum {{month}} {{day}}. peeiʹv {{year}}",
"timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "ođđeeʹjjmannu",
"timeslider.month.february": "täʹlvvmannu",
"timeslider.month.march": "pâʹsslašttâm-mannu",
"timeslider.month.april": "njuhččmannu",
"timeslider.month.may": "vueʹssmannu",
"timeslider.month.june": "ǩieʹssmannu",
"timeslider.month.july": "sueiʹnnmannu",
"timeslider.month.august": "påʹrǧǧmannu",
"timeslider.month.september": "čõhččmannu",
"timeslider.month.october": "kålggmannu",
"timeslider.month.november": "skamm-mannu",
"timeslider.month.december": "rosttovmannu",
"pad.userlist.entername": "Ǩeeʹrjet jiijjad nõõm"
}

View file

@ -7,7 +7,7 @@
"Liridon" "Liridon"
] ]
}, },
"admin.page-title": "Paneli i Administratorit - Etherpad", "admin.page-title": "Pult Përgjegjësi - Etherpad",
"admin_plugins": "Përgjegjës shtojcash", "admin_plugins": "Përgjegjës shtojcash",
"admin_plugins.available": "Shtojca të gatshme", "admin_plugins.available": "Shtojca të gatshme",
"admin_plugins.available_not-found": "Su gjetën shtojca.", "admin_plugins.available_not-found": "Su gjetën shtojca.",
@ -63,7 +63,7 @@
"pad.colorpicker.save": "Ruaje", "pad.colorpicker.save": "Ruaje",
"pad.colorpicker.cancel": "Anuloje", "pad.colorpicker.cancel": "Anuloje",
"pad.loading": "Po ngarkohet…", "pad.loading": "Po ngarkohet…",
"pad.noCookie": "Su gjet dot cookie. Ju lutemi, lejoni cookie-t te shfletuesi juaj! Sesioni dhe rregullimet tuaja sdo të ruhen nga një sesion në tjetër. Kjo mund të vijë ngaqë Etherpad përfshihet brenda një iFrame në disa shfletues. Ju lutemi, sigurohuni që Etherpad-i të jetë në të njëjtën nënpërkatësi/përkatësi si iFrame-i mëmë.", "pad.noCookie": "Su gjet dot cookie. Ju lutemi, lejoni cookie-t te shfletuesi juaj! Sesioni dhe rregullimet tuaja sdo të ruhen nga një sesion në tjetër. Kjo mund të vijë ngaqë, në disa shfletues, Etherpad përfshihet brenda një iFrame. Ju lutemi, sigurohuni që Etherpad-i të jetë në të njëjtën nënpërkatësi/përkatësi si iFrame-i mëmë.",
"pad.permissionDenied": "Skeni leje të hyni në këtë bllok", "pad.permissionDenied": "Skeni leje të hyni në këtë bllok",
"pad.settings.padSettings": "Rregullime Blloku", "pad.settings.padSettings": "Rregullime Blloku",
"pad.settings.myView": "Pamja Ime", "pad.settings.myView": "Pamja Ime",
@ -78,7 +78,7 @@
"pad.settings.about": "Mbi", "pad.settings.about": "Mbi",
"pad.settings.poweredBy": "Bazuar në", "pad.settings.poweredBy": "Bazuar në",
"pad.importExport.import_export": "Import/Eksport", "pad.importExport.import_export": "Import/Eksport",
"pad.importExport.import": "Ngarkoni cilëndo kartelë teksti ose dokument", "pad.importExport.import": "Ngarkoni cilëndo kartelë tekst ose dokument",
"pad.importExport.importSuccessful": "Me sukses!", "pad.importExport.importSuccessful": "Me sukses!",
"pad.importExport.export": "Eksportojeni bllokun e tanishëm si:", "pad.importExport.export": "Eksportojeni bllokun e tanishëm si:",
"pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exportetherpad": "Etherpad",

View file

@ -9,6 +9,7 @@
"Obsuser", "Obsuser",
"Srdjan m", "Srdjan m",
"Srđan", "Srđan",
"Zenfiric",
"Милан Јелисавчић" "Милан Јелисавчић"
] ]
}, },
@ -34,7 +35,6 @@
"pad.colorpicker.save": "Сачувај", "pad.colorpicker.save": "Сачувај",
"pad.colorpicker.cancel": "Откажи", "pad.colorpicker.cancel": "Откажи",
"pad.loading": "Учитавам…", "pad.loading": "Учитавам…",
"pad.noCookie": "Колачић није пронађен. Молимо да укључите колачиће у вашем прегледавачу!",
"pad.permissionDenied": "Немате дозволу да приступите овом паду", "pad.permissionDenied": "Немате дозволу да приступите овом паду",
"pad.settings.padSettings": "Подешавања пада", "pad.settings.padSettings": "Подешавања пада",
"pad.settings.myView": "Мој приказ", "pad.settings.myView": "Мој приказ",

162
src/locales/sro.json Normal file
View file

@ -0,0 +1,162 @@
{
"@metadata": {
"authors": [
"Adr mm",
"F Samaritani"
]
},
"admin.page-title": "Pannellu amministrativu - Etherpad",
"admin_plugins": "Gestore de connetores",
"admin_plugins.available": "Connetores a disponimentu",
"admin_plugins.available_not-found": "Nissunu connetore a disponimentu",
"admin_plugins.available_fetching": "Recuperende...",
"admin_plugins.available_install.value": "Installa",
"admin_plugins.available_search.placeholder": "Chirca connetores de installare",
"admin_plugins.description": "Descritzione",
"admin_plugins.installed": "Connetores installados",
"admin_plugins.installed_fetching": "Recuperende connetores installados...",
"admin_plugins.installed_nothing": "No as installadu ancora nissunu connetore.",
"admin_plugins.installed_uninstall.value": "Disinstalla",
"admin_plugins.last-update": "Ùrtima atualizatzione",
"admin_plugins.name": "Nòmine",
"admin_plugins.page-title": "Gestore de connetores - Etherpad",
"admin_plugins.version": "Versione",
"admin_plugins_info": "Informatzione pro sa risolutzione de problemas",
"admin_plugins_info.parts": "Partes installadas",
"admin_plugins_info.plugins": "Connetores installados",
"admin_plugins_info.page-title": "Informatzione de su connetore - Etherpad",
"admin_plugins_info.version": "Versione de Etherpad",
"admin_plugins_info.version_latest": "Ùrtima versione a disponimentu",
"admin_plugins_info.version_number": "Nùmeru de versione",
"admin_settings": "Cunfiguratzione",
"admin_settings.current": "Cunfiguratzione atuale",
"admin_settings.current_restart.value": "Torra a aviare Etherpad",
"admin_settings.current_save.value": "Sarva sa cunfiguratzione",
"admin_settings.page-title": "Cunfiguratzione - Etherpad",
"index.newPad": "Pad nou",
"index.createOpenPad": "o crea/aberi unu pad cun su nòmine:",
"index.openPad": "aberi unu pad esistente cun su nòmine:",
"pad.toolbar.bold.title": "Grassetu (Ctrl+B)",
"pad.toolbar.italic.title": "Cursivu (Ctrl+I)",
"pad.toolbar.underline.title": "Sutaliniadu (Ctrl+U)",
"pad.toolbar.strikethrough.title": "Istangadu (Ctrl+5)",
"pad.toolbar.ol.title": "Lista numerada (Ctrl+Shift+N)",
"pad.toolbar.ul.title": "Lista cun puntos (Ctrl+Shift+L)",
"pad.toolbar.indent.title": "Indentatzione a dereta (Tab)",
"pad.toolbar.unindent.title": "Indentatzione a manca (Shift+Tab)",
"pad.toolbar.undo.title": "Iscontza (Ctrl+Z)",
"pad.toolbar.redo.title": "Torra a fàghere (Ctrl+Y)",
"pad.toolbar.clearAuthorship.title": "Lìmpia is colores de autoria (Ctrl+Shift+C)",
"pad.toolbar.import_export.title": "Importa/esporta dae/a formados de archìviu diferentes",
"pad.toolbar.timeslider.title": "Presentatzione cronologia",
"pad.toolbar.savedRevision.title": "Sarva sa versione",
"pad.toolbar.settings.title": "Cunfiguratzione",
"pad.toolbar.embed.title": "Cumpartzi e incòrpora custu Pad",
"pad.toolbar.showusers.title": "Ammustra is utentes in custu Pad",
"pad.colorpicker.save": "Sarva",
"pad.colorpicker.cancel": "Annulla",
"pad.loading": "Carrighende...",
"pad.noCookie": "Su testimòngiu no est istètiu agatadu. Permite is testimòngios in su navigadore tuo. Sa sessione e sa cunfiguratzione tuas no ant a èssere sarvadas intre bìsitas. Podet èssere pro more de s'inclusione de Etherpad comente iFrame in tzertos navigadores. Assegura·ti chi Etherpad s'agatat in su pròpiu sutadomìniu/domìniu chi s'iFrame printzipale",
"pad.permissionDenied": "Non tenes permissu pro atzèdere a custu pad",
"pad.settings.padSettings": "Cunfiguratzione de su pad",
"pad.settings.myView": "Sa visualizatzione mia",
"pad.settings.stickychat": "Ammustra semper sa tzarrada",
"pad.settings.chatandusers": "Ammustra sa tzarrada e is utentes",
"pad.settings.colorcheck": "Colores de autoria",
"pad.settings.linenocheck": "Nùmeros de lìnia",
"pad.settings.rtlcheck": "Cuntenutu dae manca a dereta",
"pad.settings.fontType": "Tipu de caràtere:",
"pad.settings.fontType.normal": "Normale",
"pad.settings.language": "Lìngua:",
"pad.settings.about": "Informatziones",
"pad.settings.poweredBy": "Realizadu cun",
"pad.importExport.import_export": "Importatzione/esportatzione",
"pad.importExport.import": "Càrriga un'archìviu de testu o unu documentu",
"pad.importExport.importSuccessful": "Carrigadu.",
"pad.importExport.export": "Esporta su pad atuale comente:",
"pad.importExport.exportetherpad": "Etherpad",
"pad.importExport.exporthtml": "HTML",
"pad.importExport.exportplain": "Testu sèmplitze",
"pad.importExport.exportword": "Microsoft Word",
"pad.importExport.exportpdf": "PDF",
"pad.importExport.exportopen": "ODF (Open Document Format)",
"pad.importExport.abiword.innerHTML": "Isceti is formados de testu sèmplitze o HTML podent èssere importados. Pro mètodos avantzados de importatzione, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">installa AbiWord o LibreOffice</a>.",
"pad.modals.connected": "Connètidu.",
"pad.modals.reconnecting": "Connetende a su pad tuo...",
"pad.modals.forcereconnect": "Fortza sa connesione",
"pad.modals.reconnecttimer": "Torrende a connètere in",
"pad.modals.cancel": "Annulla",
"pad.modals.userdup": "Abertu in un'àtera ventana",
"pad.modals.userdup.explanation": "Podet èssere chi custu pad siat abertu in un'àtera ischeda de custu navigadore in custu ordinadore.",
"pad.modals.userdup.advice": "Torra a connètere pro impreare custa ventana.",
"pad.modals.unauth": "Chena autorizatzione",
"pad.modals.unauth.explanation": "Is permissos tuos funt istètios cambiados in su mentras chi fias bidende custa pàgina. Prova de ti torrare a connètere.",
"pad.modals.looping.explanation": "Nci funt problemas de comunicatzione cun su serbidore de sincronizatzione.",
"pad.modals.looping.cause": "Forsis sa connessione at impreadu unu serbidore intermediàriu (proxy) o unu firewall chi no est cumpatìbile.",
"pad.modals.initsocketfail": "Su serbidore no est atzessìbile.",
"pad.modals.initsocketfail.explanation": "Impossìbile connètere cun su serbidore de sincronizatzione.",
"pad.modals.initsocketfail.cause": "Podet èssere a càusa de unu problema cun su navigadore tuo o cun sa connessione de internet.",
"pad.modals.slowcommit.explanation": "Su serbidore non rispondet.",
"pad.modals.slowcommit.cause": "Podet èssere a càusa de problemas cun sa connessione de internet.",
"pad.modals.badChangeset.explanation": "Una modìfica tua est istètia cunsiderada illegale dae su serbidore de sincronizatzione.",
"pad.modals.badChangeset.cause": "Podet èssere a càusa de una cunfiguratzione de serbidore isballiada o calicunu àteru cumportamentu imprevistu. Iscrie a s'amministratzione de su servìtziu si pensas chi siat un'errore. Prova a connètere torra pro sighire a modificare.",
"pad.modals.corruptPad.explanation": "Su pad a su chi ses chirchende de atzèdere est dannadu.",
"pad.modals.corruptPad.cause": "Podet èssere a càusa de una cunfiguratzione de serbidore non curreta o pro unu cumportamentu imprevistu. Iscrie a s'amministratzione de su servìtziu.",
"pad.modals.deleted": "Cantzelladu.",
"pad.modals.deleted.explanation": "Pad cantzelladu.",
"pad.modals.rateLimited.explanation": "As imbiadu tropu messàgios a custu pad e t'at disconnètidu.",
"pad.modals.rejected.explanation": "Su serbidore at rifiutadu unu messàgiu imbiadu dae su navigadore tuo.",
"pad.modals.rejected.cause": "Podet èssere chi su serbidore siat istètiu atualizadu in su mentras chi fias bidende su pad, o podet èssere chi nci siat un'errore in Etherpad. Prova a atualizare sa pàgina.",
"pad.modals.disconnected": "Disconnètidu.",
"pad.modals.disconnected.explanation": "Connessione cun su serbidore pèrdida.",
"pad.modals.disconnected.cause": "Su serbidore no est a disponimentu. Iscrie a s'amministratzione de su servìtziu si su problema persistet.",
"pad.share": "Cumpartzi custu pad",
"pad.share.link": "Ligòngiu",
"pad.share.emebdcode": "Incòrpora URL",
"pad.chat": "Tzarrada",
"pad.chat.title": "Aberi sa tzarrada pro custu pad.",
"pad.chat.loadmessages": "Càrriga àteros messàgios",
"pad.chat.stick.title": "Apica sa tzarrada in s'ischermu",
"pad.chat.writeMessage.placeholder": "Iscrie su messàgiu tuo inoghe",
"timeslider.followContents": "Sighi is atualizatziones de cuntenutu de su pad",
"timeslider.pageTitle": "Cronologia {{appTitle}}",
"timeslider.toolbar.returnbutton": "Torra a su pad",
"timeslider.toolbar.authors": "Autores:",
"timeslider.toolbar.authorsList": "Nissunu autore",
"timeslider.toolbar.exportlink.title": "Esporta",
"timeslider.exportCurrent": "Esporta sa versione atuale comente:",
"timeslider.version": "Versione {{version}}",
"timeslider.saved": "Sarvadu su {{day}} de {{month}} de su {{year}}",
"timeslider.playPause": "Riprodutzione/pàusa de is cuntenutos de su pad",
"timeslider.backRevision": "Bae a una versione pretzedente de custu pad",
"timeslider.forwardRevision": "Bae a una versione imbeniente de custu pad",
"timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
"timeslider.month.january": "Ghennàrgiu",
"timeslider.month.february": "Freàrgiu",
"timeslider.month.march": "Martzu",
"timeslider.month.april": "Abrile",
"timeslider.month.may": "Maju",
"timeslider.month.june": "Làmpadas",
"timeslider.month.july": "Mese de argiolas",
"timeslider.month.august": "Austu",
"timeslider.month.september": "Cabudanni",
"timeslider.month.october": "Ledàmine",
"timeslider.month.november": "Onniasantu",
"timeslider.month.december": "Mese de idas",
"timeslider.unnamedauthors": "{{num}} {[plural(num) one: autore, other: autores ]} chena nòmine",
"pad.savedrevs.marked": "Custa revisione est istètia marcada comente revisione sarvada",
"pad.savedrevs.timeslider": "Podes bìdere is versiones sarvadas bisitende sa cronologia",
"pad.userlist.entername": "Inserta su nòmine tuo",
"pad.userlist.unnamed": "Chena nòmine",
"pad.editbar.clearcolors": "Seguru chi boles limpiare is colores de autoria de totu su documentu? Custa atzione no dda podes annullare",
"pad.impexp.importbutton": "Importa immoe",
"pad.impexp.importing": "Importende...",
"pad.impexp.confirmimport": "S'importatzione de un'archìviu at a subraiscrìere su testu atuale de su pad. Seguru chi boles sighire?",
"pad.impexp.convertFailed": "Impossìbile importare custu archìviu. Imprea unu formadu de documentu diferente o còpia e incolla a manu",
"pad.impexp.padHasData": "Impossìbile importare custu archìviu pro ite custu pad est istètiu giai modificadu. Importa·ddu in unu pad nou",
"pad.impexp.uploadFailed": "Errore in sa càrriga. Torra a provare",
"pad.impexp.importfailed": "Errore de importatzione",
"pad.impexp.copypaste": "Còpia e incolla",
"pad.impexp.exportdisabled": "S'esportatzione comente {{type}} est disativada. Iscrie a s'amministratzione de su sistema pro àteras informatziones.",
"pad.impexp.maxFileSize": "S'archìviu est tropu manu. Iscrie a s'amministratzione pro ismanniare sa dimensione permìtida pro s'importatzione"
}

View file

@ -3,7 +3,8 @@
"authors": [ "authors": [
"Aefgh39622", "Aefgh39622",
"Andibecker", "Andibecker",
"Patsagorn Y." "Patsagorn Y.",
"Trisorn Triboon"
] ]
}, },
"admin.page-title": "แดชบอร์ดผู้ดูแลระบบ - Etherpad", "admin.page-title": "แดชบอร์ดผู้ดูแลระบบ - Etherpad",
@ -16,12 +17,12 @@
"admin_plugins.description": "คำอธิบาย", "admin_plugins.description": "คำอธิบาย",
"admin_plugins.installed": "ปลั๊กอินที่ติดตั้ง", "admin_plugins.installed": "ปลั๊กอินที่ติดตั้ง",
"admin_plugins.installed_fetching": "กำลังเรียกปลั๊กอินที่ติดตั้ง…", "admin_plugins.installed_fetching": "กำลังเรียกปลั๊กอินที่ติดตั้ง…",
"admin_plugins.installed_nothing": "คุณยังไม่ได้ติดตั้งปลั๊กอินใดๆ", "admin_plugins.installed_nothing": "คุณยังไม่ได้ติดตั้งปลั๊กอินใด ๆ",
"admin_plugins.installed_uninstall.value": "ถอนการติดตั้ง", "admin_plugins.installed_uninstall.value": "ถอนการติดตั้ง",
"admin_plugins.last-update": "การปรับปรุงครั้งล่าสุด", "admin_plugins.last-update": "การปรับปรุงครั้งล่าสุด",
"admin_plugins.name": "ชื่อ", "admin_plugins.name": "ชื่อ",
"admin_plugins.page-title": "ตัวจัดการปลั๊กอิน - Etherpad", "admin_plugins.page-title": "ตัวจัดการปลั๊กอิน - Etherpad",
"admin_plugins.version": "เวอร์ชัน", "admin_plugins.version": "เวอร์ชัน",
"admin_plugins_info": "ข้อมูลการแก้ไขปัญหา", "admin_plugins_info": "ข้อมูลการแก้ไขปัญหา",
"admin_plugins_info.hooks": "ติดตั้งตะขอ", "admin_plugins_info.hooks": "ติดตั้งตะขอ",
"admin_plugins_info.hooks_client": "ตะขอฝั่งไคลเอ็นต์", "admin_plugins_info.hooks_client": "ตะขอฝั่งไคลเอ็นต์",
@ -35,7 +36,7 @@
"admin_settings": "การตั้งค่า", "admin_settings": "การตั้งค่า",
"admin_settings.current": "การกำหนดค่าปัจจุบัน", "admin_settings.current": "การกำหนดค่าปัจจุบัน",
"admin_settings.current_example-devel": "ตัวอย่างเทมเพลตการตั้งค่าการพัฒนา", "admin_settings.current_example-devel": "ตัวอย่างเทมเพลตการตั้งค่าการพัฒนา",
"admin_settings.current_example-prod": "ตัวอย่างเทมเพลตการตั้งค่าการผลิต", "admin_settings.current_example-prod": "ตัวอย่างแม่แบบการตั้งค่าการผลิต",
"admin_settings.current_restart.value": "รีสตาร์ท Etherpad", "admin_settings.current_restart.value": "รีสตาร์ท Etherpad",
"admin_settings.current_save.value": "บันทึกการตั้งค่า", "admin_settings.current_save.value": "บันทึกการตั้งค่า",
"admin_settings.page-title": "การตั้งค่า - Etherpad", "admin_settings.page-title": "การตั้งค่า - Etherpad",
@ -74,9 +75,9 @@
"pad.settings.fontType": "ชนิดแบบอักษร:", "pad.settings.fontType": "ชนิดแบบอักษร:",
"pad.settings.language": "ภาษา:", "pad.settings.language": "ภาษา:",
"pad.settings.about": "เกี่ยวกับ", "pad.settings.about": "เกี่ยวกับ",
"pad.settings.poweredBy": "ขับเคลื่อนโดย $1", "pad.settings.poweredBy": "ขับเคลื่อนโดย",
"pad.importExport.import_export": "นำเข้า/ส่งออก", "pad.importExport.import_export": "นำเข้า/ส่งออก",
"pad.importExport.import": "อัปโหลดไฟล์ข้อความหรือเอกสารใดๆ", "pad.importExport.import": "อัปโหลดไฟล์ข้อความหรือเอกสารใด ๆ",
"pad.importExport.importSuccessful": "สำเร็จ!", "pad.importExport.importSuccessful": "สำเร็จ!",
"pad.importExport.export": "ส่งออกแผ่นจดบันทึกปัจจุบันเป็น:", "pad.importExport.export": "ส่งออกแผ่นจดบันทึกปัจจุบันเป็น:",
"pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exportetherpad": "Etherpad",
@ -124,7 +125,7 @@
"pad.chat.title": "เปิดการแชทสำหรับแผ่นจดบันทึกนี้", "pad.chat.title": "เปิดการแชทสำหรับแผ่นจดบันทึกนี้",
"pad.chat.loadmessages": "โหลดข้อความเพิ่มเติม", "pad.chat.loadmessages": "โหลดข้อความเพิ่มเติม",
"pad.chat.stick.title": "ปักการสนทนาไว้บนหน้าจอ", "pad.chat.stick.title": "ปักการสนทนาไว้บนหน้าจอ",
"pad.chat.writeMessage.placeholder": "เขียนข้อความ...", "pad.chat.writeMessage.placeholder": "เขียนข้อความของคุณที่นี่",
"timeslider.followContents": "ติดตามการอัพเดตเนื้อหาแพด", "timeslider.followContents": "ติดตามการอัพเดตเนื้อหาแพด",
"timeslider.pageTitle": "ตัวเลื่อนเวลา {{appTitle}}", "timeslider.pageTitle": "ตัวเลื่อนเวลา {{appTitle}}",
"timeslider.toolbar.returnbutton": "กลับไปแผ่นจดบันทึก", "timeslider.toolbar.returnbutton": "กลับไปแผ่นจดบันทึก",
@ -132,7 +133,7 @@
"timeslider.toolbar.authorsList": "ไม่มีผู้เขียน", "timeslider.toolbar.authorsList": "ไม่มีผู้เขียน",
"timeslider.toolbar.exportlink.title": "ส่งออก", "timeslider.toolbar.exportlink.title": "ส่งออก",
"timeslider.exportCurrent": "ส่งออกรุ่นปัจจุบันเป็น:", "timeslider.exportCurrent": "ส่งออกรุ่นปัจจุบันเป็น:",
"timeslider.version": "รุ่น {{version}}", "timeslider.version": "เวอร์ชัน {{version}}",
"timeslider.saved": "บันทึกแล้วเมื่อ {{day}} {{month}} {{year}}", "timeslider.saved": "บันทึกแล้วเมื่อ {{day}} {{month}} {{year}}",
"timeslider.playPause": "เล่น / พักเนื้อหาแผ่นจดบันทึก", "timeslider.playPause": "เล่น / พักเนื้อหาแผ่นจดบันทึก",
"timeslider.backRevision": "กลับไปรุ่นแก้ไขเก่าของแผ่นจดบันทึกนี้", "timeslider.backRevision": "กลับไปรุ่นแก้ไขเก่าของแผ่นจดบันทึกนี้",
@ -153,7 +154,7 @@
"timeslider.unnamedauthors": "{{num}} ผู้เขียนที่ไม่มีชื่อ", "timeslider.unnamedauthors": "{{num}} ผู้เขียนที่ไม่มีชื่อ",
"pad.savedrevs.marked": "รุ่นแก้ไขนี้ถูกทำเครื่องหมายเป็นรุ่นแก้ไขที่บันทึกแล้ว", "pad.savedrevs.marked": "รุ่นแก้ไขนี้ถูกทำเครื่องหมายเป็นรุ่นแก้ไขที่บันทึกแล้ว",
"pad.savedrevs.timeslider": "คุณสามารถดูรุ่นแก้ไขที่บันทึกแล้วโดยเยี่ยมชมตัวเลื่อนเวลา", "pad.savedrevs.timeslider": "คุณสามารถดูรุ่นแก้ไขที่บันทึกแล้วโดยเยี่ยมชมตัวเลื่อนเวลา",
"pad.userlist.entername": "กรอกชื่อของคุณ", "pad.userlist.entername": "ป้อนชื่อของคุณ",
"pad.userlist.unnamed": "ไม่มีชื่อ", "pad.userlist.unnamed": "ไม่มีชื่อ",
"pad.editbar.clearcolors": "ลบการเน้นความเป็นเจ้าของข้อความหรือไม่? การกระทำนี่ไม่สามารถย้อนได้", "pad.editbar.clearcolors": "ลบการเน้นความเป็นเจ้าของข้อความหรือไม่? การกระทำนี่ไม่สามารถย้อนได้",
"pad.impexp.importbutton": "นำเข้าตอนนี้", "pad.impexp.importbutton": "นำเข้าตอนนี้",

View file

@ -5,6 +5,7 @@
"Base", "Base",
"Bunyk", "Bunyk",
"DDPAT", "DDPAT",
"Ice bulldog",
"Lxlalexlxl", "Lxlalexlxl",
"Movses", "Movses",
"Olvin", "Olvin",

Some files were not shown because too many files have changed in this diff Show more