mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-05-09 16:35:01 -04:00
Compare commits
No commits in common. "develop" and "1.2.81" have entirely different histories.
977 changed files with 60511 additions and 113652 deletions
|
@ -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
|
|
@ -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
|
18
.env.default
18
.env.default
|
@ -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
|
|
@ -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
1
.gitattributes
vendored
|
@ -1 +0,0 @@
|
|||
* text=auto eol=lf
|
3
.github/FUNDING.yml
vendored
3
.github/FUNDING.yml
vendored
|
@ -1,3 +0,0 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: ether
|
47
.github/ISSUE_TEMPLATE/bug_report.md
vendored
47
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -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.
|
33
.github/ISSUE_TEMPLATE/feature_request.md
vendored
33
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
@ -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.
|
|
@ -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.
|
10
.github/ISSUE_TEMPLATE/security-issue.md
vendored
10
.github/ISSUE_TEMPLATE/security-issue.md
vendored
|
@ -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.
|
13
.github/ISSUE_TEMPLATE/security.md
vendored
13
.github/ISSUE_TEMPLATE/security.md
vendored
|
@ -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.
|
13
.github/PULL_REQUEST_TEMPLATE.md
vendored
13
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -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.
|
||||
|
||||
-->
|
20
.github/dependabot.yml
vendored
20
.github/dependabot.yml
vendored
|
@ -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"
|
290
.github/workflows/backend-tests.yml
vendored
290
.github/workflows/backend-tests.yml
vendored
|
@ -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
|
70
.github/workflows/build-and-deploy-docs.yml
vendored
70
.github/workflows/build-and-deploy-docs.yml
vendored
|
@ -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
|
46
.github/workflows/codeql-analysis.yml
vendored
46
.github/workflows/codeql-analysis.yml
vendored
|
@ -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
|
20
.github/workflows/dependency-review.yml
vendored
20
.github/workflows/dependency-review.yml
vendored
|
@ -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
|
144
.github/workflows/docker.yml
vendored
144
.github/workflows/docker.yml
vendored
|
@ -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
|
153
.github/workflows/frontend-admin-tests.yml
vendored
153
.github/workflows/frontend-admin-tests.yml
vendored
|
@ -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
|
238
.github/workflows/frontend-tests.yml
vendored
238
.github/workflows/frontend-tests.yml
vendored
|
@ -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
|
||||
|
||||
|
||||
|
173
.github/workflows/load-test.yml
vendored
173
.github/workflows/load-test.yml
vendored
|
@ -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
|
52
.github/workflows/perform-type-check.yml
vendored
52
.github/workflows/perform-type-check.yml
vendored
|
@ -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
|
71
.github/workflows/rate-limit.yml
vendored
71
.github/workflows/rate-limit.yml
vendored
|
@ -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
|
18
.github/workflows/stale.yml
vendored
18
.github/workflows/stale.yml
vendored
|
@ -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'
|
116
.github/workflows/upgrade-from-latest-release.yml
vendored
116
.github/workflows/upgrade-from-latest-release.yml
vendored
|
@ -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
|
86
.github/workflows/windows.yml
vendored
86
.github/workflows/windows.yml
vendored
|
@ -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
27
.gitignore
vendored
|
@ -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
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
extraction:
|
||||
javascript:
|
||||
index:
|
||||
exclude:
|
||||
- src/static/js/vendors
|
||||
python:
|
||||
index:
|
||||
exclude:
|
||||
- /
|
1
.npmrc
1
.npmrc
|
@ -1 +0,0 @@
|
|||
auto-install-peers=false
|
153
.travis.yml
153
.travis.yml
|
@ -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"
|
1363
CHANGELOG.md
1363
CHANGELOG.md
File diff suppressed because it is too large
Load diff
|
@ -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.
|
190
Dockerfile
190
Dockerfile
|
@ -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"]
|
3
LICENSE
3
LICENSE
|
@ -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
25
Makefile
Normal 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
359
README.md
|
@ -1,317 +1,128 @@
|
|||
# Etherpad: A real-time collaborative editor for the web
|
||||
# Making collaborative editing the standard on the web
|
||||
|
||||

|
||||
# 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> </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
|
||||
|
||||
[](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
|
||||
|
||||
[](https://github.com/ether/etherpad-lite/actions/workflows/backend-tests.yml)
|
||||
[](https://github.com/ether/etherpad-lite/actions/workflows/load-test.yml)
|
||||
[](https://github.com/ether/etherpad-lite/actions/workflows/rate-limit.yml)
|
||||
[](https://github.com/ether/etherpad-lite/actions/workflows/dockerfile.yml)
|
||||
[](https://github.com/ether/etherpad-lite/actions/workflows/frontend-admin-tests.yml)
|
||||
[](https://github.com/ether/etherpad-lite/actions/workflows/frontend-tests.yml)
|
||||
[](https://saucelabs.com/u/etherpad)
|
||||
[](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.
|
||||
|
||||
[](https://hub.docker.com/r/etherpad/etherpad)
|
||||
[](https://discord.com/invite/daEjfhw)
|
||||
[](https://static.etherpad.org/index.html)
|
||||

|
||||

|
||||
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.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 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!
|
||||
|
||||

|
||||
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)
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
# Security Policy
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please email contact@etherpad.org to report security related issues.
|
|
@ -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
24
admin/.gitignore
vendored
|
@ -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?
|
|
@ -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
|
|
@ -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>
|
|
@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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": "حالة غير معروفة"
|
||||
}
|
|
@ -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": "অজানা অবস্থা"
|
||||
}
|
|
@ -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": "S’està 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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": "Άγνωστη κατάσταση"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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 d’utilisateurs 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 d’obtention 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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": "מצב לא ידוע"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": "ಅಪರಿಚಿತ ದೋಷ"
|
||||
}
|
|
@ -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": "알 수 없는 상태"
|
||||
}
|
|
@ -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": "Билинмеген турум"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": "Непозната состојба"
|
||||
}
|
|
@ -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": "အခြေအနေမသိ"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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ù"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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}}"
|
||||
}
|
|
@ -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": "Неизвестный статус"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": "نامعلوم حالت"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": "S’ka 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": "S’u 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
Loading…
Add table
Add a link
Reference in a new issue