mirror of
https://github.com/chenasraf/nextcloud-forum.git
synced 2026-05-18 01:28:58 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9fac12b0c7 | |||
|
|
37a82842b1 | ||
|
|
46b2c820e8 | ||
|
|
715b2ab6ff | ||
|
|
3ab3c1cc76 | ||
| 3d1ddb9f26 | |||
| a286bbdfe9 | |||
| a8e158d35b | |||
| c3d267f122 | |||
| c2e4ebe242 | |||
|
|
679abe3fb6 | ||
|
|
043af15809 |
339
.github/workflows/phpunit-incremental.yml
vendored
Normal file
339
.github/workflows/phpunit-incremental.yml
vendored
Normal file
@@ -0,0 +1,339 @@
|
||||
# Incremental migration test workflow
|
||||
#
|
||||
# This workflow tests that migrations work correctly when upgrading from an older version.
|
||||
# It first installs the app at v0.14.0 (last version before forum_user_stats -> forum_users rename),
|
||||
# then upgrades to the current version and verifies all migrations run successfully.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
name: PHPUnit Incremental Migration
|
||||
|
||||
on: pull_request
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: phpunit-incremental-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
|
||||
outputs:
|
||||
src: ${{ steps.changes.outputs.src }}
|
||||
|
||||
steps:
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
id: changes
|
||||
continue-on-error: true
|
||||
with:
|
||||
filters: |
|
||||
src:
|
||||
- '.github/workflows/**'
|
||||
- 'appinfo/**'
|
||||
- 'lib/**'
|
||||
- 'tests/**'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
|
||||
incremental-pgsql:
|
||||
runs-on: ubuntu-latest
|
||||
needs: changes
|
||||
if: needs.changes.outputs.src != 'false'
|
||||
|
||||
name: Incremental Migration (PostgreSQL)
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: ghcr.io/nextcloud/continuous-integration-postgres-16:latest # zizmor: ignore[unpinned-images]
|
||||
ports:
|
||||
- 4444:5432/tcp
|
||||
env:
|
||||
POSTGRES_USER: root
|
||||
POSTGRES_PASSWORD: rootpassword
|
||||
POSTGRES_DB: nextcloud
|
||||
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
|
||||
|
||||
steps:
|
||||
- name: Checkout app (current)
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
path: app-current
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Detect app ID from appinfo/info.xml
|
||||
run: |
|
||||
APP_ID=$(grep -oP '(?<=<id>)[^<]+' app-current/appinfo/info.xml | head -1)
|
||||
echo "APP_NAME=$APP_ID" >> $GITHUB_ENV
|
||||
echo "Detected app ID: $APP_ID"
|
||||
|
||||
- name: Get supported server versions
|
||||
id: versions
|
||||
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
|
||||
with:
|
||||
filename: app-current/appinfo/info.xml
|
||||
|
||||
- name: Save current app for later
|
||||
run: |
|
||||
mkdir -p /tmp/app-backup
|
||||
cp -r app-current /tmp/app-backup/
|
||||
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: true
|
||||
repository: nextcloud/server
|
||||
ref: ${{ fromJson(steps.versions.outputs.branches)[0] }}
|
||||
|
||||
- name: Checkout app at v0.14.0 (pre-rename baseline)
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
ref: v0.14.0
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php 8.3
|
||||
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # v2.35.5
|
||||
with:
|
||||
php-version: '8.3'
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, pgsql, pdo_pgsql
|
||||
coverage: none
|
||||
ini-file: development
|
||||
ini-values: disable_functions=
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up dependencies (v0.14.0)
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer remove nextcloud/ocp --dev --no-scripts || true
|
||||
composer i --no-scripts || composer i
|
||||
|
||||
- name: Set up Nextcloud and install app at v0.14.0
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=pgsql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
echo "::group::Installing app at v0.14.0"
|
||||
./occ app:enable --force ${{ env.APP_NAME }}
|
||||
echo "::endgroup::"
|
||||
echo "::group::Database tables after v0.14.0 install"
|
||||
./occ db:convert-filecache-bigint --no-interaction || true
|
||||
PGPASSWORD=rootpassword psql -h 127.0.0.1 -p $DB_PORT -U root -d nextcloud -c "\dt oc_forum_*"
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Upgrade app to current version
|
||||
run: |
|
||||
echo "::group::Replacing app with current version"
|
||||
rm -rf apps/${{ env.APP_NAME }}
|
||||
cp -r /tmp/app-backup/app-current apps/${{ env.APP_NAME }}
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Set up dependencies (current)
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer remove nextcloud/ocp --dev --no-scripts || true
|
||||
composer i
|
||||
|
||||
- name: Run migrations to current version
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
echo "::group::Running upgrade migrations"
|
||||
# Disable maintenance mode if it was left on
|
||||
./occ maintenance:mode --off || true
|
||||
# Disable and re-enable the app to trigger migrations
|
||||
# This simulates what happens when a user upgrades the app
|
||||
./occ app:disable ${{ env.APP_NAME }}
|
||||
./occ app:enable ${{ env.APP_NAME }}
|
||||
echo "::endgroup::"
|
||||
echo "::group::Database tables after upgrade"
|
||||
PGPASSWORD=rootpassword psql -h 127.0.0.1 -p $DB_PORT -U root -d nextcloud -c "\dt oc_forum_*"
|
||||
echo "::endgroup::"
|
||||
echo "::group::Checking forum_users table exists"
|
||||
PGPASSWORD=rootpassword psql -h 127.0.0.1 -p $DB_PORT -U root -d nextcloud -c "SELECT COUNT(*) FROM oc_forum_users" || exit 1
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Check PHPUnit integration script is defined
|
||||
id: check_integration
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep '^ test:integration ' | wc -l | grep 1
|
||||
|
||||
- name: Run Nextcloud
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
run: php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit integration
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:integration
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
incremental-mysql:
|
||||
runs-on: ubuntu-latest
|
||||
needs: changes
|
||||
if: needs.changes.outputs.src != 'false'
|
||||
|
||||
name: Incremental Migration (MySQL)
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mariadb-10.11:latest # zizmor: ignore[unpinned-images]
|
||||
ports:
|
||||
- 4444:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_DATABASE: nextcloud
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5
|
||||
|
||||
steps:
|
||||
- name: Checkout app (current)
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
path: app-current
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Detect app ID from appinfo/info.xml
|
||||
run: |
|
||||
APP_ID=$(grep -oP '(?<=<id>)[^<]+' app-current/appinfo/info.xml | head -1)
|
||||
echo "APP_NAME=$APP_ID" >> $GITHUB_ENV
|
||||
echo "Detected app ID: $APP_ID"
|
||||
|
||||
- name: Get supported server versions
|
||||
id: versions
|
||||
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
|
||||
with:
|
||||
filename: app-current/appinfo/info.xml
|
||||
|
||||
- name: Save current app for later
|
||||
run: |
|
||||
mkdir -p /tmp/app-backup
|
||||
cp -r app-current /tmp/app-backup/
|
||||
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: true
|
||||
repository: nextcloud/server
|
||||
ref: ${{ fromJson(steps.versions.outputs.branches)[0] }}
|
||||
|
||||
- name: Checkout app at v0.14.0 (pre-rename baseline)
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
ref: v0.14.0
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php 8.3
|
||||
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # v2.35.5
|
||||
with:
|
||||
php-version: '8.3'
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, mysql, pdo_mysql
|
||||
coverage: none
|
||||
ini-file: development
|
||||
ini-values: disable_functions=
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up dependencies (v0.14.0)
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer remove nextcloud/ocp --dev --no-scripts || true
|
||||
composer i --no-scripts || composer i
|
||||
|
||||
- name: Set up Nextcloud and install app at v0.14.0
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
echo "::group::Installing app at v0.14.0"
|
||||
./occ app:enable --force ${{ env.APP_NAME }}
|
||||
echo "::endgroup::"
|
||||
echo "::group::Database tables after v0.14.0 install"
|
||||
mysql -h 127.0.0.1 -P $DB_PORT -u root -prootpassword nextcloud -e "SHOW TABLES LIKE 'oc_forum_%'"
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Upgrade app to current version
|
||||
run: |
|
||||
echo "::group::Replacing app with current version"
|
||||
rm -rf apps/${{ env.APP_NAME }}
|
||||
cp -r /tmp/app-backup/app-current apps/${{ env.APP_NAME }}
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Set up dependencies (current)
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer remove nextcloud/ocp --dev --no-scripts || true
|
||||
composer i
|
||||
|
||||
- name: Run migrations to current version
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
echo "::group::Running upgrade migrations"
|
||||
# Disable maintenance mode if it was left on
|
||||
./occ maintenance:mode --off || true
|
||||
# Disable and re-enable the app to trigger migrations
|
||||
# This simulates what happens when a user upgrades the app
|
||||
./occ app:disable ${{ env.APP_NAME }}
|
||||
./occ app:enable ${{ env.APP_NAME }}
|
||||
echo "::endgroup::"
|
||||
echo "::group::Database tables after upgrade"
|
||||
mysql -h 127.0.0.1 -P $DB_PORT -u root -prootpassword nextcloud -e "SHOW TABLES LIKE 'oc_forum_%'"
|
||||
echo "::endgroup::"
|
||||
echo "::group::Checking forum_users table exists"
|
||||
mysql -h 127.0.0.1 -P $DB_PORT -u root -prootpassword nextcloud -e "SELECT COUNT(*) FROM oc_forum_users" || exit 1
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Check PHPUnit integration script is defined
|
||||
id: check_integration
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep '^ test:integration ' | wc -l | grep 1
|
||||
|
||||
- name: Run Nextcloud
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
run: php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit integration
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:integration
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest
|
||||
needs: [changes, incremental-pgsql, incremental-mysql]
|
||||
|
||||
if: always()
|
||||
|
||||
name: incremental-migration-summary
|
||||
|
||||
steps:
|
||||
- name: Summary status
|
||||
run: if ${{ needs.changes.outputs.src != 'false' && (needs.incremental-pgsql.result != 'success' || needs.incremental-mysql.result != 'success') }}; then exit 1; fi
|
||||
24
.github/workflows/phpunit-mysql.yml
vendored
24
.github/workflows/phpunit-mysql.yml
vendored
@@ -174,16 +174,34 @@ jobs:
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:unit
|
||||
|
||||
- name: Check PHPUnit integration script is defined
|
||||
id: check_integration
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep '^ test:integration ' | wc -l | grep 1
|
||||
|
||||
- name: Run Nextcloud
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
run: php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit integration
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:integration
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
- name: Skipped
|
||||
# Fail the action when unit tests are not specified
|
||||
if: steps.check_phpunit.outcome == 'failure'
|
||||
# Fail the action when neither unit nor integration tests ran
|
||||
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
|
||||
run: |
|
||||
echo 'PHPUnit tests are not specified in composer.json scripts'
|
||||
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
|
||||
exit 1
|
||||
|
||||
summary:
|
||||
|
||||
@@ -1 +1 @@
|
||||
{".":"0.20.2"}
|
||||
{".":"0.20.4"}
|
||||
|
||||
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,5 +1,24 @@
|
||||
# Changelog
|
||||
|
||||
## [0.20.4](https://github.com/chenasraf/nextcloud-forum/compare/v0.20.3...v0.20.4) (2026-01-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **l10n:** Update translations from Transifex ([37a8284](https://github.com/chenasraf/nextcloud-forum/commit/37a82842b13012bf9bf578baf018bfa8b678d635))
|
||||
* **l10n:** Update translations from Transifex ([46b2c82](https://github.com/chenasraf/nextcloud-forum/commit/46b2c820e8bec48e432bf350d56a2d85f41da115))
|
||||
* **l10n:** Update translations from Transifex ([715b2ab](https://github.com/chenasraf/nextcloud-forum/commit/715b2ab6ff7a94ed431e0ca2525530e9e41f42c7))
|
||||
* **l10n:** Update translations from Transifex ([3ab3c1c](https://github.com/chenasraf/nextcloud-forum/commit/3ab3c1cc76b1f55e289d96dfd681d45b6e67b171))
|
||||
|
||||
## [0.20.3](https://github.com/chenasraf/nextcloud-forum/compare/v0.20.2...v0.20.3) (2026-01-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* db seed transactions logic ([c3d267f](https://github.com/chenasraf/nextcloud-forum/commit/c3d267f12269568e0a091cc094e043e4f1ad8cb8))
|
||||
* **l10n:** Update translations from Transifex ([679abe3](https://github.com/chenasraf/nextcloud-forum/commit/679abe3fb6ce7c8545bf99875092f20cf5d468b8))
|
||||
* **l10n:** Update translations from Transifex ([043af15](https://github.com/chenasraf/nextcloud-forum/commit/043af1580912d201a724313d4788d7a776e11934))
|
||||
|
||||
## [0.20.2](https://github.com/chenasraf/nextcloud-forum/compare/v0.20.1...v0.20.2) (2026-01-08)
|
||||
|
||||
|
||||
|
||||
46
Makefile
46
Makefile
@@ -17,13 +17,14 @@
|
||||
# - JS build is delegated to your package.json scripts (tool-agnostic).
|
||||
#
|
||||
# Common recipes:
|
||||
# make build → install deps & build
|
||||
# make dist → build source + appstore tarballs
|
||||
# make test → run PHP unit tests
|
||||
# make lint → lint JS & PHP
|
||||
# make openapi → generate OpenAPI JSON
|
||||
# make sign → print signature for GitHub tarball
|
||||
# make release → upload release to Nextcloud App Store
|
||||
# make build → install deps & build
|
||||
# make dist → build source + appstore tarballs
|
||||
# make test → run PHP unit tests
|
||||
# make test-integration → run PHP integration tests
|
||||
# make lint → lint JS & PHP
|
||||
# make openapi → generate OpenAPI JSON
|
||||
# make sign → print signature for GitHub tarball
|
||||
# make release → upload release to Nextcloud App Store
|
||||
#
|
||||
|
||||
app_name=forum
|
||||
@@ -242,10 +243,33 @@ test: composer
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "\x1b[32mUsing Nextcloud root: $$NC_ROOT\x1b[0m"; \
|
||||
NEXTCLOUD_ROOT="$$NC_ROOT" $(CURDIR)/vendor/phpunit/phpunit/phpunit -c tests/phpunit.xml; \
|
||||
if [ -f tests/phpunit.integration.xml ]; then \
|
||||
NEXTCLOUD_ROOT="$$NC_ROOT" $(CURDIR)/vendor/phpunit/phpunit/phpunit -c tests/phpunit.integration.xml; \
|
||||
fi
|
||||
NEXTCLOUD_ROOT="$$NC_ROOT" $(CURDIR)/vendor/phpunit/phpunit/phpunit -c tests/phpunit.xml
|
||||
|
||||
# test-integration:
|
||||
# - Run only PHP integration tests (database-dependent tests)
|
||||
# - These tests run against a real database and test migration/seeding
|
||||
.PHONY: test-integration
|
||||
test-integration: composer
|
||||
@NC_ROOT="$(NEXTCLOUD_ROOT)"; \
|
||||
if [ -n "$$NC_ROOT" ]; then \
|
||||
NC_ROOT=$$(echo "$$NC_ROOT" | sed "s|^\\\~|$$HOME|" | sed "s|^~|$$HOME|"); \
|
||||
fi; \
|
||||
if [ -z "$$NC_ROOT" ]; then \
|
||||
if [ -d "$(CURDIR)/../../../tests/bootstrap.php" ]; then \
|
||||
NC_ROOT="$(CURDIR)/../../.."; \
|
||||
fi; \
|
||||
fi; \
|
||||
if [ -z "$$NC_ROOT" ]; then \
|
||||
echo "\x1b[33mCould not find Nextcloud installation.\x1b[0m"; \
|
||||
echo "Set NEXTCLOUD_ROOT environment variable."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
if [ ! -f tests/phpunit.integration.xml ]; then \
|
||||
echo "\x1b[31mNo integration tests found (tests/phpunit.integration.xml missing)\x1b[0m"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "\x1b[32mUsing Nextcloud root: $$NC_ROOT\x1b[0m"; \
|
||||
NEXTCLOUD_ROOT="$$NC_ROOT" $(CURDIR)/vendor/phpunit/phpunit/phpunit -c tests/phpunit.integration.xml
|
||||
|
||||
# test-docker:
|
||||
# - Run PHP unit tests inside a Nextcloud Docker container
|
||||
|
||||
@@ -37,7 +37,7 @@ This app is in early stages of development. While functional, you may encounter
|
||||
|
||||
The forum integrates seamlessly with your Nextcloud instance, using your existing users and groups for authentication and access control.
|
||||
]]></description>
|
||||
<version>0.20.2</version>
|
||||
<version>0.20.4</version>
|
||||
<licence>agpl</licence>
|
||||
<author mail="contact@casraf.dev" homepage="https://casraf.dev">Chen Asraf</author>
|
||||
<namespace>Forum</namespace>
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
"cs:fix": "php-cs-fixer fix",
|
||||
"psalm": "psalm --threads=1 --no-cache",
|
||||
"test:unit": "phpunit tests -c tests/phpunit.xml --colors=always --fail-on-warning --fail-on-risky",
|
||||
"test:integration": "phpunit tests -c tests/phpunit.integration.xml --colors=always --fail-on-warning --fail-on-risky",
|
||||
"openapi": "generate-spec"
|
||||
},
|
||||
"require": {
|
||||
|
||||
22
composer.lock
generated
22
composer.lock
generated
@@ -180,12 +180,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nextcloud-deps/ocp.git",
|
||||
"reference": "45612049852ea4234dd799a4a3281a397f0749c3"
|
||||
"reference": "a79703d9f38e964b003ae1cc805b6531d142fa93"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/45612049852ea4234dd799a4a3281a397f0749c3",
|
||||
"reference": "45612049852ea4234dd799a4a3281a397f0749c3",
|
||||
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/a79703d9f38e964b003ae1cc805b6531d142fa93",
|
||||
"reference": "a79703d9f38e964b003ae1cc805b6531d142fa93",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"issues": "https://github.com/nextcloud-deps/ocp/issues",
|
||||
"source": "https://github.com/nextcloud-deps/ocp/tree/stable32"
|
||||
},
|
||||
"time": "2025-12-16T00:55:52+00:00"
|
||||
"time": "2026-01-09T00:57:52+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
@@ -1035,12 +1035,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Roave/SecurityAdvisories.git",
|
||||
"reference": "ebc5572f219ad85f60f20fcff71b98b5055c4f8e"
|
||||
"reference": "ccfd723dc03e9864008d011603c412910180d7a6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/ebc5572f219ad85f60f20fcff71b98b5055c4f8e",
|
||||
"reference": "ebc5572f219ad85f60f20fcff71b98b5055c4f8e",
|
||||
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/ccfd723dc03e9864008d011603c412910180d7a6",
|
||||
"reference": "ccfd723dc03e9864008d011603c412910180d7a6",
|
||||
"shasum": ""
|
||||
},
|
||||
"conflict": {
|
||||
@@ -1225,7 +1225,7 @@
|
||||
"drupal/commerce_alphabank_redirect": "<1.0.3",
|
||||
"drupal/commerce_eurobank_redirect": "<2.1.1",
|
||||
"drupal/config_split": "<1.10|>=2,<2.0.2",
|
||||
"drupal/core": ">=6,<6.38|>=7,<7.102|>=8,<10.4.9|>=10.5,<10.5.6|>=11,<11.1.9|>=11.2,<11.2.8",
|
||||
"drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.4.9|>=10.5,<10.5.6|>=11,<11.1.9|>=11.2,<11.2.8",
|
||||
"drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8",
|
||||
"drupal/currency": "<3.5",
|
||||
"drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8",
|
||||
@@ -1340,7 +1340,7 @@
|
||||
"geshi/geshi": "<=1.0.9.1",
|
||||
"getformwork/formwork": "<2.2",
|
||||
"getgrav/grav": "<1.11.0.0-beta1",
|
||||
"getkirby/cms": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1|>=5,<5.1.4",
|
||||
"getkirby/cms": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1|>=5,<=5.2.1",
|
||||
"getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1",
|
||||
"getkirby/panel": "<2.5.14",
|
||||
"getkirby/starterkit": "<=3.7.0.2",
|
||||
@@ -1569,7 +1569,7 @@
|
||||
"october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1",
|
||||
"october/october": "<3.7.5",
|
||||
"october/rain": "<1.0.472|>=1.1,<1.1.2",
|
||||
"october/system": "<3.7.5",
|
||||
"october/system": "<=3.7.12|>=4,<=4.0.11",
|
||||
"oliverklee/phpunit": "<3.5.15",
|
||||
"omeka/omeka-s": "<4.0.3",
|
||||
"onelogin/php-saml": "<2.21.1|>=3,<3.8.1|>=4,<4.3.1",
|
||||
@@ -2035,7 +2035,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2026-01-07T20:06:51+00:00"
|
||||
"time": "2026-01-09T19:06:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/cli-parser",
|
||||
|
||||
@@ -8,11 +8,11 @@ OC.L10N.register(
|
||||
"General" : "Агульныя",
|
||||
"Support" : "Падтрымка",
|
||||
"Attachment" : "Далучэнне",
|
||||
"Welcome to Nextcloud Forums" : "Вітаем на Форумах Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Вітаем на Форумах Nextcloud!",
|
||||
"Bold text" : "Тоўсты тэкст",
|
||||
"Italic text" : "Тэкст курсівам",
|
||||
"Underlined text" : "Падкрэслены тэкст",
|
||||
"Welcome to Nextcloud Forums" : "Вітаем на Форумах Nextcloud",
|
||||
"Forum" : "Форум",
|
||||
"Welcome to the forum!" : "Вітаем на форуме!",
|
||||
"Deleted user" : "Выдалены карыстальнік",
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
"General" : "Агульныя",
|
||||
"Support" : "Падтрымка",
|
||||
"Attachment" : "Далучэнне",
|
||||
"Welcome to Nextcloud Forums" : "Вітаем на Форумах Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Вітаем на Форумах Nextcloud!",
|
||||
"Bold text" : "Тоўсты тэкст",
|
||||
"Italic text" : "Тэкст курсівам",
|
||||
"Underlined text" : "Падкрэслены тэкст",
|
||||
"Welcome to Nextcloud Forums" : "Вітаем на Форумах Nextcloud",
|
||||
"Forum" : "Форум",
|
||||
"Welcome to the forum!" : "Вітаем на форуме!",
|
||||
"Deleted user" : "Выдалены карыстальнік",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Skrytý obsah",
|
||||
"Spoilers" : "Spoilery",
|
||||
"Attachment" : "Příloha",
|
||||
"Welcome to Nextcloud Forums" : "Vítejte v Nextcloud fórech",
|
||||
"Welcome to the Nextcloud Forums!" : "Vítejte v Nextcloud fórech!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Toto je komunitou řízené fórum, vestavěné přímo do vámi využívané instance Nextcloud. Je možné zde probírat témata, sdílet nápady a spolupracovat s ostatními uživateli.",
|
||||
"Features:" : "Funkce:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Skloněný text",
|
||||
"Underlined text" : "Podtržený text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Neváhejte zahájit novou diskuzi nebo odpovězte na existující vlákna. Vesele pište příspěvky!.",
|
||||
"Welcome to Nextcloud Forums" : "Vítejte v Nextcloud fórech",
|
||||
"Forum" : "Diskuzní fórum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nová odpověď v {thread} ","{count} nové odpovědi v {thread} ","{count} nových odpovědí v {thread} ","{count} nové odpovědi v {thread} "],
|
||||
"{user} mentioned you in {thread}" : "{user} vás zmínil(a) v {thread}",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Skrytý obsah",
|
||||
"Spoilers" : "Spoilery",
|
||||
"Attachment" : "Příloha",
|
||||
"Welcome to Nextcloud Forums" : "Vítejte v Nextcloud fórech",
|
||||
"Welcome to the Nextcloud Forums!" : "Vítejte v Nextcloud fórech!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Toto je komunitou řízené fórum, vestavěné přímo do vámi využívané instance Nextcloud. Je možné zde probírat témata, sdílet nápady a spolupracovat s ostatními uživateli.",
|
||||
"Features:" : "Funkce:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Skloněný text",
|
||||
"Underlined text" : "Podtržený text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Neváhejte zahájit novou diskuzi nebo odpovězte na existující vlákna. Vesele pište příspěvky!.",
|
||||
"Welcome to Nextcloud Forums" : "Vítejte v Nextcloud fórech",
|
||||
"Forum" : "Diskuzní fórum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nová odpověď v {thread} ","{count} nové odpovědi v {thread} ","{count} nových odpovědí v {thread} ","{count} nové odpovědi v {thread} "],
|
||||
"{user} mentioned you in {thread}" : "{user} vás zmínil(a) v {thread}",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Versteckter Inhalt",
|
||||
"Spoilers" : "Spoiler",
|
||||
"Attachment" : "Anhang",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Welcome to the Nextcloud Forums!" : "Willkommen in den Nextcloud Foren!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Dies ist ein Community-Forum, das direkt in deine Nextcloud-Instanz integriert ist. Hier kannst du Themen diskutieren, Ideen austauschen und mit anderen Nutzern zusammenarbeiten.",
|
||||
"Features:" : "Funktionen:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Kursiver Text",
|
||||
"Underlined text" : "Unterstrichener Text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Gerne eine neue Diskussion starten oder auf bestehende Beiträge antworten. Viel Spaß beim Posten!",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} neue Antwort in {thread}","{count} neue Antworten in {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} hat dich in {thread} erwähnt",
|
||||
@@ -282,6 +282,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "Einrichten, wie du Benachrichtigungen erhältst",
|
||||
"Auto-subscribe to threads I create" : "Themen die ich erstellt habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Wenn diese Option aktiviert ist, erhältst du automatisch Benachrichtigungen für Antworten auf von dir erstellte Themen",
|
||||
"Auto-subscribe to threads I reply to" : "Themen auf die ich geantwortet habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Wenn diese Option aktiviert ist, erhältst du automatisch Benachrichtigungen für Antworten in Themen, in denen du geantwortet hast",
|
||||
"Files" : "Dateien",
|
||||
"Configure file upload settings" : "Einstellungen für das Hochladen von Dateien",
|
||||
"Upload directory" : "Hochladeverzeichnis",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Versteckter Inhalt",
|
||||
"Spoilers" : "Spoiler",
|
||||
"Attachment" : "Anhang",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Welcome to the Nextcloud Forums!" : "Willkommen in den Nextcloud Foren!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Dies ist ein Community-Forum, das direkt in deine Nextcloud-Instanz integriert ist. Hier kannst du Themen diskutieren, Ideen austauschen und mit anderen Nutzern zusammenarbeiten.",
|
||||
"Features:" : "Funktionen:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Kursiver Text",
|
||||
"Underlined text" : "Unterstrichener Text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Gerne eine neue Diskussion starten oder auf bestehende Beiträge antworten. Viel Spaß beim Posten!",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} neue Antwort in {thread}","{count} neue Antworten in {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} hat dich in {thread} erwähnt",
|
||||
@@ -280,6 +280,8 @@
|
||||
"Configure how you receive notifications" : "Einrichten, wie du Benachrichtigungen erhältst",
|
||||
"Auto-subscribe to threads I create" : "Themen die ich erstellt habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Wenn diese Option aktiviert ist, erhältst du automatisch Benachrichtigungen für Antworten auf von dir erstellte Themen",
|
||||
"Auto-subscribe to threads I reply to" : "Themen auf die ich geantwortet habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Wenn diese Option aktiviert ist, erhältst du automatisch Benachrichtigungen für Antworten in Themen, in denen du geantwortet hast",
|
||||
"Files" : "Dateien",
|
||||
"Configure file upload settings" : "Einstellungen für das Hochladen von Dateien",
|
||||
"Upload directory" : "Hochladeverzeichnis",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Versteckter Inhalt",
|
||||
"Spoilers" : "Spoilerwarnung",
|
||||
"Attachment" : "Anhang",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Welcome to the Nextcloud Forums!" : "Willkommen in den Nextcloud Foren!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Dies ist ein Community-Forum, das direkt in Ihre Nextcloud-Instanz integriert ist. Hier können Sie Themen diskutieren, Ideen austauschen und mit anderen Nutzern zusammenarbeiten.",
|
||||
"Features:" : "Funktionen:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Kursiver Text",
|
||||
"Underlined text" : "Unterstrichener Text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Gerne eine neue Diskussion starten oder auf bestehende Beiträge antworten. Viel Spaß beim Posten!",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} neue Antwort in {thread}","{count} neue Antworten in {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} hat Sie in {thread} erwähnt",
|
||||
@@ -282,6 +282,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "Einrichten, wie Sie Benachrichtigungen erhalten",
|
||||
"Auto-subscribe to threads I create" : "Themen die ich erstellt habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Wenn diese Option aktiviert ist, erhalten Sie automatisch Benachrichtigungen für Antworten auf von Ihnen erstellte Themen",
|
||||
"Auto-subscribe to threads I reply to" : "Themen auf die ich geantwortet habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Wenn diese Option aktiviert ist, erhalten Sie automatisch Benachrichtigungen für Antworten in Themen, in denen Sie geantwortet haben",
|
||||
"Files" : "Dateien",
|
||||
"Configure file upload settings" : "Einstellungen für das Hochladen von Dateien",
|
||||
"Upload directory" : "Hochladeverzeichnis",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Versteckter Inhalt",
|
||||
"Spoilers" : "Spoilerwarnung",
|
||||
"Attachment" : "Anhang",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Welcome to the Nextcloud Forums!" : "Willkommen in den Nextcloud Foren!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Dies ist ein Community-Forum, das direkt in Ihre Nextcloud-Instanz integriert ist. Hier können Sie Themen diskutieren, Ideen austauschen und mit anderen Nutzern zusammenarbeiten.",
|
||||
"Features:" : "Funktionen:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Kursiver Text",
|
||||
"Underlined text" : "Unterstrichener Text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Gerne eine neue Diskussion starten oder auf bestehende Beiträge antworten. Viel Spaß beim Posten!",
|
||||
"Welcome to Nextcloud Forums" : "Willkommen in den Nextcloud Foren",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} neue Antwort in {thread}","{count} neue Antworten in {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} hat Sie in {thread} erwähnt",
|
||||
@@ -280,6 +280,8 @@
|
||||
"Configure how you receive notifications" : "Einrichten, wie Sie Benachrichtigungen erhalten",
|
||||
"Auto-subscribe to threads I create" : "Themen die ich erstellt habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Wenn diese Option aktiviert ist, erhalten Sie automatisch Benachrichtigungen für Antworten auf von Ihnen erstellte Themen",
|
||||
"Auto-subscribe to threads I reply to" : "Themen auf die ich geantwortet habe, automatisch abonnieren",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Wenn diese Option aktiviert ist, erhalten Sie automatisch Benachrichtigungen für Antworten in Themen, in denen Sie geantwortet haben",
|
||||
"Files" : "Dateien",
|
||||
"Configure file upload settings" : "Einstellungen für das Hochladen von Dateien",
|
||||
"Upload directory" : "Hochladeverzeichnis",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Hidden content",
|
||||
"Spoilers" : "Spoilers",
|
||||
"Attachment" : "Attachment",
|
||||
"Welcome to Nextcloud Forums" : "Welcome to Nextcloud Forums",
|
||||
"Welcome to the Nextcloud Forums!" : "Welcome to the Nextcloud Forums!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users.",
|
||||
"Features:" : "Features:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Italic text",
|
||||
"Underlined text" : "Underlined text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Feel free to start a new discussion or reply to existing threads. Happy posting!",
|
||||
"Welcome to Nextcloud Forums" : "Welcome to Nextcloud Forums",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} new reply in {thread}","{count} new replies in {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mentioned you in {thread}",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Hidden content",
|
||||
"Spoilers" : "Spoilers",
|
||||
"Attachment" : "Attachment",
|
||||
"Welcome to Nextcloud Forums" : "Welcome to Nextcloud Forums",
|
||||
"Welcome to the Nextcloud Forums!" : "Welcome to the Nextcloud Forums!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users.",
|
||||
"Features:" : "Features:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Italic text",
|
||||
"Underlined text" : "Underlined text",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Feel free to start a new discussion or reply to existing threads. Happy posting!",
|
||||
"Welcome to Nextcloud Forums" : "Welcome to Nextcloud Forums",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} new reply in {thread}","{count} new replies in {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mentioned you in {thread}",
|
||||
|
||||
@@ -18,7 +18,6 @@ OC.L10N.register(
|
||||
"Inline code" : "Código en línea",
|
||||
"Spoilers" : "Spoilers",
|
||||
"Attachment" : "Adjunto",
|
||||
"Welcome to Nextcloud Forums" : "Bienvenido a los Foros de Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "¡Bienvenido a los Foros de Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Este es un foro impulsado por la comunidad integrado directamente en tu instancia de Nextcloud. Aquí puedes discutir temas, compartir ideas y colaborar con otros usuarios.",
|
||||
"Features:" : "Funciones:",
|
||||
@@ -34,6 +33,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Texto en cursiva",
|
||||
"Underlined text" : "Texto subrayado",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "No dudes en iniciar una nueva discusión o responder a hilos existentes. ¡Feliz publicación!",
|
||||
"Welcome to Nextcloud Forums" : "Bienvenido a los Foros de Nextcloud",
|
||||
"Forum" : "Foro",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nueva respuesta en {thread}","{count} nuevas respuestas en {thread}","{count} nuevas respuestas en {thread}"],
|
||||
"Welcome to the forum!" : "¡Bienvenido al foro!",
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
"Inline code" : "Código en línea",
|
||||
"Spoilers" : "Spoilers",
|
||||
"Attachment" : "Adjunto",
|
||||
"Welcome to Nextcloud Forums" : "Bienvenido a los Foros de Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "¡Bienvenido a los Foros de Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Este es un foro impulsado por la comunidad integrado directamente en tu instancia de Nextcloud. Aquí puedes discutir temas, compartir ideas y colaborar con otros usuarios.",
|
||||
"Features:" : "Funciones:",
|
||||
@@ -32,6 +31,7 @@
|
||||
"Italic text" : "Texto en cursiva",
|
||||
"Underlined text" : "Texto subrayado",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "No dudes en iniciar una nueva discusión o responder a hilos existentes. ¡Feliz publicación!",
|
||||
"Welcome to Nextcloud Forums" : "Bienvenido a los Foros de Nextcloud",
|
||||
"Forum" : "Foro",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nueva respuesta en {thread}","{count} nuevas respuestas en {thread}","{count} nuevas respuestas en {thread}"],
|
||||
"Welcome to the forum!" : "¡Bienvenido al foro!",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Peidetud sisu",
|
||||
"Spoilers" : "Spoilerid/tujurikkujad",
|
||||
"Attachment" : "Manus",
|
||||
"Welcome to Nextcloud Forums" : "Tere tulemast kasutama Nextcloudi Foorumit",
|
||||
"Welcome to the Nextcloud Forums!" : "Tere tulemast kasutama rakendust Nextcloudi Foorumid!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "See on kogukonnapõhine foorum, mis toimib otse sinu Nextcloudi serveris. Siin saad arutleda erinevatel teemadel, jagada mõtteid ning osaleda ühistöös.",
|
||||
"Features:" : "Foorumi võimalused:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Tekst kaldkirjas",
|
||||
"Underlined text" : "Allajoonitud tekst",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Alusta uut keskustelu või vasta olemasolevale jutulõngale. Soovime sulle toimekat suhtlust!",
|
||||
"Welcome to Nextcloud Forums" : "Tere tulemast kasutama Nextcloudi Foorumit",
|
||||
"Forum" : "Foorum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} uus vastus jutulõngas {thread}","{count} uut vastust jutulõngas {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mainis sind jutulõngas „{thread}“",
|
||||
@@ -281,6 +281,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "Seadista endale teavituste saatmise viisi",
|
||||
"Auto-subscribe to threads I create" : "Telli minu loodud jutulõngad automaatselt",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Kui see eelistus on kasutusel, siis saad automaatselt teavituse sinu loodud jutulõngade vastuste puhul",
|
||||
"Auto-subscribe to threads I reply to" : "Telli minu poolt vastatud jutulõngad automaatselt",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Kui see eelistus on kasutusel, siis saad automaatselt teavituse nende jutulõngade kohta, kuhu oled vastuse kirjutanud",
|
||||
"Files" : "Failid",
|
||||
"Configure file upload settings" : "Seadista failide üleslaadimise seadistusi",
|
||||
"Upload directory" : "Üleslaadimiskaust",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Peidetud sisu",
|
||||
"Spoilers" : "Spoilerid/tujurikkujad",
|
||||
"Attachment" : "Manus",
|
||||
"Welcome to Nextcloud Forums" : "Tere tulemast kasutama Nextcloudi Foorumit",
|
||||
"Welcome to the Nextcloud Forums!" : "Tere tulemast kasutama rakendust Nextcloudi Foorumid!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "See on kogukonnapõhine foorum, mis toimib otse sinu Nextcloudi serveris. Siin saad arutleda erinevatel teemadel, jagada mõtteid ning osaleda ühistöös.",
|
||||
"Features:" : "Foorumi võimalused:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Tekst kaldkirjas",
|
||||
"Underlined text" : "Allajoonitud tekst",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Alusta uut keskustelu või vasta olemasolevale jutulõngale. Soovime sulle toimekat suhtlust!",
|
||||
"Welcome to Nextcloud Forums" : "Tere tulemast kasutama Nextcloudi Foorumit",
|
||||
"Forum" : "Foorum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} uus vastus jutulõngas {thread}","{count} uut vastust jutulõngas {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mainis sind jutulõngas „{thread}“",
|
||||
@@ -279,6 +279,8 @@
|
||||
"Configure how you receive notifications" : "Seadista endale teavituste saatmise viisi",
|
||||
"Auto-subscribe to threads I create" : "Telli minu loodud jutulõngad automaatselt",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Kui see eelistus on kasutusel, siis saad automaatselt teavituse sinu loodud jutulõngade vastuste puhul",
|
||||
"Auto-subscribe to threads I reply to" : "Telli minu poolt vastatud jutulõngad automaatselt",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Kui see eelistus on kasutusel, siis saad automaatselt teavituse nende jutulõngade kohta, kuhu oled vastuse kirjutanud",
|
||||
"Files" : "Failid",
|
||||
"Configure file upload settings" : "Seadista failide üleslaadimise seadistusi",
|
||||
"Upload directory" : "Üleslaadimiskaust",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Ábhar i bhfolach",
|
||||
"Spoilers" : "Spoiléirí",
|
||||
"Attachment" : "Ceangaltán",
|
||||
"Welcome to Nextcloud Forums" : "Fáilte go Fóraim Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Fáilte go dtí Fóraim Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Is fóram pobail-thiomáinte é seo atá tógtha isteach i do chás Nextcloud. Anseo is féidir leat topaicí a phlé, smaointe a roinnt agus comhoibriú le húsáideoirí eile.",
|
||||
"Features:" : "Gnéithe:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Téacs iodálach",
|
||||
"Underlined text" : "Téacs a bhfuil líne faoi",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Ná bíodh drogall ort plé nua a thosú nó freagra a thabhairt ar shnáitheanna atá ann cheana féin. Go n-éirí leat ag postáil!",
|
||||
"Welcome to Nextcloud Forums" : "Fáilte go Fóraim Nextcloud",
|
||||
"Forum" : "Fóram",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count}freagra nua i {thread}","{count} freagraí nua i {thread}","{count} freagraí nua i {thread}","{count} freagraí nua i {thread}","{count} freagraí nua i {thread}"],
|
||||
"{user} mentioned you in {thread}" : "Luaigh {user} thú i {thread}",
|
||||
@@ -282,6 +282,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "Cumraigh conas a fhaigheann tú fógraí",
|
||||
"Auto-subscribe to threads I create" : "Liostáil go huathoibríoch le snáitheanna a chruthaím",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Nuair a bheidh sé cumasaithe, gheobhaidh tú fógraí go huathoibríoch le haghaidh freagraí ar shnáitheanna a chruthaíonn tú",
|
||||
"Auto-subscribe to threads I reply to" : "Liostáil go huathoibríoch le snáitheanna a bhfreagraím orthu",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Nuair a bheidh sé cumasaithe, gheobhaidh tú fógraí go huathoibríoch faoi fhreagraí nua i snáitheanna ar fhreagair tú iad",
|
||||
"Files" : "Comhaid",
|
||||
"Configure file upload settings" : "Cumraigh socruithe uaslódála comhad",
|
||||
"Upload directory" : "Uaslódáil eolaire",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Ábhar i bhfolach",
|
||||
"Spoilers" : "Spoiléirí",
|
||||
"Attachment" : "Ceangaltán",
|
||||
"Welcome to Nextcloud Forums" : "Fáilte go Fóraim Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Fáilte go dtí Fóraim Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Is fóram pobail-thiomáinte é seo atá tógtha isteach i do chás Nextcloud. Anseo is féidir leat topaicí a phlé, smaointe a roinnt agus comhoibriú le húsáideoirí eile.",
|
||||
"Features:" : "Gnéithe:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Téacs iodálach",
|
||||
"Underlined text" : "Téacs a bhfuil líne faoi",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Ná bíodh drogall ort plé nua a thosú nó freagra a thabhairt ar shnáitheanna atá ann cheana féin. Go n-éirí leat ag postáil!",
|
||||
"Welcome to Nextcloud Forums" : "Fáilte go Fóraim Nextcloud",
|
||||
"Forum" : "Fóram",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count}freagra nua i {thread}","{count} freagraí nua i {thread}","{count} freagraí nua i {thread}","{count} freagraí nua i {thread}","{count} freagraí nua i {thread}"],
|
||||
"{user} mentioned you in {thread}" : "Luaigh {user} thú i {thread}",
|
||||
@@ -280,6 +280,8 @@
|
||||
"Configure how you receive notifications" : "Cumraigh conas a fhaigheann tú fógraí",
|
||||
"Auto-subscribe to threads I create" : "Liostáil go huathoibríoch le snáitheanna a chruthaím",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Nuair a bheidh sé cumasaithe, gheobhaidh tú fógraí go huathoibríoch le haghaidh freagraí ar shnáitheanna a chruthaíonn tú",
|
||||
"Auto-subscribe to threads I reply to" : "Liostáil go huathoibríoch le snáitheanna a bhfreagraím orthu",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Nuair a bheidh sé cumasaithe, gheobhaidh tú fógraí go huathoibríoch faoi fhreagraí nua i snáitheanna ar fhreagair tú iad",
|
||||
"Files" : "Comhaid",
|
||||
"Configure file upload settings" : "Cumraigh socruithe uaslódála comhad",
|
||||
"Upload directory" : "Uaslódáil eolaire",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Contido agochado",
|
||||
"Spoilers" : "Destripes",
|
||||
"Attachment" : "Anexo",
|
||||
"Welcome to Nextcloud Forums" : "Dámoslle a benvida a os Foros de Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Dámoslle a benvida a os Foros de Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Este é un foro impulsado pola comunidade integrado directamente na súa instancia de Nextcloud. Aquí pode debater temas, compartir ideas e colaborar con outros usuarios.",
|
||||
"Features:" : "Funcionalidades:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Texto en cursiva",
|
||||
"Underlined text" : "Texto subliñado",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Síntase libre de iniciar un novo debate ou de responder a fíos existentes. Feliz publicación!",
|
||||
"Welcome to Nextcloud Forums" : "Dámoslle a benvida a os Foros de Nextcloud",
|
||||
"Forum" : "Foro",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nova resposta en {thread}","{count} novas respostas en {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mencionouno a Vde. en {thread}",
|
||||
@@ -280,8 +280,10 @@ OC.L10N.register(
|
||||
"Error loading preferences" : "Produciuse un erro ao cargar as preferencias",
|
||||
"Notifications" : "Notificacións",
|
||||
"Configure how you receive notifications" : "Configure como quere recibir as notificacións",
|
||||
"Auto-subscribe to threads I create" : "Subscríbirse automaticamente aos fíos que creou",
|
||||
"Auto-subscribe to threads I create" : "Subscribirme automaticamente aos fíos que creo",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Cando estea activado, recibirá automaticamente notificacións das respostas aos fíos que cree",
|
||||
"Auto-subscribe to threads I reply to" : "Subscribirme automaticamente aos fíos que respondo",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Cando estea activado, recibirá automaticamente notificacións de novas respostas nos fíos aos que respondeu",
|
||||
"Files" : "Ficheiros",
|
||||
"Configure file upload settings" : "Configurar os axustes de envío de ficheiros",
|
||||
"Upload directory" : "Directorio ao que enviar",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Contido agochado",
|
||||
"Spoilers" : "Destripes",
|
||||
"Attachment" : "Anexo",
|
||||
"Welcome to Nextcloud Forums" : "Dámoslle a benvida a os Foros de Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Dámoslle a benvida a os Foros de Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Este é un foro impulsado pola comunidade integrado directamente na súa instancia de Nextcloud. Aquí pode debater temas, compartir ideas e colaborar con outros usuarios.",
|
||||
"Features:" : "Funcionalidades:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Texto en cursiva",
|
||||
"Underlined text" : "Texto subliñado",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Síntase libre de iniciar un novo debate ou de responder a fíos existentes. Feliz publicación!",
|
||||
"Welcome to Nextcloud Forums" : "Dámoslle a benvida a os Foros de Nextcloud",
|
||||
"Forum" : "Foro",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nova resposta en {thread}","{count} novas respostas en {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mencionouno a Vde. en {thread}",
|
||||
@@ -278,8 +278,10 @@
|
||||
"Error loading preferences" : "Produciuse un erro ao cargar as preferencias",
|
||||
"Notifications" : "Notificacións",
|
||||
"Configure how you receive notifications" : "Configure como quere recibir as notificacións",
|
||||
"Auto-subscribe to threads I create" : "Subscríbirse automaticamente aos fíos que creou",
|
||||
"Auto-subscribe to threads I create" : "Subscribirme automaticamente aos fíos que creo",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Cando estea activado, recibirá automaticamente notificacións das respostas aos fíos que cree",
|
||||
"Auto-subscribe to threads I reply to" : "Subscribirme automaticamente aos fíos que respondo",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Cando estea activado, recibirá automaticamente notificacións de novas respostas nos fíos aos que respondeu",
|
||||
"Files" : "Ficheiros",
|
||||
"Configure file upload settings" : "Configurar os axustes de envío de ficheiros",
|
||||
"Upload directory" : "Directorio ao que enviar",
|
||||
|
||||
128
l10n/he.js
128
l10n/he.js
@@ -1,14 +1,14 @@
|
||||
OC.L10N.register(
|
||||
"forum",
|
||||
{
|
||||
"Admin" : "מנהל",
|
||||
"Administrator role with full permissions" : "תפקיד מנהל עם הרשאות מלאות",
|
||||
"Admin" : "אדמין",
|
||||
"Administrator role with full permissions" : "תפקיד אדמין עם הרשאות מלאות",
|
||||
"Moderator" : "מפקח",
|
||||
"Moderator role with elevated permissions" : "תפקיד מפקח עם הרשאות מוגבהות",
|
||||
"User" : "משתמש",
|
||||
"Default user role with basic permissions" : "תפקיד משתמש רגיל עם הרשאות בסיסיות",
|
||||
"Default user role with basic permissions" : "תפקיד משתמש ברירת מחדל עם הרשאות בסיסיות",
|
||||
"Guest" : "אורח",
|
||||
"Guest role for unauthenticated users with read-only access" : "תפקיד אורח עם הרשאות גישה לקריאה בלבד",
|
||||
"Guest role for unauthenticated users with read-only access" : "תפקיד אורח למשתמשים לא-מחוברים עם הרשאות גישה לקריאה בלבד",
|
||||
"General" : "כללי",
|
||||
"General discussion categories" : "קטגוריות לדיונים כלליים",
|
||||
"General discussions" : "דיונים כלליים",
|
||||
@@ -20,24 +20,29 @@ OC.L10N.register(
|
||||
"Hidden content" : "תוכן מוסתר",
|
||||
"Spoilers" : "ספוילרים",
|
||||
"Attachment" : "קובץ מצורף",
|
||||
"Welcome to Nextcloud Forums" : "ברוכים הבאים לפורום Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "ברוכים הבאים לפורום של Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "זהו פורום מונחה-קהילה מובנה ישירות ל-Nextcloud שלך. כאן ניתן להתדיין בנושאים שונים, לחלוק רעיונות ולשתף פעולה עם משתמשים אחרים.",
|
||||
"Features:" : "יכולות:",
|
||||
"Create and reply to threads" : "יצירה והגבה לשרשורים",
|
||||
"Organize discussions by categories" : "אירגון דיונים על-פי קטגוריות",
|
||||
"Use BBCode for rich text formatting" : "השתמשו ב-BBCode לפורמט טקסט עשיר",
|
||||
"Attach files from your Nextcloud storage" : "צירוף קבצים מאחסון ה-Nextcloud שלך",
|
||||
"React to posts" : "תגובות לשרשורים",
|
||||
"Track read/unread threads" : "מעקב אחר שרשורים שנקראו\\לא נקראו",
|
||||
"BBCode examples:" : "דוגמאות BBCode:",
|
||||
"Bold text" : "טקסט בולט",
|
||||
"Use %1$stext%2$s" : "השתמשו ב%1$sטקסט%2$s",
|
||||
"Italic text" : "טקסט מוטה",
|
||||
"Underlined text" : "טקסט בקו תחתון",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "הרגישו חופשי להתחיל שרשור חדש או להגיב לשרשורים קיימים. כתיבה מהנה!",
|
||||
"Welcome to Nextcloud Forums" : "ברוכים הבאים לפורום Nextcloud",
|
||||
"Forum" : "פורום",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["תגובה {count} חדשה ב-{thread}","{count} תגובות חדשות ב-{thread}","{count} תגובות חדשות ב-{thread}"],
|
||||
"{user} mentioned you in {thread}" : "אוזכרת על ידי {user}בנושא {thread}",
|
||||
"Welcome to the forum!" : "ברוכים הבאים לפורום!",
|
||||
"Deleted user" : "משתמש מחוק",
|
||||
"A community-driven forum built right into your Nextcloud instance" : "פורום מונחה-קהילה מובנה ישירות להתקנת ה Nextcloud שלכם.",
|
||||
"Create discussions, share ideas and collaborate with your community directly in Nextcloud.\n\n**⚠️ Early Development Notice:**\nThis app is in early stages of development. While functional, you may encounter bugs or incomplete features. Please report any issues on GitHub and consider backing up your data regularly.\n\n**Key features:**\n- **Thread-based Discussions** - Create and reply to organized discussion threads\n- **Category Organization** - Structure your forum with customizable categories and headers\n- **Rich Text Formatting** - Use BBCode for formatting posts with bold, italic, links, images, code blocks and more\n- **File Attachments** - Attach files from your Nextcloud storage to posts\n- **Post Reactions** - React to posts with emoji reactions\n- **Read/Unread Tracking** - Keep track of which threads you've read\n- **Search** - Find discussions quickly with built-in search\n- **User Profiles** - View user post history and statistics\n- **Role-Based Permissions** - Control access and moderation with flexible roles\n- **Guest Access**: Optional public access for unauthenticated users with configurable permissions\n- **Admin Tools** - Manage categories, roles, BBCodes and forum settings\n- **Moderation Tools** - Pin, lock and manage threads and posts\n\n**Perfect for:**\n- Team discussions and collaboration\n- Community forums\n- Support channels\n- Knowledge bases\n- Project discussions\n- Internal communication\n\nThe forum integrates seamlessly with your Nextcloud instance, using your existing users and groups for authentication and access control." : "צרו דיונים, חלקו רעיונות ושתפו פעולה עם משתמשים ישירות ב-Nextcloud.\n\n**⚠️ הודעה לגבי שלב פיתוח מוקדם:**\nהיישום הזה נמצא בשלבי פיתוח מוקדמים. בעוד היישום שמיש, אתם עלולים להיתקל בבאגים או יכולות לא שלמות. נא לדווח בעיות ב-GitHub ולשקול לגבות את המידע שלכם באופן תכוף.\n\n**יכולות מפתח:**\n- **דיונים מונחי נושאים** - צרו והגיבו לנושאי דיון\n- **ארגון קטגוריות** - צרו מבנה לפורום שלכם עם קטגוריות וכותרות הניתנות להתאמה\n- **פורמט טקסט עשיר** - השתמשו ב-BBCode לפרמוט של פוסטים עם הדגשות, הטיות, קישורים, תמונות, קטעי קוד ועוד\n- **צירוף קבצים** - צרפו קבצים מתוך ה-Nextcloud שלכם לפוסטים\n- **תגובונים לפוסטים** - הגיבו לפוסטים עם תגובוני אמוג'י\n- **מעקב נקרא\\לא נקרא** - עקבו אחרי סטטוס הקריאה של פוסטים\n- **חיפוש** - מצאו דיונים מהר בעזרת חיפוש מובנה\n- **פרופילי משתמשים** - צפו בהיסטוריה וסטטיסטיקות של משתמשים\n- **הרשאות מבוססי תפקיד** - שלטו בגישה ומודרציה עם תפקידים גמישים\n- **גישה לאורחים**: גישת רשות ציבורית למשתמשים לא מחוברים עם הרשאות ניתנות להתאמה\n- **כלי ניהול** - נהלו קטגוריות, תפקידים, BBCode והגדרות פורום\n- **כלי מודרציה** - נעלו, הדביקו, ונהלו נושאים ותגובות\n\n**מושלם עבור:**\n- דיוני צוותים ושיתוף פעולה\n- פורום קהילתי\n- ערוצי תמיכה\n- ניהול ידע\n- דיוני פרוייקטים\n- תקשורת פנימית\n\nהפורום מתממשק באופן ישיר ל-Nextcloud שלכם, ומשתמש במשתמשים קיימים וקבוצות קיימות לניהול גישה והתחברות.",
|
||||
"Loading …" : "בטעינה…",
|
||||
"Search" : "חיפוש",
|
||||
"Home" : "בית",
|
||||
@@ -48,6 +53,7 @@ OC.L10N.register(
|
||||
"Users" : "משתמשים",
|
||||
"Roles" : "תפקידים",
|
||||
"Categories" : "קטגוריות",
|
||||
"BBCodes" : "BBCodes",
|
||||
"Expand" : "הרחבה",
|
||||
"Collapse" : "קיווץ",
|
||||
"{bStart}Please note:{bEnd} Attached files will be visible to anyone in the forum, regardless of the file's sharing settings." : "{bStart}נא לשים לב:{bEnd} קבצים מצורפים יהיו זמינים לכל מי שנמצא בפורום, ללא התחשבות בהגדרות השיתוף של הקובץ.",
|
||||
@@ -73,8 +79,16 @@ OC.L10N.register(
|
||||
"List" : "רשימה",
|
||||
"List item within a list" : "פריט רשימה בתוך רשימה",
|
||||
"List item within a list (alias)" : "פריט רשימה בתוך רשימה (חלופה)",
|
||||
"BBCode help" : "עזרה עם BBCode",
|
||||
"Built-in BBCodes" : "BBCode מובנים",
|
||||
"These BBCodes are available by default." : "ה-BBCode הללו זמינים כברירת מחדל.",
|
||||
"Custom BBCodes" : "BBCode מותאמים אישית",
|
||||
"These BBCodes are custom to this forum and configured by administrators." : "ה-BBCodes הללו מותאמים לפורום הזה וניתנים להגדרה על ידי צוות הניהול.",
|
||||
"Example" : "דוגמה",
|
||||
"Replacement" : "החלפה",
|
||||
"Loading custom BBCodes …" : "טוען BBCodes מותאמים …",
|
||||
"No custom BBCodes configured." : "אין BBCodes מותאמים מוגדרים.",
|
||||
"Failed to load custom BBCodes" : "כשלון בטעינת BBCodes מותאמים",
|
||||
"Insert emoji" : "הכנסת אימוג'י",
|
||||
"Pick file from Nextcloud" : "בחירת קובץ מ-Nextcloud",
|
||||
"Upload file to Nextcloud" : "העלאת קובץ ל-Nextcloud",
|
||||
@@ -84,6 +98,7 @@ OC.L10N.register(
|
||||
"Pick a file to attach" : "בחירת קובץ לצירוף",
|
||||
"Failed to upload file" : "כשלון בהעלאת קובץ",
|
||||
"Threads" : "שרשורים",
|
||||
"Replies" : "תגובות",
|
||||
"No description available" : "תיאור לא זמין",
|
||||
"Create category header" : "יצירת כותרת קטגוריות",
|
||||
"Edit category header" : "עריכת כותרת קטגוריות",
|
||||
@@ -108,26 +123,129 @@ OC.L10N.register(
|
||||
"The page you are looking for could not be found." : "העמוד שחיפשתם לא נמצא.",
|
||||
"Back" : "אחורה",
|
||||
"Go to home" : "חזרה אל דף הבית",
|
||||
"Pagination" : "דפדוף",
|
||||
"First page" : "דף ראשון",
|
||||
"Previous page" : "דף קודם",
|
||||
"Next page" : "דף הבא",
|
||||
"Last page" : "דף אחרון",
|
||||
"Go to page {page}" : "עבור לדף {page}",
|
||||
"Edited" : "נערך",
|
||||
"Quote reply" : "ציטוט בתגובה",
|
||||
"Edit" : "עריכה",
|
||||
"Delete" : "מחיקה",
|
||||
"View edit history" : "צפייה בהיסטוריית עריכה",
|
||||
"Are you sure you want to delete this post? This action cannot be undone." : "האם אתם בטוחים שתרצו למחוק את הפוסט הזה? הפעולה בלתי ניתנת להפיכה.",
|
||||
"Unread" : "לא נקרא",
|
||||
"Edit your reply …" : "ערכו את תגובתכם …",
|
||||
"Save" : "שמירה",
|
||||
"Are you sure you want to discard your changes?" : "האם אתם בטוחים שתרצו לבטל את השינויים שלכם?",
|
||||
"Edit history" : "היסטוריית עריכה",
|
||||
"Loading history …" : "טוען היסטוריה …",
|
||||
"This post has no edit history." : "לפוסט הזה אין היסטוריית עריכה.",
|
||||
"Current version" : "גרסה נוכחית",
|
||||
"Edited by" : "נערך על ידי",
|
||||
"Failed to load edit history" : "כשלון בטעינת היסטוריית עריכה",
|
||||
"Version {index}" : "גרסה {index}",
|
||||
"Add reaction" : "הוספת תגובון",
|
||||
"React with {emoji}" : "הגיבו עם {emoji}",
|
||||
"You reacted with {emoji}" : "הגבת עם {emoji}",
|
||||
"_You and %n other reacted with {emoji}_::_You and %n others reacted with {emoji}_" : ["את\\ה ועוד %n אחר הגבתם עם {emoji}","את\\ה ועוד %n אחרים הגבתם עם {emoji}","את\\ה ועוד %n אחרים הגבתם עם {emoji}"],
|
||||
"_%n person reacted with {emoji}_::_%n people reacted with {emoji}_" : ["אדם אחד הגיב עם {emoji}","%n אנשים הגיבו עם {emoji}","%n אנשים הגיבו עם {emoji}"],
|
||||
"Write your reply …" : "כתבו את תגובתכם …",
|
||||
"Submit reply" : "שליחת תגובה",
|
||||
"Are you sure you want to discard your reply?" : "אתם בטוחים שברצונכם לבטל את התגובה?",
|
||||
"In thread" : "בנושא",
|
||||
"Thread unavailable" : "נושא לא זמין",
|
||||
"Pinned thread" : "נושא מודבק",
|
||||
"Locked thread" : "נושא נעול",
|
||||
"Uncategorized" : "ללא קטגוריה",
|
||||
"_%n reply_::_%n replies_" : ["תגובה אחת","%n תגובות","%n תגובות"],
|
||||
"_%n view_::_%n views_" : ["צפייה אחת","%n צפיות","%n צפיות"],
|
||||
"Views" : "תצוגות",
|
||||
"Title" : "כותרת",
|
||||
"Enter thread title …" : "כתבו כותרת לנושא …",
|
||||
"Write your thread content …" : "כתבו תוכן לנושא שלכם …",
|
||||
"Create thread" : "צרו נושא",
|
||||
"Are you sure you want to discard this thread?" : "אתם בטוחים שברצונכם לבטל את הנושא?",
|
||||
"Saving draft …" : "הטיוטה נשמרת…",
|
||||
"Draft saved" : "הטיוטה נשמרה",
|
||||
"Unsaved changes" : "שינויים שלא נשמרו",
|
||||
"Back to home" : "חזרה לדף בית",
|
||||
"Refresh" : "רענון",
|
||||
"Your bookmarked threads" : "הנושאים בסימניה שלכם",
|
||||
"Error loading bookmarks" : "שגיאה בטעינת סימניות",
|
||||
"No bookmarks yet" : "ללא סימניות עדיין",
|
||||
"Bookmark threads to quickly find them later." : "סמנו נושאים כדי למצוא אותם מהר מאוחר יותר",
|
||||
"Retry" : "ניסיון חוזר",
|
||||
"An unexpected error occurred" : "קרתה שגיאה בלתי צפוייה",
|
||||
"Failed to load bookmarks" : "כשלון בטעינת סימניות",
|
||||
"No categories yet" : "ללא קטגוריות עדיין",
|
||||
"Categories will appear here once they are created." : "קטגוריות יופיעו כאן ברגע שייוצרו",
|
||||
"No categories in this section" : "אין קטגוריות באיזור הזה",
|
||||
"Category not found" : "קטגוריה לא נמצאה",
|
||||
"The category you are looking for does not exist or has been removed." : "הקטגוריה שאתם מחפשים לא קיימת או הוסרה.",
|
||||
"Back to categories" : "חזרה אל קטגוריות",
|
||||
"New thread" : "נושא חדש",
|
||||
"Error loading category" : "שגיאה בטעינת קטגוריות",
|
||||
"No threads yet" : "ללא נושאים עדיין",
|
||||
"Be the first to start a discussion in this category." : "היו הראשונים שיוצרים דיון בקטגוריה זאת.",
|
||||
"No category ID or slug provided" : "מזהה קטגוריה לא סופק ",
|
||||
"Failed to load threads" : "שגיאה בטעינת נושאים",
|
||||
"Create New Thread" : "צרו נושא חדש",
|
||||
"In {category}" : "בתוך {category}",
|
||||
"Creating thread …" : "יוצר נושא …",
|
||||
"Thread created" : "נושא נוצר",
|
||||
"Failed to create thread" : "כשלון ביצירת נושא",
|
||||
"No category specified" : "קטגוריה לא סופקה",
|
||||
"Error" : "שגיאה",
|
||||
"First activity" : "פעילות ראשונה",
|
||||
"Threads ({count})" : "נושאים ({count})",
|
||||
"Replies ({count})" : "תגובות ({count})",
|
||||
"No threads" : "ללא נושאים",
|
||||
"This user has not created any threads yet" : "משתמש זה לא יצר נושאים עדיין",
|
||||
"No replies" : "ללא תגובות",
|
||||
"This user has not written any replies yet" : "משתמש זה לא כתב תגובות עדיין",
|
||||
"Failed to load user profile" : "כשלון בטעינת פרופיל משתמש",
|
||||
"Enter search query …" : "הכניסו שאילתת חיפוש …",
|
||||
"Search in threads" : "חפשו בנושאים",
|
||||
"Search in replies" : "חפשו בתגובות",
|
||||
"Syntax help" : "עזרה בתחביר",
|
||||
"Search syntax" : "תחביר חיפוש",
|
||||
"Match exact phrase" : "התאם מלל מדוייק",
|
||||
"Both terms required" : "שני הערכים הם חובה",
|
||||
"Either term matches" : "ערך אחד או אחר מתאים",
|
||||
"Group conditions with parentheses" : "קבצו תנאים בעזרת סוגריים",
|
||||
"Exclude term from results" : "השמיטו מתוצאות החיפוש",
|
||||
"Searching …" : "מתבצע חיפוש…",
|
||||
"Search Error" : "שגיאה בחיפוש",
|
||||
"Enter a search query" : "הכניסו שאילתת חיפוש",
|
||||
"Use the search box above to find threads and replies" : "השתמשו בתיבת החיפוש למעלה כדי למצוא נושאים ותגובות",
|
||||
"No results found" : "לא נמצאו תוצאות",
|
||||
"Try different keywords or check your syntax" : "נסו מילות מפתח אחרות או בדקו שוב את תחביר החיפוש שלכם",
|
||||
"_%n thread found_::_%n threads found_" : ["נמצא נושא אחד","נמצאו %n נושאים","נמצאו %n נושאים"],
|
||||
"_%n reply found_::_%n replies found_" : ["נמצאה תגובה אחת","נמצאו %n תגובות","נמצאו %n תגובות"],
|
||||
"Please enter a search query" : "נא להכניס שאילתת חיפוש",
|
||||
"Please select at least one search scope" : "נא בחרו לפחות איזור חיפוש אחד",
|
||||
"Failed to search" : "כשלון בחיפוש",
|
||||
"Thread not found" : "נושא לא נמצא",
|
||||
"The thread you are looking for does not exist or has been removed." : "הנושא שאתם מנסים לפתוח לא קיים או הוסר",
|
||||
"Back to {category}" : "חזרה אל {category}",
|
||||
"Reply" : "תגובה",
|
||||
"Error loading thread" : "שגיאה בטעינת נושא",
|
||||
"No replies yet" : "ללא תגובות עדיין",
|
||||
"Be the first to reply in this thread." : "היו הראשונים שיגיבו לנושא זה",
|
||||
"by" : "מאת",
|
||||
"This thread is locked. Only moderators can add replies." : "הנושא הזה נעול. רק מנהלים יכולים להוסיף תגובות.",
|
||||
"You must be signed in to reply to this thread." : "אתם חייבים להיות מחוברים כדי להגיב לנושא זה.",
|
||||
"Sign in to reply" : "התחברו כדי להגיב",
|
||||
"Lock thread" : "נעילת נושא",
|
||||
"Unlock thread" : "ביטול נעילת נושא",
|
||||
"Pin thread" : "הדבקת נושא",
|
||||
"Unpin thread" : "ביטול הדבקת נושא",
|
||||
"Thread locked" : "הנושא ננעל",
|
||||
"Thread unlocked" : "בוטלה נעילת הנושא",
|
||||
"Thread pinned" : "הנושא הודבק",
|
||||
"Thread unpinned" : "בוטלה הדבקת הנושא",
|
||||
"Subscribe" : "הרשמה",
|
||||
"Bookmark" : "סימנייה",
|
||||
"Edit title" : "עריכת כותרת",
|
||||
|
||||
128
l10n/he.json
128
l10n/he.json
@@ -1,12 +1,12 @@
|
||||
{ "translations": {
|
||||
"Admin" : "מנהל",
|
||||
"Administrator role with full permissions" : "תפקיד מנהל עם הרשאות מלאות",
|
||||
"Admin" : "אדמין",
|
||||
"Administrator role with full permissions" : "תפקיד אדמין עם הרשאות מלאות",
|
||||
"Moderator" : "מפקח",
|
||||
"Moderator role with elevated permissions" : "תפקיד מפקח עם הרשאות מוגבהות",
|
||||
"User" : "משתמש",
|
||||
"Default user role with basic permissions" : "תפקיד משתמש רגיל עם הרשאות בסיסיות",
|
||||
"Default user role with basic permissions" : "תפקיד משתמש ברירת מחדל עם הרשאות בסיסיות",
|
||||
"Guest" : "אורח",
|
||||
"Guest role for unauthenticated users with read-only access" : "תפקיד אורח עם הרשאות גישה לקריאה בלבד",
|
||||
"Guest role for unauthenticated users with read-only access" : "תפקיד אורח למשתמשים לא-מחוברים עם הרשאות גישה לקריאה בלבד",
|
||||
"General" : "כללי",
|
||||
"General discussion categories" : "קטגוריות לדיונים כלליים",
|
||||
"General discussions" : "דיונים כלליים",
|
||||
@@ -18,24 +18,29 @@
|
||||
"Hidden content" : "תוכן מוסתר",
|
||||
"Spoilers" : "ספוילרים",
|
||||
"Attachment" : "קובץ מצורף",
|
||||
"Welcome to Nextcloud Forums" : "ברוכים הבאים לפורום Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "ברוכים הבאים לפורום של Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "זהו פורום מונחה-קהילה מובנה ישירות ל-Nextcloud שלך. כאן ניתן להתדיין בנושאים שונים, לחלוק רעיונות ולשתף פעולה עם משתמשים אחרים.",
|
||||
"Features:" : "יכולות:",
|
||||
"Create and reply to threads" : "יצירה והגבה לשרשורים",
|
||||
"Organize discussions by categories" : "אירגון דיונים על-פי קטגוריות",
|
||||
"Use BBCode for rich text formatting" : "השתמשו ב-BBCode לפורמט טקסט עשיר",
|
||||
"Attach files from your Nextcloud storage" : "צירוף קבצים מאחסון ה-Nextcloud שלך",
|
||||
"React to posts" : "תגובות לשרשורים",
|
||||
"Track read/unread threads" : "מעקב אחר שרשורים שנקראו\\לא נקראו",
|
||||
"BBCode examples:" : "דוגמאות BBCode:",
|
||||
"Bold text" : "טקסט בולט",
|
||||
"Use %1$stext%2$s" : "השתמשו ב%1$sטקסט%2$s",
|
||||
"Italic text" : "טקסט מוטה",
|
||||
"Underlined text" : "טקסט בקו תחתון",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "הרגישו חופשי להתחיל שרשור חדש או להגיב לשרשורים קיימים. כתיבה מהנה!",
|
||||
"Welcome to Nextcloud Forums" : "ברוכים הבאים לפורום Nextcloud",
|
||||
"Forum" : "פורום",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["תגובה {count} חדשה ב-{thread}","{count} תגובות חדשות ב-{thread}","{count} תגובות חדשות ב-{thread}"],
|
||||
"{user} mentioned you in {thread}" : "אוזכרת על ידי {user}בנושא {thread}",
|
||||
"Welcome to the forum!" : "ברוכים הבאים לפורום!",
|
||||
"Deleted user" : "משתמש מחוק",
|
||||
"A community-driven forum built right into your Nextcloud instance" : "פורום מונחה-קהילה מובנה ישירות להתקנת ה Nextcloud שלכם.",
|
||||
"Create discussions, share ideas and collaborate with your community directly in Nextcloud.\n\n**⚠️ Early Development Notice:**\nThis app is in early stages of development. While functional, you may encounter bugs or incomplete features. Please report any issues on GitHub and consider backing up your data regularly.\n\n**Key features:**\n- **Thread-based Discussions** - Create and reply to organized discussion threads\n- **Category Organization** - Structure your forum with customizable categories and headers\n- **Rich Text Formatting** - Use BBCode for formatting posts with bold, italic, links, images, code blocks and more\n- **File Attachments** - Attach files from your Nextcloud storage to posts\n- **Post Reactions** - React to posts with emoji reactions\n- **Read/Unread Tracking** - Keep track of which threads you've read\n- **Search** - Find discussions quickly with built-in search\n- **User Profiles** - View user post history and statistics\n- **Role-Based Permissions** - Control access and moderation with flexible roles\n- **Guest Access**: Optional public access for unauthenticated users with configurable permissions\n- **Admin Tools** - Manage categories, roles, BBCodes and forum settings\n- **Moderation Tools** - Pin, lock and manage threads and posts\n\n**Perfect for:**\n- Team discussions and collaboration\n- Community forums\n- Support channels\n- Knowledge bases\n- Project discussions\n- Internal communication\n\nThe forum integrates seamlessly with your Nextcloud instance, using your existing users and groups for authentication and access control." : "צרו דיונים, חלקו רעיונות ושתפו פעולה עם משתמשים ישירות ב-Nextcloud.\n\n**⚠️ הודעה לגבי שלב פיתוח מוקדם:**\nהיישום הזה נמצא בשלבי פיתוח מוקדמים. בעוד היישום שמיש, אתם עלולים להיתקל בבאגים או יכולות לא שלמות. נא לדווח בעיות ב-GitHub ולשקול לגבות את המידע שלכם באופן תכוף.\n\n**יכולות מפתח:**\n- **דיונים מונחי נושאים** - צרו והגיבו לנושאי דיון\n- **ארגון קטגוריות** - צרו מבנה לפורום שלכם עם קטגוריות וכותרות הניתנות להתאמה\n- **פורמט טקסט עשיר** - השתמשו ב-BBCode לפרמוט של פוסטים עם הדגשות, הטיות, קישורים, תמונות, קטעי קוד ועוד\n- **צירוף קבצים** - צרפו קבצים מתוך ה-Nextcloud שלכם לפוסטים\n- **תגובונים לפוסטים** - הגיבו לפוסטים עם תגובוני אמוג'י\n- **מעקב נקרא\\לא נקרא** - עקבו אחרי סטטוס הקריאה של פוסטים\n- **חיפוש** - מצאו דיונים מהר בעזרת חיפוש מובנה\n- **פרופילי משתמשים** - צפו בהיסטוריה וסטטיסטיקות של משתמשים\n- **הרשאות מבוססי תפקיד** - שלטו בגישה ומודרציה עם תפקידים גמישים\n- **גישה לאורחים**: גישת רשות ציבורית למשתמשים לא מחוברים עם הרשאות ניתנות להתאמה\n- **כלי ניהול** - נהלו קטגוריות, תפקידים, BBCode והגדרות פורום\n- **כלי מודרציה** - נעלו, הדביקו, ונהלו נושאים ותגובות\n\n**מושלם עבור:**\n- דיוני צוותים ושיתוף פעולה\n- פורום קהילתי\n- ערוצי תמיכה\n- ניהול ידע\n- דיוני פרוייקטים\n- תקשורת פנימית\n\nהפורום מתממשק באופן ישיר ל-Nextcloud שלכם, ומשתמש במשתמשים קיימים וקבוצות קיימות לניהול גישה והתחברות.",
|
||||
"Loading …" : "בטעינה…",
|
||||
"Search" : "חיפוש",
|
||||
"Home" : "בית",
|
||||
@@ -46,6 +51,7 @@
|
||||
"Users" : "משתמשים",
|
||||
"Roles" : "תפקידים",
|
||||
"Categories" : "קטגוריות",
|
||||
"BBCodes" : "BBCodes",
|
||||
"Expand" : "הרחבה",
|
||||
"Collapse" : "קיווץ",
|
||||
"{bStart}Please note:{bEnd} Attached files will be visible to anyone in the forum, regardless of the file's sharing settings." : "{bStart}נא לשים לב:{bEnd} קבצים מצורפים יהיו זמינים לכל מי שנמצא בפורום, ללא התחשבות בהגדרות השיתוף של הקובץ.",
|
||||
@@ -71,8 +77,16 @@
|
||||
"List" : "רשימה",
|
||||
"List item within a list" : "פריט רשימה בתוך רשימה",
|
||||
"List item within a list (alias)" : "פריט רשימה בתוך רשימה (חלופה)",
|
||||
"BBCode help" : "עזרה עם BBCode",
|
||||
"Built-in BBCodes" : "BBCode מובנים",
|
||||
"These BBCodes are available by default." : "ה-BBCode הללו זמינים כברירת מחדל.",
|
||||
"Custom BBCodes" : "BBCode מותאמים אישית",
|
||||
"These BBCodes are custom to this forum and configured by administrators." : "ה-BBCodes הללו מותאמים לפורום הזה וניתנים להגדרה על ידי צוות הניהול.",
|
||||
"Example" : "דוגמה",
|
||||
"Replacement" : "החלפה",
|
||||
"Loading custom BBCodes …" : "טוען BBCodes מותאמים …",
|
||||
"No custom BBCodes configured." : "אין BBCodes מותאמים מוגדרים.",
|
||||
"Failed to load custom BBCodes" : "כשלון בטעינת BBCodes מותאמים",
|
||||
"Insert emoji" : "הכנסת אימוג'י",
|
||||
"Pick file from Nextcloud" : "בחירת קובץ מ-Nextcloud",
|
||||
"Upload file to Nextcloud" : "העלאת קובץ ל-Nextcloud",
|
||||
@@ -82,6 +96,7 @@
|
||||
"Pick a file to attach" : "בחירת קובץ לצירוף",
|
||||
"Failed to upload file" : "כשלון בהעלאת קובץ",
|
||||
"Threads" : "שרשורים",
|
||||
"Replies" : "תגובות",
|
||||
"No description available" : "תיאור לא זמין",
|
||||
"Create category header" : "יצירת כותרת קטגוריות",
|
||||
"Edit category header" : "עריכת כותרת קטגוריות",
|
||||
@@ -106,26 +121,129 @@
|
||||
"The page you are looking for could not be found." : "העמוד שחיפשתם לא נמצא.",
|
||||
"Back" : "אחורה",
|
||||
"Go to home" : "חזרה אל דף הבית",
|
||||
"Pagination" : "דפדוף",
|
||||
"First page" : "דף ראשון",
|
||||
"Previous page" : "דף קודם",
|
||||
"Next page" : "דף הבא",
|
||||
"Last page" : "דף אחרון",
|
||||
"Go to page {page}" : "עבור לדף {page}",
|
||||
"Edited" : "נערך",
|
||||
"Quote reply" : "ציטוט בתגובה",
|
||||
"Edit" : "עריכה",
|
||||
"Delete" : "מחיקה",
|
||||
"View edit history" : "צפייה בהיסטוריית עריכה",
|
||||
"Are you sure you want to delete this post? This action cannot be undone." : "האם אתם בטוחים שתרצו למחוק את הפוסט הזה? הפעולה בלתי ניתנת להפיכה.",
|
||||
"Unread" : "לא נקרא",
|
||||
"Edit your reply …" : "ערכו את תגובתכם …",
|
||||
"Save" : "שמירה",
|
||||
"Are you sure you want to discard your changes?" : "האם אתם בטוחים שתרצו לבטל את השינויים שלכם?",
|
||||
"Edit history" : "היסטוריית עריכה",
|
||||
"Loading history …" : "טוען היסטוריה …",
|
||||
"This post has no edit history." : "לפוסט הזה אין היסטוריית עריכה.",
|
||||
"Current version" : "גרסה נוכחית",
|
||||
"Edited by" : "נערך על ידי",
|
||||
"Failed to load edit history" : "כשלון בטעינת היסטוריית עריכה",
|
||||
"Version {index}" : "גרסה {index}",
|
||||
"Add reaction" : "הוספת תגובון",
|
||||
"React with {emoji}" : "הגיבו עם {emoji}",
|
||||
"You reacted with {emoji}" : "הגבת עם {emoji}",
|
||||
"_You and %n other reacted with {emoji}_::_You and %n others reacted with {emoji}_" : ["את\\ה ועוד %n אחר הגבתם עם {emoji}","את\\ה ועוד %n אחרים הגבתם עם {emoji}","את\\ה ועוד %n אחרים הגבתם עם {emoji}"],
|
||||
"_%n person reacted with {emoji}_::_%n people reacted with {emoji}_" : ["אדם אחד הגיב עם {emoji}","%n אנשים הגיבו עם {emoji}","%n אנשים הגיבו עם {emoji}"],
|
||||
"Write your reply …" : "כתבו את תגובתכם …",
|
||||
"Submit reply" : "שליחת תגובה",
|
||||
"Are you sure you want to discard your reply?" : "אתם בטוחים שברצונכם לבטל את התגובה?",
|
||||
"In thread" : "בנושא",
|
||||
"Thread unavailable" : "נושא לא זמין",
|
||||
"Pinned thread" : "נושא מודבק",
|
||||
"Locked thread" : "נושא נעול",
|
||||
"Uncategorized" : "ללא קטגוריה",
|
||||
"_%n reply_::_%n replies_" : ["תגובה אחת","%n תגובות","%n תגובות"],
|
||||
"_%n view_::_%n views_" : ["צפייה אחת","%n צפיות","%n צפיות"],
|
||||
"Views" : "תצוגות",
|
||||
"Title" : "כותרת",
|
||||
"Enter thread title …" : "כתבו כותרת לנושא …",
|
||||
"Write your thread content …" : "כתבו תוכן לנושא שלכם …",
|
||||
"Create thread" : "צרו נושא",
|
||||
"Are you sure you want to discard this thread?" : "אתם בטוחים שברצונכם לבטל את הנושא?",
|
||||
"Saving draft …" : "הטיוטה נשמרת…",
|
||||
"Draft saved" : "הטיוטה נשמרה",
|
||||
"Unsaved changes" : "שינויים שלא נשמרו",
|
||||
"Back to home" : "חזרה לדף בית",
|
||||
"Refresh" : "רענון",
|
||||
"Your bookmarked threads" : "הנושאים בסימניה שלכם",
|
||||
"Error loading bookmarks" : "שגיאה בטעינת סימניות",
|
||||
"No bookmarks yet" : "ללא סימניות עדיין",
|
||||
"Bookmark threads to quickly find them later." : "סמנו נושאים כדי למצוא אותם מהר מאוחר יותר",
|
||||
"Retry" : "ניסיון חוזר",
|
||||
"An unexpected error occurred" : "קרתה שגיאה בלתי צפוייה",
|
||||
"Failed to load bookmarks" : "כשלון בטעינת סימניות",
|
||||
"No categories yet" : "ללא קטגוריות עדיין",
|
||||
"Categories will appear here once they are created." : "קטגוריות יופיעו כאן ברגע שייוצרו",
|
||||
"No categories in this section" : "אין קטגוריות באיזור הזה",
|
||||
"Category not found" : "קטגוריה לא נמצאה",
|
||||
"The category you are looking for does not exist or has been removed." : "הקטגוריה שאתם מחפשים לא קיימת או הוסרה.",
|
||||
"Back to categories" : "חזרה אל קטגוריות",
|
||||
"New thread" : "נושא חדש",
|
||||
"Error loading category" : "שגיאה בטעינת קטגוריות",
|
||||
"No threads yet" : "ללא נושאים עדיין",
|
||||
"Be the first to start a discussion in this category." : "היו הראשונים שיוצרים דיון בקטגוריה זאת.",
|
||||
"No category ID or slug provided" : "מזהה קטגוריה לא סופק ",
|
||||
"Failed to load threads" : "שגיאה בטעינת נושאים",
|
||||
"Create New Thread" : "צרו נושא חדש",
|
||||
"In {category}" : "בתוך {category}",
|
||||
"Creating thread …" : "יוצר נושא …",
|
||||
"Thread created" : "נושא נוצר",
|
||||
"Failed to create thread" : "כשלון ביצירת נושא",
|
||||
"No category specified" : "קטגוריה לא סופקה",
|
||||
"Error" : "שגיאה",
|
||||
"First activity" : "פעילות ראשונה",
|
||||
"Threads ({count})" : "נושאים ({count})",
|
||||
"Replies ({count})" : "תגובות ({count})",
|
||||
"No threads" : "ללא נושאים",
|
||||
"This user has not created any threads yet" : "משתמש זה לא יצר נושאים עדיין",
|
||||
"No replies" : "ללא תגובות",
|
||||
"This user has not written any replies yet" : "משתמש זה לא כתב תגובות עדיין",
|
||||
"Failed to load user profile" : "כשלון בטעינת פרופיל משתמש",
|
||||
"Enter search query …" : "הכניסו שאילתת חיפוש …",
|
||||
"Search in threads" : "חפשו בנושאים",
|
||||
"Search in replies" : "חפשו בתגובות",
|
||||
"Syntax help" : "עזרה בתחביר",
|
||||
"Search syntax" : "תחביר חיפוש",
|
||||
"Match exact phrase" : "התאם מלל מדוייק",
|
||||
"Both terms required" : "שני הערכים הם חובה",
|
||||
"Either term matches" : "ערך אחד או אחר מתאים",
|
||||
"Group conditions with parentheses" : "קבצו תנאים בעזרת סוגריים",
|
||||
"Exclude term from results" : "השמיטו מתוצאות החיפוש",
|
||||
"Searching …" : "מתבצע חיפוש…",
|
||||
"Search Error" : "שגיאה בחיפוש",
|
||||
"Enter a search query" : "הכניסו שאילתת חיפוש",
|
||||
"Use the search box above to find threads and replies" : "השתמשו בתיבת החיפוש למעלה כדי למצוא נושאים ותגובות",
|
||||
"No results found" : "לא נמצאו תוצאות",
|
||||
"Try different keywords or check your syntax" : "נסו מילות מפתח אחרות או בדקו שוב את תחביר החיפוש שלכם",
|
||||
"_%n thread found_::_%n threads found_" : ["נמצא נושא אחד","נמצאו %n נושאים","נמצאו %n נושאים"],
|
||||
"_%n reply found_::_%n replies found_" : ["נמצאה תגובה אחת","נמצאו %n תגובות","נמצאו %n תגובות"],
|
||||
"Please enter a search query" : "נא להכניס שאילתת חיפוש",
|
||||
"Please select at least one search scope" : "נא בחרו לפחות איזור חיפוש אחד",
|
||||
"Failed to search" : "כשלון בחיפוש",
|
||||
"Thread not found" : "נושא לא נמצא",
|
||||
"The thread you are looking for does not exist or has been removed." : "הנושא שאתם מנסים לפתוח לא קיים או הוסר",
|
||||
"Back to {category}" : "חזרה אל {category}",
|
||||
"Reply" : "תגובה",
|
||||
"Error loading thread" : "שגיאה בטעינת נושא",
|
||||
"No replies yet" : "ללא תגובות עדיין",
|
||||
"Be the first to reply in this thread." : "היו הראשונים שיגיבו לנושא זה",
|
||||
"by" : "מאת",
|
||||
"This thread is locked. Only moderators can add replies." : "הנושא הזה נעול. רק מנהלים יכולים להוסיף תגובות.",
|
||||
"You must be signed in to reply to this thread." : "אתם חייבים להיות מחוברים כדי להגיב לנושא זה.",
|
||||
"Sign in to reply" : "התחברו כדי להגיב",
|
||||
"Lock thread" : "נעילת נושא",
|
||||
"Unlock thread" : "ביטול נעילת נושא",
|
||||
"Pin thread" : "הדבקת נושא",
|
||||
"Unpin thread" : "ביטול הדבקת נושא",
|
||||
"Thread locked" : "הנושא ננעל",
|
||||
"Thread unlocked" : "בוטלה נעילת הנושא",
|
||||
"Thread pinned" : "הנושא הודבק",
|
||||
"Thread unpinned" : "בוטלה הדבקת הנושא",
|
||||
"Subscribe" : "הרשמה",
|
||||
"Bookmark" : "סימנייה",
|
||||
"Edit title" : "עריכת כותרת",
|
||||
|
||||
@@ -2,6 +2,7 @@ OC.L10N.register(
|
||||
"forum",
|
||||
{
|
||||
"Admin" : "Admin",
|
||||
"Moderator" : "Moderator",
|
||||
"User" : "Pengguna",
|
||||
"Guest" : "Tamu",
|
||||
"General" : "Umum",
|
||||
@@ -27,6 +28,7 @@ OC.L10N.register(
|
||||
"Update" : "Perbarui",
|
||||
"Move" : "Pindah",
|
||||
"Page not found" : "Halaman tidak ditemukan",
|
||||
"Back" : "Kembali",
|
||||
"Edit" : "Sunting",
|
||||
"Delete" : "Hapus",
|
||||
"Save" : "Simpan",
|
||||
@@ -36,12 +38,14 @@ OC.L10N.register(
|
||||
"Refresh" : "Muat ulang",
|
||||
"Retry" : "Ulangi",
|
||||
"Error" : "Galat",
|
||||
"Searching …" : "Mencari …",
|
||||
"Back to {category}" : "Kembali ke {category}",
|
||||
"by" : "oleh",
|
||||
"Subscribe" : "Berlangganan",
|
||||
"Edit title" : "Edit judul",
|
||||
"Preferences" : "Preferensi",
|
||||
"Notifications" : "Notifikasi",
|
||||
"Files" : "File",
|
||||
"Signature" : "Tanda tangan",
|
||||
"Enable" : "Aktifkan",
|
||||
"Disable" : "Nonaktifkan",
|
||||
@@ -49,6 +53,7 @@ OC.L10N.register(
|
||||
"Enabled" : "Diaktifkan",
|
||||
"Name" : "Nama",
|
||||
"New" : "Baru",
|
||||
"Last 7 days" : "7 hari terakhir",
|
||||
"Appearance" : "Tampilan",
|
||||
"Access control" : "Kontol akses",
|
||||
"Settings saved" : "Setelan tersimpan",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{ "translations": {
|
||||
"Admin" : "Admin",
|
||||
"Moderator" : "Moderator",
|
||||
"User" : "Pengguna",
|
||||
"Guest" : "Tamu",
|
||||
"General" : "Umum",
|
||||
@@ -25,6 +26,7 @@
|
||||
"Update" : "Perbarui",
|
||||
"Move" : "Pindah",
|
||||
"Page not found" : "Halaman tidak ditemukan",
|
||||
"Back" : "Kembali",
|
||||
"Edit" : "Sunting",
|
||||
"Delete" : "Hapus",
|
||||
"Save" : "Simpan",
|
||||
@@ -34,12 +36,14 @@
|
||||
"Refresh" : "Muat ulang",
|
||||
"Retry" : "Ulangi",
|
||||
"Error" : "Galat",
|
||||
"Searching …" : "Mencari …",
|
||||
"Back to {category}" : "Kembali ke {category}",
|
||||
"by" : "oleh",
|
||||
"Subscribe" : "Berlangganan",
|
||||
"Edit title" : "Edit judul",
|
||||
"Preferences" : "Preferensi",
|
||||
"Notifications" : "Notifikasi",
|
||||
"Files" : "File",
|
||||
"Signature" : "Tanda tangan",
|
||||
"Enable" : "Aktifkan",
|
||||
"Disable" : "Nonaktifkan",
|
||||
@@ -47,6 +51,7 @@
|
||||
"Enabled" : "Diaktifkan",
|
||||
"Name" : "Nama",
|
||||
"New" : "Baru",
|
||||
"Last 7 days" : "7 hari terakhir",
|
||||
"Appearance" : "Tampilan",
|
||||
"Access control" : "Kontol akses",
|
||||
"Settings saved" : "Setelan tersimpan",
|
||||
|
||||
@@ -19,6 +19,7 @@ OC.L10N.register(
|
||||
"Collapse" : "접기",
|
||||
"Hello world!" : "Hello world!",
|
||||
"Code" : "코드",
|
||||
"Quote" : "ㅇ",
|
||||
"Font size" : "글꼴 크기",
|
||||
"List" : "목록",
|
||||
"Insert emoji" : "이모지 삽입",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"Collapse" : "접기",
|
||||
"Hello world!" : "Hello world!",
|
||||
"Code" : "코드",
|
||||
"Quote" : "ㅇ",
|
||||
"Font size" : "글꼴 크기",
|
||||
"List" : "목록",
|
||||
"Insert emoji" : "이모지 삽입",
|
||||
|
||||
@@ -16,6 +16,7 @@ OC.L10N.register(
|
||||
"Dashboard" : "Skydelis",
|
||||
"Users" : "Naudotojai",
|
||||
"Categories" : "Kategorijos",
|
||||
"Expand" : "Išskleisti",
|
||||
"Collapse" : "Suskleisti",
|
||||
"Hello world!" : "Sveikas, pasauli!",
|
||||
"Code" : "Kodas",
|
||||
@@ -56,6 +57,7 @@ OC.L10N.register(
|
||||
"Edit title" : "Taisyti pavadinimą",
|
||||
"Move thread" : "Perkelti giją",
|
||||
"Preferences" : "Nuostatos",
|
||||
"Notifications" : "Pranešimai",
|
||||
"Files" : "Failai",
|
||||
"Browse" : "Naršyti",
|
||||
"Signature" : "Parašas",
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"Dashboard" : "Skydelis",
|
||||
"Users" : "Naudotojai",
|
||||
"Categories" : "Kategorijos",
|
||||
"Expand" : "Išskleisti",
|
||||
"Collapse" : "Suskleisti",
|
||||
"Hello world!" : "Sveikas, pasauli!",
|
||||
"Code" : "Kodas",
|
||||
@@ -54,6 +55,7 @@
|
||||
"Edit title" : "Taisyti pavadinimą",
|
||||
"Move thread" : "Perkelti giją",
|
||||
"Preferences" : "Nuostatos",
|
||||
"Notifications" : "Pranešimai",
|
||||
"Files" : "Failai",
|
||||
"Browse" : "Naršyti",
|
||||
"Signature" : "Parašas",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Conteúdo oculto",
|
||||
"Spoilers" : "Spoilers",
|
||||
"Attachment" : "Anexo",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo ao Nextcloud Fórums",
|
||||
"Welcome to the Nextcloud Forums!" : "Bem-vindo ao Nextcloud Fórums!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Este é um fórum comunitário integrado à sua instância Nextcloud. Aqui você pode discutir tópicos, compartilhar ideias e colaborar com outros usuários.",
|
||||
"Features:" : "Características:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Texto em itálico",
|
||||
"Underlined text" : "Texto sublinhado",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Sinta-se à vontade para iniciar uma nova discussão ou responder a fios existentes. Boas postagens!",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo ao Nextcloud Fórums",
|
||||
"Forum" : "Fórum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nova resposta em {thread}","{count} de novas respostas em {thread}","{count} novas respostas em {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mencionou você em {thread}",
|
||||
@@ -282,6 +282,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "Configure como você recebe notificações",
|
||||
"Auto-subscribe to threads I create" : "Inscreva-me automaticamente nos fios que eu criar",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Quando ativado, você receberá automaticamente notificações sobre respostas aos fios que criar",
|
||||
"Auto-subscribe to threads I reply to" : "Inscrever-se automaticamente nos fios aos quais respondo",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Quando ativado, você receberá automaticamente notificações sobre novas respostas nos fios em que você respondeu.",
|
||||
"Files" : "Arquivos",
|
||||
"Configure file upload settings" : "Configurar as definições de envio de arquivos",
|
||||
"Upload directory" : "Diretório de upload",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Conteúdo oculto",
|
||||
"Spoilers" : "Spoilers",
|
||||
"Attachment" : "Anexo",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo ao Nextcloud Fórums",
|
||||
"Welcome to the Nextcloud Forums!" : "Bem-vindo ao Nextcloud Fórums!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Este é um fórum comunitário integrado à sua instância Nextcloud. Aqui você pode discutir tópicos, compartilhar ideias e colaborar com outros usuários.",
|
||||
"Features:" : "Características:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Texto em itálico",
|
||||
"Underlined text" : "Texto sublinhado",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Sinta-se à vontade para iniciar uma nova discussão ou responder a fios existentes. Boas postagens!",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo ao Nextcloud Fórums",
|
||||
"Forum" : "Fórum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} nova resposta em {thread}","{count} de novas respostas em {thread}","{count} novas respostas em {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} mencionou você em {thread}",
|
||||
@@ -280,6 +280,8 @@
|
||||
"Configure how you receive notifications" : "Configure como você recebe notificações",
|
||||
"Auto-subscribe to threads I create" : "Inscreva-me automaticamente nos fios que eu criar",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "Quando ativado, você receberá automaticamente notificações sobre respostas aos fios que criar",
|
||||
"Auto-subscribe to threads I reply to" : "Inscrever-se automaticamente nos fios aos quais respondo",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "Quando ativado, você receberá automaticamente notificações sobre novas respostas nos fios em que você respondeu.",
|
||||
"Files" : "Arquivos",
|
||||
"Configure file upload settings" : "Configurar as definições de envio de arquivos",
|
||||
"Upload directory" : "Diretório de upload",
|
||||
|
||||
@@ -20,10 +20,10 @@ OC.L10N.register(
|
||||
"Hidden content" : "Conteúdo oculto",
|
||||
"Spoilers" : "Contém spoilers",
|
||||
"Attachment" : "Anexo",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo aos Fóruns Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Bem-vindo aos Fóruns do Nextcloud!",
|
||||
"Bold text" : "Texto a negrito",
|
||||
"Underlined text" : "Texto sublinhado",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo aos Fóruns Nextcloud",
|
||||
"Forum" : "Fórum",
|
||||
"Create discussions, share ideas and collaborate with your community directly in Nextcloud.\n\n**⚠️ Early Development Notice:**\nThis app is in early stages of development. While functional, you may encounter bugs or incomplete features. Please report any issues on GitHub and consider backing up your data regularly.\n\n**Key features:**\n- **Thread-based Discussions** - Create and reply to organized discussion threads\n- **Category Organization** - Structure your forum with customizable categories and headers\n- **Rich Text Formatting** - Use BBCode for formatting posts with bold, italic, links, images, code blocks and more\n- **File Attachments** - Attach files from your Nextcloud storage to posts\n- **Post Reactions** - React to posts with emoji reactions\n- **Read/Unread Tracking** - Keep track of which threads you've read\n- **Search** - Find discussions quickly with built-in search\n- **User Profiles** - View user post history and statistics\n- **Role-Based Permissions** - Control access and moderation with flexible roles\n- **Guest Access**: Optional public access for unauthenticated users with configurable permissions\n- **Admin Tools** - Manage categories, roles, BBCodes and forum settings\n- **Moderation Tools** - Pin, lock and manage threads and posts\n\n**Perfect for:**\n- Team discussions and collaboration\n- Community forums\n- Support channels\n- Knowledge bases\n- Project discussions\n- Internal communication\n\nThe forum integrates seamlessly with your Nextcloud instance, using your existing users and groups for authentication and access control." : "Crie discussões, partilhe ideias e colabore com a sua comunidade diretamente no Nextcloud.\n\n**⚠️ Aviso de Desenvolvimento Inicial:**\nEsta aplicação está em fase inicial de desenvolvimento. Embora funcional, pode encontrar bugs ou funcionalidades incompletas. Por favor, comunique quaisquer problemas no GitHub e considere fazer cópias de segurança dos seus dados regularmente.\n\n**Principais características:**\n- **Discussões sobre tópicos** - Crie e responda a tópicos de discussão organizados\n- **Organização por categorias** - Estruture o seu fórum com categorias e cabeçalhos personalizáveis\n- **Formatação de texto avançada** - Utilize o BBCode para formatar as publicações com negrito, itálico, links, imagens, blocos de código e muito mais\n- **Anexos de ficheiros** - Anexe ficheiros do seu armazenamento Nextcloud às publicações\n- **Reações às publicações** - Reagir às publicações com emojis\n- **Controlo de leitura/não leitura** - Acompanhe quais os tópicos que já leu\n- **Pesquisa** - Encontre discussões rapidamente com a pesquisa integrada\n- **Perfis de utilizador** - Visualize o histórico de publicações e as estatísticas do utilizador\n- **Permissões baseadas em funções** - Controle o acesso e a moderação com funções flexíveis\n- **Acesso de convidado**: Acesso público opcional para utilizadores não autenticados com permissões configuráveis\n- **Ferramentas de administração** - Gerir categorias, funções, BBCodes e definições do fórum\n- **Ferramentas de moderação** - Fixar, bloquear e gerir tópicos e publicações\n\n**Ideal para:**\n- Discussões e colaboração em equipa\n- Fóruns da comunidade\n- Canais de suporte\n- Bases de conhecimento\n- Discussões sobre projetos\n- Comunicação interna\n\nO fórum integra-se perfeitamente na sua instância do Nextcloud, utilizando os seus utilizadores e grupos existentes para autenticação e controlo de acesso.",
|
||||
"Search" : "Pesquisa sobre",
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
"Hidden content" : "Conteúdo oculto",
|
||||
"Spoilers" : "Contém spoilers",
|
||||
"Attachment" : "Anexo",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo aos Fóruns Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Bem-vindo aos Fóruns do Nextcloud!",
|
||||
"Bold text" : "Texto a negrito",
|
||||
"Underlined text" : "Texto sublinhado",
|
||||
"Welcome to Nextcloud Forums" : "Bem-vindo aos Fóruns Nextcloud",
|
||||
"Forum" : "Fórum",
|
||||
"Create discussions, share ideas and collaborate with your community directly in Nextcloud.\n\n**⚠️ Early Development Notice:**\nThis app is in early stages of development. While functional, you may encounter bugs or incomplete features. Please report any issues on GitHub and consider backing up your data regularly.\n\n**Key features:**\n- **Thread-based Discussions** - Create and reply to organized discussion threads\n- **Category Organization** - Structure your forum with customizable categories and headers\n- **Rich Text Formatting** - Use BBCode for formatting posts with bold, italic, links, images, code blocks and more\n- **File Attachments** - Attach files from your Nextcloud storage to posts\n- **Post Reactions** - React to posts with emoji reactions\n- **Read/Unread Tracking** - Keep track of which threads you've read\n- **Search** - Find discussions quickly with built-in search\n- **User Profiles** - View user post history and statistics\n- **Role-Based Permissions** - Control access and moderation with flexible roles\n- **Guest Access**: Optional public access for unauthenticated users with configurable permissions\n- **Admin Tools** - Manage categories, roles, BBCodes and forum settings\n- **Moderation Tools** - Pin, lock and manage threads and posts\n\n**Perfect for:**\n- Team discussions and collaboration\n- Community forums\n- Support channels\n- Knowledge bases\n- Project discussions\n- Internal communication\n\nThe forum integrates seamlessly with your Nextcloud instance, using your existing users and groups for authentication and access control." : "Crie discussões, partilhe ideias e colabore com a sua comunidade diretamente no Nextcloud.\n\n**⚠️ Aviso de Desenvolvimento Inicial:**\nEsta aplicação está em fase inicial de desenvolvimento. Embora funcional, pode encontrar bugs ou funcionalidades incompletas. Por favor, comunique quaisquer problemas no GitHub e considere fazer cópias de segurança dos seus dados regularmente.\n\n**Principais características:**\n- **Discussões sobre tópicos** - Crie e responda a tópicos de discussão organizados\n- **Organização por categorias** - Estruture o seu fórum com categorias e cabeçalhos personalizáveis\n- **Formatação de texto avançada** - Utilize o BBCode para formatar as publicações com negrito, itálico, links, imagens, blocos de código e muito mais\n- **Anexos de ficheiros** - Anexe ficheiros do seu armazenamento Nextcloud às publicações\n- **Reações às publicações** - Reagir às publicações com emojis\n- **Controlo de leitura/não leitura** - Acompanhe quais os tópicos que já leu\n- **Pesquisa** - Encontre discussões rapidamente com a pesquisa integrada\n- **Perfis de utilizador** - Visualize o histórico de publicações e as estatísticas do utilizador\n- **Permissões baseadas em funções** - Controle o acesso e a moderação com funções flexíveis\n- **Acesso de convidado**: Acesso público opcional para utilizadores não autenticados com permissões configuráveis\n- **Ferramentas de administração** - Gerir categorias, funções, BBCodes e definições do fórum\n- **Ferramentas de moderação** - Fixar, bloquear e gerir tópicos e publicações\n\n**Ideal para:**\n- Discussões e colaboração em equipa\n- Fóruns da comunidade\n- Canais de suporte\n- Bases de conhecimento\n- Discussões sobre projetos\n- Comunicação interna\n\nO fórum integra-se perfeitamente na sua instância do Nextcloud, utilizando os seus utilizadores e grupos existentes para autenticação e controlo de acesso.",
|
||||
"Search" : "Pesquisa sobre",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Скрытый контент",
|
||||
"Spoilers" : "Спойлеры",
|
||||
"Attachment" : "Вложение",
|
||||
"Welcome to Nextcloud Forums" : "Добро пожаловать на форумы Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Добро пожаловать на форумы Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Это форум, созданный сообществом и встроенный прямо в ваш экземпляр Nextcloud. Здесь вы можете обсуждать темы, делиться идеями и сотрудничать с другими пользователями.",
|
||||
"Features:" : "Функции:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Курсивный текст",
|
||||
"Underlined text" : "Подчеркнутый текст",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Не стесняйтесь начинать новое обсуждение или отвечать на уже существующие. Удачной публикации!",
|
||||
"Welcome to Nextcloud Forums" : "Добро пожаловать на форумы Nextcloud",
|
||||
"Forum" : "Форум",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} новый ответ в {thread}","{count} новых ответов в {thread}","{count} новых ответов в {thread}","{count} новых ответов в {thread}"],
|
||||
"Welcome to the forum!" : "Добро пожаловать на форум!",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Скрытый контент",
|
||||
"Spoilers" : "Спойлеры",
|
||||
"Attachment" : "Вложение",
|
||||
"Welcome to Nextcloud Forums" : "Добро пожаловать на форумы Nextcloud",
|
||||
"Welcome to the Nextcloud Forums!" : "Добро пожаловать на форумы Nextcloud!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Это форум, созданный сообществом и встроенный прямо в ваш экземпляр Nextcloud. Здесь вы можете обсуждать темы, делиться идеями и сотрудничать с другими пользователями.",
|
||||
"Features:" : "Функции:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Курсивный текст",
|
||||
"Underlined text" : "Подчеркнутый текст",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Не стесняйтесь начинать новое обсуждение или отвечать на уже существующие. Удачной публикации!",
|
||||
"Welcome to Nextcloud Forums" : "Добро пожаловать на форумы Nextcloud",
|
||||
"Forum" : "Форум",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} новый ответ в {thread}","{count} новых ответов в {thread}","{count} новых ответов в {thread}","{count} новых ответов в {thread}"],
|
||||
"Welcome to the forum!" : "Добро пожаловать на форум!",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Maudhui yaliyofichika",
|
||||
"Spoilers" : "Waharibifu",
|
||||
"Attachment" : "Kiambatisho",
|
||||
"Welcome to Nextcloud Forums" : "Karibu kwenye jukwaa la Nextcloud ",
|
||||
"Welcome to the Nextcloud Forums!" : "Karibu kwenye majukwaa ya Nextcloud! ",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Hili ni jukwaa linaloendeshwa na jamii lililojengwa ndani ya mfano wako wa Nextcloud. Hapa unaweza kujadili mada, kushiriki mawazo na kushirikiana na watumiaji wengine.",
|
||||
"Features:" : "Sifa:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Maandishi ya italiki",
|
||||
"Underlined text" : "Maandishi yaliyopigiwa mstari",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Jisikie huru kuanzisha mjadala mpya au kujibu mazungumzo yaliyopo. Furaha ya kuchapisha!",
|
||||
"Welcome to Nextcloud Forums" : "Karibu kwenye jukwaa la Nextcloud ",
|
||||
"Forum" : "Jukwaa",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} new reply in {thread}","{count} majibu mapya ndani {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} amekutaja katika {thread}",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Maudhui yaliyofichika",
|
||||
"Spoilers" : "Waharibifu",
|
||||
"Attachment" : "Kiambatisho",
|
||||
"Welcome to Nextcloud Forums" : "Karibu kwenye jukwaa la Nextcloud ",
|
||||
"Welcome to the Nextcloud Forums!" : "Karibu kwenye majukwaa ya Nextcloud! ",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Hili ni jukwaa linaloendeshwa na jamii lililojengwa ndani ya mfano wako wa Nextcloud. Hapa unaweza kujadili mada, kushiriki mawazo na kushirikiana na watumiaji wengine.",
|
||||
"Features:" : "Sifa:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Maandishi ya italiki",
|
||||
"Underlined text" : "Maandishi yaliyopigiwa mstari",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Jisikie huru kuanzisha mjadala mpya au kujibu mazungumzo yaliyopo. Furaha ya kuchapisha!",
|
||||
"Welcome to Nextcloud Forums" : "Karibu kwenye jukwaa la Nextcloud ",
|
||||
"Forum" : "Jukwaa",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{count} new reply in {thread}","{count} majibu mapya ndani {thread}"],
|
||||
"{user} mentioned you in {thread}" : "{user} amekutaja katika {thread}",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "Gizli içerik",
|
||||
"Spoilers" : "Alıntılar",
|
||||
"Attachment" : "Ek dosya",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud forumuna hoş geldiniz",
|
||||
"Welcome to the Nextcloud Forums!" : "Nextcloud forumuna hoş geldiniz!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Bu, doğrudan Nextcloud kopyanızda bulunan topluluk odaklı bir forumdur. Burada konuları tartışabilir, fikirleri paylaşabilir ve diğer kullanıcılarla iş birliği yapabilirsiniz.",
|
||||
"Features:" : "Özellikler:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "Yatık yazı",
|
||||
"Underlined text" : "Altı çizili yazı",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Yeni bir tartışma başlatmaktan veya var olan konulara yanıt vermekten çekinmeyin. Mutlu yazışmalar!",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud forumuna hoş geldiniz",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} konusunda {count} yeni yanıt","{thread} konusunda {count} yeni yanıt"],
|
||||
"{user} mentioned you in {thread}" : "{user} sizi {thread} konusunda andı",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "Gizli içerik",
|
||||
"Spoilers" : "Alıntılar",
|
||||
"Attachment" : "Ek dosya",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud forumuna hoş geldiniz",
|
||||
"Welcome to the Nextcloud Forums!" : "Nextcloud forumuna hoş geldiniz!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "Bu, doğrudan Nextcloud kopyanızda bulunan topluluk odaklı bir forumdur. Burada konuları tartışabilir, fikirleri paylaşabilir ve diğer kullanıcılarla iş birliği yapabilirsiniz.",
|
||||
"Features:" : "Özellikler:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "Yatık yazı",
|
||||
"Underlined text" : "Altı çizili yazı",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "Yeni bir tartışma başlatmaktan veya var olan konulara yanıt vermekten çekinmeyin. Mutlu yazışmalar!",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud forumuna hoş geldiniz",
|
||||
"Forum" : "Forum",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} konusunda {count} yeni yanıt","{thread} konusunda {count} yeni yanıt"],
|
||||
"{user} mentioned you in {thread}" : "{user} sizi {thread} konusunda andı",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "يوشۇرۇن مەزمۇن",
|
||||
"Spoilers" : "بۇزغۇنچىلار",
|
||||
"Attachment" : "قوشۇمچە",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud مۇنبىرىگە خۇش كەپسىز",
|
||||
"Welcome to the Nextcloud Forums!" : "Nextcloud مۇنبىرىگە خۇش كەپسىز!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "بۇ Nextcloud ئۈلگىڭىزگە قۇرۇلغان مەھەللە باشلامچىلىق قىلغان مۇنبەر. بۇ يەردە سىز تېمىلارنى مۇزاكىرە قىلالايسىز، پىكىر ئورتاقلىشالايسىز ۋە باشقا ئىشلەتكۈچىلەر بىلەن ھەمكارلىشالايسىز.",
|
||||
"Features:" : "ئالاھىدىلىكلىرى:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "قىيسىق تېكىست",
|
||||
"Underlined text" : "ئاستى سىزىقلىق تېكىست",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "يېڭى مۇنازىرە باشلىسىڭىز ياكى مەۋجۇت تېمىلارغا جاۋاب قايتۇرسىڭىز بولىدۇ. خەيرلىك يوللاڭ!",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud مۇنبىرىگە خۇش كەپسىز",
|
||||
"Forum" : "مۇنبەر",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} دا {count} يېڭى جاۋاپ","{thread} دا {count} يېڭى جاۋاپ"],
|
||||
"{user} mentioned you in {thread}" : "{user} سىزنى {thread} دا تىلغا ئالدى",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "يوشۇرۇن مەزمۇن",
|
||||
"Spoilers" : "بۇزغۇنچىلار",
|
||||
"Attachment" : "قوشۇمچە",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud مۇنبىرىگە خۇش كەپسىز",
|
||||
"Welcome to the Nextcloud Forums!" : "Nextcloud مۇنبىرىگە خۇش كەپسىز!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "بۇ Nextcloud ئۈلگىڭىزگە قۇرۇلغان مەھەللە باشلامچىلىق قىلغان مۇنبەر. بۇ يەردە سىز تېمىلارنى مۇزاكىرە قىلالايسىز، پىكىر ئورتاقلىشالايسىز ۋە باشقا ئىشلەتكۈچىلەر بىلەن ھەمكارلىشالايسىز.",
|
||||
"Features:" : "ئالاھىدىلىكلىرى:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "قىيسىق تېكىست",
|
||||
"Underlined text" : "ئاستى سىزىقلىق تېكىست",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "يېڭى مۇنازىرە باشلىسىڭىز ياكى مەۋجۇت تېمىلارغا جاۋاب قايتۇرسىڭىز بولىدۇ. خەيرلىك يوللاڭ!",
|
||||
"Welcome to Nextcloud Forums" : "Nextcloud مۇنبىرىگە خۇش كەپسىز",
|
||||
"Forum" : "مۇنبەر",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} دا {count} يېڭى جاۋاپ","{thread} دا {count} يېڭى جاۋاپ"],
|
||||
"{user} mentioned you in {thread}" : "{user} سىزنى {thread} دا تىلغا ئالدى",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "隱藏的內容",
|
||||
"Spoilers" : "劇透",
|
||||
"Attachment" : "附件",
|
||||
"Welcome to Nextcloud Forums" : "歡迎來到 Nextcloud 論壇",
|
||||
"Welcome to the Nextcloud Forums!" : "歡迎來到 Nextcloud 論壇!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "這是一個直接建置在你 Nextcloud 實例之中的社群主導論壇。你可以在這裡討論各種主題、分享意見,並與其他用戶協作。",
|
||||
"Features:" : "功能:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "斜體文字",
|
||||
"Underlined text" : "下面畫線的文字",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "歡迎隨時開啟新討論或回覆現有主題,玩得開心!",
|
||||
"Welcome to Nextcloud Forums" : "歡迎來到 Nextcloud 論壇",
|
||||
"Forum" : "論壇",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} 中有 {count} 個新回覆"],
|
||||
"{user} mentioned you in {thread}" : "{user} 在 {thread} 中提及您",
|
||||
@@ -282,6 +282,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "設定你接收通知的方式",
|
||||
"Auto-subscribe to threads I create" : "自動訂閱由我建立的主題",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "啟用後,你會自動收到針對你所建立主題之回覆通知。",
|
||||
"Auto-subscribe to threads I reply to" : "自動訂閱我回覆的討論串",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "啟用後,您將會自動收到您回覆過的討論串中的新回覆通知",
|
||||
"Files" : "檔案",
|
||||
"Configure file upload settings" : "配置檔案上傳設定",
|
||||
"Upload directory" : "上載目錄",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "隱藏的內容",
|
||||
"Spoilers" : "劇透",
|
||||
"Attachment" : "附件",
|
||||
"Welcome to Nextcloud Forums" : "歡迎來到 Nextcloud 論壇",
|
||||
"Welcome to the Nextcloud Forums!" : "歡迎來到 Nextcloud 論壇!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "這是一個直接建置在你 Nextcloud 實例之中的社群主導論壇。你可以在這裡討論各種主題、分享意見,並與其他用戶協作。",
|
||||
"Features:" : "功能:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "斜體文字",
|
||||
"Underlined text" : "下面畫線的文字",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "歡迎隨時開啟新討論或回覆現有主題,玩得開心!",
|
||||
"Welcome to Nextcloud Forums" : "歡迎來到 Nextcloud 論壇",
|
||||
"Forum" : "論壇",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} 中有 {count} 個新回覆"],
|
||||
"{user} mentioned you in {thread}" : "{user} 在 {thread} 中提及您",
|
||||
@@ -280,6 +280,8 @@
|
||||
"Configure how you receive notifications" : "設定你接收通知的方式",
|
||||
"Auto-subscribe to threads I create" : "自動訂閱由我建立的主題",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "啟用後,你會自動收到針對你所建立主題之回覆通知。",
|
||||
"Auto-subscribe to threads I reply to" : "自動訂閱我回覆的討論串",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "啟用後,您將會自動收到您回覆過的討論串中的新回覆通知",
|
||||
"Files" : "檔案",
|
||||
"Configure file upload settings" : "配置檔案上傳設定",
|
||||
"Upload directory" : "上載目錄",
|
||||
|
||||
@@ -20,7 +20,6 @@ OC.L10N.register(
|
||||
"Hidden content" : "隱藏內容",
|
||||
"Spoilers" : "劇透",
|
||||
"Attachment" : "附件",
|
||||
"Welcome to Nextcloud Forums" : "歡迎使用 Nextcloud 論壇",
|
||||
"Welcome to the Nextcloud Forums!" : "歡迎使用 Nextcloud 論壇!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "這是內建於您的 Nextcloud 站台中的社群驅動論壇。在此您可以討論主題、分享想法,並與其他使用者協作。",
|
||||
"Features:" : "功能:",
|
||||
@@ -36,6 +35,7 @@ OC.L10N.register(
|
||||
"Italic text" : "斜體文字",
|
||||
"Underlined text" : "有底線的文字",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "歡迎隨時開啟新討論或回覆現有主題。祝您發文愉快!",
|
||||
"Welcome to Nextcloud Forums" : "歡迎使用 Nextcloud 論壇",
|
||||
"Forum" : "論壇",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} 中有 {count} 個新回覆"],
|
||||
"{user} mentioned you in {thread}" : "{user} 在 {thread} 中提及您",
|
||||
@@ -282,6 +282,8 @@ OC.L10N.register(
|
||||
"Configure how you receive notifications" : "設定您要如何接收通知",
|
||||
"Auto-subscribe to threads I create" : "自動訂閱我建立的討論串",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "啟用後,您會自動收到您所建立的討論串回覆的通知",
|
||||
"Auto-subscribe to threads I reply to" : "自動訂閱我回覆的討論串",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "啟用後,您將會自動收到您回覆過的討論串中的新回覆通知",
|
||||
"Files" : "檔案",
|
||||
"Configure file upload settings" : "設定檔案上傳設定",
|
||||
"Upload directory" : "上傳目錄",
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"Hidden content" : "隱藏內容",
|
||||
"Spoilers" : "劇透",
|
||||
"Attachment" : "附件",
|
||||
"Welcome to Nextcloud Forums" : "歡迎使用 Nextcloud 論壇",
|
||||
"Welcome to the Nextcloud Forums!" : "歡迎使用 Nextcloud 論壇!",
|
||||
"This is a community-driven forum built right into your Nextcloud instance. Here you can discuss topics, share ideas and collaborate with other users." : "這是內建於您的 Nextcloud 站台中的社群驅動論壇。在此您可以討論主題、分享想法,並與其他使用者協作。",
|
||||
"Features:" : "功能:",
|
||||
@@ -34,6 +33,7 @@
|
||||
"Italic text" : "斜體文字",
|
||||
"Underlined text" : "有底線的文字",
|
||||
"Feel free to start a new discussion or reply to existing threads. Happy posting!" : "歡迎隨時開啟新討論或回覆現有主題。祝您發文愉快!",
|
||||
"Welcome to Nextcloud Forums" : "歡迎使用 Nextcloud 論壇",
|
||||
"Forum" : "論壇",
|
||||
"_{count} new reply in {thread}_::_{count} new replies in {thread}_" : ["{thread} 中有 {count} 個新回覆"],
|
||||
"{user} mentioned you in {thread}" : "{user} 在 {thread} 中提及您",
|
||||
@@ -280,6 +280,8 @@
|
||||
"Configure how you receive notifications" : "設定您要如何接收通知",
|
||||
"Auto-subscribe to threads I create" : "自動訂閱我建立的討論串",
|
||||
"When enabled, you will automatically receive notifications for replies to threads you create" : "啟用後,您會自動收到您所建立的討論串回覆的通知",
|
||||
"Auto-subscribe to threads I reply to" : "自動訂閱我回覆的討論串",
|
||||
"When enabled, you will automatically receive notifications for new replies in threads you have replied to" : "啟用後,您將會自動收到您回覆過的討論串中的新回覆通知",
|
||||
"Files" : "檔案",
|
||||
"Configure file upload settings" : "設定檔案上傳設定",
|
||||
"Upload directory" : "上傳目錄",
|
||||
|
||||
@@ -22,6 +22,7 @@ class SeedHelper {
|
||||
*/
|
||||
public static function seedAll($output = null, bool $throwOnError = false): void {
|
||||
$logger = \OC::$server->get(\Psr\Log\LoggerInterface::class);
|
||||
$db = \OC::$server->get(\OCP\IDBConnection::class);
|
||||
$logger->info('Forum seeding: Starting data seed/repair');
|
||||
|
||||
if ($output) {
|
||||
@@ -40,6 +41,8 @@ class SeedHelper {
|
||||
if ($output) {
|
||||
$output->warning(' Failed to ensure forum_users table: ' . $e->getMessage());
|
||||
}
|
||||
// Try to recover connection state for PostgreSQL
|
||||
self::recoverConnectionState($db, $logger);
|
||||
}
|
||||
|
||||
// Each function checks its own state and returns early if already seeded
|
||||
@@ -58,10 +61,14 @@ class SeedHelper {
|
||||
|
||||
foreach ($seedOperations as $name => $operation) {
|
||||
try {
|
||||
// Before each operation, ensure connection is in a clean state
|
||||
self::recoverConnectionState($db, $logger);
|
||||
$operation();
|
||||
} catch (\Exception $e) {
|
||||
$errors[] = "$name: " . $e->getMessage();
|
||||
$logger->error("Forum seeding: $name failed", ['exception' => $e->getMessage()]);
|
||||
// Try to recover connection state for next operation (especially important for PostgreSQL)
|
||||
self::recoverConnectionState($db, $logger);
|
||||
// Continue with other operations - don't let one failure block others
|
||||
}
|
||||
}
|
||||
@@ -86,6 +93,33 @@ class SeedHelper {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Recover database connection state after an error
|
||||
* On PostgreSQL, a failed query aborts the entire transaction, and subsequent queries fail.
|
||||
* This method attempts to rollback any open transactions to restore a usable connection state.
|
||||
*
|
||||
* @param \OCP\IDBConnection $db Database connection
|
||||
* @param \Psr\Log\LoggerInterface $logger Logger instance
|
||||
*/
|
||||
private static function recoverConnectionState(\OCP\IDBConnection $db, \Psr\Log\LoggerInterface $logger): void {
|
||||
try {
|
||||
// If we're in a transaction, try to roll back to recover the connection
|
||||
while ($db->inTransaction()) {
|
||||
try {
|
||||
$db->rollBack();
|
||||
$logger->debug('Forum seeding: Rolled back transaction to recover connection state');
|
||||
} catch (\Exception $e) {
|
||||
// If rollback fails, the connection might be in an unrecoverable state
|
||||
$logger->warning('Forum seeding: Failed to rollback transaction during recovery', ['exception' => $e->getMessage()]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Ignore errors when checking transaction state
|
||||
$logger->debug('Forum seeding: Error checking transaction state', ['exception' => $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Public wrapper for ensureForumUsersTable for use in migrations
|
||||
*
|
||||
@@ -309,7 +343,8 @@ class SeedHelper {
|
||||
$output->info(' → Creating default roles...');
|
||||
}
|
||||
|
||||
$db->beginTransaction();
|
||||
// Note: We don't use explicit transactions here to avoid PostgreSQL transaction abort cascade.
|
||||
// Each INSERT is independent and idempotent, so partial success is acceptable.
|
||||
$rolesCreated = 0;
|
||||
|
||||
// Define roles by role_type (not hardcoded IDs)
|
||||
@@ -354,26 +389,29 @@ class SeedHelper {
|
||||
|
||||
foreach ($rolesToCreate as $roleType => $roleData) {
|
||||
if (!in_array($roleType, $existingTypes)) {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_roles')
|
||||
->values([
|
||||
'name' => $qb->createNamedParameter($roleData['name']),
|
||||
'description' => $qb->createNamedParameter($roleData['description']),
|
||||
'can_access_admin_tools' => $qb->createNamedParameter($roleData['can_access_admin_tools'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_edit_roles' => $qb->createNamedParameter($roleData['can_edit_roles'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_edit_categories' => $qb->createNamedParameter($roleData['can_edit_categories'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'is_system_role' => $qb->createNamedParameter($roleData['is_system_role'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'role_type' => $qb->createNamedParameter($roleData['role_type'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_STR),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$rolesCreated++;
|
||||
$logger->info("Forum seeding: Created role with type '$roleType'");
|
||||
try {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_roles')
|
||||
->values([
|
||||
'name' => $qb->createNamedParameter($roleData['name']),
|
||||
'description' => $qb->createNamedParameter($roleData['description']),
|
||||
'can_access_admin_tools' => $qb->createNamedParameter($roleData['can_access_admin_tools'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_edit_roles' => $qb->createNamedParameter($roleData['can_edit_roles'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_edit_categories' => $qb->createNamedParameter($roleData['can_edit_categories'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'is_system_role' => $qb->createNamedParameter($roleData['is_system_role'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'role_type' => $qb->createNamedParameter($roleData['role_type'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_STR),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$rolesCreated++;
|
||||
$logger->info("Forum seeding: Created role with type '$roleType'");
|
||||
} catch (\Exception $e) {
|
||||
// Log but continue - other roles might succeed
|
||||
$logger->warning("Forum seeding: Failed to create role '$roleType': " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
|
||||
// Validate that critical roles can be found by role_type after creation
|
||||
// Note: We query directly instead of using RoleMapper to avoid MultipleObjectsReturnedException
|
||||
// if duplicates somehow exist (the cleanup migration should have removed them, but be defensive)
|
||||
@@ -408,9 +446,6 @@ class SeedHelper {
|
||||
$output->info(" ✓ Created $rolesCreated default roles (Admin, Moderator, User, Guest)");
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to create default roles', [
|
||||
'exception' => $e->getMessage(),
|
||||
]);
|
||||
@@ -503,7 +538,7 @@ class SeedHelper {
|
||||
$userAccessibleCategories = $result->fetchAll();
|
||||
$result->closeCursor();
|
||||
|
||||
$db->beginTransaction();
|
||||
// Note: No explicit transaction - each INSERT auto-commits to avoid PostgreSQL transaction abort cascade
|
||||
$categoriesGranted = 0;
|
||||
foreach ($userAccessibleCategories as $categoryRow) {
|
||||
$categoryId = (int)$categoryRow['category_id'];
|
||||
@@ -519,30 +554,31 @@ class SeedHelper {
|
||||
$result->closeCursor();
|
||||
|
||||
if (!$permExists) {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_category_perms')
|
||||
->values([
|
||||
'category_id' => $qb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'role_id' => $qb->createNamedParameter($guestRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'can_view' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_post' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_reply' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_moderate' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
])
|
||||
->executeStatement();
|
||||
$categoriesGranted++;
|
||||
try {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_category_perms')
|
||||
->values([
|
||||
'category_id' => $qb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'role_id' => $qb->createNamedParameter($guestRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'can_view' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_post' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_reply' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_moderate' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
])
|
||||
->executeStatement();
|
||||
$categoriesGranted++;
|
||||
} catch (\Exception $e) {
|
||||
// Log but continue - other categories might succeed
|
||||
$logger->warning("Forum seeding: Failed to set guest permission for category $categoryId: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
$logger->info('Forum seeding: Set guest role view-only permissions for ' . $categoriesGranted . ' categories (matching User role access)');
|
||||
if ($output) {
|
||||
$output->info(' ✓ Set guest role view-only permissions for ' . $categoriesGranted . ' categories');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to set guest role permissions', [
|
||||
'exception' => $e->getMessage(),
|
||||
]);
|
||||
@@ -586,8 +622,7 @@ class SeedHelper {
|
||||
$output->info(' → Creating category headers...');
|
||||
}
|
||||
|
||||
$db->beginTransaction();
|
||||
|
||||
// Note: No explicit transaction - single INSERT auto-commits
|
||||
// Create "General" category header
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_cat_headers')
|
||||
@@ -599,15 +634,11 @@ class SeedHelper {
|
||||
])
|
||||
->executeStatement();
|
||||
|
||||
$db->commit();
|
||||
$logger->info('Forum seeding: Created category headers');
|
||||
if ($output) {
|
||||
$output->info(' ✓ Created category headers');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to create category headers', [
|
||||
'exception' => $e->getMessage(),
|
||||
]);
|
||||
@@ -653,7 +684,7 @@ class SeedHelper {
|
||||
}
|
||||
|
||||
$headerId = (int)$header['id'];
|
||||
$db->beginTransaction();
|
||||
// Note: No explicit transaction - each INSERT auto-commits to avoid PostgreSQL transaction abort cascade
|
||||
$categoriesCreated = 0;
|
||||
|
||||
// Check if "General Discussions" category exists
|
||||
@@ -666,22 +697,26 @@ class SeedHelper {
|
||||
$result->closeCursor();
|
||||
|
||||
if (!$exists) {
|
||||
// Create "General Discussions" category
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_categories')
|
||||
->values([
|
||||
'header_id' => $qb->createNamedParameter($headerId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'name' => $qb->createNamedParameter($l->t('General discussions')),
|
||||
'description' => $qb->createNamedParameter($l->t('A place for general conversations and discussions')),
|
||||
'slug' => $qb->createNamedParameter('general-discussions'),
|
||||
'sort_order' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'thread_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'post_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'updated_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$categoriesCreated++;
|
||||
try {
|
||||
// Create "General Discussions" category
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_categories')
|
||||
->values([
|
||||
'header_id' => $qb->createNamedParameter($headerId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'name' => $qb->createNamedParameter($l->t('General discussions')),
|
||||
'description' => $qb->createNamedParameter($l->t('A place for general conversations and discussions')),
|
||||
'slug' => $qb->createNamedParameter('general-discussions'),
|
||||
'sort_order' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'thread_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'post_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'updated_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$categoriesCreated++;
|
||||
} catch (\Exception $e) {
|
||||
$logger->warning('Forum seeding: Failed to create General Discussions category: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// Check if "Support" category exists
|
||||
@@ -694,33 +729,33 @@ class SeedHelper {
|
||||
$result->closeCursor();
|
||||
|
||||
if (!$exists) {
|
||||
// Create "Support" category
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_categories')
|
||||
->values([
|
||||
'header_id' => $qb->createNamedParameter($headerId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'name' => $qb->createNamedParameter($l->t('Support')),
|
||||
'description' => $qb->createNamedParameter($l->t('Ask questions about the forum, provide feedback or report issues.')),
|
||||
'slug' => $qb->createNamedParameter('support'),
|
||||
'sort_order' => $qb->createNamedParameter(1, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'thread_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'post_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'updated_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$categoriesCreated++;
|
||||
try {
|
||||
// Create "Support" category
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_categories')
|
||||
->values([
|
||||
'header_id' => $qb->createNamedParameter($headerId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'name' => $qb->createNamedParameter($l->t('Support')),
|
||||
'description' => $qb->createNamedParameter($l->t('Ask questions about the forum, provide feedback or report issues.')),
|
||||
'slug' => $qb->createNamedParameter('support'),
|
||||
'sort_order' => $qb->createNamedParameter(1, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'thread_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'post_count' => $qb->createNamedParameter(0, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'updated_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$categoriesCreated++;
|
||||
} catch (\Exception $e) {
|
||||
$logger->warning('Forum seeding: Failed to create Support category: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
$logger->info("Forum seeding: Created $categoriesCreated default categories");
|
||||
if ($output) {
|
||||
$output->info(" ✓ Created $categoriesCreated default categories (General Discussions, Support)");
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to create default categories', [
|
||||
'exception' => $e->getMessage(),
|
||||
]);
|
||||
@@ -790,7 +825,7 @@ class SeedHelper {
|
||||
$output->info(' → Creating category permissions...');
|
||||
}
|
||||
|
||||
$db->beginTransaction();
|
||||
// Note: No explicit transaction - each INSERT auto-commits to avoid PostgreSQL transaction abort cascade
|
||||
$permissionsCreated = 0;
|
||||
|
||||
// Create permissions for Moderator and User roles (Admin has implicit permissions)
|
||||
@@ -808,18 +843,22 @@ class SeedHelper {
|
||||
$result->closeCursor();
|
||||
|
||||
if (!$exists) {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_category_perms')
|
||||
->values([
|
||||
'category_id' => $qb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'role_id' => $qb->createNamedParameter($moderatorRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'can_view' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_post' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_reply' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_moderate' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
])
|
||||
->executeStatement();
|
||||
$permissionsCreated++;
|
||||
try {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_category_perms')
|
||||
->values([
|
||||
'category_id' => $qb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'role_id' => $qb->createNamedParameter($moderatorRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'can_view' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_post' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_reply' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_moderate' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
])
|
||||
->executeStatement();
|
||||
$permissionsCreated++;
|
||||
} catch (\Exception $e) {
|
||||
$logger->warning("Forum seeding: Failed to create moderator permission for category $categoryId: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// Check and create User role permissions
|
||||
@@ -833,30 +872,30 @@ class SeedHelper {
|
||||
$result->closeCursor();
|
||||
|
||||
if (!$exists) {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_category_perms')
|
||||
->values([
|
||||
'category_id' => $qb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'role_id' => $qb->createNamedParameter($userRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'can_view' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_post' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_reply' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_moderate' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
])
|
||||
->executeStatement();
|
||||
$permissionsCreated++;
|
||||
try {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_category_perms')
|
||||
->values([
|
||||
'category_id' => $qb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'role_id' => $qb->createNamedParameter($userRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
'can_view' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_post' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_reply' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'can_moderate' => $qb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
])
|
||||
->executeStatement();
|
||||
$permissionsCreated++;
|
||||
} catch (\Exception $e) {
|
||||
$logger->warning("Forum seeding: Failed to create user permission for category $categoryId: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
$logger->info("Forum seeding: Created $permissionsCreated category permissions");
|
||||
if ($output) {
|
||||
$output->info(" ✓ Created $permissionsCreated category permissions for " . count($categories) . ' categories');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to create category permissions', [
|
||||
'exception' => $e->getMessage(),
|
||||
]);
|
||||
@@ -883,8 +922,7 @@ class SeedHelper {
|
||||
$output->info(' → Creating default BBCodes...');
|
||||
}
|
||||
|
||||
$db->beginTransaction();
|
||||
|
||||
// Note: No explicit transaction - each INSERT auto-commits to avoid PostgreSQL transaction abort cascade
|
||||
$bbcodes = [
|
||||
[
|
||||
'tag' => 'icode',
|
||||
@@ -927,33 +965,33 @@ class SeedHelper {
|
||||
$result->closeCursor();
|
||||
|
||||
if (!$exists) {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_bbcodes')
|
||||
->values([
|
||||
'tag' => $qb->createNamedParameter($bbcode['tag']),
|
||||
'replacement' => $qb->createNamedParameter($bbcode['replacement']),
|
||||
'example' => $qb->createNamedParameter($bbcode['example']),
|
||||
'description' => $qb->createNamedParameter($bbcode['description']),
|
||||
'enabled' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'parse_inner' => $qb->createNamedParameter($bbcode['parse_inner'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'is_builtin' => $qb->createNamedParameter($bbcode['is_builtin'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'special_handler' => $qb->createNamedParameter($bbcode['special_handler']),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$bbcodesCreated++;
|
||||
try {
|
||||
$qb = $db->getQueryBuilder();
|
||||
$qb->insert('forum_bbcodes')
|
||||
->values([
|
||||
'tag' => $qb->createNamedParameter($bbcode['tag']),
|
||||
'replacement' => $qb->createNamedParameter($bbcode['replacement']),
|
||||
'example' => $qb->createNamedParameter($bbcode['example']),
|
||||
'description' => $qb->createNamedParameter($bbcode['description']),
|
||||
'enabled' => $qb->createNamedParameter(true, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'parse_inner' => $qb->createNamedParameter($bbcode['parse_inner'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'is_builtin' => $qb->createNamedParameter($bbcode['is_builtin'], \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL),
|
||||
'special_handler' => $qb->createNamedParameter($bbcode['special_handler']),
|
||||
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
|
||||
])
|
||||
->executeStatement();
|
||||
$bbcodesCreated++;
|
||||
} catch (\Exception $e) {
|
||||
$logger->warning("Forum seeding: Failed to create BBCode '{$bbcode['tag']}': " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
$logger->info("Forum seeding: Created $bbcodesCreated default BBCodes");
|
||||
if ($output) {
|
||||
$output->info(" ✓ Created $bbcodesCreated default BBCodes (icode, spoiler, attachment)");
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to create default BBCodes', [
|
||||
'exception' => $e->getMessage(),
|
||||
]);
|
||||
@@ -1108,6 +1146,9 @@ class SeedHelper {
|
||||
$logger = \OC::$server->get(\Psr\Log\LoggerInterface::class);
|
||||
$timestamp = time();
|
||||
|
||||
// Recover connection state before starting (important for PostgreSQL)
|
||||
self::recoverConnectionState($db, $logger);
|
||||
|
||||
try {
|
||||
// Check if welcome thread already exists
|
||||
$qb = $db->getQueryBuilder();
|
||||
@@ -1159,6 +1200,42 @@ class SeedHelper {
|
||||
}
|
||||
});
|
||||
|
||||
// Check if slug column still exists BEFORE starting transaction
|
||||
// (for backwards compatibility with old migrations)
|
||||
// On PostgreSQL, a failed query inside a transaction aborts the entire transaction,
|
||||
// so we must check column existence outside the transaction
|
||||
$hasSlugColumn = true;
|
||||
try {
|
||||
$checkQb = $db->getQueryBuilder();
|
||||
$checkQb->select('slug')->from('forum_posts')->setMaxResults(1);
|
||||
$checkQb->executeQuery()->closeCursor();
|
||||
} catch (\Exception $e) {
|
||||
$hasSlugColumn = false;
|
||||
// Recover connection state after the failed query (important for PostgreSQL)
|
||||
self::recoverConnectionState($db, $logger);
|
||||
}
|
||||
|
||||
// Prepare welcome post content
|
||||
$welcomeContent = $l->t('Welcome to the Nextcloud Forums!') . "\n\n"
|
||||
. $l->t('This is a community-driven forum built right into your Nextcloud instance. '
|
||||
. 'Here you can discuss topics, share ideas and collaborate with other users.') . "\n\n"
|
||||
. '[b]' . $l->t('Features:') . "[/b]\n"
|
||||
. "[list]\n"
|
||||
. '[*]' . $l->t('Create and reply to threads') . "\n"
|
||||
. '[*]' . $l->t('Organize discussions by categories') . "\n"
|
||||
. '[*]' . $l->t('Use BBCode for rich text formatting') . "\n"
|
||||
. '[*]' . $l->t('Attach files from your Nextcloud storage') . "\n"
|
||||
. '[*]' . $l->t('React to posts') . "\n"
|
||||
. '[*]' . $l->t('Track read/unread threads') . "\n\n"
|
||||
. "[/list]\n"
|
||||
. '[b]' . $l->t('BBCode examples:') . "[/b]\n"
|
||||
. "[list]\n"
|
||||
. '[*][b]' . $l->t('Bold text') . '[/b] - ' . $l->t('Use %1$stext%2$s', ['[icode][b]', '[/b][/icode]']) . "\n"
|
||||
. '[*][i]' . $l->t('Italic text') . '[/i] - ' . $l->t('Use %1$stext%2$s', ['[icode][i]', '[/i][/icode]']) . "\n"
|
||||
. '[*][u]' . $l->t('Underlined text') . '[/u] - ' . $l->t('Use %1$stext%2$s', ['[icode][u]', '[/u][/icode]']) . "\n\n"
|
||||
. "[/list]\n"
|
||||
. $l->t('Feel free to start a new discussion or reply to existing threads. Happy posting!');
|
||||
|
||||
$db->beginTransaction();
|
||||
|
||||
// Create welcome thread
|
||||
@@ -1181,38 +1258,6 @@ class SeedHelper {
|
||||
->executeStatement();
|
||||
$threadId = $qb->getLastInsertId();
|
||||
|
||||
// Create welcome post
|
||||
$welcomeContent = $l->t('Welcome to the Nextcloud Forums!') . "\n\n"
|
||||
. $l->t('This is a community-driven forum built right into your Nextcloud instance. '
|
||||
. 'Here you can discuss topics, share ideas and collaborate with other users.') . "\n\n"
|
||||
. '[b]' . $l->t('Features:') . "[/b]\n"
|
||||
. "[list]\n"
|
||||
. '[*]' . $l->t('Create and reply to threads') . "\n"
|
||||
. '[*]' . $l->t('Organize discussions by categories') . "\n"
|
||||
. '[*]' . $l->t('Use BBCode for rich text formatting') . "\n"
|
||||
. '[*]' . $l->t('Attach files from your Nextcloud storage') . "\n"
|
||||
. '[*]' . $l->t('React to posts') . "\n"
|
||||
. '[*]' . $l->t('Track read/unread threads') . "\n\n"
|
||||
. "[/list]\n"
|
||||
. '[b]' . $l->t('BBCode examples:') . "[/b]\n"
|
||||
. "[list]\n"
|
||||
. '[*][b]' . $l->t('Bold text') . '[/b] - ' . $l->t('Use %1$stext%2$s', ['[icode][b]', '[/b][/icode]']) . "\n"
|
||||
. '[*][i]' . $l->t('Italic text') . '[/i] - ' . $l->t('Use %1$stext%2$s', ['[icode][i]', '[/i][/icode]']) . "\n"
|
||||
. '[*][u]' . $l->t('Underlined text') . '[/u] - ' . $l->t('Use %1$stext%2$s', ['[icode][u]', '[/u][/icode]']) . "\n\n"
|
||||
. "[/list]\n"
|
||||
. $l->t('Feel free to start a new discussion or reply to existing threads. Happy posting!');
|
||||
|
||||
// Check if slug column still exists (for backwards compatibility with old migrations)
|
||||
// Use a query to check column existence since schema introspection APIs vary
|
||||
$hasSlugColumn = true;
|
||||
try {
|
||||
$checkQb = $db->getQueryBuilder();
|
||||
$checkQb->select('slug')->from('forum_posts')->setMaxResults(1);
|
||||
$checkQb->executeQuery()->closeCursor();
|
||||
} catch (\Exception $e) {
|
||||
$hasSlugColumn = false;
|
||||
}
|
||||
|
||||
// Build post values - slug is optional (removed in Version8)
|
||||
$qb = $db->getQueryBuilder();
|
||||
$postValues = [
|
||||
@@ -1312,8 +1357,13 @@ class SeedHelper {
|
||||
$output->info(' ✓ Created welcome thread');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
// Try to rollback if we're in a transaction - important for PostgreSQL recovery
|
||||
try {
|
||||
if ($db->inTransaction()) {
|
||||
$db->rollBack();
|
||||
}
|
||||
} catch (\Exception $rollbackEx) {
|
||||
$logger->debug('Forum seeding: Failed to rollback after welcome thread error', ['exception' => $rollbackEx->getMessage()]);
|
||||
}
|
||||
$logger->error('Forum seeding: Failed to create welcome thread', [
|
||||
'exception' => $e->getMessage(),
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"@nextcloud/l10n": "^3.4.1",
|
||||
"@nextcloud/router": "^3.1.0",
|
||||
"@nextcloud/vite-config": "2.3.5",
|
||||
"@nextcloud/vue": "^9.3.1",
|
||||
"@nextcloud/vue": "^9.3.3",
|
||||
"date-fns": "^4.1.0",
|
||||
"linkifyjs": "^4.3.2",
|
||||
"vue": "^3.5.26",
|
||||
|
||||
153
pnpm-lock.yaml
generated
153
pnpm-lock.yaml
generated
@@ -25,10 +25,10 @@ importers:
|
||||
version: 3.1.0
|
||||
'@nextcloud/vite-config':
|
||||
specifier: 2.3.5
|
||||
version: 2.3.5(@types/node@20.19.27)(browserslist@4.28.1)(picomatch@4.0.3)(rollup@4.55.1)(sass@1.97.2)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))
|
||||
version: 2.3.5(@types/node@20.19.28)(browserslist@4.28.1)(picomatch@4.0.3)(rollup@4.55.1)(sass@1.97.2)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))
|
||||
'@nextcloud/vue':
|
||||
specifier: ^9.3.1
|
||||
version: 9.3.1(typescript@5.9.2)
|
||||
specifier: ^9.3.3
|
||||
version: 9.3.3(typescript@5.9.2)
|
||||
date-fns:
|
||||
specifier: ^4.1.0
|
||||
version: 4.1.0
|
||||
@@ -56,7 +56,7 @@ importers:
|
||||
version: 3.1.1(stylelint-config-recommended-scss@13.1.0(postcss@8.5.6)(stylelint@16.11.0(typescript@5.9.2)))(stylelint-config-recommended-vue@1.5.0(postcss-html@1.7.0)(stylelint@16.11.0(typescript@5.9.2)))(stylelint@16.11.0(typescript@5.9.2))
|
||||
'@vitejs/plugin-vue':
|
||||
specifier: ^6.0.3
|
||||
version: 6.0.3(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))
|
||||
version: 6.0.3(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))
|
||||
'@vue/test-utils':
|
||||
specifier: ^2.4.6
|
||||
version: 2.4.6
|
||||
@@ -98,13 +98,13 @@ importers:
|
||||
version: 8.52.0(eslint@9.39.2)(typescript@5.9.2)
|
||||
vite:
|
||||
specifier: ^6.4.1
|
||||
version: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
version: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite-plugin-checker:
|
||||
specifier: ^0.12.0
|
||||
version: 0.12.0(eslint@9.39.2)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.11.0(typescript@5.9.2))(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue-tsc@2.2.12(typescript@5.9.2))
|
||||
version: 0.12.0(eslint@9.39.2)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.11.0(typescript@5.9.2))(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue-tsc@2.2.12(typescript@5.9.2))
|
||||
vitest:
|
||||
specifier: ^4.0.16
|
||||
version: 4.0.16(@types/node@20.19.27)(happy-dom@20.1.0)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
version: 4.0.16(@types/node@20.19.28)(happy-dom@20.1.0)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vue-router:
|
||||
specifier: ^4.6.4
|
||||
version: 4.6.4(vue@3.5.26(typescript@5.9.2))
|
||||
@@ -611,8 +611,8 @@ packages:
|
||||
sass: '>=1.60'
|
||||
vite: ^5 || ^6
|
||||
|
||||
'@nextcloud/vue@9.3.1':
|
||||
resolution: {integrity: sha512-zNit83SI7IPT5iT9QsYPCYNwBYvKEqzLvWKTeJemqg9MZ8JGIC3/jjENeXzDolrTN/PixHns5lOYVCejATE1ag==}
|
||||
'@nextcloud/vue@9.3.3':
|
||||
resolution: {integrity: sha512-M/M4L9vp1AJQ8RRk75mbMwUo7sOwWDaTDmAwgpTa9LARDe5e6UBJoMhOmiz5EPkYRHLn2SLE+baOIXVmtVMdqw==}
|
||||
engines: {node: ^20.11.0 || ^22 || ^24}
|
||||
|
||||
'@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
|
||||
@@ -956,8 +956,8 @@ packages:
|
||||
'@types/ms@2.1.0':
|
||||
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
|
||||
|
||||
'@types/node@20.19.27':
|
||||
resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==}
|
||||
'@types/node@20.19.28':
|
||||
resolution: {integrity: sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==}
|
||||
|
||||
'@types/semver@7.7.1':
|
||||
resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==}
|
||||
@@ -1420,8 +1420,8 @@ packages:
|
||||
base64-js@1.5.1:
|
||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||
|
||||
baseline-browser-mapping@2.9.12:
|
||||
resolution: {integrity: sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw==}
|
||||
baseline-browser-mapping@2.9.14:
|
||||
resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==}
|
||||
hasBin: true
|
||||
|
||||
blurhash@2.0.5:
|
||||
@@ -1525,8 +1525,8 @@ packages:
|
||||
cancelable-promise@4.3.1:
|
||||
resolution: {integrity: sha512-A/8PwLk/T7IJDfUdQ68NR24QHa8rIlnN/stiJEBo6dmVUkD4K14LswG0w3VwdeK/o7qOwRUR1k2MhK5Rpy2m7A==}
|
||||
|
||||
caniuse-lite@1.0.30001762:
|
||||
resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==}
|
||||
caniuse-lite@1.0.30001763:
|
||||
resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==}
|
||||
|
||||
ccount@2.0.1:
|
||||
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
|
||||
@@ -2190,8 +2190,8 @@ packages:
|
||||
'@nuxt/kit':
|
||||
optional: true
|
||||
|
||||
focus-trap@7.7.1:
|
||||
resolution: {integrity: sha512-Pkp8m55GjxBLnhBoT6OXdMvfRr4TjMAKLvFM566zlIryq5plbhaTmLAJWTGR0EkRwLjEte1lCOG9MxF1ipJrOg==}
|
||||
focus-trap@7.6.6:
|
||||
resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==}
|
||||
|
||||
follow-redirects@1.15.11:
|
||||
resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
|
||||
@@ -3525,8 +3525,9 @@ packages:
|
||||
engines: {node: '>=14.0.0'}
|
||||
hasBin: true
|
||||
|
||||
sax@1.4.3:
|
||||
resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==}
|
||||
sax@1.4.4:
|
||||
resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
|
||||
engines: {node: '>=11.0.0'}
|
||||
|
||||
semver@6.3.1:
|
||||
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
|
||||
@@ -4587,7 +4588,7 @@ snapshots:
|
||||
|
||||
'@file-type/xml@0.4.4':
|
||||
dependencies:
|
||||
sax: 1.4.3
|
||||
sax: 1.4.4
|
||||
strtok3: 10.3.4
|
||||
|
||||
'@floating-ui/core@1.7.3':
|
||||
@@ -4647,23 +4648,23 @@ snapshots:
|
||||
|
||||
'@mdi/js@7.4.47': {}
|
||||
|
||||
'@microsoft/api-extractor-model@7.32.2(@types/node@20.19.27)':
|
||||
'@microsoft/api-extractor-model@7.32.2(@types/node@20.19.28)':
|
||||
dependencies:
|
||||
'@microsoft/tsdoc': 0.16.0
|
||||
'@microsoft/tsdoc-config': 0.18.0
|
||||
'@rushstack/node-core-library': 5.19.1(@types/node@20.19.27)
|
||||
'@rushstack/node-core-library': 5.19.1(@types/node@20.19.28)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
|
||||
'@microsoft/api-extractor@7.55.2(@types/node@20.19.27)':
|
||||
'@microsoft/api-extractor@7.55.2(@types/node@20.19.28)':
|
||||
dependencies:
|
||||
'@microsoft/api-extractor-model': 7.32.2(@types/node@20.19.27)
|
||||
'@microsoft/api-extractor-model': 7.32.2(@types/node@20.19.28)
|
||||
'@microsoft/tsdoc': 0.16.0
|
||||
'@microsoft/tsdoc-config': 0.18.0
|
||||
'@rushstack/node-core-library': 5.19.1(@types/node@20.19.27)
|
||||
'@rushstack/node-core-library': 5.19.1(@types/node@20.19.28)
|
||||
'@rushstack/rig-package': 0.6.0
|
||||
'@rushstack/terminal': 0.19.5(@types/node@20.19.27)
|
||||
'@rushstack/ts-command-line': 5.1.5(@types/node@20.19.27)
|
||||
'@rushstack/terminal': 0.19.5(@types/node@20.19.28)
|
||||
'@rushstack/ts-command-line': 5.1.5(@types/node@20.19.28)
|
||||
diff: 8.0.2
|
||||
lodash: 4.17.21
|
||||
minimatch: 10.0.3
|
||||
@@ -4719,7 +4720,7 @@ snapshots:
|
||||
'@nextcloud/paths': 3.0.0
|
||||
'@nextcloud/router': 3.1.0
|
||||
'@nextcloud/sharing': 0.3.0
|
||||
'@nextcloud/vue': 9.3.1(typescript@5.9.2)
|
||||
'@nextcloud/vue': 9.3.3(typescript@5.9.2)
|
||||
'@types/toastify-js': 1.12.4
|
||||
'@vueuse/core': 14.1.0(vue@3.5.26(typescript@5.9.2))
|
||||
cancelable-promise: 4.3.1
|
||||
@@ -4814,10 +4815,10 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/jquery': 3.5.16
|
||||
|
||||
'@nextcloud/vite-config@2.3.5(@types/node@20.19.27)(browserslist@4.28.1)(picomatch@4.0.3)(rollup@4.55.1)(sass@1.97.2)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))':
|
||||
'@nextcloud/vite-config@2.3.5(@types/node@20.19.28)(browserslist@4.28.1)(picomatch@4.0.3)(rollup@4.55.1)(sass@1.97.2)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))':
|
||||
dependencies:
|
||||
'@rollup/plugin-replace': 6.0.3(rollup@4.55.1)
|
||||
'@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))
|
||||
'@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))
|
||||
browserslist: 4.28.1
|
||||
browserslist-to-esbuild: 2.1.1(browserslist@4.28.1)
|
||||
magic-string: 0.30.21
|
||||
@@ -4827,10 +4828,10 @@ snapshots:
|
||||
rollup-plugin-node-externals: 8.1.2(rollup@4.55.1)
|
||||
sass: 1.97.2
|
||||
spdx-expression-parse: 4.0.0
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite-plugin-css-injected-by-js: 3.5.2(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
vite-plugin-dts: 4.5.4(@types/node@20.19.27)(rollup@4.55.1)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
vite-plugin-node-polyfills: 0.23.0(rollup@4.55.1)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite-plugin-css-injected-by-js: 3.5.2(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
vite-plugin-dts: 4.5.4(@types/node@20.19.28)(rollup@4.55.1)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
vite-plugin-node-polyfills: 0.23.0(rollup@4.55.1)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- picomatch
|
||||
@@ -4839,7 +4840,7 @@ snapshots:
|
||||
- typescript
|
||||
- vue
|
||||
|
||||
'@nextcloud/vue@9.3.1(typescript@5.9.2)':
|
||||
'@nextcloud/vue@9.3.3(typescript@5.9.2)':
|
||||
dependencies:
|
||||
'@ckpack/vue-color': 1.6.0(vue@3.5.26(typescript@5.9.2))
|
||||
'@floating-ui/dom': 1.7.4
|
||||
@@ -4863,7 +4864,7 @@ snapshots:
|
||||
emoji-mart-vue-fast: 15.0.5(vue@3.5.26(typescript@5.9.2))
|
||||
escape-html: 1.0.3
|
||||
floating-vue: 5.2.2(vue@3.5.26(typescript@5.9.2))
|
||||
focus-trap: 7.7.1
|
||||
focus-trap: 7.6.6
|
||||
linkifyjs: 4.3.2
|
||||
p-queue: 9.1.0
|
||||
rehype-external-links: 3.0.0
|
||||
@@ -5076,7 +5077,7 @@ snapshots:
|
||||
|
||||
'@rtsao/scc@1.1.0': {}
|
||||
|
||||
'@rushstack/node-core-library@5.19.1(@types/node@20.19.27)':
|
||||
'@rushstack/node-core-library@5.19.1(@types/node@20.19.28)':
|
||||
dependencies:
|
||||
ajv: 8.13.0
|
||||
ajv-draft-04: 1.0.0(ajv@8.13.0)
|
||||
@@ -5087,28 +5088,28 @@ snapshots:
|
||||
resolve: 1.22.11
|
||||
semver: 7.5.4
|
||||
optionalDependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
|
||||
'@rushstack/problem-matcher@0.1.1(@types/node@20.19.27)':
|
||||
'@rushstack/problem-matcher@0.1.1(@types/node@20.19.28)':
|
||||
optionalDependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
|
||||
'@rushstack/rig-package@0.6.0':
|
||||
dependencies:
|
||||
resolve: 1.22.11
|
||||
strip-json-comments: 3.1.1
|
||||
|
||||
'@rushstack/terminal@0.19.5(@types/node@20.19.27)':
|
||||
'@rushstack/terminal@0.19.5(@types/node@20.19.28)':
|
||||
dependencies:
|
||||
'@rushstack/node-core-library': 5.19.1(@types/node@20.19.27)
|
||||
'@rushstack/problem-matcher': 0.1.1(@types/node@20.19.27)
|
||||
'@rushstack/node-core-library': 5.19.1(@types/node@20.19.28)
|
||||
'@rushstack/problem-matcher': 0.1.1(@types/node@20.19.28)
|
||||
supports-color: 8.1.1
|
||||
optionalDependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
|
||||
'@rushstack/ts-command-line@5.1.5(@types/node@20.19.27)':
|
||||
'@rushstack/ts-command-line@5.1.5(@types/node@20.19.28)':
|
||||
dependencies:
|
||||
'@rushstack/terminal': 0.19.5(@types/node@20.19.27)
|
||||
'@rushstack/terminal': 0.19.5(@types/node@20.19.28)
|
||||
'@types/argparse': 1.0.38
|
||||
argparse: 1.0.10
|
||||
string-argv: 0.3.2
|
||||
@@ -5158,7 +5159,7 @@ snapshots:
|
||||
|
||||
'@types/ms@2.1.0': {}
|
||||
|
||||
'@types/node@20.19.27':
|
||||
'@types/node@20.19.28':
|
||||
dependencies:
|
||||
undici-types: 6.21.0
|
||||
|
||||
@@ -5181,7 +5182,7 @@ snapshots:
|
||||
|
||||
'@types/ws@8.18.1':
|
||||
dependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
|
||||
'@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.2))(eslint@9.39.2)(typescript@5.9.2)':
|
||||
dependencies:
|
||||
@@ -5357,15 +5358,15 @@ snapshots:
|
||||
|
||||
'@ungap/structured-clone@1.3.0': {}
|
||||
|
||||
'@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))':
|
||||
'@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))':
|
||||
dependencies:
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vue: 3.5.26(typescript@5.9.2)
|
||||
|
||||
'@vitejs/plugin-vue@6.0.3(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))':
|
||||
'@vitejs/plugin-vue@6.0.3(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.2))':
|
||||
dependencies:
|
||||
'@rolldown/pluginutils': 1.0.0-beta.53
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vue: 3.5.26(typescript@5.9.2)
|
||||
|
||||
'@vitest/expect@4.0.16':
|
||||
@@ -5377,13 +5378,13 @@ snapshots:
|
||||
chai: 6.2.2
|
||||
tinyrainbow: 3.0.3
|
||||
|
||||
'@vitest/mocker@4.0.16(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))':
|
||||
'@vitest/mocker@4.0.16(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))':
|
||||
dependencies:
|
||||
'@vitest/spy': 4.0.16
|
||||
estree-walker: 3.0.3
|
||||
magic-string: 0.30.21
|
||||
optionalDependencies:
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
|
||||
'@vitest/pretty-format@4.0.16':
|
||||
dependencies:
|
||||
@@ -5732,7 +5733,7 @@ snapshots:
|
||||
|
||||
base64-js@1.5.1: {}
|
||||
|
||||
baseline-browser-mapping@2.9.12: {}
|
||||
baseline-browser-mapping@2.9.14: {}
|
||||
|
||||
blurhash@2.0.5: {}
|
||||
|
||||
@@ -5812,8 +5813,8 @@ snapshots:
|
||||
|
||||
browserslist@4.28.1:
|
||||
dependencies:
|
||||
baseline-browser-mapping: 2.9.12
|
||||
caniuse-lite: 1.0.30001762
|
||||
baseline-browser-mapping: 2.9.14
|
||||
caniuse-lite: 1.0.30001763
|
||||
electron-to-chromium: 1.5.267
|
||||
node-releases: 2.0.27
|
||||
update-browserslist-db: 1.2.3(browserslist@4.28.1)
|
||||
@@ -5858,7 +5859,7 @@ snapshots:
|
||||
|
||||
cancelable-promise@4.3.1: {}
|
||||
|
||||
caniuse-lite@1.0.30001762: {}
|
||||
caniuse-lite@1.0.30001763: {}
|
||||
|
||||
ccount@2.0.1: {}
|
||||
|
||||
@@ -6639,7 +6640,7 @@ snapshots:
|
||||
vue: 3.5.26(typescript@5.9.2)
|
||||
vue-resize: 2.0.0-alpha.1(vue@3.5.26(typescript@5.9.2))
|
||||
|
||||
focus-trap@7.7.1:
|
||||
focus-trap@7.6.6:
|
||||
dependencies:
|
||||
tabbable: 6.4.0
|
||||
|
||||
@@ -6781,7 +6782,7 @@ snapshots:
|
||||
|
||||
happy-dom@20.1.0:
|
||||
dependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
'@types/whatwg-mimetype': 3.0.2
|
||||
'@types/ws': 8.18.1
|
||||
whatwg-mimetype: 3.0.0
|
||||
@@ -8208,7 +8209,7 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@parcel/watcher': 2.5.1
|
||||
|
||||
sax@1.4.3: {}
|
||||
sax@1.4.4: {}
|
||||
|
||||
semver@6.3.1: {}
|
||||
|
||||
@@ -8790,7 +8791,7 @@ snapshots:
|
||||
'@types/unist': 3.0.3
|
||||
vfile-message: 4.0.3
|
||||
|
||||
vite-plugin-checker@0.12.0(eslint@9.39.2)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.11.0(typescript@5.9.2))(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue-tsc@2.2.12(typescript@5.9.2)):
|
||||
vite-plugin-checker@0.12.0(eslint@9.39.2)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.11.0(typescript@5.9.2))(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))(vue-tsc@2.2.12(typescript@5.9.2)):
|
||||
dependencies:
|
||||
'@babel/code-frame': 7.27.1
|
||||
chokidar: 4.0.3
|
||||
@@ -8799,7 +8800,7 @@ snapshots:
|
||||
picomatch: 4.0.3
|
||||
tiny-invariant: 1.3.3
|
||||
tinyglobby: 0.2.15
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vscode-uri: 3.1.0
|
||||
optionalDependencies:
|
||||
eslint: 9.39.2
|
||||
@@ -8809,13 +8810,13 @@ snapshots:
|
||||
typescript: 5.9.2
|
||||
vue-tsc: 2.2.12(typescript@5.9.2)
|
||||
|
||||
vite-plugin-css-injected-by-js@3.5.2(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)):
|
||||
vite-plugin-css-injected-by-js@3.5.2(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)):
|
||||
dependencies:
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
|
||||
vite-plugin-dts@4.5.4(@types/node@20.19.27)(rollup@4.55.1)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)):
|
||||
vite-plugin-dts@4.5.4(@types/node@20.19.28)(rollup@4.55.1)(typescript@5.9.2)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)):
|
||||
dependencies:
|
||||
'@microsoft/api-extractor': 7.55.2(@types/node@20.19.27)
|
||||
'@microsoft/api-extractor': 7.55.2(@types/node@20.19.28)
|
||||
'@rollup/pluginutils': 5.3.0(rollup@4.55.1)
|
||||
'@volar/typescript': 2.4.27
|
||||
'@vue/language-core': 2.2.0(typescript@5.9.2)
|
||||
@@ -8826,21 +8827,21 @@ snapshots:
|
||||
magic-string: 0.30.21
|
||||
typescript: 5.9.2
|
||||
optionalDependencies:
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
vite-plugin-node-polyfills@0.23.0(rollup@4.55.1)(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)):
|
||||
vite-plugin-node-polyfills@0.23.0(rollup@4.55.1)(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)):
|
||||
dependencies:
|
||||
'@rollup/plugin-inject': 5.0.5(rollup@4.55.1)
|
||||
node-stdlib-browser: 1.3.1
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
transitivePeerDependencies:
|
||||
- rollup
|
||||
|
||||
vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2):
|
||||
vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2):
|
||||
dependencies:
|
||||
esbuild: 0.25.12
|
||||
fdir: 6.5.0(picomatch@4.0.3)
|
||||
@@ -8849,16 +8850,16 @@ snapshots:
|
||||
rollup: 4.55.1
|
||||
tinyglobby: 0.2.15
|
||||
optionalDependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
fsevents: 2.3.3
|
||||
sass: 1.97.2
|
||||
sass-embedded: 1.97.2
|
||||
yaml: 2.8.2
|
||||
|
||||
vitest@4.0.16(@types/node@20.19.27)(happy-dom@20.1.0)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2):
|
||||
vitest@4.0.16(@types/node@20.19.28)(happy-dom@20.1.0)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2):
|
||||
dependencies:
|
||||
'@vitest/expect': 4.0.16
|
||||
'@vitest/mocker': 4.0.16(vite@6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
'@vitest/mocker': 4.0.16(vite@6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2))
|
||||
'@vitest/pretty-format': 4.0.16
|
||||
'@vitest/runner': 4.0.16
|
||||
'@vitest/snapshot': 4.0.16
|
||||
@@ -8875,10 +8876,10 @@ snapshots:
|
||||
tinyexec: 1.0.2
|
||||
tinyglobby: 0.2.15
|
||||
tinyrainbow: 3.0.3
|
||||
vite: 6.4.1(@types/node@20.19.27)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
vite: 6.4.1(@types/node@20.19.28)(sass-embedded@1.97.2)(sass@1.97.2)(yaml@2.8.2)
|
||||
why-is-node-running: 2.3.0
|
||||
optionalDependencies:
|
||||
'@types/node': 20.19.27
|
||||
'@types/node': 20.19.28
|
||||
happy-dom: 20.1.0
|
||||
transitivePeerDependencies:
|
||||
- jiti
|
||||
|
||||
406
tests/integration/Migration/SeedHelperTest.php
Normal file
406
tests/integration/Migration/SeedHelperTest.php
Normal file
@@ -0,0 +1,406 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
// SPDX-FileCopyrightText: Chen Asraf <contact@casraf.dev>
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
namespace OCA\Forum\Tests\Integration\Migration;
|
||||
|
||||
use OCA\Forum\Db\Role;
|
||||
use OCA\Forum\Migration\SeedHelper;
|
||||
use OCP\IDBConnection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Integration tests for SeedHelper
|
||||
*
|
||||
* These tests run against a real database to ensure seeding works correctly
|
||||
* on both MySQL and PostgreSQL. They verify:
|
||||
* - Seeding creates required data on a clean database
|
||||
* - Seeding is idempotent (running twice doesn't cause errors)
|
||||
* - Individual seed operations can fail without breaking others
|
||||
* - Transaction handling works correctly on PostgreSQL
|
||||
*
|
||||
* Note: These tests require the Forum app tables to exist. They will be skipped
|
||||
* if run in an environment where migrations haven't been run (e.g., local dev with SQLite).
|
||||
* In CI, the app is properly installed with tables before tests run.
|
||||
*
|
||||
* @group integration
|
||||
* @group database
|
||||
*/
|
||||
class SeedHelperTest extends TestCase {
|
||||
private IDBConnection $db;
|
||||
private bool $tablesExist = false;
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
$this->db = \OC::$server->get(IDBConnection::class);
|
||||
|
||||
// Check if forum tables exist (they might not in local dev environment)
|
||||
$this->tablesExist = $this->checkTablesExist();
|
||||
|
||||
if (!$this->tablesExist) {
|
||||
$this->markTestSkipped('Forum tables do not exist. Run these tests in CI or with a fully installed Nextcloud instance.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the forum tables exist in the database
|
||||
*/
|
||||
private function checkTablesExist(): bool {
|
||||
try {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id')
|
||||
->from('forum_roles')
|
||||
->setMaxResults(1);
|
||||
$qb->executeQuery()->closeCursor();
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected function tearDown(): void {
|
||||
// Clean up test data after each test
|
||||
$this->cleanupTestData();
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up all forum data to start fresh
|
||||
*/
|
||||
private function cleanupTestData(): void {
|
||||
$tables = [
|
||||
'forum_thread_subs',
|
||||
'forum_read_markers',
|
||||
'forum_reactions',
|
||||
'forum_posts',
|
||||
'forum_threads',
|
||||
'forum_category_perms',
|
||||
'forum_categories',
|
||||
'forum_cat_headers',
|
||||
'forum_user_roles',
|
||||
'forum_users',
|
||||
'forum_bbcodes',
|
||||
'forum_roles',
|
||||
];
|
||||
|
||||
foreach ($tables as $table) {
|
||||
try {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->delete($table)->executeStatement();
|
||||
} catch (\Exception $e) {
|
||||
// Table might not exist, ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedAll creates all required data on a clean database
|
||||
*/
|
||||
public function testSeedAllCreatesRequiredData(): void {
|
||||
// Clean state
|
||||
$this->cleanupTestData();
|
||||
|
||||
// Run seeding
|
||||
SeedHelper::seedAll(null, false);
|
||||
|
||||
// Verify roles were created
|
||||
$this->assertRolesExist();
|
||||
|
||||
// Verify category headers were created
|
||||
$this->assertCategoryHeadersExist();
|
||||
|
||||
// Verify categories were created
|
||||
$this->assertCategoriesExist();
|
||||
|
||||
// Verify BBCodes were created
|
||||
$this->assertBBCodesExist();
|
||||
|
||||
// Verify category permissions were created
|
||||
$this->assertCategoryPermissionsExist();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedAll is idempotent - running twice doesn't cause errors
|
||||
*/
|
||||
public function testSeedAllIsIdempotent(): void {
|
||||
// Clean state
|
||||
$this->cleanupTestData();
|
||||
|
||||
// Run seeding twice
|
||||
SeedHelper::seedAll(null, false);
|
||||
SeedHelper::seedAll(null, false);
|
||||
|
||||
// Verify data exists (and isn't duplicated)
|
||||
$this->assertRolesExist();
|
||||
$this->assertNoDuplicateRoles();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedDefaultRoles creates all four roles
|
||||
*/
|
||||
public function testSeedDefaultRolesCreatesAllRoles(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
SeedHelper::seedDefaultRoles(null);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('role_type')
|
||||
->from('forum_roles');
|
||||
$result = $qb->executeQuery();
|
||||
$roles = $result->fetchAll();
|
||||
$result->closeCursor();
|
||||
|
||||
$roleTypes = array_column($roles, 'role_type');
|
||||
|
||||
$this->assertContains(Role::ROLE_TYPE_ADMIN, $roleTypes);
|
||||
$this->assertContains(Role::ROLE_TYPE_MODERATOR, $roleTypes);
|
||||
$this->assertContains(Role::ROLE_TYPE_DEFAULT, $roleTypes);
|
||||
$this->assertContains(Role::ROLE_TYPE_GUEST, $roleTypes);
|
||||
$this->assertCount(4, $roles, 'Should have exactly 4 roles');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedDefaultRoles is idempotent
|
||||
*/
|
||||
public function testSeedDefaultRolesIsIdempotent(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
SeedHelper::seedDefaultRoles(null);
|
||||
SeedHelper::seedDefaultRoles(null);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select($qb->func()->count('*', 'count'))
|
||||
->from('forum_roles');
|
||||
$result = $qb->executeQuery();
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertEquals(4, (int)$row['count'], 'Should still have exactly 4 roles after running twice');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedCategoryHeaders creates the General header
|
||||
*/
|
||||
public function testSeedCategoryHeadersCreatesHeader(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
SeedHelper::seedCategoryHeaders(null);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('forum_cat_headers');
|
||||
$result = $qb->executeQuery();
|
||||
$headers = $result->fetchAll();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertCount(1, $headers);
|
||||
$this->assertNotEmpty($headers[0]['name']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedDefaultCategories creates categories
|
||||
*/
|
||||
public function testSeedDefaultCategoriesCreatesCategories(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
// Categories need headers first
|
||||
SeedHelper::seedCategoryHeaders(null);
|
||||
SeedHelper::seedDefaultCategories(null);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('slug')
|
||||
->from('forum_categories');
|
||||
$result = $qb->executeQuery();
|
||||
$categories = $result->fetchAll();
|
||||
$result->closeCursor();
|
||||
|
||||
$slugs = array_column($categories, 'slug');
|
||||
|
||||
$this->assertContains('general-discussions', $slugs);
|
||||
$this->assertContains('support', $slugs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedDefaultBBCodes creates all default BBCodes
|
||||
*/
|
||||
public function testSeedDefaultBBCodesCreatesBBCodes(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
SeedHelper::seedDefaultBBCodes(null);
|
||||
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('tag')
|
||||
->from('forum_bbcodes');
|
||||
$result = $qb->executeQuery();
|
||||
$bbcodes = $result->fetchAll();
|
||||
$result->closeCursor();
|
||||
|
||||
$tags = array_column($bbcodes, 'tag');
|
||||
|
||||
$this->assertContains('icode', $tags);
|
||||
$this->assertContains('spoiler', $tags);
|
||||
$this->assertContains('attachment', $tags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seeding continues after individual operation failure
|
||||
* This is crucial for PostgreSQL where transaction abort cascades
|
||||
*/
|
||||
public function testSeedingContinuesAfterIndividualFailure(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
// Create a partial state - roles exist but categories don't have permissions
|
||||
SeedHelper::seedDefaultRoles(null);
|
||||
SeedHelper::seedCategoryHeaders(null);
|
||||
SeedHelper::seedDefaultCategories(null);
|
||||
// Skip category permissions intentionally
|
||||
|
||||
// Now run full seedAll - it should complete remaining operations
|
||||
SeedHelper::seedAll(null, false);
|
||||
|
||||
// Verify BBCodes were still created despite any issues
|
||||
$this->assertBBCodesExist();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that seedWelcomeThread creates thread and post
|
||||
*/
|
||||
public function testSeedWelcomeThreadCreatesContent(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
// Welcome thread needs roles, headers, and categories
|
||||
SeedHelper::seedDefaultRoles(null);
|
||||
SeedHelper::seedCategoryHeaders(null);
|
||||
SeedHelper::seedDefaultCategories(null);
|
||||
SeedHelper::seedWelcomeThread(null);
|
||||
|
||||
// Verify thread exists
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id')
|
||||
->from('forum_threads')
|
||||
->where($qb->expr()->eq('slug', $qb->createNamedParameter('welcome-to-nextcloud-forums')));
|
||||
$result = $qb->executeQuery();
|
||||
$thread = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertNotFalse($thread, 'Welcome thread should exist');
|
||||
|
||||
// Verify post exists
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id')
|
||||
->from('forum_posts')
|
||||
->where($qb->expr()->eq('thread_id', $qb->createNamedParameter($thread['id'])));
|
||||
$result = $qb->executeQuery();
|
||||
$post = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertNotFalse($post, 'Welcome post should exist');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that throwOnError parameter works correctly
|
||||
*/
|
||||
public function testThrowOnErrorParameter(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
// With throwOnError=false, should not throw even if something fails
|
||||
// (though in a clean state nothing should fail)
|
||||
SeedHelper::seedAll(null, false);
|
||||
|
||||
// Verify it completed
|
||||
$this->assertRolesExist();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test database connection recovery between operations
|
||||
* This specifically tests the PostgreSQL transaction abort fix
|
||||
*/
|
||||
public function testConnectionRecoveryBetweenOperations(): void {
|
||||
$this->cleanupTestData();
|
||||
|
||||
// Run seedAll which now includes connection recovery
|
||||
SeedHelper::seedAll(null, false);
|
||||
|
||||
// If we got here without exception, connection recovery worked
|
||||
// Verify data exists
|
||||
$this->assertRolesExist();
|
||||
$this->assertCategoryHeadersExist();
|
||||
$this->assertCategoriesExist();
|
||||
$this->assertBBCodesExist();
|
||||
}
|
||||
|
||||
// ========== Helper assertions ==========
|
||||
|
||||
private function assertRolesExist(): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select($qb->func()->count('*', 'count'))
|
||||
->from('forum_roles');
|
||||
$result = $qb->executeQuery();
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertGreaterThanOrEqual(4, (int)$row['count'], 'Should have at least 4 roles');
|
||||
}
|
||||
|
||||
private function assertNoDuplicateRoles(): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('role_type')
|
||||
->selectAlias($qb->func()->count('*'), 'count')
|
||||
->from('forum_roles')
|
||||
->groupBy('role_type');
|
||||
$result = $qb->executeQuery();
|
||||
$groups = $result->fetchAll();
|
||||
$result->closeCursor();
|
||||
|
||||
foreach ($groups as $group) {
|
||||
$this->assertEquals(1, (int)$group['count'], "Role type '{$group['role_type']}' should not be duplicated");
|
||||
}
|
||||
}
|
||||
|
||||
private function assertCategoryHeadersExist(): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select($qb->func()->count('*', 'count'))
|
||||
->from('forum_cat_headers');
|
||||
$result = $qb->executeQuery();
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertGreaterThanOrEqual(1, (int)$row['count'], 'Should have at least 1 category header');
|
||||
}
|
||||
|
||||
private function assertCategoriesExist(): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select($qb->func()->count('*', 'count'))
|
||||
->from('forum_categories');
|
||||
$result = $qb->executeQuery();
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertGreaterThanOrEqual(2, (int)$row['count'], 'Should have at least 2 categories');
|
||||
}
|
||||
|
||||
private function assertBBCodesExist(): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select($qb->func()->count('*', 'count'))
|
||||
->from('forum_bbcodes');
|
||||
$result = $qb->executeQuery();
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertGreaterThanOrEqual(3, (int)$row['count'], 'Should have at least 3 BBCodes');
|
||||
}
|
||||
|
||||
private function assertCategoryPermissionsExist(): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select($qb->func()->count('*', 'count'))
|
||||
->from('forum_category_perms');
|
||||
$result = $qb->executeQuery();
|
||||
$row = $result->fetch();
|
||||
$result->closeCursor();
|
||||
|
||||
$this->assertGreaterThanOrEqual(1, (int)$row['count'], 'Should have at least 1 category permission');
|
||||
}
|
||||
}
|
||||
21
tests/phpunit.integration.xml
Normal file
21
tests/phpunit.integration.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
bootstrap="bootstrap.php"
|
||||
timeoutForSmallTests="900"
|
||||
timeoutForMediumTests="900"
|
||||
timeoutForLargeTests="900"
|
||||
cacheDirectory=".phpunit.cache"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
|
||||
colors="true">
|
||||
<testsuites>
|
||||
<testsuite name="Forum Integration Tests">
|
||||
<directory suffix="Test.php">integration</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<source>
|
||||
<include>
|
||||
<directory suffix=".php">../appinfo</directory>
|
||||
<directory suffix=".php">../lib</directory>
|
||||
</include>
|
||||
</source>
|
||||
</phpunit>
|
||||
12
vendor-bin/cs-fixer/composer.lock
generated
12
vendor-bin/cs-fixer/composer.lock
generated
@@ -106,16 +106,16 @@
|
||||
},
|
||||
{
|
||||
"name": "php-cs-fixer/shim",
|
||||
"version": "v3.92.4",
|
||||
"version": "v3.92.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHP-CS-Fixer/shim.git",
|
||||
"reference": "42511441af95955f9d40312f83da870018f0fb10"
|
||||
"reference": "b13b4ad0a1daa80cf036c70488e86516928a5af0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/42511441af95955f9d40312f83da870018f0fb10",
|
||||
"reference": "42511441af95955f9d40312f83da870018f0fb10",
|
||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/b13b4ad0a1daa80cf036c70488e86516928a5af0",
|
||||
"reference": "b13b4ad0a1daa80cf036c70488e86516928a5af0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -152,9 +152,9 @@
|
||||
"description": "A tool to automatically fix PHP code style",
|
||||
"support": {
|
||||
"issues": "https://github.com/PHP-CS-Fixer/shim/issues",
|
||||
"source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.92.4"
|
||||
"source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.92.5"
|
||||
},
|
||||
"time": "2026-01-04T00:39:15+00:00"
|
||||
"time": "2026-01-08T21:58:02+00:00"
|
||||
}
|
||||
],
|
||||
"aliases": [],
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.20.2
|
||||
0.20.4
|
||||
|
||||
Reference in New Issue
Block a user