Compare commits

..

No commits in common. "develop" and "1.2.81" have entirely different histories.

977 changed files with 60511 additions and 113652 deletions

View file

@ -1,29 +0,0 @@
*~
.dockerignore
.hg
Dockerfile
# Remove the git objects, logs, etc. to make final image smaller.
# Some files still need to be in the .git directory, because Etherpad at
# startup uses them to discover its version number.
.git/branches
.git/COMMIT_EDITMSG
.git/config
.git/description
.git/FETCH_HEAD
.git/hooks
.git/index
.git/info
.git/logs
.git/objects
.git/ORIG_HEAD
.git/packed-refs
.git/refs/remotes/
.git/rr-cache/
.gitignore
settings.json
src/node_modules
admin/node_modules
ui/node_modules
node_modules

View file

@ -1,17 +0,0 @@
root = true
[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
# editorconfig-tools is unable to ignore longs strings or urls
max_line_length = off
[CHANGELOG.md]
indent_size = 4
[*.bat]
end_of_line = crlf

View file

@ -1,18 +0,0 @@
# Please copy and rename this file.
#
# !Attention!
# Always ensure to load the env variables in every terminal session.
# Otherwise the env variables will not be available
DOCKER_COMPOSE_APP_PORT_PUBLISHED=9001
DOCKER_COMPOSE_APP_PORT_TARGET=9001
# IMPORTANT: When the env var DEFAULT_PAD_TEXT is unset or empty, then the pad is not established (not the landing page).
# The env var DEFAULT_PAD_TEXT seems to be mandatory in the latest version of etherpad.
DOCKER_COMPOSE_APP_DEV_ENV_DEFAULT_PAD_TEXT="Welcome to etherpad"
DOCKER_COMPOSE_APP_ADMIN_PASSWORD=
DOCKER_COMPOSE_POSTGRES_DATABASE=db
DOCKER_COMPOSE_POSTGRES_PASSWORD=etherpad-lite-password
DOCKER_COMPOSE_POSTGRES_USER=etherpad-lite-user

View file

@ -1,18 +0,0 @@
# Please copy and rename this file.
#
# !Attention!
# Always ensure to load the env variables in every terminal session.
# Otherwise the env variables will not be available
DOCKER_COMPOSE_APP_DEV_PORT_PUBLISHED=9001
DOCKER_COMPOSE_APP_DEV_PORT_TARGET=9001
# IMPORTANT: When the env var DEFAULT_PAD_TEXT is unset or empty, then the pad is not established (not the landing page).
# The env var DEFAULT_PAD_TEXT seems to be mandatory in the latest version of etherpad.
DOCKER_COMPOSE_APP_DEV_ENV_DEFAULT_PAD_TEXT="Welcome to etherpad"
DOCKER_COMPOSE_APP_DEV_ADMIN_PASSWORD=
DOCKER_COMPOSE_POSTGRES_DEV_ENV_POSTGRES_DATABASE=db
DOCKER_COMPOSE_POSTGRES_DEV_ENV_POSTGRES_PASSWORD=etherpad-lite-password
DOCKER_COMPOSE_POSTGRES_DEV_ENV_POSTGRES_USER=etherpad-lite-user

1
.gitattributes vendored
View file

@ -1 +0,0 @@
* text=auto eol=lf

3
.github/FUNDING.yml vendored
View file

@ -1,3 +0,0 @@
# These are supported funding model platforms
github: ether

View file

@ -1,47 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
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**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Server (please complete the following information):**
- Etherpad version:
- OS: [e.g., Ubuntu 20.04]
- Node.js version (`node --version`):
- npm version (`npm --version`):
- Is the server free of plugins:
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View file

@ -1,33 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: Feature Request
assignees: ''
---
* * *
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees:
* * *
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when (...)
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
**Plugin?**
Might this feature be better suited to being a plugin? Usually features that can be plugins, should be.

View file

@ -1,30 +0,0 @@
---
name: Plugin request template
about: Suggest a plugin for Etherpad
title: ''
labels: Plugin Request
assignees: JohnMcLear
---
* * *
name: Plugin request
about: Suggest a plugin for this project
title: ''
labels: plugin request
assignees:
* * *
**Is your plugin request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when (...)
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the plugin request here.

View file

@ -1,10 +0,0 @@
---
name: Security issue
about: Notify the Etherpad foundation of a Security issue
title: ''
labels: security
assignees: ''
---
Please email contact@etherpad.org with details of the security issue prior to posting here.

View file

@ -1,13 +0,0 @@
* * *
name: Security notification
about: Disclose a security issue in Etherpad
title: ''
labels: security
assignees:
* * *
**Our Security disclosure process**
1. Please email contact@etherpad.org with detials of the exploit including steps to replicate.
1. Once confirmed we will provide a confirmation, patch and CVE details.

View file

@ -1,13 +0,0 @@
<!--
1. If you haven't already, please read https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md#pull-requests .
2. Run all the tests, both front-end and back-end. (see https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md#testing)
3. Keep business logic and validation on the server-side.
4. Update documentation.
5. Write `fixes #XXXX` in your comment to auto-close an issue.
If you're making a big change, please explain what problem it solves:
- Explain the purpose of the change. When adding a way to do X, explain why it is important to be able to do X.
- Show the current vs desired behavior with screenshots/GIFs.
-->

View file

@ -1,20 +0,0 @@
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: "/"
schedule:
interval: "daily"
versioning-strategy: "increase"
open-pull-requests-limit: 30
groups:
dev-dependencies:
dependency-type: "development"

View file

@ -1,290 +0,0 @@
name: "Backend tests"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
jobs:
withoutpluginsLinux:
# 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: Linux without plugins
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [20, 22, 23]
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install libreoffice
uses: awalsh128/cache-apt-pkgs-action@v1.5.0
with:
packages: libreoffice libreoffice-pdfimport
version: 1.0
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
- name: Install admin ui
working-directory: admin
run: pnpm install
- name: Build admin ui
working-directory: admin
run: pnpm build
-
name: Run the backend tests
run: pnpm test
- name: Run the new vitest tests
working-directory: src
run: pnpm run test:vitest
withpluginsLinux:
# 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: Linux with Plugins
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [20, 22, 23]
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install libreoffice
uses: awalsh128/cache-apt-pkgs-action@v1.5.0
with:
packages: libreoffice libreoffice-pdfimport
version: 1.0
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
- name: Install admin ui
working-directory: admin
run: pnpm install
- name: Build admin ui
working-directory: admin
run: pnpm build
-
name: Install Etherpad plugins
run: >
pnpm install --workspace-root
ep_align
ep_author_hover
ep_cursortrace
ep_font_size
ep_hash_auth
ep_headings2
ep_markdown
ep_readonly_guest
ep_set_title_on_pad
ep_spellcheck
ep_subscript_and_superscript
ep_table_of_contents
-
name: Run the backend tests
run: pnpm test
- name: Run the new vitest tests
working-directory: src
run: pnpm run test:vitest
withoutpluginsWindows:
# 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: Windows without plugins
runs-on: windows-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installOnWindows.bat
- name: Install admin ui
working-directory: admin
run: pnpm install
- name: Build admin ui
working-directory: admin
run: pnpm build
-
name: Fix up the settings.json
run: |
powershell -Command "(gc settings.json.template) -replace '\"max\": 10', '\"max\": 10000' | Out-File -encoding ASCII settings.json.holder"
powershell -Command "(gc settings.json.holder) -replace '\"points\": 10', '\"points\": 1000' | Out-File -encoding ASCII settings.json"
-
name: Run the backend tests
working-directory: src
run: pnpm test
- name: Run the new vitest tests
working-directory: src
run: pnpm run test:vitest
withpluginsWindows:
# 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: Windows with Plugins
runs-on: windows-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 22
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
- name: Install admin ui
working-directory: admin
run: pnpm install
- name: Build admin ui
working-directory: admin
run: pnpm build
-
name: Install Etherpad plugins
# The --legacy-peer-deps flag is required to work around a bug in npm
# v7: https://github.com/npm/cli/issues/2199
run: >
pnpm install --workspace-root
ep_align
ep_author_hover
ep_cursortrace
ep_font_size
ep_hash_auth
ep_headings2
ep_markdown
ep_readonly_guest
ep_set_title_on_pad
ep_spellcheck
ep_subscript_and_superscript
ep_table_of_contents
# 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 all dependencies and symlink for ep_etherpad-lite
run: bin/installOnWindows.bat
-
name: Fix up the settings.json
run: |
powershell -Command "(gc settings.json.template) -replace '\"max\": 10', '\"max\": 10000' | Out-File -encoding ASCII settings.json.holder"
powershell -Command "(gc settings.json.holder) -replace '\"points\": 10', '\"points\": 1000' | Out-File -encoding ASCII settings.json"
-
name: Run the backend tests
working-directory: src
run: pnpm test
- name: Run the new vitest tests
working-directory: src
run: pnpm run test:vitest

View file

@ -1,70 +0,0 @@
# Workflow for deploying static content to GitHub Pages
name: Deploy Docs to GitHub Pages
on:
# Runs on pushes targeting the default branch
push:
branches: ["develop"]
paths:
- doc/** # Only run workflow when changes are made to the doc directory
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
packages: read
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
- name: Install dependencies
run: pnpm install
- name: Build app
working-directory: doc
run: pnpm run docs:build
env:
COMMIT_REF: ${{ github.sha }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
# Upload entire repository
path: './doc/.vitepress/dist'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

View file

@ -1,46 +0,0 @@
name: "CodeQL"
on:
push:
branches: [develop, master]
pull_request:
# The branches below must be a subset of the branches above
branches: [develop]
paths-ignore:
- 'doc/**'
schedule:
- cron: '0 13 * * 1'
permissions:
contents: read
jobs:
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
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
-
run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
-
name: Initialize CodeQL
uses: github/codeql-action/init@v3
-
name: Autobuild
uses: github/codeql-action/autobuild@v3
-
name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

View file

@ -1,20 +0,0 @@
# 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@v4
- name: 'Dependency Review'
uses: actions/dependency-review-action@v4

View file

@ -1,144 +0,0 @@
name: Docker
on:
pull_request:
paths-ignore:
- 'doc/**'
push:
branches:
- 'develop'
paths-ignore:
- 'doc/**'
tags:
- 'v?[0-9]+.[0-9]+.[0-9]+'
env:
TEST_TAG: etherpad/etherpad:test
permissions:
contents: read
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Check out
uses: actions/checkout@v4
with:
path: etherpad
-
name: Set up QEMU
if: github.event_name == 'push'
uses: docker/setup-qemu-action@v3
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
name: Build and export to Docker
uses: docker/build-push-action@v6
with:
context: ./etherpad
target: production
load: true
tags: ${{ env.TEST_TAG }}
cache-from: type=gha
cache-to: type=gha,mode=max
-
name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 'lts/*'
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
-
name: Test
working-directory: etherpad
run: |
docker run --rm -d -p 9001:9001 --name test ${{ env.TEST_TAG }}
./bin/installDeps.sh
docker logs -f test &
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 && pnpm run test-container)
git clean -dxf .
-
name: Docker meta
if: github.event_name == 'push'
id: meta
uses: docker/metadata-action@v5
with:
images: etherpad/etherpad
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
-
name: Log in to Docker Hub
if: github.event_name == 'push'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
id: build-docker
if: github.event_name == 'push'
uses: docker/build-push-action@v6
with:
context: ./etherpad
target: production
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- name: Update repo description
uses: peter-evans/dockerhub-description@v4
if: github.ref == 'refs/heads/master'
with:
readme-filepath: ./etherpad/README.md
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: etherpad/etherpad
enable-url-completion: true
- name: Check out
if: github.event_name == 'push' && github.ref == 'refs/heads/develop'
uses: actions/checkout@v4
with:
path: ether-charts
repository: ether/ether-charts
token: ${{ secrets.ETHER_CHART_TOKEN }}
- name: Update tag in values-dev.yaml
if: success() && github.ref == 'refs/heads/develop'
working-directory: ether-charts
run: |
sed -i 's/tag: ".*"/tag: "${{ steps.build-docker.outputs.digest }}"/' values-dev.yaml
- name: Commit and push changes
working-directory: ether-charts
if: success() && github.ref == 'refs/heads/develop'
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add values-dev.yaml
git commit -m 'Update develop image tag'
git push

View file

@ -1,153 +0,0 @@
# Leave the powered by Sauce Labs bit in as this means we get additional concurrency
name: "Frontend admin tests powered by Sauce Labs"
on:
push:
paths-ignore:
- 'doc/**'
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
withplugins:
name: with plugins
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [20, 22, 23]
steps:
-
name: Generate Sauce Labs strings
id: sauce_strings
run: |
printf %s\\n '::set-output name=name::${{ github.workflow }} - ${{ 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
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Cache playwright binaries
uses: actions/cache@v4
id: playwright-cache
with:
path: |
~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
#-
# name: Install etherpad plugins
# # We intentionally install an old ep_align version to test upgrades to
# # the minor version number. The --legacy-peer-deps flag is required to
# # work around a bug in npm v7: https://github.com/npm/cli/issues/2199
# run: pnpm install --workspace-root ep_align@0.2.27
# 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 all dependencies and symlink for ep_etherpad-lite
run: pnpm i
#-
# name: Install etherpad plugins
# run: rm -Rf node_modules/ep_align/static/tests/*
-
name: export GIT_HASH to env
id: environment
run: echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})"
-
name: Create settings.json
run: cp settings.json.template settings.json
-
name: Write custom settings.json that enables the Admin UI tests
run: "sed -i 's/\"enableAdminUITests\": false/\"enableAdminUITests\": true,\\n\"users\":{\"admin\":{\"password\":\"changeme1\",\"is_admin\":true}}/' settings.json"
-
name: increase maxHttpBufferSize
run: "sed -i 's/\"maxHttpBufferSize\": 50000/\"maxHttpBufferSize\": 10000000/' settings.json"
-
name: Disable import/export rate limiting
run: |
sed -e '/^ *"importExportRateLimiting":/,/^ *\}/ s/"max":.*/"max": 100000000/' -i settings.json
- name: Build admin frontend
working-directory: admin
run: |
pnpm run build
# name: Run the frontend admin 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/adminrunner.sh
#-
# uses: saucelabs/sauce-connect-action@v2.3.6
# with:
# username: ${{ secrets.SAUCE_USERNAME }}
# accessKey: ${{ secrets.SAUCE_ACCESS_KEY }}
# tunnelIdentifier: ${{ steps.sauce_strings.outputs.tunnel_id }}
#-
# name: Run the frontend admin 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/adminrunner.sh
- name: Run the frontend admin tests
shell: bash
run: |
pnpm run prod &
connected=false
can_connect() {
curl -sSfo /dev/null http://localhost:9001/ || return 1
connected=true
}
now() { date +%s; }
start=$(now)
while [ $(($(now) - $start)) -le 15 ] && ! can_connect; do
sleep 1
done
cd src
pnpm exec playwright install
pnpm exec playwright install-deps
pnpm run test-admin
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-${{ matrix.node }}
path: src/playwright-report/
retention-days: 30

View file

@ -1,238 +0,0 @@
# Leave the powered by Sauce Labs bit in as this means we get additional concurrency
name: "Frontend tests powered by Sauce Labs"
on:
push:
paths-ignore:
- 'doc/**'
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
playwright-chrome:
name: Playwright Chrome
runs-on: ubuntu-latest
steps:
-
name: Generate Sauce Labs strings
id: sauce_strings
run: |
printf %s\\n '::set-output name=name::${{ github.workflow }} - ${{ github.job }}'
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}'
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 22
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
if: always()
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
-
name: export GIT_HASH to env
id: environment
run: echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})"
-
name: Create settings.json
run: cp ./src/tests/settings.json settings.json
- name: Cache playwright binaries
uses: actions/cache@v4
id: playwright-cache
with:
path: |
~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
- name: Run the frontend tests
shell: bash
run: |
pnpm run prod &
connected=false
can_connect() {
curl -sSfo /dev/null http://localhost:9001/ || return 1
connected=true
}
now() { date +%s; }
start=$(now)
while [ $(($(now) - $start)) -le 15 ] && ! can_connect; do
sleep 1
done
cd src
pnpm exec playwright install chromium --with-deps
pnpm run test-ui --project=chromium
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-${{ matrix.node }}-chrome
path: src/playwright-report/
retention-days: 30
playwright-firefox:
name: Playwright Firefox
runs-on: ubuntu-latest
steps:
- name: Generate Sauce Labs strings
id: sauce_strings
run: |
printf %s\\n '::set-output name=name::${{ github.workflow }} - ${{ github.job }}'
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}'
- name: Checkout repository
uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
if: always()
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
- name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
- name: export GIT_HASH to env
id: environment
run: echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})"
- name: Create settings.json
run: cp ./src/tests/settings.json settings.json
- name: Cache playwright binaries
uses: actions/cache@v4
id: playwright-cache
with:
path: |
~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
- name: Run the frontend tests
shell: bash
run: |
pnpm run prod &
connected=false
can_connect() {
curl -sSfo /dev/null http://localhost:9001/ || return 1
connected=true
}
now() { date +%s; }
start=$(now)
while [ $(($(now) - $start)) -le 15 ] && ! can_connect; do
sleep 1
done
cd src
pnpm exec playwright install firefox --with-deps
pnpm run test-ui --project=firefox
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-${{ matrix.node }}-firefox
path: src/playwright-report/
retention-days: 30
playwright-webkit:
name: Playwright Webkit
runs-on: ubuntu-latest
steps:
-
name: Generate Sauce Labs strings
id: sauce_strings
run: |
printf %s\\n '::set-output name=name::${{ github.workflow }} - ${{ github.job }}'
printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}'
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 22
- name: Cache playwright binaries
uses: actions/cache@v4
id: playwright-cache
with:
path: |
~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }}
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
if: always()
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
-
name: export GIT_HASH to env
id: environment
run: echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})"
-
name: Create settings.json
run: cp ./src/tests/settings.json settings.json
- name: Run the frontend tests
shell: bash
run: |
pnpm run prod &
connected=false
can_connect() {
curl -sSfo /dev/null http://localhost:9001/ || return 1
connected=true
}
now() { date +%s; }
start=$(now)
while [ $(($(now) - $start)) -le 15 ] && ! can_connect; do
sleep 1
done
cd src
pnpm exec playwright install webkit --with-deps
pnpm run test-ui --project=webkit || true
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-${{ matrix.node }}-webkit
path: src/playwright-report/
retention-days: 30

View file

@ -1,173 +0,0 @@
name: "Loadtest"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
jobs:
withoutplugins:
# 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: without plugins
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
-
name: Install etherpad-load-test
run: sudo npm install -g etherpad-load-test-socket-io
-
name: Run load test
run: src/tests/frontend/travis/runnerLoadTest.sh 25 50
withplugins:
# 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: with Plugins
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install etherpad-load-test
run: pnpm install -g etherpad-load-test-socket-io
-
name: Install etherpad plugins
# The --legacy-peer-deps flag is required to work around a bug in npm v7:
# https://github.com/npm/cli/issues/2199
run: >
pnpm install --workspace-root
ep_align
ep_author_hover
ep_cursortrace
ep_font_size
ep_hash_auth
ep_headings2
ep_markdown
ep_readonly_guest
ep_set_title_on_pad
ep_spellcheck
ep_subscript_and_superscript
ep_table_of_contents
# 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 all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
-
name: Run load test
run: src/tests/frontend/travis/runnerLoadTest.sh 25 50
long:
# 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: long running
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
-
name: Install etherpad-load-test
run: sudo npm install -g etherpad-load-test-socket-io
-
name: Run load test
run: src/tests/frontend/travis/runnerLoadTest.sh 5000 5

View file

@ -1,52 +0,0 @@
name: "Perform type checks"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
jobs:
performTypeCheck:
if: |
(github.event_name != 'pull_request')
|| (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id)
name: perform type check
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: ./bin/installDeps.sh
- name: Perform type check
working-directory: ./src
run: npm run ts-check

View file

@ -1,71 +0,0 @@
name: "rate limit"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
jobs:
ratelimit:
# 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: test
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
-
name: docker network
run: docker network create --subnet=172.23.0.0/16 ep_net
-
name: build docker image
run: |
docker build -f Dockerfile -t epl-debian-slim --build-arg NODE_ENV=develop .
docker build -f src/tests/ratelimit/Dockerfile.nginx -t nginx-latest .
docker build -f src/tests/ratelimit/Dockerfile.anotherip -t anotherip .
-
name: run docker images
run: |
docker run --name etherpad-docker -p 9000:9001 --rm --network ep_net --ip 172.23.42.2 -e 'TRUST_PROXY=true' epl-debian-slim &
docker run -p 8081:80 --rm --network ep_net --ip 172.23.42.1 -d nginx-latest
docker run --rm --network ep_net --ip 172.23.42.3 --name anotherip -dt anotherip
-
name: install dependencies and create symlink for ep_etherpad-lite
run: bin/installDeps.sh
-
name: run rate limit test
run: |
cd src/tests/ratelimit
./testlimits.sh

View file

@ -1,18 +0,0 @@
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@v9
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

@ -1,116 +0,0 @@
name: "Upgrade from latest release"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
jobs:
withpluginsLinux:
# 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: Linux with Plugins
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [20, 22, 23]
steps:
-
name: Check out latest release
uses: actions/checkout@v4
with:
ref: develop #FIXME change to master when doing release
-
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
- name: Install libreoffice
uses: awalsh128/cache-apt-pkgs-action@v1.5.0
with:
packages: libreoffice libreoffice-pdfimport
version: 1.0
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install libreoffice
uses: awalsh128/cache-apt-pkgs-action@v1.5.0
with:
packages: libreoffice libreoffice-pdfimport
version: 1.0
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: bin/installDeps.sh
- name: Install admin ui
working-directory: admin
run: pnpm install
- name: Build admin ui
working-directory: admin
run: pnpm build
-
name: Install Etherpad plugins
run: >
pnpm run install-plugins
ep_align
ep_author_hover
ep_cursortrace
ep_font_size
ep_hash_auth
ep_headings2
ep_markdown
ep_readonly_guest
ep_set_title_on_pad
ep_spellcheck
ep_subscript_and_superscript
ep_table_of_contents
-
name: Run the backend tests
run: pnpm run test
-
name: Install all dependencies and symlink for ep_etherpad-lite
run: ./bin/installDeps.sh
# Because actions/checkout@v4 is called with "ref: master" and without
# "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
# plain "git fetch" only fetches "normal" references (refs/heads/* and
# refs/tags/*), and for pull requests none of the normal references
# include ${GITHUB_SHA}, so we have to explicitly tell Git to fetch
# ${GITHUB_REF}.
-
name: Fetch the new Git commits
run: git fetch --depth=1 origin "${GITHUB_REF}"
-
name: Upgrade to the new Git revision
# For pull requests, ${GITHUB_SHA} is the automatically generated merge
# commit that merges the PR's source branch to its destination branch.
run: git checkout "${GITHUB_SHA}"
- name: Run the backend tests
run: pnpm run test

View file

@ -1,86 +0,0 @@
name: "Windows Build"
# any branch is useful for testing before a PR is submitted
on:
push:
paths-ignore:
- "doc/**"
pull_request:
paths-ignore:
- "doc/**"
permissions:
contents: read
jobs:
build-zip:
permissions: write-all
# 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
runs-on: windows-latest
steps:
-
uses: msys2/setup-msys2@v2
with:
path-type: inherit
install: >-
zip
-
name: Checkout repository
uses: actions/checkout@v4
-
uses: actions/setup-node@v4
with:
node-version: 22
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.0.4
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Only install direct dependencies
run: pnpm config set auto-install-peers false
-
name: Install all dependencies and symlink for ep_etherpad-lite
shell: msys2 {0}
run: bin/installDeps.sh
-
name: Run the backend tests
shell: msys2 {0}
working-directory: src
run: pnpm test
-
name: Run Etherpad
working-directory: src
run: |
pnpm i
pnpm exec playwright install --with-deps
pnpm run prod &
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
pnpm exec playwright install chromium --with-deps
pnpm run test-ui --project=chromium
# On release, create release
- name: Generate Changelog
if: ${{startsWith(github.ref, 'refs/tags/v') }}
working-directory: bin
run: pnpm run generateChangelog ${{ github.ref }} > ${{ github.workspace }}-CHANGELOG.txt
- name: Release
uses: softprops/action-gh-release@v2
if: ${{startsWith(github.ref, 'refs/tags/v') }}
with:
body_path: ${{ github.workspace }}-CHANGELOG.txt
make_latest: true

27
.gitignore vendored
View file

@ -1,30 +1,17 @@
/etherpad-win.exe
/etherpad-win.zip
node_modules
/settings.json
settings.json
!settings.json.template
APIKEY.txt
SESSIONKEY.txt
bin/abiword.exe
bin/node.exe
etherpad-lite-win.zip
var/dirty.db
.env
bin/convertSettings.json
*~
*.patch
src/static/js/jquery.js
npm-debug.log
*.DS_Store
.ep_initialized
*.crt
*.key
credentials.json
out/
.nyc_output
.idea
/package-lock.json
/src/bin/abiword.exe
/src/bin/convertSettings.json
/src/bin/etherpad-1.deb
/src/bin/node.exe
plugin_packages
/src/templates/admin
/src/test-results
playwright-report
state.json
/src/static/oidc

View file

@ -1,9 +0,0 @@
extraction:
javascript:
index:
exclude:
- src/static/js/vendors
python:
index:
exclude:
- /

1
.npmrc
View file

@ -1 +0,0 @@
auto-install-peers=false

View file

@ -1,145 +1,22 @@
language: node_js
node_js:
- "lts/*"
services:
- docker
cache: false
- "0.8"
install:
- "bin/installDeps.sh"
- "export GIT_HASH=$(cat .git/HEAD | head -c 7)"
before_script:
- "tests/frontend/travis/sauce_tunnel.sh"
script:
- "tests/frontend/travis/runner.sh"
env:
global:
- secure: "WMGxFkOeTTlhWB+ChMucRtIqVmMbwzYdNHuHQjKCcj8HBEPdZLfCuK/kf4rG\nVLcLQiIsyllqzNhBGVHG1nyqWr0/LTm8JRqSCDDVIhpyzp9KpCJQQJG2Uwjk\n6/HIJJh/wbxsEdLNV2crYU/EiVO3A4Bq0YTHUlbhUqG3mSCr5Ec="
- secure: "gejXUAHYscbR6Bodw35XexpToqWkv2ifeECsbeEmjaLkYzXmUUNWJGknKSu7\nEUsSfQV8w+hxApr1Z+jNqk9aX3K1I4btL3cwk2trnNI8XRAvu1c1Iv60eerI\nkE82Rsd5lwUaMEh+/HoL8ztFCZamVndoNgX7HWp5J/NRZZMmh4g="
_set_loglevel_warn: &set_loglevel_warn |
sed -e 's/"loglevel":[^,]*/"loglevel": "WARN"/' \
settings.json.template >settings.json.template.new &&
mv settings.json.template.new settings.json.template
_enable_admin_tests: &enable_admin_tests |
sed -e 's/"enableAdminUITests": false/"enableAdminUITests": true,\n"users":{"admin":{"password":"changeme","is_admin":true}}/' \
settings.json.template >settings.json.template.new &&
mv settings.json.template.new settings.json.template
_install_libreoffice: &install_libreoffice >-
sudo add-apt-repository -y ppa:libreoffice/ppa &&
sudo apt-get update &&
sudo apt-get -y install libreoffice libreoffice-pdfimport
# The --legacy-peer-deps flag is required to work around a bug in npm v7:
# https://github.com/npm/cli/issues/2199
_install_plugins: &install_plugins >-
npm install --no-save --legacy-peer-deps
ep_align
ep_author_hover
ep_cursortrace
ep_font_size
ep_hash_auth
ep_headings2
ep_markdown
ep_readonly_guest
ep_spellcheck
ep_subscript_and_superscript
ep_table_of_contents
ep_set_title_on_pad
jobs:
include:
# we can only frontend tests from the ether/ organization and not from forks.
# To request tests to be run ask a maintainer to fork your repo to ether/
- if: fork = false
name: "Test the Frontend without Plugins"
install:
- *set_loglevel_warn
- *enable_admin_tests
- "src/tests/frontend/travis/sauce_tunnel.sh"
- "bin/installDeps.sh"
- "export GIT_HASH=$(git rev-parse --verify --short HEAD)"
script:
- "./src/tests/frontend/travis/runner.sh"
- name: "Run the Backend tests without Plugins"
install:
- *install_libreoffice
- *set_loglevel_warn
- "bin/installDeps.sh"
- "cd src && pnpm install && cd -"
script:
- "cd src && pnpm test"
- name: "Test the Dockerfile"
install:
- "cd src && pnpm install && cd -"
script:
- "docker build -t etherpad:test ."
- "docker run -d -p 9001:9001 etherpad:test && sleep 3"
- "cd src && pnpm run test-container"
- name: "Load test Etherpad without Plugins"
install:
- *set_loglevel_warn
- "bin/installDeps.sh"
- "cd src && pnpm install && cd -"
- "npm install -g etherpad-load-test"
script:
- "src/tests/frontend/travis/runnerLoadTest.sh"
# we can only frontend tests from the ether/ organization and not from forks.
# To request tests to be run ask a maintainer to fork your repo to ether/
- if: fork = false
name: "Test the Frontend Plugins only"
install:
- *set_loglevel_warn
- *enable_admin_tests
- "src/tests/frontend/travis/sauce_tunnel.sh"
- "bin/installDeps.sh"
- "rm src/tests/frontend/specs/*"
- *install_plugins
- "export GIT_HASH=$(git rev-parse --verify --short HEAD)"
script:
- "./src/tests/frontend/travis/runner.sh"
- name: "Lint test package-lock.json"
install:
- "npm install lockfile-lint"
script:
- npx lockfile-lint --path src/package-lock.json --validate-https --allowed-hosts npm
- name: "Run the Backend tests with Plugins"
install:
- *install_libreoffice
- *set_loglevel_warn
- "bin/installDeps.sh"
- *install_plugins
- "cd src && pnpm install && cd -"
script:
- "cd src && pnpm test"
- name: "Test the Dockerfile"
install:
- "cd src && pnpm install && cd -"
script:
- "docker build -t etherpad:test ."
- "docker run -d -p 9001:9001 etherpad:test && sleep 3"
- "cd src && pnpm run test-container"
- name: "Load test Etherpad with Plugins"
install:
- *set_loglevel_warn
- "bin/installDeps.sh"
- *install_plugins
- "cd src && npm install && cd -"
- "npm install -g etherpad-load-test"
script:
- "src/tests/frontend/travis/runnerLoadTest.sh"
- name: "Test rate limit"
install:
- "docker network create --subnet=172.23.42.0/16 ep_net"
- "docker build -f Dockerfile -t epl-debian-slim ."
- "docker build -f src/tests/ratelimit/Dockerfile.nginx -t nginx-latest ."
- "docker build -f src/tests/ratelimit/Dockerfile.anotherip -t anotherip ."
- "docker run -p 8081:80 --rm --network ep_net --ip 172.23.42.1 -d nginx-latest"
- "docker run --name etherpad-docker -p 9000:9001 --rm --network ep_net --ip 172.23.42.2 -e 'TRUST_PROXY=true' epl-debian-slim &"
- "docker run --rm --network ep_net --ip 172.23.42.3 --name anotherip -dt anotherip"
- "./bin/installDeps.sh"
script:
- "cd src/tests/ratelimit && bash testlimits.sh"
- secure: "OxZ2s724S96xu02746LUN+4lBckAe1BOICJjfA4jnFPNpiNU6XoMH52f+LgG\nZzAwu6xMTv+NsaLGp6Avm3cx4GZ+jIiHe4NB9XOgYPa0r0TBIi3ueWYPDyVv\nCniS/4qX68DoFNV4lh7zMBXn0IIPxT4Wppm3desBpjWDP/SdoRs="
- SAUCE_USER=pita
jdk:
- oraclejdk6
notifications:
email:
- petermartischka@googlemail.com
irc:
channels:
- "irc.freenode.org#etherpad-lite-dev"
- "irc.freenode.org#etherpad-lite-dev"

File diff suppressed because it is too large Load diff

View file

@ -1,73 +1,18 @@
# Contributor Guidelines
# Developer Guidelines
(Please talk to people on the mailing list before you change this page, see our section on [how to get in touch](https://github.com/ether/etherpad-lite#get-in-touch))
## Pull requests
## Important note for pull requests
**Pull requests should issued against the develop branch**. We never pull directly into master.
* the commit series in the PR should be _linear_ (it **should not contain merge commits**). This is necessary because we want to be able to [bisect](https://en.wikipedia.org/wiki/Bisection_(software_engineering)) bugs easily. Rewrite history/perform a rebase if necessary
* PRs should be issued against the **develop** branch: we never pull directly into **master**
* PRs **should not have conflicts** with develop. If there are, please resolve them rebasing and force-pushing
* when preparing your PR, please make sure that you have included the relevant **changes to the documentation** (preferably with usage examples)
* contain meaningful and detailed **commit messages** in the form:
```
submodule: description
**Our goal is to iterate in small steps. Release often, release early. Evolution instead of a revolution**
longer description of the change you have made, eventually mentioning the
number of the issue that is being fixed, in the form: Fixes #someIssueNumber
```
* if the PR is a **bug fix**:
* The commit that fixes the bug should **include a regression test** that
would fail if the bug fix was reverted. Adding the regression test in the
same commit as the bug fix makes it easier for a reviewer to verify that the
test is appropriate for the bug fix.
* If there is a bug report, **the pull request description should include the
text "`Fixes #xxx`"** so that the bug report is auto-closed when the PR is
merged. It is less useful to say the same thing in a commit message because
GitHub will spam the bug report every time the commit is rebased, and
because a bug number alone becomes meaningless in forks. (A full URL would
be better, but ideally each commit is readable on its own without the need
to examine an external reference to understand motivation or context.)
* think about stability: code has to be backwards compatible as much as possible. Always **assume your code will be run with an older version of the DB/config file**
* if you want to remove a feature, **deprecate it instead**:
* write an issue with your deprecation plan
* output a `WARN` in the log informing that the feature is going to be removed
* remove the feature in the next version
* if you want to add a new feature, put it under a **feature flag**:
* once the new feature has reached a minimal level of stability, do a PR for it, so it can be integrated early
* expose a mechanism for enabling/disabling the feature
* the new feature should be **disabled** by default. With the feature disabled, the code path should be exactly the same as before your contribution. This is a __necessary condition__ for early integration
* think of the PR not as something that __you wrote__, but as something that __someone else is going to read__. The commit series in the PR should tell a novice developer the story of your thoughts when developing it
## How to write a bug report
* Please be polite, we all are humans and problems can occur.
* Please add as much information as possible, for example
* client os(s) and version(s)
* browser(s) and version(s), is the problem reproducible on different clients
* special environments like firewalls or antivirus
* host os and version
* npm and nodejs version
* Logfiles if available
* steps to reproduce
* what you expected to happen
* what actually happened
* Please format logfiles and code examples with markdown see github Markdown help below the issue textarea for more information.
If you send logfiles, please set the loglevel switch DEBUG in your settings.json file:
```
/* The log level we are using, can be: DEBUG, INFO, WARN, ERROR */
"loglevel": "DEBUG",
```
The logfile location is defined in startup script or the log is directly shown in the commandline after you have started etherpad.
## General goals of Etherpad
## General goals of Etherpad Lite
To make sure everybody is going in the same direction:
* easy to install for admins and easy to use for people
* easy to integrate into other apps, but also usable as standalone
* lightweight and scalable
* extensible, as much functionality should be extendable with plugins so changes don't have to be done in core.
Also, keep it maintainable. We don't wanna end up as the monster Etherpad was!
* using less resources on server side
* extensible, as much functionality should be extendable with plugins so changes don't have to be done in core
Also, keep it maintainable. We don't wanna end ob as the monster Etherpad was!
## How to work with git?
* Don't work in your master branch.
@ -79,14 +24,13 @@ Also, keep it maintainable. We don't wanna end up as the monster Etherpad was!
* Make small pull requests that are easy to review but make sure they do add value by themselves / individually
## Coding style
* Do write comments. (You don't have to comment every line, but if you come up with something that's a bit complex/weird, just leave a comment. Bear in mind that you will probably leave the project at some point and that other people will read your code. Undocumented huge amounts of code are worthless!)
* Do write comments. (You don't have to comment every line, but if you come up with something thats a bit complex/weird, just leave a comment. Bear in mind that you will probably leave the project at some point and that other people will read your code. Undocumented huge amounts of code are worthless!)
* Never ever use tabs
* Indentation: JS/CSS: 2 spaces; HTML: 4 spaces
* Don't overengineer. Don't try to solve any possible problem in one step, but try to solve problems as easy as possible and improve the solution over time!
* Do generalize sooner or later! (if an old solution, quickly hacked together, poses more problems than it solves today, refactor it!)
* Keep it compatible. Do not introduce changes to the public API, db schema or configurations too lightly. Don't make incompatible changes without good reasons!
* If you do make changes, document them! (see below)
* Use protocol independent urls "//"
## Branching model / git workflow
see git flow http://nvie.com/posts/a-successful-git-branching-model/
@ -109,7 +53,7 @@ see git flow http://nvie.com/posts/a-successful-git-branching-model/
### feature branches (in your own repos)
* these are the branches where you develop your features in
* If it's ready to go out, it will be merged into develop
* If its ready to go out, it will be merged into develop
Over the time we pull features from feature branches into the develop branch. Every month we pull from develop into master. Bugs in master get fixed in hotfix branches. These branches will get merged into master AND develop. There should never be commits in master that aren't in develop
@ -118,25 +62,4 @@ The docs are in the `doc/` folder in the git repository, so people can easily fi
Documentation should be kept up-to-date. This means, whenever you add a new API method, add a new hook or change the database model, pack the relevant changes to the docs in the same pull request.
You can build the docs e.g. produce html, using `make docs`. At some point in the future we will provide an online documentation. The current documentation in the github wiki should always reflect the state of `master` (!), since there are no docs in master, yet.
## Testing
Front-end tests are found in the `tests/frontend/` folder in the repository. Run them by pointing your browser to `<yourdomainhere>/tests/frontend`.
Back-end tests can be run from the `src` directory, via `npm test`.
You can use `npm test -- --inspect-brk` and navigate to `edge://inspect` or `chrome://inspect` to debug the tests.
## Things you can help with
Etherpad is much more than software. So if you aren't a developer then worry not, there is still a LOT you can do! A big part of what we do is community engagement. You can help in the following ways
* Triage bugs (applying labels) and confirming their existence
* Testing fixes (simply applying them and seeing if it fixes your issue or not) - Some git experience required
* Notifying large site admins of new releases
* Writing Changelogs for releases
* Creating Windows packages
* Creating releases
* Bumping dependencies periodically and checking they don't break anything
* Write proposals for grants
* Co-Author and Publish CVEs
* Work with SFC to maintain legal side of project
* Maintain TODO page - https://github.com/ether/etherpad-lite/wiki/TODO#IMPORTANT_TODOS
You can build the docs e.g. produce html, using `make docs`. At some point in the future we will provide an online documentation. The current documentation in the github wiki should always reflect the state of `master` (!), since there are no docs in master, yet.

View file

@ -1,190 +0,0 @@
# Etherpad Lite Dockerfile
#
# https://github.com/ether/etherpad-lite
#
# Author: muxator
ARG BUILD_ENV=git
FROM node:alpine AS adminbuild
RUN npm install -g pnpm@latest
WORKDIR /opt/etherpad-lite
COPY . .
RUN pnpm install
RUN pnpm run build:ui
FROM node:alpine AS build
LABEL maintainer="Etherpad team, https://github.com/ether/etherpad-lite"
# Set these arguments when building the image from behind a proxy
ARG http_proxy=
ARG https_proxy=
ARG no_proxy=
ARG TIMEZONE=
RUN \
[ -z "${TIMEZONE}" ] || { \
apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \
echo "${TIMEZONE}" > /etc/timezone; \
}
ENV TIMEZONE=${TIMEZONE}
# Control the configuration file to be copied into the container.
ARG SETTINGS=./settings.json.docker
# plugins to install while building the container. By default no plugins are
# installed.
# If given a value, it has to be a space-separated, quoted list of plugin names.
#
# EXAMPLE:
# ETHERPAD_PLUGINS="ep_codepad ep_author_neat"
ARG ETHERPAD_PLUGINS=
# local plugins to install while building the container. By default no plugins are
# installed.
# If given a value, it has to be a space-separated, quoted list of plugin names.
#
# EXAMPLE:
# ETHERPAD_LOCAL_PLUGINS="../ep_my_plugin ../ep_another_plugin"
ARG ETHERPAD_LOCAL_PLUGINS=
# github plugins to install while building the container. By default no plugins are
# installed.
# If given a value, it has to be a space-separated, quoted list of plugin names.
#
# EXAMPLE:
# ETHERPAD_GITHUB_PLUGINS="ether/ep_plugin"
ARG ETHERPAD_GITHUB_PLUGINS=
# Control whether abiword will be installed, enabling exports to DOC/PDF/ODT formats.
# By default, it is not installed.
# If given any value, abiword will be installed.
#
# EXAMPLE:
# INSTALL_ABIWORD=true
ARG INSTALL_ABIWORD=
# Control whether libreoffice will be installed, enabling exports to DOC/PDF/ODT formats.
# By default, it is not installed.
# If given any value, libreoffice will be installed.
#
# EXAMPLE:
# INSTALL_LIBREOFFICE=true
ARG INSTALL_SOFFICE=
# Install dependencies required for modifying access.
RUN apk add --no-cache shadow bash
# Follow the principle of least privilege: run as unprivileged user.
#
# Running as non-root enables running this image in platforms like OpenShift
# that do not allow images running as root.
#
# If any of the following args are set to the empty string, default
# values will be chosen.
ARG EP_HOME=
ARG EP_UID=5001
ARG EP_GID=0
ARG EP_SHELL=
RUN groupadd --system ${EP_GID:+--gid "${EP_GID}" --non-unique} etherpad && \
useradd --system ${EP_UID:+--uid "${EP_UID}" --non-unique} --gid etherpad \
${EP_HOME:+--home-dir "${EP_HOME}"} --create-home \
${EP_SHELL:+--shell "${EP_SHELL}"} etherpad
ARG EP_DIR=/opt/etherpad-lite
RUN mkdir -p "${EP_DIR}" && chown etherpad:etherpad "${EP_DIR}"
# the mkdir is needed for configuration of openjdk-11-jre-headless, see
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199
RUN \
mkdir -p /usr/share/man/man1 && \
npm install pnpm@latest -g && \
apk update && apk upgrade && \
apk add --no-cache \
ca-certificates \
curl \
git \
${INSTALL_ABIWORD:+abiword abiword-plugin-command} \
${INSTALL_SOFFICE:+libreoffice openjdk8-jre libreoffice-common}
USER etherpad
WORKDIR "${EP_DIR}"
# etherpads version feature requires this. Only copy what is really needed
COPY --chown=etherpad:etherpad ${SETTINGS} ./settings.json
COPY --chown=etherpad:etherpad ./var ./var
COPY --chown=etherpad:etherpad ./bin ./bin
COPY --chown=etherpad:etherpad ./pnpm-workspace.yaml ./package.json ./
FROM build AS build_git
ONBUILD COPY --chown=etherpad:etherpad ./.git/HEA[D] ./.git/HEAD
ONBUILD COPY --chown=etherpad:etherpad ./.git/ref[s] ./.git/refs
FROM build AS build_copy
FROM build_${BUILD_ENV} AS development
ARG ETHERPAD_PLUGINS=
ARG ETHERPAD_LOCAL_PLUGINS=
ARG ETHERPAD_LOCAL_PLUGINS_ENV=
ARG ETHERPAD_GITHUB_PLUGINS=
COPY --chown=etherpad:etherpad ./src/ ./src/
COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/ templates/admin./src/templates/admin
COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/static/oidc ./src/static/oidc
COPY --chown=etherpad:etherpad ./local_plugin[s] ./local_plugins/
RUN bash -c ./bin/installLocalPlugins.sh
RUN bin/installDeps.sh && \
if [ ! -z "${ETHERPAD_PLUGINS}" ] || [ ! -z "${ETHERPAD_GITHUB_PLUGINS}" ]; then \
pnpm run plugins i ${ETHERPAD_PLUGINS} ${ETHERPAD_GITHUB_PLUGINS:+--github ${ETHERPAD_GITHUB_PLUGINS}}; \
fi
FROM build_${BUILD_ENV} AS production
ARG ETHERPAD_PLUGINS=
ARG ETHERPAD_LOCAL_PLUGINS=
ARG ETHERPAD_LOCAL_PLUGINS_ENV=
ARG ETHERPAD_GITHUB_PLUGINS=
ENV NODE_ENV=production
ENV ETHERPAD_PRODUCTION=true
COPY --chown=etherpad:etherpad ./src ./src
COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/templates/admin ./src/templates/admin
COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/static/oidc ./src/static/oidc
COPY --chown=etherpad:etherpad ./local_plugin[s] ./local_plugins/
RUN bash -c ./bin/installLocalPlugins.sh
RUN bin/installDeps.sh && \
if [ ! -z "${ETHERPAD_PLUGINS}" ] || [ ! -z "${ETHERPAD_GITHUB_PLUGINS}" ]; then \
pnpm run plugins i ${ETHERPAD_PLUGINS} ${ETHERPAD_GITHUB_PLUGINS:+--github ${ETHERPAD_GITHUB_PLUGINS}}; \
fi
# Copy the configuration file.
COPY --chown=etherpad:etherpad ${SETTINGS} "${EP_DIR}"/settings.json
# Fix group permissions
# Note: For some reason increases image size from 257 to 334.
# RUN chmod -R g=u .
USER etherpad
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl --silent http://localhost:9001/health | grep -E "pass|ok|up" > /dev/null || exit 1
EXPOSE 9001
CMD ["pnpm", "run", "prod"]

View file

@ -1,3 +1,4 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
@ -186,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2013 THE ETHERPAD FOUNDATION
Copyright 2012 THE ETHERPAD FOUNDATION
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

25
Makefile Normal file
View file

@ -0,0 +1,25 @@
doc_sources = $(wildcard doc/*/*.md) $(wildcard doc/*.md)
outdoc_files = $(addprefix out/,$(doc_sources:.md=.html))
docassets = $(addprefix out/,$(wildcard doc/assets/*))
VERSION = $(shell node -e "console.log( require('./src/package.json').version )")
UNAME := $(shell uname -s)
docs: $(outdoc_files) $(docassets)
out/doc/assets/%: doc/assets/%
mkdir -p $(@D)
cp $< $@
out/doc/%.html: doc/%.md
mkdir -p $(@D)
node tools/doc/generate.js --format=html --template=doc/template.html $< > $@
ifeq ($(UNAME),Darwin)
sed -i '' 's/__VERSION__/${VERSION}/' $@
else
sed -i 's/__VERSION__/${VERSION}/' $@
endif
clean:
rm -rf out/

359
README.md
View file

@ -1,317 +1,128 @@
# Etherpad: A real-time collaborative editor for the web
# Making collaborative editing the standard on the web
![Demo Etherpad Animated Jif](doc/public/etherpad_demo.gif "Etherpad in action")
# About
Etherpad lite is a really-real time collaborative editor spawned from the Hell fire of Etherpad.
We're reusing the well tested Etherpad easysync library to make it really realtime. Etherpad Lite
is based on node.js ergo is much lighter and more stable than the original Etherpad. Our hope
is that this will encourage more users to use and install a realtime collaborative editor. A smaller, manageable and well
documented codebase makes it easier for developers to improve the code and contribute towards the project.
## About
**Etherpad vs Etherpad lite**
<table>
<tr>
<td>&nbsp;</td><td><b>Etherpad</b></td><td><b>Etherpad Lite</b></td>
</tr>
<tr>
<td align="right">Size of the folder (without git history)</td><td>30 MB</td><td>1.5 MB</td>
</tr>
<tr>
<td align="right">Languages used server side</td><td>Javascript (Rhino), Java, Scala</td><td>Javascript (node.js)</td>
</tr>
<tr>
<td align="right">Lines of server side Javascript code</td><td>~101k</td><td>~9k</td>
</tr>
<tr>
<td align="right">RAM Usage immediately after start</td><td>257 MB (grows to ~1GB)</td><td>16 MB (grows to ~30MB)</td>
</tr>
</table>
Etherpad 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 Lite is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API)
that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API. There is also a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website.
There's also a full-featured plugin framework, allowing you to easily add your own features.
Finally, Etherpad Lite comes with translations into tons of different languages!
Wikimedia provide a [public Etherpad instance for you to Try Etherpad out.](https://etherpad.wikimedia.org) or [use another public Etherpad instance to see other features](https://github.com/ether/etherpad-lite/wiki/Sites-That-Run-Etherpad#sites-that-run-etherpad)
**Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live**
## Project Status
Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**, really!
We're looking for maintainers and have some funding available. Please contact John McLear if you can help.
# Installation
### Code Quality
## Windows
[![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)
### Prebuilt windows package
This package works out of the box on any windows machine, but it's not very useful for developing purposes...
### Testing
1. Download the windows package <https://github.com/ether/etherpad-lite/downloads>
2. Extract the folder
[![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)
Now, run `start.bat` and open <http://localhost:9001> in your browser. You like it? [Next steps](#next-steps).
### Engagement
### Fancy install
You'll need [node.js](http://nodejs.org) and (optionally, though recommended) git.
[![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)
1. Grab the source, either
- download <https://github.com/ether/etherpad-lite/zipball/master>
- or `git clone https://github.com/ether/etherpad-lite.git` (for this you need git, obviously)
2. start `bin\installOnWindows.bat`
## Installation
Now, run `start.bat` and open <http://localhost:9001> in your browser.
### Docker-Compose
Update to the latest version with `git pull origin`, then run `bin\installOnWindows.bat`, again.
```yaml
services:
app:
user: "0:0"
image: etherpad/etherpad:latest
tty: true
stdin_open: true
volumes:
- plugins:/opt/etherpad-lite/src/plugin_packages
- etherpad-var:/opt/etherpad-lite/var
depends_on:
- postgres
environment:
NODE_ENV: production
ADMIN_PASSWORD: ${DOCKER_COMPOSE_APP_ADMIN_PASSWORD:-admin}
DB_CHARSET: ${DOCKER_COMPOSE_APP_DB_CHARSET:-utf8mb4}
DB_HOST: postgres
DB_NAME: ${DOCKER_COMPOSE_POSTGRES_DATABASE:-etherpad}
DB_PASS: ${DOCKER_COMPOSE_POSTGRES_PASSWORD:-admin}
DB_PORT: ${DOCKER_COMPOSE_POSTGRES_PORT:-5432}
DB_TYPE: "postgres"
DB_USER: ${DOCKER_COMPOSE_POSTGRES_USER:-admin}
# For now, the env var DEFAULT_PAD_TEXT cannot be unset or empty; it seems to be mandatory in the latest version of etherpad
DEFAULT_PAD_TEXT: ${DOCKER_COMPOSE_APP_DEFAULT_PAD_TEXT:- }
DISABLE_IP_LOGGING: ${DOCKER_COMPOSE_APP_DISABLE_IP_LOGGING:-false}
SOFFICE: ${DOCKER_COMPOSE_APP_SOFFICE:-null}
TRUST_PROXY: ${DOCKER_COMPOSE_APP_TRUST_PROXY:-true}
restart: always
ports:
- "${DOCKER_COMPOSE_APP_PORT_PUBLISHED:-9001}:${DOCKER_COMPOSE_APP_PORT_TARGET:-9001}"
[Next steps](#next-steps).
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: ${DOCKER_COMPOSE_POSTGRES_DATABASE:-etherpad}
POSTGRES_PASSWORD: ${DOCKER_COMPOSE_POSTGRES_PASSWORD:-admin}
POSTGRES_PORT: ${DOCKER_COMPOSE_POSTGRES_PORT:-5432}
POSTGRES_USER: ${DOCKER_COMPOSE_POSTGRES_USER:-admin}
PGDATA: /var/lib/postgresql/data/pgdata
restart: always
# Exposing the port is not needed unless you want to access this database instance from the host.
# Be careful when other postgres docker container are running on the same port
# ports:
# - "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
## Linux
You'll need gzip, git, curl, libssl develop libraries, python and gcc.
*For Debian/Ubuntu*: `apt-get install gzip git-core curl python libssl-dev pkg-config build-essential`
*For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"`
volumes:
postgres_data:
plugins:
etherpad-var:
```
Additionally, you'll need [node.js](http://nodejs.org) installed, Ideally the latest stable version, be careful of installing nodejs from apt.
### Requirements
**As any user (we recommend creating a separate user called etherpad-lite):**
[Node.js](https://nodejs.org/) >= **18.18.2**.
1. Move to a folder where you want to install Etherpad Lite. Clone the git repository `git clone git://github.com/ether/etherpad-lite.git`
2. Change into the new directory containing the cloned source code `cd etherpad-lite`
### Windows, macOS, Linux
Now, run `bin/run.sh` and open <http://127.0.0.1:9001> in your browser.
1. Download the latest Node.js runtime from [nodejs.org](https://nodejs.org/).
2. Install pnpm: `npm install -g pnpm` (Administrator privileges may be required).
3. Clone the repository: `git clone -b master`
4. Run `pnpm i`
5. Run `pnpm run build:etherpad`
6. Run `pnpm run prod`
7. Visit `http://localhost:9001` in your browser.
Update to the latest version with `git pull origin`. The next start with bin/run.sh will update the dependencies.
### Docker container
You like it? [Next steps](#next-steps).
Find [here](doc/docker.adoc) information on running Etherpad in a container.
# Next Steps
## Plugins
## Tweak the settings
You can modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad Lite instances from the same installation.)
Etherpad is very customizable through plugins.
![Basic install](doc/public/etherpad_basic.png "Basic Installation")
![Full Features](doc/public/etherpad_full_features.png "You can add a lot of plugins !")
### Available Plugins
For a list of available plugins, see the [plugins
site](https://static.etherpad.org).
### Plugin Installation
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
pnpm run plugins i ep_${plugin_name}
```
Also see [the plugin wiki
article](https://github.com/ether/etherpad-lite/wiki/Available-Plugins).
### Suggested Plugins
Run the following command in your Etherpad folder to get all of the features
visible in the above demo gif:
```sh
pnpm run plugins i \
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.
### Upgrade Etherpad
Run the following command in your Etherpad folder to upgrade
1. Stop any running Etherpad (manual, systemd ...)
2. Get present version
```sh
git -P tag --contains
```
3. List versions available
```sh
git -P tag --list "v*" --merged
```
4. Select the version
```sh
git checkout v2.2.5
git switch -c v2.2.5
```
5. Upgrade Etherpad
```sh
./bin/run.sh
```
6. Stop with [CTRL-C]
7. Restart your Etherpad service
## Next Steps
### Tweak the settings
You can modify the settings in `settings.json`. If you need to handle multiple
settings files, you can pass the path to a settings file to `bin/run.sh`
using the `-s|--settings` option: this allows you to run multiple Etherpad
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/public/etherpad_skin_variants.gif "Skin variants")
You should use a dedicated database such as "mysql", if you are planning on using etherpad-lite in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes.
## Helpful resources
The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages.
The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop
resource for Tutorials and How-to's.
Documentation can be found in `docs/`.
Documentation can be found in `doc/`.
# Development
## Development
## Things you should know
Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Lite Development](http://youtu.be/67-Q26YH97E).
### Things you should know
If you're new to node.js, start with Ryan Dahl's [Introduction to Node.js](http://youtu.be/jo_B4LTHi3I).
You can debug Etherpad using `bin/debugRun.sh`.
You can debug Etherpad lite using `bin/debugRun.sh`.
You can run Etherpad quickly launching `bin/fastRun.sh`. It's convenient for
developers and advanced users. Be aware that it will skip the dependencies
update, so remember to run `bin/installDeps.sh` after installing a new
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).
## Getting started
You know all this and just want to know how you can help?
### Contributing
Look at the [TODO list](https://github.com/ether/etherpad-lite/wiki/TODO) and our [Issue tracker](https://github.com/ether/etherpad-lite/issues). (Please consider using [jshint](http://www.jshint.com/about/), if you plan to contribute code.)
Read our [**Developer
Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md)
Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/blob/master/CONTRIBUTING.md), really!
### HTTP API
# Get in touch
Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)!
Etherpad is designed to be easily embeddable and provides a [HTTP
API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) that allows your web
application to manage pads, users and groups. It is recommended to use the
[available client
implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries)
in order to interact with this API.
# Modules created for this project
OpenAPI (previously swagger) definitions for the API are exposed under
`/api/openapi.json`.
* [ueberDB](https://github.com/Pita/ueberDB) "transforms every database into a object key value store" - manages all database access
* [channels](https://github.com/Pita/channels) "Event channels in node.js" - ensures that ueberDB operations are atomic and in series for each key
* [async-stacktrace](https://github.com/Pita/async-stacktrace) "Improves node.js stacktraces and makes it easier to handle errors"
### 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
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
Visit the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**.
## 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
# Donate!
* [Flattr] (http://flattr.com/thing/71378/Etherpad-Foundation)
* Paypal - Press the donate button on [etherpad.org](http://etherpad.org)
* [Bitcoin] (https://coinbase.com/checkouts/1e572bf8a82e4663499f7f1f66c2d15a)
# License
[Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html)

View file

@ -1,5 +0,0 @@
# Security Policy
## Reporting a Vulnerability
Please email contact@etherpad.org to report security related issues.

View file

@ -1,18 +0,0 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parser: '@typescript-eslint/parser',
plugins: ['react-refresh'],
rules: {
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
}

24
admin/.gitignore vendored
View file

@ -1,24 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View file

@ -1,30 +0,0 @@
# React + TypeScript + Vite
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
Currently, two official plugins are available:
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
## Expanding the ESLint configuration
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
- Configure the top-level `parserOptions` property like this:
```js
export default {
// other rules...
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
project: ['./tsconfig.json', './tsconfig.node.json'],
tsconfigRootDir: __dirname,
},
}
```
- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list

View file

@ -1,14 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Etherpad Admin Dashboard</title>
<link rel="icon" href="/favicon.ico">
</head>
<body>
<div id="root"></div>
<div id="loading"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

View file

@ -1,42 +0,0 @@
{
"name": "admin",
"private": true,
"version": "2.3.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"build-copy": "tsc && vite build --outDir ../src/templates/admin --emptyOutDir",
"preview": "vite preview"
},
"dependencies": {
"@radix-ui/react-switch": "^1.2.2"
},
"devDependencies": {
"@radix-ui/react-dialog": "^1.1.11",
"@radix-ui/react-toast": "^1.2.11",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3",
"@typescript-eslint/eslint-plugin": "^8.31.1",
"@typescript-eslint/parser": "^8.31.1",
"@vitejs/plugin-react-swc": "^3.9.0",
"eslint": "^9.26.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"i18next": "^25.0.2",
"i18next-browser-languagedetector": "^8.1.0",
"lucide-react": "^0.507.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.56.2",
"react-i18next": "^15.5.1",
"react-router-dom": "^7.5.3",
"socket.io-client": "^4.8.1",
"typescript": "^5.8.2",
"vite": "^6.3.5",
"vite-plugin-static-copy": "^2.3.1",
"vite-plugin-svgr": "^4.3.0",
"zustand": "^5.0.4"
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,28 +0,0 @@
{
"@metadata": {
"authors": [
"Meno25",
"محمد أحمد عبد الفتاح"
]
},
"ep_adminpads2_action": "فعل",
"ep_adminpads2_autoupdate-label": "التحديث التلقائي على تغييرات الوسادة",
"ep_adminpads2_autoupdate.title": "لتمكين أو تعطيل التحديثات التلقائية للاستعلام الحالي.",
"ep_adminpads2_confirm": "هل تريد حقًا حذف الوسادة {{padID}}؟",
"ep_adminpads2_delete.value": "حذف",
"ep_adminpads2_last-edited": "آخر تعديل",
"ep_adminpads2_loading": "جارٍ التحميل...",
"ep_adminpads2_manage-pads": "إدارة الفوط",
"ep_adminpads2_no-results": "لا توجد نتائج.",
"ep_adminpads2_pad-user-count": "عدد المستخدمين الوسادة",
"ep_adminpads2_padname": "بادنام",
"ep_adminpads2_search-box.placeholder": "مصطلح البحث",
"ep_adminpads2_search-button.value": "بحث",
"ep_adminpads2_search-done": "اكتمل البحث",
"ep_adminpads2_search-error-explanation": "واجه الخادم خطأً أثناء البحث عن منصات:",
"ep_adminpads2_search-error-title": "فشل في الحصول على قائمة الوسادة",
"ep_adminpads2_search-heading": "ابحث عن الفوط",
"ep_adminpads2_title": "إدارة الوسادة",
"ep_adminpads2_unknown-error": "خطأ غير معروف",
"ep_adminpads2_unknown-status": "حالة غير معروفة"
}

View file

@ -1,23 +0,0 @@
{
"@metadata": {
"authors": [
"আজিজ",
"আফতাবুজ্জামান"
]
},
"ep_adminpads2_action": "কার্য",
"ep_adminpads2_delete.value": "মুছে ফেলুন",
"ep_adminpads2_last-edited": "সর্বশেষ সম্পাদিত",
"ep_adminpads2_loading": "লোড হচ্ছে...",
"ep_adminpads2_manage-pads": "প্যাড পরিচালনা করুন",
"ep_adminpads2_no-results": "ফলাফল নেই",
"ep_adminpads2_padname": "প্যাডের নাম",
"ep_adminpads2_search-button.value": "অনুসন্ধান",
"ep_adminpads2_search-done": "অনুসন্ধান সম্পূর্ণ",
"ep_adminpads2_search-error-explanation": "প্যাড অনুসন্ধান করার সময় সার্ভার একটি ত্রুটির সম্মুখীন হয়েছে:",
"ep_adminpads2_search-error-title": "প্যাডের তালিকা পেতে ব্যর্থ",
"ep_adminpads2_search-heading": "প্যাড অনুসন্ধান করুন",
"ep_adminpads2_title": "প্যাড প্রশাসন",
"ep_adminpads2_unknown-error": "অজানা ত্রুটি",
"ep_adminpads2_unknown-status": "অজানা অবস্থা"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Mguix"
]
},
"ep_adminpads2_action": "Acció",
"ep_adminpads2_autoupdate-label": "Actualització automàtica en cas de canvis de pad",
"ep_adminpads2_autoupdate.title": "Activa o desactiva les actualitzacions automàtiques per a la consulta actual.",
"ep_adminpads2_confirm": "Esteu segur que voleu suprimir el pad {{padID}}?",
"ep_adminpads2_delete.value": "Esborrar",
"ep_adminpads2_last-edited": "Darrera modificació",
"ep_adminpads2_loading": "Sestà carregant…",
"ep_adminpads2_manage-pads": "Gestiona els pads",
"ep_adminpads2_no-results": "No hi ha cap resultat",
"ep_adminpads2_pad-user-count": "Nombre d'usuaris de pads",
"ep_adminpads2_padname": "Nom del pad",
"ep_adminpads2_search-box.placeholder": "Terme de cerca",
"ep_adminpads2_search-button.value": "Cercar",
"ep_adminpads2_search-done": "Cerca completa",
"ep_adminpads2_search-error-explanation": "El servidor ha trobat un error mentre buscava pads:",
"ep_adminpads2_search-error-title": "No s'ha pogut obtenir la llista del pad",
"ep_adminpads2_search-heading": "Cerca pads",
"ep_adminpads2_title": "Administració del pad",
"ep_adminpads2_unknown-error": "Error desconegut",
"ep_adminpads2_unknown-status": "Estat desconegut"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Spotter"
]
},
"ep_adminpads2_action": "Akce",
"ep_adminpads2_autoupdate-label": "Automatická aktualizace změn Padu",
"ep_adminpads2_autoupdate.title": "Povolí nebo zakáže automatické aktualizace pro aktuální dotaz.",
"ep_adminpads2_confirm": "Opravdu chcete odstranit pad {{padID}}?",
"ep_adminpads2_delete.value": "Smazat",
"ep_adminpads2_last-edited": "Naposledy upraveno",
"ep_adminpads2_loading": "Načítání…",
"ep_adminpads2_manage-pads": "Spravovat pady",
"ep_adminpads2_no-results": "Žádné výsledky",
"ep_adminpads2_pad-user-count": "Počet uživatelů padu",
"ep_adminpads2_padname": "Název padu",
"ep_adminpads2_search-box.placeholder": "Hledaný výraz",
"ep_adminpads2_search-button.value": "Hledat",
"ep_adminpads2_search-done": "Hledání dokončeno",
"ep_adminpads2_search-error-explanation": "Při hledání padů došlo k chybě serveru:",
"ep_adminpads2_search-error-title": "Seznam padů se nepodařilo získat",
"ep_adminpads2_search-heading": "Hledat pady",
"ep_adminpads2_title": "Správa Padu",
"ep_adminpads2_unknown-error": "Neznámá chyba",
"ep_adminpads2_unknown-status": "Neznámý stav"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Robin Owain"
]
},
"ep_adminpads2_action": "Gweithred",
"ep_adminpads2_autoupdate-label": "Diweddaru newidiadau pad yn otomatig",
"ep_adminpads2_autoupdate.title": "Galluogi neu analluogi diweddaru'r ymholiad cyfredol.",
"ep_adminpads2_confirm": "Siwr eich bod am ddileu'r pad {{padID}}?",
"ep_adminpads2_delete.value": "Dileu",
"ep_adminpads2_last-edited": "Golygwyd ddiwethaf",
"ep_adminpads2_loading": "Wrthi'n llwytho...",
"ep_adminpads2_manage-pads": "Rheoli'r padiau",
"ep_adminpads2_no-results": "Dim canlyniad",
"ep_adminpads2_pad-user-count": "Cyfri defnyddiwr pad",
"ep_adminpads2_padname": "Enwpad",
"ep_adminpads2_search-box.placeholder": "Term chwilio",
"ep_adminpads2_search-button.value": "Chwilio",
"ep_adminpads2_search-done": "Wedi gorffen",
"ep_adminpads2_search-error-explanation": "Nam ar y gweinydd wrth chwilio'r padiau:",
"ep_adminpads2_search-error-title": "Methwyd a chael y rhestr pad",
"ep_adminpads2_search-heading": "Chwilio am badiau",
"ep_adminpads2_title": "Gweinyddiaeth y pad",
"ep_adminpads2_unknown-error": "Nam o ryw fath",
"ep_adminpads2_unknown-status": "Statws anhysbys"
}

View file

@ -1,14 +0,0 @@
{
"@metadata": {
"authors": [
"Saederup92"
]
},
"ep_adminpads2_action": "Handling",
"ep_adminpads2_delete.value": "Slet",
"ep_adminpads2_last-edited": "Sidst redigeret",
"ep_adminpads2_loading": "Indlæser...",
"ep_adminpads2_no-results": "Ingen resultater",
"ep_adminpads2_unknown-error": "Ukendt fejl",
"ep_adminpads2_unknown-status": "Ukendt status"
}

View file

@ -1,33 +0,0 @@
{
"@metadata": {
"authors": [
"Brettchenweber",
"Justman10000",
"Lorisobi",
"SamTV",
"Umlaut",
"Zunkelty"
]
},
"ep_adminpads2_action": "Aktion",
"ep_adminpads2_autoupdate-label": "Automatisch bei Pad-Änderungen updaten",
"ep_adminpads2_autoupdate.title": "Aktiviert oder deaktiviert automatische Aktualisierungen für die aktuelle Abfrage.",
"ep_adminpads2_confirm": "Willst du das Pad {{padID}} wirklich löschen?",
"ep_adminpads2_delete.value": "Löschen",
"ep_adminpads2_cleanup": "Historie aufräumen",
"ep_adminpads2_last-edited": "Zuletzt bearbeitet",
"ep_adminpads2_loading": "Lädt...",
"ep_adminpads2_manage-pads": "Pads verwalten",
"ep_adminpads2_no-results": "Keine Ergebnisse",
"ep_adminpads2_pad-user-count": "Nutzerzahl des Pads",
"ep_adminpads2_padname": "Padname",
"ep_adminpads2_search-box.placeholder": "Suchbegriff",
"ep_adminpads2_search-button.value": "Suche",
"ep_adminpads2_search-done": "Suche vollendet",
"ep_adminpads2_search-error-explanation": "Der Server ist bei der Suche nach Pads auf einen Fehler gestoßen:",
"ep_adminpads2_search-error-title": "Pad-Liste konnte nicht abgerufen werden",
"ep_adminpads2_search-heading": "Nach Pads suchen",
"ep_adminpads2_title": "Pad-Verwaltung",
"ep_adminpads2_unknown-error": "Unbekannter Fehler",
"ep_adminpads2_unknown-status": "Unbekannter Status"
}

View file

@ -1,28 +0,0 @@
{
"@metadata": {
"authors": [
"1917 Ekim Devrimi",
"Mirzali"
]
},
"ep_adminpads2_action": "Hereketi",
"ep_adminpads2_autoupdate-label": "Vurnayışanê pedi otomatik rocane kerê",
"ep_adminpads2_autoupdate.title": "Persê mewcudi rê rocaneyışanê otomatika aktiv ke ya zi dewrê ra vecê",
"ep_adminpads2_confirm": ıma qayılê pedê {{padID}} bıesternê?",
"ep_adminpads2_delete.value": "Bestere",
"ep_adminpads2_last-edited": "Vurnayışo peyên",
"ep_adminpads2_loading": "Bar beno...",
"ep_adminpads2_manage-pads": "Pedan idare kerê",
"ep_adminpads2_no-results": "Netice çıniyo",
"ep_adminpads2_pad-user-count": "Amarê karberanê pedi",
"ep_adminpads2_padname": "Padname",
"ep_adminpads2_search-box.placeholder": "termê cıgêrayış",
"ep_adminpads2_search-button.value": "Cı geyre",
"ep_adminpads2_search-done": "Cıgeyrayışi temam",
"ep_adminpads2_search-error-explanation": "Server cıgeyrayışê pedan de yew xetaya raşt ame",
"ep_adminpads2_search-error-title": "Lista pedi nêgêriye",
"ep_adminpads2_search-heading": "Pedan cıgeyrayış",
"ep_adminpads2_title": "İdarey pedi",
"ep_adminpads2_unknown-error": "Xetaya nêzanıtiye",
"ep_adminpads2_unknown-status": "Weziyeto nêzanaye"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Michawiki"
]
},
"ep_adminpads2_action": "Akcija",
"ep_adminpads2_autoupdate-label": "Pśi změnach na zapisniku awtomatiski aktualizěrowaś",
"ep_adminpads2_autoupdate.title": "Zmóžnja abo znjemóžnja awtomatiske aktualizacije za aktualne wótpšašowanje.",
"ep_adminpads2_confirm": "Cośo napšawdu zapisnik {{padID}} lašowaś?",
"ep_adminpads2_delete.value": "Lašowaś",
"ep_adminpads2_last-edited": "Slědna změna",
"ep_adminpads2_loading": "Zacytujo se...",
"ep_adminpads2_manage-pads": "Zapisniki zastojaś",
"ep_adminpads2_no-results": "Žedne wuslědki",
"ep_adminpads2_pad-user-count": "Licba wužywarjow zapisnika",
"ep_adminpads2_padname": "Mě zapisnika",
"ep_adminpads2_search-box.placeholder": "Pytańske zapśimjeśe",
"ep_adminpads2_search-button.value": "Pytaś",
"ep_adminpads2_search-done": "Pytanje dokóńcone",
"ep_adminpads2_search-error-explanation": "Serwer jo starcył na zmólku, mjaztym až jo pytał za zapisnikami:",
"ep_adminpads2_search-error-title": "Lisćina zapisnikow njedajo se wobstaraś",
"ep_adminpads2_search-heading": "Za zapisnikami pytaś",
"ep_adminpads2_title": "Zapisnikowa administracija",
"ep_adminpads2_unknown-error": "Njeznata zmólka",
"ep_adminpads2_unknown-status": "Njeznaty status"
}

View file

@ -1,16 +0,0 @@
{
"@metadata": {
"authors": [
"Norhorn"
]
},
"ep_adminpads2_delete.value": "Διαγραφή",
"ep_adminpads2_last-edited": "Τελευταία απεξεργασία",
"ep_adminpads2_loading": "Φόρτωση…",
"ep_adminpads2_no-results": "Κανένα αποτέλεσμα",
"ep_adminpads2_search-box.placeholder": "Αναζήτηση όρων",
"ep_adminpads2_search-button.value": "Αναζήτηση",
"ep_adminpads2_search-done": "Ολοκλήρωση αναζήτησης",
"ep_adminpads2_unknown-error": "Άγνωστο σφάλμα",
"ep_adminpads2_unknown-status": "Άγνωστη κατάσταση"
}

View file

@ -1,23 +0,0 @@
{
"ep_adminpads2_action": "Action",
"ep_adminpads2_autoupdate-label": "Auto-update on pad changes",
"ep_adminpads2_autoupdate.title": "Enables or disables automatic updates for the current query.",
"ep_adminpads2_confirm": "Do you really want to delete the pad {{padID}}?",
"ep_adminpads2_delete.value": "Delete",
"ep_adminpads2_cleanup": "Cleanup revisions",
"ep_adminpads2_last-edited": "Last edited",
"ep_adminpads2_loading": "Loading…",
"ep_adminpads2_manage-pads": "Manage pads",
"ep_adminpads2_no-results": "No results",
"ep_adminpads2_pad-user-count": "Pad user count",
"ep_adminpads2_padname": "Padname",
"ep_adminpads2_search-box.placeholder": "Search term",
"ep_adminpads2_search-button.value": "Search",
"ep_adminpads2_search-done": "Search complete",
"ep_adminpads2_search-error-explanation": "The server encountered an error while searching for pads:",
"ep_adminpads2_search-error-title": "Failed to get pad list",
"ep_adminpads2_search-heading": "Search for pads",
"ep_adminpads2_title": "Pad administration",
"ep_adminpads2_unknown-error": "Unknown error",
"ep_adminpads2_unknown-status": "Unknown status"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Izendegi"
]
},
"ep_adminpads2_action": "Ekintza",
"ep_adminpads2_autoupdate-label": "Automatikoki eguneratu pad-aren aldaketak daudenean",
"ep_adminpads2_autoupdate.title": "Oraingo kontsultarako eguneratze automatikoak gaitu edo desgaitzen du.",
"ep_adminpads2_confirm": "Ziur zaude {{padID}} pad-a ezabatu nahi duzula?",
"ep_adminpads2_delete.value": "Ezabatu",
"ep_adminpads2_last-edited": "Azkenengoz editatua",
"ep_adminpads2_loading": "Kargatzen...",
"ep_adminpads2_manage-pads": "Kudeatu pad-ak",
"ep_adminpads2_no-results": "Emaitzarik ez",
"ep_adminpads2_pad-user-count": "Pad-erabiltzaile kopurua",
"ep_adminpads2_padname": "Pad-izena",
"ep_adminpads2_search-box.placeholder": "Bilaketa testua",
"ep_adminpads2_search-button.value": "Bilatu",
"ep_adminpads2_search-done": "Bilaketa osatu da",
"ep_adminpads2_search-error-explanation": "Zerbitzariak errore bat izan du pad-ak bilatzean:",
"ep_adminpads2_search-error-title": "Pad-zerrenda eskuratzeak huts egin du",
"ep_adminpads2_search-heading": "Bilatu pad-ak",
"ep_adminpads2_title": "Pad-en kudeaketa",
"ep_adminpads2_unknown-error": "Errore ezezaguna",
"ep_adminpads2_unknown-status": "Egoera ezezaguna"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Ibrahima Malal Sarr"
]
},
"ep_adminpads2_action": "Baɗal",
"ep_adminpads2_autoupdate-label": "Hesɗitin e jaajol tuma baylagol faɗo",
"ep_adminpads2_autoupdate.title": "Hurminat walla daaƴa kesɗitine jaaje wonannde ɗaɓɓitannde wonaande.",
"ep_adminpads2_confirm": "Aɗa yiɗi e jaati momtude faɗo {{padID}}?",
"ep_adminpads2_delete.value": "Momtu",
"ep_adminpads2_last-edited": "Taƴtaa sakket",
"ep_adminpads2_loading": "Nana loowa…",
"ep_adminpads2_manage-pads": "Toppito paɗe",
"ep_adminpads2_no-results": "Alaa njaltudi",
"ep_adminpads2_pad-user-count": "Limoore huutorɓe faɗo",
"ep_adminpads2_padname": "Innde faɗo",
"ep_adminpads2_search-box.placeholder": "Helmere njiilaw",
"ep_adminpads2_search-button.value": "Yiylo",
"ep_adminpads2_search-done": "Njiylaw timmii",
"ep_adminpads2_search-error-explanation": "Sarworde ndee hawrii e juumre tuma nde yiylotoo faɗo:",
"ep_adminpads2_search-error-title": "Horiima heɓde doggol paɗe",
"ep_adminpads2_search-heading": "Yiylo paɗe",
"ep_adminpads2_title": "Yiylorde paɗe",
"ep_adminpads2_unknown-error": "Juumre nde anndaaka",
"ep_adminpads2_unknown-status": "Ngonka ka anndaaka"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Artnay",
"Kyykaarme",
"MITO",
"Maantietäjä",
"Yupik"
]
},
"ep_adminpads2_action": "Toiminto",
"ep_adminpads2_delete.value": "Poista",
"ep_adminpads2_last-edited": "Viimeksi muokattu",
"ep_adminpads2_loading": "Ladataan...",
"ep_adminpads2_manage-pads": "Hallitse muistioita",
"ep_adminpads2_no-results": "Ei tuloksia",
"ep_adminpads2_pad-user-count": "Pad-käyttäjien määrä",
"ep_adminpads2_padname": "Muistion nimi",
"ep_adminpads2_search-box.placeholder": "Haettava teksti",
"ep_adminpads2_search-button.value": "Etsi",
"ep_adminpads2_search-done": "Haku valmis",
"ep_adminpads2_search-error-explanation": "Palvelimessa tapahtui virhe etsiessään muistioita:",
"ep_adminpads2_search-error-title": "Pad-luettelon hakeminen epäonnistui",
"ep_adminpads2_search-heading": "Etsi sisältöä",
"ep_adminpads2_unknown-error": "Tuntematon virhe",
"ep_adminpads2_unknown-status": "Tuntematon tila"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Verdy p"
]
},
"ep_adminpads2_action": "Action",
"ep_adminpads2_autoupdate-label": "Mise à jour automatique en cas de changements du bloc-notes",
"ep_adminpads2_autoupdate.title": "Active ou désactive les mises à jour automatiques pour la requête actuelle.",
"ep_adminpads2_confirm": "Voulez-vous vraiment supprimer le bloc-notes {{padID}}?",
"ep_adminpads2_delete.value": "Supprimer",
"ep_adminpads2_last-edited": "Dernière modification",
"ep_adminpads2_loading": "Chargement en cours...",
"ep_adminpads2_manage-pads": "Gérer les bloc-notes",
"ep_adminpads2_no-results": "Aucun résultat",
"ep_adminpads2_pad-user-count": "Nombre dutilisateurs du bloc-notes",
"ep_adminpads2_padname": "Nom du bloc-notes",
"ep_adminpads2_search-box.placeholder": "Terme de recherche",
"ep_adminpads2_search-button.value": "Rechercher",
"ep_adminpads2_search-done": "Recherche terminée",
"ep_adminpads2_search-error-explanation": "Le serveur a rencontré une erreur en cherchant des blocs-notes:",
"ep_adminpads2_search-error-title": "Échec dobtention de la liste de blocs-notes",
"ep_adminpads2_search-heading": "Rechercher des blocs-notes",
"ep_adminpads2_title": "Administration du bloc-notes",
"ep_adminpads2_unknown-error": "Erreur inconnue",
"ep_adminpads2_unknown-status": "État inconnu"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Ghose"
]
},
"ep_adminpads2_action": "Accións",
"ep_adminpads2_autoupdate-label": "Actualización automática dos cambios",
"ep_adminpads2_autoupdate.title": "Activa ou desactiva as actualizacións automáticas para a consulta actual.",
"ep_adminpads2_confirm": "Tes a certeza de querer eliminar o pad {{padID}}?",
"ep_adminpads2_delete.value": "Eliminar",
"ep_adminpads2_last-edited": "Última edición",
"ep_adminpads2_loading": "Cargando…",
"ep_adminpads2_manage-pads": "Xestionar pads",
"ep_adminpads2_no-results": "Sen resultados",
"ep_adminpads2_pad-user-count": "Usuarias neste pad",
"ep_adminpads2_padname": "Nome do pad",
"ep_adminpads2_search-box.placeholder": "Buscar termo",
"ep_adminpads2_search-button.value": "Buscar",
"ep_adminpads2_search-done": "Busca completa",
"ep_adminpads2_search-error-explanation": "O servidor atopou un fallo cando buscaba pads:",
"ep_adminpads2_search-error-title": "Non se obtivo a lista de pads",
"ep_adminpads2_search-heading": "Buscar pads",
"ep_adminpads2_title": "Administración do pad",
"ep_adminpads2_unknown-error": "Erro descoñecido",
"ep_adminpads2_unknown-status": "Estado descoñecido"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"YaronSh"
]
},
"ep_adminpads2_action": "פעולה",
"ep_adminpads2_autoupdate-label": "לעדכן אוטומטית כשהמחברת נערכת",
"ep_adminpads2_autoupdate.title": "הפעלה או השבתה של עדכונים אוטומטיים לשאילתה הנוכחית.",
"ep_adminpads2_confirm": "למחוק את המחברת {{padID}}?",
"ep_adminpads2_delete.value": "מחיקה",
"ep_adminpads2_last-edited": "עריכה אחרונה",
"ep_adminpads2_loading": "בטעינה…",
"ep_adminpads2_manage-pads": "ניהול מחברות",
"ep_adminpads2_no-results": "אין תוצאות",
"ep_adminpads2_pad-user-count": "ספירת משתמשים במחברת",
"ep_adminpads2_padname": "שם המחברת",
"ep_adminpads2_search-box.placeholder": "הביטוי לחיפוש",
"ep_adminpads2_search-button.value": "חיפוש",
"ep_adminpads2_search-done": "החיפוש הושלם",
"ep_adminpads2_search-error-explanation": "השרת נתקל בשגיאה בעת חיפוש מחברות:",
"ep_adminpads2_search-error-title": "קבלת רשימת המחברות נכשלה",
"ep_adminpads2_search-heading": "חיפוש אחר מחברות",
"ep_adminpads2_title": "ניהול מחברות",
"ep_adminpads2_unknown-error": "שגיאה בלתי־ידועה",
"ep_adminpads2_unknown-status": "מצב לא ידוע"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Michawiki"
]
},
"ep_adminpads2_action": "Akcija",
"ep_adminpads2_autoupdate-label": "Při změnach na zapisniku awtomatisce aktualizować",
"ep_adminpads2_autoupdate.title": "Zmóžnja abo znjemóžnja awtomatiske aktualizacije za aktualne wotprašowanje.",
"ep_adminpads2_confirm": "Chceće woprawdźe zapisnik {{padID}} zhašeć?",
"ep_adminpads2_delete.value": "Zhašeć",
"ep_adminpads2_last-edited": "Poslednja změna",
"ep_adminpads2_loading": "Začituje so...",
"ep_adminpads2_manage-pads": "Zapisniki rjadować",
"ep_adminpads2_no-results": "Žane wuslědki.",
"ep_adminpads2_pad-user-count": "Ličba wužiwarjow zapisnika",
"ep_adminpads2_padname": "Mjeno zapisnika",
"ep_adminpads2_search-box.placeholder": "Pytanske zapřijeće",
"ep_adminpads2_search-button.value": "Pytać",
"ep_adminpads2_search-done": "Pytanje dokónčene",
"ep_adminpads2_search-error-explanation": "Serwer je na zmylk storčił, mjeztym zo je za zapisnikami pytał:",
"ep_adminpads2_search-error-title": "Lisćina zapisnikow njeda so wobstarać",
"ep_adminpads2_search-heading": "Za zapisnikami pytać",
"ep_adminpads2_title": "Zapisnikowa administracija",
"ep_adminpads2_unknown-error": "Njeznaty zmylk",
"ep_adminpads2_unknown-status": "Njeznaty status"
}

View file

@ -1,25 +0,0 @@
{
"@metadata": {
"authors": []
},
"ep_adminpads2_action": "Művelet",
"ep_adminpads2_autoupdate-label": "Változáskor jegyzetfüzet önműködő frissítése",
"ep_adminpads2_autoupdate.title": "Önműködő frissítése az jelenlegi lekérdezéshez be- vagy kikapcsolása.",
"ep_adminpads2_confirm": "Biztosan törölni szeretné a(z) {{padID}} jegyzetfüzetet?",
"ep_adminpads2_delete.value": "Törlés",
"ep_adminpads2_last-edited": "Utoljára szerkesztve",
"ep_adminpads2_loading": "Betöltés folyamatban…",
"ep_adminpads2_manage-pads": "Jegyzetfüzetek kezelése",
"ep_adminpads2_no-results": "Nincs találat",
"ep_adminpads2_pad-user-count": "Jegyzetfüzet felhasználók száma",
"ep_adminpads2_padname": "Jegyzetfüzet név",
"ep_adminpads2_search-box.placeholder": "Keresési kifejezés",
"ep_adminpads2_search-button.value": "Keresés",
"ep_adminpads2_search-done": "Keresés befejezve",
"ep_adminpads2_search-error-explanation": "A kiszolgáló hibát észlelt a jegyzetfüzetek keresésekor:",
"ep_adminpads2_search-error-title": "Nem sikerült lekérni a jegyzetfüzet listát",
"ep_adminpads2_search-heading": "Jegyzetfüzetek keresése",
"ep_adminpads2_title": "Jegyzetfüzet felügyelete",
"ep_adminpads2_unknown-error": "Ismeretlen hiba",
"ep_adminpads2_unknown-status": "Ismeretlen állapot"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"McDutchie"
]
},
"ep_adminpads2_action": "Action",
"ep_adminpads2_autoupdate-label": "Actualisar automaticamente le pad in caso de cambiamentos",
"ep_adminpads2_autoupdate.title": "Activa o disactiva le actualisationes automatic pro le consulta actual.",
"ep_adminpads2_confirm": "Es tu secur de voler deler le pad {{padID}}?",
"ep_adminpads2_delete.value": "Deler",
"ep_adminpads2_last-edited": "Ultime modification",
"ep_adminpads2_loading": "Cargamento in curso…",
"ep_adminpads2_manage-pads": "Gerer pads",
"ep_adminpads2_no-results": "Nulle resultato",
"ep_adminpads2_pad-user-count": "Numero de usatores del pad",
"ep_adminpads2_padname": "Nomine del pad",
"ep_adminpads2_search-box.placeholder": "Termino de recerca",
"ep_adminpads2_search-button.value": "Cercar",
"ep_adminpads2_search-done": "Recerca terminate",
"ep_adminpads2_search-error-explanation": "Le servitor ha incontrate un error durante le recerca de pads:",
"ep_adminpads2_search-error-title": "Non poteva obtener le lista de pads",
"ep_adminpads2_search-heading": "Cercar pads",
"ep_adminpads2_title": "Administration de pads",
"ep_adminpads2_unknown-error": "Error incognite",
"ep_adminpads2_unknown-status": "Stato incognite"
}

View file

@ -1,16 +0,0 @@
{
"@metadata": {
"authors": [
"Beta16",
"Luca.favorido"
]
},
"ep_adminpads2_action": "Azione",
"ep_adminpads2_delete.value": "Cancella",
"ep_adminpads2_last-edited": "Ultima modifica",
"ep_adminpads2_loading": "Caricamento…",
"ep_adminpads2_no-results": "Nessun risultato",
"ep_adminpads2_search-button.value": "Cerca",
"ep_adminpads2_unknown-error": "Errore sconosciuto",
"ep_adminpads2_unknown-status": "Stato sconosciuto"
}

View file

@ -1,13 +0,0 @@
{
"@metadata": {
"authors": [
"ಮಲ್ನಾಡಾಚ್ ಕೊಂಕ್ಣೊ"
]
},
"ep_adminpads2_action": "ಕ್ರಿಯೆ",
"ep_adminpads2_delete.value": "ಅಳಿಸು",
"ep_adminpads2_loading": "ತುಂಬಿಸಲಾಗುತ್ತಿದೆ…",
"ep_adminpads2_no-results": "ಯಾವ ಫಲಿತಾಂಶಗಳೂ ಇಲ್ಲ",
"ep_adminpads2_search-button.value": "ಹುಡುಕು",
"ep_adminpads2_unknown-error": "ಅಪರಿಚಿತ ದೋಷ"
}

View file

@ -1,28 +0,0 @@
{
"@metadata": {
"authors": [
"Ykhwong",
"그냥기여자"
]
},
"ep_adminpads2_action": "동작",
"ep_adminpads2_autoupdate-label": "패드 변경 시 자동 업데이트",
"ep_adminpads2_autoupdate.title": "현재 쿼리의 자동 업데이트를 활성화하거나 비활성화합니다.",
"ep_adminpads2_confirm": "{{padID}} 패드를 삭제하시겠습니까?",
"ep_adminpads2_delete.value": "삭제",
"ep_adminpads2_last-edited": "최근 편집",
"ep_adminpads2_loading": "불러오는 중...",
"ep_adminpads2_manage-pads": "패드 관리",
"ep_adminpads2_no-results": "결과 없음",
"ep_adminpads2_pad-user-count": "패드 사용자 수",
"ep_adminpads2_padname": "패드 이름",
"ep_adminpads2_search-box.placeholder": "검색어",
"ep_adminpads2_search-button.value": "검색",
"ep_adminpads2_search-done": "검색 완료",
"ep_adminpads2_search-error-explanation": "패드 검색 중 서버에 오류가 발생했습니다:",
"ep_adminpads2_search-error-title": "패드 목록 가져오기 실패",
"ep_adminpads2_search-heading": "패드 검색",
"ep_adminpads2_title": "패드 관리",
"ep_adminpads2_unknown-error": "알 수 없는 오류",
"ep_adminpads2_unknown-status": "알 수 없는 상태"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Къарачайлы"
]
},
"ep_adminpads2_action": "Этиу",
"ep_adminpads2_autoupdate-label": "Блокнот тюрлендириулеринде автомат халда джангыртыу",
"ep_adminpads2_autoupdate.title": "Баргъан излем ючюн автомат халда джангыртыуланы джандын неда джукълат.",
"ep_adminpads2_confirm": "{{padID}} блокнотну керти да кетерирге излеймисиз?",
"ep_adminpads2_delete.value": "Кетер",
"ep_adminpads2_last-edited": "Ахыр тюзетиу",
"ep_adminpads2_loading": "Джюклениу…",
"ep_adminpads2_manage-pads": "Блокнотланы оноуун эт",
"ep_adminpads2_no-results": "Эсебле джокъдула",
"ep_adminpads2_pad-user-count": "Блокнот хайырланыучуланы саны",
"ep_adminpads2_padname": "Блокнот ат",
"ep_adminpads2_search-box.placeholder": "Терминни изле",
"ep_adminpads2_search-button.value": "Изле",
"ep_adminpads2_search-done": "Излеу тамамланды",
"ep_adminpads2_search-error-explanation": "Сервер, блокнотланы излеген заманда халат табды:",
"ep_adminpads2_search-error-title": "Блокнот тизмеси алынамады",
"ep_adminpads2_search-heading": "Блокнотла ючюн излеу",
"ep_adminpads2_title": "Блокнот башчылыкъ",
"ep_adminpads2_unknown-error": "Билинмеген халат",
"ep_adminpads2_unknown-status": "Билинмеген турум"
}

View file

@ -1,16 +0,0 @@
{
"@metadata": {
"authors": [
"Robby",
"Volvox"
]
},
"ep_adminpads2_confirm": "Wëllt Dir de Pad {{padID}} wierklech läschen?",
"ep_adminpads2_delete.value": "Läschen",
"ep_adminpads2_loading": "Lueden...",
"ep_adminpads2_no-results": "Keng Resultater",
"ep_adminpads2_padname": "Padnumm",
"ep_adminpads2_search-box.placeholder": "Sichbegrëff",
"ep_adminpads2_search-button.value": "Sichen",
"ep_adminpads2_unknown-error": "Onbekannte Feeler"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Nokeoo"
]
},
"ep_adminpads2_action": "Veiksmas",
"ep_adminpads2_autoupdate-label": "Automatinis bloknoto keitimų naujinimas",
"ep_adminpads2_autoupdate.title": "Įjungia arba išjungia automatinius dabartinės užklausos atnaujinimus.",
"ep_adminpads2_confirm": "Ar tikrai norite ištrinti bloknotą {{padID}}?",
"ep_adminpads2_delete.value": "Ištrinti",
"ep_adminpads2_last-edited": "Paskutinis pakeitimas",
"ep_adminpads2_loading": "Įkeliama…",
"ep_adminpads2_manage-pads": "Tvarkyti bloknotą",
"ep_adminpads2_no-results": "Nėra rezultatų",
"ep_adminpads2_pad-user-count": "Bloknoto naudotojų skaičius",
"ep_adminpads2_padname": "Bloknoto pavadinimas",
"ep_adminpads2_search-box.placeholder": "Paieškos terminas",
"ep_adminpads2_search-button.value": "Paieška",
"ep_adminpads2_search-done": "Paieška baigta",
"ep_adminpads2_search-error-explanation": "Serveris susidūrė su klaida ieškant bloknotų:",
"ep_adminpads2_search-error-title": "Nepavyko gauti bloknotų sąrašo",
"ep_adminpads2_search-heading": "Ieškokite bloknotų",
"ep_adminpads2_title": "Bloknotų administravimas",
"ep_adminpads2_unknown-error": "Nežinoma klaida",
"ep_adminpads2_unknown-status": "Nežinoma būsena"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Bjankuloski06"
]
},
"ep_adminpads2_action": "Дејство",
"ep_adminpads2_autoupdate-label": "Самоподнова при измени во тетратката",
"ep_adminpads2_autoupdate.title": "Овозможува или оневозможува самоподнова на тековното барање.",
"ep_adminpads2_confirm": "Дали навистина сакате да ја избришете тетратката {{padID}}?",
"ep_adminpads2_delete.value": "Избриши",
"ep_adminpads2_last-edited": "Последно уредување",
"ep_adminpads2_loading": "Вчитувам…",
"ep_adminpads2_manage-pads": "Раководење со тетратки",
"ep_adminpads2_no-results": "Нема исход",
"ep_adminpads2_pad-user-count": "Корисници на тетратката",
"ep_adminpads2_padname": "Назив на тетратката",
"ep_adminpads2_search-box.placeholder": "Пребаран поим",
"ep_adminpads2_search-button.value": "Пребарај",
"ep_adminpads2_search-done": "Пребарувањето заврши",
"ep_adminpads2_search-error-explanation": "Опслужувачот наиде на грешка при пребарувањето на тетратки:",
"ep_adminpads2_search-error-title": "Не можев да го добијам списокот на тетратки",
"ep_adminpads2_search-heading": "Пребарај по тетратките",
"ep_adminpads2_title": "Администрација на тетратки",
"ep_adminpads2_unknown-error": "Непозната грешка",
"ep_adminpads2_unknown-status": "Непозната состојба"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Andibecker"
]
},
"ep_adminpads2_action": "လုပ်ဆောင်ချက်",
"ep_adminpads2_autoupdate-label": "pad အပြောင်းအလဲများတွင်အလိုအလျောက်အပ်ဒိတ်လုပ်ပါ",
"ep_adminpads2_autoupdate.title": "လက်ရှိမေးမြန်းမှုအတွက်အလိုအလျောက်အပ်ဒိတ်များကိုဖွင့်ပါသို့မဟုတ်ပိတ်ပါ။",
"ep_adminpads2_confirm": "pad {{padID}} ကိုသင်တကယ်ဖျက်ချင်လား။",
"ep_adminpads2_delete.value": "ဖျက်ပါ",
"ep_adminpads2_last-edited": "နောက်ဆုံးတည်းဖြတ်သည်",
"ep_adminpads2_loading": "ဖွင့်နေသည်…",
"ep_adminpads2_manage-pads": "pads များကိုစီမံပါ",
"ep_adminpads2_no-results": "ရလဒ်မရှိပါ",
"ep_adminpads2_pad-user-count": "Pad အသုံးပြုသူအရေအတွက်",
"ep_adminpads2_padname": "Padname",
"ep_adminpads2_search-box.placeholder": "ဝေါဟာရရှာဖွေပါ",
"ep_adminpads2_search-button.value": "ရှာဖွေပါ",
"ep_adminpads2_search-done": "ရှာဖွေမှုပြီးပါပြီ",
"ep_adminpads2_search-error-explanation": "pads များကိုရှာဖွေစဉ်ဆာဗာသည်အမှားတစ်ခုကြုံခဲ့သည်။",
"ep_adminpads2_search-error-title": "pad စာရင်းရယူရန်မအောင်မြင်ပါ",
"ep_adminpads2_search-heading": "pads များကိုရှာဖွေပါ",
"ep_adminpads2_title": "Pad စီမံခန့်ခွဲမှု",
"ep_adminpads2_unknown-error": "အမည်မသိအမှား",
"ep_adminpads2_unknown-status": "အခြေအနေမသိ"
}

View file

@ -1,13 +0,0 @@
{
"@metadata": {
"authors": [
"EdoAug"
]
},
"ep_adminpads2_action": "Handling",
"ep_adminpads2_last-edited": "Sist redigert",
"ep_adminpads2_loading": "Laster …",
"ep_adminpads2_no-results": "Ingen resultater",
"ep_adminpads2_search-button.value": "Søk",
"ep_adminpads2_search-done": "Søk fullført"
}

View file

@ -1,29 +0,0 @@
{
"@metadata": {
"authors": [
"Aranka",
"McDutchie",
"Spinster"
]
},
"ep_adminpads2_action": "Handeling",
"ep_adminpads2_autoupdate-label": "Automatisch bijwerken bij aanpassingen aan de pad",
"ep_adminpads2_autoupdate.title": "Schakelt automatische updates voor de huidige query in of uit.",
"ep_adminpads2_confirm": "Wil je de pad {{padID}} echt verwijderen?",
"ep_adminpads2_delete.value": "Verwijderen",
"ep_adminpads2_last-edited": "Laatst bewerkt",
"ep_adminpads2_loading": "Bezig met laden...",
"ep_adminpads2_manage-pads": "Pads beheren",
"ep_adminpads2_no-results": "Geen resultaten",
"ep_adminpads2_pad-user-count": "Aantal gebruikers van de pad",
"ep_adminpads2_padname": "Naam van de pad",
"ep_adminpads2_search-box.placeholder": "Zoekterm",
"ep_adminpads2_search-button.value": "Zoeken",
"ep_adminpads2_search-done": "Zoekopdracht voltooid",
"ep_adminpads2_search-error-explanation": "De server heeft een fout aangetroffen tijdens het zoeken naar pads:",
"ep_adminpads2_search-error-title": "Kan lijst met pads niet ophalen",
"ep_adminpads2_search-heading": "Pads zoeken",
"ep_adminpads2_title": "Administratie van pad",
"ep_adminpads2_unknown-error": "Onbekende fout",
"ep_adminpads2_unknown-status": "Onbekende status"
}

View file

@ -1,21 +0,0 @@
{
"@metadata": {
"authors": [
"Quentí"
]
},
"ep_adminpads2_action": "Accion",
"ep_adminpads2_delete.value": "Suprimir",
"ep_adminpads2_last-edited": "Darrièra edicion",
"ep_adminpads2_loading": "Cargament…",
"ep_adminpads2_manage-pads": "Gerir los pads",
"ep_adminpads2_no-results": "Pas cap de resultat",
"ep_adminpads2_padname": "Nom del pad",
"ep_adminpads2_search-box.placeholder": "Tèrme de recèrca",
"ep_adminpads2_search-button.value": "Recercar",
"ep_adminpads2_search-done": "Recèrca acabada",
"ep_adminpads2_search-heading": "Cercar de pads",
"ep_adminpads2_title": "Administracion de pad",
"ep_adminpads2_unknown-error": "Error desconeguda",
"ep_adminpads2_unknown-status": "Estat desconegut"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Borichèt"
]
},
"ep_adminpads2_action": "Assion",
"ep_adminpads2_autoupdate-label": "Agiornament automàtich an sle modìfiche ëd plancia",
"ep_adminpads2_autoupdate.title": "Abilité o disabilité j'agiornament automàtich për l'arcesta atual.",
"ep_adminpads2_confirm": "Veul-lo për da bon dëscancelé la plancia {{padID}}?",
"ep_adminpads2_delete.value": "Dëscancelé",
"ep_adminpads2_last-edited": "Modificà l'ùltima vira",
"ep_adminpads2_loading": "Cariament…",
"ep_adminpads2_manage-pads": "Gestì le plance",
"ep_adminpads2_no-results": "Gnun arzultà",
"ep_adminpads2_pad-user-count": "Conteur ëd plancia dl'utent",
"ep_adminpads2_padname": "Nòm ëd plancia",
"ep_adminpads2_search-box.placeholder": "Tèrmin d'arserca",
"ep_adminpads2_search-button.value": "Arserca",
"ep_adminpads2_search-done": "Arserca completà",
"ep_adminpads2_search-error-explanation": "Ël servent a l'ha rancontrà n'eror an sërcand dle plance:",
"ep_adminpads2_search-error-title": "Falì a oten-e la lista ëd plance",
"ep_adminpads2_search-heading": "Arserca ëd plance",
"ep_adminpads2_title": "Aministrassion ëd plance",
"ep_adminpads2_unknown-error": "Eror nen conossù",
"ep_adminpads2_unknown-status": "Statù nen conossù"
}

View file

@ -1,30 +0,0 @@
{
"@metadata": {
"authors": [
"Duke of Wikipädia",
"Eduardo Addad de Oliveira",
"Eduardoaddad",
"YuriNikolai"
]
},
"ep_adminpads2_action": "Ação",
"ep_adminpads2_autoupdate-label": "Atualizar notas automaticamente",
"ep_adminpads2_autoupdate.title": "Habilita ou desabilita atualizações automáticas para a consulta atual.",
"ep_adminpads2_confirm": "Você realmente deseja excluir a nota {{padID}}?",
"ep_adminpads2_delete.value": "Excluir",
"ep_adminpads2_last-edited": "Última edição",
"ep_adminpads2_loading": "Carregando…",
"ep_adminpads2_manage-pads": "Gerenciar notas",
"ep_adminpads2_no-results": "Sem resultados",
"ep_adminpads2_pad-user-count": "Número de utilizadores na nota",
"ep_adminpads2_padname": "Nome da nota",
"ep_adminpads2_search-box.placeholder": "Termo de pesquisa",
"ep_adminpads2_search-button.value": "Pesquisar",
"ep_adminpads2_search-done": "Busca completa",
"ep_adminpads2_search-error-explanation": "O servidor encontrou um erro enquanto procurava por notas:",
"ep_adminpads2_search-error-title": "Falha ao buscar lista de notas",
"ep_adminpads2_search-heading": "Pesquisar por notas",
"ep_adminpads2_title": "Administração de notas",
"ep_adminpads2_unknown-error": "Erro desconhecido",
"ep_adminpads2_unknown-status": "Status desconhecido"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Guilha"
]
},
"ep_adminpads2_action": "Ação",
"ep_adminpads2_autoupdate-label": "Atualizar automaticamente as notas",
"ep_adminpads2_autoupdate.title": "Ativa ou desativa atualizações automáticas na consulta atual.",
"ep_adminpads2_confirm": "Tencionas mesmo eliminar a nota {{padID}}?",
"ep_adminpads2_delete.value": "Eliminar",
"ep_adminpads2_last-edited": "Última edição",
"ep_adminpads2_loading": "A carregar...",
"ep_adminpads2_manage-pads": "Gerir notas",
"ep_adminpads2_no-results": "Sem resultados",
"ep_adminpads2_pad-user-count": "Número de utilizadores na nota",
"ep_adminpads2_padname": "Nome da nota",
"ep_adminpads2_search-box.placeholder": "Procurar termo",
"ep_adminpads2_search-button.value": "Procurar",
"ep_adminpads2_search-done": "Procura completa",
"ep_adminpads2_search-error-explanation": "O servidor encontrou um erro enquanto procurava por notas:",
"ep_adminpads2_search-error-title": "Falha ao obter lista de notas",
"ep_adminpads2_search-heading": "Procurar por notas",
"ep_adminpads2_title": "Administração da nota",
"ep_adminpads2_unknown-error": "Erro desconhecido",
"ep_adminpads2_unknown-status": "Estado desconhecido"
}

View file

@ -1,10 +0,0 @@
{
"@metadata": {
"authors": [
"BryanDavis"
]
},
"ep_adminpads2_action": "{{Identical|Action}}",
"ep_adminpads2_delete.value": "{{Identical|Delete}}",
"ep_adminpads2_search-button.value": "{{Identical|Search}}"
}

View file

@ -1,31 +0,0 @@
{
"@metadata": {
"authors": [
"DDPAT",
"Ice bulldog",
"Megakott",
"Okras",
"Pacha Tchernof"
]
},
"ep_adminpads2_action": "Действие",
"ep_adminpads2_autoupdate-label": "Автообновление при изменении документа",
"ep_adminpads2_autoupdate.title": "Включает или отключает автоматические обновления для текущего запроса.",
"ep_adminpads2_confirm": "Вы действительно хотите удалить документ {{padID}}?",
"ep_adminpads2_delete.value": "Удалить",
"ep_adminpads2_last-edited": "Последнее изменение",
"ep_adminpads2_loading": "Загружается…",
"ep_adminpads2_manage-pads": "Управление документами",
"ep_adminpads2_no-results": "Нет результатов",
"ep_adminpads2_pad-user-count": "Количество пользователей документа",
"ep_adminpads2_padname": "Название документа",
"ep_adminpads2_search-box.placeholder": "Искать термин",
"ep_adminpads2_search-button.value": "Найти",
"ep_adminpads2_search-done": "Поиск завершён",
"ep_adminpads2_search-error-explanation": "Сервер обнаружил ошибку при поиске документов:",
"ep_adminpads2_search-error-title": "Не удалось получить список документов",
"ep_adminpads2_search-heading": "Поиск документов",
"ep_adminpads2_title": "Администрирование документов",
"ep_adminpads2_unknown-error": "Неизвестная ошибка",
"ep_adminpads2_unknown-status": "Неизвестный статус"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Adr mm"
]
},
"ep_adminpads2_action": "Atzione",
"ep_adminpads2_autoupdate-label": "Atualizatzione automàtica de is modìficas de su pad",
"ep_adminpads2_autoupdate.title": "Ativat o disativat is atualizatziones automàticas pro sa chirca atuale.",
"ep_adminpads2_confirm": "Seguru chi boles cantzellare su pad {{padID}}?",
"ep_adminpads2_delete.value": "Cantzella",
"ep_adminpads2_last-edited": "Ùrtima modìfica",
"ep_adminpads2_loading": "Carrighende...",
"ep_adminpads2_manage-pads": "Gesti is pads",
"ep_adminpads2_no-results": "Nissunu resurtadu",
"ep_adminpads2_pad-user-count": "Nùmeru de utentes de pads",
"ep_adminpads2_padname": "Nòmine de su pad",
"ep_adminpads2_search-box.placeholder": "Tèrmine de chirca",
"ep_adminpads2_search-button.value": "Chirca",
"ep_adminpads2_search-done": "Chirca cumpleta",
"ep_adminpads2_search-error-explanation": "Su serbidore at agatadu un'errore chirchende pads:",
"ep_adminpads2_search-error-title": "Impossìbile otènnere sa lista de pads",
"ep_adminpads2_search-heading": "Chirca pads",
"ep_adminpads2_title": "Amministratzione de su pad",
"ep_adminpads2_unknown-error": "Errore disconnotu",
"ep_adminpads2_unknown-status": "Istadu disconnotu"
}

View file

@ -1,14 +0,0 @@
{
"@metadata": {
"authors": [
"F Samaritani"
]
},
"ep_adminpads2_action": "Azioni",
"ep_adminpads2_delete.value": "Canzella",
"ep_adminpads2_loading": "carrigghendi...",
"ep_adminpads2_no-results": "Nisciun risulthaddu",
"ep_adminpads2_search-button.value": "Zercha",
"ep_adminpads2_search-heading": "Zirchà dati",
"ep_adminpads2_unknown-error": "Errori ischunisciddu"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Yardom78"
]
},
"ep_adminpads2_action": "Akcia",
"ep_adminpads2_autoupdate-label": "Automatická aktualizácia zmien na poznámkovom bloku",
"ep_adminpads2_autoupdate.title": "Zapne alebo vypne automatickú aktualizáciu.",
"ep_adminpads2_confirm": "Skutočne chcete vymazať poznámkový blok {{padID}}?",
"ep_adminpads2_delete.value": "Vymazať",
"ep_adminpads2_last-edited": "Posledná úprava",
"ep_adminpads2_loading": "Načítavanie...",
"ep_adminpads2_manage-pads": "Spravovať poznámkové bloky",
"ep_adminpads2_no-results": "Žiadne výsledky",
"ep_adminpads2_pad-user-count": "Počet používateľov poznámkového bloku",
"ep_adminpads2_padname": "Názov poznámkového bloku",
"ep_adminpads2_search-box.placeholder": "Hľadať výraz",
"ep_adminpads2_search-button.value": "Hľadať",
"ep_adminpads2_search-done": "Hľadanie dokončené",
"ep_adminpads2_search-error-explanation": "Pri hľadaní poznámkového bloku došlo k chybe:",
"ep_adminpads2_search-error-title": "Nepodarilo sa získať zoznam poznámkových blokov",
"ep_adminpads2_search-heading": "Hľadať poznámkový blok",
"ep_adminpads2_title": "Správa poznámkového bloku",
"ep_adminpads2_unknown-error": "Neznáma chyba",
"ep_adminpads2_unknown-status": "Neznámy stav"
}

View file

@ -1,20 +0,0 @@
{
"@metadata": {
"authors": [
"Saraiki"
]
},
"ep_adminpads2_action": "عمل",
"ep_adminpads2_delete.value": "مٹاؤ",
"ep_adminpads2_last-edited": "چھیکڑی تبدیلی",
"ep_adminpads2_loading": "لوڈ تھین٘دا پئے۔۔۔",
"ep_adminpads2_manage-pads": "پیڈ منیج کرو",
"ep_adminpads2_no-results": "کوئی نتیجہ کائنی",
"ep_adminpads2_padname": "پیڈ ناں",
"ep_adminpads2_search-box.placeholder": "ٹرم ڳولو",
"ep_adminpads2_search-button.value": "ڳولو",
"ep_adminpads2_search-done": "ڳولݨ پورا تھیا",
"ep_adminpads2_search-heading": "پیڈاں دی ڳول",
"ep_adminpads2_unknown-error": "نامعلوم غلطی",
"ep_adminpads2_unknown-status": "نامعلوم حالت"
}

View file

@ -1,28 +0,0 @@
{
"@metadata": {
"authors": [
"Eleassar",
"HairyFotr"
]
},
"ep_adminpads2_action": "Dejanje",
"ep_adminpads2_autoupdate-label": "Samodejno posodabljanje ob spremembah blokcev",
"ep_adminpads2_autoupdate.title": "Omogoči ali onemogoči samodejne posodobitve za trenutno poizvedbo.",
"ep_adminpads2_confirm": "Ali res želite izbrisati blokec {{padID}}?",
"ep_adminpads2_delete.value": "Izbriši",
"ep_adminpads2_last-edited": "Zadnje urejanje",
"ep_adminpads2_loading": "Nalaganje ...",
"ep_adminpads2_manage-pads": "Upravljanje blokcev",
"ep_adminpads2_no-results": "Ni zadetkov",
"ep_adminpads2_pad-user-count": "Število urejevalcev blokca",
"ep_adminpads2_padname": "Ime blokca",
"ep_adminpads2_search-box.placeholder": "Iskalni izraz",
"ep_adminpads2_search-button.value": "Išči",
"ep_adminpads2_search-done": "Iskanje končano",
"ep_adminpads2_search-error-explanation": "Strežnik je med iskanjem blokcev naletel na napako:",
"ep_adminpads2_search-error-title": "Ni bilo mogoče pridobiti seznama blokcev",
"ep_adminpads2_search-heading": "Iskanje blokcev",
"ep_adminpads2_title": "Upravljanje blokcev",
"ep_adminpads2_unknown-error": "Neznana napaka",
"ep_adminpads2_unknown-status": "Neznano stanje"
}

View file

@ -1,13 +0,0 @@
{
"@metadata": {
"authors": [
"Yupik"
]
},
"ep_adminpads2_delete.value": "Siho",
"ep_adminpads2_last-edited": "Majemustáá nubástittum",
"ep_adminpads2_search-box.placeholder": "Uuccâmsääni",
"ep_adminpads2_search-button.value": "Uusâ",
"ep_adminpads2_unknown-error": "Tubdâmettum feilâ",
"ep_adminpads2_unknown-status": "Tubdâmettum tile"
}

View file

@ -1,16 +0,0 @@
{
"@metadata": {
"authors": [
"Yupik"
]
},
"ep_adminpads2_delete.value": "Jaukkâd",
"ep_adminpads2_last-edited": "Mââimõssân muttum",
"ep_adminpads2_no-results": "Ij käunnʼjam ni mii",
"ep_adminpads2_padname": "Mošttʼtõspõʹmmai nõmm",
"ep_adminpads2_search-box.placeholder": "Ooccâmsääʹnn",
"ep_adminpads2_search-button.value": "Ooʒʒ",
"ep_adminpads2_search-heading": "Ooʒʒ mošttʼtõspõʹmmjid",
"ep_adminpads2_unknown-error": "Toobdteʹmes vââʹǩǩ",
"ep_adminpads2_unknown-status": "Toobdteʹmes status"
}

View file

@ -1,27 +0,0 @@
{
"@metadata": {
"authors": [
"Besnik b"
]
},
"ep_adminpads2_action": "Veprim",
"ep_adminpads2_autoupdate-label": "Vetëpërditësohu, kur nga ndryshime blloku",
"ep_adminpads2_autoupdate.title": "Aktivizon ose çaktivizon përditësim të automatizuara për kërkesën e tanishme.",
"ep_adminpads2_confirm": "Doni vërtet të fshihet blloku {{padID}}?",
"ep_adminpads2_delete.value": "Fshije",
"ep_adminpads2_last-edited": "Përpunuar së fundi më",
"ep_adminpads2_loading": "Po ngarkohet…",
"ep_adminpads2_manage-pads": "Administroni blloqe",
"ep_adminpads2_no-results": "Ska përfundime",
"ep_adminpads2_pad-user-count": "Numër përdoruesish blloku",
"ep_adminpads2_padname": "Emër blloku",
"ep_adminpads2_search-box.placeholder": "Term kërkimi",
"ep_adminpads2_search-button.value": "Kërko",
"ep_adminpads2_search-done": "Kërkim i plotë",
"ep_adminpads2_search-error-explanation": "Shërbyesi hasi një gabim teksa kërkohej për blloqe:",
"ep_adminpads2_search-error-title": "Su arrit të merrej listë blloqesh",
"ep_adminpads2_search-heading": "Kërkoni për blloqe",
"ep_adminpads2_title": "Administrim blloku",
"ep_adminpads2_unknown-error": "Gabim i panjohur",
"ep_adminpads2_unknown-status": "Gjendje e panjohur"
}

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