Compare commits

..

1 Commits

2690 changed files with 21998 additions and 51644 deletions

View File

View File

View File

@@ -21,6 +21,8 @@ jobs:
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
@@ -35,9 +37,6 @@ jobs:
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get current date in NST
run: echo "CURRENT_DATE_NST=$(date +'%Y%m%d-%H%M%S' -d '-3 hours -30 minutes')" >> $GITHUB_ENV
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
@@ -49,22 +48,12 @@ jobs:
type=semver,pattern={{major}}.x
type=raw,value=latest,enable={{is_default_branch}}
type=ref,event=branch,enable=${{ github.event.repository.default_branch != github.ref }}
type=raw,value=${{ env.CURRENT_DATE_NST }}
flavor: |
latest=true
- name: Cache node_modules
id: cache-node-modules
uses: actions/cache@v4
with:
path: var-cache-node-modules
key: var-cache-node-modules-${{ hashFiles('Dockerfile', 'install/package.json') }}
- name: Build and push Docker images
uses: docker/build-push-action@v6
uses: docker/build-push-action@v5
with:
cache-from: type=gha
cache-to: type=gha,mode=min
cache-to: type=gha,mode=max
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7

View File

@@ -48,7 +48,7 @@ jobs:
services:
postgres:
image: 'postgres:17-alpine'
image: 'postgres:16-alpine'
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
@@ -63,7 +63,7 @@ jobs:
- 5432:5432
redis:
image: 'redis:7.4.2'
image: 'redis:7.2.3'
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
@@ -75,7 +75,7 @@ jobs:
- 6379:6379
mongo:
image: 'mongo:8.0'
image: 'mongo:7.0'
ports:
# Maps port 27017 on service container to the host
- 27017:27017
@@ -192,7 +192,7 @@ jobs:
run: npm run coverage
- name: Test coverage
uses: coverallsapp/github-action@cfd0633edbd2411b532b808ba7a8b5e04f76d2c8 # v2.3.4
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # v2.2.3
if: matrix.coverage
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -206,7 +206,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Coveralls Finished
uses: coverallsapp/github-action@cfd0633edbd2411b532b808ba7a8b5e04f76d2c8 # v2.3.4
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # v2.2.3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
parallel-finished: true

3
.gitignore vendored
View File

@@ -71,5 +71,4 @@ package-lock.json
link-plugins.sh
test.sh
.docker/**
!**/.gitkeep
.docker/

View File

@@ -28,7 +28,6 @@ trans.fa_IR = public/language/fa-IR/admin/admin.json
trans.id = public/language/id/admin/admin.json
trans.ms = public/language/ms/admin/admin.json
trans.nb = public/language/nb/admin/admin.json
trans.nn_NO = public/language/nn-NO/admin/admin.json
trans.sk = public/language/sk/admin/admin.json
trans.cs = public/language/cs/admin/admin.json
trans.fi = public/language/fi/admin/admin.json
@@ -87,7 +86,6 @@ trans.bg = public/language/bg/admin/advanced/cache.json
trans.cs = public/language/cs/admin/advanced/cache.json
trans.lt = public/language/lt/admin/advanced/cache.json
trans.nb = public/language/nb/admin/advanced/cache.json
trans.nn_NO = public/language/nn-NO/admin/advanced/cache.json
trans.uk = public/language/uk/admin/advanced/cache.json
trans.el = public/language/el/admin/advanced/cache.json
trans.pl = public/language/pl/admin/advanced/cache.json
@@ -129,7 +127,6 @@ trans.zh_TW = public/language/zh-TW/admin/advanced/database.json
trans.gl = public/language/gl/admin/advanced/database.json
trans.it = public/language/it/admin/advanced/database.json
trans.nb = public/language/nb/admin/advanced/database.json
trans.nn_NO = public/language/nn-NO/admin/advanced/database.json
trans.bn = public/language/bn/admin/advanced/database.json
trans.da = public/language/da/admin/advanced/database.json
trans.de = public/language/de/admin/advanced/database.json
@@ -179,7 +176,6 @@ trans.vi = public/language/vi/admin/advanced/errors.json
trans.de = public/language/de/admin/advanced/errors.json
trans.ko = public/language/ko/admin/advanced/errors.json
trans.nb = public/language/nb/admin/advanced/errors.json
trans.nn_NO = public/language/nn-NO/admin/advanced/errors.json
trans.sc = public/language/sc/admin/advanced/errors.json
trans.sl = public/language/sl/admin/advanced/errors.json
trans.tr = public/language/tr/admin/advanced/errors.json
@@ -236,7 +232,6 @@ trans.fa_IR = public/language/fa-IR/admin/advanced/events.json
trans.ms = public/language/ms/admin/advanced/events.json
trans.tr = public/language/tr/admin/advanced/events.json
trans.nb = public/language/nb/admin/advanced/events.json
trans.nn_NO = public/language/nn-NO/admin/advanced/events.json
trans.pt_PT = public/language/pt-PT/admin/advanced/events.json
trans.sk = public/language/sk/admin/advanced/events.json
trans.en@pirate = public/language/en-x-pirate/admin/advanced/events.json
@@ -281,7 +276,6 @@ trans.hr = public/language/hr/admin/advanced/logs.json
trans.ja = public/language/ja/admin/advanced/logs.json
trans.lt = public/language/lt/admin/advanced/logs.json
trans.nb = public/language/nb/admin/advanced/logs.json
trans.nn_NO = public/language/nn-NO/admin/advanced/logs.json
trans.rw = public/language/rw/admin/advanced/logs.json
trans.es = public/language/es/admin/advanced/logs.json
trans.sv = public/language/sv/admin/advanced/logs.json
@@ -334,7 +328,6 @@ trans.bg = public/language/bg/admin/appearance/customise.json
trans.he = public/language/he/admin/appearance/customise.json
trans.lt = public/language/lt/admin/appearance/customise.json
trans.nb = public/language/nb/admin/appearance/customise.json
trans.nn_NO = public/language/nn-NO/admin/appearance/customise.json
trans.pl = public/language/pl/admin/appearance/customise.json
trans.sl = public/language/sl/admin/appearance/customise.json
trans.zh_TW = public/language/zh-TW/admin/appearance/customise.json
@@ -409,7 +402,6 @@ trans.en@pirate = public/language/en-x-pirate/admin/appearance/skins.json
trans.it = public/language/it/admin/appearance/skins.json
trans.ja = public/language/ja/admin/appearance/skins.json
trans.nb = public/language/nb/admin/appearance/skins.json
trans.nn_NO = public/language/nn-NO/admin/appearance/skins.json
trans.fr = public/language/fr/admin/appearance/skins.json
trans.fa_IR = public/language/fa-IR/admin/appearance/skins.json
trans.gl = public/language/gl/admin/appearance/skins.json
@@ -461,7 +453,6 @@ trans.hy = public/language/hy/admin/appearance/themes.json
trans.id = public/language/id/admin/appearance/themes.json
trans.ko = public/language/ko/admin/appearance/themes.json
trans.nb = public/language/nb/admin/appearance/themes.json
trans.nn_NO = public/language/nn-NO/admin/appearance/themes.json
trans.pl = public/language/pl/admin/appearance/themes.json
trans.pt_PT = public/language/pt-PT/admin/appearance/themes.json
trans.tr = public/language/tr/admin/appearance/themes.json
@@ -529,7 +520,6 @@ trans.fi = public/language/fi/admin/dashboard.json
trans.hr = public/language/hr/admin/dashboard.json
trans.it = public/language/it/admin/dashboard.json
trans.nb = public/language/nb/admin/dashboard.json
trans.nn_NO = public/language/nn-NO/admin/dashboard.json
[o:nodebb:p:nodebb:r:admin-development-info]
file_filter = public/language/<lang>/admin/development/info.json
@@ -566,7 +556,6 @@ trans.zh_CN = public/language/zh-CN/admin/development/info.json
trans.cs = public/language/cs/admin/development/info.json
trans.ja = public/language/ja/admin/development/info.json
trans.nb = public/language/nb/admin/development/info.json
trans.nn_NO = public/language/nn-NO/admin/development/info.json
trans.sq_AL = public/language/sq-AL/admin/development/info.json
trans.sv = public/language/sv/admin/development/info.json
trans.bg = public/language/bg/admin/development/info.json
@@ -602,7 +591,6 @@ trans.id = public/language/id/admin/development/logger.json
trans.ko = public/language/ko/admin/development/logger.json
trans.lt = public/language/lt/admin/development/logger.json
trans.nb = public/language/nb/admin/development/logger.json
trans.nn_NO = public/language/nn-NO/admin/development/logger.json
trans.pt_BR = public/language/pt-BR/admin/development/logger.json
trans.ro = public/language/ro/admin/development/logger.json
trans.fi = public/language/fi/admin/development/logger.json
@@ -654,7 +642,6 @@ trans.th = public/language/th/admin/extend/plugins.json
trans.en_US = public/language/en-US/admin/extend/plugins.json
trans.he = public/language/he/admin/extend/plugins.json
trans.nb = public/language/nb/admin/extend/plugins.json
trans.nn_NO = public/language/nn-NO/admin/extend/plugins.json
trans.sk = public/language/sk/admin/extend/plugins.json
trans.uk = public/language/uk/admin/extend/plugins.json
trans.es = public/language/es/admin/extend/plugins.json
@@ -715,7 +702,6 @@ trans.hr = public/language/hr/admin/extend/rewards.json
trans.ja = public/language/ja/admin/extend/rewards.json
trans.ko = public/language/ko/admin/extend/rewards.json
trans.nb = public/language/nb/admin/extend/rewards.json
trans.nn_NO = public/language/nn-NO/admin/extend/rewards.json
trans.bg = public/language/bg/admin/extend/rewards.json
trans.bn = public/language/bn/admin/extend/rewards.json
trans.da = public/language/da/admin/extend/rewards.json
@@ -752,7 +738,6 @@ trans.bn = public/language/bn/admin/extend/widgets.json
trans.el = public/language/el/admin/extend/widgets.json
trans.id = public/language/id/admin/extend/widgets.json
trans.nb = public/language/nb/admin/extend/widgets.json
trans.nn_NO = public/language/nn-NO/admin/extend/widgets.json
trans.ro = public/language/ro/admin/extend/widgets.json
trans.rw = public/language/rw/admin/extend/widgets.json
trans.ar = public/language/ar/admin/extend/widgets.json
@@ -803,7 +788,6 @@ source_lang = en_GB
type = KEYVALUEJSON
trans.hu = public/language/hu/admin/manage/admins-mods.json
trans.nb = public/language/nb/admin/manage/admins-mods.json
trans.nn_NO = public/language/nn-NO/admin/manage/admins-mods.json
trans.ru = public/language/ru/admin/manage/admins-mods.json
trans.fr = public/language/fr/admin/manage/admins-mods.json
trans.he = public/language/he/admin/manage/admins-mods.json
@@ -870,7 +854,6 @@ trans.en_US = public/language/en-US/admin/manage/categories.json
trans.fr = public/language/fr/admin/manage/categories.json
trans.it = public/language/it/admin/manage/categories.json
trans.nb = public/language/nb/admin/manage/categories.json
trans.nn_NO = public/language/nn-NO/admin/manage/categories.json
trans.ru = public/language/ru/admin/manage/categories.json
trans.sr = public/language/sr/admin/manage/categories.json
trans.fa_IR = public/language/fa-IR/admin/manage/categories.json
@@ -947,7 +930,6 @@ trans.zh_CN = public/language/zh-CN/admin/manage/digest.json
trans.ar = public/language/ar/admin/manage/digest.json
trans.ja = public/language/ja/admin/manage/digest.json
trans.nb = public/language/nb/admin/manage/digest.json
trans.nn_NO = public/language/nn-NO/admin/manage/digest.json
trans.sk = public/language/sk/admin/manage/digest.json
trans.pt_PT = public/language/pt-PT/admin/manage/digest.json
trans.sc = public/language/sc/admin/manage/digest.json
@@ -965,7 +947,6 @@ trans.tr = public/language/tr/admin/manage/groups.json
trans.uk = public/language/uk/admin/manage/groups.json
trans.zh_TW = public/language/zh-TW/admin/manage/groups.json
trans.nb = public/language/nb/admin/manage/groups.json
trans.nn_NO = public/language/nn-NO/admin/manage/groups.json
trans.id = public/language/id/admin/manage/groups.json
trans.lt = public/language/lt/admin/manage/groups.json
trans.pl = public/language/pl/admin/manage/groups.json
@@ -1037,7 +1018,6 @@ trans.hy = public/language/hy/admin/manage/privileges.json
trans.sr = public/language/sr/admin/manage/privileges.json
trans.ja = public/language/ja/admin/manage/privileges.json
trans.nb = public/language/nb/admin/manage/privileges.json
trans.nn_NO = public/language/nn-NO/admin/manage/privileges.json
trans.nl = public/language/nl/admin/manage/privileges.json
trans.sv = public/language/sv/admin/manage/privileges.json
trans.et = public/language/et/admin/manage/privileges.json
@@ -1081,7 +1061,6 @@ trans.da = public/language/da/admin/manage/registration.json
trans.et = public/language/et/admin/manage/registration.json
trans.it = public/language/it/admin/manage/registration.json
trans.nb = public/language/nb/admin/manage/registration.json
trans.nn_NO = public/language/nn-NO/admin/manage/registration.json
trans.pt_BR = public/language/pt-BR/admin/manage/registration.json
trans.hy = public/language/hy/admin/manage/registration.json
trans.uk = public/language/uk/admin/manage/registration.json
@@ -1125,7 +1104,6 @@ trans.da = public/language/da/admin/manage/tags.json
trans.en_US = public/language/en-US/admin/manage/tags.json
trans.hu = public/language/hu/admin/manage/tags.json
trans.nb = public/language/nb/admin/manage/tags.json
trans.nn_NO = public/language/nn-NO/admin/manage/tags.json
trans.ru = public/language/ru/admin/manage/tags.json
trans.sq_AL = public/language/sq-AL/admin/manage/tags.json
trans.de = public/language/de/admin/manage/tags.json
@@ -1174,7 +1152,6 @@ source_lang = en_GB
type = KEYVALUEJSON
trans.ms = public/language/ms/admin/manage/uploads.json
trans.nb = public/language/nb/admin/manage/uploads.json
trans.nn_NO = public/language/nn-NO/admin/manage/uploads.json
trans.tr = public/language/tr/admin/manage/uploads.json
trans.bg = public/language/bg/admin/manage/uploads.json
trans.bn = public/language/bn/admin/manage/uploads.json
@@ -1220,59 +1197,6 @@ trans.id = public/language/id/admin/manage/uploads.json
trans.it = public/language/it/admin/manage/uploads.json
trans.ja = public/language/ja/admin/manage/uploads.json
[o:nodebb:p:nodebb:r:admin-manage-user-custom-fields]
file_filter = public/language/<lang>/admin/manage/user-custom-fields.json
source_file = public/language/en-GB/admin/manage/user-custom-fields.json
source_lang = en_GB
type = KEYVALUEJSON
trans.uk = public/language/uk/admin/manage/user-custom-fields.json
trans.en@pirate = public/language/en-x-pirate/admin/manage/user-custom-fields.json
trans.en_US = public/language/en-US/admin/manage/user-custom-fields.json
trans.fr = public/language/fr/admin/manage/user-custom-fields.json
trans.ko = public/language/ko/admin/manage/user-custom-fields.json
trans.ms = public/language/ms/admin/manage/user-custom-fields.json
trans.nb = public/language/nb/admin/manage/user-custom-fields.json
trans.nn_NO = public/language/nn-NO/admin/manage/user-custom-fields.json
trans.pt_BR = public/language/pt-BR/admin/manage/user-custom-fields.json
trans.zh_CN = public/language/zh-CN/admin/manage/user-custom-fields.json
trans.zh_TW = public/language/zh-TW/admin/manage/user-custom-fields.json
trans.cs = public/language/cs/admin/manage/user-custom-fields.json
trans.gl = public/language/gl/admin/manage/user-custom-fields.json
trans.rw = public/language/rw/admin/manage/user-custom-fields.json
trans.bg = public/language/bg/admin/manage/user-custom-fields.json
trans.de = public/language/de/admin/manage/user-custom-fields.json
trans.et = public/language/et/admin/manage/user-custom-fields.json
trans.id = public/language/id/admin/manage/user-custom-fields.json
trans.pt_PT = public/language/pt-PT/admin/manage/user-custom-fields.json
trans.ru = public/language/ru/admin/manage/user-custom-fields.json
trans.da = public/language/da/admin/manage/user-custom-fields.json
trans.he = public/language/he/admin/manage/user-custom-fields.json
trans.hu = public/language/hu/admin/manage/user-custom-fields.json
trans.ro = public/language/ro/admin/manage/user-custom-fields.json
trans.bn = public/language/bn/admin/manage/user-custom-fields.json
trans.es = public/language/es/admin/manage/user-custom-fields.json
trans.it = public/language/it/admin/manage/user-custom-fields.json
trans.nl = public/language/nl/admin/manage/user-custom-fields.json
trans.sq_AL = public/language/sq-AL/admin/manage/user-custom-fields.json
trans.tr = public/language/tr/admin/manage/user-custom-fields.json
trans.vi = public/language/vi/admin/manage/user-custom-fields.json
trans.fi = public/language/fi/admin/manage/user-custom-fields.json
trans.sc = public/language/sc/admin/manage/user-custom-fields.json
trans.hy = public/language/hy/admin/manage/user-custom-fields.json
trans.ja = public/language/ja/admin/manage/user-custom-fields.json
trans.lt = public/language/lt/admin/manage/user-custom-fields.json
trans.th = public/language/th/admin/manage/user-custom-fields.json
trans.sl = public/language/sl/admin/manage/user-custom-fields.json
trans.ar = public/language/ar/admin/manage/user-custom-fields.json
trans.el = public/language/el/admin/manage/user-custom-fields.json
trans.fa_IR = public/language/fa-IR/admin/manage/user-custom-fields.json
trans.hr = public/language/hr/admin/manage/user-custom-fields.json
trans.lv = public/language/lv/admin/manage/user-custom-fields.json
trans.pl = public/language/pl/admin/manage/user-custom-fields.json
trans.sk = public/language/sk/admin/manage/user-custom-fields.json
trans.sr = public/language/sr/admin/manage/user-custom-fields.json
trans.sv = public/language/sv/admin/manage/user-custom-fields.json
[o:nodebb:p:nodebb:r:admin-manage-users]
file_filter = public/language/<lang>/admin/manage/users.json
source_file = public/language/en-GB/admin/manage/users.json
@@ -1285,7 +1209,6 @@ trans.fr = public/language/fr/admin/manage/users.json
trans.ko = public/language/ko/admin/manage/users.json
trans.ms = public/language/ms/admin/manage/users.json
trans.nb = public/language/nb/admin/manage/users.json
trans.nn_NO = public/language/nn-NO/admin/manage/users.json
trans.pt_BR = public/language/pt-BR/admin/manage/users.json
trans.zh_CN = public/language/zh-CN/admin/manage/users.json
trans.zh_TW = public/language/zh-TW/admin/manage/users.json
@@ -1374,7 +1297,6 @@ trans.el = public/language/el/admin/menu.json
trans.gl = public/language/gl/admin/menu.json
trans.lv = public/language/lv/admin/menu.json
trans.nb = public/language/nb/admin/menu.json
trans.nn_NO = public/language/nn-NO/admin/menu.json
trans.pt_PT = public/language/pt-PT/admin/menu.json
trans.bn = public/language/bn/admin/menu.json
trans.et = public/language/et/admin/menu.json
@@ -1402,7 +1324,6 @@ trans.rw = public/language/rw/admin/settings/advanced.json
trans.sl = public/language/sl/admin/settings/advanced.json
trans.it = public/language/it/admin/settings/advanced.json
trans.nb = public/language/nb/admin/settings/advanced.json
trans.nn_NO = public/language/nn-NO/admin/settings/advanced.json
trans.pt_PT = public/language/pt-PT/admin/settings/advanced.json
trans.sq_AL = public/language/sq-AL/admin/settings/advanced.json
trans.sr = public/language/sr/admin/settings/advanced.json
@@ -1432,59 +1353,6 @@ trans.ms = public/language/ms/admin/settings/advanced.json
trans.nl = public/language/nl/admin/settings/advanced.json
trans.th = public/language/th/admin/settings/advanced.json
[o:nodebb:p:nodebb:r:admin-settings-activitypub]
file_filter = public/language/<lang>/admin/settings/activitypub.json
source_file = public/language/en-GB/admin/settings/activitypub.json
source_lang = en_GB
type = KEYVALUEJSON
trans.ko = public/language/ko/admin/settings/activitypub.json
trans.sc = public/language/sc/admin/settings/activitypub.json
trans.ar = public/language/ar/admin/settings/activitypub.json
trans.bn = public/language/bn/admin/settings/activitypub.json
trans.el = public/language/el/admin/settings/activitypub.json
trans.fa_IR = public/language/fa-IR/admin/settings/activitypub.json
trans.fr = public/language/fr/admin/settings/activitypub.json
trans.hy = public/language/hy/admin/settings/activitypub.json
trans.bg = public/language/bg/admin/settings/activitypub.json
trans.lv = public/language/lv/admin/settings/activitypub.json
trans.pt_BR = public/language/pt-BR/admin/settings/activitypub.json
trans.en@pirate = public/language/en-x-pirate/admin/settings/activitypub.json
trans.es = public/language/es/admin/settings/activitypub.json
trans.id = public/language/id/admin/settings/activitypub.json
trans.rw = public/language/rw/admin/settings/activitypub.json
trans.sl = public/language/sl/admin/settings/activitypub.json
trans.it = public/language/it/admin/settings/activitypub.json
trans.nb = public/language/nb/admin/settings/activitypub.json
trans.nn_NO = public/language/nn-NO/admin/settings/activitypub.json
trans.pt_PT = public/language/pt-PT/admin/settings/activitypub.json
trans.sq_AL = public/language/sq-AL/admin/settings/activitypub.json
trans.sr = public/language/sr/admin/settings/activitypub.json
trans.zh_CN = public/language/zh-CN/admin/settings/activitypub.json
trans.zh_TW = public/language/zh-TW/admin/settings/activitypub.json
trans.cs = public/language/cs/admin/settings/activitypub.json
trans.en_US = public/language/en-US/admin/settings/activitypub.json
trans.hr = public/language/hr/admin/settings/activitypub.json
trans.pl = public/language/pl/admin/settings/activitypub.json
trans.ru = public/language/ru/admin/settings/activitypub.json
trans.sv = public/language/sv/admin/settings/activitypub.json
trans.vi = public/language/vi/admin/settings/activitypub.json
trans.de = public/language/de/admin/settings/activitypub.json
trans.et = public/language/et/admin/settings/activitypub.json
trans.fi = public/language/fi/admin/settings/activitypub.json
trans.ro = public/language/ro/admin/settings/activitypub.json
trans.sk = public/language/sk/admin/settings/activitypub.json
trans.uk = public/language/uk/admin/settings/activitypub.json
trans.da = public/language/da/admin/settings/activitypub.json
trans.gl = public/language/gl/admin/settings/activitypub.json
trans.he = public/language/he/admin/settings/activitypub.json
trans.hu = public/language/hu/admin/settings/activitypub.json
trans.ja = public/language/ja/admin/settings/activitypub.json
trans.tr = public/language/tr/admin/settings/activitypub.json
trans.lt = public/language/lt/admin/settings/activitypub.json
trans.ms = public/language/ms/admin/settings/activitypub.json
trans.nl = public/language/nl/admin/settings/activitypub.json
trans.th = public/language/th/admin/settings/activitypub.json
[o:nodebb:p:nodebb:r:admin-settings-api]
file_filter = public/language/<lang>/admin/settings/api.json
source_file = public/language/en-GB/admin/settings/api.json
@@ -1512,7 +1380,6 @@ trans.zh_TW = public/language/zh-TW/admin/settings/api.json
trans.cs = public/language/cs/admin/settings/api.json
trans.it = public/language/it/admin/settings/api.json
trans.nb = public/language/nb/admin/settings/api.json
trans.nn_NO = public/language/nn-NO/admin/settings/api.json
trans.pt_PT = public/language/pt-PT/admin/settings/api.json
trans.ru = public/language/ru/admin/settings/api.json
trans.uk = public/language/uk/admin/settings/api.json
@@ -1561,7 +1428,6 @@ trans.hr = public/language/hr/admin/settings/chat.json
trans.ja = public/language/ja/admin/settings/chat.json
trans.ko = public/language/ko/admin/settings/chat.json
trans.nb = public/language/nb/admin/settings/chat.json
trans.nn_NO = public/language/nn-NO/admin/settings/chat.json
trans.nl = public/language/nl/admin/settings/chat.json
trans.uk = public/language/uk/admin/settings/chat.json
trans.he = public/language/he/admin/settings/chat.json
@@ -1629,7 +1495,6 @@ trans.hr = public/language/hr/admin/settings/cookies.json
trans.ja = public/language/ja/admin/settings/cookies.json
trans.pt_PT = public/language/pt-PT/admin/settings/cookies.json
trans.nb = public/language/nb/admin/settings/cookies.json
trans.nn_NO = public/language/nn-NO/admin/settings/cookies.json
trans.sc = public/language/sc/admin/settings/cookies.json
trans.bg = public/language/bg/admin/settings/cookies.json
trans.fi = public/language/fi/admin/settings/cookies.json
@@ -1658,7 +1523,6 @@ trans.pt_PT = public/language/pt-PT/admin/settings/email.json
trans.sr = public/language/sr/admin/settings/email.json
trans.ms = public/language/ms/admin/settings/email.json
trans.nb = public/language/nb/admin/settings/email.json
trans.nn_NO = public/language/nn-NO/admin/settings/email.json
trans.ru = public/language/ru/admin/settings/email.json
trans.sk = public/language/sk/admin/settings/email.json
trans.fr = public/language/fr/admin/settings/email.json
@@ -1735,7 +1599,6 @@ trans.es = public/language/es/admin/settings/general.json
trans.fa_IR = public/language/fa-IR/admin/settings/general.json
trans.ms = public/language/ms/admin/settings/general.json
trans.nb = public/language/nb/admin/settings/general.json
trans.nn_NO = public/language/nn-NO/admin/settings/general.json
trans.sr = public/language/sr/admin/settings/general.json
trans.da = public/language/da/admin/settings/general.json
trans.en@pirate = public/language/en-x-pirate/admin/settings/general.json
@@ -1761,7 +1624,6 @@ trans.et = public/language/et/admin/settings/group.json
trans.fr = public/language/fr/admin/settings/group.json
trans.it = public/language/it/admin/settings/group.json
trans.nb = public/language/nb/admin/settings/group.json
trans.nn_NO = public/language/nn-NO/admin/settings/group.json
trans.es = public/language/es/admin/settings/group.json
trans.fa_IR = public/language/fa-IR/admin/settings/group.json
trans.gl = public/language/gl/admin/settings/group.json
@@ -1803,6 +1665,162 @@ trans.pt_BR = public/language/pt-BR/admin/settings/group.json
trans.zh_CN = public/language/zh-CN/admin/settings/group.json
trans.zh_TW = public/language/zh-TW/admin/settings/group.json
[o:nodebb:p:nodebb:r:admin-settings-guest]
file_filter = public/language/<lang>/admin/settings/guest.json
source_file = public/language/en-GB/admin/settings/guest.json
source_lang = en_GB
type = KEYVALUEJSON
trans.cs = public/language/cs/admin/settings/guest.json
trans.da = public/language/da/admin/settings/guest.json
trans.en_US = public/language/en-US/admin/settings/guest.json
trans.lt = public/language/lt/admin/settings/guest.json
trans.ms = public/language/ms/admin/settings/guest.json
trans.nl = public/language/nl/admin/settings/guest.json
trans.ru = public/language/ru/admin/settings/guest.json
trans.sc = public/language/sc/admin/settings/guest.json
trans.sr = public/language/sr/admin/settings/guest.json
trans.th = public/language/th/admin/settings/guest.json
trans.en@pirate = public/language/en-x-pirate/admin/settings/guest.json
trans.it = public/language/it/admin/settings/guest.json
trans.lv = public/language/lv/admin/settings/guest.json
trans.pt_BR = public/language/pt-BR/admin/settings/guest.json
trans.sk = public/language/sk/admin/settings/guest.json
trans.de = public/language/de/admin/settings/guest.json
trans.es = public/language/es/admin/settings/guest.json
trans.hr = public/language/hr/admin/settings/guest.json
trans.pt_PT = public/language/pt-PT/admin/settings/guest.json
trans.rw = public/language/rw/admin/settings/guest.json
trans.sq_AL = public/language/sq-AL/admin/settings/guest.json
trans.el = public/language/el/admin/settings/guest.json
trans.tr = public/language/tr/admin/settings/guest.json
trans.zh_CN = public/language/zh-CN/admin/settings/guest.json
trans.bg = public/language/bg/admin/settings/guest.json
trans.fi = public/language/fi/admin/settings/guest.json
trans.hu = public/language/hu/admin/settings/guest.json
trans.ja = public/language/ja/admin/settings/guest.json
trans.nb = public/language/nb/admin/settings/guest.json
trans.pl = public/language/pl/admin/settings/guest.json
trans.sl = public/language/sl/admin/settings/guest.json
trans.vi = public/language/vi/admin/settings/guest.json
trans.bn = public/language/bn/admin/settings/guest.json
trans.fa_IR = public/language/fa-IR/admin/settings/guest.json
trans.fr = public/language/fr/admin/settings/guest.json
trans.hy = public/language/hy/admin/settings/guest.json
trans.ro = public/language/ro/admin/settings/guest.json
trans.et = public/language/et/admin/settings/guest.json
trans.gl = public/language/gl/admin/settings/guest.json
trans.sv = public/language/sv/admin/settings/guest.json
trans.uk = public/language/uk/admin/settings/guest.json
trans.zh_TW = public/language/zh-TW/admin/settings/guest.json
trans.ar = public/language/ar/admin/settings/guest.json
trans.he = public/language/he/admin/settings/guest.json
trans.id = public/language/id/admin/settings/guest.json
trans.ko = public/language/ko/admin/settings/guest.json
[o:nodebb:p:nodebb:r:admin-settings-homepage]
file_filter = public/language/<lang>/admin/settings/homepage.json
source_file = public/language/en-GB/admin/settings/homepage.json
source_lang = en_GB
type = KEYVALUEJSON
trans.nb = public/language/nb/admin/settings/homepage.json
trans.tr = public/language/tr/admin/settings/homepage.json
trans.vi = public/language/vi/admin/settings/homepage.json
trans.et = public/language/et/admin/settings/homepage.json
trans.fi = public/language/fi/admin/settings/homepage.json
trans.hy = public/language/hy/admin/settings/homepage.json
trans.ru = public/language/ru/admin/settings/homepage.json
trans.sr = public/language/sr/admin/settings/homepage.json
trans.es = public/language/es/admin/settings/homepage.json
trans.id = public/language/id/admin/settings/homepage.json
trans.lt = public/language/lt/admin/settings/homepage.json
trans.sk = public/language/sk/admin/settings/homepage.json
trans.sq_AL = public/language/sq-AL/admin/settings/homepage.json
trans.th = public/language/th/admin/settings/homepage.json
trans.en_US = public/language/en-US/admin/settings/homepage.json
trans.lv = public/language/lv/admin/settings/homepage.json
trans.pt_PT = public/language/pt-PT/admin/settings/homepage.json
trans.sc = public/language/sc/admin/settings/homepage.json
trans.fa_IR = public/language/fa-IR/admin/settings/homepage.json
trans.he = public/language/he/admin/settings/homepage.json
trans.ms = public/language/ms/admin/settings/homepage.json
trans.cs = public/language/cs/admin/settings/homepage.json
trans.el = public/language/el/admin/settings/homepage.json
trans.en@pirate = public/language/en-x-pirate/admin/settings/homepage.json
trans.gl = public/language/gl/admin/settings/homepage.json
trans.ko = public/language/ko/admin/settings/homepage.json
trans.ar = public/language/ar/admin/settings/homepage.json
trans.bg = public/language/bg/admin/settings/homepage.json
trans.bn = public/language/bn/admin/settings/homepage.json
trans.rw = public/language/rw/admin/settings/homepage.json
trans.zh_CN = public/language/zh-CN/admin/settings/homepage.json
trans.hr = public/language/hr/admin/settings/homepage.json
trans.it = public/language/it/admin/settings/homepage.json
trans.ja = public/language/ja/admin/settings/homepage.json
trans.nl = public/language/nl/admin/settings/homepage.json
trans.ro = public/language/ro/admin/settings/homepage.json
trans.da = public/language/da/admin/settings/homepage.json
trans.de = public/language/de/admin/settings/homepage.json
trans.fr = public/language/fr/admin/settings/homepage.json
trans.sv = public/language/sv/admin/settings/homepage.json
trans.hu = public/language/hu/admin/settings/homepage.json
trans.pt_BR = public/language/pt-BR/admin/settings/homepage.json
trans.sl = public/language/sl/admin/settings/homepage.json
trans.pl = public/language/pl/admin/settings/homepage.json
trans.uk = public/language/uk/admin/settings/homepage.json
trans.zh_TW = public/language/zh-TW/admin/settings/homepage.json
[o:nodebb:p:nodebb:r:admin-settings-languages]
file_filter = public/language/<lang>/admin/settings/languages.json
source_file = public/language/en-GB/admin/settings/languages.json
source_lang = en_GB
type = KEYVALUEJSON
trans.en@pirate = public/language/en-x-pirate/admin/settings/languages.json
trans.fa_IR = public/language/fa-IR/admin/settings/languages.json
trans.gl = public/language/gl/admin/settings/languages.json
trans.ro = public/language/ro/admin/settings/languages.json
trans.th = public/language/th/admin/settings/languages.json
trans.hr = public/language/hr/admin/settings/languages.json
trans.hy = public/language/hy/admin/settings/languages.json
trans.sc = public/language/sc/admin/settings/languages.json
trans.vi = public/language/vi/admin/settings/languages.json
trans.tr = public/language/tr/admin/settings/languages.json
trans.cs = public/language/cs/admin/settings/languages.json
trans.et = public/language/et/admin/settings/languages.json
trans.lv = public/language/lv/admin/settings/languages.json
trans.pl = public/language/pl/admin/settings/languages.json
trans.sr = public/language/sr/admin/settings/languages.json
trans.sv = public/language/sv/admin/settings/languages.json
trans.hu = public/language/hu/admin/settings/languages.json
trans.it = public/language/it/admin/settings/languages.json
trans.ja = public/language/ja/admin/settings/languages.json
trans.sl = public/language/sl/admin/settings/languages.json
trans.zh_TW = public/language/zh-TW/admin/settings/languages.json
trans.da = public/language/da/admin/settings/languages.json
trans.fr = public/language/fr/admin/settings/languages.json
trans.he = public/language/he/admin/settings/languages.json
trans.id = public/language/id/admin/settings/languages.json
trans.sq_AL = public/language/sq-AL/admin/settings/languages.json
trans.uk = public/language/uk/admin/settings/languages.json
trans.bn = public/language/bn/admin/settings/languages.json
trans.fi = public/language/fi/admin/settings/languages.json
trans.ko = public/language/ko/admin/settings/languages.json
trans.pt_BR = public/language/pt-BR/admin/settings/languages.json
trans.sk = public/language/sk/admin/settings/languages.json
trans.pt_PT = public/language/pt-PT/admin/settings/languages.json
trans.ru = public/language/ru/admin/settings/languages.json
trans.ar = public/language/ar/admin/settings/languages.json
trans.bg = public/language/bg/admin/settings/languages.json
trans.de = public/language/de/admin/settings/languages.json
trans.el = public/language/el/admin/settings/languages.json
trans.lt = public/language/lt/admin/settings/languages.json
trans.nl = public/language/nl/admin/settings/languages.json
trans.zh_CN = public/language/zh-CN/admin/settings/languages.json
trans.en_US = public/language/en-US/admin/settings/languages.json
trans.es = public/language/es/admin/settings/languages.json
trans.ms = public/language/ms/admin/settings/languages.json
trans.nb = public/language/nb/admin/settings/languages.json
trans.rw = public/language/rw/admin/settings/languages.json
[o:nodebb:p:nodebb:r:admin-settings-navigation]
file_filter = public/language/<lang>/admin/settings/navigation.json
source_file = public/language/en-GB/admin/settings/navigation.json
@@ -1849,7 +1867,6 @@ trans.hr = public/language/hr/admin/settings/navigation.json
trans.id = public/language/id/admin/settings/navigation.json
trans.ko = public/language/ko/admin/settings/navigation.json
trans.nb = public/language/nb/admin/settings/navigation.json
trans.nn_NO = public/language/nn-NO/admin/settings/navigation.json
trans.pl = public/language/pl/admin/settings/navigation.json
trans.sv = public/language/sv/admin/settings/navigation.json
trans.el = public/language/el/admin/settings/navigation.json
@@ -1896,7 +1913,6 @@ trans.zh_CN = public/language/zh-CN/admin/settings/notifications.json
trans.ko = public/language/ko/admin/settings/notifications.json
trans.lv = public/language/lv/admin/settings/notifications.json
trans.nb = public/language/nb/admin/settings/notifications.json
trans.nn_NO = public/language/nn-NO/admin/settings/notifications.json
trans.pl = public/language/pl/admin/settings/notifications.json
trans.bg = public/language/bg/admin/settings/notifications.json
trans.da = public/language/da/admin/settings/notifications.json
@@ -1958,7 +1974,6 @@ trans.zh_TW = public/language/zh-TW/admin/settings/pagination.json
trans.bn = public/language/bn/admin/settings/pagination.json
trans.hy = public/language/hy/admin/settings/pagination.json
trans.nb = public/language/nb/admin/settings/pagination.json
trans.nn_NO = public/language/nn-NO/admin/settings/pagination.json
trans.sr = public/language/sr/admin/settings/pagination.json
trans.sv = public/language/sv/admin/settings/pagination.json
@@ -1992,7 +2007,6 @@ trans.it = public/language/it/admin/settings/post.json
trans.th = public/language/th/admin/settings/post.json
trans.gl = public/language/gl/admin/settings/post.json
trans.nb = public/language/nb/admin/settings/post.json
trans.nn_NO = public/language/nn-NO/admin/settings/post.json
trans.sc = public/language/sc/admin/settings/post.json
trans.zh_CN = public/language/zh-CN/admin/settings/post.json
trans.rw = public/language/rw/admin/settings/post.json
@@ -2040,7 +2054,6 @@ trans.sc = public/language/sc/admin/settings/reputation.json
trans.hr = public/language/hr/admin/settings/reputation.json
trans.ko = public/language/ko/admin/settings/reputation.json
trans.nb = public/language/nb/admin/settings/reputation.json
trans.nn_NO = public/language/nn-NO/admin/settings/reputation.json
trans.bn = public/language/bn/admin/settings/reputation.json
trans.de = public/language/de/admin/settings/reputation.json
trans.et = public/language/et/admin/settings/reputation.json
@@ -2068,6 +2081,58 @@ trans.gl = public/language/gl/admin/settings/reputation.json
trans.hu = public/language/hu/admin/settings/reputation.json
trans.hy = public/language/hy/admin/settings/reputation.json
[o:nodebb:p:nodebb:r:admin-settings-social]
file_filter = public/language/<lang>/admin/settings/social.json
source_file = public/language/en-GB/admin/settings/social.json
source_lang = en_GB
type = KEYVALUEJSON
trans.nl = public/language/nl/admin/settings/social.json
trans.sc = public/language/sc/admin/settings/social.json
trans.sv = public/language/sv/admin/settings/social.json
trans.rw = public/language/rw/admin/settings/social.json
trans.bn = public/language/bn/admin/settings/social.json
trans.hr = public/language/hr/admin/settings/social.json
trans.id = public/language/id/admin/settings/social.json
trans.pt_PT = public/language/pt-PT/admin/settings/social.json
trans.de = public/language/de/admin/settings/social.json
trans.hu = public/language/hu/admin/settings/social.json
trans.pt_BR = public/language/pt-BR/admin/settings/social.json
trans.ja = public/language/ja/admin/settings/social.json
trans.sq_AL = public/language/sq-AL/admin/settings/social.json
trans.zh_TW = public/language/zh-TW/admin/settings/social.json
trans.cs = public/language/cs/admin/settings/social.json
trans.en_US = public/language/en-US/admin/settings/social.json
trans.fi = public/language/fi/admin/settings/social.json
trans.nb = public/language/nb/admin/settings/social.json
trans.pl = public/language/pl/admin/settings/social.json
trans.th = public/language/th/admin/settings/social.json
trans.bg = public/language/bg/admin/settings/social.json
trans.lt = public/language/lt/admin/settings/social.json
trans.lv = public/language/lv/admin/settings/social.json
trans.ko = public/language/ko/admin/settings/social.json
trans.es = public/language/es/admin/settings/social.json
trans.fr = public/language/fr/admin/settings/social.json
trans.he = public/language/he/admin/settings/social.json
trans.fa_IR = public/language/fa-IR/admin/settings/social.json
trans.hy = public/language/hy/admin/settings/social.json
trans.ms = public/language/ms/admin/settings/social.json
trans.ru = public/language/ru/admin/settings/social.json
trans.sk = public/language/sk/admin/settings/social.json
trans.ar = public/language/ar/admin/settings/social.json
trans.el = public/language/el/admin/settings/social.json
trans.en@pirate = public/language/en-x-pirate/admin/settings/social.json
trans.uk = public/language/uk/admin/settings/social.json
trans.sl = public/language/sl/admin/settings/social.json
trans.sr = public/language/sr/admin/settings/social.json
trans.tr = public/language/tr/admin/settings/social.json
trans.it = public/language/it/admin/settings/social.json
trans.ro = public/language/ro/admin/settings/social.json
trans.vi = public/language/vi/admin/settings/social.json
trans.zh_CN = public/language/zh-CN/admin/settings/social.json
trans.da = public/language/da/admin/settings/social.json
trans.et = public/language/et/admin/settings/social.json
trans.gl = public/language/gl/admin/settings/social.json
[o:nodebb:p:nodebb:r:admin-settings-sockets]
file_filter = public/language/<lang>/admin/settings/sockets.json
source_file = public/language/en-GB/admin/settings/sockets.json
@@ -2096,7 +2161,6 @@ trans.fi = public/language/fi/admin/settings/sockets.json
trans.it = public/language/it/admin/settings/sockets.json
trans.ro = public/language/ro/admin/settings/sockets.json
trans.nb = public/language/nb/admin/settings/sockets.json
trans.nn_NO = public/language/nn-NO/admin/settings/sockets.json
trans.sq_AL = public/language/sq-AL/admin/settings/sockets.json
trans.bg = public/language/bg/admin/settings/sockets.json
trans.bn = public/language/bn/admin/settings/sockets.json
@@ -2147,7 +2211,6 @@ trans.en@pirate = public/language/en-x-pirate/admin/settings/sounds.json
trans.fa_IR = public/language/fa-IR/admin/settings/sounds.json
trans.fi = public/language/fi/admin/settings/sounds.json
trans.nb = public/language/nb/admin/settings/sounds.json
trans.nn_NO = public/language/nn-NO/admin/settings/sounds.json
trans.th = public/language/th/admin/settings/sounds.json
trans.ar = public/language/ar/admin/settings/sounds.json
trans.da = public/language/da/admin/settings/sounds.json
@@ -2203,7 +2266,6 @@ trans.bn = public/language/bn/admin/settings/tags.json
trans.hr = public/language/hr/admin/settings/tags.json
trans.ko = public/language/ko/admin/settings/tags.json
trans.nb = public/language/nb/admin/settings/tags.json
trans.nn_NO = public/language/nn-NO/admin/settings/tags.json
trans.el = public/language/el/admin/settings/tags.json
trans.et = public/language/et/admin/settings/tags.json
trans.he = public/language/he/admin/settings/tags.json
@@ -2241,7 +2303,6 @@ trans.fa_IR = public/language/fa-IR/admin/settings/uploads.json
trans.he = public/language/he/admin/settings/uploads.json
trans.ja = public/language/ja/admin/settings/uploads.json
trans.nb = public/language/nb/admin/settings/uploads.json
trans.nn_NO = public/language/nn-NO/admin/settings/uploads.json
trans.nl = public/language/nl/admin/settings/uploads.json
trans.zh_TW = public/language/zh-TW/admin/settings/uploads.json
trans.ro = public/language/ro/admin/settings/uploads.json
@@ -2293,7 +2354,6 @@ trans.sq_AL = public/language/sq-AL/admin/settings/user.json
trans.gl = public/language/gl/admin/settings/user.json
trans.hu = public/language/hu/admin/settings/user.json
trans.nb = public/language/nb/admin/settings/user.json
trans.nn_NO = public/language/nn-NO/admin/settings/user.json
trans.sv = public/language/sv/admin/settings/user.json
trans.uk = public/language/uk/admin/settings/user.json
trans.cs = public/language/cs/admin/settings/user.json
@@ -2372,7 +2432,6 @@ trans.ar = public/language/ar/admin/settings/web-crawler.json
trans.de = public/language/de/admin/settings/web-crawler.json
trans.hy = public/language/hy/admin/settings/web-crawler.json
trans.nb = public/language/nb/admin/settings/web-crawler.json
trans.nn_NO = public/language/nn-NO/admin/settings/web-crawler.json
trans.ro = public/language/ro/admin/settings/web-crawler.json
trans.sr = public/language/sr/admin/settings/web-crawler.json
trans.zh_TW = public/language/zh-TW/admin/settings/web-crawler.json
@@ -2419,7 +2478,6 @@ trans.zh_CN = public/language/zh-CN/themes/harmony.json
trans.fi = public/language/fi/themes/harmony.json
trans.ja = public/language/ja/themes/harmony.json
trans.nb = public/language/nb/themes/harmony.json
trans.nn_NO = public/language/nn-NO/themes/harmony.json
trans.pl = public/language/pl/themes/harmony.json
trans.zh_TW = public/language/zh-TW/themes/harmony.json
trans.ar = public/language/ar/themes/harmony.json
@@ -2472,7 +2530,6 @@ trans.zh_CN = public/language/zh-CN/themes/persona.json
trans.fi = public/language/fi/themes/persona.json
trans.ja = public/language/ja/themes/persona.json
trans.nb = public/language/nb/themes/persona.json
trans.nn_NO = public/language/nn-NO/themes/persona.json
trans.pl = public/language/pl/themes/persona.json
trans.zh_TW = public/language/zh-TW/themes/persona.json
trans.ar = public/language/ar/themes/persona.json
@@ -2492,59 +2549,6 @@ trans.et = public/language/et/themes/persona.json
trans.it = public/language/it/themes/persona.json
trans.rw = public/language/rw/themes/persona.json
[o:nodebb:p:nodebb:r:aria]
file_filter = public/language/<lang>/aria.json
source_file = public/language/en-GB/aria.json
source_lang = en_GB
type = KEYVALUEJSON
trans.th = public/language/th/aria.json
trans.bg = public/language/bg/aria.json
trans.hr = public/language/hr/aria.json
trans.hy = public/language/hy/aria.json
trans.sk = public/language/sk/aria.json
trans.sl = public/language/sl/aria.json
trans.sq_AL = public/language/sq-AL/aria.json
trans.sv = public/language/sv/aria.json
trans.vi = public/language/vi/aria.json
trans.da = public/language/da/aria.json
trans.en_US = public/language/en-US/aria.json
trans.gl = public/language/gl/aria.json
trans.ko = public/language/ko/aria.json
trans.lt = public/language/lt/aria.json
trans.pt_BR = public/language/pt-BR/aria.json
trans.hu = public/language/hu/aria.json
trans.lv = public/language/lv/aria.json
trans.ro = public/language/ro/aria.json
trans.ru = public/language/ru/aria.json
trans.sr = public/language/sr/aria.json
trans.bn = public/language/bn/aria.json
trans.he = public/language/he/aria.json
trans.nl = public/language/nl/aria.json
trans.sc = public/language/sc/aria.json
trans.zh_CN = public/language/zh-CN/aria.json
trans.fi = public/language/fi/aria.json
trans.ja = public/language/ja/aria.json
trans.nb = public/language/nb/aria.json
trans.nn_NO = public/language/nn-NO/aria.json
trans.pl = public/language/pl/aria.json
trans.zh_TW = public/language/zh-TW/aria.json
trans.ar = public/language/ar/aria.json
trans.cs = public/language/cs/aria.json
trans.fa_IR = public/language/fa-IR/aria.json
trans.ms = public/language/ms/aria.json
trans.pt_PT = public/language/pt-PT/aria.json
trans.tr = public/language/tr/aria.json
trans.en@pirate = public/language/en-x-pirate/aria.json
trans.fr = public/language/fr/aria.json
trans.id = public/language/id/aria.json
trans.uk = public/language/uk/aria.json
trans.de = public/language/de/aria.json
trans.el = public/language/el/aria.json
trans.es = public/language/es/aria.json
trans.et = public/language/et/aria.json
trans.it = public/language/it/aria.json
trans.rw = public/language/rw/aria.json
[o:nodebb:p:nodebb:r:category]
file_filter = public/language/<lang>/category.json
source_file = public/language/en-GB/category.json
@@ -2578,7 +2582,6 @@ trans.zh_CN = public/language/zh-CN/category.json
trans.fi = public/language/fi/category.json
trans.ja = public/language/ja/category.json
trans.nb = public/language/nb/category.json
trans.nn_NO = public/language/nn-NO/category.json
trans.pl = public/language/pl/category.json
trans.zh_TW = public/language/zh-TW/category.json
trans.ar = public/language/ar/category.json
@@ -2645,7 +2648,6 @@ trans.sr = public/language/sr/email.json
trans.tr = public/language/tr/email.json
trans.en_US = public/language/en-US/email.json
trans.nb = public/language/nb/email.json
trans.nn_NO = public/language/nn-NO/email.json
trans.nl = public/language/nl/email.json
trans.pt_BR = public/language/pt-BR/email.json
trans.rw = public/language/rw/email.json
@@ -2684,7 +2686,6 @@ trans.vi = public/language/vi/error.json
trans.fa_IR = public/language/fa-IR/error.json
trans.gl = public/language/gl/error.json
trans.nb = public/language/nb/error.json
trans.nn_NO = public/language/nn-NO/error.json
trans.pl = public/language/pl/error.json
trans.ro = public/language/ro/error.json
trans.uk = public/language/uk/error.json
@@ -2710,7 +2711,6 @@ source_file = public/language/en-GB/flags.json
source_lang = en_GB
type = KEYVALUEJSON
trans.nb = public/language/nb/flags.json
trans.nn_NO = public/language/nn-NO/flags.json
trans.ru = public/language/ru/flags.json
trans.sc = public/language/sc/flags.json
trans.fi = public/language/fi/flags.json
@@ -2781,7 +2781,6 @@ trans.sk = public/language/sk/global.json
trans.sr = public/language/sr/global.json
trans.tr = public/language/tr/global.json
trans.nb = public/language/nb/global.json
trans.nn_NO = public/language/nn-NO/global.json
trans.pt_BR = public/language/pt-BR/global.json
trans.pt_PT = public/language/pt-PT/global.json
trans.bg = public/language/bg/global.json
@@ -2825,7 +2824,6 @@ trans.hy = public/language/hy/groups.json
trans.pt_PT = public/language/pt-PT/groups.json
trans.ms = public/language/ms/groups.json
trans.nb = public/language/nb/groups.json
trans.nn_NO = public/language/nn-NO/groups.json
trans.ro = public/language/ro/groups.json
trans.vi = public/language/vi/groups.json
trans.fa_IR = public/language/fa-IR/groups.json
@@ -2888,7 +2886,6 @@ trans.fa_IR = public/language/fa-IR/ip-blacklist.json
trans.fr = public/language/fr/ip-blacklist.json
trans.gl = public/language/gl/ip-blacklist.json
trans.nb = public/language/nb/ip-blacklist.json
trans.nn_NO = public/language/nn-NO/ip-blacklist.json
trans.sv = public/language/sv/ip-blacklist.json
trans.th = public/language/th/ip-blacklist.json
trans.bn = public/language/bn/ip-blacklist.json
@@ -2934,7 +2931,6 @@ trans.en_US = public/language/en-US/language.json
trans.et = public/language/et/language.json
trans.ja = public/language/ja/language.json
trans.nb = public/language/nb/language.json
trans.nn_NO = public/language/nn-NO/language.json
trans.sk = public/language/sk/language.json
trans.el = public/language/el/language.json
trans.es = public/language/es/language.json
@@ -3011,7 +3007,6 @@ trans.en@pirate = public/language/en-x-pirate/login.json
trans.hy = public/language/hy/login.json
trans.id = public/language/id/login.json
trans.nb = public/language/nb/login.json
trans.nn_NO = public/language/nn-NO/login.json
trans.ru = public/language/ru/login.json
trans.rw = public/language/rw/login.json
trans.th = public/language/th/login.json
@@ -3039,7 +3034,6 @@ trans.fa_IR = public/language/fa-IR/modules.json
trans.hr = public/language/hr/modules.json
trans.lv = public/language/lv/modules.json
trans.nb = public/language/nb/modules.json
trans.nn_NO = public/language/nn-NO/modules.json
trans.ro = public/language/ro/modules.json
trans.sv = public/language/sv/modules.json
trans.en@pirate = public/language/en-x-pirate/modules.json
@@ -3121,7 +3115,6 @@ trans.ms = public/language/ms/notifications.json
trans.hr = public/language/hr/notifications.json
trans.id = public/language/id/notifications.json
trans.nb = public/language/nb/notifications.json
trans.nn_NO = public/language/nn-NO/notifications.json
trans.ar = public/language/ar/notifications.json
trans.da = public/language/da/notifications.json
trans.en@pirate = public/language/en-x-pirate/notifications.json
@@ -3134,7 +3127,6 @@ source_lang = en_GB
type = KEYVALUEJSON
trans.he = public/language/he/pages.json
trans.nb = public/language/nb/pages.json
trans.nn_NO = public/language/nn-NO/pages.json
trans.sv = public/language/sv/pages.json
trans.pt_BR = public/language/pt-BR/pages.json
trans.tr = public/language/tr/pages.json
@@ -3231,7 +3223,6 @@ trans.pt_PT = public/language/pt-PT/post-queue.json
trans.fi = public/language/fi/post-queue.json
trans.he = public/language/he/post-queue.json
trans.nb = public/language/nb/post-queue.json
trans.nn_NO = public/language/nn-NO/post-queue.json
[o:nodebb:p:nodebb:r:recent]
file_filter = public/language/<lang>/recent.json
@@ -3271,7 +3262,6 @@ trans.bn = public/language/bn/recent.json
trans.en@pirate = public/language/en-x-pirate/recent.json
trans.ja = public/language/ja/recent.json
trans.nb = public/language/nb/recent.json
trans.nn_NO = public/language/nn-NO/recent.json
trans.nl = public/language/nl/recent.json
trans.sv = public/language/sv/recent.json
trans.th = public/language/th/recent.json
@@ -3309,7 +3299,6 @@ trans.bg = public/language/bg/register.json
trans.de = public/language/de/register.json
trans.hr = public/language/hr/register.json
trans.nb = public/language/nb/register.json
trans.nn_NO = public/language/nn-NO/register.json
trans.gl = public/language/gl/register.json
trans.sk = public/language/sk/register.json
trans.hy = public/language/hy/register.json
@@ -3379,7 +3368,6 @@ trans.en_US = public/language/en-US/reset_password.json
trans.lt = public/language/lt/reset_password.json
trans.lv = public/language/lv/reset_password.json
trans.nb = public/language/nb/reset_password.json
trans.nn_NO = public/language/nn-NO/reset_password.json
trans.sk = public/language/sk/reset_password.json
trans.el = public/language/el/reset_password.json
trans.es = public/language/es/reset_password.json
@@ -3432,7 +3420,6 @@ trans.en_US = public/language/en-US/rewards.json
trans.lt = public/language/lt/rewards.json
trans.lv = public/language/lv/rewards.json
trans.nb = public/language/nb/rewards.json
trans.nn_NO = public/language/nn-NO/rewards.json
trans.sk = public/language/sk/rewards.json
trans.el = public/language/el/rewards.json
trans.es = public/language/es/rewards.json
@@ -3475,7 +3462,6 @@ trans.zh_TW = public/language/zh-TW/search.json
trans.cs = public/language/cs/search.json
trans.he = public/language/he/search.json
trans.nb = public/language/nb/search.json
trans.nn_NO = public/language/nn-NO/search.json
trans.zh_CN = public/language/zh-CN/search.json
trans.lv = public/language/lv/search.json
trans.rw = public/language/rw/search.json
@@ -3528,7 +3514,6 @@ trans.zh_TW = public/language/zh-TW/social.json
trans.cs = public/language/cs/social.json
trans.he = public/language/he/social.json
trans.nb = public/language/nb/social.json
trans.nn_NO = public/language/nn-NO/social.json
trans.zh_CN = public/language/zh-CN/social.json
trans.lv = public/language/lv/social.json
trans.rw = public/language/rw/social.json
@@ -3600,7 +3585,6 @@ trans.da = public/language/da/success.json
trans.el = public/language/el/success.json
trans.gl = public/language/gl/success.json
trans.nb = public/language/nb/success.json
trans.nn_NO = public/language/nn-NO/success.json
trans.sr = public/language/sr/success.json
trans.uk = public/language/uk/success.json
@@ -3644,7 +3628,6 @@ trans.gl = public/language/gl/tags.json
trans.lv = public/language/lv/tags.json
trans.ms = public/language/ms/tags.json
trans.nb = public/language/nb/tags.json
trans.nn_NO = public/language/nn-NO/tags.json
trans.sv = public/language/sv/tags.json
trans.sq_AL = public/language/sq-AL/tags.json
trans.zh_TW = public/language/zh-TW/tags.json
@@ -3703,7 +3686,6 @@ trans.sv = public/language/sv/top.json
trans.th = public/language/th/top.json
trans.it = public/language/it/top.json
trans.nb = public/language/nb/top.json
trans.nn_NO = public/language/nn-NO/top.json
trans.sr = public/language/sr/top.json
trans.tr = public/language/tr/top.json
trans.zh_TW = public/language/zh-TW/top.json
@@ -3718,7 +3700,6 @@ type = KEYVALUEJSON
trans.et = public/language/et/topic.json
trans.hu = public/language/hu/topic.json
trans.nb = public/language/nb/topic.json
trans.nn_NO = public/language/nn-NO/topic.json
trans.nl = public/language/nl/topic.json
trans.sk = public/language/sk/topic.json
trans.ar = public/language/ar/topic.json
@@ -3801,7 +3782,6 @@ trans.sk = public/language/sk/unread.json
trans.bn = public/language/bn/unread.json
trans.cs = public/language/cs/unread.json
trans.nb = public/language/nb/unread.json
trans.nn_NO = public/language/nn-NO/unread.json
trans.rw = public/language/rw/unread.json
trans.sq_AL = public/language/sq-AL/unread.json
trans.tr = public/language/tr/unread.json
@@ -3846,7 +3826,6 @@ trans.et = public/language/et/uploads.json
trans.id = public/language/id/uploads.json
trans.ms = public/language/ms/uploads.json
trans.nb = public/language/nb/uploads.json
trans.nn_NO = public/language/nn-NO/uploads.json
trans.pt_PT = public/language/pt-PT/uploads.json
trans.da = public/language/da/uploads.json
trans.es = public/language/es/uploads.json
@@ -3916,7 +3895,6 @@ trans.hr = public/language/hr/user.json
trans.hy = public/language/hy/user.json
trans.ja = public/language/ja/user.json
trans.nb = public/language/nb/user.json
trans.nn_NO = public/language/nn-NO/user.json
trans.nl = public/language/nl/user.json
trans.ro = public/language/ro/user.json
trans.sc = public/language/sc/user.json
@@ -3950,7 +3928,6 @@ trans.he = public/language/he/users.json
trans.ja = public/language/ja/users.json
trans.ko = public/language/ko/users.json
trans.nb = public/language/nb/users.json
trans.nn_NO = public/language/nn-NO/users.json
trans.pt_PT = public/language/pt-PT/users.json
trans.sr = public/language/sr/users.json
trans.zh_CN = public/language/zh-CN/users.json
@@ -3975,55 +3952,3 @@ trans.hu = public/language/hu/users.json
trans.lv = public/language/lv/users.json
trans.pt_BR = public/language/pt-BR/users.json
[o:nodebb:p:nodebb:r:world]
file_filter = public/language/<lang>/world.json
source_file = public/language/en-GB/world.json
source_lang = en_GB
type = KEYVALUEJSON
trans.zh_TW = public/language/zh-TW/world.json
trans.de = public/language/de/world.json
trans.en@pirate = public/language/en-x-pirate/world.json
trans.ru = public/language/ru/world.json
trans.sc = public/language/sc/world.json
trans.en_US = public/language/en-US/world.json
trans.bn = public/language/bn/world.json
trans.hy = public/language/hy/world.json
trans.ro = public/language/ro/world.json
trans.fi = public/language/fi/world.json
trans.it = public/language/it/world.json
trans.pl = public/language/pl/world.json
trans.sk = public/language/sk/world.json
trans.ar = public/language/ar/world.json
trans.bg = public/language/bg/world.json
trans.el = public/language/el/world.json
trans.fa_IR = public/language/fa-IR/world.json
trans.sq_AL = public/language/sq-AL/world.json
trans.cs = public/language/cs/world.json
trans.he = public/language/he/world.json
trans.ja = public/language/ja/world.json
trans.ko = public/language/ko/world.json
trans.nb = public/language/nb/world.json
trans.nn_NO = public/language/nn-NO/world.json
trans.pt_PT = public/language/pt-PT/world.json
trans.sr = public/language/sr/world.json
trans.zh_CN = public/language/zh-CN/world.json
trans.da = public/language/da/world.json
trans.id = public/language/id/world.json
trans.lt = public/language/lt/world.json
trans.ms = public/language/ms/world.json
trans.nl = public/language/nl/world.json
trans.rw = public/language/rw/world.json
trans.sl = public/language/sl/world.json
trans.th = public/language/th/world.json
trans.es = public/language/es/world.json
trans.fr = public/language/fr/world.json
trans.gl = public/language/gl/world.json
trans.hr = public/language/hr/world.json
trans.uk = public/language/uk/world.json
trans.vi = public/language/vi/world.json
trans.sv = public/language/sv/world.json
trans.tr = public/language/tr/world.json
trans.et = public/language/et/world.json
trans.hu = public/language/hu/world.json
trans.lv = public/language/lv/world.json
trans.pt_BR = public/language/pt-BR/world.json

File diff suppressed because it is too large Load Diff

View File

@@ -1,76 +1,51 @@
FROM node:lts as build
FROM --platform=$BUILDPLATFORM node:lts as npm
ENV NODE_ENV=production \
DAEMON=false \
SILENT=false \
USER=nodebb \
UID=1001 \
GID=1001
RUN mkdir -p /usr/src/build && \
chown -R node:node /usr/src/build
WORKDIR /usr/src/build
WORKDIR /usr/src/app/
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
COPY . /usr/src/app/
COPY --chown=node:node install/package.json /usr/src/build/package.json
# Install corepack to allow usage of other package managers
RUN corepack enable
USER node
# Removing unnecessary files for us
RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \;
RUN npm install --omit=dev
# Prepage package.json
RUN cp /usr/src/app/install/package.json /usr/src/app/
FROM node:lts as rebuild
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive \
apt-get -y --no-install-recommends install \
tini
ARG BUILDPLATFORM
ARG TARGETPLATFORM
RUN groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& chown -R ${USER}:${USER} /usr/src/app/
RUN mkdir -p /usr/src/build && \
chown -R node:node /usr/src/build
USER ${USER}
COPY --from=npm /usr/src/build /usr/src/build
RUN npm install --omit=dev \
&& rm -rf .npm
# TODO: generate lockfiles for each package manager
## pnpm import \
RUN if [ $BUILDPLATFORM != $TARGETPLATFORM ]; then \
npm rebuild && \
npm cache clean --force; fi
FROM node:lts-slim AS final
FROM node:lts-slim as run
ENV NODE_ENV=production \
DAEMON=false \
SILENT=false \
USER=nodebb \
UID=1001 \
GID=1001
ARG NODE_ENV
ENV NODE_ENV=$NODE_ENV \
daemon=false \
silent=false
WORKDIR /usr/src/app/
RUN mkdir -p /usr/src/app && \
chown -R node:node /usr/src/app
RUN corepack enable \
&& groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/
COPY --chown=node:node --from=rebuild /usr/src/build /usr/src/app
COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh \
&& chmod +x /usr/local/bin/tini
WORKDIR /usr/src/app
# TODO: Have docker-compose use environment variables to create files like setup.json and config.json.
# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate
USER node
USER ${USER}
COPY --chown=node:node . /usr/src/app
EXPOSE 4567
VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"]
# Utilising tini as our init system within the Docker container for graceful start-up and termination.
# Tini serves as an uncomplicated init system, adept at managing the reaping of zombie processes and forwarding signals.
# This approach is crucial to circumvent issues with unmanaged subprocesses and signal handling in containerised environments.
# By integrating tini, we enhance the reliability and stability of our Docker containers.
# Ensures smooth start-up and shutdown processes, and reliable, safe handling of signal processing.
ENTRYPOINT ["tini", "--", "entrypoint.sh"]
VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config"]
ENTRYPOINT ["./install/docker/entrypoint.sh"]

View File

@@ -39,7 +39,7 @@ Our minimalist "Harmony" theme gets you going right away, no coding experience r
NodeBB requires the following software to be installed:
* A version of Node.js at least 18 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
* A version of Node.js at least 16 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
* MongoDB, version 3.6 or greater **or** Redis, version 2.8.9 or greater
* If you are using [clustering](https://docs.nodebb.org/configuring/scaling/) you need Redis installed and configured.
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)

View File

@@ -1,78 +0,0 @@
FROM node:lts AS git
ENV USER=nodebb \
UID=1001 \
GID=1001
WORKDIR /usr/src/app/
RUN groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& chown -R ${USER}:${USER} /usr/src/app/
RUN apt-get update \
&& apt-get -y --no-install-recommends install tini
USER ${USER}
# Change to the git branch you want to test
RUN git clone --recurse-submodules -j8 --depth 1 https://github.com/NodeBB/NodeBB.git .
RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \;
FROM node:lts AS node_modules_touch
ENV NODE_ENV=development \
USER=nodebb \
UID=1001 \
GID=1001
WORKDIR /usr/src/app/
RUN corepack enable \
&& groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& chown -R ${USER}:${USER} /usr/src/app/
COPY --from=git --chown=${USER}:${USER} /usr/src/app/install/package.json /usr/src/app/
USER ${USER}
RUN npm install \
&& rm -rf .npm
FROM node:lts-slim AS final
ENV NODE_ENV=development \
DAEMON=false \
SILENT=false \
USER=nodebb \
UID=1001 \
GID=1001
WORKDIR /usr/src/app/
RUN corepack enable \
&& groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/
COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
COPY --from=node_modules_touch --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/
COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/
RUN chmod +x /usr/local/bin/entrypoint.sh \
&& chmod +x /usr/local/bin/tini
# TODO: Have docker-compose use environment variables to create files like setup.json and config.json.
# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate
USER ${USER}
EXPOSE 4567
VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"]
ENTRYPOINT ["tini", "--", "entrypoint.sh"]

View File

@@ -1,70 +0,0 @@
version: '3.8'
services:
nodebb:
build: .
# image: ghcr.io/nodebb/nodebb:latest
restart: unless-stopped
ports:
- '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
- ./install/docker/setup.json:/usr/src/app/setup.json
postgres:
image: postgres:17.2-alpine
restart: unless-stopped
environment:
POSTGRES_USER: nodebb
POSTGRES_PASSWORD: nodebb
POSTGRES_DB: nodebb
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:7.4.2-alpine
restart: unless-stopped
command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']
# command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF
volumes:
- redis-data:/data
profiles:
- redis
volumes:
postgres-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/postgresql/data
redis-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/redis
nodebb-build:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/build
nodebb-uploads:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/public/uploads
nodebb-config:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/config

View File

@@ -1,51 +0,0 @@
version: '3.8'
services:
nodebb:
build: .
# image: ghcr.io/nodebb/nodebb:latest
restart: unless-stopped
ports:
- '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
- ./install/docker/setup.json:/usr/src/app/setup.json
redis:
image: redis:7.4.2-alpine
restart: unless-stopped
command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']
# command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF
volumes:
- redis-data:/data
volumes:
redis-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/redis
nodebb-build:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/build
nodebb-uploads:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/public/uploads
nodebb-config:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/config

View File

@@ -1,89 +1,55 @@
version: '3.8'
services:
nodebb:
build: .
# image: ghcr.io/nodebb/nodebb:latest
restart: unless-stopped
ports:
- '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
- "4567:4567/tcp" # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
# uncomment if you want to use another container as a reverse proxy
# expose:
# - 4567
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
- ./.docker/build:/usr/src/app/build
- ./.docker/public/uploads:/usr/src/app/public/uploads
- ./.docker:/opt/config
- ./install/docker/setup.json:/usr/src/app/setup.json
mongo:
image: 'mongo:7-jammy'
image: "mongo:7-jammy"
restart: unless-stopped
ports:
- '27017:27017'
expose:
- "27017"
environment:
MONGO_INITDB_ROOT_USERNAME: nodebb
MONGO_INITDB_ROOT_PASSWORD: nodebb
MONGO_INITDB_DATABASE: nodebb
volumes:
- mongo-data:/data/db
- ./.docker/database/mongo/config:/etc/mongo
- ./.docker/database/mongo/data:/data/db
- ./install/docker/mongodb-user-init.js:/docker-entrypoint-initdb.d/user-init.js
redis:
image: redis:7.4.2-alpine
restart: unless-stopped
command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']
# command: ['redis-server', '--save', '60', '1', '--loglevel', 'warning'] # uncomment if you want to use snapshotting instead of AOF
volumes:
- redis-data:/data
profiles:
- redis
- mongo
postgres:
image: postgres:17.2-alpine
image: postgres:16.1-alpine
restart: unless-stopped
expose:
- "5432"
environment:
POSTGRES_USER: nodebb
POSTGRES_PASSWORD: nodebb
POSTGRES_DB: nodebb
volumes:
- postgres-data:/var/lib/postgresql/data
- ./.docker/database/postgresql/data:/var/lib/postgresql/data
profiles:
- postgres
volumes:
mongo-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/mongo/data
redis-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/redis
postgres-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/postgresql/data
nodebb-build:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/build
nodebb-uploads:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/public/uploads
nodebb-config:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/config
redis:
image: redis:7.2.3-alpine
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes", "--loglevel", "warning"]
# command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF
expose:
- "6379"
volumes:
- ./.docker/database/redis:/data
profiles:
- redis

View File

@@ -42,17 +42,16 @@
"registrationApprovalType": "normal",
"allowAccountDelete": 1,
"privateUploads": 0,
"allowedFileExtensions": "png,jpg,bmp,txt,webp,webm,mp4,gif",
"allowedFileExtensions": "png,jpg,bmp,txt",
"uploadRateLimitThreshold": 10,
"uploadRateLimitCooldown": 60,
"allowUserHomePage": 1,
"allowMultipleBadges": 1,
"allowMultipleBadges": 0,
"maximumFileSize": 2048,
"stripEXIFData": 1,
"orphanExpiryDays": 0,
"resizeImageWidthThreshold": 2000,
"resizeImageWidth": 760,
"resizeImageKeepOriginal": 1,
"rejectImageWidth": 5000,
"rejectImageHeight": 5000,
"resizeImageQuality": 80,
@@ -100,21 +99,16 @@
"min:rep:aboutme": 0,
"min:rep:signature": 0,
"flags:limitPerTarget": 0,
"flags:postFlagsPerDay": 10,
"flags:userFlagsPerDay": 10,
"flags:autoFlagOnDownvoteThreshold": 0,
"flags:actionOnResolve": "rescind",
"flags:actionOnReject": "rescind",
"notificationType_upvote": "notification",
"notificationType_new-topic": "notification",
"notificationType_new-topic-with-tag": "notification",
"notificationType_new-topic-in-category": "notification",
"notificationType_new-reply": "notification",
"notificationType_post-edit": "notification",
"notificationType_follow": "notification",
"notificationType_new-chat": "notification",
"notificationType_new-group-chat": "notification",
"notificationType_new-public-chat": "none",
"notificationType_group-invite": "notification",
"notificationType_group-leave": "notification",
"notificationType_group-request-membership": "notification",
@@ -141,8 +135,7 @@
"sitemapTopics": 500,
"maintenanceMode": 0,
"maintenanceModeStatus": 503,
"upvoteVisibility": "all",
"downvoteVisibility": "privileged",
"votesArePublic": 0,
"maximumInvites": 0,
"username:disableEdit": 0,
"email:disableEdit": 0,
@@ -183,7 +176,7 @@
"onlineCutoff": 30,
"timeagoCutoff": 30,
"necroThreshold": 7,
"categoryWatchState": "tracking",
"categoryWatchState": "watching",
"submitPluginUsage": 1,
"showAverageApprovalTime": 1,
"autoApproveTime": 0,
@@ -194,12 +187,5 @@
"composer:allowPluginHelp": 1,
"maxReconnectionAttempts": 5,
"reconnectionDelay": 1500,
"disableCustomUserSkins": 0,
"activitypubEnabled": 1,
"activitypubAllowLoopback": 0,
"activitypubProbe": 1,
"activitypubProbeTimeout": 2000,
"activitypubContentPruneDays": 30,
"activitypubUserPruneDays": 7,
"activitypubFilter": 0
}
"disableCustomUserSkins": 0
}

View File

@@ -41,14 +41,6 @@
"textClass": "d-lg-none",
"text": "[[global:header.popular]]"
},
{
"route": "/world",
"title": "[[global:header.world]]",
"enabled": true,
"iconClass": "fa-globe",
"textClass": "d-lg-none",
"text": "[[global:header.world]]"
},
{
"route": "/users",
"title": "[[global:header.users]]",

View File

@@ -1,198 +1,46 @@
#!/bin/bash
set -e
export CONFIG_DIR="${CONFIG_DIR:-/opt/config}"
export CONFIG=$CONFIG_DIR/config.json
export FORCE_BUILD_BEFORE_START="${FORCE_BUILD_BEFORE_START:-false}"
# Function to set default values for environment variables
set_defaults() {
export CONFIG_DIR="${CONFIG_DIR:-/opt/config}"
export CONFIG="$CONFIG_DIR/config.json"
export NODEBB_INIT_VERB="${NODEBB_INIT_VERB:-install}"
export NODEBB_BUILD_VERB="${NODEBB_BUILD_VERB:-build}"
export START_BUILD="${START_BUILD:-${FORCE_BUILD_BEFORE_START:-false}}"
export SETUP="${SETUP:-}"
export PACKAGE_MANAGER="${PACKAGE_MANAGER:-npm}"
export OVERRIDE_UPDATE_LOCK="${OVERRIDE_UPDATE_LOCK:-false}"
}
# Supported verbs: install (web install), setup (interactive CLI session). Default: web install
# TODO: constraint it using a hash set (or hash table)
export NODEBB_INIT_VERB="${NODEBB_INIT_VERB:-install}"
# Setup variable for backward compatibility, default: <empty>
export SETUP="${SETUP:-}"
# Function to check if a directory exists and is writable
check_directory() {
local dir="$1"
if [ ! -d "$dir" ]; then
echo "Error: Directory $dir does not exist. Creating..."
mkdir -p "$dir" || {
echo "Error: Failed to create directory $dir"
exit 1
}
fi
if [ ! -w "$dir" ]; then
echo "Warning: No write permission for directory $dir, attempting to fix..."
chown -R $USER:$USER "$dir" || true # attempt to change ownership, do not exit on failure
chmod -R 760 "$dir" || true # attempt to change permissions, do not exit on failure
if [ ! -w "$dir" ]; then
echo "Error: No write permission for directory $dir. Exiting..."
exit 1
fi
fi
}
mkdir -p $CONFIG_DIR
# Function to copy or link package.json and lock files based on package manager
copy_or_link_files() {
local src_dir="$1"
local dest_dir="$2"
local package_manager="$3"
local lock_file
# if the folder is mounted as a volume this can fail, the check below is to ensure there is still write access
chmod -fR 760 $CONFIG_DIR 2> /dev/null
case "$package_manager" in
yarn) lock_file="yarn.lock" ;;
npm) lock_file="package-lock.json" ;;
pnpm) lock_file="pnpm-lock.yaml" ;;
*)
echo "Unknown package manager: $package_manager"
exit 1
;;
esac
if [[ ! -w $CONFIG_DIR ]]; then
echo "panic: no write permission for $CONFIG_DIR"
exit 1
fi
# Check if source and destination files are the same
if [ "$(realpath "$src_dir/package.json")" != "$(realpath "$dest_dir/package.json")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then
cp "$src_dir/package.json" "$dest_dir/package.json"
fi
[[ -f $CONFIG_DIR/package.json ]] || cp install/package.json $CONFIG_DIR/package.json
[[ -f $CONFIG_DIR/package-lock.json ]] || touch $CONFIG_DIR/package-lock.json
if [ "$(realpath "$src_dir/$lock_file")" != "$(realpath "$dest_dir/$lock_file")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then
cp "$src_dir/$lock_file" "$dest_dir/$lock_file"
fi
ln -fs $CONFIG_DIR/package.json package.json
ln -fs $CONFIG_DIR/package-lock.json package-lock.json
# Remove unnecessary lock files in src_dir
rm -f "$src_dir/"{yarn.lock,package-lock.json,pnpm-lock.yaml}
npm install --omit=dev
# Symbolically link the copied files in src_dir to dest_dir
ln -fs "$dest_dir/package.json" "$src_dir/package.json"
ln -fs "$dest_dir/$lock_file" "$src_dir/$lock_file"
}
# Function to install dependencies using pnpm
install_dependencies() {
case "$PACKAGE_MANAGER" in
yarn) yarn install || {
echo "Failed to install dependencies with yarn"
exit 1
} ;;
npm) npm install || {
echo "Failed to install dependencies with npm"
exit 1
} ;;
pnpm) pnpm install || {
echo "Failed to install dependencies with pnpm"
exit 1
} ;;
*)
echo "Unknown package manager: $PACKAGE_MANAGER"
exit 1
;;
esac
}
# Function to start setup session
start_setup_session() {
local config="$1"
if [[ -n $SETUP ]]; then
echo "Setup environmental variable detected"
echo "Starting setup session"
exec /usr/src/app/nodebb setup --config="$config"
}
# Handle building and upgrading NodeBB
build_forum() {
local config="$1"
local start_build="$2"
local package_hash=$(md5sum install/package.json | head -c 32)
if [ "$package_hash" = "$(cat $CONFIG_DIR/install_hash.md5 || true)" ]; then
echo "package.json was updated. Upgrading..."
/usr/src/app/nodebb upgrade --config="$config" || {
echo "Failed to build NodeBB. Exiting..."
exit 1
}
elif [ "$start_build" = true ]; then
echo "Build before start is enabled. Building..."
/usr/src/app/nodebb "${NODEBB_BUILD_VERB}" --config="$config" || {
echo "Failed to build NodeBB. Exiting..."
exit 1
}
else
echo "No changes in package.json. Skipping build..."
return
./nodebb setup --config=$CONFIG
elif [ -f $CONFIG ]; then
echo "Config file exist at $CONFIG, assuming it is a valid config"
echo "Starting forum"
if [ "$FORCE_BUILD_BEFORE_START" = true ]; then
./nodebb build --config=$CONFIG
fi
echo -n $package_hash > $CONFIG_DIR/install_hash.md5
}
# Function to start forum
start_forum() {
local config="$1"
local start_build="$2"
build_forum "$config" "$start_build"
case "$PACKAGE_MANAGER" in
yarn)
yarn start --config="$config" --no-silent --no-daemon || {
echo "Failed to start forum with yarn"
exit 1
}
;;
npm)
npm start -- --config="$config" --no-silent --no-daemon || {
echo "Failed to start forum with npm"
exit 1
}
;;
pnpm)
pnpm start -- --config="$config" --no-silent --no-daemon || {
echo "Failed to start forum with pnpm"
exit 1
}
;;
*)
echo "Unknown package manager: $PACKAGE_MANAGER"
exit 1
;;
esac
}
# Function to start installation session
start_installation_session() {
local nodebb_init_verb="$1"
local config="$2"
echo "Config file not found at $config"
./nodebb start --config=$CONFIG
else
echo "Config file not found at $CONFIG"
echo "Starting installation session"
exec /usr/src/app/nodebb "$nodebb_init_verb" --config="$config"
}
# Function for debugging and logging
debug_log() {
local message="$1"
echo "DEBUG: $message"
}
# Main function
main() {
set_defaults
check_directory "$CONFIG_DIR"
copy_or_link_files /usr/src/app "$CONFIG_DIR" "$PACKAGE_MANAGER"
install_dependencies
debug_log "PACKAGE_MANAGER: $PACKAGE_MANAGER"
debug_log "CONFIG location: $CONFIG"
debug_log "START_BUILD: $START_BUILD"
if [ -n "$SETUP" ]; then
start_setup_session "$CONFIG"
fi
if [ -f "$CONFIG" ]; then
start_forum "$CONFIG" "$START_BUILD"
else
start_installation_session "$NODEBB_INIT_VERB" "$CONFIG"
fi
}
# Execute main function
main "$@"
./nodebb "${NODEBB_INIT_VERB}" --config=$CONFIG
fi

View File

@@ -1,23 +1,21 @@
{
"defaults": {
"mongo": {
"host": "mongo",
"port": 27017,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
},
"redis": {
"host": "redis",
"port": 6379,
"database": 0
},
"postgres": {
"host": "postgres",
"port": 5432,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
}
"mongo": {
"host": "mongo",
"port": 27017,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
},
"redis": {
"host": "redis",
"port": 6379,
"database": 0
},
"postgres": {
"host": "postgres",
"port": 5432,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
}
}

View File

@@ -2,7 +2,7 @@
"name": "nodebb",
"license": "GPL-3.0",
"description": "NodeBB Forum",
"version": "4.0.6",
"version": "3.5.1",
"homepage": "https://www.nodebb.org",
"repository": {
"type": "git",
@@ -29,129 +29,124 @@
},
"dependencies": {
"@adactive/bootstrap-tagsinput": "0.8.2",
"@fontsource/inter": "5.1.1",
"@fontsource/poppins": "5.1.1",
"@fortawesome/fontawesome-free": "6.7.2",
"@fontsource/inter": "5.0.15",
"@fontsource/poppins": "5.0.8",
"@fortawesome/fontawesome-free": "6.4.2",
"@isaacs/ttlcache": "1.4.1",
"@nodebb/spider-detector": "2.0.3",
"@popperjs/core": "2.11.8",
"@resvg/resvg-js": "2.6.2",
"@textcomplete/contenteditable": "0.1.13",
"@textcomplete/core": "0.1.13",
"@textcomplete/textarea": "0.1.13",
"ace-builds": "1.38.0",
"archiver": "7.0.1",
"async": "3.2.6",
"autoprefixer": "10.4.20",
"ace-builds": "1.31.2",
"archiver": "6.0.1",
"async": "3.2.5",
"autoprefixer": "10.4.16",
"bcryptjs": "2.4.3",
"benchpressjs": "2.5.3",
"body-parser": "1.20.3",
"benchpressjs": "2.5.1",
"body-parser": "1.20.2",
"bootbox": "6.0.0",
"bootstrap": "5.3.3",
"bootswatch": "5.3.3",
"bootstrap": "5.3.2",
"bootswatch": "5.3.2",
"chalk": "4.1.2",
"chart.js": "4.4.8",
"chart.js": "4.4.0",
"cli-graph": "3.2.2",
"clipboard": "2.0.11",
"colors": "1.4.0",
"commander": "12.1.0",
"compare-versions": "6.1.1",
"compression": "1.8.0",
"commander": "11.1.0",
"compare-versions": "6.1.0",
"compression": "1.7.4",
"connect-flash": "0.1.1",
"connect-mongo": "5.1.0",
"connect-multiparty": "2.2.0",
"connect-pg-simple": "10.0.0",
"connect-redis": "8.0.1",
"cookie-parser": "1.4.7",
"cron": "3.5.0",
"cropperjs": "1.6.2",
"csrf-sync": "4.0.3",
"connect-pg-simple": "9.0.1",
"connect-redis": "7.1.0",
"cookie-parser": "1.4.6",
"cron": "3.1.6",
"cropperjs": "1.6.1",
"csrf-sync": "4.0.1",
"daemon": "1.1.0",
"diff": "7.0.0",
"esbuild": "0.25.0",
"express": "4.21.2",
"express-session": "1.18.1",
"diff": "5.1.0",
"esbuild": "0.19.5",
"express": "4.18.2",
"express-session": "1.17.3",
"express-useragent": "1.0.15",
"fetch-cookie": "3.1.0",
"file-loader": "6.2.0",
"fs-extra": "11.3.0",
"fs-extra": "11.1.1",
"graceful-fs": "4.2.11",
"helmet": "7.2.0",
"helmet": "7.1.0",
"html-to-text": "9.0.5",
"imagesloaded": "5.0.0",
"ipaddr.js": "2.2.0",
"ipaddr.js": "2.1.0",
"jquery": "3.7.1",
"jquery-deserialize": "2.0.0",
"jquery-form": "4.3.0",
"jquery-serializeobject": "1.0.0",
"jquery-ui": "1.14.1",
"jsesc": "3.1.0",
"jquery-ui": "1.13.2",
"jsesc": "3.0.2",
"json2csv": "5.0.7",
"jsonwebtoken": "9.0.2",
"lodash": "4.17.21",
"logrotate-stream": "0.2.9",
"lru-cache": "10.4.3",
"lru-cache": "10.0.2",
"mime": "3.0.0",
"mkdirp": "3.0.1",
"mongodb": "6.13.1",
"mongodb": "6.3.0",
"morgan": "1.10.0",
"mousetrap": "1.6.5",
"multiparty": "4.2.3",
"nconf": "0.12.1",
"nodebb-plugin-2factor": "7.5.9",
"nodebb-plugin-composer-default": "10.2.47",
"nodebb-plugin-dbsearch": "6.2.13",
"nodebb-plugin-emoji": "6.0.2",
"nodebb-plugin-emoji-android": "4.1.1",
"nodebb-plugin-markdown": "13.1.0",
"nodebb-plugin-mentions": "4.7.0",
"nodebb-plugin-spam-be-gone": "2.3.1",
"nodebb-plugin-web-push": "0.7.3",
"nodebb-rewards-essentials": "1.0.1",
"nodebb-theme-harmony": "2.0.37",
"nodebb-theme-lavender": "7.1.17",
"nodebb-theme-peace": "2.2.39",
"nodebb-theme-persona": "14.0.15",
"nodebb-widget-essentials": "7.0.35",
"nodemailer": "6.10.0",
"nodebb-plugin-2factor": "7.4.0",
"nodebb-plugin-composer-default": "10.2.27",
"nodebb-plugin-dbsearch": "6.2.3",
"nodebb-plugin-emoji": "5.1.13",
"nodebb-plugin-emoji-android": "4.0.0",
"nodebb-plugin-markdown": "12.2.5",
"nodebb-plugin-mentions": "4.3.7",
"nodebb-plugin-ntfy": "1.7.3",
"nodebb-plugin-spam-be-gone": "2.2.0",
"nodebb-rewards-essentials": "1.0.0",
"nodebb-theme-harmony": "1.1.99",
"nodebb-theme-lavender": "7.1.5",
"nodebb-theme-peace": "2.1.25",
"nodebb-theme-persona": "13.2.47",
"nodebb-widget-essentials": "7.0.14",
"nodemailer": "6.9.7",
"nprogress": "0.2.0",
"passport": "0.7.0",
"passport": "0.6.0",
"passport-http-bearer": "1.0.1",
"passport-local": "1.0.0",
"pg": "8.13.3",
"pg-cursor": "2.12.3",
"postcss": "8.5.3",
"pg": "8.11.3",
"pg-cursor": "2.10.3",
"postcss": "8.4.31",
"postcss-clean": "1.2.0",
"progress-webpack-plugin": "1.0.16",
"prompt": "1.3.0",
"ioredis": "5.5.0",
"rimraf": "5.0.10",
"ioredis": "5.3.2",
"request": "2.88.2",
"request-promise-native": "1.0.9",
"rimraf": "5.0.5",
"rss": "1.2.2",
"rtlcss": "4.3.0",
"sanitize-html": "2.14.0",
"sass": "1.85.0",
"satori": "0.12.1",
"semver": "7.7.1",
"rtlcss": "4.1.1",
"sanitize-html": "2.11.0",
"sass": "1.69.5",
"semver": "7.5.4",
"serve-favicon": "2.5.0",
"sharp": "0.32.6",
"sitemap": "8.0.0",
"socket.io": "4.8.1",
"socket.io-client": "4.8.1",
"@socket.io/redis-adapter": "8.3.0",
"sortablejs": "1.15.6",
"spdx-license-list": "6.9.0",
"terser-webpack-plugin": "5.3.11",
"sitemap": "7.1.1",
"socket.io": "4.7.2",
"socket.io-client": "4.7.2",
"@socket.io/redis-adapter": "8.2.1",
"sortablejs": "1.15.0",
"spdx-license-list": "6.8.0",
"spider-detector": "2.0.1",
"terser-webpack-plugin": "5.3.9",
"textcomplete": "0.18.2",
"textcomplete.contenteditable": "0.1.1",
"timeago": "1.6.7",
"tinycon": "0.6.8",
"toobusy-js": "0.5.1",
"tough-cookie": "5.1.1",
"validator": "13.12.0",
"webpack": "5.98.0",
"webpack-merge": "6.0.1",
"winston": "3.17.0",
"workerpool": "9.2.0",
"validator": "13.11.0",
"webpack": "5.89.0",
"webpack-merge": "5.10.0",
"winston": "3.11.0",
"workerpool": "8.0.0",
"xml": "1.0.1",
"xregexp": "5.1.1",
"yargs": "17.7.2",
@@ -159,25 +154,25 @@
},
"devDependencies": {
"@apidevtools/swagger-parser": "10.1.0",
"@commitlint/cli": "19.6.1",
"@commitlint/config-angular": "19.7.0",
"@commitlint/cli": "18.4.2",
"@commitlint/config-angular": "18.4.2",
"coveralls": "3.1.1",
"eslint": "8.57.1",
"eslint": "8.54.0",
"eslint-config-nodebb": "0.2.1",
"eslint-plugin-import": "2.31.0",
"eslint-plugin-import": "2.29.0",
"grunt": "1.6.1",
"grunt-contrib-watch": "1.1.0",
"husky": "8.0.3",
"jsdom": "26.0.0",
"lint-staged": "15.4.0",
"mocha": "11.0.1",
"jsdom": "22.1.0",
"lint-staged": "15.1.0",
"mocha": "10.2.0",
"mocha-lcov-reporter": "1.3.0",
"mockdate": "3.0.5",
"nyc": "17.1.0",
"smtp-server": "3.13.6"
"nyc": "15.1.0",
"smtp-server": "3.13.0"
},
"optionalDependencies": {
"sass-embedded": "1.83.4"
"sass-embedded": "1.69.5"
},
"resolutions": {
"*/jquery": "3.7.1"
@@ -186,7 +181,7 @@
"url": "https://github.com/NodeBB/NodeBB/issues"
},
"engines": {
"node": ">=18"
"node": ">=16"
},
"maintainers": [
{
@@ -200,4 +195,4 @@
"url": "https://github.com/barisusakli"
}
]
}
}

View File

@@ -2,7 +2,6 @@
const winston = require('winston');
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const fs = require('fs');
const path = require('path');
@@ -14,10 +13,7 @@ const nconf = require('nconf');
const Benchpress = require('benchpressjs');
const { mkdirp } = require('mkdirp');
const { paths } = require('../src/constants');
const utils = require('../src/utils');
const sass = utils.getSass();
const { generateToken, csrfSynchronisedProtection } = require('../src/middleware/csrf');
const sass = require('../src/utils').getSass();
const app = express();
let server;
@@ -77,13 +73,6 @@ web.install = async function (port) {
app.use(bodyParser.urlencoded({
extended: true,
}));
app.use(session({
secret: utils.generateUUID(),
resave: false,
saveUninitialized: false,
}));
try {
await Promise.all([
compileTemplate(),
@@ -114,8 +103,8 @@ function launchExpress(port) {
}
function setupRoutes() {
app.get('/', csrfSynchronisedProtection, welcome);
app.post('/', csrfSynchronisedProtection, install);
app.get('/', welcome);
app.post('/', install);
app.get('/testdb', testDatabase);
app.get('/ping', ping);
app.get('/sping', ping);
@@ -171,7 +160,6 @@ function welcome(req, res) {
minimumPasswordStrength: defaults.minimumPasswordStrength,
installing: installing,
percentInstalled: installing ? ((Date.now() - timeStart) / totalTime * 100).toFixed(2) : 0,
csrf_token: generateToken(req),
});
}

View File

@@ -26,7 +26,7 @@ if (!fs.existsSync(logDir)) {
mkdirp.sync(path.dirname(outputLogFilePath));
}
const output = logrotate({ file: outputLogFilePath, size: '10m', keep: 3, compress: true });
const output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
const silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
let numProcs;
const workers = [];
@@ -99,9 +99,7 @@ Loader.start = function () {
function forkWorker(index, isPrimary) {
const ports = getPorts();
const args = [];
if (nconf.get('max-memory')) {
args.push(`--max-old-space-size=${nconf.get('max-memory')}`);
}
if (!ports[index]) {
return console.log(`[cluster] invalid port for worker : ${index} ports: ${ports.length}`);
}

View File

@@ -1,41 +0,0 @@
<html>
<head>
<title>Internal Server Error</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/assets/5xx.css" />
<script type="text/javascript">
window.onload = function() {
let count = 0;
const bounce = document.getElementById('click-me');
bounce.onclick = function() {
count++;
bounce.className = '';
setTimeout(function() {
bounce.className = 'animated bounce';
}, 50);
if (count > 5) {
document.getElementById('hide').className = '';
}
};
}
</script>
</head>
<body>
<div class="wrapper">
<div class="center">
<h1 id="click-me" class="animated bounce">500</h1>
<p>
<strong>Internal server error. </strong>
</p>
<p>
{message}
</p>
<p>
&nbsp;<small id="hide" class="hide">Alright. You can stop clicking... it's not going to make the site come back sooner!</small>
</p>
</div>
</div>
</body>
</html>

View File

@@ -2,12 +2,147 @@
<head>
<title>Excessive Load Warning</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/assets/5xx.css" />
<style type="text/css">
body {
background: #00A9EA;
color: white;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
text-align: center;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
h1 {
font-size: 250px;
color: #fff;
opacity: 0.5;
margin: 10px;
cursor: pointer;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
}
p {
font-size: 20px;
}
p strong {
font-size: 28px;
}
@media (max-width: 640px) {
h1 {
font-size: 125px;
}
p {
font-size: 16px;
}
p strong {
font-size: 20px;
}
}
.center {
position: relative;
top: 50%;
-webkit-transform: translateY(50%);
-ms-transform: translateY(50%);
transform: translateY(50%);
}
@-webkit-keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
@keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
.bounce {
-webkit-animation-name: bounce;
animation-name: bounce;
-webkit-transform-origin: center bottom;
-ms-transform-origin: center bottom;
transform-origin: center bottom;
}
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
.animated.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.animated.hinge {
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
.hide {
display: none;
}
</style>
<script type="text/javascript">
window.onload = function() {
let count = 0;
const bounce = document.getElementById('click-me');
var count = 0,
bounce = document.getElementById('click-me');
bounce.onclick = function() {
count++;
bounce.className = '';

View File

@@ -1,135 +0,0 @@
body {
background: #00A9EA;
color: white;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
text-align: center;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
h1 {
font-size: 250px;
color: #fff;
opacity: 0.5;
margin: 10px;
cursor: pointer;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
}
p {
font-size: 20px;
}
p strong {
font-size: 28px;
}
@media (max-width: 640px) {
h1 {
font-size: 125px;
}
p {
font-size: 16px;
}
p strong {
font-size: 20px;
}
}
.center {
position: relative;
top: 50%;
-webkit-transform: translateY(50%);
-ms-transform: translateY(50%);
transform: translateY(50%);
}
@-webkit-keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
@keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
.bounce {
-webkit-animation-name: bounce;
animation-name: bounce;
-webkit-transform-origin: center bottom;
-ms-transform-origin: center bottom;
transform-origin: center bottom;
}
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
.animated.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.animated.hinge {
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
.hide {
display: none;
}

View File

@@ -9,9 +9,5 @@
"filter-type": "نوع الحدث",
"filter-start": "تاريخ البدء",
"filter-end": "تاريخ الانتهاء",
"filter-user": "Filter by User",
"filter-user.placeholder": "قم بكتابة اسم مستخدم للتصفية...",
"filter-group": "Filter by Group",
"filter-group.placeholder": "قم بكتابة اسم مجموعة للتصفية...",
"filter-per-page": "لكل صفحة"
}

View File

@@ -94,8 +94,5 @@
"view-as-json": "View as JSON",
"expand-analytics": "Expand analytics",
"clear-search-history": "Clear Search History",
"clear-search-history-confirm": "Are you sure you want to clear entire search history?",
"search-term": "Term",
"search-count": "Count",
"view-all": "View all"
"clear-search-history-confirm": "Are you sure you want to clear entire search history?"
}

View File

@@ -3,7 +3,7 @@
"ip": "رقم الآي بي <strong> %1 </strong>",
"nodes-responded": "عدد %1 نقطة/نقاط استجابوا خلال %2 جزء من الثانية.",
"host": "المضيف",
"primary": "primary / jobs",
"primary": "primary / run jobs",
"pid": "pid",
"nodejs": "nodejs",
"online": "online",
@@ -19,7 +19,6 @@
"registered": "Registered",
"sockets": "Sockets",
"connection-count": "Connection Count",
"guests": "Guests",
"info": "Info"

View File

@@ -12,8 +12,6 @@
"container.card": "Card",
"container.card-header": "Card Header",
"container.card-body": "Card Body",
"container.title": "Title",
"container.body": "Body",
"container.alert": "Alert",
"alert.confirm-delete": "Are you sure you wish to delete this widget?",

View File

@@ -7,8 +7,6 @@
"privileges": "الصلاحيات",
"back-to-categories": "Back to categories",
"name": "Category Name",
"handle": "Category Handle",
"handle.help": "Your category handle is used as a representation of this category across other networks, similar to a username. A category handle must not match an existing username or user group.",
"description": "Category Description",
"bg-color": "Background Colour",
"text-color": "Text Colour",
@@ -39,7 +37,6 @@
"disable": "Disable",
"edit": "Edit",
"analytics": "Analytics",
"federation": "Federation",
"view-category": "View category",
"set-order": "Set order",
@@ -79,22 +76,6 @@
"analytics.topics-daily": "<strong>Figure 3</strong> &ndash; Daily topics created in this category</small>",
"analytics.posts-daily": "<strong>Figure 4</strong> &ndash; Daily posts made in this category</small>",
"federation.title": "Federation settings for \"%1\" category",
"federation.disabled": "Federation is disabled site-wide, so category federation settings are currently unavailable.",
"federation.disabled-cta": "Federation Settings &rarr;",
"federation.syncing-header": "Synchronization",
"federation.syncing-intro": "A category can follow a \"Group Actor\" via the ActivityPub protocol. If content is received from one of the actors listed below, it will be automatically added to this category.",
"federation.syncing-caveat": "N.B. Setting up syncing here establishes a one-way synchronization. NodeBB attempts to subscribe/follow the actor, but the reverse cannot be assumed.",
"federation.syncing-none": "This category is not currently following anybody.",
"federation.syncing-add": "Synchronize with...",
"federation.syncing-actorUri": "Actor",
"federation.syncing-follow": "Follow",
"federation.syncing-unfollow": "Unfollow",
"federation.followers": "Remote users following this category",
"federation.followers-handle": "Handle",
"federation.followers-id": "ID",
"federation.followers-none": "No followers.",
"alert.created": "Created",
"alert.create-success": "Category successfully created!",
"alert.none-active": "You have no active categories.",

View File

@@ -1,28 +0,0 @@
{
"title": "Manage Custom User Fields",
"create-field": "Create Field",
"edit-field": "Edit Field",
"manage-custom-fields": "Manage Custom Fields",
"type-of-input": "Type of input",
"key": "Key",
"name": "Name",
"icon": "Icon",
"type": "Type",
"min-rep": "Minimum Reputation",
"input-type-text": "Input (Text)",
"input-type-link": "Input (Link)",
"input-type-number": "Input (Number)",
"input-type-date": "Input (Date)",
"input-type-select": "Select",
"input-type-select-multi": "Select Multiple",
"select-options": "Options",
"select-options-help": "Add one option per line for the select element",
"minimum-reputation": "Minimum reputation",
"minimum-reputation-help": "If a user has less than this value they won't be able to use this field",
"delete-field-confirm-x": "Do you really want to delete custom field \"%1\"?",
"custom-fields-saved": "Custom fields saved",
"visibility": "Visibility",
"visibility-all": "Everyone can see the field",
"visibility-loggedin": "Only logged in users can see the field",
"visibility-privileged": "Only privileged users like admins & moderators can see the field"
}

View File

@@ -22,7 +22,6 @@
"delete-content": "Delete User(s) <strong>Content</strong>",
"purge": "Delete <strong>User(s)</strong> and <strong>Content</strong>",
"download-csv": "Download CSV",
"custom-user-fields": "Custom User Fields",
"manage-groups": "Manage Groups",
"set-reputation": "Set Reputation",
"add-group": "Add Group",
@@ -122,28 +121,6 @@
"alerts.email-sent-to": "An invitation email has been sent to %1",
"alerts.x-users-found": "%1 user(s) found, (%2 seconds)",
"alerts.select-a-single-user-to-change-email": "Select a single user to change email",
"export": "Export",
"export-users-fields-title": "Select CSV Fields",
"export-field-email": "Email",
"export-field-username": "Username",
"export-field-uid": "UID",
"export-field-ip": "IP",
"export-field-joindate": "Join date",
"export-field-lastonline": "Last Online",
"export-field-lastposttime": "Last Post Time",
"export-field-reputation": "Reputation",
"export-field-postcount": "Post Count",
"export-field-topiccount": "Topic Count",
"export-field-profileviews": "Profile Views",
"export-field-followercount": "Follower Count",
"export-field-followingcount": "Following Count",
"export-field-fullname": "Full Name",
"export-field-website": "Website",
"export-field-location": "Location",
"export-field-birthday": "Birthday",
"export-field-signature": "Signature",
"export-field-aboutme": "About Me",
"export-users-started": "Exporting users as csv, this might take a while. You will receive a notification when it is complete.",
"export-users-completed": "Users exported as csv, click here to download.",
"email": "Email",

View File

@@ -38,7 +38,6 @@
"settings/tags": "الكلمات المفتاحية",
"settings/notifications": "التنبيهات",
"settings/api": "API Access",
"settings/activitypub": "Federation (ActivityPub)",
"settings/sounds": "Sounds",
"settings/social": "Social",
"settings/cookies": "Cookies",

View File

@@ -1,26 +0,0 @@
{
"intro-lead": "What is Federation?",
"intro-body": "NodeBB is able to communicate with other NodeBB instances that support it. This is achieved through a protocol called <a href=\"https://activitypub.rocks/\">ActivityPub</a>. If enabled, NodeBB will also be able to communicate with other apps and websites that use ActivityPub (e.g. Mastodon, Peertube, etc.)",
"general": "General",
"pruning": "Content Pruning",
"content-pruning": "Days to keep remote content",
"content-pruning-help": "Note that remote content that has received engagement (a reply or a upvote/downvote) will be preserved. (0 for disabled)",
"user-pruning": "Days to cache remote user accounts",
"user-pruning-help": "Remote user accounts will only be pruned if they have no posts. Otherwise they will be re-retrieved. (0 for disabled)",
"enabled": "Enable Federation",
"enabled-help": "If enabled, will allow this NodeBB will be able to communicate with all Activitypub-enabled clients on the wider fediverse.",
"allowLoopback": "Allow loopback processing",
"allowLoopback-help": "Useful for debugging purposes only. You should probably leave this disabled.",
"probe": "Open in App",
"probe-enabled": "Try to open ActivityPub-enabled resources in NodeBB",
"probe-enabled-help": "If enabled, NodeBB will check every external link for an ActivityPub equivalent, and load it in NodeBB instead.",
"probe-timeout": "Lookup Timeout (milliseconds)",
"probe-timeout-help": "(Default: 2000) If the lookup query does not receive a response within the set timeframe, will send the user to the link directly instead. Adjust this number higher if sites are responding slowly and you wish to give extra time.",
"server-filtering": "Filtering",
"count": "This NodeBB is currently aware of <strong>%1</strong> server(s)",
"server.filter-help": "Specify servers you would like to bar from federating with your NodeBB. Alternatively, you may opt to selectively <em>allow</em> federation with specific servers, instead. Both options are supported, although they are mutually exclusive.",
"server.filter-help-hostname": "Enter just the instance hostname below (e.g. <code>example.org</code>), separated by line breaks.",
"server.filter-allow-list": "Use this as an Allow List instead"
}

View File

@@ -15,7 +15,7 @@
"title-layout": "Title Layout",
"title-layout-help": "Define how the browser title will be structured ie. &#123;pageTitle&#125; | &#123;browserTitle&#125;",
"description.placeholder": "A short description about your community",
"description": "Choose what page is shown when users navigate to the root URL of your forum.",
"description": "وصف الموقع",
"keywords": "الكلمات الدليله للموقع",
"keywords-placeholder": "Keywords describing your community, comma-separated",
"logo-and-icons": "Site Logo & Icons",
@@ -48,15 +48,5 @@
"background-color-help": "Color used for splash screen background when website is installed as a PWA",
"undo-timeout": "Undo Timeout",
"undo-timeout-help": "Some operations such as moving topics will allow for the moderator to undo their action within a certain timeframe. Set to 0 to disable undo completely.",
"topic-tools": "Topic Tools",
"home-page": "Home Page",
"home-page-route": "Home Page Route",
"custom-route": "Custom Route",
"allow-user-home-pages": "Allow User Home Pages",
"home-page-title": "Title of the home page (default \"Home\")",
"default-language": "اللغة الافتراضية",
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي",
"default-language-help": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
"post-sharing": "Post Sharing",
"info-plugins-additional": "Plugins can add additional networks for sharing posts."
}
"topic-tools": "Topic Tools"
}

View File

@@ -0,0 +1,8 @@
{
"settings": "Settings",
"guest-settings": "Guest Settings",
"handles.enabled": "Allow guest handles",
"handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"",
"topic-views.enabled": "Allow guests to increase topic view counts",
"reply-notifications.enabled": "Allow guests to generate reply notifications"
}

View File

@@ -0,0 +1,8 @@
{
"home-page": "Home Page",
"description": "Choose what page is shown when users navigate to the root URL of your forum.",
"home-page-route": "Home Page Route",
"custom-route": "Custom Route",
"allow-user-home-pages": "Allow User Home Pages",
"home-page-title": "Title of the home page (default \"Home\")"
}

View File

@@ -0,0 +1,6 @@
{
"language-settings": "اعدادات اللغة",
"description": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
"default-language": "اللغة الافتراضية",
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي"
}

View File

@@ -10,7 +10,7 @@
"id": "ID: <small>optional</small>",
"properties": "Properties:",
"show-to-groups": "Show to Groups:",
"groups": "Groups:",
"open-new-window": "Open in a new window",
"dropdown": "Dropdown",
"dropdown-placeholder": "Place your dropdown menu items below, ie: <br/>&lt;li&gt;&lt;a class=&quot;dropdown-item&quot; href&#x3D;&quot;https://myforum.com&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;",

View File

@@ -4,11 +4,8 @@
"sorting.post-default": "Default Post Sorting",
"sorting.oldest-to-newest": "Oldest to Newest",
"sorting.newest-to-oldest": "Newest to Oldest",
"sorting.recently-replied": "Recently Replied",
"sorting.recently-created": "Recently Created",
"sorting.most-votes": "Most Votes",
"sorting.most-posts": "Most Posts",
"sorting.most-views": "Most Views",
"sorting.topic-default": "Default Topic Sorting",
"length": "Post Length",
"post-queue": "Post Queue",

View File

@@ -2,14 +2,7 @@
"reputation": "Reputation Settings",
"disable": "Disable Reputation System",
"disable-down-voting": "Disable Down Voting",
"upvote-visibility": "Up Vote visibility",
"upvote-visibility-all": "Everyone can see up votes",
"upvote-visibility-loggedin": "Only logged in users can see up votes",
"upvote-visibility-privileged": "Only privileged users like admins & moderators can see up votes",
"downvote-visibility": "Down Vote visibility",
"downvote-visibility-all": "Everyone can see down votes",
"downvote-visibility-loggedin": "Only logged in users can see down votes",
"downvote-visibility-privileged": "Only privileged users like admins & moderators can see down votes",
"votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds",
"min-rep-upvote": "Minimum reputation to upvote posts",
"upvotes-per-day": "Upvotes per day (set to 0 for unlimited upvotes)",
@@ -20,6 +13,7 @@
"min-rep-chat": "Minimum reputation to send chat messages",
"min-rep-post-links": "Minimum reputation to post links",
"min-rep-flag": "Minimum reputation to flag posts",
"min-rep-website": "Minimum reputation to add \"Website\" to user profile",
"min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile",
"min-rep-signature": "Minimum reputation to add \"Signature\" to user profile",
"min-rep-profile-picture": "Minimum reputation to add \"Profile Picture\" to user profile",
@@ -29,12 +23,7 @@
"flags.limit-per-target": "Maximum number of times something can be flagged",
"flags.limit-per-target-placeholder": "Default: 0",
"flags.limit-per-target-help": "When a post or user is flagged multiple times, each additional flag is considered a &quot;report&quot; and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.",
"flags.limit-post-flags-per-day": "Maximum number of times a user can flag posts in a day",
"flags.limit-post-flags-per-day-help": "Set to 0 to disable, (default: 10)",
"flags.limit-user-flags-per-day": "Maximum number of times a user can flag users in a day",
"flags.limit-user-flags-per-day-help": "Set to 0 to disable, (default: 10)",
"flags.auto-flag-on-downvote-threshold": "Number of downvotes to auto flag posts",
"flags.auto-flag-on-downvote-threshold-help": "Set to 0 to disable, (default: 0)",
"flags.auto-flag-on-downvote-threshold": "Number of downvotes to auto flag posts (Set to 0 to disable, default: 0)",
"flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned",
"flags.action-on-resolve": "Do the following when a flag is resolved",
"flags.action-on-reject": "Do the following when a flag is rejected",

View File

@@ -0,0 +1,4 @@
{
"post-sharing": "Post Sharing",
"info-plugins-additional": "Plugins can add additional networks for sharing posts."
}

View File

@@ -9,10 +9,9 @@
"private-extensions": "File extensions to make private",
"private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. <code>pdf,xls,doc</code>). An empty list means all files are private.",
"resize-image-width-threshold": "Resize images if they are wider than specified width",
"resize-image-width-threshold-help": "(in pixels, default: 2000 pixels, set to 0 to disable)",
"resize-image-width-threshold-help": "(in pixels, default: 1520 pixels, set to 0 to disable)",
"resize-image-width": "Resize images down to specified width",
"resize-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)",
"resize-image-keep-original": "Keep original image after resize",
"resize-image-quality": "Quality to use when resizing images",
"resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.",
"max-file-size": "الحد الأقصى لحجم الملف (بالكيبيبايت)",

View File

@@ -88,10 +88,5 @@
"restrictions.seconds-before-new": "Seconds before a new user can make their first post",
"restrictions.seconds-edit-after-new": "Number of seconds a post remains editable for new users (set to 0 to disable)",
"restrictions.milliseconds-between-messages": "Time between chat messages for new users (ms)",
"restrictions.groups-exempt-from-new-user-restrictions": "Select groups that should be exempt from the new user restrictions",
"guest-settings": "Guest Settings",
"handles.enabled": "Allow guest handles",
"handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"",
"topic-views.enabled": "Allow guests to increase topic view counts",
"reply-notifications.enabled": "Allow guests to generate reply notifications"
}
"restrictions.groups-exempt-from-new-user-restrictions": "Select groups that should be exempt from the new user restrictions"
}

View File

@@ -1,9 +0,0 @@
{
"post-sort-option": "Post sort option, %1",
"topic-sort-option": "Topic sort option, %1",
"user-avatar-for": "User avatar for %1",
"profile-page-for": "Profile page for user %1",
"user-watched-tags": "User watched tags",
"delete-upload-button": "Delete upload button",
"group-page-link-for": "Group page link for %1"
}

View File

@@ -32,7 +32,7 @@
"folder-exists": "Folder exists",
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
"username-taken": "اسم المستخدم مأخوذ",
"email-taken": "Email address is already taken.",
"email-taken": "البريد الالكتروني مأخوذ",
"email-nochange": "The email entered is the same as the email already on file.",
"email-invited": "Email was already invited",
"email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.",
@@ -153,7 +153,6 @@
"about-me-too-long": "نأسف، ( عني ) لا يمكن أن يكون أكثر من %1 حرف.",
"cant-chat-with-yourself": "لايمكنك فتح محادثة مع نفسك",
"chat-restricted": "هذا المستخدم عطل المحادثات الواردة عليه. يجب أن يتبعك حتى تتمكن من فتح محادثة معه.",
"chat-user-blocked": "You have been blocked by this user.",
"chat-disabled": "نظام المحادثة معطل.",
"too-many-messages": "لقد أرسلت الكثير من الرسائل، الرجاء اﻹنتظار قليلاً",
"invalid-chat-message": "الرسالة غير صالحة.",
@@ -181,20 +180,10 @@
"not-enough-reputation-min-rep-signature": "You need %1 reputation to add a signature",
"not-enough-reputation-min-rep-profile-picture": "You need %1 reputation to add a profile picture",
"not-enough-reputation-min-rep-cover-picture": "You need %1 reputation to add a cover picture",
"not-enough-reputation-custom-field": "You need %1 reputation for %2",
"custom-user-field-value-too-long": "Custom field value too long, %1",
"custom-user-field-select-value-invalid": "Custom field selected option is invalid, %1",
"custom-user-field-invalid-text": "Custom field text is invalid, %1",
"custom-user-field-invalid-link": "Custom field link is invalid, %1",
"custom-user-field-invalid-number": "Custom field number is invalid, %1",
"custom-user-field-invalid-date": "Custom field date is invalid, %1",
"invalid-custom-user-field": "Invalid custom user field, \"%1\" is already used by NodeBB",
"post-already-flagged": "You have already flagged this post",
"user-already-flagged": "You have already flagged this user",
"post-flagged-too-many-times": "This post has been flagged by others already",
"user-flagged-too-many-times": "This user has been flagged by others already",
"too-many-post-flags-per-day": "You can only flag %1 post(s) per day",
"too-many-user-flags-per-day": "You can only flag %1 user(s) per day",
"cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)",
"cant-locate-flag-report": "Cannot locate flag report",
"self-vote": "You cannot vote on your own post",
@@ -230,12 +219,10 @@
"already-unblocked": "This user is already unblocked",
"no-connection": "There seems to be a problem with your internet connection",
"socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later",
"invalid-plugin-id": "Invalid plugin ID",
"plugin-not-whitelisted": "Unable to install plugin &ndash; only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP",
"plugins-set-in-configuration": "You are not allowed to change plugin state as they are defined at runtime (config.json, environmental variables or terminal arguments), please modify the configuration instead.",
"theme-not-set-in-configuration": "When defining active plugins in configuration, changing themes requires adding the new theme to the list of active plugins before updating it in the ACP",
"topic-event-unrecognized": "Topic event '%1' unrecognized",
"category.handle-taken": "Category handle is already taken, please choose another.",
"cant-set-child-as-parent": "Can't set child as parent category",
"cant-set-self-as-parent": "Can't set self as parent category",
"api.master-token-no-uid": "A master token was received without a corresponding `_uid` in the request body",
@@ -248,12 +235,5 @@
"api.500": "An unexpected error was encountered while attempting to service your request.",
"api.501": "The route you are trying to call is not implemented yet, please try again tomorrow",
"api.503": "The route you are trying to call is not currently available due to a server configuration",
"api.reauth-required": "The resource you are trying to access requires (re-)authentication.",
"activitypub.not-enabled": "Federation is not enabled on this server",
"activitypub.invalid-id": "Unable to resolve the input id, likely as it is malformed.",
"activitypub.get-failed": "Unable to retrieve the specified resource.",
"activitypub.pubKey-not-found": "Unable to resolve public key, so payload verification cannot take place.",
"activitypub.origin-mismatch": "The received object's origin does not match the sender's origin",
"activitypub.actor-mismatch": "The received activity is being carried out by an actor that is different from expected.",
"activitypub.not-implemented": "The request was denied because it or an aspect of it is not implemented by the recipient server"
"api.reauth-required": "The resource you are trying to access requires (re-)authentication."
}

View File

@@ -84,18 +84,12 @@
"modal-reason-offensive": "Offensive",
"modal-reason-other": "Other (specify below)",
"modal-reason-custom": "Reason for reporting this content...",
"modal-notify-remote": "Forward this report to %1",
"modal-submit": "Submit Report",
"modal-submit-success": "Content has been flagged for moderation.",
"modal-confirm-rescind": "Rescind Report?",
"bulk-actions": "Bulk Actions",
"bulk-resolve": "Resolve Flag(s)",
"confirm-purge": "Are you sure you want to permanently delete these flags?",
"purge-cancelled": "Flag Purge Cancelled",
"bulk-purge": "Purge Flag(s)",
"bulk-success": "%1 flags updated",
"flagged-timeago": "Flagged <span class=\"timeago\" title=\"%1\"></span>",
"flagged-timeago-readable": "Flagged <span class=\"timeago\" title=\"%1\"></span> (%2)",
"auto-flagged": "[Auto Flagged] Received %1 downvotes."
}

View File

@@ -24,15 +24,8 @@
"cancel": "Cancel",
"close": "أغلق",
"pagination": "الصفحات",
"pagination.previouspage": "Previous Page",
"pagination.nextpage": "Next Page",
"pagination.firstpage": "First Page",
"pagination.lastpage": "Last Page",
"pagination.out-of": "%1 من %2",
"pagination.enter-index": "Go to post index",
"pagination.go-to-page": "Go to page",
"pagination.page-x": "Page %1",
"header.brand-logo": "Brand Logo",
"header.admin": "مدير النظام",
"header.categories": "الأقسام",
"header.recent": "حديث",
@@ -50,11 +43,12 @@
"header.navigation": "الاستكشاف",
"header.manage": "Manage",
"header.drafts": "Drafts",
"header.world": "World",
"notifications.loading": "تحميل التنبيهات",
"chats.loading": "تحميل الدردشات",
"drafts.loading": "Loading Drafts",
"motd.welcome": "مرحبا بكم في NodeBB، منصة المناقشة المستقبلية.",
"previouspage": "الصفحة السابقة",
"nextpage": "الصفحة التالية",
"alert.success": "نجاح",
"alert.error": "خطأ",
"alert.warning": "Warning",
@@ -111,7 +105,6 @@
"dnd": "عدم الإزعاج",
"invisible": "مخفي",
"offline": "غير متصل",
"remote-user": "This user is from outside of this forum",
"email": "عنوان البريد الإلكتروني",
"language": "اللغة",
"guest": "زائر",
@@ -142,12 +135,9 @@
"edited": "حُرِر",
"disabled": "معطل",
"select": "تحديد",
"selected": "Selected",
"copied": "Copied",
"user-search-prompt": "Type something here to find users...",
"hidden": "Hidden",
"sort": "Sort",
"actions": "Actions",
"rss-feed": "RSS Feed",
"skip-to-content": "Skip to content"
"actions": "Actions"
}

View File

@@ -1,9 +1,8 @@
{
"chat.room-id": "Room %1",
"chat.chatting-with": "Chat with",
"chat.placeholder": "Type chat message here, drag & drop images",
"chat.placeholder.mobile": "Type chat message",
"chat.placeholder.message-room": "Message #%1",
"chat.placeholder": "Type chat message here, drag & drop images, press enter to send",
"chat.placeholder.mobile": "Type chat message here",
"chat.scroll-up-alert": "Go to most recent message",
"chat.usernames-and-x-others": "%1 & %2 others",
"chat.chat-with-usernames": "Chat with %1",
@@ -115,8 +114,6 @@
"composer.discard-all-drafts": "Discard all drafts",
"composer.no-drafts": "You have no drafts",
"composer.discard-draft-confirm": "Do you want to discard this draft?",
"composer.remote-pid-editing": "Editing a remote post",
"composer.remote-pid-content-immutable": "The content of remote posts cannot be edited. However, you are able change the topic title and tags.",
"bootbox.ok": "OK",
"bootbox.cancel": "إلغاء",
"bootbox.confirm": "تأكيد",

View File

@@ -52,10 +52,10 @@
"user-posted-to-multiple": "<strong>%1</strong>, <strong>%2</strong> and %3 others have posted replies to: <strong>%4</strong>",
"user-posted-topic": "<strong>%1</strong> أنشأ موضوعًا جديدًا: <strong>%2</strong>",
"user-edited-post": "<strong>%1</strong> has edited a post in <strong>%2</strong>",
"user-posted-topic-with-tag": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3)",
"user-posted-topic-with-tag-dual": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3 and %4)",
"user-posted-topic-with-tag-triple": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3, %4, and %5)",
"user-posted-topic-with-tag-multiple": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3)",
"user-posted-topic-with-tag": "<strong>%1</strong> has posted a new topic with tag <strong>%2</strong>",
"user-posted-topic-with-tag-dual": "<strong>%1</strong> has posted a new topic with tags <strong>%2</strong> and <strong>%3</strong>",
"user-posted-topic-with-tag-triple": "<strong>%1</strong> has posted a new topic with tags <strong>%2</strong>, <strong>%3</strong> and <strong>%4</strong>",
"user-posted-topic-with-tag-multiple": "<strong>%1</strong> has posted a new topic with tags <strong>%2</strong>",
"user-posted-topic-in-category": "<strong>%1</strong> has posted a new topic in <strong>%2</strong>",
"user-started-following-you": "<strong>%1</strong> صار يتابعك.",
"user-started-following-you-dual": "<strong>%1</strong> and <strong>%2</strong> started following you.",
@@ -75,7 +75,6 @@
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
"email-confirm-error-message-already-validated": "Your email address was already validated.",
"email-confirm-sent": "تم إرسال بريد التفعيل.",
"none": "None",
"notification-only": "التنبيهات فقط",
@@ -98,9 +97,5 @@
"notificationType-post-queue": "When a new post is queued",
"notificationType-new-post-flag": "When a post is flagged",
"notificationType-new-user-flag": "When a user is flagged",
"notificationType-new-reward": "When you earn a new reward",
"activitypub.announce": "<strong>%1</strong> shared your post in <strong>%2</strong> to their followers.",
"activitypub.announce-dual": "<strong>%1</strong> and <strong>%2</strong> shared your post in <strong>%3</strong> to their followers.",
"activitypub.announce-triple": "<strong>%1</strong>, <strong>%2</strong> and <strong>%3</strong> shared your post in <strong>%4</strong> to their followers.",
"activitypub.announce-multiple": "<strong>%1</strong>, <strong>%2</strong> and %3 others shared your post in <strong>%4</strong> to their followers."
"notificationType-new-reward": "When you earn a new reward"
}

View File

@@ -36,7 +36,6 @@
"chat": "Chatting with %1",
"flags": "Flags",
"flag-details": "Flag %1 Details",
"world": "World",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",
@@ -55,7 +54,6 @@
"account/settings-of": "Changing settings of %1",
"account/watched": "Topics watched by %1",
"account/ignored": "Topics ignored by %1",
"account/read": "Topics read by %1",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1",
@@ -63,7 +61,6 @@
"account/blocks": "Blocked users for %1",
"account/uploads": "Uploads by %1",
"account/sessions": "Login Sessions",
"account/shares": "Topics shared by %1",
"confirm": "تم التحقق من عنوان البريد الإلكتروني",
"maintenance.text": "%1 is currently undergoing maintenance.<br/>Please come back another time.",
"maintenance.messageIntro": "بالإضافة إلى ذلك، قام مدبر النظام بترك هذه الرسالة:",

View File

@@ -38,6 +38,5 @@
"remove-selected": "Remove Selected",
"remove-selected-confirm": "Do you want to remove %1 selected posts?",
"bulk-accept-success": "%1 posts accepted",
"bulk-reject-success": "%1 posts rejected",
"links-in-this-post": "Links in this post"
"bulk-reject-success": "%1 posts rejected"
}

View File

@@ -7,7 +7,5 @@
"alltime": "دائمًا",
"no-recent-topics": "لايوجد مواضيع جديدة",
"no-popular-topics": "لا يوجد مواضيع شائعة",
"load-new-posts": "Load new posts",
"uncategorized.title": "All known topics",
"uncategorized.intro": "This page shows a chronological listing of every topic that this forum has received.<br />The views and opinions expressed in the topics below are not moderated and may not represent the views and opinions of this website."
"load-new-posts": "Load new posts"
}

View File

@@ -7,7 +7,6 @@
"in-titles": "In titles",
"in-titles-posts": "In titles and posts",
"in-posts": "In posts",
"in-bookmarks": "In bookmarks",
"in-categories": "In categories",
"in-users": "In users",
"in-tags": "In tags",

View File

@@ -3,7 +3,7 @@
"no-tag-topics": "لا يوجد مواضيع بهذه الكلمة الدلالية.",
"no-tags-found": "No tags found",
"tags": "الكلمات الدلالية",
"enter-tags-here": "Enter tags, %1 - %2 characters.",
"enter-tags-here": "Enter tags here, between %1 and %2 characters each.",
"enter-tags-here-short": "أدخل الكلمات الدلالية...",
"no-tags": "لا يوجد كلمات دلالية بعد.",
"select-tags": "Select Tags",

View File

@@ -3,18 +3,13 @@
"skins": "Skins",
"collapse": "Collapse",
"expand": "Expand",
"sidebar-toggle": "Sidebar Toggle",
"login-register-to-search": "Login or register to search.",
"settings.title": "Theme settings",
"settings.enableQuickReply": "Enable quick reply",
"settings.enableBreadcrumbs": "Show breadcrumbs in Category and Topic pages",
"settings.enableBreadcrumbs.why": "Breadcrumbs are visible in most pages for ease-of-navigation. The base design of the category and topic pages has alternative means to link back to parent pages, but the breadcrumb can be toggled off to reduce clutter.",
"settings.centerHeaderElements": "Center header elements",
"settings.mobileTopicTeasers": "Show topic teasers on mobile",
"settings.stickyToolbar": "Sticky toolbar",
"settings.stickyToolbar.help": "The toolbar on topic and category pages will stick to the top of the page",
"settings.topicSidebarTools": "Topic sidebar tools",
"settings.topicSidebarTools.help": "This option will move the topic tools to the sidebar on desktop",
"settings.autohideBottombar": "Auto hide bottom bar",
"settings.autohideBottombar.help": "The bottom bar on mobile view will be hidden when the page is scrolled down",
"settings.openSidebars": "Open sidebars",

View File

@@ -1,4 +1,4 @@
{
"title": "أعلى الصفحة",
"no-top-topics": "لا توجد مواضيع أعلى الصفحة"
"title": "Top",
"no-top-topics": "No top topics"
}

View File

@@ -15,7 +15,6 @@
"replies-to-this-post": "%1 الردود",
"one-reply-to-this-post": "1 رد",
"last-reply-time": "آخر رد",
"reply-options": "Reply options",
"reply-as-topic": "رد بموضوع",
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
"login-to-view": "سجل الدخول للمشاهدة",
@@ -27,7 +26,6 @@
"restore": "استعادة",
"move": "نقل",
"change-owner": "Change Owner",
"manage-editors": "Manage Editors",
"fork": "فرع",
"link": "رابط",
"share": "نشر",
@@ -36,7 +34,6 @@
"pinned": "مثبت",
"pinned-with-expiry": "مثبت حتى %1",
"scheduled": "Scheduled",
"deleted": "Deleted",
"moved": "منقول",
"moved-from": "Moved from %1",
"copy-code": "Copy Code",
@@ -61,8 +58,6 @@
"user-restored-topic-on": "%1 restored this topic on %2",
"user-moved-topic-from-ago": "%1 moved this topic from %2 %3",
"user-moved-topic-from-on": "%1 moved this topic from %2 on %3",
"user-shared-topic-ago": "%1 shared this topic %2",
"user-shared-topic-on": "%1 shared this topic on %2",
"user-queued-post-ago": "%1 <a href=\"%2\">queued</a> post for approval %3",
"user-queued-post-on": "%1 <a href=\"%2\">queued</a> post for approval on %3",
"user-referenced-topic-ago": "%1 <a href=\"%2\">referenced</a> this topic %3",
@@ -106,7 +101,6 @@
"thread-tools.move-posts": "Move Posts",
"thread-tools.move-all": "نقل الكل",
"thread-tools.change-owner": "Change Owner",
"thread-tools.manage-editors": "Manage Editors",
"thread-tools.select-category": "Select Category",
"thread-tools.fork": "إنشاء فرع الموضوع",
"thread-tools.tag": "Tag Topic",
@@ -137,7 +131,6 @@
"bookmarks": "Bookmarks",
"bookmarks.has-no-bookmarks": "You haven't bookmarked any posts yet.",
"copy-permalink": "Copy Permalink",
"go-to-original": "View Original Post",
"loading-more-posts": "تحميل المزيد من المشاركات",
"move-topic": "نقل الموضوع",
"move-topics": "نقل المواضيع",
@@ -162,7 +155,6 @@
"move-posts-instruction": "Click the posts you want to move then enter a topic ID or go to the target topic",
"move-topic-instruction": "Select the target category and then click move",
"change-owner-instruction": "Click the posts you want to assign to another user",
"manage-editors-instruction": "Manage the users who can edit this post below.",
"composer.title-placeholder": "أدخل عنوان موضوعك هنا...",
"composer.handle-placeholder": "Enter your name/handle here",
"composer.hide": "Hide",
@@ -188,8 +180,6 @@
"sort-by": "ترتيب حسب",
"oldest-to-newest": "من الأقدم إلى الأحدث",
"newest-to-oldest": "من الأحدث إلى الأقدم",
"recently-replied": "Recently Replied",
"recently-created": "Recently Created",
"most-votes": "Most Votes",
"most-posts": "Most Posts",
"most-views": "Most Views",
@@ -214,15 +204,7 @@
"last-post": "Last post",
"go-to-my-next-post": "Go to my next post",
"no-more-next-post": "You don't have more posts in this topic",
"open-composer": "Open composer",
"post-quick-reply": "Quick reply",
"navigator.index": "Post %1 of %2",
"navigator.unread": "%1 unread",
"upvote-post": "Upvote post",
"downvote-post": "Downvote post",
"post-tools": "Post tools",
"unread-posts-link": "Unread posts link",
"thumb-image": "Topic thumbnail image",
"announcers": "Shares",
"announcers-x": "Shares (%1)"
"navigator.unread": "%1 unread"
}

View File

@@ -3,7 +3,6 @@
"no-unread-topics": "ليس هناك أي موضوع غير مقروء",
"load-more": "حمل المزيد",
"mark-as-read": "حدد غير مقروء",
"mark-as-unread": "Mark as Unread",
"selected": "المحددة",
"all": "الكل",
"all-categories": "كل الفئات",

View File

@@ -1,9 +1,6 @@
{
"user-menu": "قائمة المستخدم",
"banned": "محظور",
"unbanned": "Unbanned",
"muted": "كتم",
"unmuted": "Unmuted",
"offline": "غير متصل",
"deleted": "محذوف",
"username": "إسم المستخدم",
@@ -16,7 +13,7 @@
"ban-account": "حظر الحساب",
"ban-account-confirm": "هل تريد حقاً حظر هاذا العضو؟",
"unban-account": "إزالة حظر الحساب",
"mute-account": "كتم الحساب",
"mute-account": "Mute Account",
"unmute-account": "Unmute Account",
"delete-account": "حذف الحساب",
"delete-account-as-admin": "Delete <strong>Account</strong>",
@@ -39,15 +36,13 @@
"reputation": "السمعة",
"bookmarks": "المفضلات",
"watched-categories": "الأقسام المُتابعة",
"watched-tags": "الوسوم المُتابعة",
"watched-tags": "Watched tags",
"change-all": "غير الكل",
"watched": "متابع",
"ignored": "تم تجاهله",
"read": "Read",
"default-category-watch-state": "حالة مشاهدة اﻻقسام الافتراضية",
"followers": "المتابعون",
"following": "يتابع",
"shares": "Shares",
"blocks": "الكتل",
"blocked-users": "Blocked users",
"block-toggle": "تبديل الكتلة",
@@ -60,10 +55,8 @@
"chat-with": "متابعة الدردشة مع %1",
"new-chat-with": "بدء دردشة جديدة مع %1",
"flag-profile": "ضع علامة على الملف الشخصي",
"profile-flagged": "Already flagged",
"follow": "تابع",
"unfollow": "إلغاء المتابعة",
"cancel-follow": "Cancel follow request",
"more": "المزيد",
"profile-update-success": "تم تحديث الملف الشخصي بنجاح",
"change-picture": "تغيير الصورة",
@@ -78,11 +71,10 @@
"upload-new-picture": "رفع صورة جديدة",
"upload-new-picture-from-url": "رفع صورة جديدة من رابط",
"current-password": "كلمة السر الحالية",
"new-password": "كلمة السر الجديدة",
"new-password": "New Password",
"change-password": "تغيير كلمة السر",
"change-password-error": "كلمة سر غير صحيحة",
"change-password-error-wrong-current": "كلمة السر الحالية ليست صحيحة",
"change-password-error-same-password": "كلمة السر الجديدة مطابقة لكلمة السر الحالية, فضلاً قم بإدخال كلمة سر جديدة.",
"change-password-error-match": "كلمة السر غير مطابقة لتأكيد كلمة السر",
"change-password-error-privileges": "ليس لديك الصلاحيات الكافية لتغيير كلمة السر هذه.",
"change-password-success": "تم تحديث كلمة السر خاصتك.",
@@ -118,12 +110,10 @@
"has-no-topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.",
"has-no-watched-topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.",
"has-no-ignored-topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.",
"has-no-read-topics": "هذا المستخدم لم يقم بقراءة أي مشاركة حتى الاّن.",
"has-no-upvoted-posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.",
"has-no-downvoted-posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.",
"has-no-controversial-posts": "هذا المستخدم ﻻيمتلك تصويت للأسفل لأي مشاركة حتى الآن.",
"has-no-blocks": "أنت لم تحظر اي مستخدم",
"has-no-shares": "This user has not shared any topics.",
"email-hidden": "البريد الإلكتروني مخفي",
"hidden": "مخفي",
"paginate-description": "عرض المواضيع والردود موزعة على صفحات عوضاً عن التمرير اللانهائي.",
@@ -151,10 +141,6 @@
"follow-topics-you-create": "متابعة المواضيع التي تقوم بإنشائها",
"grouptitle": "عنوان المجموعة",
"group-order-help": "Select a group and use the arrows to order titles",
"show-group-title": "Show group title",
"hide-group-title": "Hide group title",
"order-group-up": "Order group up",
"order-group-down": "Order group down",
"no-group-title": "لا يوجد عنوان للمجموعة",
"select-skin": "إختر سمة",
"default": "Default (%1)",
@@ -171,16 +157,11 @@
"sso.dissociate-confirm-title": "تأكيد الفصل",
"sso.dissociate-confirm": "هل تريد بالتأكيد فصل حسابك عن %1؟",
"info.latest-flags": "أحدث العلامات",
"info.profile": "Profile",
"info.post": "Post",
"info.view-flag": "View flag",
"info.reported-by": "Reported by:",
"info.no-flags": "لم يتم العثور على مشاركات معلمة",
"info.ban-history": "سجل الحظر الأحدث",
"info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا",
"info.banned-until": "محظور حتى %1",
"info.banned-expiry": "Expiry",
"info.ban-expired": "Ban expired",
"info.banned-permanently": "محظور بشكل دائم",
"info.banned-reason-label": "سبب",
"info.banned-no-reason": "لم يتم إعطاء سبب.",

View File

@@ -1,6 +1,5 @@
{
"all-users": "كل المستخدمين",
"followed-users": "Followed Users",
"all-users": "All Users",
"latest-users": "أحدث الأعضاء",
"top-posters": "اﻷكثر مشاركة",
"most-reputation": "أعلى سمعة",

View File

@@ -1,18 +0,0 @@
{
"name": "World",
"popular": "Popular topics",
"recent": "All topics",
"help": "Help",
"help.title": "What is this page?",
"help.intro": "Welcome to your corner of the fediverse.",
"help.fediverse": "The \"fediverse\" is a network of interconnected applications and websites that all talk to one another and whose users can see each other. This forum is federated, and can interact with that social web (or \"fediverse\"). This page is your corner of the fediverse. It consists solely of topics created by — and shared from — users <strong>you</strong> follow.",
"help.build": "There might not be a lot of topics here to start; that's normal. You will start to see more content here over time when you start following other users.",
"help.federating": "Likewise, if users from outside of this forum start following <em>you</em>, then your posts will start appearing on those apps and websites as well.",
"help.next-generation": "This is the next generation of social media, start contributing today!",
"onboard.title": "Your window to the fediverse...",
"onboard.what": "This is your personalized category made up of only content found outside of this forum. Whether something shows up in this page depends on whether you follow them, or whether that post was shared by someone you follow.",
"onboard.why": "There's a lot that goes on outside of this forum, and not all of it is relevant to your interests. That's why following people is the best way to signal that you want to see more from someone.",
"onboard.how": "In the meantime, you can click on the shortcut buttons at the top to see what else this forum knows about, and start discovering some new content!"
}

View File

@@ -9,9 +9,5 @@
"filter-type": "Вид събитие",
"filter-start": "Начална дата",
"filter-end": "Крайна дата",
"filter-user": "Филтриране по потребител",
"filter-user.placeholder": "Въведете име на потребител, за да филтрирате…",
"filter-group": "Филтриране по група",
"filter-group.placeholder": "Въведете име на група, за да филтрирате…",
"filter-per-page": "На страница"
}

View File

@@ -94,8 +94,5 @@
"view-as-json": "Преглед като JSON",
"expand-analytics": "Разгъване на данните за анализ",
"clear-search-history": "Изчистване на историята на търсенията",
"clear-search-history-confirm": "Наистина ли искате да изчистите историята на търсенията?",
"search-term": "Фраза",
"search-count": "Брой",
"view-all": "Преглед на всички"
"clear-search-history-confirm": "Наистина ли искате да изчистите историята на търсенията?"
}

View File

@@ -3,7 +3,7 @@
"ip": "IP <strong>%1</strong>",
"nodes-responded": "%1 възела отговориха в рамките на %2мсек!",
"host": "сървър",
"primary": "основен / задачи",
"primary": "основен / изпълнение на задачите",
"pid": "ид. на процеса",
"nodejs": "nodejs",
"online": "на линия",
@@ -19,7 +19,6 @@
"registered": "Регистрирани",
"sockets": "Сокети",
"connection-count": "Брой връзки",
"guests": "Гости",
"info": "Информация"

View File

@@ -12,8 +12,6 @@
"container.card": "Карта",
"container.card-header": "Заглавна част на карта",
"container.card-body": "Основна част на карта",
"container.title": "Заглавие",
"container.body": "Съдържание",
"container.alert": "Предупреждение",
"alert.confirm-delete": "Наистина ли искате да изтриете джаджата?",

View File

@@ -7,8 +7,6 @@
"privileges": "Правомощия",
"back-to-categories": "Назад към категориите",
"name": "Име на категорията",
"handle": "Идентификатор на категорията",
"handle.help": "Идентификаторът на категорията се ползва за представяне на тази категория в други мрежи, подобно на потребителското име. Този идентификатор не трябва да съвпада със съществуващо потребителско име или потребителска група.",
"description": "Описание на категорията",
"bg-color": "Цвят на фона",
"text-color": "Цвят на текста",
@@ -39,7 +37,6 @@
"disable": "Изключване",
"edit": "Редактиране",
"analytics": "Анализи",
"federation": "Федериране",
"view-category": "Преглед на категорията",
"set-order": "Запазване на реда",
@@ -79,22 +76,6 @@
"analytics.topics-daily": "<strong>Фигура 3</strong> &ndash; Брой теми в тази категория на ден</small>",
"analytics.posts-daily": "<strong>Фигура 4</strong> &ndash; Брой публикации в тази категория на ден</small>",
"federation.title": "Настройки за федерирането на категорията „%1“",
"federation.disabled": "Федерирането е изключено за целия уеб сайт, така че настройките за федерирането на категорията са недостъпни.",
"federation.disabled-cta": "Настройки за федерирането &rarr;",
"federation.syncing-header": "Синхронизиране",
"federation.syncing-intro": "Една категория може да следва „група от източници“ чрез протокола ActivityPub. Ако бъде получено съдържание от който и да е източник от посочените по-долу, то ще бъде автоматично добавено в тази категория.",
"federation.syncing-caveat": "Забележка: настройките за синхронизиране тук установяват еднопосочна синхронизация. NodeBB ще се опита да се абонира/следва източника, но обратното не бива да се подразбира.",
"federation.syncing-none": "Тази категория в момента не следва никого.",
"federation.syncing-add": "Синхронизиране с…",
"federation.syncing-actorUri": "Източник",
"federation.syncing-follow": "Следване",
"federation.syncing-unfollow": "Спиране на следването",
"federation.followers": "Отдалечени потребители, които следват тази категория",
"federation.followers-handle": "Идентификатор",
"federation.followers-id": "Ид.",
"federation.followers-none": "Няма последователи.",
"alert.created": "Създадена",
"alert.create-success": "Категорията е създадена успешно!",
"alert.none-active": "Нямате активни категории.",

View File

@@ -1,28 +0,0 @@
{
"title": "Управление на персонализираните потребителски полета",
"create-field": "Създаване на поле",
"edit-field": "Редактиране на полето",
"manage-custom-fields": "Управление на персонализираните полета",
"type-of-input": "Вид на входните данни",
"key": "Ключ",
"name": "Име",
"icon": "Иконка",
"type": "Тип",
"min-rep": "Минимална репутация",
"input-type-text": "Въвеждане (текст)",
"input-type-link": "Въвеждане (връзка)",
"input-type-number": "Въвеждане (число)",
"input-type-date": "Въвеждане (дата)",
"input-type-select": "Избиране",
"input-type-select-multi": "Избиране на множество",
"select-options": "Опции",
"select-options-help": "Добавете по една опция на ред за избрания елемент",
"minimum-reputation": "Минимална репутация",
"minimum-reputation-help": "Ако потребителят има по-малко репутация от посочената, той няма да може да използва това поле",
"delete-field-confirm-x": "Наистина ли искате да изтриете персонализираното поле „%1“?",
"custom-fields-saved": "Персонализираните полета са запазени",
"visibility": "Видимост",
"visibility-all": "Всички могат да виждат полето",
"visibility-loggedin": "Само вписаните потребители могат да виждат полето",
"visibility-privileged": "Само потребителите с по-високи правомощия (като администратори и модератори) могат да виждат полето"
}

View File

@@ -22,7 +22,6 @@
"delete-content": "Изтриване на <strong>съдържанието</strong> на потребителя/ите",
"purge": "Изтриване на <strong>потребителя/ите</strong> и <strong>съдържанието</strong>",
"download-csv": "Сваляне във формат „CSV“",
"custom-user-fields": "Персонализирани потребителски полета",
"manage-groups": "Управление на групите",
"set-reputation": "Задаване на репутация",
"add-group": "Добавяне на група",
@@ -122,28 +121,6 @@
"alerts.email-sent-to": "Беше изпратено е-писмо за потвърждение до %1",
"alerts.x-users-found": "Намерени потребители: %1 (%2 секунди)",
"alerts.select-a-single-user-to-change-email": "Изберете един потребител, чиято е-поща да промените",
"export": "Изнасяне",
"export-users-fields-title": "Изберете полета за CSV",
"export-field-email": "Е-поща",
"export-field-username": "Потребителско име",
"export-field-uid": "Потребителски идентификатор",
"export-field-ip": "IP адрес",
"export-field-joindate": "Дата на присъединяване",
"export-field-lastonline": "Последно на линия",
"export-field-lastposttime": "Време на последния отговор",
"export-field-reputation": "Репутация",
"export-field-postcount": "Брой публикации",
"export-field-topiccount": "Брой теми",
"export-field-profileviews": "Преглеждания на профила",
"export-field-followercount": "Брой последователи",
"export-field-followingcount": "Брой последвани",
"export-field-fullname": "Пълно име",
"export-field-website": "Уеб сайт",
"export-field-location": "Местоположение",
"export-field-birthday": "Рождена дата",
"export-field-signature": "Подпис",
"export-field-aboutme": "За потребителя",
"export-users-started": "Изнасяне на потребителите във формат „csv“… Това може да отнеме известно време. Ще получите известие, когато е готово.",
"export-users-completed": "Потребителите са изнесени във формат „csv“, щракнете за сваляне.",
"email": "Е-поща",

View File

@@ -38,7 +38,6 @@
"settings/tags": "Етикети",
"settings/notifications": "Известия",
"settings/api": "Достъп чрез ППИ",
"settings/activitypub": "Федериране (ActivityPub)",
"settings/sounds": "Звуци",
"settings/social": "Обществени",
"settings/cookies": "Бисквитки",

View File

@@ -1,26 +0,0 @@
{
"intro-lead": "Какво представлява федерирането?",
"intro-body": "NodeBB може да осъществява връзка с други инсталации на NodeBB, които поддържат това. Това се постига чрез протокол наречен <a href=\"https://activitypub.rocks/\">ActivityPub</a>. Ако е включено, NodeBB ще може да осъществява връзка и с други приложения и уеб сайтове, които ползват ActivityPub (например Мастодон, Peertube и т.н.)",
"general": "Общи",
"pruning": "Премахване на съдържанието",
"content-pruning": "Брой дни за съхранение на отдалечено съдържание",
"content-pruning-help": "Имайте предвид, че отдалеченото съдържание, за което е имало някакви действия (отговори или положителни/отрицателни гласове) ще бъде запазено. (0 = изключено)",
"user-pruning": "Брой дни за кеширане на отдалечените потребителски акаунти",
"user-pruning-help": "Отдалечените потребителски акаунти ще бъдат премахнати, само ако не са публикували нищо. Иначе ще бъдат извличани повторно. (0 = изключено)",
"enabled": "Включване на федерирането",
"enabled-help": "Ако е включено, този NodeBB ще може да осъществява връзка с всички клиенти ползващи ActivityPub в цялата федивселена.",
"allowLoopback": "Разрешаване на обработката на локална обратна връзка",
"allowLoopback-help": "Полезно само за дебъгване. Най-добре е това да бъде изключено",
"probe": "Отваряне в приложението",
"probe-enabled": "Дали да се опитва отваряне на нещата поддържащи ActivityPub в NodeBB",
"probe-enabled-help": "Ако е включено, NodeBB ще проверява всяка външна връзка дали поддържа ActivityPub и ако е така ще я зарежда направо в NodeBB.",
"probe-timeout": "Време за изчакване на проверката (милисекунди)",
"probe-timeout-help": "(По подразбиране: 2000) Ако проверката не получи отговор в рамките на зададеното време, потребителят ще бъде изпратен директно на адреса на връзката. Задайте по-голямо число, ако уеб сайтовете отговарят по-бавно и искате да им дадете повече време.",
"server-filtering": "Филтриране",
"count": "Този NodeBB в момента знае за наличието на <strong>%1</strong> сървър(а)",
"server.filter-help": "Посочете сървърите, с които не искате Вашият NodeBB да осъществява връзка. Или можете вместо това да посочите конкретни сървъри, с които <em>разрешавате</em> връзката. И двете възможности са налични, но може да изберете само една от тях.",
"server.filter-help-hostname": "Въведете само имената на сървърите по-долу (например <code>example.org</code>), като всеки сървър трябва да е на отделен ред.",
"server.filter-allow-list": "Това да се ползва като списък с разрешените сървъри"
}

View File

@@ -15,7 +15,7 @@
"title-layout": "Разположение на заглавието",
"title-layout-help": "Определете как ще бъде структурирано заглавието на браузъра, например: &#123;pageTitle&#125; | &#123;browserTitle&#125;",
"description.placeholder": "Кратко описание на общността Ви",
"description": "Изберете коя страница да бъде показана, когато потребителите отидат на главния адрес на форума.",
"description": "Описание на уеб сайта",
"keywords": "Ключови думи на уеб сайта",
"keywords-placeholder": "Ключови думи, описващи общността Ви. Трябва да бъдат разделени със запетаи.",
"logo-and-icons": "Лого и иконки на уеб сайта",
@@ -48,15 +48,5 @@
"background-color-help": "Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение",
"undo-timeout": "Време за отмяна",
"undo-timeout-help": "Някои действия, като например преместването на теми, могат да бъдат отменени от модератора в рамките на определено време. Задайте 0, за да забраните изцяло отменянето.",
"topic-tools": "Инструменти за темите",
"home-page": "Начална страница",
"home-page-route": "Път на началната страница",
"custom-route": "Персонализиран път",
"allow-user-home-pages": "Разрешаване на потребителските начални страници",
"home-page-title": "Заглавие на началната страница (по подразбиране: „Начало“)",
"default-language": "Език по подразбиране",
"auto-detect": "Автоматично разпознаване на езика за гостите",
"default-language-help": "Езикът по подразбиране определя езиковите настройки за всички потребители, които посещават Вашия форум. <br />Отделните потребители могат да сменят езика си от страницата с настройки на профила си.",
"post-sharing": "Споделяне на публикации",
"info-plugins-additional": "Добавките могат да добавят допълнителни мрежи за споделяне на публикации."
}
"topic-tools": "Инструменти за темите"
}

View File

@@ -0,0 +1,8 @@
{
"settings": "Настройки",
"guest-settings": "Настройки за гостите",
"handles.enabled": "Позволяване на имената за гостите",
"handles.enabled-help": "Тази възможност предоставя ново поле, което позволява на гостите да си изберат име, което да се използва за всяка публикация, която правят. Ако е изключено, всички те просто ще имат името „Гост“.",
"topic-views.enabled": "Гостите да допринасят за броя на преглеждания на темите",
"reply-notifications.enabled": "Гостите да могат да предизвикват изпращането на известия за отговорите си"
}

View File

@@ -0,0 +1,8 @@
{
"home-page": "Начална страница",
"description": "Изберете коя страница да бъде показана, когато потребителите отидат на главния адрес на форума.",
"home-page-route": "Път на началната страница",
"custom-route": "Персонализиран път",
"allow-user-home-pages": "Разрешаване на потребителските начални страници",
"home-page-title": "Заглавие на началната страница (по подразбиране: „Начало“)"
}

View File

@@ -0,0 +1,6 @@
{
"language-settings": "Езикови настройки",
"description": "Езикът по подразбиране определя езиковите настройки за всички потребители, които посещават Вашия форум. <br />Отделните потребители могат да сменят езика си от страницата с настройки на профила си.",
"default-language": "Език по подразбиране",
"auto-detect": "Автоматично разпознаване на езика за гостите"
}

View File

@@ -10,7 +10,7 @@
"id": "Идентификатор: <small>незадължително</small>",
"properties": "Свойства:",
"show-to-groups": "Показване на групите:",
"groups": "Групи:",
"open-new-window": "Отваряне в нов прозорец",
"dropdown": "Падащо меню",
"dropdown-placeholder": "Въведете елементите на падащото меню по-долу. Пример: <br/>&lt;li&gt;&lt;a class=&quot;dropdown-item&quot; href&#x3D;&quot;https://myforum.com&quot;&gt;Връзка 1&lt;/a&gt;&lt;/li&gt;",

View File

@@ -4,11 +4,8 @@
"sorting.post-default": "Подредба по подразбиране на публикациите",
"sorting.oldest-to-newest": "Първо най-старите",
"sorting.newest-to-oldest": "Първо най-новите",
"sorting.recently-replied": "Първо тези с най-скорошни отговори",
"sorting.recently-created": "Първо най-скоро създадените",
"sorting.most-votes": "Първо тези с най-много гласове",
"sorting.most-posts": "Първо тези с най-много публикации",
"sorting.most-views": "Първо тези с най-много преглеждания",
"sorting.topic-default": "Подредба по подразбиране на темите",
"length": "Дължина на публикациите",
"post-queue": "Опашка за публикации",

View File

@@ -2,14 +2,7 @@
"reputation": "Настройки за репутацията",
"disable": "Изключване на системата за репутация",
"disable-down-voting": "Забрана на отрицателното гласуване",
"upvote-visibility": "Видимост на положителните гласове",
"upvote-visibility-all": "Всички могат да виждат положителните гласове",
"upvote-visibility-loggedin": "Само вписаните потребители могат да виждат положителните гласове",
"upvote-visibility-privileged": "Само потребителите с по-високи правомощия (като администратори и модератори) могат да виждат положителните гласове",
"downvote-visibility": "Видимост на отрицателните гласове",
"downvote-visibility-all": "Всички могат да виждат отрицателните гласове",
"downvote-visibility-loggedin": "Само вписаните потребители могат да виждат отрицателните гласове",
"downvote-visibility-privileged": "Само потребителите с по-високи правомощия (като администратори и модератори) могат да виждат отрицателните гласове",
"votes-are-public": "Всички гласувания са публични",
"thresholds": "Ограничения на дейността",
"min-rep-upvote": "Минимална репутация, необходима за положително гласуване за публикации",
"upvotes-per-day": "Положителни гласувания за ден (задайте 0 за неограничен брой)",
@@ -20,6 +13,7 @@
"min-rep-chat": "Минимална репутация, необходима за изпращане на съобщения в разговори",
"min-rep-post-links": "Минимална репутация, необходима за публикуване на връзки",
"min-rep-flag": "Минимална репутация, необходима за докладване на публикации",
"min-rep-website": "Минимална репутация, необходима за добавяне на полето „Уебсайт“ към профила на потребителя",
"min-rep-aboutme": "Минимална репутация, необходима за добавяне на полето „За мен“ към профила на потребителя",
"min-rep-signature": "Минимална репутация, необходима за добавяне на полето „Подпис“ към профила на потребителя",
"min-rep-profile-picture": "Минимална репутация, необходима за добавяне на профилна снимка към профила на потребителя",
@@ -29,12 +23,7 @@
"flags.limit-per-target": "Максимален брой докладвания на едно и също нещо",
"flags.limit-per-target-placeholder": "По подразбиране: 0",
"flags.limit-per-target-help": "Когато публикация или потребител бъде докладван няколко пъти, това се добавя към един общ доклад. Задайте на тази настройка стойност по-голяма от нула, за да ограничите броя на докладванията, които могат да бъдат натрупани към една публикация или потребител.",
"flags.limit-post-flags-per-day": "Максимален брой публикации, които потребител може да докладва в рамките на един ден",
"flags.limit-post-flags-per-day-help": "Задайте 0 за изключване (по подразбиране: 10)",
"flags.limit-user-flags-per-day": "Максимален брой потребители, които даден потребител може да докладва в рамките на един ден",
"flags.limit-user-flags-per-day-help": "Задайте 0 за изключване (по подразбиране: 10)",
"flags.auto-flag-on-downvote-threshold": "Брой отрицателни гласове за автоматично докладване на публикации",
"flags.auto-flag-on-downvote-threshold-help": "Задайте 0 за изключване (по подразбиране: 0)",
"flags.auto-flag-on-downvote-threshold": "Брой отрицателни гласове, при които публикациите да бъдат докладвани автоматично (0 = изключено, по подразбиране: 0)",
"flags.auto-resolve-on-ban": "Автоматично премахване на всички доклади за потребител, когато той бъде блокиран",
"flags.action-on-resolve": "Когато докладване бъде разрешено, да се направи следното",
"flags.action-on-reject": "Когато докладване бъде отхвърлено, да се направи следното",

View File

@@ -0,0 +1,4 @@
{
"post-sharing": "Споделяне на публикации",
"info-plugins-additional": "Добавките могат да добавят допълнителни мрежи за споделяне на публикации."
}

View File

@@ -9,10 +9,9 @@
"private-extensions": "Файлови разширения, които да бъдат частни",
"private-uploads-extensions-help": "Въведете списък от файлови разширения, разделени със запетаи, които искате да бъдат частни (например <code>pdf,xls,doc</code>). Ако оставите това поле празно, всички файлове ще бъдат частни.",
"resize-image-width-threshold": "Преоразмеряване на изображенията, ако са по-широки от определената ширина",
"resize-image-width-threshold-help": "(в пиксели; по подразбиране: 2000 пиксела. 0 = изключено)",
"resize-image-width-threshold-help": "(в пиксели; по подразбиране: 1520 пиксела. 0 = изключено)",
"resize-image-width": "Намаляване на размера на изображенията до определена ширина",
"resize-image-width-help": "(в пиксели; по подразбиране: 760 пиксела. 0 = изключено)",
"resize-image-keep-original": "Запазване на оригиналното изображение след преоразмеряване",
"resize-image-quality": "Качество при преоразмеряване на изображенията",
"resize-image-quality-help": "Използване на по-ниско качество за намаляване на размера на файловете за преоразмерените изображения.",
"max-file-size": "Максимален размер на файловете (в КиБ)",

View File

@@ -88,10 +88,5 @@
"restrictions.seconds-before-new": "Брой секунди преди новите потребители да могат да публикуват за пръв път",
"restrictions.seconds-edit-after-new": "Брой секунди, през които публикациите могат да бъдат редактирани от нови потребители. (0 = изключено)",
"restrictions.milliseconds-between-messages": "Време между съобщенията в разговорите за нови потребители (мсек)",
"restrictions.groups-exempt-from-new-user-restrictions": "Избиране на групи, за които да не важат ограниченията за нови потребители",
"guest-settings": "Настройки за гостите",
"handles.enabled": "Позволяване на имената за гостите",
"handles.enabled-help": "Тази възможност предоставя ново поле, което позволява на гостите да си изберат име, което да се използва за всяка публикация, която правят. Ако е изключено, всички те просто ще имат името „Гост“.",
"topic-views.enabled": "Гостите да допринасят за броя на преглеждания на темите",
"reply-notifications.enabled": "Гостите да могат да предизвикват изпращането на известия за отговорите си"
}
"restrictions.groups-exempt-from-new-user-restrictions": "Избиране на групи, за които да не важат ограниченията за нови потребители"
}

View File

@@ -1,9 +0,0 @@
{
"post-sort-option": "Настройка за подредбата на публикациите, %1",
"topic-sort-option": "Настройка за подредбата на темите, %1",
"user-avatar-for": "Изображение на потребителя за %1",
"profile-page-for": "Профилна страница за потребителя %1",
"user-watched-tags": "Наблюдавани от потребителя етикети",
"delete-upload-button": "Бутон за изтриване на каченото",
"group-page-link-for": "Връзка към груповата страница за %1"
}

View File

@@ -32,7 +32,7 @@
"folder-exists": "Вече има папка с това име",
"invalid-pagination-value": "Грешен номер на странициране, трябва да бъде между %1 и %2",
"username-taken": "Потребителското име е заето",
"email-taken": "Адресът на е-пощата вече е зает.",
"email-taken": "Е-пощата е заета",
"email-nochange": "Въведената е-поща е същата като съществуващата.",
"email-invited": "На тази е-поща вече е била изпратена покана",
"email-not-confirmed": "Публикуването в някои категории и теми ще бъде възможно едва след като е-пощата Ви бъде потвърдена. Щръкнете тук, за да Ви изпратим е-писмо за потвърждение.",
@@ -153,7 +153,6 @@
"about-me-too-long": "Съжаляваме, но информацията за Вас трябва да съдържа не повече от %1 символ(а).",
"cant-chat-with-yourself": "Не можете да пишете съобщение на себе си!",
"chat-restricted": "Този потребител е ограничил съобщенията до себе си. Той трябва първо да Ви последва, преди да можете да си пишете с него.",
"chat-user-blocked": "Бяхте блокиран(а) от този потребител.",
"chat-disabled": "Системата за разговори е изключена",
"too-many-messages": "Изпратили сте твърде много съобщения. Моля, изчакайте малко.",
"invalid-chat-message": "Неправилно съобщение",
@@ -181,20 +180,10 @@
"not-enough-reputation-min-rep-signature": "Репутацията Ви трябва да бъде поне %1, за да добавите подпис",
"not-enough-reputation-min-rep-profile-picture": "Репутацията Ви трябва да бъде поне %1, за да добавите снимка на профила си",
"not-enough-reputation-min-rep-cover-picture": "Репутацията Ви трябва да бъде поне %1, за да добавите снимка на корицата",
"not-enough-reputation-custom-field": "Репутацията Ви трябва да бъде поне %1 за %2",
"custom-user-field-value-too-long": "Стойността в персонализираното поле е твърде дълга, %1",
"custom-user-field-select-value-invalid": "Избраната опция в персонализираното поле е твърде неправилна, %1",
"custom-user-field-invalid-text": "Текстът в персонализираното поле е неправилен, %1",
"custom-user-field-invalid-link": "Връзката в персонализираното поле е неправилна, %1",
"custom-user-field-invalid-number": "Числото в персонализираното поле е неправилно, %1",
"custom-user-field-invalid-date": "Датата в персонализираното поле е неправилна, %1",
"invalid-custom-user-field": "Неправилно персонализирано поле. „%1“ вече се ползва от NodeBB",
"post-already-flagged": "Вече сте докладвали тази публикация",
"user-already-flagged": "Вече сте докладвали този потребител",
"post-flagged-too-many-times": "Тази публикация вече е докладвана от други хора",
"user-flagged-too-many-times": "Този потребител вече е докладван от други хора",
"too-many-post-flags-per-day": "Можете да докладвате най-много %1 публикации на ден",
"too-many-user-flags-per-day": "Можете да докладвате най-много %1 потребител(и) на ден",
"cant-flag-privileged": "Не можете да докладвате профилите или съдържанието от потребители с по-високи правомощия (модератори, глобални модератори, администратори)",
"cant-locate-flag-report": "Докладът не може да бъде намерен",
"self-vote": "Не можете да гласувате за собствената си публикация",
@@ -230,12 +219,10 @@
"already-unblocked": "Този потребител вече е отблокиран",
"no-connection": "Изглежда има проблем с връзката Ви с Интернет",
"socket-reconnect-failed": "В момента сървърът е недостъпен. Натиснете тук, за да опитате отново, или опитайте пак по-късно.",
"invalid-plugin-id": "Грешен идентификатор на добавка",
"plugin-not-whitelisted": "Добавката не може да бъде инсталирана само добавки, одобрени от пакетния мениджър на NodeBB могат да бъдат инсталирани чрез ACP",
"plugins-set-in-configuration": "Не можете да променяте състоянието на добавката, тъй като то се определя по време на работата ѝ (чрез config.json, променливи на средата или аргументи при изпълнение). Вместо това може да промените конфигурацията.",
"theme-not-set-in-configuration": "Когато определяте активните добавки в конфигурацията, промяната на темите изисква да се добави новата тема към активните добавки, преди актуализирането ѝ в ACP",
"topic-event-unrecognized": "Събитието „%1“ на темата е неизвестно",
"category.handle-taken": "Идентификаторът на категорията е зает. Моля, изберете друг.",
"cant-set-child-as-parent": "Дъщерна категория не може да се зададе като базова такава",
"cant-set-self-as-parent": "Категорията не може да се зададе като базова категория на себе си",
"api.master-token-no-uid": "Беше получен главен идентификатор без съответстващо поле `_uid` в тялото на заявката",
@@ -248,12 +235,5 @@
"api.500": "При обработката на заявката Ви възникна неочаквана грешка.",
"api.501": "Пътят, който се опитвате да извикате, все още не съществува. Моля, опитайте отново утре.",
"api.503": "Пътят, който се опитвате да извикате, в момента не е достъпен, поради настройките на сървъра.",
"api.reauth-required": "Ресурсът, който се опитвате да достъпите, изисква (повторно) удостоверяване.",
"activitypub.not-enabled": "Federation is not enabled on this server",
"activitypub.invalid-id": "Входният идентификатор не може да бъде разпознат може да е неправилен.",
"activitypub.get-failed": "Посоченият материал не може да бъде получен.",
"activitypub.pubKey-not-found": "Публичният ключ не може да бъде разпознат, така че потвърждението на данните не може да бъде извършено.",
"activitypub.origin-mismatch": "Произходът на получения обект не съвпада с произхода на подателя",
"activitypub.actor-mismatch": "Полученото действие се изпълнява от източник, който е различен от очаквания.",
"activitypub.not-implemented": "Заявката беше отказана, тъй като тя или част от нея не се поддържа от сървъра, към който е насочена"
"api.reauth-required": "Ресурсът, който се опитвате да достъпите, изисква (повторно) удостоверяване."
}

View File

@@ -84,18 +84,12 @@
"modal-reason-offensive": "Обидно",
"modal-reason-other": "Друго (опишете по-долу)",
"modal-reason-custom": "Причина за докладването на това съдържание…",
"modal-notify-remote": "Препращане на този доклад към %1",
"modal-submit": "Изпращане на доклада",
"modal-submit-success": "Съдържанието беше докладвано на модераторите.",
"modal-confirm-rescind": "Анулиране на доклада?",
"bulk-actions": "Групови действия",
"bulk-resolve": "Разрешаване на доклад(и)",
"confirm-purge": "Наистина ли искате да изтриете завинаги тези доклади?",
"purge-cancelled": "Изтриването на доклад е отменено",
"bulk-purge": "Изтриване на доклад(и)",
"bulk-success": "%1 доклада са обновени",
"flagged-timeago": "Докладвано <span class=\"timeago\" title=\"%1\"></span>",
"flagged-timeago-readable": "Докладвано <span class=\"timeago\" title=\"%1\"></span> (%2)",
"auto-flagged": "[Авт. докладвано] Получени %1 отрицателни гласа."
}

View File

@@ -24,15 +24,8 @@
"cancel": "Отказ",
"close": "Затваряне",
"pagination": "Странициране",
"pagination.previouspage": "Предишна страница",
"pagination.nextpage": "Следваща страница",
"pagination.firstpage": "Първа страница",
"pagination.lastpage": "Последна страница",
"pagination.out-of": "%1 от %2",
"pagination.enter-index": "Към публикация номер",
"pagination.go-to-page": "Към страница",
"pagination.page-x": "Страница %1",
"header.brand-logo": "Лого на марката",
"header.admin": "Администратор",
"header.categories": "Категории",
"header.recent": "Скорошни",
@@ -50,11 +43,12 @@
"header.navigation": "Навигация",
"header.manage": "Управление",
"header.drafts": "Чернови",
"header.world": "Свят",
"notifications.loading": "Зареждане на известията",
"chats.loading": "Зареждане на разговорите",
"drafts.loading": "Зареждане на черновите",
"motd.welcome": "Добре дошли в NodeBB, системата за дискусии на бъдещето.",
"previouspage": "Предишна страница",
"nextpage": "Следваща страница",
"alert.success": "Готово",
"alert.error": "Грешка",
"alert.warning": "Предупреждение",
@@ -111,7 +105,6 @@
"dnd": "Отпочиващ",
"invisible": "Невидим",
"offline": "Извън линия",
"remote-user": "Този потребител е извън този форум",
"email": "Е-поща",
"language": "Език",
"guest": "Гост",
@@ -142,12 +135,9 @@
"edited": "Редактирано",
"disabled": "Изключено",
"select": "Избиране",
"selected": "Избрано",
"copied": "Копирано",
"user-search-prompt": "Започнете да пишете, за да потърсите потребител…",
"hidden": "Скрито",
"sort": "Подреждане",
"actions": "Действия",
"rss-feed": "RSS поток",
"skip-to-content": "Преминаване към съдържанието"
"actions": "Действия"
}

View File

@@ -1,9 +1,8 @@
{
"chat.room-id": "Стая %1",
"chat.chatting-with": "Разговор с",
"chat.placeholder": "Въведете съобщение тук или пуснете снимки",
"chat.placeholder.mobile": "Въведете съобщение",
"chat.placeholder.message-room": "Съобщение #%1",
"chat.placeholder": "Въведете съобщение тук или пуснете снимки и натиснете Ентер за изпращане",
"chat.placeholder.mobile": "Въведете съобщение тук",
"chat.scroll-up-alert": "Към последните съобщения",
"chat.usernames-and-x-others": "%1 и %2 други",
"chat.chat-with-usernames": "Разговор с %1",
@@ -115,8 +114,6 @@
"composer.discard-all-drafts": "Изтриване на всички чернови",
"composer.no-drafts": "Нямате никакви чернови",
"composer.discard-draft-confirm": "Искате ли да изтриете тази чернова?",
"composer.remote-pid-editing": "Редактиране на отдалечена публикация",
"composer.remote-pid-content-immutable": "Съдържанието на отдалечени публикации не може да бъде редактирано. Може да промените само заглавието на темата и етикетите.",
"bootbox.ok": "Добре",
"bootbox.cancel": "Отказ",
"bootbox.confirm": "Потвърждаване",

View File

@@ -52,10 +52,10 @@
"user-posted-to-multiple": "<strong>%1</strong>, <strong>%2</strong> и %3 други публикуваха отговори на: <strong>%4</strong>",
"user-posted-topic": "<strong>%1</strong> публикува нова тема: <strong>%2</strong>",
"user-edited-post": "<strong>%1</strong> редактира публикация в <strong>%2</strong>",
"user-posted-topic-with-tag": "<strong>%1</strong> публикува <strong>%2</strong> (с етикет %3)",
"user-posted-topic-with-tag-dual": "<strong>%1</strong> публикува <strong>%2</strong> (с етикети %3 и %4)",
"user-posted-topic-with-tag-triple": "<strong>%1</strong> публикува <strong>%2</strong> (с етикети %3, %4 и %5)",
"user-posted-topic-with-tag-multiple": "<strong>%1</strong> публикува <strong>%2</strong> (с етикет %3)",
"user-posted-topic-with-tag": "<strong>%1</strong> публикува нова тема с етикет <strong>%2</strong>",
"user-posted-topic-with-tag-dual": "<strong>%1</strong> публикува нова тема с етикети <strong>%2</strong> и <strong>%3</strong>",
"user-posted-topic-with-tag-triple": "<strong>%1</strong> публикува нова тема с етикети <strong>%2</strong>, <strong>%3</strong> и <strong>%4</strong>",
"user-posted-topic-with-tag-multiple": "<strong>%1</strong> публикува нова тема с етикети <strong>%2</strong>",
"user-posted-topic-in-category": "<strong>%1</strong> публикува нова тема в <strong>%2</strong>",
"user-started-following-you": "<strong>%1</strong> започна да Ви следва.",
"user-started-following-you-dual": "<strong>%1</strong> и <strong>%2</strong> започнаха да Ви следват.",
@@ -75,7 +75,6 @@
"email-confirmed": "Е-пощата беше потвърдена",
"email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.",
"email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
"email-confirm-error-message-already-validated": "Адресът на е-пощата Ви вече е проверен.",
"email-confirm-sent": "Изпратено е е-писмо за потвърждение.",
"none": "Нищо",
"notification-only": "Само известие",
@@ -98,9 +97,5 @@
"notificationType-post-queue": "Когато бъде добавена нова публикация в опашката",
"notificationType-new-post-flag": "Когато публикация бъде докладвана",
"notificationType-new-user-flag": "Когато потребител бъде докладван",
"notificationType-new-reward": "Когато получите нова награда",
"activitypub.announce": "<strong>%1</strong> сподели Вашата публикация в <strong>%2</strong> със своите последователи.",
"activitypub.announce-dual": "<strong>%1</strong> и <strong>%2</strong> споделиха Вашата публикация в <strong>%3</strong> със своите последователи.",
"activitypub.announce-triple": "<strong>%1</strong>, <strong>%2</strong> и <strong>%3</strong> споделиха Вашата публикация в <strong>%4</strong> със своите последователи.",
"activitypub.announce-multiple": "<strong>%1</strong>, <strong>%2</strong> и %3 други споделиха Вашата публикация в <strong>%4</strong> със своите последователи."
"notificationType-new-reward": "Когато получите нова награда"
}

View File

@@ -36,7 +36,6 @@
"chat": "Разговаря с %1",
"flags": "Доклади",
"flag-details": "Подробности за доклад %1",
"world": "Свят",
"account/edit": "Редактиране на „%1“",
"account/edit/password": "Редактиране на паролата на „%1“",
"account/edit/username": "Редактиране на потребителското име на „%1“",
@@ -55,7 +54,6 @@
"account/settings-of": "Променят се настройките на %1",
"account/watched": "Теми, наблюдавани от %1",
"account/ignored": "Теми, пренебрегвани от %1",
"account/read": "Теми, прочетени от %1",
"account/upvoted": "Публикации, получили положителен глас от %1",
"account/downvoted": "Публикации, получили отрицателен глас от %1",
"account/best": "Най-добрите публикации от %1",
@@ -63,7 +61,6 @@
"account/blocks": "Блокирани потребители за %1",
"account/uploads": "Качвания от %1",
"account/sessions": "Сесии на вписване",
"account/shares": "Теми, споделени от %1",
"confirm": "Е-пощата е потвърдена",
"maintenance.text": "%1 в момента е в профилактика.<br/>Моля, върнете се по-късно.",
"maintenance.messageIntro": "В допълнение, администраторът е оставил това съобщение:",

View File

@@ -38,6 +38,5 @@
"remove-selected": "Премахване на избраните",
"remove-selected-confirm": "Наистина ли искате да премахнете избраните %1 публикации?",
"bulk-accept-success": "Одобрени публикации: %1",
"bulk-reject-success": "Отхвърлени публикации: %1",
"links-in-this-post": "Връзки в тази публикация"
"bulk-reject-success": "Отхвърлени публикации: %1"
}

View File

@@ -7,7 +7,5 @@
"alltime": "Цялото време",
"no-recent-topics": "Няма скорошни теми.",
"no-popular-topics": "Няма популярни теми.",
"load-new-posts": "Зареждане на новите публикации",
"uncategorized.title": "Всички познати теми",
"uncategorized.intro": "Тази страница показва хронологичен списък от всички теми, които този форум е получил.<br />Гледните точки и мненията в темите по-долу не са филтрирани по никакъв начин и може да не съвпадат с гледните точки и мненията на този уеб сайт."
"load-new-posts": "Зареждане на новите публикации"
}

View File

@@ -7,7 +7,6 @@
"in-titles": "В заглавията",
"in-titles-posts": "В заглавията и публикациите",
"in-posts": "В публикациите",
"in-bookmarks": "В отметките",
"in-categories": "В категориите",
"in-users": "В потребителите",
"in-tags": "В етикетите",

View File

@@ -3,7 +3,7 @@
"no-tag-topics": "Няма теми с този етикет.",
"no-tags-found": "Няма намерени етикети",
"tags": "Етикети",
"enter-tags-here": "Въведете етикети, с по %1 %2 знака.",
"enter-tags-here": "Тук въведете етикети, всеки между %1 и %2 знака.",
"enter-tags-here-short": "Въведете етикети...",
"no-tags": "Все още няма етикети.",
"select-tags": "Изберете етикети",

View File

@@ -3,18 +3,13 @@
"skins": "Облици",
"collapse": "Свиване",
"expand": "Разгъване",
"sidebar-toggle": "Превключване на страничната лента",
"login-register-to-search": "Впишете се или се регистрирайте, за да можете да търсите.",
"settings.title": "Настройки на темата",
"settings.enableQuickReply": "Включване на бързите отговори",
"settings.enableBreadcrumbs": "Показване на пътечката в страниците с категории и теми",
"settings.enableBreadcrumbs.why": "Пътечката се вижда на повечето страници за по-лесно навигиране. Основният дизайн на страниците с категории и теми предоставя други начини за връщане към по-общите страници, но ако желаете, може да изключите показването на пътечката, за да няма претрупване.",
"settings.centerHeaderElements": "Центриране на заглавните елементи",
"settings.mobileTopicTeasers": "Показване на резюмета на темите на мобилни устройства",
"settings.stickyToolbar": "Статична лента с инструменти",
"settings.stickyToolbar.help": "Лентата с инструменти в страниците с теми и категории ще стои винаги в горния край на страницата",
"settings.topicSidebarTools": "Topic sidebar tools",
"settings.topicSidebarTools.help": "This option will move the topic tools to the sidebar on desktop",
"settings.autohideBottombar": "Автоматично скриване на долната лента",
"settings.autohideBottombar.help": "В изгледа за мобилни устройства долната лента ще се скрива, когато страницата се превърта надолу",
"settings.openSidebars": "Отваряне на страничните ленти",

View File

@@ -15,7 +15,6 @@
"replies-to-this-post": "%1 отговора",
"one-reply-to-this-post": "1 отговор",
"last-reply-time": "Последен отговор",
"reply-options": "Настройки за отговора",
"reply-as-topic": "Отговор в нова тема",
"guest-login-reply": "Впишете се, за да отговорите",
"login-to-view": "🔒 Впишете се, за да видите това",
@@ -27,7 +26,6 @@
"restore": "Възстановяване",
"move": "Преместване",
"change-owner": "Промяна на собственика",
"manage-editors": "Управление на редакторите",
"fork": "Разделяне",
"link": "Връзка",
"share": "Споделяне",
@@ -36,7 +34,6 @@
"pinned": "Закачена",
"pinned-with-expiry": "Закачена до %1",
"scheduled": "Насрочена",
"deleted": "Изтрита",
"moved": "Преместена",
"moved-from": "Преместена от %1",
"copy-code": "Копиране на кода",
@@ -61,8 +58,6 @@
"user-restored-topic-on": "%1 възстанови тази тема на %2",
"user-moved-topic-from-ago": "%1 премести тази тема от %2 %3",
"user-moved-topic-from-on": "%1 премести тази тема от %2 на %3",
"user-shared-topic-ago": "%1 сподели тази тема %2",
"user-shared-topic-on": "%1 сподели тази тема в %2",
"user-queued-post-ago": "%1 добави тази публикация в <a href=\"%2\">опашката за одобрение</a> %3",
"user-queued-post-on": "%1 добави тази публикация в <a href=\"%2\">опашката</a> за одобрение на %3",
"user-referenced-topic-ago": "%1 <a href=\"%2\">направи препратка</a> към тази тема %3",
@@ -106,7 +101,6 @@
"thread-tools.move-posts": "Преместване на публикациите",
"thread-tools.move-all": "Преместване на всички",
"thread-tools.change-owner": "Промяна на собственика",
"thread-tools.manage-editors": "Управление на редакторите",
"thread-tools.select-category": "Избиране на категория",
"thread-tools.fork": "Разделяне на темата",
"thread-tools.tag": "Поставяне на етикет на темата",
@@ -137,7 +131,6 @@
"bookmarks": "Отметки",
"bookmarks.has-no-bookmarks": "Все още не сте си запазвали отметки към никакви публикации.",
"copy-permalink": "Копиране на постоянна връзка",
"go-to-original": "Преглед на оригиналната публикация",
"loading-more-posts": "Зареждане на още публикации",
"move-topic": "Преместване на темата",
"move-topics": "Преместване на темите",
@@ -162,7 +155,6 @@
"move-posts-instruction": "Щракнете върху публикациите, които искате да преместите, а след това въведете ид. на тема или отидете в целевата тема",
"move-topic-instruction": "Изберете целевата категория и натиснете „Преместване“",
"change-owner-instruction": "Натиснете публикациите, които искате да прехвърлите на друг потребител",
"manage-editors-instruction": "Определете потребителите, които могат да редактират тази публикация по-долу.",
"composer.title-placeholder": "Въведете заглавието на темата си тук...",
"composer.handle-placeholder": "Въведете името тук",
"composer.hide": "Скриване",
@@ -188,8 +180,6 @@
"sort-by": "Подреждане по",
"oldest-to-newest": "Първо най-старите",
"newest-to-oldest": "Първо най-новите",
"recently-replied": "Първо тези с най-скорошни отговори",
"recently-created": "Първо най-скоро създадените",
"most-votes": "Първо тези с най-много гласове",
"most-posts": "Първо тези с най-много публикации",
"most-views": "Първо тези с най-много преглеждания",
@@ -214,15 +204,7 @@
"last-post": "Последна публикация",
"go-to-my-next-post": "Към следващата ми публикация",
"no-more-next-post": "Нямате повече публикации в тази тема",
"open-composer": "Отваряне на редактора",
"post-quick-reply": "Бърз отговор",
"navigator.index": "Публикация %1 от %2",
"navigator.unread": "%1 непрочетени",
"upvote-post": "Положително гласуване за публикацията",
"downvote-post": "Отрицателно гласуване за публикацията",
"post-tools": "Инструменти за публикациите",
"unread-posts-link": "Връзка към непрочетените публикации",
"thumb-image": "Иконка на темата",
"announcers": "Споделяния",
"announcers-x": "Споделяния (%1)"
"navigator.unread": "%1 непрочетени"
}

View File

@@ -3,7 +3,6 @@
"no-unread-topics": "Няма непрочетени теми.",
"load-more": "Зареждане на още",
"mark-as-read": "Отбелязване като прочетени",
"mark-as-unread": "Отбелязване като непрочетени",
"selected": "Избраните",
"all": "Всички",
"all-categories": "Всички категории",

View File

@@ -1,9 +1,6 @@
{
"user-menu": "Потребителско меню",
"banned": "Блокиран",
"unbanned": "Деблокиран",
"muted": "Заглушен",
"unmuted": "Премахнато заглушаване",
"offline": "Извън линия",
"deleted": "Изтрит",
"username": "Потребителско име",
@@ -43,11 +40,9 @@
"change-all": "Промяна на всички",
"watched": "Наблюдавани",
"ignored": "Пренебрегвани",
"read": "Прочетени",
"default-category-watch-state": "Състояние по подразбиране за наблюдаването на категории",
"followers": "Последователи",
"following": "Следва",
"shares": "Споделя",
"blocks": "Блокира",
"blocked-users": "Блокирани потребители",
"block-toggle": "Превключване на блокирането",
@@ -60,10 +55,8 @@
"chat-with": "Продължаване на разговора с %1",
"new-chat-with": "Започване на нов разговор с %1",
"flag-profile": "Докладване на профила",
"profile-flagged": "Вече е докладван",
"follow": "Следване",
"unfollow": "Спиране на следването",
"cancel-follow": "Отмяна на заявката за следване",
"more": "Още",
"profile-update-success": "Профилът беше обновен успешно!",
"change-picture": "Промяна на снимката",
@@ -82,7 +75,6 @@
"change-password": "Промяна на паролата",
"change-password-error": "Грешна парола!",
"change-password-error-wrong-current": "Текущата Ви парола е грешна!",
"change-password-error-same-password": "Новата Ви парола съвпада с текущата. Моля, използвайте нова парола.",
"change-password-error-match": "Паролите са различни!",
"change-password-error-privileges": "Нямате права да промените тази парола.",
"change-password-success": "Паролата ви е обновена!",
@@ -118,12 +110,10 @@
"has-no-topics": "Този потребител не е създавал теми досега.",
"has-no-watched-topics": "Този потребител не е наблюдавал нито една тема досега.",
"has-no-ignored-topics": "Този потребител не е пренебрегнал нито една тема досега.",
"has-no-read-topics": "Този потребител не е прочел нито една тема досега.",
"has-no-upvoted-posts": "Този потребител не е гласувал положително досега.",
"has-no-downvoted-posts": "Този потребител не е гласувал отрицателно досега.",
"has-no-controversial-posts": "Този потребител няма публикации с отрицателни гласове засега.",
"has-no-blocks": "Не сте блокирали никого.",
"has-no-shares": "Този потребител не е споделил нито една тема.",
"email-hidden": "Е-пощата е скрита",
"hidden": "скрито",
"paginate-description": "Разделяне на темите и публикациите на страници, вместо да се превърта безкрайно",
@@ -151,10 +141,6 @@
"follow-topics-you-create": "Наблюдаване на темите, които създавате",
"grouptitle": "Заглавие на групата",
"group-order-help": "Изберете група и използвайте стрелките, за да пренаредите заглавията",
"show-group-title": "Показване на заглавието на групата",
"hide-group-title": "Скриване на заглавието на групата",
"order-group-up": "Преместване на групата нагоре",
"order-group-down": "Преместване на групата надолу",
"no-group-title": "Няма заглавие на група",
"select-skin": "Изберете облик",
"default": "По подразбиране (%1)",
@@ -171,16 +157,11 @@
"sso.dissociate-confirm-title": "Потвърждаване на прекъсването",
"sso.dissociate-confirm": "Наистина ли искате да прекъснете връзката на акаунта си от „%1“?",
"info.latest-flags": "Последни доклади",
"info.profile": "Профил",
"info.post": "Публикация",
"info.view-flag": "Преглед на доклада",
"info.reported-by": "Докладвано от:",
"info.no-flags": "Не са намерени докладвани публикации",
"info.ban-history": "Скорошна история на блокиранията",
"info.no-ban-history": "Този потребител никога не е бил блокиран",
"info.banned-until": "Блокиран до %1",
"info.banned-expiry": "Давност",
"info.ban-expired": "Блокирането е изтекло",
"info.banned-permanently": "Блокиран за постоянно",
"info.banned-reason-label": "Причина",
"info.banned-no-reason": "Няма посочена причина.",

View File

@@ -1,6 +1,5 @@
{
"all-users": "Всички потребители",
"followed-users": "Следвани потребители",
"latest-users": "Последни потребители",
"top-posters": "С най-много публикации",
"most-reputation": "С най-много репутация",

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