Compare commits

...

66 Commits

Author SHA1 Message Date
be51e8a1a5 chore(master): release 0.10.0 2025-11-23 02:11:43 +02:00
53875b1eef fix(AdminDashboard): exclude thread posts from post count 2025-11-23 02:08:03 +02:00
0f9d5ea9a5 fix: modal actions spacing 2025-11-23 02:07:30 +02:00
4708d8cf87 chore: exclude gen/ changes from php test trigger 2025-11-23 02:07:03 +02:00
20a15b42d9 chore(test): swap phpunit local/docker 2025-11-23 00:17:15 +02:00
7a1853935e chore: run php tests on commit 2025-11-22 23:48:42 +02:00
04ec7ffcf8 test: add/update role & permission tests 2025-11-22 23:47:53 +02:00
c9a76e5cd9 feat(Roles): admin always has full permissions 2025-11-22 23:37:05 +02:00
94787052ef refactor(Role): improve role logic in UI 2025-11-22 23:07:19 +02:00
e20bfdadab refactor(Roles): update UserRoleController & SetRole command to use UserRoleService 2025-11-22 23:05:02 +02:00
328b37be6e fix(Roles): prevent deleting system roles on backend 2025-11-22 23:03:58 +02:00
c7f84d4a18 fix(UserEventListener): add User role to newly created users 2025-11-22 23:03:33 +02:00
d09987600b chore(master): release 0.9.2 2025-11-22 22:03:04 +02:00
dcdcde31ed chore: allow blank issue templates 2025-11-22 21:53:14 +02:00
f66169288e build: reduce test workflow count 2025-11-22 21:50:27 +02:00
7a17dbc524 docs: update README.md 2025-11-22 21:44:09 +02:00
c1443014b5 build: update phpunit workflows 2025-11-22 21:44:02 +02:00
4c2e47d86b build: update phpunit workflows 2025-11-22 21:38:46 +02:00
8408402148 fix(l10n): plural tokens + text alignment strings 2025-11-22 21:18:58 +02:00
3d113f1f31 fix(l10n): update translation source strings 2025-11-22 20:59:43 +02:00
48b7679e3b chore: remove unused file 2025-11-22 20:58:36 +02:00
5f0317b153 build: update php test versions matrix 2025-11-22 03:39:45 +02:00
56dc0049b8 build: include all composer.lock files 2025-11-22 03:37:32 +02:00
7519088e2b build: update php test version matrix 2025-11-22 03:34:22 +02:00
0f3be447fa build: add phpunit-pgsql task 2025-11-22 03:33:02 +02:00
f73d902962 build: update phpunit workflow min php version 2025-11-22 03:29:08 +02:00
4a9ae9bfc6 build: update phpunit workflow min php version 2025-11-22 03:27:00 +02:00
37012590a1 build: update test workflow 2025-11-22 03:21:12 +02:00
00b80b817d build: include composer.lock 2025-11-22 03:20:56 +02:00
3472e95065 docs: update README.md badges 2025-11-22 03:15:11 +02:00
7fde88a158 build: add phpunit-mysql workflow 2025-11-22 02:49:44 +02:00
5ebeb56636 test: add missing tests 2025-11-22 02:29:36 +02:00
a66bcd4612 fix(PostController): exclude first posts from post_count fields 2025-11-22 02:29:14 +02:00
36d8ecd5bb test: fix failing tests 2025-11-22 02:01:31 +02:00
257a12dfc4 fix: post counts in threads/categories 2025-11-22 01:55:06 +02:00
b67813fa34 fix(SeedHelper): subscribe author to welcome thread 2025-11-22 01:39:05 +02:00
d6c6626bad fix(l10n): bbcode help dialog strings 2025-11-22 00:51:26 +02:00
9837fc4683 chore(master): release 0.9.1 2025-11-22 00:42:58 +02:00
a3b0582d2c fix(l10n): fix welcome post & bbcode example strings 2025-11-22 00:39:46 +02:00
53c50f5297 chore(master): release 0.9.0 2025-11-22 00:19:58 +02:00
4e867cdf0a fix(RepairSeeds): output logs 2025-11-22 00:17:17 +02:00
7c5bf4a82b feat: 404 pages 2025-11-22 00:13:34 +02:00
cf28213bac Revert "build: update Release Please user"
This reverts commit 6647378e29.
2025-11-22 00:02:07 +02:00
8ecddc032f fix(Notifications): test-notifier command 2025-11-21 23:58:36 +02:00
6647378e29 build: update Release Please user 2025-11-21 23:58:36 +02:00
0f71247cfa chore(master): release 0.8.2 2025-11-21 23:43:17 +02:00
83b7c3392e fix(l10n): update string with literal name 2025-11-21 23:36:55 +02:00
49c12011fa fix(l10n): update bbcode-including strings 2025-11-21 23:34:18 +02:00
d53724407b fix(l10n): Update pluralization strings 2025-11-21 23:23:02 +02:00
be51645ba4 docs: update README.md 2025-11-21 23:22:47 +02:00
f3b5fa3273 refactor: user, post and thread enrichment service instead of static methods 2025-11-21 22:55:15 +02:00
c46c96021e build(test): update local test makefile 2025-11-21 22:55:15 +02:00
caf05dae9d chore(test): improve local testing 2025-11-21 22:13:45 +02:00
e071f79300 chore(test): update phpunit.xml 2025-11-21 21:46:39 +02:00
b90ab6151f test: repair tests 2025-11-21 21:40:30 +02:00
e22bf1de83 docs: update store doc links 2025-11-21 21:40:16 +02:00
e0521cadd3 docs: update README.md 2025-11-21 20:39:49 +02:00
e2fd6383d3 fix(Seeds): update seed output & add repair command 2025-11-21 20:39:48 +02:00
d9cb3a6d9b fix(Seeds): log seed statuses in console 2025-11-21 20:39:47 +02:00
34fa0dbec1 chore: update bug report issue template 2025-11-21 19:35:21 +02:00
749c30c2f2 fix: initial seed 2025-11-21 19:31:03 +02:00
53c1b980a9 fix(AdminCategoryList): pluralization string 2025-11-21 19:31:03 +02:00
7c521bcbe4 docs: update README.md 2025-11-21 15:08:37 +02:00
Nextcloud bot
387be93d3a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-11-21 08:31:30 +00:00
b2bf402e20 chore(master): release 0.8.1 2025-11-21 09:41:46 +02:00
c6d757bee6 fix: migration 2025-11-21 09:40:04 +02:00
197 changed files with 13311 additions and 1546 deletions

View File

@@ -94,25 +94,125 @@ body:
description: Which browser are you using? (if applicable)
placeholder: e.g., Firefox 120, Chrome 119, Safari 17
- type: textarea
id: logs
- type: markdown
attributes:
label: Relevant Logs
value: |
## 📋 Debugging Information
The following information helps us investigate and fix issues quickly. Please provide as much detail as possible.
- type: textarea
id: migration-status
attributes:
label: Migration Status
description: |
Please paste any relevant logs from:
- Nextcloud log (Settings → Logging)
- Browser console (F12 → Console tab)
- PHP error logs
**How to check migration status:**
This shows which database migrations have been executed for the Forum app.
**For Docker installations:**
```bash
docker exec --user www-data -i nextcloud-aio-nextcloud php occ migrations:status forum
```
**For standard installations:**
```bash
php occ migrations:status forum
```
Or from the Nextcloud directory:
```bash
sudo -u www-data php occ migrations:status forum
```
**Note:** If you suspect data is missing (roles, categories, etc.), try running the repair command:
```bash
php occ forum:repair-seeds
```
See the [Administration section](https://github.com/chenasraf/nextcloud-forum#administration) in the README for more details.
placeholder: Paste the migration status output here...
render: shell
- type: textarea
id: nextcloud-logs
attributes:
label: Nextcloud Server Logs
description: |
**How to get server logs:**
Look for errors related to the Forum app (last 20-50 lines recommended).
**Via Web UI:**
- Go to Nextcloud Settings → Administration → Logging (or `/settings/admin/logging`)
- Look for entries containing "forum"
**For Docker installations:**
```bash
docker exec --user www-data -i nextcloud-aio-nextcloud tail -100 /var/www/html/data/nextcloud.log | grep -i forum
```
**For standard installations:**
```bash
tail -100 /path/to/nextcloud/data/nextcloud.log | grep -i forum
```
Or from the Nextcloud directory:
```bash
sudo -u www-data tail -100 data/nextcloud.log | grep -i forum
```
placeholder: Paste Nextcloud server logs here...
render: shell
- type: textarea
id: browser-console
attributes:
label: Browser Console Errors
description: |
**How to check browser console:**
1. Open the page where the issue occurs
2. Press **F12** (or right-click → Inspect → Console tab)
3. Look for red error messages
4. Copy any errors related to the Forum app
**Tip:** You can right-click on an error and select "Copy message" or "Copy stack trace"
placeholder: Paste browser console errors here...
render: javascript
- type: textarea
id: network-errors
attributes:
label: Network Request Errors
description: |
**How to check network requests:**
1. Open the page where the issue occurs
2. Press **F12** → Go to the **Network** tab
3. Reproduce the issue
4. Look for failed requests (shown in red or with 4xx/5xx status codes)
5. Click on the failed request
6. Copy the following information:
- **Request URL** (e.g., `/apps/forum/api/...`)
- **Status Code** (e.g., 500, 404, 403)
- **Response** tab content (the error message/data returned)
**Example format:**
```
Request: POST /apps/forum/api/threads
Status: 500 Internal Server Error
Response: {"error": "Database connection failed"}
```
placeholder: Paste network error details here...
render: shell
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem
description: |
If applicable, add screenshots to help explain your problem.
You can drag and drop images directly into this field.
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context about the problem here
description: Add any other context about the problem here (e.g., recent changes, specific configuration, workarounds attempted)

View File

@@ -1,4 +1,4 @@
blank_issues_enabled: false
blank_issues_enabled: true
contact_links:
- name: Nextcloud Community Forum
url: https://help.nextcloud.com

201
.github/workflows/phpunit-mysql.yml vendored Normal file
View File

@@ -0,0 +1,201 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT
name: PHPUnit MySQL
on: pull_request
permissions:
contents: read
concurrency:
group: phpunit-mysql-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout app
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
persist-credentials: false
- name: Get supported server versions
id: versions
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
- name: Build test matrix
id: set-matrix
run: |
# Get server branches from version matrix
BRANCHES='${{ steps.versions.outputs.branches }}'
# Build minimal matrix: min Nextcloud with PHP 8.2, max Nextcloud with PHP 8.3
MATRIX=$(jq -nc \
--argjson branches "$BRANCHES" \
'{include: [{"php-versions": "8.2", "mysql-versions": "8.4", "server-versions": $branches[0]}, {"php-versions": "8.3", "mysql-versions": "8.4", "server-versions": $branches[-1]}]}'
)
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
echo "Generated matrix: $MATRIX"
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/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
phpunit-mysql:
runs-on: ubuntu-latest
needs: [changes, matrix]
if: needs.changes.outputs.src != 'false'
strategy:
matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
name: MySQL ${{ matrix.mysql-versions }} PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }}
services:
mysql:
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
ports:
- 4444:3306/tcp
env:
MYSQL_ROOT_PASSWORD: rootpassword
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
steps:
- name: Checkout app
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
path: app-checkout
- name: Detect app ID from appinfo/info.xml
run: |
APP_ID=$(grep -oP '(?<=<id>)[^<]+' app-checkout/appinfo/info.xml | head -1)
echo "APP_NAME=$APP_ID" >> $GITHUB_ENV
echo "Detected app ID: $APP_ID"
- name: Checkout server
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout app
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
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
# Temporary workaround for missing pcntl_* in PHP 8.3
ini-values: disable_functions=
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Enable ONLY_FULL_GROUP_BY MySQL option
run: |
echo "SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
echo 'SELECT @@sql_mode;' | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
with:
files: apps/${{ env.APP_NAME }}/composer.json
- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: |
composer remove nextcloud/ocp --dev --no-scripts
composer i
- name: Set up Nextcloud
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
./occ app:enable --force ${{ env.APP_NAME }}
- name: Check PHPUnit script is defined
id: check_phpunit
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep '^ test:unit ' | wc -l | grep 1
- name: PHPUnit
# Only run if phpunit config file exists
if: steps.check_phpunit.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:unit
- 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'
run: |
echo 'PHPUnit tests are not specified in composer.json scripts'
exit 1
summary:
permissions:
contents: none
runs-on: ubuntu-latest
needs: [changes, phpunit-mysql]
if: always()
name: phpunit-mysql-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mysql.result != 'success' }}; then exit 1; fi

216
.github/workflows/phpunit-pgsql.yml vendored Normal file
View File

@@ -0,0 +1,216 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT
name: PHPUnit PostgreSQL
on: pull_request
permissions:
contents: read
concurrency:
group: phpunit-pgsql-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout app
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
persist-credentials: false
- name: Get supported server versions
id: versions
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
- name: Build test matrix
id: set-matrix
run: |
# Get server branches from version matrix
BRANCHES='${{ steps.versions.outputs.branches }}'
# Build minimal matrix: only latest Nextcloud with PHP 8.3
MATRIX=$(jq -nc \
--argjson branches "$BRANCHES" \
'{include: [{"php-versions": "8.3", "server-versions": $branches[-1]}]}'
)
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
echo "Generated matrix: $MATRIX"
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/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
phpunit-pgsql:
runs-on: ubuntu-latest
needs: [changes, matrix]
if: needs.changes.outputs.src != 'false'
strategy:
matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
name: PostgreSQL PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }}
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
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
persist-credentials: false
path: app-checkout
- name: Detect app ID from appinfo/info.xml
run: |
APP_ID=$(grep -oP '(?<=<id>)[^<]+' app-checkout/appinfo/info.xml | head -1)
echo "APP_NAME=$APP_ID" >> $GITHUB_ENV
echo "Detected app ID: $APP_ID"
- name: Checkout server
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
persist-credentials: false
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout app
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
persist-credentials: false
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # v2.35.5
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
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
# Temporary workaround for missing pcntl_* in PHP 8.3
ini-values: disable_functions=
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
with:
files: apps/${{ env.APP_NAME }}/composer.json
- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: |
composer remove nextcloud/ocp --dev --no-scripts
composer i
- name: Set up Nextcloud
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
./occ app:enable --force ${{ env.APP_NAME }}
- name: Check PHPUnit script is defined
id: check_phpunit
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep '^ test:unit ' | wc -l | grep 1
- name: PHPUnit
# Only run if phpunit config file exists
if: steps.check_phpunit.outcome == 'success'
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 neither unit nor integration tests ran
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
run: |
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
exit 1
summary:
permissions:
contents: none
runs-on: ubuntu-latest
needs: [changes, phpunit-pgsql]
if: always()
name: phpunit-pgsql-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-pgsql.result != 'success' }}; then exit 1; fi

1
.gitignore vendored
View File

@@ -12,7 +12,6 @@
/js
/css
.DS_Store
composer.lock
build/
tsconfig.app.tsbuildinfo
.env

View File

@@ -2,9 +2,16 @@ module.exports = {
'*.{ts,vue}': ['eslint --fix'],
'*.{scss,vue,ts,md}': ['prettier --write'],
'*.json': (files) => {
const filtered = files.filter(file => !file.includes('openapi.json'));
return filtered.length > 0 ? `prettier --write ${filtered.join(' ')}` : [];
const filtered = files.filter(file => !file.includes('openapi.json'))
return filtered.length > 0 ? `prettier --write ${filtered.join(' ')}` : []
},
'*.php': (files) => {
const nonGenFiles = files.filter(file => !file.includes('/gen/'))
const commands = []
if (nonGenFiles.length > 0) {
commands.push('make php-cs-fixer', 'make test')
}
return commands
},
'*.php': [() => 'make php-cs-fixer'],
'*Controller.php': [() => 'make openapi', () => 'git add openapi.json'],
}

View File

@@ -1 +1 @@
{".":"0.8.0"}
{".":"0.10.0"}

View File

@@ -1,5 +1,73 @@
# Changelog
## [0.10.0](https://github.com/chenasraf/nextcloud-forum/compare/v0.9.2...v0.10.0) (2025-11-23)
### Features
* **Roles:** admin always has full permissions ([c9a76e5](https://github.com/chenasraf/nextcloud-forum/commit/c9a76e5cd97df0c82bb79825799eeba7ce66086e))
### Bug Fixes
* **AdminDashboard:** exclude thread posts from post count ([53875b1](https://github.com/chenasraf/nextcloud-forum/commit/53875b1eefaddcbe8c4024c98834e44c3a01aeb0))
* modal actions spacing ([0f9d5ea](https://github.com/chenasraf/nextcloud-forum/commit/0f9d5ea9a5a99dda9bb351ed98d91ae880ddf64f))
* **Roles:** prevent deleting system roles on backend ([328b37b](https://github.com/chenasraf/nextcloud-forum/commit/328b37be6eec2b0001517ef74779565457de7213))
* **UserEventListener:** add User role to newly created users ([c7f84d4](https://github.com/chenasraf/nextcloud-forum/commit/c7f84d4a186ab7832d5fa96c2143bef30ddf3a85))
## [0.9.2](https://github.com/chenasraf/nextcloud-forum/compare/v0.9.1...v0.9.2) (2025-11-22)
### Bug Fixes
* **l10n:** bbcode help dialog strings ([d6c6626](https://github.com/chenasraf/nextcloud-forum/commit/d6c6626badf90636aae4f59fbe4765a5f786f5ab))
* **l10n:** plural tokens + text alignment strings ([8408402](https://github.com/chenasraf/nextcloud-forum/commit/8408402148c9935b50df1f75915cffba7d76b043))
* **l10n:** update translation source strings ([3d113f1](https://github.com/chenasraf/nextcloud-forum/commit/3d113f1f31887b7849753d07712a548392f574d6))
* post counts in threads/categories ([257a12d](https://github.com/chenasraf/nextcloud-forum/commit/257a12dfc43d7784d7e63ab79a8545d80022251e))
* **PostController:** exclude first posts from post_count fields ([a66bcd4](https://github.com/chenasraf/nextcloud-forum/commit/a66bcd4612a1889624e608e9e0207d7e09fc32df))
* **SeedHelper:** subscribe author to welcome thread ([b67813f](https://github.com/chenasraf/nextcloud-forum/commit/b67813fa34746de8f999b16e609c6ee7a9458e9b))
## [0.9.1](https://github.com/chenasraf/nextcloud-forum/compare/v0.9.0...v0.9.1) (2025-11-21)
### Bug Fixes
* **l10n:** fix welcome post & bbcode example strings ([a3b0582](https://github.com/chenasraf/nextcloud-forum/commit/a3b0582d2cce2c22cd5070f3c335a732c25c5e67))
## [0.9.0](https://github.com/chenasraf/nextcloud-forum/compare/v0.8.2...v0.9.0) (2025-11-21)
### Features
* 404 pages ([7c5bf4a](https://github.com/chenasraf/nextcloud-forum/commit/7c5bf4a82b88c3dc64604f73aa66b9742b0f2ee8))
### Bug Fixes
* **Notifications:** test-notifier command ([8ecddc0](https://github.com/chenasraf/nextcloud-forum/commit/8ecddc032f11eae72ba6a12447313d87b2d01570))
* **RepairSeeds:** output logs ([4e867cd](https://github.com/chenasraf/nextcloud-forum/commit/4e867cdf0a91c9d246b87cd2c829a37bbbeefd56))
## [0.8.2](https://github.com/chenasraf/nextcloud-forum/compare/v0.8.1...v0.8.2) (2025-11-21)
### Bug Fixes
* **AdminCategoryList:** pluralization string ([53c1b98](https://github.com/chenasraf/nextcloud-forum/commit/53c1b980a960cf9a27cee68b4da6d4560b426b9c))
* initial seed ([749c30c](https://github.com/chenasraf/nextcloud-forum/commit/749c30c2f276813e19dfa91a81bc12573429c784))
* **l10n:** update bbcode-including strings ([49c1201](https://github.com/chenasraf/nextcloud-forum/commit/49c12011fa4e5dd08f905b3d921f434b9adfc244))
* **l10n:** Update pluralization strings ([d537244](https://github.com/chenasraf/nextcloud-forum/commit/d53724407bd709993c6036b27fd17ced5c82d926))
* **l10n:** update string with literal name ([83b7c33](https://github.com/chenasraf/nextcloud-forum/commit/83b7c3392e8c328391430c3b1945a77ecc6b1a33))
* **l10n:** Update translations from Transifex ([387be93](https://github.com/chenasraf/nextcloud-forum/commit/387be93d3ad5c744fcaca7bb6073293431727e35))
* **Seeds:** log seed statuses in console ([d9cb3a6](https://github.com/chenasraf/nextcloud-forum/commit/d9cb3a6d9b715fe59f383323c3ab30424b25b430))
* **Seeds:** update seed output & add repair command ([e2fd638](https://github.com/chenasraf/nextcloud-forum/commit/e2fd6383d31609076981c38ccf9062a5d505cb19))
## [0.8.1](https://github.com/chenasraf/nextcloud-forum/compare/v0.8.0...v0.8.1) (2025-11-21)
### Bug Fixes
* migration ([c6d757b](https://github.com/chenasraf/nextcloud-forum/commit/c6d757bee606280061a3ba359d3137b95838f444))
## [0.8.0](https://github.com/chenasraf/nextcloud-forum/compare/v0.7.0...v0.8.0) (2025-11-21)

View File

@@ -42,6 +42,10 @@ composer_bin := $(if $(composer),$(composer),php $(composer_phar))
pnpm_wrapper=$(build_tools_directory)/pnpm.sh
pnpm_cmd=$(if $(pnpm),$(pnpm),$(pnpm_wrapper))
# Optional: Set path to Nextcloud installation for local testing
# Can be overridden by environment variable: NEXTCLOUD_ROOT=/path make test
NEXTCLOUD_ROOT ?=
# Default target: install deps & build JS (and PHP if composer.json exists)
all: build
@@ -198,11 +202,38 @@ appstore:
tar czf $(appstore_package_name).tar.gz $(app_name)
# test:
# - Run PHP unit tests (standard + optional integration config)
# - Run PHP unit tests locally with a configured Nextcloud installation
# - Requires: A fully configured and installed Nextcloud instance with database
# - Auto-detects Nextcloud installation or uses NEXTCLOUD_ROOT (Makefile var or env var)
# - RECOMMENDED: Use 'make test-docker' instead (works in any environment)
.PHONY: test
test: composer
$(CURDIR)/vendor/phpunit/phpunit/phpunit -c tests/phpunit.xml
( test ! -f tests/phpunit.integration.xml ) || $(CURDIR)/vendor/phpunit/phpunit/phpunit -c tests/phpunit.integration.xml
@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 ""; \
echo "Local testing requires a fully configured Nextcloud instance."; \
echo ""; \
echo "Options:"; \
echo " 1. Use Docker tests (recommended): \x1b[32mmake test-docker\x1b[0m"; \
echo " 2. Set NEXTCLOUD_ROOT in Makefile (line 47) or as env var:"; \
echo " \x1b[32mNEXTCLOUD_ROOT=/path/to/nextcloud make test\x1b[0m"; \
echo ""; \
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
# test-docker:
# - Run PHP unit tests inside a Nextcloud Docker container
@@ -234,7 +265,7 @@ test-docker:
exit 1; \
fi; \
echo "\x1b[33mRunning tests in container $$CONTAINER_ID for app $$APP_DIR\x1b[0m"; \
docker exec $$CONTAINER_ID phpunit -c apps-shared/$$APP_DIR/tests/phpunit.xml
docker exec $$CONTAINER_ID phpunit -c apps-shared/$$APP_DIR/tests/phpunit.docker.xml
# lint:
# - Lint JS via pnpm and PHP via composer script "lint"

127
README.md
View File

@@ -5,7 +5,9 @@ SPDX-License-Identifier: CC0-1.0
# Nextcloud Forum
![GitHub Release](https://img.shields.io/github/v/release/chenasraf/nextcloud-forum)
[![GitHub Release](https://img.shields.io/github/v/release/chenasraf/nextcloud-forum?color=blue)](https://github.com/chenasraf/nextcloud-forum/releases/latest)
[![PHPUnit MySQL](https://github.com/chenasraf/nextcloud-forum/actions/workflows/phpunit-mysql.yml/badge.svg)](https://github.com/chenasraf/nextcloud-forum/actions/workflows/phpunit-mysql.yml)
[![PHPUnit PostgreSQL](https://github.com/chenasraf/nextcloud-forum/actions/workflows/phpunit-pgsql.yml/badge.svg)](https://github.com/chenasraf/nextcloud-forum/actions/workflows/phpunit-pgsql.yml)
A full-featured forum application for Nextcloud, allowing users to create discussion categories,
threads, and posts within their Nextcloud instance.
@@ -16,8 +18,8 @@ threads, and posts within their Nextcloud instance.
**This app is in early stages of development.** While functional, you may encounter bugs or
incomplete features. Please report any issues on
[GitHub](https://github.com/chenasraf/nextcloud-forum/issues) and consider backing up your data
regularly.
[GitHub](https://github.com/chenasraf/nextcloud-forum/issues/new/choose) and consider backing up
your data regularly.
## Features
@@ -31,6 +33,11 @@ regularly.
- **Search**: Full-text search across threads and posts
- **Modern UI**: Built with Vue 3 and Nextcloud Vue components
## Documentation
For detailed usage instructions, administration guides, and more, visit the
[Forum Wiki](https://github.com/chenasraf/nextcloud-forum/wiki).
## Installation
### From the Nextcloud App Store
@@ -53,6 +60,16 @@ tar xfv forum-vX.X.X.tar.gz
php occ app:enable forum
```
## Administration
### OCC Commands
The Forum app provides several OCC commands for administration and maintenance, including commands
for repairing installations, rebuilding statistics, and managing user roles.
For a complete list of available commands, usage examples, and detailed documentation, see the
[OCC Commands Wiki page](https://github.com/chenasraf/nextcloud-forum/wiki/OCC-Commands).
## Contributing
I am developing this app on my free time, so any support, whether code, issues, or just stars is
@@ -88,55 +105,17 @@ Most development processes are automated:
While automation handles most workflows, the following commands are available for local development
and debugging:
#### Build the App
```bash
make
```
Installs dependencies and compiles frontend/backend assets.
#### Run Tests
```bash
make test
```
Runs unit and integration tests (if available).
#### Format & Lint
```bash
make format # Auto-fix code style
make lint # Check code quality
```
#### Generate OpenAPI Docs
```bash
make openapi
```
Output is saved to `build/openapi/openapi.json`.
#### Packaging for Release
```bash
make appstore # Production build for Nextcloud app store
make source # Full source package
make distclean # Clean build artifacts and dependencies
```
#### Sign Releases
After uploading the archive to GitHub:
```bash
make sign
```
Downloads the `.tar.gz` release, verifies it, and prints a SHA-512 signature using your key at
`~/.nextcloud/certificates/forum.key`.
| Command | Description | Notes |
| ---------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| `make` | Installs dependencies and compiles frontend/backend assets | |
| `make test` | Runs unit and integration tests | |
| `make format` | Auto-fix code style | |
| `make lint` | Check code quality | |
| `make openapi` | Generate OpenAPI documentation | Output saved to `openapi.json` |
| `make appstore` | Production build for Nextcloud app store | |
| `make source` | Create full source package | |
| `make distclean` | Clean build artifacts and dependencies | |
| `make sign` | Sign release archive with SHA-512 signature | Run after uploading `.tar.gz` to GitHub. Uses `~/.nextcloud/certificates/forum.key` |
---
@@ -175,50 +154,6 @@ it for you. It also injects:
You dont pass a name for migrations.
#### Examples
Create a Vue component:
```bash
pnpm gen component UserListItem
# → src/components/UserListItem.vue
```
Create a Vue page:
```bash
pnpm gen view Settings
# → src/views/Settings.vue
```
Create an API controller:
```bash
pnpm gen api Users
# → lib/Controller/UsersController.php
```
Create a service:
```bash
pnpm gen service MyService
# → lib/Service/MyService.php
```
Create a queued job:
```bash
pnpm gen task-queued UpdateUsers
# → lib/Cron/UpdateUsers.php
```
Create a migration (no name):
```bash
pnpm gen migration
# → lib/Migration/Version{NEXT}.php (with injected {version} and {dt})
```
## Resources
### Nextcloud Development

View File

@@ -13,7 +13,7 @@ Create discussions, share ideas, and collaborate with your community directly in
**⚠️ Early Development Notice:**
This 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.
**Key Features:**
**Key features:**
- **Thread-based Discussions** - Create and reply to organized discussion threads
- **Category Organization** - Structure your forum with customizable categories and headers
- **Rich Text Formatting** - Use BBCode for formatting posts with bold, italic, links, images, code blocks and more
@@ -26,7 +26,7 @@ This app is in early stages of development. While functional, you may encounter
- **Admin Tools** - Manage categories, roles, BBCodes, and forum settings
- **Moderation Tools** - Pin, lock, and manage threads and posts
**Perfect For:**
**Perfect for:**
- Team discussions and collaboration
- Community forums
- Support channels
@@ -36,13 +36,13 @@ 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.8.0</version>
<version>0.10.0</version>
<licence>agpl</licence>
<author mail="contact@casraf.dev" homepage="https://casraf.dev">Chen Asraf</author>
<namespace>Forum</namespace>
<documentation>
<user>https://github.com/chenasraf/nextcloud-forum/blob/master/README.md</user>
<admin>https://github.com/chenasraf/nextcloud-forum#installation</admin>
<user>https://github.com/chenasraf/nextcloud-forum/wiki/Users</user>
<admin>https://github.com/chenasraf/nextcloud-forum/wiki/Administration</admin>
<developer>https://github.com/chenasraf/nextcloud-forum#development</developer>
</documentation>
<category>social</category>
@@ -59,11 +59,12 @@ The forum integrates seamlessly with your Nextcloud instance, using your existin
<job>OCA\Forum\Cron\RebuildStatsTask</job>
</background-jobs>
<commands>
<command>OCA\Forum\Command\TestNotifier</command>
<command>OCA\Forum\Command\RebuildUserStats</command>
<command>OCA\Forum\Command\RebuildThreadStats</command>
<command>OCA\Forum\Command\RebuildAllStats</command>
<command>OCA\Forum\Command\RebuildThreadStats</command>
<command>OCA\Forum\Command\RebuildUserStats</command>
<command>OCA\Forum\Command\RepairSeeds</command>
<command>OCA\Forum\Command\SetRole</command>
<command>OCA\Forum\Command\TestNotifier</command>
</commands>
<navigations>
<navigation role="all">

3039
composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

6
l10n/de_DE.js Normal file
View File

@@ -0,0 +1,6 @@
OC.L10N.register(
"forum",
{
"Last 7 Days" : "In den letzten 7 Tagen"
},
"nplurals=2; plural=(n != 1);");

4
l10n/de_DE.json Normal file
View File

@@ -0,0 +1,4 @@
{ "translations": {
"Last 7 Days" : "In den letzten 7 Tagen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

6
l10n/es_CO.js Normal file
View File

@@ -0,0 +1,6 @@
OC.L10N.register(
"forum",
{
"Dashboard" : "Tablero de control"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

4
l10n/es_CO.json Normal file
View File

@@ -0,0 +1,4 @@
{ "translations": {
"Dashboard" : "Tablero de control"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

6
l10n/es_CR.js Normal file
View File

@@ -0,0 +1,6 @@
OC.L10N.register(
"forum",
{
"Dashboard" : "Tablero de control"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

4
l10n/es_CR.json Normal file
View File

@@ -0,0 +1,4 @@
{ "translations": {
"Dashboard" : "Tablero de control"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

6
l10n/es_DO.js Normal file
View File

@@ -0,0 +1,6 @@
OC.L10N.register(
"forum",
{
"Dashboard" : "Tablero de control"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

4
l10n/es_DO.json Normal file
View File

@@ -0,0 +1,4 @@
{ "translations": {
"Dashboard" : "Tablero de control"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

8
l10n/es_EC.js Normal file
View File

@@ -0,0 +1,8 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "Texto subrayado",
"Dashboard" : "Tablero de control",
"Create" : "Crear"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

6
l10n/es_EC.json Normal file
View File

@@ -0,0 +1,6 @@
{ "translations": {
"Underlined text" : "Texto subrayado",
"Dashboard" : "Tablero de control",
"Create" : "Crear"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

8
l10n/es_GT.js Normal file
View File

@@ -0,0 +1,8 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

6
l10n/es_GT.json Normal file
View File

@@ -0,0 +1,6 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

8
l10n/es_HN.js Normal file
View File

@@ -0,0 +1,8 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

6
l10n/es_HN.json Normal file
View File

@@ -0,0 +1,6 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

12
l10n/es_MX.js Normal file
View File

@@ -0,0 +1,12 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "Texto subrayado",
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría",
"Preferences" : "Preferencias",
"Create" : "Crear"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

10
l10n/es_MX.json Normal file
View File

@@ -0,0 +1,10 @@
{ "translations": {
"Underlined text" : "Texto subrayado",
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría",
"Preferences" : "Preferencias",
"Create" : "Crear"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

9
l10n/es_NI.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

7
l10n/es_NI.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

9
l10n/es_PA.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

7
l10n/es_PA.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

9
l10n/es_PE.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

7
l10n/es_PE.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

10
l10n/es_PR.js Normal file
View File

@@ -0,0 +1,10 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Delete" : "Borrar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

8
l10n/es_PR.json Normal file
View File

@@ -0,0 +1,8 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Delete" : "Borrar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

9
l10n/es_PY.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

7
l10n/es_PY.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

11
l10n/es_SV.js Normal file
View File

@@ -0,0 +1,11 @@
OC.L10N.register(
"forum",
{
"Clear" : "Limpiar",
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Delete" : "Borrar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

9
l10n/es_SV.json Normal file
View File

@@ -0,0 +1,9 @@
{ "translations": {
"Clear" : "Limpiar",
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Delete" : "Borrar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

10
l10n/es_UY.js Normal file
View File

@@ -0,0 +1,10 @@
OC.L10N.register(
"forum",
{
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Delete" : "Borrar",
"Uncategorized" : "Sin categoría"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

8
l10n/es_UY.json Normal file
View File

@@ -0,0 +1,8 @@
{ "translations": {
"Save" : "Guardar",
"Dashboard" : "Tablero de control",
"Collapse" : "Colapsar",
"Delete" : "Borrar",
"Uncategorized" : "Sin categoría"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

16
l10n/et_EE.js Normal file
View File

@@ -0,0 +1,16 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "Allajoonitud tekst",
"Light" : "Hele kujundus",
"Clear" : "Tühjenda",
"Save" : "Salvesta",
"Dashboard" : "Töölaud/Juhtpaneel",
"Collapse" : "Sulge",
"Delete" : "Kustuta",
"Uncategorized" : "Määratlemata",
"Preferences" : "Eelistused",
"Create" : "Lisa",
"Last 7 Days" : "Viimase 7 päeva jooksul"
},
"nplurals=2; plural=(n != 1);");

14
l10n/et_EE.json Normal file
View File

@@ -0,0 +1,14 @@
{ "translations": {
"Underlined text" : "Allajoonitud tekst",
"Light" : "Hele kujundus",
"Clear" : "Tühjenda",
"Save" : "Salvesta",
"Dashboard" : "Töölaud/Juhtpaneel",
"Collapse" : "Sulge",
"Delete" : "Kustuta",
"Uncategorized" : "Määratlemata",
"Preferences" : "Eelistused",
"Create" : "Lisa",
"Last 7 Days" : "Viimase 7 päeva jooksul"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

15
l10n/fi.js Normal file
View File

@@ -0,0 +1,15 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "Alleviivattu teksti",
"Light" : "Vaalea",
"Clear" : "Tyhjennä",
"Save" : "Tallenna",
"Dashboard" : "Kojelauta",
"Collapse" : "Kutista näkymää",
"Delete" : "Poista",
"Uncategorized" : "Luokittelematon",
"Preferences" : "Asetukset",
"Create" : "Luo"
},
"nplurals=2; plural=(n != 1);");

13
l10n/fi.json Normal file
View File

@@ -0,0 +1,13 @@
{ "translations": {
"Underlined text" : "Alleviivattu teksti",
"Light" : "Vaalea",
"Clear" : "Tyhjennä",
"Save" : "Tallenna",
"Dashboard" : "Kojelauta",
"Collapse" : "Kutista näkymää",
"Delete" : "Poista",
"Uncategorized" : "Luokittelematon",
"Preferences" : "Asetukset",
"Create" : "Luo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

6
l10n/fo.js Normal file
View File

@@ -0,0 +1,6 @@
OC.L10N.register(
"forum",
{
"Delete" : "Strika"
},
"nplurals=2; plural=(n != 1);");

4
l10n/fo.json Normal file
View File

@@ -0,0 +1,4 @@
{ "translations": {
"Delete" : "Strika"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

11
l10n/gd.js Normal file
View File

@@ -0,0 +1,11 @@
OC.L10N.register(
"forum",
{
"Light" : "Soilleir",
"Save" : "Sàbhail",
"Delete" : "Sguab às",
"Uncategorized" : "Gun seòrsachadh",
"Preferences" : "Roghainnean",
"Create" : "Cruthaich"
},
"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;");

9
l10n/gd.json Normal file
View File

@@ -0,0 +1,9 @@
{ "translations": {
"Light" : "Soilleir",
"Save" : "Sàbhail",
"Delete" : "Sguab às",
"Uncategorized" : "Gun seòrsachadh",
"Preferences" : "Roghainnean",
"Create" : "Cruthaich"
},"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"
}

18
l10n/hu.js Normal file
View File

@@ -0,0 +1,18 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "Aláhúzott szöveg",
"Light" : "Világos",
"Clear" : "Törlés",
"Save" : "Mentés",
"Loading…" : "Betöltés…",
"Dashboard" : "Irányítópult",
"Collapse" : "Összecsukás",
"Delete" : "Törlés",
"React with {emoji}" : "Reagálás ezzel: {emoji}",
"Uncategorized" : "Kategorizálatlan",
"Preferences" : "Beállítások",
"Create" : "Létrehozás",
"Last 7 Days" : "Elmúlt 7 nap"
},
"nplurals=2; plural=(n != 1);");

16
l10n/hu.json Normal file
View File

@@ -0,0 +1,16 @@
{ "translations": {
"Underlined text" : "Aláhúzott szöveg",
"Light" : "Világos",
"Clear" : "Törlés",
"Save" : "Mentés",
"Loading…" : "Betöltés…",
"Dashboard" : "Irányítópult",
"Collapse" : "Összecsukás",
"Delete" : "Törlés",
"React with {emoji}" : "Reagálás ezzel: {emoji}",
"Uncategorized" : "Kategorizálatlan",
"Preferences" : "Beállítások",
"Create" : "Létrehozás",
"Last 7 Days" : "Elmúlt 7 nap"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

9
l10n/ia.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Save" : "Salveguardar",
"Loading…" : "Cargante...",
"Collapse" : "Collaber",
"Delete" : "Deler"
},
"nplurals=2; plural=(n != 1);");

7
l10n/ia.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Save" : "Salveguardar",
"Loading…" : "Cargante...",
"Collapse" : "Collaber",
"Delete" : "Deler"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

18
l10n/ja.js Normal file
View File

@@ -0,0 +1,18 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "下線を引きたい文字",
"Light" : "明るい",
"Clear" : "クリア",
"Save" : "保存する",
"Loading…" : "読み込み中…",
"Dashboard" : "ダッシュボード",
"Collapse" : "折りたたむ",
"Delete" : "削除",
"React with {emoji}" : "{emoji} で反応する",
"Uncategorized" : "未分類",
"Preferences" : "環境設定",
"Create" : "作成",
"Last 7 Days" : "7日以内"
},
"nplurals=1; plural=0;");

16
l10n/ja.json Normal file
View File

@@ -0,0 +1,16 @@
{ "translations": {
"Underlined text" : "下線を引きたい文字",
"Light" : "明るい",
"Clear" : "クリア",
"Save" : "保存する",
"Loading…" : "読み込み中…",
"Dashboard" : "ダッシュボード",
"Collapse" : "折りたたむ",
"Delete" : "削除",
"React with {emoji}" : "{emoji} で反応する",
"Uncategorized" : "未分類",
"Preferences" : "環境設定",
"Create" : "作成",
"Last 7 Days" : "7日以内"
},"pluralForm" :"nplurals=1; plural=0;"
}

11
l10n/ka_GE.js Normal file
View File

@@ -0,0 +1,11 @@
OC.L10N.register(
"forum",
{
"Clear" : "გასუფთავება",
"Save" : "შენახვა",
"Dashboard" : "მთავარი დაფა",
"Collapse" : "აკეცვა",
"Delete" : "წაშლა",
"Uncategorized" : "არაკატეგორიზირებული"
},
"nplurals=2; plural=(n!=1);");

9
l10n/ka_GE.json Normal file
View File

@@ -0,0 +1,9 @@
{ "translations": {
"Clear" : "გასუფთავება",
"Save" : "შენახვა",
"Dashboard" : "მთავარი დაფა",
"Collapse" : "აკეცვა",
"Delete" : "წაშლა",
"Uncategorized" : "არაკატეგორიზირებული"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
}

13
l10n/kab.js Normal file
View File

@@ -0,0 +1,13 @@
OC.L10N.register(
"forum",
{
"Light" : "Aceɛlal",
"Clear" : "Ṣfeḍ",
"Save" : "Sekles",
"Loading…" : "Asali...",
"Dashboard" : "Tafelwit n usenqed",
"Delete" : "Kkes",
"Preferences" : "Tiwelhiwin",
"Create" : "Snulfu-d"
},
"nplurals=2; plural=(n != 1);");

11
l10n/kab.json Normal file
View File

@@ -0,0 +1,11 @@
{ "translations": {
"Light" : "Aceɛlal",
"Clear" : "Ṣfeḍ",
"Save" : "Sekles",
"Loading…" : "Asali...",
"Dashboard" : "Tafelwit n usenqed",
"Delete" : "Kkes",
"Preferences" : "Tiwelhiwin",
"Create" : "Snulfu-d"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

9
l10n/km.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Light" : "ភ្លឺt",
"Save" : "រក្សាទុក",
"Collapse" : "បត់បង្រួម",
"Delete" : "លុប"
},
"nplurals=1; plural=0;");

7
l10n/km.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Light" : "ភ្លឺt",
"Save" : "រក្សាទុក",
"Collapse" : "បត់បង្រួម",
"Delete" : "លុប"
},"pluralForm" :"nplurals=1; plural=0;"
}

9
l10n/lb.js Normal file
View File

@@ -0,0 +1,9 @@
OC.L10N.register(
"forum",
{
"Save" : "Späicheren",
"Loading…" : "Et gëtt gelueden",
"Collapse" : "Zesumme falen",
"Delete" : "Läschen"
},
"nplurals=2; plural=(n != 1);");

7
l10n/lb.json Normal file
View File

@@ -0,0 +1,7 @@
{ "translations": {
"Save" : "Späicheren",
"Loading…" : "Et gëtt gelueden",
"Collapse" : "Zesumme falen",
"Delete" : "Läschen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

19
l10n/lt_LT.js Normal file
View File

@@ -0,0 +1,19 @@
OC.L10N.register(
"forum",
{
"Underlined text" : "Pabrauktas tekstas",
"Light" : "Šviesus",
"Clear" : "Išvalyti",
"Save" : "Įrašyti",
"Loading…" : "Įkeliama…",
"Dashboard" : "Skydelis",
"Collapse" : "Suskleisti",
"Delete" : "Ištrinti",
"React with {emoji}" : "Reaguoti naudojant {emoji}",
"Uncategorized" : "Nekategorizuotas",
"Reply" : "Atsakyt",
"Preferences" : "Nuostatos",
"Create" : "Sukurti",
"Last 7 Days" : "Paskutinės 7 dienos"
},
"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);");

17
l10n/lt_LT.json Normal file
View File

@@ -0,0 +1,17 @@
{ "translations": {
"Underlined text" : "Pabrauktas tekstas",
"Light" : "Šviesus",
"Clear" : "Išvalyti",
"Save" : "Įrašyti",
"Loading…" : "Įkeliama…",
"Dashboard" : "Skydelis",
"Collapse" : "Suskleisti",
"Delete" : "Ištrinti",
"React with {emoji}" : "Reaguoti naudojant {emoji}",
"Uncategorized" : "Nekategorizuotas",
"Reply" : "Atsakyt",
"Preferences" : "Nuostatos",
"Create" : "Sukurti",
"Last 7 Days" : "Paskutinės 7 dienos"
},"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"
}

12
l10n/lv.js Normal file
View File

@@ -0,0 +1,12 @@
OC.L10N.register(
"forum",
{
"Clear" : "Notīrīt",
"Save" : "Saglabāt",
"Loading…" : "Ielādē…",
"Dashboard" : "Informācijas panelis",
"Collapse" : "Sakļaut",
"Delete" : "Izdzēst",
"Uncategorized" : "Bez kategorijas"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");

10
l10n/lv.json Normal file
View File

@@ -0,0 +1,10 @@
{ "translations": {
"Clear" : "Notīrīt",
"Save" : "Saglabāt",
"Loading…" : "Ielādē…",
"Dashboard" : "Informācijas panelis",
"Collapse" : "Sakļaut",
"Delete" : "Izdzēst",
"Uncategorized" : "Bez kategorijas"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
}

10
l10n/mn.js Normal file
View File

@@ -0,0 +1,10 @@
OC.L10N.register(
"forum",
{
"Forum" : "Хэлэлцүүлэг",
"Save" : "Хадгалах",
"Loading…" : "уншиж байна",
"Delete" : "Устгах",
"Create" : "үүсгэх"
},
"nplurals=2; plural=(n != 1);");

8
l10n/mn.json Normal file
View File

@@ -0,0 +1,8 @@
{ "translations": {
"Forum" : "Хэлэлцүүлэг",
"Save" : "Хадгалах",
"Loading…" : "уншиж байна",
"Delete" : "Устгах",
"Create" : "үүсгэх"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

7
l10n/ms_MY.js Normal file
View File

@@ -0,0 +1,7 @@
OC.L10N.register(
"forum",
{
"Save" : "Simpan",
"Delete" : "Padam"
},
"nplurals=1; plural=0;");

5
l10n/ms_MY.json Normal file
View File

@@ -0,0 +1,5 @@
{ "translations": {
"Save" : "Simpan",
"Delete" : "Padam"
},"pluralForm" :"nplurals=1; plural=0;"
}

19
l10n/nb.js Normal file
View File

@@ -0,0 +1,19 @@
OC.L10N.register(
"forum",
{
"Forum" : "Forum",
"Underlined text" : "Understreket tekst",
"Light" : "Lys",
"Clear" : "Tøm",
"Save" : "Lagre",
"Loading…" : "Laster...",
"Dashboard" : "Instrumentpanel",
"Collapse" : "Skjul",
"Delete" : "Slett",
"React with {emoji}" : "Reager med {emoji}",
"Uncategorized" : "Ukategorisert",
"Preferences" : "Innstillinger",
"Create" : "Opprett",
"Active" : "Aktiv"
},
"nplurals=2; plural=(n != 1);");

17
l10n/nb.json Normal file
View File

@@ -0,0 +1,17 @@
{ "translations": {
"Forum" : "Forum",
"Underlined text" : "Understreket tekst",
"Light" : "Lys",
"Clear" : "Tøm",
"Save" : "Lagre",
"Loading…" : "Laster...",
"Dashboard" : "Instrumentpanel",
"Collapse" : "Skjul",
"Delete" : "Slett",
"React with {emoji}" : "Reager med {emoji}",
"Uncategorized" : "Ukategorisert",
"Preferences" : "Innstillinger",
"Create" : "Opprett",
"Active" : "Aktiv"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

21
l10n/nl.js Normal file
View File

@@ -0,0 +1,21 @@
OC.L10N.register(
"forum",
{
"Forum" : "Forum",
"User" : "Gebruiker",
"Underlined text" : "Onderstreepte tekst",
"Light" : "Licht",
"Clear" : "Terug",
"Duplicate" : "Duplicaat",
"Save" : "Opslaan",
"Loading…" : "Laden…",
"Dashboard" : "Dashboard",
"Collapse" : "Inklappen",
"Delete" : "Verwijderen",
"React with {emoji}" : "Reageer met {emoji}",
"Uncategorized" : "Niet gecategoriseerd",
"Preferences" : "Voorkeuren",
"Create" : "Creëer",
"Active" : "Actief"
},
"nplurals=2; plural=(n != 1);");

19
l10n/nl.json Normal file
View File

@@ -0,0 +1,19 @@
{ "translations": {
"Forum" : "Forum",
"User" : "Gebruiker",
"Underlined text" : "Onderstreepte tekst",
"Light" : "Licht",
"Clear" : "Terug",
"Duplicate" : "Duplicaat",
"Save" : "Opslaan",
"Loading…" : "Laden…",
"Dashboard" : "Dashboard",
"Collapse" : "Inklappen",
"Delete" : "Verwijderen",
"React with {emoji}" : "Reageer met {emoji}",
"Uncategorized" : "Niet gecategoriseerd",
"Preferences" : "Voorkeuren",
"Create" : "Creëer",
"Active" : "Actief"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

12
l10n/nn_NO.js Normal file
View File

@@ -0,0 +1,12 @@
OC.L10N.register(
"forum",
{
"Forum" : "Forum",
"User" : "Bruker",
"Save" : "Lagre",
"Loading…" : "Lastar...",
"Dashboard" : "Skrivebord",
"Delete" : "Slett",
"Reply" : "Svare"
},
"nplurals=2; plural=(n != 1);");

10
l10n/nn_NO.json Normal file
View File

@@ -0,0 +1,10 @@
{ "translations": {
"Forum" : "Forum",
"User" : "Bruker",
"Save" : "Lagre",
"Loading…" : "Lastar...",
"Dashboard" : "Skrivebord",
"Delete" : "Slett",
"Reply" : "Svare"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

18
l10n/oc.js Normal file
View File

@@ -0,0 +1,18 @@
OC.L10N.register(
"forum",
{
"Forum" : "Forum",
"User" : "Utilizator",
"Light" : "Clar",
"Clear" : "Escafar",
"Save" : "Enregistrar",
"Loading…" : "Telecargament…",
"Dashboard" : "Tablèu de bòrd",
"Collapse" : "Replegar",
"Delete" : "Suprimir",
"React with {emoji}" : "Reagir amb {emoji}",
"Uncategorized" : "Desorganizadas",
"Create" : "Crear",
"Active" : "Activa"
},
"nplurals=2; plural=(n > 1);");

16
l10n/oc.json Normal file
View File

@@ -0,0 +1,16 @@
{ "translations": {
"Forum" : "Forum",
"User" : "Utilizator",
"Light" : "Clar",
"Clear" : "Escafar",
"Save" : "Enregistrar",
"Loading…" : "Telecargament…",
"Dashboard" : "Tablèu de bòrd",
"Collapse" : "Replegar",
"Delete" : "Suprimir",
"React with {emoji}" : "Reagir amb {emoji}",
"Uncategorized" : "Desorganizadas",
"Create" : "Crear",
"Active" : "Activa"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

7
l10n/ps.js Normal file
View File

@@ -0,0 +1,7 @@
OC.L10N.register(
"forum",
{
"Save" : "ساتل",
"Delete" : "ړنګول"
},
"nplurals=2; plural=(n != 1);");

5
l10n/ps.json Normal file
View File

@@ -0,0 +1,5 @@
{ "translations": {
"Save" : "ساتل",
"Delete" : "ړنګول"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

25
l10n/pt_BR.js Normal file
View File

@@ -0,0 +1,25 @@
OC.L10N.register(
"forum",
{
"Forum" : "Fórum",
"User" : "Usuário",
"Underlined text" : "Texto sublinhado",
"Light" : "Claro",
"Clear" : "Limpar",
"Duplicate" : "Duplicar",
"Save" : "Salvar",
"Loading…" : "Carregando…",
"Dashboard" : "Painel",
"Collapse" : "Recolher",
"Delete" : "Excluir",
"React with {emoji}" : "Reagir com {emoji}",
"Uncategorized" : "Sem categoria",
"Reply" : "Resposta",
"Preferences" : "Preferências",
"Create" : "Criar",
"Enter category name" : "Insira o nome da categoria",
"Last 7 Days" : "Nos Últimos 7 Dias",
"Failed to save settings" : "Falha ao salvar configurações",
"Active" : "Ativada"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

23
l10n/pt_BR.json Normal file
View File

@@ -0,0 +1,23 @@
{ "translations": {
"Forum" : "Fórum",
"User" : "Usuário",
"Underlined text" : "Texto sublinhado",
"Light" : "Claro",
"Clear" : "Limpar",
"Duplicate" : "Duplicar",
"Save" : "Salvar",
"Loading…" : "Carregando…",
"Dashboard" : "Painel",
"Collapse" : "Recolher",
"Delete" : "Excluir",
"React with {emoji}" : "Reagir com {emoji}",
"Uncategorized" : "Sem categoria",
"Reply" : "Resposta",
"Preferences" : "Preferências",
"Create" : "Criar",
"Enter category name" : "Insira o nome da categoria",
"Last 7 Days" : "Nos Últimos 7 Dias",
"Failed to save settings" : "Falha ao salvar configurações",
"Active" : "Ativada"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

21
l10n/pt_PT.js Normal file
View File

@@ -0,0 +1,21 @@
OC.L10N.register(
"forum",
{
"Forum" : "Fórum",
"User" : "Utilizador",
"Underlined text" : "Texto sublinhado",
"Light" : "Claro",
"Clear" : "Limpar",
"Save" : "Guardar",
"Loading…" : "A carregar…",
"Dashboard" : "Painel de controle",
"Collapse" : "Expandir",
"Delete" : "Eliminar",
"Uncategorized" : "Sem categoria ",
"Reply" : "Responder",
"Preferences" : "Preferências",
"Create" : "Criar",
"Failed to save settings" : "Erro ao gravar as definições",
"Category" : "Categoria"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

19
l10n/pt_PT.json Normal file
View File

@@ -0,0 +1,19 @@
{ "translations": {
"Forum" : "Fórum",
"User" : "Utilizador",
"Underlined text" : "Texto sublinhado",
"Light" : "Claro",
"Clear" : "Limpar",
"Save" : "Guardar",
"Loading…" : "A carregar…",
"Dashboard" : "Painel de controle",
"Collapse" : "Expandir",
"Delete" : "Eliminar",
"Uncategorized" : "Sem categoria ",
"Reply" : "Responder",
"Preferences" : "Preferências",
"Create" : "Criar",
"Failed to save settings" : "Erro ao gravar as definições",
"Category" : "Categoria"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

25
l10n/ru.js Normal file
View File

@@ -0,0 +1,25 @@
OC.L10N.register(
"forum",
{
"Forum" : "Форум",
"User" : "Пользователь",
"Underlined text" : "Подчеркнутый текст",
"Light" : "Светлое",
"Clear" : "Очистить",
"Duplicate" : "Дублировать",
"Save" : "Сохранить",
"Loading…" : "Загрузка…",
"Dashboard" : "Виджеты",
"Collapse" : "Свернуть",
"Delete" : "Удалить",
"React with {emoji}" : "Отреагируйте с {emoji}",
"Uncategorized" : "Без категории",
"Reply" : "Ответ",
"Preferences" : "Свойства",
"Create" : "Создать",
"Last 7 Days" : "Последние 7 дней",
"Failed to save settings" : "Не удалось сохранить параметры",
"Category" : "Категория",
"Active" : "Активно"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");

23
l10n/ru.json Normal file
View File

@@ -0,0 +1,23 @@
{ "translations": {
"Forum" : "Форум",
"User" : "Пользователь",
"Underlined text" : "Подчеркнутый текст",
"Light" : "Светлое",
"Clear" : "Очистить",
"Duplicate" : "Дублировать",
"Save" : "Сохранить",
"Loading…" : "Загрузка…",
"Dashboard" : "Виджеты",
"Collapse" : "Свернуть",
"Delete" : "Удалить",
"React with {emoji}" : "Отреагируйте с {emoji}",
"Uncategorized" : "Без категории",
"Reply" : "Ответ",
"Preferences" : "Свойства",
"Create" : "Создать",
"Last 7 Days" : "Последние 7 дней",
"Failed to save settings" : "Не удалось сохранить параметры",
"Category" : "Категория",
"Active" : "Активно"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
}

20
l10n/sc.js Normal file
View File

@@ -0,0 +1,20 @@
OC.L10N.register(
"forum",
{
"Forum" : "Forum",
"User" : "Utente",
"Light" : "Craru",
"Clear" : "Lìmpia",
"Save" : "Sarva",
"Loading…" : "Carrighende…",
"Dashboard" : "Pannellu de controllu",
"Collapse" : "Cuntrae",
"Delete" : "Cantzella",
"Reply" : "Risponde",
"Preferences" : "Preferèntzias",
"Create" : "Crea",
"Failed to save settings" : "No at fatu a sarvare is informatziones",
"Category" : "Categorias",
"Active" : "Ativu"
},
"nplurals=2; plural=(n != 1);");

18
l10n/sc.json Normal file
View File

@@ -0,0 +1,18 @@
{ "translations": {
"Forum" : "Forum",
"User" : "Utente",
"Light" : "Craru",
"Clear" : "Lìmpia",
"Save" : "Sarva",
"Loading…" : "Carrighende…",
"Dashboard" : "Pannellu de controllu",
"Collapse" : "Cuntrae",
"Delete" : "Cantzella",
"Reply" : "Risponde",
"Preferences" : "Preferèntzias",
"Create" : "Crea",
"Failed to save settings" : "No at fatu a sarvare is informatziones",
"Category" : "Categorias",
"Active" : "Ativu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

25
l10n/sk.js Normal file
View File

@@ -0,0 +1,25 @@
OC.L10N.register(
"forum",
{
"Forum" : "Fórum",
"User" : "Používateľ",
"Underlined text" : "Podčiarknutý text",
"Light" : "Svetlé",
"Clear" : "Vyčistiť",
"Duplicate" : "Duplikát",
"Save" : "Uložiť",
"Loading…" : "Nahrávam...",
"Dashboard" : "Infopanel",
"Collapse" : "Zvinúť",
"Delete" : "Vymazať",
"React with {emoji}" : "Reagovať s {emoji}",
"Uncategorized" : "Nezaradené",
"Reply" : "Odpovedať",
"Preferences" : "Nastavenia",
"Create" : "Vytvoriť",
"Last 7 Days" : "Posledných 7 dní",
"Failed to save settings" : "Nepodarilo sa uložiť nastavenia",
"Category" : "Kategória",
"Active" : "Aktívne"
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");

23
l10n/sk.json Normal file
View File

@@ -0,0 +1,23 @@
{ "translations": {
"Forum" : "Fórum",
"User" : "Používateľ",
"Underlined text" : "Podčiarknutý text",
"Light" : "Svetlé",
"Clear" : "Vyčistiť",
"Duplicate" : "Duplikát",
"Save" : "Uložiť",
"Loading…" : "Nahrávam...",
"Dashboard" : "Infopanel",
"Collapse" : "Zvinúť",
"Delete" : "Vymazať",
"React with {emoji}" : "Reagovať s {emoji}",
"Uncategorized" : "Nezaradené",
"Reply" : "Odpovedať",
"Preferences" : "Nastavenia",
"Create" : "Vytvoriť",
"Last 7 Days" : "Posledných 7 dní",
"Failed to save settings" : "Nepodarilo sa uložiť nastavenia",
"Category" : "Kategória",
"Active" : "Aktívne"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
}

24
l10n/sl.js Normal file
View File

@@ -0,0 +1,24 @@
OC.L10N.register(
"forum",
{
"Forum" : "Spletni forum",
"User" : "Uporabnik",
"Underlined text" : "Podpisano besedilo",
"Light" : "Svetla",
"Clear" : "Počisti",
"Duplicate" : "Podvoji",
"Save" : "Shrani",
"Loading…" : "Poteka nalaganje …",
"Dashboard" : "Nadzorna plošča",
"Collapse" : "Skrči",
"Delete" : "Izbriši",
"React with {emoji}" : "Odzovi se z {emoji}",
"Uncategorized" : "Neopredeljeno",
"Preferences" : "Nastavitve",
"Create" : "Ustvari",
"Permissions" : "Dovoljenja",
"Failed to save settings" : "Shranjevanje nastavitev je spodletelo",
"Category" : "Kategorija",
"Active" : "Dejavno"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");

22
l10n/sl.json Normal file
View File

@@ -0,0 +1,22 @@
{ "translations": {
"Forum" : "Spletni forum",
"User" : "Uporabnik",
"Underlined text" : "Podpisano besedilo",
"Light" : "Svetla",
"Clear" : "Počisti",
"Duplicate" : "Podvoji",
"Save" : "Shrani",
"Loading…" : "Poteka nalaganje …",
"Dashboard" : "Nadzorna plošča",
"Collapse" : "Skrči",
"Delete" : "Izbriši",
"React with {emoji}" : "Odzovi se z {emoji}",
"Uncategorized" : "Neopredeljeno",
"Preferences" : "Nastavitve",
"Create" : "Ustvari",
"Permissions" : "Dovoljenja",
"Failed to save settings" : "Shranjevanje nastavitev je spodletelo",
"Category" : "Kategorija",
"Active" : "Dejavno"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
}

27
l10n/sr.js Normal file
View File

@@ -0,0 +1,27 @@
OC.L10N.register(
"forum",
{
"Forum" : "Форум",
"User" : "Корисник",
"Underlined text" : "Подвучени текст",
"Light" : "светла",
"Clear" : "Очисти",
"Duplicate" : "Дупликат",
"Save" : "Сачувај",
"Loading…" : "Учитавам…",
"Dashboard" : "Контролна табла",
"Collapse" : "Скупи",
"Delete" : "Обриши",
"React with {emoji}" : "Реагуј са {emoji}",
"Uncategorized" : "Некатегоризовано",
"Refresh" : "Освежи",
"Reply" : "Одговори",
"Preferences" : "Поставке",
"Create" : "Креирање",
"Permissions" : "Дозволе",
"Last 7 Days" : "Последњих 7 дана",
"Failed to save settings" : "Грешка приликом чувања поставки",
"Category" : "Категорија",
"Active" : "Активан"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");

25
l10n/sr.json Normal file
View File

@@ -0,0 +1,25 @@
{ "translations": {
"Forum" : "Форум",
"User" : "Корисник",
"Underlined text" : "Подвучени текст",
"Light" : "светла",
"Clear" : "Очисти",
"Duplicate" : "Дупликат",
"Save" : "Сачувај",
"Loading…" : "Учитавам…",
"Dashboard" : "Контролна табла",
"Collapse" : "Скупи",
"Delete" : "Обриши",
"React with {emoji}" : "Реагуј са {emoji}",
"Uncategorized" : "Некатегоризовано",
"Refresh" : "Освежи",
"Reply" : "Одговори",
"Preferences" : "Поставке",
"Create" : "Креирање",
"Permissions" : "Дозволе",
"Last 7 Days" : "Последњих 7 дана",
"Failed to save settings" : "Грешка приликом чувања поставки",
"Category" : "Категорија",
"Active" : "Активан"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
}

29
l10n/sv.js Normal file
View File

@@ -0,0 +1,29 @@
OC.L10N.register(
"forum",
{
"Forum" : "Forum",
"User" : "Användare",
"Underlined text" : "Understruken text",
"Light" : "Ljust",
"Dark" : "Mörkt",
"Clear" : "Rensa",
"Duplicate" : "Duplicera",
"Save" : "Spara",
"Loading…" : "Laddar...",
"Dashboard" : "Dashboard",
"Collapse" : "Dölj",
"Delete" : "Ta bort",
"Unread" : "Oläst",
"React with {emoji}" : "Reagera med {emoji}",
"Uncategorized" : "Okategoriserade",
"Refresh" : "Uppdatera",
"Reply" : "Svara",
"Preferences" : "Inställningar",
"Create" : "Skapa",
"Permissions" : "Behörigheter",
"Last 7 Days" : "Senaste 7 dagarna",
"Failed to save settings" : "Kunde inte spara inställningarna",
"Category" : "Kategori",
"Active" : "Aktiv"
},
"nplurals=2; plural=(n != 1);");

27
l10n/sv.json Normal file
View File

@@ -0,0 +1,27 @@
{ "translations": {
"Forum" : "Forum",
"User" : "Användare",
"Underlined text" : "Understruken text",
"Light" : "Ljust",
"Dark" : "Mörkt",
"Clear" : "Rensa",
"Duplicate" : "Duplicera",
"Save" : "Spara",
"Loading…" : "Laddar...",
"Dashboard" : "Dashboard",
"Collapse" : "Dölj",
"Delete" : "Ta bort",
"Unread" : "Oläst",
"React with {emoji}" : "Reagera med {emoji}",
"Uncategorized" : "Okategoriserade",
"Refresh" : "Uppdatera",
"Reply" : "Svara",
"Preferences" : "Inställningar",
"Create" : "Skapa",
"Permissions" : "Behörigheter",
"Last 7 Days" : "Senaste 7 dagarna",
"Failed to save settings" : "Kunde inte spara inställningarna",
"Category" : "Kategori",
"Active" : "Aktiv"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

27
l10n/sw.js Normal file
View File

@@ -0,0 +1,27 @@
OC.L10N.register(
"forum",
{
"User" : "Mtumiaji",
"Light" : "Mwanga/nuru",
"Dark" : "Giza",
"Clear" : "Futa",
"Duplicate" : "Zalisha",
"Save" : "Hifadhi",
"Loading…" : "Inapakia",
"Dashboard" : " Dashibodi",
"Collapse" : "Vunja",
"Delete" : "Futa",
"React with {emoji}" : "Jibu kwa {emoji}",
"Uncategorized" : "Haitambuliki",
"Refresh" : "Onyesha upya",
"Reply" : "Jibu",
"Preferences" : "Vitu vya upendeleo",
"Create" : "Tengeneza",
"Enter category name" : "Enter category name",
"Permissions" : "Ruhusa",
"Last 7 Days" : "Siku 7 zilizopita",
"Failed to save settings" : "Imeshindwa kuhifadhi mipangilio",
"Category" : "Kipengele",
"Active" : "Inayotumika"
},
"nplurals=2; plural=(n != 1);");

25
l10n/sw.json Normal file
View File

@@ -0,0 +1,25 @@
{ "translations": {
"User" : "Mtumiaji",
"Light" : "Mwanga/nuru",
"Dark" : "Giza",
"Clear" : "Futa",
"Duplicate" : "Zalisha",
"Save" : "Hifadhi",
"Loading…" : "Inapakia",
"Dashboard" : " Dashibodi",
"Collapse" : "Vunja",
"Delete" : "Futa",
"React with {emoji}" : "Jibu kwa {emoji}",
"Uncategorized" : "Haitambuliki",
"Refresh" : "Onyesha upya",
"Reply" : "Jibu",
"Preferences" : "Vitu vya upendeleo",
"Create" : "Tengeneza",
"Enter category name" : "Enter category name",
"Permissions" : "Ruhusa",
"Last 7 Days" : "Siku 7 zilizopita",
"Failed to save settings" : "Imeshindwa kuhifadhi mipangilio",
"Category" : "Kipengele",
"Active" : "Inayotumika"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

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