Compare commits
2 Commits
protocol-v
...
v1.7.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6be3e7cc8c | ||
|
|
87d621d944 |
@@ -1,22 +1,8 @@
|
|||||||
# Save as .codeclimate.yml (note leading .) in project root directory
|
# Save as .codeclimate.yml (note leading .) in project root directory
|
||||||
version: "2"
|
|
||||||
languages:
|
languages:
|
||||||
Ruby: false
|
Ruby: true
|
||||||
JavaScript: true
|
JavaScript: true
|
||||||
PHP: false
|
PHP: true
|
||||||
checks:
|
|
||||||
file-lines:
|
|
||||||
config:
|
|
||||||
threshold: 500
|
|
||||||
method-lines:
|
|
||||||
config:
|
|
||||||
threshold: 50
|
|
||||||
method-complexity:
|
|
||||||
config:
|
|
||||||
threshold: 10
|
|
||||||
similar-code:
|
|
||||||
config:
|
|
||||||
threshold: 65
|
|
||||||
exclude_paths:
|
exclude_paths:
|
||||||
- "public/vendor/*"
|
- "public/vendor/*"
|
||||||
- "test/*"
|
- "test/*"
|
||||||
@@ -18,4 +18,3 @@ logs/
|
|||||||
/build
|
/build
|
||||||
.eslintrc
|
.eslintrc
|
||||||
test/files
|
test/files
|
||||||
*.min.js
|
|
||||||
|
|||||||
10
.eslintrc
@@ -14,10 +14,9 @@
|
|||||||
"exports": "always-multiline",
|
"exports": "always-multiline",
|
||||||
"functions": "never"
|
"functions": "never"
|
||||||
}],
|
}],
|
||||||
"no-return-await": "off",
|
|
||||||
"no-constant-condition": "off",
|
|
||||||
"no-empty": ["error", { "allowEmptyCatch": true }],
|
"no-empty": ["error", { "allowEmptyCatch": true }],
|
||||||
"no-underscore-dangle": "off",
|
"no-underscore-dangle": "off",
|
||||||
|
"newline-per-chained-call": "off",
|
||||||
"no-console": "off",
|
"no-console": "off",
|
||||||
"no-mixed-operators": ["error", { "allowSamePrecedence": true }],
|
"no-mixed-operators": ["error", { "allowSamePrecedence": true }],
|
||||||
"strict": ["error", "global"],
|
"strict": ["error", "global"],
|
||||||
@@ -37,13 +36,6 @@
|
|||||||
"no-restricted-globals": "off",
|
"no-restricted-globals": "off",
|
||||||
"function-paren-newline": "off",
|
"function-paren-newline": "off",
|
||||||
"import/no-unresolved": "error",
|
"import/no-unresolved": "error",
|
||||||
"quotes": ["error", "single", {
|
|
||||||
"avoidEscape": true,
|
|
||||||
"allowTemplateLiterals": true
|
|
||||||
}],
|
|
||||||
"no-else-return": [ "error", { "allowElseIf": true } ],
|
|
||||||
"operator-linebreak": [ "error", "after" ],
|
|
||||||
"arrow-parens": ["error", "as-needed", { "requireForBlockBody": true }],
|
|
||||||
|
|
||||||
// ES6
|
// ES6
|
||||||
"prefer-rest-params": "off",
|
"prefer-rest-params": "off",
|
||||||
|
|||||||
7
.github/ISSUE_TEMPLATE.md
vendored
@@ -2,7 +2,6 @@
|
|||||||
== Github Issues are for bug reports and feature requests only ==
|
== Github Issues are for bug reports and feature requests only ==
|
||||||
== Please visit https://community.nodebb.org for other support ==
|
== Please visit https://community.nodebb.org for other support ==
|
||||||
== Found a security exploit? Please email us at security@nodebb.org instead for immediate attention ==
|
== Found a security exploit? Please email us at security@nodebb.org instead for immediate attention ==
|
||||||
== → DO NOT SUBMIT VULNERABILITIES TO THE PUBLIC BUG TRACKER ==
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- ++ Please include the following information when submitting a bug report ++ -->
|
<!-- ++ Please include the following information when submitting a bug report ++ -->
|
||||||
@@ -10,11 +9,9 @@
|
|||||||
- **NodeBB version:**
|
- **NodeBB version:**
|
||||||
- **NodeBB git hash:**
|
- **NodeBB git hash:**
|
||||||
<!-- (to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory) -->
|
<!-- (to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory) -->
|
||||||
- **Installed NodeBB Plugins:**
|
- **Database type:** mongo or redis
|
||||||
<!-- (to find installed plugins run ./nodebb plugins) -->
|
|
||||||
- **Database type:** mongo, redis, or postgres
|
|
||||||
- **Database version:**
|
- **Database version:**
|
||||||
<!-- `mongod --version`, `redis-server --version`, or `postgres --version` -->
|
<!-- `mongod --version` or `redis-server --version` -->
|
||||||
- **Exact steps to cause this issue:**
|
- **Exact steps to cause this issue:**
|
||||||
<!--
|
<!--
|
||||||
1. First I did this...
|
1. First I did this...
|
||||||
|
|||||||
4
.gitignore
vendored
@@ -29,7 +29,6 @@ pidfile
|
|||||||
|
|
||||||
/public/sounds
|
/public/sounds
|
||||||
/public/uploads
|
/public/uploads
|
||||||
/test/uploads
|
|
||||||
|
|
||||||
# compiled files
|
# compiled files
|
||||||
/public/stylesheet.css
|
/public/stylesheet.css
|
||||||
@@ -61,8 +60,9 @@ tx.exe
|
|||||||
coverage
|
coverage
|
||||||
.nyc_output
|
.nyc_output
|
||||||
|
|
||||||
|
build
|
||||||
*.log
|
*.log
|
||||||
test/files/normalise.jpg.png
|
test/files/normalise.jpg.png
|
||||||
test/files/normalise-resized.jpg
|
test/files/normalise-resized.jpg
|
||||||
package-lock.json
|
package-lock.json
|
||||||
/package.json
|
package.json
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
|
|
||||||
"maxerr" : 50, // {int} Maximum error before stopping
|
"maxerr" : 50, // {int} Maximum error before stopping
|
||||||
|
|
||||||
"esversion": 6,
|
|
||||||
|
|
||||||
// Enforcing
|
// Enforcing
|
||||||
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
|
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
|
||||||
"camelcase" : false, // true: Identifiers must be in camelCase
|
"camelcase" : false, // true: Identifiers must be in camelCase
|
||||||
|
|||||||
45
.travis.yml
@@ -1,46 +1,33 @@
|
|||||||
services:
|
services:
|
||||||
- mongodb
|
|
||||||
- redis-server
|
- redis-server
|
||||||
- postgresql
|
|
||||||
before_install:
|
before_install:
|
||||||
- cp install/package.json package.json
|
- "sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6"
|
||||||
- sudo apt-get update
|
- "echo 'deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse' | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list"
|
||||||
- sudo apt-get --yes remove postgresql\*
|
- "sudo apt-get update"
|
||||||
- sudo apt-get install -y postgresql-12 postgresql-client-12
|
- "sudo apt-get install -y mongodb-org"
|
||||||
- sudo cp /etc/postgresql/{9.6,12}/main/pg_hba.conf
|
- "sudo service mongod start"
|
||||||
- sudo service postgresql restart 12
|
|
||||||
before_script:
|
before_script:
|
||||||
- sleep 15 # wait for mongodb to be ready
|
- sleep 15 # wait for mongodb to be ready
|
||||||
- "mongo mydb_test --eval 'db.createUser({user:\"travis\", pwd: \"test\", roles: []});'"
|
- cp package.default.json package.json
|
||||||
- sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":\\\"travis_ci_test\\\"}\"; fi"
|
- npm install
|
||||||
- sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567/forum\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":1}\"; fi"
|
- sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":0}\"; fi"
|
||||||
- sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database nodebb;' -U postgres; psql -c 'create database travis_ci_test;' -U postgres; node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"postgres\\\",\\\"postgres:host\\\":\\\"127.0.0.1\\\",\\\"postgres:port\\\":5432,\\\"postgres:password\\\":\\\"\\\",\\\"postgres:database\\\":\\\"nodebb\\\",\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":5432,\\\"username\\\":\\\"postgres\\\",\\\"database\\\":\\\"travis_ci_test\\\"}\"; fi"
|
- sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":0}\"; fi"
|
||||||
after_success:
|
after_success:
|
||||||
- "npm run coveralls"
|
- "npm run coveralls"
|
||||||
language: node_js
|
language: node_js
|
||||||
sudo: false
|
|
||||||
dist: xenial
|
|
||||||
env:
|
env:
|
||||||
global:
|
- CXX=g++-4.8 DB=mongodb
|
||||||
- PGUSER=postgres
|
- CXX=g++-4.8 DB=redis
|
||||||
- PGPORT=5432
|
|
||||||
- CXX=g++-4.8
|
|
||||||
jobs:
|
|
||||||
- "DB=mongodb TEST_ENV=production"
|
|
||||||
- "DB=mongodb TEST_ENV=development"
|
|
||||||
- "DB=redis TEST_ENV=production"
|
|
||||||
- "DB=postgres TEST_ENV=production"
|
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
- ubuntu-toolchain-r-test
|
- ubuntu-toolchain-r-test
|
||||||
- mongodb-4.0-xenial
|
|
||||||
packages:
|
packages:
|
||||||
- g++-4.8
|
- g++-4.8
|
||||||
- mongodb-org-server
|
|
||||||
node_js:
|
node_js:
|
||||||
- "12"
|
- "8"
|
||||||
- "10"
|
- "7"
|
||||||
|
- "6"
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
|||||||
266
.tx/config
@@ -28,7 +28,6 @@ trans.it = public/language/it/category.json
|
|||||||
trans.ja = public/language/ja/category.json
|
trans.ja = public/language/ja/category.json
|
||||||
trans.ko = public/language/ko/category.json
|
trans.ko = public/language/ko/category.json
|
||||||
trans.lt = public/language/lt/category.json
|
trans.lt = public/language/lt/category.json
|
||||||
trans.lv = public/language/lv/category.json
|
|
||||||
trans.ms = public/language/ms/category.json
|
trans.ms = public/language/ms/category.json
|
||||||
trans.nb = public/language/nb/category.json
|
trans.nb = public/language/nb/category.json
|
||||||
trans.nl = public/language/nl/category.json
|
trans.nl = public/language/nl/category.json
|
||||||
@@ -78,7 +77,6 @@ trans.it = public/language/it/login.json
|
|||||||
trans.ja = public/language/ja/login.json
|
trans.ja = public/language/ja/login.json
|
||||||
trans.ko = public/language/ko/login.json
|
trans.ko = public/language/ko/login.json
|
||||||
trans.lt = public/language/lt/login.json
|
trans.lt = public/language/lt/login.json
|
||||||
trans.lv = public/language/lv/login.json
|
|
||||||
trans.ms = public/language/ms/login.json
|
trans.ms = public/language/ms/login.json
|
||||||
trans.nb = public/language/nb/login.json
|
trans.nb = public/language/nb/login.json
|
||||||
trans.nl = public/language/nl/login.json
|
trans.nl = public/language/nl/login.json
|
||||||
@@ -128,7 +126,6 @@ trans.it = public/language/it/recent.json
|
|||||||
trans.ja = public/language/ja/recent.json
|
trans.ja = public/language/ja/recent.json
|
||||||
trans.ko = public/language/ko/recent.json
|
trans.ko = public/language/ko/recent.json
|
||||||
trans.lt = public/language/lt/recent.json
|
trans.lt = public/language/lt/recent.json
|
||||||
trans.lv = public/language/lv/recent.json
|
|
||||||
trans.ms = public/language/ms/recent.json
|
trans.ms = public/language/ms/recent.json
|
||||||
trans.nb = public/language/nb/recent.json
|
trans.nb = public/language/nb/recent.json
|
||||||
trans.nl = public/language/nl/recent.json
|
trans.nl = public/language/nl/recent.json
|
||||||
@@ -178,7 +175,6 @@ trans.it = public/language/it/unread.json
|
|||||||
trans.ja = public/language/ja/unread.json
|
trans.ja = public/language/ja/unread.json
|
||||||
trans.ko = public/language/ko/unread.json
|
trans.ko = public/language/ko/unread.json
|
||||||
trans.lt = public/language/lt/unread.json
|
trans.lt = public/language/lt/unread.json
|
||||||
trans.lv = public/language/lv/unread.json
|
|
||||||
trans.ms = public/language/ms/unread.json
|
trans.ms = public/language/ms/unread.json
|
||||||
trans.nb = public/language/nb/unread.json
|
trans.nb = public/language/nb/unread.json
|
||||||
trans.nl = public/language/nl/unread.json
|
trans.nl = public/language/nl/unread.json
|
||||||
@@ -228,7 +224,6 @@ trans.it = public/language/it/modules.json
|
|||||||
trans.ja = public/language/ja/modules.json
|
trans.ja = public/language/ja/modules.json
|
||||||
trans.ko = public/language/ko/modules.json
|
trans.ko = public/language/ko/modules.json
|
||||||
trans.lt = public/language/lt/modules.json
|
trans.lt = public/language/lt/modules.json
|
||||||
trans.lv = public/language/lv/modules.json
|
|
||||||
trans.ms = public/language/ms/modules.json
|
trans.ms = public/language/ms/modules.json
|
||||||
trans.nb = public/language/nb/modules.json
|
trans.nb = public/language/nb/modules.json
|
||||||
trans.nl = public/language/nl/modules.json
|
trans.nl = public/language/nl/modules.json
|
||||||
@@ -278,7 +273,6 @@ trans.it = public/language/it/register.json
|
|||||||
trans.ja = public/language/ja/register.json
|
trans.ja = public/language/ja/register.json
|
||||||
trans.ko = public/language/ko/register.json
|
trans.ko = public/language/ko/register.json
|
||||||
trans.lt = public/language/lt/register.json
|
trans.lt = public/language/lt/register.json
|
||||||
trans.lv = public/language/lv/register.json
|
|
||||||
trans.ms = public/language/ms/register.json
|
trans.ms = public/language/ms/register.json
|
||||||
trans.nb = public/language/nb/register.json
|
trans.nb = public/language/nb/register.json
|
||||||
trans.nl = public/language/nl/register.json
|
trans.nl = public/language/nl/register.json
|
||||||
@@ -328,7 +322,6 @@ trans.it = public/language/it/user.json
|
|||||||
trans.ja = public/language/ja/user.json
|
trans.ja = public/language/ja/user.json
|
||||||
trans.ko = public/language/ko/user.json
|
trans.ko = public/language/ko/user.json
|
||||||
trans.lt = public/language/lt/user.json
|
trans.lt = public/language/lt/user.json
|
||||||
trans.lv = public/language/lv/user.json
|
|
||||||
trans.ms = public/language/ms/user.json
|
trans.ms = public/language/ms/user.json
|
||||||
trans.nb = public/language/nb/user.json
|
trans.nb = public/language/nb/user.json
|
||||||
trans.nl = public/language/nl/user.json
|
trans.nl = public/language/nl/user.json
|
||||||
@@ -378,7 +371,6 @@ trans.it = public/language/it/global.json
|
|||||||
trans.ja = public/language/ja/global.json
|
trans.ja = public/language/ja/global.json
|
||||||
trans.ko = public/language/ko/global.json
|
trans.ko = public/language/ko/global.json
|
||||||
trans.lt = public/language/lt/global.json
|
trans.lt = public/language/lt/global.json
|
||||||
trans.lv = public/language/lv/global.json
|
|
||||||
trans.ms = public/language/ms/global.json
|
trans.ms = public/language/ms/global.json
|
||||||
trans.nb = public/language/nb/global.json
|
trans.nb = public/language/nb/global.json
|
||||||
trans.nl = public/language/nl/global.json
|
trans.nl = public/language/nl/global.json
|
||||||
@@ -428,7 +420,6 @@ trans.it = public/language/it/notifications.json
|
|||||||
trans.ja = public/language/ja/notifications.json
|
trans.ja = public/language/ja/notifications.json
|
||||||
trans.ko = public/language/ko/notifications.json
|
trans.ko = public/language/ko/notifications.json
|
||||||
trans.lt = public/language/lt/notifications.json
|
trans.lt = public/language/lt/notifications.json
|
||||||
trans.lv = public/language/lv/notifications.json
|
|
||||||
trans.ms = public/language/ms/notifications.json
|
trans.ms = public/language/ms/notifications.json
|
||||||
trans.nb = public/language/nb/notifications.json
|
trans.nb = public/language/nb/notifications.json
|
||||||
trans.nl = public/language/nl/notifications.json
|
trans.nl = public/language/nl/notifications.json
|
||||||
@@ -478,7 +469,6 @@ trans.it = public/language/it/reset_password.json
|
|||||||
trans.ja = public/language/ja/reset_password.json
|
trans.ja = public/language/ja/reset_password.json
|
||||||
trans.ko = public/language/ko/reset_password.json
|
trans.ko = public/language/ko/reset_password.json
|
||||||
trans.lt = public/language/lt/reset_password.json
|
trans.lt = public/language/lt/reset_password.json
|
||||||
trans.lv = public/language/lv/reset_password.json
|
|
||||||
trans.ms = public/language/ms/reset_password.json
|
trans.ms = public/language/ms/reset_password.json
|
||||||
trans.nb = public/language/nb/reset_password.json
|
trans.nb = public/language/nb/reset_password.json
|
||||||
trans.nl = public/language/nl/reset_password.json
|
trans.nl = public/language/nl/reset_password.json
|
||||||
@@ -528,7 +518,6 @@ trans.it = public/language/it/users.json
|
|||||||
trans.ja = public/language/ja/users.json
|
trans.ja = public/language/ja/users.json
|
||||||
trans.ko = public/language/ko/users.json
|
trans.ko = public/language/ko/users.json
|
||||||
trans.lt = public/language/lt/users.json
|
trans.lt = public/language/lt/users.json
|
||||||
trans.lv = public/language/lv/users.json
|
|
||||||
trans.ms = public/language/ms/users.json
|
trans.ms = public/language/ms/users.json
|
||||||
trans.nb = public/language/nb/users.json
|
trans.nb = public/language/nb/users.json
|
||||||
trans.nl = public/language/nl/users.json
|
trans.nl = public/language/nl/users.json
|
||||||
@@ -578,7 +567,6 @@ trans.it = public/language/it/language.json
|
|||||||
trans.ja = public/language/ja/language.json
|
trans.ja = public/language/ja/language.json
|
||||||
trans.ko = public/language/ko/language.json
|
trans.ko = public/language/ko/language.json
|
||||||
trans.lt = public/language/lt/language.json
|
trans.lt = public/language/lt/language.json
|
||||||
trans.lv = public/language/lv/language.json
|
|
||||||
trans.ms = public/language/ms/language.json
|
trans.ms = public/language/ms/language.json
|
||||||
trans.nb = public/language/nb/language.json
|
trans.nb = public/language/nb/language.json
|
||||||
trans.nl = public/language/nl/language.json
|
trans.nl = public/language/nl/language.json
|
||||||
@@ -628,7 +616,6 @@ trans.it = public/language/it/pages.json
|
|||||||
trans.ja = public/language/ja/pages.json
|
trans.ja = public/language/ja/pages.json
|
||||||
trans.ko = public/language/ko/pages.json
|
trans.ko = public/language/ko/pages.json
|
||||||
trans.lt = public/language/lt/pages.json
|
trans.lt = public/language/lt/pages.json
|
||||||
trans.lv = public/language/lv/pages.json
|
|
||||||
trans.ms = public/language/ms/pages.json
|
trans.ms = public/language/ms/pages.json
|
||||||
trans.nb = public/language/nb/pages.json
|
trans.nb = public/language/nb/pages.json
|
||||||
trans.nl = public/language/nl/pages.json
|
trans.nl = public/language/nl/pages.json
|
||||||
@@ -678,7 +665,6 @@ trans.it = public/language/it/topic.json
|
|||||||
trans.ja = public/language/ja/topic.json
|
trans.ja = public/language/ja/topic.json
|
||||||
trans.ko = public/language/ko/topic.json
|
trans.ko = public/language/ko/topic.json
|
||||||
trans.lt = public/language/lt/topic.json
|
trans.lt = public/language/lt/topic.json
|
||||||
trans.lv = public/language/lv/topic.json
|
|
||||||
trans.ms = public/language/ms/topic.json
|
trans.ms = public/language/ms/topic.json
|
||||||
trans.nb = public/language/nb/topic.json
|
trans.nb = public/language/nb/topic.json
|
||||||
trans.nl = public/language/nl/topic.json
|
trans.nl = public/language/nl/topic.json
|
||||||
@@ -728,7 +714,6 @@ trans.it = public/language/it/success.json
|
|||||||
trans.ja = public/language/ja/success.json
|
trans.ja = public/language/ja/success.json
|
||||||
trans.ko = public/language/ko/success.json
|
trans.ko = public/language/ko/success.json
|
||||||
trans.lt = public/language/lt/success.json
|
trans.lt = public/language/lt/success.json
|
||||||
trans.lv = public/language/lv/success.json
|
|
||||||
trans.ms = public/language/ms/success.json
|
trans.ms = public/language/ms/success.json
|
||||||
trans.nb = public/language/nb/success.json
|
trans.nb = public/language/nb/success.json
|
||||||
trans.nl = public/language/nl/success.json
|
trans.nl = public/language/nl/success.json
|
||||||
@@ -778,7 +763,6 @@ trans.it = public/language/it/error.json
|
|||||||
trans.ja = public/language/ja/error.json
|
trans.ja = public/language/ja/error.json
|
||||||
trans.ko = public/language/ko/error.json
|
trans.ko = public/language/ko/error.json
|
||||||
trans.lt = public/language/lt/error.json
|
trans.lt = public/language/lt/error.json
|
||||||
trans.lv = public/language/lv/error.json
|
|
||||||
trans.ms = public/language/ms/error.json
|
trans.ms = public/language/ms/error.json
|
||||||
trans.nb = public/language/nb/error.json
|
trans.nb = public/language/nb/error.json
|
||||||
trans.nl = public/language/nl/error.json
|
trans.nl = public/language/nl/error.json
|
||||||
@@ -828,7 +812,6 @@ trans.it = public/language/it/flags.json
|
|||||||
trans.ja = public/language/ja/flags.json
|
trans.ja = public/language/ja/flags.json
|
||||||
trans.ko = public/language/ko/flags.json
|
trans.ko = public/language/ko/flags.json
|
||||||
trans.lt = public/language/lt/flags.json
|
trans.lt = public/language/lt/flags.json
|
||||||
trans.lv = public/language/lv/flags.json
|
|
||||||
trans.ms = public/language/ms/flags.json
|
trans.ms = public/language/ms/flags.json
|
||||||
trans.nb = public/language/nb/flags.json
|
trans.nb = public/language/nb/flags.json
|
||||||
trans.nl = public/language/nl/flags.json
|
trans.nl = public/language/nl/flags.json
|
||||||
@@ -877,7 +860,6 @@ trans.it = public/language/it/tags.json
|
|||||||
trans.ja = public/language/ja/tags.json
|
trans.ja = public/language/ja/tags.json
|
||||||
trans.ko = public/language/ko/tags.json
|
trans.ko = public/language/ko/tags.json
|
||||||
trans.lt = public/language/lt/tags.json
|
trans.lt = public/language/lt/tags.json
|
||||||
trans.lv = public/language/lv/tags.json
|
|
||||||
trans.ms = public/language/ms/tags.json
|
trans.ms = public/language/ms/tags.json
|
||||||
trans.nb = public/language/nb/tags.json
|
trans.nb = public/language/nb/tags.json
|
||||||
trans.nl = public/language/nl/tags.json
|
trans.nl = public/language/nl/tags.json
|
||||||
@@ -927,7 +909,6 @@ trans.it = public/language/it/email.json
|
|||||||
trans.ja = public/language/ja/email.json
|
trans.ja = public/language/ja/email.json
|
||||||
trans.ko = public/language/ko/email.json
|
trans.ko = public/language/ko/email.json
|
||||||
trans.lt = public/language/lt/email.json
|
trans.lt = public/language/lt/email.json
|
||||||
trans.lv = public/language/lv/email.json
|
|
||||||
trans.ms = public/language/ms/email.json
|
trans.ms = public/language/ms/email.json
|
||||||
trans.nb = public/language/nb/email.json
|
trans.nb = public/language/nb/email.json
|
||||||
trans.nl = public/language/nl/email.json
|
trans.nl = public/language/nl/email.json
|
||||||
@@ -977,7 +958,6 @@ trans.it = public/language/it/search.json
|
|||||||
trans.ja = public/language/ja/search.json
|
trans.ja = public/language/ja/search.json
|
||||||
trans.ko = public/language/ko/search.json
|
trans.ko = public/language/ko/search.json
|
||||||
trans.lt = public/language/lt/search.json
|
trans.lt = public/language/lt/search.json
|
||||||
trans.lv = public/language/lv/search.json
|
|
||||||
trans.ms = public/language/ms/search.json
|
trans.ms = public/language/ms/search.json
|
||||||
trans.nb = public/language/nb/search.json
|
trans.nb = public/language/nb/search.json
|
||||||
trans.nl = public/language/nl/search.json
|
trans.nl = public/language/nl/search.json
|
||||||
@@ -1027,7 +1007,6 @@ trans.it = public/language/it/groups.json
|
|||||||
trans.ja = public/language/ja/groups.json
|
trans.ja = public/language/ja/groups.json
|
||||||
trans.ko = public/language/ko/groups.json
|
trans.ko = public/language/ko/groups.json
|
||||||
trans.lt = public/language/lt/groups.json
|
trans.lt = public/language/lt/groups.json
|
||||||
trans.lv = public/language/lv/groups.json
|
|
||||||
trans.ms = public/language/ms/groups.json
|
trans.ms = public/language/ms/groups.json
|
||||||
trans.nb = public/language/nb/groups.json
|
trans.nb = public/language/nb/groups.json
|
||||||
trans.nl = public/language/nl/groups.json
|
trans.nl = public/language/nl/groups.json
|
||||||
@@ -1077,7 +1056,6 @@ trans.it = public/language/it/uploads.json
|
|||||||
trans.ja = public/language/ja/uploads.json
|
trans.ja = public/language/ja/uploads.json
|
||||||
trans.ko = public/language/ko/uploads.json
|
trans.ko = public/language/ko/uploads.json
|
||||||
trans.lt = public/language/lt/uploads.json
|
trans.lt = public/language/lt/uploads.json
|
||||||
trans.lv = public/language/lv/uploads.json
|
|
||||||
trans.ms = public/language/ms/uploads.json
|
trans.ms = public/language/ms/uploads.json
|
||||||
trans.nb = public/language/nb/uploads.json
|
trans.nb = public/language/nb/uploads.json
|
||||||
trans.nl = public/language/nl/uploads.json
|
trans.nl = public/language/nl/uploads.json
|
||||||
@@ -1127,7 +1105,6 @@ trans.it = public/language/it/admin/admin.json
|
|||||||
trans.ja = public/language/ja/admin/admin.json
|
trans.ja = public/language/ja/admin/admin.json
|
||||||
trans.ko = public/language/ko/admin/admin.json
|
trans.ko = public/language/ko/admin/admin.json
|
||||||
trans.lt = public/language/lt/admin/admin.json
|
trans.lt = public/language/lt/admin/admin.json
|
||||||
trans.lv = public/language/lv/admin/admin.json
|
|
||||||
trans.ms = public/language/ms/admin/admin.json
|
trans.ms = public/language/ms/admin/admin.json
|
||||||
trans.nb = public/language/nb/admin/admin.json
|
trans.nb = public/language/nb/admin/admin.json
|
||||||
trans.nl = public/language/nl/admin/admin.json
|
trans.nl = public/language/nl/admin/admin.json
|
||||||
@@ -1177,7 +1154,6 @@ trans.it = public/language/it/admin/menu.json
|
|||||||
trans.ja = public/language/ja/admin/menu.json
|
trans.ja = public/language/ja/admin/menu.json
|
||||||
trans.ko = public/language/ko/admin/menu.json
|
trans.ko = public/language/ko/admin/menu.json
|
||||||
trans.lt = public/language/lt/admin/menu.json
|
trans.lt = public/language/lt/admin/menu.json
|
||||||
trans.lv = public/language/lv/admin/menu.json
|
|
||||||
trans.ms = public/language/ms/admin/menu.json
|
trans.ms = public/language/ms/admin/menu.json
|
||||||
trans.nb = public/language/nb/admin/menu.json
|
trans.nb = public/language/nb/admin/menu.json
|
||||||
trans.nl = public/language/nl/admin/menu.json
|
trans.nl = public/language/nl/admin/menu.json
|
||||||
@@ -1227,7 +1203,6 @@ trans.it = public/language/it/admin/advanced/cache.json
|
|||||||
trans.ja = public/language/ja/admin/advanced/cache.json
|
trans.ja = public/language/ja/admin/advanced/cache.json
|
||||||
trans.ko = public/language/ko/admin/advanced/cache.json
|
trans.ko = public/language/ko/admin/advanced/cache.json
|
||||||
trans.lt = public/language/lt/admin/advanced/cache.json
|
trans.lt = public/language/lt/admin/advanced/cache.json
|
||||||
trans.lv = public/language/lv/admin/advanced/cache.json
|
|
||||||
trans.ms = public/language/ms/admin/advanced/cache.json
|
trans.ms = public/language/ms/admin/advanced/cache.json
|
||||||
trans.nb = public/language/nb/admin/advanced/cache.json
|
trans.nb = public/language/nb/admin/advanced/cache.json
|
||||||
trans.nl = public/language/nl/admin/advanced/cache.json
|
trans.nl = public/language/nl/admin/advanced/cache.json
|
||||||
@@ -1277,7 +1252,6 @@ trans.it = public/language/it/admin/advanced/database.json
|
|||||||
trans.ja = public/language/ja/admin/advanced/database.json
|
trans.ja = public/language/ja/admin/advanced/database.json
|
||||||
trans.ko = public/language/ko/admin/advanced/database.json
|
trans.ko = public/language/ko/admin/advanced/database.json
|
||||||
trans.lt = public/language/lt/admin/advanced/database.json
|
trans.lt = public/language/lt/admin/advanced/database.json
|
||||||
trans.lv = public/language/lv/admin/advanced/database.json
|
|
||||||
trans.ms = public/language/ms/admin/advanced/database.json
|
trans.ms = public/language/ms/admin/advanced/database.json
|
||||||
trans.nb = public/language/nb/admin/advanced/database.json
|
trans.nb = public/language/nb/admin/advanced/database.json
|
||||||
trans.nl = public/language/nl/admin/advanced/database.json
|
trans.nl = public/language/nl/admin/advanced/database.json
|
||||||
@@ -1327,7 +1301,6 @@ trans.it = public/language/it/admin/advanced/errors.json
|
|||||||
trans.ja = public/language/ja/admin/advanced/errors.json
|
trans.ja = public/language/ja/admin/advanced/errors.json
|
||||||
trans.ko = public/language/ko/admin/advanced/errors.json
|
trans.ko = public/language/ko/admin/advanced/errors.json
|
||||||
trans.lt = public/language/lt/admin/advanced/errors.json
|
trans.lt = public/language/lt/admin/advanced/errors.json
|
||||||
trans.lv = public/language/lv/admin/advanced/errors.json
|
|
||||||
trans.ms = public/language/ms/admin/advanced/errors.json
|
trans.ms = public/language/ms/admin/advanced/errors.json
|
||||||
trans.nb = public/language/nb/admin/advanced/errors.json
|
trans.nb = public/language/nb/admin/advanced/errors.json
|
||||||
trans.nl = public/language/nl/admin/advanced/errors.json
|
trans.nl = public/language/nl/admin/advanced/errors.json
|
||||||
@@ -1377,7 +1350,6 @@ trans.it = public/language/it/admin/advanced/events.json
|
|||||||
trans.ja = public/language/ja/admin/advanced/events.json
|
trans.ja = public/language/ja/admin/advanced/events.json
|
||||||
trans.ko = public/language/ko/admin/advanced/events.json
|
trans.ko = public/language/ko/admin/advanced/events.json
|
||||||
trans.lt = public/language/lt/admin/advanced/events.json
|
trans.lt = public/language/lt/admin/advanced/events.json
|
||||||
trans.lv = public/language/lv/admin/advanced/events.json
|
|
||||||
trans.ms = public/language/ms/admin/advanced/events.json
|
trans.ms = public/language/ms/admin/advanced/events.json
|
||||||
trans.nb = public/language/nb/admin/advanced/events.json
|
trans.nb = public/language/nb/admin/advanced/events.json
|
||||||
trans.nl = public/language/nl/admin/advanced/events.json
|
trans.nl = public/language/nl/admin/advanced/events.json
|
||||||
@@ -1427,7 +1399,6 @@ trans.it = public/language/it/admin/advanced/logs.json
|
|||||||
trans.ja = public/language/ja/admin/advanced/logs.json
|
trans.ja = public/language/ja/admin/advanced/logs.json
|
||||||
trans.ko = public/language/ko/admin/advanced/logs.json
|
trans.ko = public/language/ko/admin/advanced/logs.json
|
||||||
trans.lt = public/language/lt/admin/advanced/logs.json
|
trans.lt = public/language/lt/admin/advanced/logs.json
|
||||||
trans.lv = public/language/lv/admin/advanced/logs.json
|
|
||||||
trans.ms = public/language/ms/admin/advanced/logs.json
|
trans.ms = public/language/ms/admin/advanced/logs.json
|
||||||
trans.nb = public/language/nb/admin/advanced/logs.json
|
trans.nb = public/language/nb/admin/advanced/logs.json
|
||||||
trans.nl = public/language/nl/admin/advanced/logs.json
|
trans.nl = public/language/nl/admin/advanced/logs.json
|
||||||
@@ -1477,7 +1448,6 @@ trans.it = public/language/it/admin/appearance/customise.json
|
|||||||
trans.ja = public/language/ja/admin/appearance/customise.json
|
trans.ja = public/language/ja/admin/appearance/customise.json
|
||||||
trans.ko = public/language/ko/admin/appearance/customise.json
|
trans.ko = public/language/ko/admin/appearance/customise.json
|
||||||
trans.lt = public/language/lt/admin/appearance/customise.json
|
trans.lt = public/language/lt/admin/appearance/customise.json
|
||||||
trans.lv = public/language/lv/admin/appearance/customise.json
|
|
||||||
trans.ms = public/language/ms/admin/appearance/customise.json
|
trans.ms = public/language/ms/admin/appearance/customise.json
|
||||||
trans.nb = public/language/nb/admin/appearance/customise.json
|
trans.nb = public/language/nb/admin/appearance/customise.json
|
||||||
trans.nl = public/language/nl/admin/appearance/customise.json
|
trans.nl = public/language/nl/admin/appearance/customise.json
|
||||||
@@ -1527,7 +1497,6 @@ trans.it = public/language/it/admin/appearance/skins.json
|
|||||||
trans.ja = public/language/ja/admin/appearance/skins.json
|
trans.ja = public/language/ja/admin/appearance/skins.json
|
||||||
trans.ko = public/language/ko/admin/appearance/skins.json
|
trans.ko = public/language/ko/admin/appearance/skins.json
|
||||||
trans.lt = public/language/lt/admin/appearance/skins.json
|
trans.lt = public/language/lt/admin/appearance/skins.json
|
||||||
trans.lv = public/language/lv/admin/appearance/skins.json
|
|
||||||
trans.ms = public/language/ms/admin/appearance/skins.json
|
trans.ms = public/language/ms/admin/appearance/skins.json
|
||||||
trans.nb = public/language/nb/admin/appearance/skins.json
|
trans.nb = public/language/nb/admin/appearance/skins.json
|
||||||
trans.nl = public/language/nl/admin/appearance/skins.json
|
trans.nl = public/language/nl/admin/appearance/skins.json
|
||||||
@@ -1577,7 +1546,6 @@ trans.it = public/language/it/admin/appearance/themes.json
|
|||||||
trans.ja = public/language/ja/admin/appearance/themes.json
|
trans.ja = public/language/ja/admin/appearance/themes.json
|
||||||
trans.ko = public/language/ko/admin/appearance/themes.json
|
trans.ko = public/language/ko/admin/appearance/themes.json
|
||||||
trans.lt = public/language/lt/admin/appearance/themes.json
|
trans.lt = public/language/lt/admin/appearance/themes.json
|
||||||
trans.lv = public/language/lv/admin/appearance/themes.json
|
|
||||||
trans.ms = public/language/ms/admin/appearance/themes.json
|
trans.ms = public/language/ms/admin/appearance/themes.json
|
||||||
trans.nb = public/language/nb/admin/appearance/themes.json
|
trans.nb = public/language/nb/admin/appearance/themes.json
|
||||||
trans.nl = public/language/nl/admin/appearance/themes.json
|
trans.nl = public/language/nl/admin/appearance/themes.json
|
||||||
@@ -1627,7 +1595,6 @@ trans.it = public/language/it/admin/development/info.json
|
|||||||
trans.ja = public/language/ja/admin/development/info.json
|
trans.ja = public/language/ja/admin/development/info.json
|
||||||
trans.ko = public/language/ko/admin/development/info.json
|
trans.ko = public/language/ko/admin/development/info.json
|
||||||
trans.lt = public/language/lt/admin/development/info.json
|
trans.lt = public/language/lt/admin/development/info.json
|
||||||
trans.lv = public/language/lv/admin/development/info.json
|
|
||||||
trans.ms = public/language/ms/admin/development/info.json
|
trans.ms = public/language/ms/admin/development/info.json
|
||||||
trans.nb = public/language/nb/admin/development/info.json
|
trans.nb = public/language/nb/admin/development/info.json
|
||||||
trans.nl = public/language/nl/admin/development/info.json
|
trans.nl = public/language/nl/admin/development/info.json
|
||||||
@@ -1677,7 +1644,6 @@ trans.it = public/language/it/admin/development/logger.json
|
|||||||
trans.ja = public/language/ja/admin/development/logger.json
|
trans.ja = public/language/ja/admin/development/logger.json
|
||||||
trans.ko = public/language/ko/admin/development/logger.json
|
trans.ko = public/language/ko/admin/development/logger.json
|
||||||
trans.lt = public/language/lt/admin/development/logger.json
|
trans.lt = public/language/lt/admin/development/logger.json
|
||||||
trans.lv = public/language/lv/admin/development/logger.json
|
|
||||||
trans.ms = public/language/ms/admin/development/logger.json
|
trans.ms = public/language/ms/admin/development/logger.json
|
||||||
trans.nb = public/language/nb/admin/development/logger.json
|
trans.nb = public/language/nb/admin/development/logger.json
|
||||||
trans.nl = public/language/nl/admin/development/logger.json
|
trans.nl = public/language/nl/admin/development/logger.json
|
||||||
@@ -1727,7 +1693,6 @@ trans.it = public/language/it/admin/extend/plugins.json
|
|||||||
trans.ja = public/language/ja/admin/extend/plugins.json
|
trans.ja = public/language/ja/admin/extend/plugins.json
|
||||||
trans.ko = public/language/ko/admin/extend/plugins.json
|
trans.ko = public/language/ko/admin/extend/plugins.json
|
||||||
trans.lt = public/language/lt/admin/extend/plugins.json
|
trans.lt = public/language/lt/admin/extend/plugins.json
|
||||||
trans.lv = public/language/lv/admin/extend/plugins.json
|
|
||||||
trans.ms = public/language/ms/admin/extend/plugins.json
|
trans.ms = public/language/ms/admin/extend/plugins.json
|
||||||
trans.nb = public/language/nb/admin/extend/plugins.json
|
trans.nb = public/language/nb/admin/extend/plugins.json
|
||||||
trans.nl = public/language/nl/admin/extend/plugins.json
|
trans.nl = public/language/nl/admin/extend/plugins.json
|
||||||
@@ -1777,7 +1742,6 @@ trans.it = public/language/it/admin/extend/rewards.json
|
|||||||
trans.ja = public/language/ja/admin/extend/rewards.json
|
trans.ja = public/language/ja/admin/extend/rewards.json
|
||||||
trans.ko = public/language/ko/admin/extend/rewards.json
|
trans.ko = public/language/ko/admin/extend/rewards.json
|
||||||
trans.lt = public/language/lt/admin/extend/rewards.json
|
trans.lt = public/language/lt/admin/extend/rewards.json
|
||||||
trans.lv = public/language/lv/admin/extend/rewards.json
|
|
||||||
trans.ms = public/language/ms/admin/extend/rewards.json
|
trans.ms = public/language/ms/admin/extend/rewards.json
|
||||||
trans.nb = public/language/nb/admin/extend/rewards.json
|
trans.nb = public/language/nb/admin/extend/rewards.json
|
||||||
trans.nl = public/language/nl/admin/extend/rewards.json
|
trans.nl = public/language/nl/admin/extend/rewards.json
|
||||||
@@ -1827,7 +1791,6 @@ trans.it = public/language/it/admin/extend/widgets.json
|
|||||||
trans.ja = public/language/ja/admin/extend/widgets.json
|
trans.ja = public/language/ja/admin/extend/widgets.json
|
||||||
trans.ko = public/language/ko/admin/extend/widgets.json
|
trans.ko = public/language/ko/admin/extend/widgets.json
|
||||||
trans.lt = public/language/lt/admin/extend/widgets.json
|
trans.lt = public/language/lt/admin/extend/widgets.json
|
||||||
trans.lv = public/language/lv/admin/extend/widgets.json
|
|
||||||
trans.ms = public/language/ms/admin/extend/widgets.json
|
trans.ms = public/language/ms/admin/extend/widgets.json
|
||||||
trans.nb = public/language/nb/admin/extend/widgets.json
|
trans.nb = public/language/nb/admin/extend/widgets.json
|
||||||
trans.nl = public/language/nl/admin/extend/widgets.json
|
trans.nl = public/language/nl/admin/extend/widgets.json
|
||||||
@@ -1877,7 +1840,6 @@ trans.it = public/language/it/admin/general/dashboard.json
|
|||||||
trans.ja = public/language/ja/admin/general/dashboard.json
|
trans.ja = public/language/ja/admin/general/dashboard.json
|
||||||
trans.ko = public/language/ko/admin/general/dashboard.json
|
trans.ko = public/language/ko/admin/general/dashboard.json
|
||||||
trans.lt = public/language/lt/admin/general/dashboard.json
|
trans.lt = public/language/lt/admin/general/dashboard.json
|
||||||
trans.lv = public/language/lv/admin/general/dashboard.json
|
|
||||||
trans.ms = public/language/ms/admin/general/dashboard.json
|
trans.ms = public/language/ms/admin/general/dashboard.json
|
||||||
trans.nb = public/language/nb/admin/general/dashboard.json
|
trans.nb = public/language/nb/admin/general/dashboard.json
|
||||||
trans.nl = public/language/nl/admin/general/dashboard.json
|
trans.nl = public/language/nl/admin/general/dashboard.json
|
||||||
@@ -1927,7 +1889,6 @@ trans.it = public/language/it/admin/general/homepage.json
|
|||||||
trans.ja = public/language/ja/admin/general/homepage.json
|
trans.ja = public/language/ja/admin/general/homepage.json
|
||||||
trans.ko = public/language/ko/admin/general/homepage.json
|
trans.ko = public/language/ko/admin/general/homepage.json
|
||||||
trans.lt = public/language/lt/admin/general/homepage.json
|
trans.lt = public/language/lt/admin/general/homepage.json
|
||||||
trans.lv = public/language/lv/admin/general/homepage.json
|
|
||||||
trans.ms = public/language/ms/admin/general/homepage.json
|
trans.ms = public/language/ms/admin/general/homepage.json
|
||||||
trans.nb = public/language/nb/admin/general/homepage.json
|
trans.nb = public/language/nb/admin/general/homepage.json
|
||||||
trans.nl = public/language/nl/admin/general/homepage.json
|
trans.nl = public/language/nl/admin/general/homepage.json
|
||||||
@@ -1977,7 +1938,6 @@ trans.it = public/language/it/admin/general/languages.json
|
|||||||
trans.ja = public/language/ja/admin/general/languages.json
|
trans.ja = public/language/ja/admin/general/languages.json
|
||||||
trans.ko = public/language/ko/admin/general/languages.json
|
trans.ko = public/language/ko/admin/general/languages.json
|
||||||
trans.lt = public/language/lt/admin/general/languages.json
|
trans.lt = public/language/lt/admin/general/languages.json
|
||||||
trans.lv = public/language/lv/admin/general/languages.json
|
|
||||||
trans.ms = public/language/ms/admin/general/languages.json
|
trans.ms = public/language/ms/admin/general/languages.json
|
||||||
trans.nb = public/language/nb/admin/general/languages.json
|
trans.nb = public/language/nb/admin/general/languages.json
|
||||||
trans.nl = public/language/nl/admin/general/languages.json
|
trans.nl = public/language/nl/admin/general/languages.json
|
||||||
@@ -2027,7 +1987,6 @@ trans.it = public/language/it/admin/general/navigation.json
|
|||||||
trans.ja = public/language/ja/admin/general/navigation.json
|
trans.ja = public/language/ja/admin/general/navigation.json
|
||||||
trans.ko = public/language/ko/admin/general/navigation.json
|
trans.ko = public/language/ko/admin/general/navigation.json
|
||||||
trans.lt = public/language/lt/admin/general/navigation.json
|
trans.lt = public/language/lt/admin/general/navigation.json
|
||||||
trans.lv = public/language/lv/admin/general/navigation.json
|
|
||||||
trans.ms = public/language/ms/admin/general/navigation.json
|
trans.ms = public/language/ms/admin/general/navigation.json
|
||||||
trans.nb = public/language/nb/admin/general/navigation.json
|
trans.nb = public/language/nb/admin/general/navigation.json
|
||||||
trans.nl = public/language/nl/admin/general/navigation.json
|
trans.nl = public/language/nl/admin/general/navigation.json
|
||||||
@@ -2077,7 +2036,6 @@ trans.it = public/language/it/admin/general/social.json
|
|||||||
trans.ja = public/language/ja/admin/general/social.json
|
trans.ja = public/language/ja/admin/general/social.json
|
||||||
trans.ko = public/language/ko/admin/general/social.json
|
trans.ko = public/language/ko/admin/general/social.json
|
||||||
trans.lt = public/language/lt/admin/general/social.json
|
trans.lt = public/language/lt/admin/general/social.json
|
||||||
trans.lv = public/language/lv/admin/general/social.json
|
|
||||||
trans.ms = public/language/ms/admin/general/social.json
|
trans.ms = public/language/ms/admin/general/social.json
|
||||||
trans.nb = public/language/nb/admin/general/social.json
|
trans.nb = public/language/nb/admin/general/social.json
|
||||||
trans.nl = public/language/nl/admin/general/social.json
|
trans.nl = public/language/nl/admin/general/social.json
|
||||||
@@ -2127,7 +2085,6 @@ trans.it = public/language/it/admin/general/sounds.json
|
|||||||
trans.ja = public/language/ja/admin/general/sounds.json
|
trans.ja = public/language/ja/admin/general/sounds.json
|
||||||
trans.ko = public/language/ko/admin/general/sounds.json
|
trans.ko = public/language/ko/admin/general/sounds.json
|
||||||
trans.lt = public/language/lt/admin/general/sounds.json
|
trans.lt = public/language/lt/admin/general/sounds.json
|
||||||
trans.lv = public/language/lv/admin/general/sounds.json
|
|
||||||
trans.ms = public/language/ms/admin/general/sounds.json
|
trans.ms = public/language/ms/admin/general/sounds.json
|
||||||
trans.nb = public/language/nb/admin/general/sounds.json
|
trans.nb = public/language/nb/admin/general/sounds.json
|
||||||
trans.nl = public/language/nl/admin/general/sounds.json
|
trans.nl = public/language/nl/admin/general/sounds.json
|
||||||
@@ -2150,56 +2107,6 @@ trans.zh_CN = public/language/zh-CN/admin/general/sounds.json
|
|||||||
trans.zh_TW = public/language/zh-TW/admin/general/sounds.json
|
trans.zh_TW = public/language/zh-TW/admin/general/sounds.json
|
||||||
type = KEYVALUEJSON
|
type = KEYVALUEJSON
|
||||||
|
|
||||||
[nodebb.admin-manage-admins-mods]
|
|
||||||
file_filter = public/language/<lang>/admin/manage/admins-mods.json
|
|
||||||
source_file = public/language/en-GB/admin/manage/admins-mods.json
|
|
||||||
source_lang = en_GB
|
|
||||||
trans.ar = public/language/ar/admin/manage/admins-mods.json
|
|
||||||
trans.bg = public/language/bg/admin/manage/admins-mods.json
|
|
||||||
trans.bn = public/language/bn/admin/manage/admins-mods.json
|
|
||||||
trans.cs = public/language/cs/admin/manage/admins-mods.json
|
|
||||||
trans.da = public/language/da/admin/manage/admins-mods.json
|
|
||||||
trans.de = public/language/de/admin/manage/admins-mods.json
|
|
||||||
trans.el = public/language/el/admin/manage/admins-mods.json
|
|
||||||
trans.en@pirate = public/language/en-x-pirate/admin/manage/admins-mods.json
|
|
||||||
trans.en_US = public/language/en-US/admin/manage/admins-mods.json
|
|
||||||
trans.es = public/language/es/admin/manage/admins-mods.json
|
|
||||||
trans.et = public/language/et/admin/manage/admins-mods.json
|
|
||||||
trans.fa_IR = public/language/fa-IR/admin/manage/admins-mods.json
|
|
||||||
trans.fi = public/language/fi/admin/manage/admins-mods.json
|
|
||||||
trans.fr = public/language/fr/admin/manage/admins-mods.json
|
|
||||||
trans.gl = public/language/gl/admin/manage/admins-mods.json
|
|
||||||
trans.he = public/language/he/admin/manage/admins-mods.json
|
|
||||||
trans.hr = public/language/hr/admin/manage/admins-mods.json
|
|
||||||
trans.hu = public/language/hu/admin/manage/admins-mods.json
|
|
||||||
trans.id = public/language/id/admin/manage/admins-mods.json
|
|
||||||
trans.it = public/language/it/admin/manage/admins-mods.json
|
|
||||||
trans.ja = public/language/ja/admin/manage/admins-mods.json
|
|
||||||
trans.ko = public/language/ko/admin/manage/admins-mods.json
|
|
||||||
trans.lt = public/language/lt/admin/manage/admins-mods.json
|
|
||||||
trans.lv = public/language/lv/admin/manage/admins-mods.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/admins-mods.json
|
|
||||||
trans.nb = public/language/nb/admin/manage/admins-mods.json
|
|
||||||
trans.nl = public/language/nl/admin/manage/admins-mods.json
|
|
||||||
trans.pl = public/language/pl/admin/manage/admins-mods.json
|
|
||||||
trans.pt_BR = public/language/pt-BR/admin/manage/admins-mods.json
|
|
||||||
trans.pt_PT = public/language/pt-PT/admin/manage/admins-mods.json
|
|
||||||
trans.ro = public/language/ro/admin/manage/admins-mods.json
|
|
||||||
trans.ru = public/language/ru/admin/manage/admins-mods.json
|
|
||||||
trans.rw = public/language/rw/admin/manage/admins-mods.json
|
|
||||||
trans.sc = public/language/sc/admin/manage/admins-mods.json
|
|
||||||
trans.sk = public/language/sk/admin/manage/admins-mods.json
|
|
||||||
trans.sl = public/language/sl/admin/manage/admins-mods.json
|
|
||||||
trans.sr = public/language/sr/admin/manage/admins-mods.json
|
|
||||||
trans.sv = public/language/sv/admin/manage/admins-mods.json
|
|
||||||
trans.th = public/language/th/admin/manage/admins-mods.json
|
|
||||||
trans.tr = public/language/tr/admin/manage/admins-mods.json
|
|
||||||
trans.uk = public/language/uk/admin/manage/admins-mods.json
|
|
||||||
trans.vi = public/language/vi/admin/manage/admins-mods.json
|
|
||||||
trans.zh_CN = public/language/zh-CN/admin/manage/admins-mods.json
|
|
||||||
trans.zh_TW = public/language/zh-TW/admin/manage/admins-mods.json
|
|
||||||
type = KEYVALUEJSON
|
|
||||||
|
|
||||||
[nodebb.admin-manage-categories]
|
[nodebb.admin-manage-categories]
|
||||||
file_filter = public/language/<lang>/admin/manage/categories.json
|
file_filter = public/language/<lang>/admin/manage/categories.json
|
||||||
source_file = public/language/en-GB/admin/manage/categories.json
|
source_file = public/language/en-GB/admin/manage/categories.json
|
||||||
@@ -2227,7 +2134,6 @@ trans.it = public/language/it/admin/manage/categories.json
|
|||||||
trans.ja = public/language/ja/admin/manage/categories.json
|
trans.ja = public/language/ja/admin/manage/categories.json
|
||||||
trans.ko = public/language/ko/admin/manage/categories.json
|
trans.ko = public/language/ko/admin/manage/categories.json
|
||||||
trans.lt = public/language/lt/admin/manage/categories.json
|
trans.lt = public/language/lt/admin/manage/categories.json
|
||||||
trans.lv = public/language/lv/admin/manage/categories.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/categories.json
|
trans.ms = public/language/ms/admin/manage/categories.json
|
||||||
trans.nb = public/language/nb/admin/manage/categories.json
|
trans.nb = public/language/nb/admin/manage/categories.json
|
||||||
trans.nl = public/language/nl/admin/manage/categories.json
|
trans.nl = public/language/nl/admin/manage/categories.json
|
||||||
@@ -2277,7 +2183,6 @@ trans.it = public/language/it/admin/manage/groups.json
|
|||||||
trans.ja = public/language/ja/admin/manage/groups.json
|
trans.ja = public/language/ja/admin/manage/groups.json
|
||||||
trans.ko = public/language/ko/admin/manage/groups.json
|
trans.ko = public/language/ko/admin/manage/groups.json
|
||||||
trans.lt = public/language/lt/admin/manage/groups.json
|
trans.lt = public/language/lt/admin/manage/groups.json
|
||||||
trans.lv = public/language/lv/admin/manage/groups.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/groups.json
|
trans.ms = public/language/ms/admin/manage/groups.json
|
||||||
trans.nb = public/language/nb/admin/manage/groups.json
|
trans.nb = public/language/nb/admin/manage/groups.json
|
||||||
trans.nl = public/language/nl/admin/manage/groups.json
|
trans.nl = public/language/nl/admin/manage/groups.json
|
||||||
@@ -2327,7 +2232,6 @@ trans.it = public/language/it/admin/manage/ip-blacklist.json
|
|||||||
trans.ja = public/language/ja/admin/manage/ip-blacklist.json
|
trans.ja = public/language/ja/admin/manage/ip-blacklist.json
|
||||||
trans.ko = public/language/ko/admin/manage/ip-blacklist.json
|
trans.ko = public/language/ko/admin/manage/ip-blacklist.json
|
||||||
trans.lt = public/language/lt/admin/manage/ip-blacklist.json
|
trans.lt = public/language/lt/admin/manage/ip-blacklist.json
|
||||||
trans.lv = public/language/lv/admin/manage/ip-blacklist.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/ip-blacklist.json
|
trans.ms = public/language/ms/admin/manage/ip-blacklist.json
|
||||||
trans.nb = public/language/nb/admin/manage/ip-blacklist.json
|
trans.nb = public/language/nb/admin/manage/ip-blacklist.json
|
||||||
trans.nl = public/language/nl/admin/manage/ip-blacklist.json
|
trans.nl = public/language/nl/admin/manage/ip-blacklist.json
|
||||||
@@ -2350,56 +2254,6 @@ trans.zh_CN = public/language/zh-CN/admin/manage/ip-blacklist.json
|
|||||||
trans.zh_TW = public/language/zh-TW/admin/manage/ip-blacklist.json
|
trans.zh_TW = public/language/zh-TW/admin/manage/ip-blacklist.json
|
||||||
type = KEYVALUEJSON
|
type = KEYVALUEJSON
|
||||||
|
|
||||||
[nodebb.admin-manage-privileges]
|
|
||||||
file_filter = public/language/<lang>/admin/manage/privileges.json
|
|
||||||
source_file = public/language/en-GB/admin/manage/privileges.json
|
|
||||||
source_lang = en_GB
|
|
||||||
trans.ar = public/language/ar/admin/manage/privileges.json
|
|
||||||
trans.bg = public/language/bg/admin/manage/privileges.json
|
|
||||||
trans.bn = public/language/bn/admin/manage/privileges.json
|
|
||||||
trans.cs = public/language/cs/admin/manage/privileges.json
|
|
||||||
trans.da = public/language/da/admin/manage/privileges.json
|
|
||||||
trans.de = public/language/de/admin/manage/privileges.json
|
|
||||||
trans.el = public/language/el/admin/manage/privileges.json
|
|
||||||
trans.en@pirate = public/language/en-x-pirate/admin/manage/privileges.json
|
|
||||||
trans.en_US = public/language/en-US/admin/manage/privileges.json
|
|
||||||
trans.es = public/language/es/admin/manage/privileges.json
|
|
||||||
trans.et = public/language/et/admin/manage/privileges.json
|
|
||||||
trans.fa_IR = public/language/fa-IR/admin/manage/privileges.json
|
|
||||||
trans.fi = public/language/fi/admin/manage/privileges.json
|
|
||||||
trans.fr = public/language/fr/admin/manage/privileges.json
|
|
||||||
trans.gl = public/language/gl/admin/manage/privileges.json
|
|
||||||
trans.he = public/language/he/admin/manage/privileges.json
|
|
||||||
trans.hr = public/language/hr/admin/manage/privileges.json
|
|
||||||
trans.hu = public/language/hu/admin/manage/privileges.json
|
|
||||||
trans.id = public/language/id/admin/manage/privileges.json
|
|
||||||
trans.it = public/language/it/admin/manage/privileges.json
|
|
||||||
trans.ja = public/language/ja/admin/manage/privileges.json
|
|
||||||
trans.ko = public/language/ko/admin/manage/privileges.json
|
|
||||||
trans.lt = public/language/lt/admin/manage/privileges.json
|
|
||||||
trans.lv = public/language/lv/admin/manage/privileges.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/privileges.json
|
|
||||||
trans.nb = public/language/nb/admin/manage/privileges.json
|
|
||||||
trans.nl = public/language/nl/admin/manage/privileges.json
|
|
||||||
trans.pl = public/language/pl/admin/manage/privileges.json
|
|
||||||
trans.pt_BR = public/language/pt-BR/admin/manage/privileges.json
|
|
||||||
trans.pt_PT = public/language/pt-PT/admin/manage/privileges.json
|
|
||||||
trans.ro = public/language/ro/admin/manage/privileges.json
|
|
||||||
trans.ru = public/language/ru/admin/manage/privileges.json
|
|
||||||
trans.rw = public/language/rw/admin/manage/privileges.json
|
|
||||||
trans.sc = public/language/sc/admin/manage/privileges.json
|
|
||||||
trans.sk = public/language/sk/admin/manage/privileges.json
|
|
||||||
trans.sl = public/language/sl/admin/manage/privileges.json
|
|
||||||
trans.sr = public/language/sr/admin/manage/privileges.json
|
|
||||||
trans.sv = public/language/sv/admin/manage/privileges.json
|
|
||||||
trans.th = public/language/th/admin/manage/privileges.json
|
|
||||||
trans.tr = public/language/tr/admin/manage/privileges.json
|
|
||||||
trans.uk = public/language/uk/admin/manage/privileges.json
|
|
||||||
trans.vi = public/language/vi/admin/manage/privileges.json
|
|
||||||
trans.zh_CN = public/language/zh-CN/admin/manage/privileges.json
|
|
||||||
trans.zh_TW = public/language/zh-TW/admin/manage/privileges.json
|
|
||||||
type = KEYVALUEJSON
|
|
||||||
|
|
||||||
[nodebb.admin-manage-post-queue]
|
[nodebb.admin-manage-post-queue]
|
||||||
file_filter = public/language/<lang>/admin/manage/post-queue.json
|
file_filter = public/language/<lang>/admin/manage/post-queue.json
|
||||||
source_file = public/language/en-GB/admin/manage/post-queue.json
|
source_file = public/language/en-GB/admin/manage/post-queue.json
|
||||||
@@ -2427,7 +2281,6 @@ trans.it = public/language/it/admin/manage/post-queue.json
|
|||||||
trans.ja = public/language/ja/admin/manage/post-queue.json
|
trans.ja = public/language/ja/admin/manage/post-queue.json
|
||||||
trans.ko = public/language/ko/admin/manage/post-queue.json
|
trans.ko = public/language/ko/admin/manage/post-queue.json
|
||||||
trans.lt = public/language/lt/admin/manage/post-queue.json
|
trans.lt = public/language/lt/admin/manage/post-queue.json
|
||||||
trans.lv = public/language/lv/admin/manage/post-queue.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/post-queue.json
|
trans.ms = public/language/ms/admin/manage/post-queue.json
|
||||||
trans.nb = public/language/nb/admin/manage/post-queue.json
|
trans.nb = public/language/nb/admin/manage/post-queue.json
|
||||||
trans.nl = public/language/nl/admin/manage/post-queue.json
|
trans.nl = public/language/nl/admin/manage/post-queue.json
|
||||||
@@ -2477,7 +2330,6 @@ trans.it = public/language/it/admin/manage/registration.json
|
|||||||
trans.ja = public/language/ja/admin/manage/registration.json
|
trans.ja = public/language/ja/admin/manage/registration.json
|
||||||
trans.ko = public/language/ko/admin/manage/registration.json
|
trans.ko = public/language/ko/admin/manage/registration.json
|
||||||
trans.lt = public/language/lt/admin/manage/registration.json
|
trans.lt = public/language/lt/admin/manage/registration.json
|
||||||
trans.lv = public/language/lv/admin/manage/registration.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/registration.json
|
trans.ms = public/language/ms/admin/manage/registration.json
|
||||||
trans.nb = public/language/nb/admin/manage/registration.json
|
trans.nb = public/language/nb/admin/manage/registration.json
|
||||||
trans.nl = public/language/nl/admin/manage/registration.json
|
trans.nl = public/language/nl/admin/manage/registration.json
|
||||||
@@ -2527,7 +2379,6 @@ trans.it = public/language/it/admin/manage/tags.json
|
|||||||
trans.ja = public/language/ja/admin/manage/tags.json
|
trans.ja = public/language/ja/admin/manage/tags.json
|
||||||
trans.ko = public/language/ko/admin/manage/tags.json
|
trans.ko = public/language/ko/admin/manage/tags.json
|
||||||
trans.lt = public/language/lt/admin/manage/tags.json
|
trans.lt = public/language/lt/admin/manage/tags.json
|
||||||
trans.lv = public/language/lv/admin/manage/tags.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/tags.json
|
trans.ms = public/language/ms/admin/manage/tags.json
|
||||||
trans.nb = public/language/nb/admin/manage/tags.json
|
trans.nb = public/language/nb/admin/manage/tags.json
|
||||||
trans.nl = public/language/nl/admin/manage/tags.json
|
trans.nl = public/language/nl/admin/manage/tags.json
|
||||||
@@ -2550,56 +2401,6 @@ trans.zh_CN = public/language/zh-CN/admin/manage/tags.json
|
|||||||
trans.zh_TW = public/language/zh-TW/admin/manage/tags.json
|
trans.zh_TW = public/language/zh-TW/admin/manage/tags.json
|
||||||
type = KEYVALUEJSON
|
type = KEYVALUEJSON
|
||||||
|
|
||||||
[nodebb.admin-manage-uploads]
|
|
||||||
file_filter = public/language/<lang>/admin/manage/uploads.json
|
|
||||||
source_file = public/language/en-GB/admin/manage/uploads.json
|
|
||||||
source_lang = en_GB
|
|
||||||
trans.ar = public/language/ar/admin/manage/uploads.json
|
|
||||||
trans.bg = public/language/bg/admin/manage/uploads.json
|
|
||||||
trans.bn = public/language/bn/admin/manage/uploads.json
|
|
||||||
trans.cs = public/language/cs/admin/manage/uploads.json
|
|
||||||
trans.da = public/language/da/admin/manage/uploads.json
|
|
||||||
trans.de = public/language/de/admin/manage/uploads.json
|
|
||||||
trans.el = public/language/el/admin/manage/uploads.json
|
|
||||||
trans.en@pirate = public/language/en-x-pirate/admin/manage/uploads.json
|
|
||||||
trans.en_US = public/language/en-US/admin/manage/uploads.json
|
|
||||||
trans.es = public/language/es/admin/manage/uploads.json
|
|
||||||
trans.et = public/language/et/admin/manage/uploads.json
|
|
||||||
trans.fa_IR = public/language/fa-IR/admin/manage/uploads.json
|
|
||||||
trans.fi = public/language/fi/admin/manage/uploads.json
|
|
||||||
trans.fr = public/language/fr/admin/manage/uploads.json
|
|
||||||
trans.gl = public/language/gl/admin/manage/uploads.json
|
|
||||||
trans.he = public/language/he/admin/manage/uploads.json
|
|
||||||
trans.hr = public/language/hr/admin/manage/uploads.json
|
|
||||||
trans.hu = public/language/hu/admin/manage/uploads.json
|
|
||||||
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
|
|
||||||
trans.ko = public/language/ko/admin/manage/uploads.json
|
|
||||||
trans.lt = public/language/lt/admin/manage/uploads.json
|
|
||||||
trans.lv = public/language/lv/admin/manage/uploads.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/uploads.json
|
|
||||||
trans.nb = public/language/nb/admin/manage/uploads.json
|
|
||||||
trans.nl = public/language/nl/admin/manage/uploads.json
|
|
||||||
trans.pl = public/language/pl/admin/manage/uploads.json
|
|
||||||
trans.pt_BR = public/language/pt-BR/admin/manage/uploads.json
|
|
||||||
trans.pt_PT = public/language/pt-PT/admin/manage/uploads.json
|
|
||||||
trans.ro = public/language/ro/admin/manage/uploads.json
|
|
||||||
trans.ru = public/language/ru/admin/manage/uploads.json
|
|
||||||
trans.rw = public/language/rw/admin/manage/uploads.json
|
|
||||||
trans.sc = public/language/sc/admin/manage/uploads.json
|
|
||||||
trans.sk = public/language/sk/admin/manage/uploads.json
|
|
||||||
trans.sl = public/language/sl/admin/manage/uploads.json
|
|
||||||
trans.sr = public/language/sr/admin/manage/uploads.json
|
|
||||||
trans.sv = public/language/sv/admin/manage/uploads.json
|
|
||||||
trans.th = public/language/th/admin/manage/uploads.json
|
|
||||||
trans.tr = public/language/tr/admin/manage/uploads.json
|
|
||||||
trans.uk = public/language/uk/admin/manage/uploads.json
|
|
||||||
trans.vi = public/language/vi/admin/manage/uploads.json
|
|
||||||
trans.zh_CN = public/language/zh-CN/admin/manage/uploads.json
|
|
||||||
trans.zh_TW = public/language/zh-TW/admin/manage/uploads.json
|
|
||||||
type = KEYVALUEJSON
|
|
||||||
|
|
||||||
[nodebb.admin-manage-users]
|
[nodebb.admin-manage-users]
|
||||||
file_filter = public/language/<lang>/admin/manage/users.json
|
file_filter = public/language/<lang>/admin/manage/users.json
|
||||||
source_file = public/language/en-GB/admin/manage/users.json
|
source_file = public/language/en-GB/admin/manage/users.json
|
||||||
@@ -2627,7 +2428,6 @@ trans.it = public/language/it/admin/manage/users.json
|
|||||||
trans.ja = public/language/ja/admin/manage/users.json
|
trans.ja = public/language/ja/admin/manage/users.json
|
||||||
trans.ko = public/language/ko/admin/manage/users.json
|
trans.ko = public/language/ko/admin/manage/users.json
|
||||||
trans.lt = public/language/lt/admin/manage/users.json
|
trans.lt = public/language/lt/admin/manage/users.json
|
||||||
trans.lv = public/language/lv/admin/manage/users.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/users.json
|
trans.ms = public/language/ms/admin/manage/users.json
|
||||||
trans.nb = public/language/nb/admin/manage/users.json
|
trans.nb = public/language/nb/admin/manage/users.json
|
||||||
trans.nl = public/language/nl/admin/manage/users.json
|
trans.nl = public/language/nl/admin/manage/users.json
|
||||||
@@ -2650,56 +2450,6 @@ trans.zh_CN = public/language/zh-CN/admin/manage/users.json
|
|||||||
trans.zh_TW = public/language/zh-TW/admin/manage/users.json
|
trans.zh_TW = public/language/zh-TW/admin/manage/users.json
|
||||||
type = KEYVALUEJSON
|
type = KEYVALUEJSON
|
||||||
|
|
||||||
[nodebb.admin-manage-digest]
|
|
||||||
file_filter = public/language/<lang>/admin/manage/digest.json
|
|
||||||
source_file = public/language/en-GB/admin/manage/digest.json
|
|
||||||
source_lang = en_GB
|
|
||||||
trans.ar = public/language/ar/admin/manage/digest.json
|
|
||||||
trans.bg = public/language/bg/admin/manage/digest.json
|
|
||||||
trans.bn = public/language/bn/admin/manage/digest.json
|
|
||||||
trans.cs = public/language/cs/admin/manage/digest.json
|
|
||||||
trans.da = public/language/da/admin/manage/digest.json
|
|
||||||
trans.de = public/language/de/admin/manage/digest.json
|
|
||||||
trans.el = public/language/el/admin/manage/digest.json
|
|
||||||
trans.en@pirate = public/language/en-x-pirate/admin/manage/digest.json
|
|
||||||
trans.en_US = public/language/en-US/admin/manage/digest.json
|
|
||||||
trans.es = public/language/es/admin/manage/digest.json
|
|
||||||
trans.et = public/language/et/admin/manage/digest.json
|
|
||||||
trans.fa_IR = public/language/fa-IR/admin/manage/digest.json
|
|
||||||
trans.fi = public/language/fi/admin/manage/digest.json
|
|
||||||
trans.fr = public/language/fr/admin/manage/digest.json
|
|
||||||
trans.gl = public/language/gl/admin/manage/digest.json
|
|
||||||
trans.he = public/language/he/admin/manage/digest.json
|
|
||||||
trans.hr = public/language/hr/admin/manage/digest.json
|
|
||||||
trans.hu = public/language/hu/admin/manage/digest.json
|
|
||||||
trans.id = public/language/id/admin/manage/digest.json
|
|
||||||
trans.it = public/language/it/admin/manage/digest.json
|
|
||||||
trans.ja = public/language/ja/admin/manage/digest.json
|
|
||||||
trans.ko = public/language/ko/admin/manage/digest.json
|
|
||||||
trans.lt = public/language/lt/admin/manage/digest.json
|
|
||||||
trans.lv = public/language/lv/admin/manage/digest.json
|
|
||||||
trans.ms = public/language/ms/admin/manage/digest.json
|
|
||||||
trans.nb = public/language/nb/admin/manage/digest.json
|
|
||||||
trans.nl = public/language/nl/admin/manage/digest.json
|
|
||||||
trans.pl = public/language/pl/admin/manage/digest.json
|
|
||||||
trans.pt_BR = public/language/pt-BR/admin/manage/digest.json
|
|
||||||
trans.pt_PT = public/language/pt-PT/admin/manage/digest.json
|
|
||||||
trans.ro = public/language/ro/admin/manage/digest.json
|
|
||||||
trans.ru = public/language/ru/admin/manage/digest.json
|
|
||||||
trans.rw = public/language/rw/admin/manage/digest.json
|
|
||||||
trans.sc = public/language/sc/admin/manage/digest.json
|
|
||||||
trans.sk = public/language/sk/admin/manage/digest.json
|
|
||||||
trans.sl = public/language/sl/admin/manage/digest.json
|
|
||||||
trans.sr = public/language/sr/admin/manage/digest.json
|
|
||||||
trans.sv = public/language/sv/admin/manage/digest.json
|
|
||||||
trans.th = public/language/th/admin/manage/digest.json
|
|
||||||
trans.tr = public/language/tr/admin/manage/digest.json
|
|
||||||
trans.uk = public/language/uk/admin/manage/digest.json
|
|
||||||
trans.vi = public/language/vi/admin/manage/digest.json
|
|
||||||
trans.zh_CN = public/language/zh-CN/admin/manage/digest.json
|
|
||||||
trans.zh_TW = public/language/zh-TW/admin/manage/digest.json
|
|
||||||
type = KEYVALUEJSON
|
|
||||||
|
|
||||||
[nodebb.admin-settings-advanced]
|
[nodebb.admin-settings-advanced]
|
||||||
file_filter = public/language/<lang>/admin/settings/advanced.json
|
file_filter = public/language/<lang>/admin/settings/advanced.json
|
||||||
source_file = public/language/en-GB/admin/settings/advanced.json
|
source_file = public/language/en-GB/admin/settings/advanced.json
|
||||||
@@ -2727,7 +2477,6 @@ trans.it = public/language/it/admin/settings/advanced.json
|
|||||||
trans.ja = public/language/ja/admin/settings/advanced.json
|
trans.ja = public/language/ja/admin/settings/advanced.json
|
||||||
trans.ko = public/language/ko/admin/settings/advanced.json
|
trans.ko = public/language/ko/admin/settings/advanced.json
|
||||||
trans.lt = public/language/lt/admin/settings/advanced.json
|
trans.lt = public/language/lt/admin/settings/advanced.json
|
||||||
trans.lv = public/language/lv/admin/settings/advanced.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/advanced.json
|
trans.ms = public/language/ms/admin/settings/advanced.json
|
||||||
trans.nb = public/language/nb/admin/settings/advanced.json
|
trans.nb = public/language/nb/admin/settings/advanced.json
|
||||||
trans.nl = public/language/nl/admin/settings/advanced.json
|
trans.nl = public/language/nl/admin/settings/advanced.json
|
||||||
@@ -2777,7 +2526,6 @@ trans.it = public/language/it/admin/settings/cookies.json
|
|||||||
trans.ja = public/language/ja/admin/settings/cookies.json
|
trans.ja = public/language/ja/admin/settings/cookies.json
|
||||||
trans.ko = public/language/ko/admin/settings/cookies.json
|
trans.ko = public/language/ko/admin/settings/cookies.json
|
||||||
trans.lt = public/language/lt/admin/settings/cookies.json
|
trans.lt = public/language/lt/admin/settings/cookies.json
|
||||||
trans.lv = public/language/lv/admin/settings/cookies.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/cookies.json
|
trans.ms = public/language/ms/admin/settings/cookies.json
|
||||||
trans.nb = public/language/nb/admin/settings/cookies.json
|
trans.nb = public/language/nb/admin/settings/cookies.json
|
||||||
trans.nl = public/language/nl/admin/settings/cookies.json
|
trans.nl = public/language/nl/admin/settings/cookies.json
|
||||||
@@ -2827,7 +2575,6 @@ trans.it = public/language/it/admin/settings/general.json
|
|||||||
trans.ja = public/language/ja/admin/settings/general.json
|
trans.ja = public/language/ja/admin/settings/general.json
|
||||||
trans.ko = public/language/ko/admin/settings/general.json
|
trans.ko = public/language/ko/admin/settings/general.json
|
||||||
trans.lt = public/language/lt/admin/settings/general.json
|
trans.lt = public/language/lt/admin/settings/general.json
|
||||||
trans.lv = public/language/lv/admin/settings/general.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/general.json
|
trans.ms = public/language/ms/admin/settings/general.json
|
||||||
trans.nb = public/language/nb/admin/settings/general.json
|
trans.nb = public/language/nb/admin/settings/general.json
|
||||||
trans.nl = public/language/nl/admin/settings/general.json
|
trans.nl = public/language/nl/admin/settings/general.json
|
||||||
@@ -2877,7 +2624,6 @@ trans.it = public/language/it/admin/settings/guest.json
|
|||||||
trans.ja = public/language/ja/admin/settings/guest.json
|
trans.ja = public/language/ja/admin/settings/guest.json
|
||||||
trans.ko = public/language/ko/admin/settings/guest.json
|
trans.ko = public/language/ko/admin/settings/guest.json
|
||||||
trans.lt = public/language/lt/admin/settings/guest.json
|
trans.lt = public/language/lt/admin/settings/guest.json
|
||||||
trans.lv = public/language/lv/admin/settings/guest.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/guest.json
|
trans.ms = public/language/ms/admin/settings/guest.json
|
||||||
trans.nb = public/language/nb/admin/settings/guest.json
|
trans.nb = public/language/nb/admin/settings/guest.json
|
||||||
trans.nl = public/language/nl/admin/settings/guest.json
|
trans.nl = public/language/nl/admin/settings/guest.json
|
||||||
@@ -2927,7 +2673,6 @@ trans.it = public/language/it/admin/settings/pagination.json
|
|||||||
trans.ja = public/language/ja/admin/settings/pagination.json
|
trans.ja = public/language/ja/admin/settings/pagination.json
|
||||||
trans.ko = public/language/ko/admin/settings/pagination.json
|
trans.ko = public/language/ko/admin/settings/pagination.json
|
||||||
trans.lt = public/language/lt/admin/settings/pagination.json
|
trans.lt = public/language/lt/admin/settings/pagination.json
|
||||||
trans.lv = public/language/lv/admin/settings/pagination.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/pagination.json
|
trans.ms = public/language/ms/admin/settings/pagination.json
|
||||||
trans.nb = public/language/nb/admin/settings/pagination.json
|
trans.nb = public/language/nb/admin/settings/pagination.json
|
||||||
trans.nl = public/language/nl/admin/settings/pagination.json
|
trans.nl = public/language/nl/admin/settings/pagination.json
|
||||||
@@ -2977,7 +2722,6 @@ trans.it = public/language/it/admin/settings/reputation.json
|
|||||||
trans.ja = public/language/ja/admin/settings/reputation.json
|
trans.ja = public/language/ja/admin/settings/reputation.json
|
||||||
trans.ko = public/language/ko/admin/settings/reputation.json
|
trans.ko = public/language/ko/admin/settings/reputation.json
|
||||||
trans.lt = public/language/lt/admin/settings/reputation.json
|
trans.lt = public/language/lt/admin/settings/reputation.json
|
||||||
trans.lv = public/language/lv/admin/settings/reputation.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/reputation.json
|
trans.ms = public/language/ms/admin/settings/reputation.json
|
||||||
trans.nb = public/language/nb/admin/settings/reputation.json
|
trans.nb = public/language/nb/admin/settings/reputation.json
|
||||||
trans.nl = public/language/nl/admin/settings/reputation.json
|
trans.nl = public/language/nl/admin/settings/reputation.json
|
||||||
@@ -3027,7 +2771,6 @@ trans.it = public/language/it/admin/settings/tags.json
|
|||||||
trans.ja = public/language/ja/admin/settings/tags.json
|
trans.ja = public/language/ja/admin/settings/tags.json
|
||||||
trans.ko = public/language/ko/admin/settings/tags.json
|
trans.ko = public/language/ko/admin/settings/tags.json
|
||||||
trans.lt = public/language/lt/admin/settings/tags.json
|
trans.lt = public/language/lt/admin/settings/tags.json
|
||||||
trans.lv = public/language/lv/admin/settings/tags.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/tags.json
|
trans.ms = public/language/ms/admin/settings/tags.json
|
||||||
trans.nb = public/language/nb/admin/settings/tags.json
|
trans.nb = public/language/nb/admin/settings/tags.json
|
||||||
trans.nl = public/language/nl/admin/settings/tags.json
|
trans.nl = public/language/nl/admin/settings/tags.json
|
||||||
@@ -3077,7 +2820,6 @@ trans.it = public/language/it/admin/settings/user.json
|
|||||||
trans.ja = public/language/ja/admin/settings/user.json
|
trans.ja = public/language/ja/admin/settings/user.json
|
||||||
trans.ko = public/language/ko/admin/settings/user.json
|
trans.ko = public/language/ko/admin/settings/user.json
|
||||||
trans.lt = public/language/lt/admin/settings/user.json
|
trans.lt = public/language/lt/admin/settings/user.json
|
||||||
trans.lv = public/language/lv/admin/settings/user.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/user.json
|
trans.ms = public/language/ms/admin/settings/user.json
|
||||||
trans.nb = public/language/nb/admin/settings/user.json
|
trans.nb = public/language/nb/admin/settings/user.json
|
||||||
trans.nl = public/language/nl/admin/settings/user.json
|
trans.nl = public/language/nl/admin/settings/user.json
|
||||||
@@ -3127,7 +2869,6 @@ trans.it = public/language/it/admin/settings/chat.json
|
|||||||
trans.ja = public/language/ja/admin/settings/chat.json
|
trans.ja = public/language/ja/admin/settings/chat.json
|
||||||
trans.ko = public/language/ko/admin/settings/chat.json
|
trans.ko = public/language/ko/admin/settings/chat.json
|
||||||
trans.lt = public/language/lt/admin/settings/chat.json
|
trans.lt = public/language/lt/admin/settings/chat.json
|
||||||
trans.lv = public/language/lv/admin/settings/chat.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/chat.json
|
trans.ms = public/language/ms/admin/settings/chat.json
|
||||||
trans.nb = public/language/nb/admin/settings/chat.json
|
trans.nb = public/language/nb/admin/settings/chat.json
|
||||||
trans.nl = public/language/nl/admin/settings/chat.json
|
trans.nl = public/language/nl/admin/settings/chat.json
|
||||||
@@ -3177,7 +2918,6 @@ trans.it = public/language/it/admin/settings/email.json
|
|||||||
trans.ja = public/language/ja/admin/settings/email.json
|
trans.ja = public/language/ja/admin/settings/email.json
|
||||||
trans.ko = public/language/ko/admin/settings/email.json
|
trans.ko = public/language/ko/admin/settings/email.json
|
||||||
trans.lt = public/language/lt/admin/settings/email.json
|
trans.lt = public/language/lt/admin/settings/email.json
|
||||||
trans.lv = public/language/lv/admin/settings/email.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/email.json
|
trans.ms = public/language/ms/admin/settings/email.json
|
||||||
trans.nb = public/language/nb/admin/settings/email.json
|
trans.nb = public/language/nb/admin/settings/email.json
|
||||||
trans.nl = public/language/nl/admin/settings/email.json
|
trans.nl = public/language/nl/admin/settings/email.json
|
||||||
@@ -3227,7 +2967,6 @@ trans.it = public/language/it/admin/settings/group.json
|
|||||||
trans.ja = public/language/ja/admin/settings/group.json
|
trans.ja = public/language/ja/admin/settings/group.json
|
||||||
trans.ko = public/language/ko/admin/settings/group.json
|
trans.ko = public/language/ko/admin/settings/group.json
|
||||||
trans.lt = public/language/lt/admin/settings/group.json
|
trans.lt = public/language/lt/admin/settings/group.json
|
||||||
trans.lv = public/language/lv/admin/settings/group.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/group.json
|
trans.ms = public/language/ms/admin/settings/group.json
|
||||||
trans.nb = public/language/nb/admin/settings/group.json
|
trans.nb = public/language/nb/admin/settings/group.json
|
||||||
trans.nl = public/language/nl/admin/settings/group.json
|
trans.nl = public/language/nl/admin/settings/group.json
|
||||||
@@ -3277,7 +3016,6 @@ trans.it = public/language/it/admin/settings/notifications.json
|
|||||||
trans.ja = public/language/ja/admin/settings/notifications.json
|
trans.ja = public/language/ja/admin/settings/notifications.json
|
||||||
trans.ko = public/language/ko/admin/settings/notifications.json
|
trans.ko = public/language/ko/admin/settings/notifications.json
|
||||||
trans.lt = public/language/lt/admin/settings/notifications.json
|
trans.lt = public/language/lt/admin/settings/notifications.json
|
||||||
trans.lv = public/language/lv/admin/settings/notifications.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/notifications.json
|
trans.ms = public/language/ms/admin/settings/notifications.json
|
||||||
trans.nb = public/language/nb/admin/settings/notifications.json
|
trans.nb = public/language/nb/admin/settings/notifications.json
|
||||||
trans.nl = public/language/nl/admin/settings/notifications.json
|
trans.nl = public/language/nl/admin/settings/notifications.json
|
||||||
@@ -3327,7 +3065,6 @@ trans.it = public/language/it/admin/settings/post.json
|
|||||||
trans.ja = public/language/ja/admin/settings/post.json
|
trans.ja = public/language/ja/admin/settings/post.json
|
||||||
trans.ko = public/language/ko/admin/settings/post.json
|
trans.ko = public/language/ko/admin/settings/post.json
|
||||||
trans.lt = public/language/lt/admin/settings/post.json
|
trans.lt = public/language/lt/admin/settings/post.json
|
||||||
trans.lv = public/language/lv/admin/settings/post.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/post.json
|
trans.ms = public/language/ms/admin/settings/post.json
|
||||||
trans.nb = public/language/nb/admin/settings/post.json
|
trans.nb = public/language/nb/admin/settings/post.json
|
||||||
trans.nl = public/language/nl/admin/settings/post.json
|
trans.nl = public/language/nl/admin/settings/post.json
|
||||||
@@ -3377,7 +3114,6 @@ trans.it = public/language/it/admin/settings/sockets.json
|
|||||||
trans.ja = public/language/ja/admin/settings/sockets.json
|
trans.ja = public/language/ja/admin/settings/sockets.json
|
||||||
trans.ko = public/language/ko/admin/settings/sockets.json
|
trans.ko = public/language/ko/admin/settings/sockets.json
|
||||||
trans.lt = public/language/lt/admin/settings/sockets.json
|
trans.lt = public/language/lt/admin/settings/sockets.json
|
||||||
trans.lv = public/language/lv/admin/settings/sockets.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/sockets.json
|
trans.ms = public/language/ms/admin/settings/sockets.json
|
||||||
trans.nb = public/language/nb/admin/settings/sockets.json
|
trans.nb = public/language/nb/admin/settings/sockets.json
|
||||||
trans.nl = public/language/nl/admin/settings/sockets.json
|
trans.nl = public/language/nl/admin/settings/sockets.json
|
||||||
@@ -3427,7 +3163,6 @@ trans.it = public/language/it/admin/settings/uploads.json
|
|||||||
trans.ja = public/language/ja/admin/settings/uploads.json
|
trans.ja = public/language/ja/admin/settings/uploads.json
|
||||||
trans.ko = public/language/ko/admin/settings/uploads.json
|
trans.ko = public/language/ko/admin/settings/uploads.json
|
||||||
trans.lt = public/language/lt/admin/settings/uploads.json
|
trans.lt = public/language/lt/admin/settings/uploads.json
|
||||||
trans.lv = public/language/lv/admin/settings/uploads.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/uploads.json
|
trans.ms = public/language/ms/admin/settings/uploads.json
|
||||||
trans.nb = public/language/nb/admin/settings/uploads.json
|
trans.nb = public/language/nb/admin/settings/uploads.json
|
||||||
trans.nl = public/language/nl/admin/settings/uploads.json
|
trans.nl = public/language/nl/admin/settings/uploads.json
|
||||||
@@ -3477,7 +3212,6 @@ trans.it = public/language/it/admin/settings/web-crawler.json
|
|||||||
trans.ja = public/language/ja/admin/settings/web-crawler.json
|
trans.ja = public/language/ja/admin/settings/web-crawler.json
|
||||||
trans.ko = public/language/ko/admin/settings/web-crawler.json
|
trans.ko = public/language/ko/admin/settings/web-crawler.json
|
||||||
trans.lt = public/language/lt/admin/settings/web-crawler.json
|
trans.lt = public/language/lt/admin/settings/web-crawler.json
|
||||||
trans.lv = public/language/lv/admin/settings/web-crawler.json
|
|
||||||
trans.ms = public/language/ms/admin/settings/web-crawler.json
|
trans.ms = public/language/ms/admin/settings/web-crawler.json
|
||||||
trans.nb = public/language/nb/admin/settings/web-crawler.json
|
trans.nb = public/language/nb/admin/settings/web-crawler.json
|
||||||
trans.nl = public/language/nl/admin/settings/web-crawler.json
|
trans.nl = public/language/nl/admin/settings/web-crawler.json
|
||||||
|
|||||||
1440
CHANGELOG.md
15
Dockerfile
@@ -1,23 +1,20 @@
|
|||||||
FROM node:lts
|
# The base image is the latest 8.x node (LTS)
|
||||||
|
FROM node:8.9.0
|
||||||
|
|
||||||
RUN mkdir -p /usr/src/app
|
RUN mkdir -p /usr/src/app
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
ARG NODE_ENV
|
ARG NODE_ENV
|
||||||
ENV NODE_ENV $NODE_ENV
|
ENV NODE_ENV $NODE_ENV
|
||||||
|
COPY package.default.json /usr/src/app/package.json
|
||||||
COPY install/package.json /usr/src/app/package.json
|
RUN npm install && npm cache clean --force
|
||||||
|
|
||||||
RUN npm install --only=prod && \
|
|
||||||
npm cache clean --force
|
|
||||||
|
|
||||||
COPY . /usr/src/app
|
COPY . /usr/src/app
|
||||||
|
|
||||||
ENV NODE_ENV=production \
|
ENV NODE_ENV=production \
|
||||||
daemon=false \
|
daemon=false \
|
||||||
silent=false
|
silent=false
|
||||||
|
|
||||||
EXPOSE 4567
|
|
||||||
|
|
||||||
CMD ./nodebb start
|
CMD ./nodebb start
|
||||||
|
|
||||||
|
# the default port for NodeBB is exposed outside the container
|
||||||
|
EXPOSE 4567
|
||||||
220
Gruntfile.js
@@ -1,7 +1,5 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
var async = require('async');
|
|
||||||
var fork = require('child_process').fork;
|
var fork = require('child_process').fork;
|
||||||
var env = process.env;
|
var env = process.env;
|
||||||
var worker;
|
var worker;
|
||||||
@@ -12,26 +10,6 @@ var running = 0;
|
|||||||
|
|
||||||
env.NODE_ENV = env.NODE_ENV || 'development';
|
env.NODE_ENV = env.NODE_ENV || 'development';
|
||||||
|
|
||||||
|
|
||||||
var nconf = require('nconf');
|
|
||||||
nconf.file({
|
|
||||||
file: 'config.json',
|
|
||||||
});
|
|
||||||
|
|
||||||
nconf.defaults({
|
|
||||||
base_dir: __dirname,
|
|
||||||
views_dir: './build/public/templates',
|
|
||||||
});
|
|
||||||
var winston = require('winston');
|
|
||||||
winston.configure({
|
|
||||||
transports: [
|
|
||||||
new winston.transports.Console({
|
|
||||||
handleExceptions: true,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
var db = require('./src/database');
|
|
||||||
|
|
||||||
module.exports = function (grunt) {
|
module.exports = function (grunt) {
|
||||||
var args = [];
|
var args = [];
|
||||||
var initArgs = ['--build'];
|
var initArgs = ['--build'];
|
||||||
@@ -59,7 +37,7 @@ module.exports = function (grunt) {
|
|||||||
// Do nothing, just restart
|
// Do nothing, just restart
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compiling && !incomplete.includes(compiling)) {
|
if (compiling && incomplete.indexOf(compiling) === -1) {
|
||||||
incomplete.push(compiling);
|
incomplete.push(compiling);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,116 +70,80 @@ module.exports = function (grunt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
watch: {},
|
watch: {
|
||||||
|
lessUpdated_Client: {
|
||||||
|
files: [
|
||||||
|
'public/less/*.less',
|
||||||
|
'!public/less/admin/**/*.less',
|
||||||
|
'node_modules/nodebb-*/**/*.less',
|
||||||
|
'!node_modules/nodebb-*/node_modules/**',
|
||||||
|
'!node_modules/nodebb-*/.git/**',
|
||||||
|
],
|
||||||
|
options: {
|
||||||
|
interval: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
lessUpdated_Admin: {
|
||||||
|
files: [
|
||||||
|
'public/less/admin/**/*.less',
|
||||||
|
'node_modules/nodebb-*/**/*.less',
|
||||||
|
'!node_modules/nodebb-*/node_modules/**',
|
||||||
|
'!node_modules/nodebb-*/.git/**',
|
||||||
|
],
|
||||||
|
options: {
|
||||||
|
interval: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
clientUpdated: {
|
||||||
|
files: [
|
||||||
|
'public/src/**/*.js',
|
||||||
|
'node_modules/nodebb-*/**/*.js',
|
||||||
|
'!node_modules/nodebb-*/node_modules/**',
|
||||||
|
'node_modules/benchpressjs/build/benchpress.js',
|
||||||
|
'!node_modules/nodebb-*/.git/**',
|
||||||
|
],
|
||||||
|
options: {
|
||||||
|
interval: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
serverUpdated: {
|
||||||
|
files: ['*.js', 'install/*.js', 'src/**/*.js'],
|
||||||
|
options: {
|
||||||
|
interval: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
templatesUpdated: {
|
||||||
|
files: [
|
||||||
|
'src/views/**/*.tpl',
|
||||||
|
'node_modules/nodebb-*/**/*.tpl',
|
||||||
|
'!node_modules/nodebb-*/node_modules/**',
|
||||||
|
'!node_modules/nodebb-*/.git/**',
|
||||||
|
],
|
||||||
|
options: {
|
||||||
|
interval: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
langUpdated: {
|
||||||
|
files: [
|
||||||
|
'public/language/en-GB/*.json',
|
||||||
|
'public/language/en-GB/**/*.json',
|
||||||
|
'node_modules/nodebb-*/**/*.json',
|
||||||
|
'!node_modules/nodebb-*/node_modules/**',
|
||||||
|
'!node_modules/nodebb-*/.git/**',
|
||||||
|
'!node_modules/nodebb-*/plugin.json',
|
||||||
|
'!node_modules/nodebb-*/package.json',
|
||||||
|
'!node_modules/nodebb-*/theme.json',
|
||||||
|
],
|
||||||
|
options: {
|
||||||
|
interval: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||||
|
|
||||||
grunt.registerTask('default', ['watch']);
|
grunt.registerTask('default', ['watch']);
|
||||||
|
|
||||||
grunt.registerTask('init', function () {
|
|
||||||
var done = this.async();
|
|
||||||
async.waterfall([
|
|
||||||
function (next) {
|
|
||||||
db.init(next);
|
|
||||||
},
|
|
||||||
function (next) {
|
|
||||||
db.getSortedSetRange('plugins:active', 0, -1, next);
|
|
||||||
},
|
|
||||||
function (plugins, next) {
|
|
||||||
addBaseThemes(plugins, next);
|
|
||||||
},
|
|
||||||
function (plugins, next) {
|
|
||||||
if (!plugins.includes('nodebb-plugin-composer-default')) {
|
|
||||||
plugins.push('nodebb-plugin-composer-default');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.argv.includes('--core')) {
|
|
||||||
plugins = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const lessUpdated_Client = plugins.map(p => 'node_modules/' + p + '/**/*.less');
|
|
||||||
const lessUpdated_Admin = plugins.map(p => 'node_modules/' + p + '/**/*.less');
|
|
||||||
const clientUpdated = plugins.map(p => 'node_modules/' + p + '/**/*.js');
|
|
||||||
const templatesUpdated = plugins.map(p => 'node_modules/' + p + '/**/*.tpl');
|
|
||||||
const langUpdated = plugins.map(p => 'node_modules/' + p + '/**/*.json');
|
|
||||||
|
|
||||||
grunt.config(['watch'], {
|
|
||||||
lessUpdated_Client: {
|
|
||||||
files: [
|
|
||||||
'public/less/*.less',
|
|
||||||
'!public/less/admin/**/*.less',
|
|
||||||
...lessUpdated_Client,
|
|
||||||
'!node_modules/nodebb-*/node_modules/**',
|
|
||||||
'!node_modules/nodebb-*/.git/**',
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
interval: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
lessUpdated_Admin: {
|
|
||||||
files: [
|
|
||||||
'public/less/admin/**/*.less',
|
|
||||||
...lessUpdated_Admin,
|
|
||||||
'!node_modules/nodebb-*/node_modules/**',
|
|
||||||
'!node_modules/nodebb-*/.git/**',
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
interval: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
clientUpdated: {
|
|
||||||
files: [
|
|
||||||
'public/src/**/*.js',
|
|
||||||
...clientUpdated,
|
|
||||||
'!node_modules/nodebb-*/node_modules/**',
|
|
||||||
'node_modules/benchpressjs/build/benchpress.js',
|
|
||||||
'!node_modules/nodebb-*/.git/**',
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
interval: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
serverUpdated: {
|
|
||||||
files: ['*.js', 'install/*.js', 'src/**/*.js', '!src/upgrades/**'],
|
|
||||||
options: {
|
|
||||||
interval: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
templatesUpdated: {
|
|
||||||
files: [
|
|
||||||
'src/views/**/*.tpl',
|
|
||||||
...templatesUpdated,
|
|
||||||
'!node_modules/nodebb-*/node_modules/**',
|
|
||||||
'!node_modules/nodebb-*/.git/**',
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
interval: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
langUpdated: {
|
|
||||||
files: [
|
|
||||||
'public/language/en-GB/*.json',
|
|
||||||
'public/language/en-GB/**/*.json',
|
|
||||||
...langUpdated,
|
|
||||||
'!node_modules/nodebb-*/node_modules/**',
|
|
||||||
'!node_modules/nodebb-*/.git/**',
|
|
||||||
'!node_modules/nodebb-*/plugin.json',
|
|
||||||
'!node_modules/nodebb-*/package.json',
|
|
||||||
'!node_modules/nodebb-*/theme.json',
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
interval: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
next();
|
|
||||||
},
|
|
||||||
], done);
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.task.run('init');
|
|
||||||
|
|
||||||
env.NODE_ENV = 'development';
|
env.NODE_ENV = 'development';
|
||||||
|
|
||||||
if (grunt.option('skip')) {
|
if (grunt.option('skip')) {
|
||||||
@@ -222,25 +164,3 @@ module.exports = function (grunt) {
|
|||||||
|
|
||||||
grunt.event.on('watch', update);
|
grunt.event.on('watch', update);
|
||||||
};
|
};
|
||||||
|
|
||||||
function addBaseThemes(plugins, callback) {
|
|
||||||
const themeId = plugins.find(p => p.startsWith('nodebb-theme-'));
|
|
||||||
if (!themeId) {
|
|
||||||
return setImmediate(callback, null, plugins);
|
|
||||||
}
|
|
||||||
function getBaseRecursive(themeId) {
|
|
||||||
try {
|
|
||||||
const baseTheme = require(themeId + '/theme').baseTheme;
|
|
||||||
|
|
||||||
if (baseTheme) {
|
|
||||||
plugins.push(baseTheme);
|
|
||||||
getBaseRecursive(baseTheme);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getBaseRecursive(themeId);
|
|
||||||
callback(null, plugins);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
# <img alt="NodeBB" src="http://i.imgur.com/mYxPPtB.png" />
|
# <img alt="NodeBB" src="http://i.imgur.com/mYxPPtB.png" />
|
||||||
|
|
||||||
|
[](https://gitter.im/NodeBB/NodeBB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](https://travis-ci.org/NodeBB/NodeBB)
|
[](https://travis-ci.org/NodeBB/NodeBB)
|
||||||
[](https://coveralls.io/github/NodeBB/NodeBB?branch=master)
|
[](https://coveralls.io/github/NodeBB/NodeBB?branch=master)
|
||||||
[](https://david-dm.org/nodebb/nodebb?path=install)
|
[](https://david-dm.org/nodebb/nodebb)
|
||||||
[](https://codeclimate.com/github/NodeBB/NodeBB)
|
[](https://codeclimate.com/github/NodeBB/NodeBB)
|
||||||
|
[](https://readthedocs.org/projects/nodebb/?badge=latest)
|
||||||
|
|
||||||
[**NodeBB Forum Software**](https://nodebb.org) is powered by Node.js and built on either a Redis or MongoDB database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB has many modern features out of the box such as social network integration and streaming discussions, while still making sure to be compatible with older browsers.
|
[**NodeBB Forum Software**](https://nodebb.org) is powered by Node.js and built on either a Redis or MongoDB database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB has many modern features out of the box such as social network integration and streaming discussions, while still making sure to be compatible with older browsers.
|
||||||
|
|
||||||
@@ -40,7 +42,7 @@ Our minimalist "Persona" theme gets you going right away, no coding experience r
|
|||||||
## How can I follow along/contribute?
|
## How can I follow along/contribute?
|
||||||
|
|
||||||
* If you are a developer, feel free to check out the source and submit pull requests. We also have a wide array of [plugins](http://community.nodebb.org/category/7/nodebb-plugins) which would be a great starting point for learning the codebase.
|
* If you are a developer, feel free to check out the source and submit pull requests. We also have a wide array of [plugins](http://community.nodebb.org/category/7/nodebb-plugins) which would be a great starting point for learning the codebase.
|
||||||
* If you are a designer, [NodeBB needs themes](http://community.nodebb.org/category/10/nodebb-themes)! NodeBB's theming system allows extension of the base templates as well as styling via LESS or CSS. NodeBB's base theme utilizes [Bootstrap 3](http://getbootstrap.com/) but themes can choose to use a different framework altogether.
|
* If you are a designer, [NodeBB needs themes](http://community.nodebb.org/category/10/nodebb-themes)! NodeBB's theming system allows extention of the base templates as well as styling via LESS or CSS. NodeBB's base theme utilizes [Bootstrap 3](http://getbootstrap.com/) but themes can choose to use a different framework altogether.
|
||||||
* If you know languages other than English you can help us translate NodeBB. We use [Transifex](https://www.transifex.com/projects/p/nodebb/) for internationalization.
|
* If you know languages other than English you can help us translate NodeBB. We use [Transifex](https://www.transifex.com/projects/p/nodebb/) for internationalization.
|
||||||
* Please don't forget to **like**, **follow**, and **star our repo**! Join our growing [community](http://community.nodebb.org) to keep up to date with the latest NodeBB development.
|
* Please don't forget to **like**, **follow**, and **star our repo**! Join our growing [community](http://community.nodebb.org) to keep up to date with the latest NodeBB development.
|
||||||
|
|
||||||
@@ -48,7 +50,7 @@ Our minimalist "Persona" theme gets you going right away, no coding experience r
|
|||||||
|
|
||||||
NodeBB requires the following software to be installed:
|
NodeBB requires the following software to be installed:
|
||||||
|
|
||||||
* A version of Node.js at least 8 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
|
* A version of Node.js at least 6 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
|
||||||
* Redis, version 2.8.9 or greater **or** MongoDB, version 2.6 or greater
|
* Redis, version 2.8.9 or greater **or** MongoDB, version 2.6 or greater
|
||||||
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)
|
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)
|
||||||
|
|
||||||
|
|||||||
283
app.js
@@ -19,30 +19,67 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
require('./require-main');
|
if (require.main !== module) {
|
||||||
|
require.main.require = function (path) {
|
||||||
|
return require(path);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
nconf.argv().env({
|
nconf.argv().env({
|
||||||
separator: '__',
|
separator: '__',
|
||||||
});
|
});
|
||||||
|
|
||||||
const winston = require('winston');
|
var url = require('url');
|
||||||
const path = require('path');
|
var async = require('async');
|
||||||
|
var winston = require('winston');
|
||||||
const file = require('./src/file');
|
var path = require('path');
|
||||||
|
var pkg = require('./package.json');
|
||||||
|
var file = require('./src/file');
|
||||||
|
var debug = require('./src/meta/debugFork').debugging;
|
||||||
|
|
||||||
global.env = process.env.NODE_ENV || 'production';
|
global.env = process.env.NODE_ENV || 'production';
|
||||||
|
|
||||||
|
winston.remove(winston.transports.Console);
|
||||||
|
winston.add(winston.transports.Console, {
|
||||||
|
colorize: true,
|
||||||
|
timestamp: function () {
|
||||||
|
var date = new Date();
|
||||||
|
return nconf.get('json-logging') ? date.toJSON() : date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 8) + ' [' + global.process.pid + ']';
|
||||||
|
},
|
||||||
|
level: nconf.get('log-level') || (global.env === 'production' ? 'info' : 'verbose'),
|
||||||
|
json: (!!nconf.get('json-logging')),
|
||||||
|
stringify: (!!nconf.get('json-logging')),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
var winstonCommon = require('winston/lib/winston/common');
|
||||||
|
// Override to use real console.log etc for VSCode debugger
|
||||||
|
winston.transports.Console.prototype.log = function (level, message, meta, callback) {
|
||||||
|
const output = winstonCommon.log(Object.assign({}, this, {
|
||||||
|
level,
|
||||||
|
message,
|
||||||
|
meta,
|
||||||
|
}));
|
||||||
|
|
||||||
|
console[level in console ? level : 'log'](output);
|
||||||
|
|
||||||
|
setImmediate(callback, null, true);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Alternate configuration file support
|
// Alternate configuration file support
|
||||||
const configFile = path.resolve(__dirname, nconf.any(['config', 'CONFIG']) || 'config.json');
|
var configFile = path.join(__dirname, '/config.json');
|
||||||
|
|
||||||
const configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database'));
|
if (nconf.get('config')) {
|
||||||
|
configFile = path.resolve(__dirname, nconf.get('config'));
|
||||||
|
}
|
||||||
|
|
||||||
const prestart = require('./src/prestart');
|
var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database'));
|
||||||
prestart.loadConfig(configFile);
|
|
||||||
prestart.setupWinston();
|
loadConfig();
|
||||||
prestart.versionCheck();
|
versionCheck();
|
||||||
winston.verbose('* using configuration stored in: %s', configFile);
|
|
||||||
|
|
||||||
if (!process.send) {
|
if (!process.send) {
|
||||||
// If run using `node app`, log GNU copyright info along with server info
|
// If run using `node app`, log GNU copyright info along with server info
|
||||||
@@ -52,28 +89,224 @@ if (!process.send) {
|
|||||||
winston.info('');
|
winston.info('');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (nconf.get('setup') || nconf.get('install')) {
|
if (nconf.get('setup') || nconf.get('install')) {
|
||||||
require('./src/cli/setup').setup();
|
setup();
|
||||||
} else if (!configExists) {
|
} else if (!configExists) {
|
||||||
require('./install/web').install(nconf.get('port'));
|
require('./install/web').install(nconf.get('port'));
|
||||||
} else if (nconf.get('upgrade')) {
|
} else if (nconf.get('upgrade')) {
|
||||||
require('./src/cli/upgrade').upgrade(true);
|
upgrade();
|
||||||
} else if (nconf.get('reset')) {
|
} else if (nconf.get('reset')) {
|
||||||
require('./src/cli/reset').reset({
|
async.waterfall([
|
||||||
theme: nconf.get('t'),
|
async.apply(require('./src/reset').reset),
|
||||||
plugin: nconf.get('p'),
|
async.apply(require('./src/meta/build').buildAll),
|
||||||
widgets: nconf.get('w'),
|
], function (err) {
|
||||||
settings: nconf.get('s'),
|
process.exit(err ? 1 : 0);
|
||||||
all: nconf.get('a'),
|
|
||||||
});
|
});
|
||||||
} else if (nconf.get('activate')) {
|
} else if (nconf.get('activate')) {
|
||||||
require('./src/cli/manage').activate(nconf.get('activate'));
|
activate();
|
||||||
} else if (nconf.get('plugins')) {
|
} else if (nconf.get('plugins')) {
|
||||||
require('./src/cli/manage').listPlugins();
|
listPlugins();
|
||||||
} else if (nconf.get('build')) {
|
} else if (nconf.get('build')) {
|
||||||
require('./src/cli/manage').build(nconf.get('build'));
|
require('./src/meta/build').build(nconf.get('build'));
|
||||||
} else if (nconf.get('events')) {
|
} else if (nconf.get('events')) {
|
||||||
require('./src/cli/manage').listEvents();
|
async.series([
|
||||||
|
async.apply(require('./src/database').init),
|
||||||
|
async.apply(require('./src/events').output),
|
||||||
|
]);
|
||||||
} else {
|
} else {
|
||||||
require('./src/start').start();
|
require('./src/start').start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadConfig(callback) {
|
||||||
|
winston.verbose('* using configuration stored in: %s', configFile);
|
||||||
|
|
||||||
|
nconf.file({
|
||||||
|
file: configFile,
|
||||||
|
});
|
||||||
|
|
||||||
|
nconf.defaults({
|
||||||
|
base_dir: __dirname,
|
||||||
|
themes_path: path.join(__dirname, 'node_modules'),
|
||||||
|
upload_path: 'public/uploads',
|
||||||
|
views_dir: path.join(__dirname, 'build/public/templates'),
|
||||||
|
version: pkg.version,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!nconf.get('isCluster')) {
|
||||||
|
nconf.set('isPrimary', 'true');
|
||||||
|
nconf.set('isCluster', 'false');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure themes_path is a full filepath
|
||||||
|
nconf.set('themes_path', path.resolve(__dirname, nconf.get('themes_path')));
|
||||||
|
nconf.set('core_templates_path', path.join(__dirname, 'src/views'));
|
||||||
|
nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates'));
|
||||||
|
|
||||||
|
nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path')));
|
||||||
|
|
||||||
|
if (nconf.get('url')) {
|
||||||
|
nconf.set('url_parsed', url.parse(nconf.get('url')));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly cast 'jobsDisabled' as Bool
|
||||||
|
var castAsBool = ['jobsDisabled'];
|
||||||
|
nconf.stores.env.readOnly = false;
|
||||||
|
castAsBool.forEach(function (prop) {
|
||||||
|
var value = nconf.get(prop);
|
||||||
|
if (value) {
|
||||||
|
nconf.set(prop, typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
nconf.stores.env.readOnly = true;
|
||||||
|
|
||||||
|
if (typeof callback === 'function') {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
winston.info('NodeBB Setup Triggered via Command Line');
|
||||||
|
|
||||||
|
var install = require('./src/install');
|
||||||
|
var build = require('./src/meta/build');
|
||||||
|
|
||||||
|
process.stdout.write('\nWelcome to NodeBB!\n');
|
||||||
|
process.stdout.write('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.\n');
|
||||||
|
process.stdout.write('Press enter to accept the default setting (shown in brackets).\n');
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
async.apply(install.setup),
|
||||||
|
async.apply(loadConfig),
|
||||||
|
async.apply(build.buildAll),
|
||||||
|
], function (err, data) {
|
||||||
|
// Disregard build step data
|
||||||
|
data = data[0];
|
||||||
|
|
||||||
|
var separator = ' ';
|
||||||
|
if (process.stdout.columns > 10) {
|
||||||
|
for (var x = 0, cols = process.stdout.columns - 10; x < cols; x += 1) {
|
||||||
|
separator += '=';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
process.stdout.write('\n' + separator + '\n\n');
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
winston.error('There was a problem completing NodeBB setup', err);
|
||||||
|
throw err;
|
||||||
|
} else {
|
||||||
|
if (data.hasOwnProperty('password')) {
|
||||||
|
process.stdout.write('An administrative user was automatically created for you:\n');
|
||||||
|
process.stdout.write(' Username: ' + data.username + '\n');
|
||||||
|
process.stdout.write(' Password: ' + data.password + '\n');
|
||||||
|
process.stdout.write('\n');
|
||||||
|
}
|
||||||
|
process.stdout.write('NodeBB Setup Completed. Run \'./nodebb start\' to manually start your NodeBB server.\n');
|
||||||
|
|
||||||
|
// If I am a child process, notify the parent of the returned data before exiting (useful for notifying
|
||||||
|
// hosts of auto-generated username/password during headless setups)
|
||||||
|
if (process.send) {
|
||||||
|
process.send(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function upgrade() {
|
||||||
|
var db = require('./src/database');
|
||||||
|
var meta = require('./src/meta');
|
||||||
|
var upgrade = require('./src/upgrade');
|
||||||
|
var build = require('./src/meta/build');
|
||||||
|
var tasks = [db.init, meta.configs.init];
|
||||||
|
|
||||||
|
if (nconf.get('upgrade') !== true) {
|
||||||
|
// Likely an upgrade script name passed in
|
||||||
|
tasks.push(async.apply(upgrade.runParticular, nconf.get('upgrade').split(',')));
|
||||||
|
} else {
|
||||||
|
tasks.push(upgrade.run, build.buildAll);
|
||||||
|
}
|
||||||
|
// disable mongo timeouts during upgrade
|
||||||
|
nconf.set('mongo:options:socketTimeoutMS', 0);
|
||||||
|
async.series(tasks, function (err) {
|
||||||
|
if (err) {
|
||||||
|
winston.error(err.stack);
|
||||||
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function activate() {
|
||||||
|
var db = require('./src/database');
|
||||||
|
var plugins = require('./src/plugins');
|
||||||
|
var events = require('./src/events');
|
||||||
|
var plugin = nconf.get('activate');
|
||||||
|
async.waterfall([
|
||||||
|
function (next) {
|
||||||
|
db.init(next);
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
if (plugin.indexOf('nodebb-') !== 0) {
|
||||||
|
// Allow omission of `nodebb-plugin-`
|
||||||
|
plugin = 'nodebb-plugin-' + plugin;
|
||||||
|
}
|
||||||
|
plugins.isInstalled(plugin, next);
|
||||||
|
},
|
||||||
|
function (isInstalled, next) {
|
||||||
|
if (!isInstalled) {
|
||||||
|
return next(new Error('plugin not installed'));
|
||||||
|
}
|
||||||
|
|
||||||
|
winston.info('Activating plugin `%s`', plugin);
|
||||||
|
db.sortedSetAdd('plugins:active', 0, plugin, next);
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
events.log({
|
||||||
|
type: 'plugin-activate',
|
||||||
|
text: plugin,
|
||||||
|
}, next);
|
||||||
|
},
|
||||||
|
], function (err) {
|
||||||
|
if (err) {
|
||||||
|
winston.error('An error occurred during plugin activation', err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function listPlugins() {
|
||||||
|
require('./src/database').init(function (err) {
|
||||||
|
if (err) {
|
||||||
|
winston.error(err.stack);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var db = require('./src/database');
|
||||||
|
|
||||||
|
db.getSortedSetRange('plugins:active', 0, -1, function (err, plugins) {
|
||||||
|
if (err) {
|
||||||
|
winston.error(err.stack);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
winston.info('Active plugins: \n\t - ' + plugins.join('\n\t - '));
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function versionCheck() {
|
||||||
|
var version = process.version.slice(1);
|
||||||
|
var range = pkg.engines.node;
|
||||||
|
var semver = require('semver');
|
||||||
|
var compatible = semver.satisfies(version, range);
|
||||||
|
|
||||||
|
if (!compatible) {
|
||||||
|
winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.');
|
||||||
|
winston.warn('Recommended ' + range.green + ', '.reset + version.yellow + ' provided\n'.reset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
4
build/.gitignore
vendored
@@ -1,4 +0,0 @@
|
|||||||
*
|
|
||||||
*/
|
|
||||||
!export
|
|
||||||
!.gitignore
|
|
||||||
3
build/export/.gitignore
vendored
@@ -1,3 +0,0 @@
|
|||||||
.
|
|
||||||
!.gitignore
|
|
||||||
!README
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
This directory contains archives of user uploads that are prepared on-demand
|
|
||||||
when a user wants to retrieve a copy of their uploaded content.
|
|
||||||
|
|
||||||
You can delete the files in here at will. They will just be regenerated if
|
|
||||||
requested again.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = { extends: ['@commitlint/config-angular'] };
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
version: '3.5'
|
|
||||||
|
|
||||||
services:
|
|
||||||
node:
|
|
||||||
build: .
|
|
||||||
restart: unless-stopped
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
expose:
|
|
||||||
- 4567 # use a reverse proxy like Traefik
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: mongo:bionic
|
|
||||||
restart: unless-stopped
|
|
||||||
expose:
|
|
||||||
- 27017
|
|
||||||
environment:
|
|
||||||
MONGO_INITDB_ROOT_USERNAME: root
|
|
||||||
MONGO_INITDB_ROOT_PASSWORD: root
|
|
||||||
volumes:
|
|
||||||
- mongo:/data/db
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
mongo:
|
|
||||||
@@ -1,132 +1,41 @@
|
|||||||
{
|
{
|
||||||
"title": "NodeBB",
|
"title": "NodeBB",
|
||||||
"showSiteTitle": 1,
|
"showSiteTitle": 1,
|
||||||
"defaultLang": "en-GB",
|
|
||||||
"loginDays": 14,
|
|
||||||
"loginSeconds": 0,
|
|
||||||
"loginAttempts": 5,
|
|
||||||
"lockoutDuration": 60,
|
|
||||||
"adminReloginDuration": 60,
|
|
||||||
"postDelay": 10,
|
"postDelay": 10,
|
||||||
"initialPostDelay": 10,
|
"initialPostDelay": 10,
|
||||||
"newbiePostDelay": 120,
|
"newbiePostDelay": 120,
|
||||||
"postEditDuration": 0,
|
|
||||||
"newbiePostEditDuration": 3600,
|
|
||||||
"postDeleteDuration": 0,
|
|
||||||
"enablePostHistory": 1,
|
|
||||||
"postCacheSize": 10485760,
|
|
||||||
"disableChat": 0,
|
|
||||||
"chatEditDuration": 0,
|
|
||||||
"chatDeleteDuration": 0,
|
|
||||||
"chatMessageDelay": 200,
|
|
||||||
"newbiePostDelayThreshold": 3,
|
"newbiePostDelayThreshold": 3,
|
||||||
"postQueueReputationThreshold": 0,
|
|
||||||
"groupsExemptFromPostQueue": ["administrators", "Global Moderators"],
|
|
||||||
"minimumPostLength": 8,
|
"minimumPostLength": 8,
|
||||||
"maximumPostLength": 32767,
|
"maximumPostLength": 32767,
|
||||||
"minimumTagsPerTopic": 0,
|
"minimumTagsPerTopic": 0,
|
||||||
"maximumTagsPerTopic": 5,
|
"maximumTagsPerTopic": 5,
|
||||||
"minimumTagLength": 3,
|
"minimumTagLength": 3,
|
||||||
"maximumTagLength": 15,
|
"maximumTagLength": 15,
|
||||||
|
"allowGuestSearching": 0,
|
||||||
"allowTopicsThumbnail": 0,
|
"allowTopicsThumbnail": 0,
|
||||||
"registrationType": "normal",
|
"registrationType": "normal",
|
||||||
"registrationApprovalType": "normal",
|
"allowLocalLogin": 1,
|
||||||
"allowAccountDelete": 1,
|
"allowAccountDelete": 1,
|
||||||
"allowFileUploads": 0,
|
"allowFileUploads": 0,
|
||||||
"privateUploads": 0,
|
|
||||||
"allowedFileExtensions": "png,jpg,bmp",
|
"allowedFileExtensions": "png,jpg,bmp",
|
||||||
"allowUserHomePage": 1,
|
"allowUserHomePage": 1,
|
||||||
"allowMultipleBadges": 0,
|
|
||||||
"maximumFileSize": 2048,
|
"maximumFileSize": 2048,
|
||||||
"stripEXIFData": 1,
|
|
||||||
"resizeImageWidthThreshold": 2000,
|
|
||||||
"resizeImageWidth": 760,
|
|
||||||
"rejectImageWidth": 5000,
|
|
||||||
"rejectImageHeight": 5000,
|
|
||||||
"resizeImageQuality": 80,
|
|
||||||
"topicThumbSize": 120,
|
|
||||||
"minimumTitleLength": 3,
|
"minimumTitleLength": 3,
|
||||||
"maximumTitleLength": 255,
|
"maximumTitleLength": 255,
|
||||||
"minimumUsernameLength": 2,
|
"minimumUsernameLength": 2,
|
||||||
"maximumUsernameLength": 16,
|
"maximumUsernameLength": 16,
|
||||||
"minimumPasswordLength": 6,
|
"minimumPasswordLength": 6,
|
||||||
"minimumPasswordStrength": 1,
|
|
||||||
"maximumSignatureLength": 255,
|
"maximumSignatureLength": 255,
|
||||||
"maximumAboutMeLength": 1000,
|
"maximumAboutMeLength": 1000,
|
||||||
"maximumUsersInChatRoom": 0,
|
|
||||||
"maximumChatMessageLength": 1000,
|
|
||||||
"maximumProfileImageSize": 256,
|
"maximumProfileImageSize": 256,
|
||||||
"maximumCoverImageSize": 2048,
|
"maximumCoverImageSize": 2048,
|
||||||
"profileImageDimension": 200,
|
"profileImageDimension": 200,
|
||||||
"profile:convertProfileImageToPNG": 0,
|
|
||||||
"profile:keepAllUserImages": 0,
|
|
||||||
"requireEmailConfirmation": 0,
|
"requireEmailConfirmation": 0,
|
||||||
"gdpr_enabled": 1,
|
|
||||||
"allowProfileImageUploads": 1,
|
"allowProfileImageUploads": 1,
|
||||||
"teaserPost": "last-reply",
|
"teaserPost": "last-reply",
|
||||||
"allowPrivateGroups": 1,
|
"allowPrivateGroups": 1,
|
||||||
"unreadCutoff": 2,
|
"unreadCutoff": 2,
|
||||||
"bookmarkThreshold": 5,
|
"bookmarkThreshold": 5,
|
||||||
"autoDetectLang": 1,
|
"topicsPerList": 20,
|
||||||
"reputation:disabled": 0,
|
"autoDetectLang": 1
|
||||||
"downvote:disabled": 0,
|
}
|
||||||
"disableSignatures": 0,
|
|
||||||
"min:rep:downvote": 0,
|
|
||||||
"min:rep:flag": 0,
|
|
||||||
"min:rep:profile-picture": 0,
|
|
||||||
"min:rep:cover-picture": 0,
|
|
||||||
"min:rep:website": 0,
|
|
||||||
"min:rep:aboutme": 0,
|
|
||||||
"min:rep:signature": 0,
|
|
||||||
"notificationType_upvote": "notification",
|
|
||||||
"notificationType_new-topic": "notification",
|
|
||||||
"notificationType_new-reply": "notification",
|
|
||||||
"notificationType_follow": "notification",
|
|
||||||
"notificationType_new-chat": "notification",
|
|
||||||
"notificationType_group-invite": "notification",
|
|
||||||
"notificationType_mention": "notification",
|
|
||||||
"notificationType_new-register": "notification",
|
|
||||||
"notificationType_post-queue": "notification",
|
|
||||||
"notificationType_new-post-flag": "notification",
|
|
||||||
"notificationType_new-user-flag": "notification",
|
|
||||||
"topicStaleDays": 60,
|
|
||||||
"maxTopicsPerPage": 20,
|
|
||||||
"maxPostsPerPage": 20,
|
|
||||||
"topicsPerPage": 20,
|
|
||||||
"postsPerPage": 20,
|
|
||||||
"userSearchResultsPerPage": 50,
|
|
||||||
"maximumGroupNameLength": 255,
|
|
||||||
"maximumGroupTitleLength": 40,
|
|
||||||
"preventTopicDeleteAfterReplies": 0,
|
|
||||||
"feeds:disableSitemap": 0,
|
|
||||||
"sitemapTopics": 500,
|
|
||||||
"maintenanceMode": 0,
|
|
||||||
"maintenanceModeStatus": 503,
|
|
||||||
"votesArePublic": 0,
|
|
||||||
"maximumInvites": 0,
|
|
||||||
"username:disableEdit": 0,
|
|
||||||
"email:disableEdit": 0,
|
|
||||||
"email:sendmail:rateLimit": 2,
|
|
||||||
"email:sendmail:rateDelta": 1000,
|
|
||||||
"hideFullname": 0,
|
|
||||||
"allowGuestHandles": 0,
|
|
||||||
"disableRecentCategoryFilter": 0,
|
|
||||||
"maximumRelatedTopics": 0,
|
|
||||||
"disableEmailSubscriptions": 0,
|
|
||||||
"emailConfirmInterval": 10,
|
|
||||||
"inviteExpiration": 7,
|
|
||||||
"digestHour": 17,
|
|
||||||
"passwordExpiryDays": 0,
|
|
||||||
"hsts-maxage": 31536000,
|
|
||||||
"hsts-subdomains": 0,
|
|
||||||
"hsts-preload": 0,
|
|
||||||
"hsts-enabled": 0,
|
|
||||||
"eventLoopCheckEnabled": 1,
|
|
||||||
"eventLoopLagThreshold": 100,
|
|
||||||
"eventLoopInterval": 500,
|
|
||||||
"onlineCutoff": 30,
|
|
||||||
"timeagoCutoff": 30,
|
|
||||||
"necroThreshold": 7,
|
|
||||||
"categoryWatchState": "watching",
|
|
||||||
"submitPluginUsage": 1
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -15,7 +15,9 @@
|
|||||||
"iconClass": "fa-inbox",
|
"iconClass": "fa-inbox",
|
||||||
"textClass": "visible-xs-inline",
|
"textClass": "visible-xs-inline",
|
||||||
"text": "[[global:header.unread]]",
|
"text": "[[global:header.unread]]",
|
||||||
"groups": ["registered-users"]
|
"properties": {
|
||||||
|
"loggedIn": true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"route": "/recent",
|
"route": "/recent",
|
||||||
@@ -64,9 +66,20 @@
|
|||||||
"iconClass": "fa-cogs",
|
"iconClass": "fa-cogs",
|
||||||
"textClass": "visible-xs-inline",
|
"textClass": "visible-xs-inline",
|
||||||
"text": "[[global:header.admin]]",
|
"text": "[[global:header.admin]]",
|
||||||
"groups": ["administrators"],
|
|
||||||
"properties": {
|
"properties": {
|
||||||
"targetBlank": false
|
"targetBlank": false,
|
||||||
|
"adminOnly": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"route": "/search",
|
||||||
|
"title": "[[global:header.search]]",
|
||||||
|
"enabled": true,
|
||||||
|
"iconClass": "fa-search",
|
||||||
|
"textClass": "visible-xs-inline",
|
||||||
|
"text": "[[global:header.search]]",
|
||||||
|
"properties": {
|
||||||
|
"searchInstalled": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,13 +7,13 @@ var winston = require('winston');
|
|||||||
var questions = {
|
var questions = {
|
||||||
redis: require('../src/database/redis').questions,
|
redis: require('../src/database/redis').questions,
|
||||||
mongo: require('../src/database/mongo').questions,
|
mongo: require('../src/database/mongo').questions,
|
||||||
postgres: require('../src/database/postgres').questions,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function (config, callback) {
|
module.exports = function (config, callback) {
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function (next) {
|
function (next) {
|
||||||
winston.info('\nNow configuring ' + config.database + ' database:');
|
process.stdout.write('\n');
|
||||||
|
winston.info('Now configuring ' + config.database + ' database:');
|
||||||
getDatabaseConfig(config, next);
|
getDatabaseConfig(config, next);
|
||||||
},
|
},
|
||||||
function (databaseConfig, next) {
|
function (databaseConfig, next) {
|
||||||
@@ -39,12 +39,6 @@ function getDatabaseConfig(config, callback) {
|
|||||||
} else {
|
} else {
|
||||||
prompt.get(questions.mongo, callback);
|
prompt.get(questions.mongo, callback);
|
||||||
}
|
}
|
||||||
} else if (config.database === 'postgres') {
|
|
||||||
if (config['postgres:host'] && config['postgres:port']) {
|
|
||||||
callback(null, config);
|
|
||||||
} else {
|
|
||||||
prompt.get(questions.postgres, callback);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return callback(new Error('unknown database : ' + config.database));
|
return callback(new Error('unknown database : ' + config.database));
|
||||||
}
|
}
|
||||||
@@ -76,20 +70,11 @@ function saveDatabaseConfig(config, databaseConfig, callback) {
|
|||||||
database: databaseConfig['mongo:database'],
|
database: databaseConfig['mongo:database'],
|
||||||
uri: databaseConfig['mongo:uri'],
|
uri: databaseConfig['mongo:uri'],
|
||||||
};
|
};
|
||||||
} else if (config.database === 'postgres') {
|
|
||||||
config.postgres = {
|
|
||||||
host: databaseConfig['postgres:host'],
|
|
||||||
port: databaseConfig['postgres:port'],
|
|
||||||
username: databaseConfig['postgres:username'],
|
|
||||||
password: databaseConfig['postgres:password'],
|
|
||||||
database: databaseConfig['postgres:database'],
|
|
||||||
ssl: databaseConfig['postgres:ssl'],
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
return callback(new Error('unknown database : ' + config.database));
|
return callback(new Error('unknown database : ' + config.database));
|
||||||
}
|
}
|
||||||
|
|
||||||
var allQuestions = questions.redis.concat(questions.mongo).concat(questions.postgres);
|
var allQuestions = questions.redis.concat(questions.mongo);
|
||||||
for (var x = 0; x < allQuestions.length; x += 1) {
|
for (var x = 0; x < allQuestions.length; x += 1) {
|
||||||
delete config[allQuestions[x].name];
|
delete config[allQuestions[x].name];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,173 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "nodebb",
|
|
||||||
"license": "GPL-3.0",
|
|
||||||
"description": "NodeBB Forum",
|
|
||||||
"version": "1.13.0",
|
|
||||||
"homepage": "http://www.nodebb.org",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/NodeBB/NodeBB/"
|
|
||||||
},
|
|
||||||
"main": "app.js",
|
|
||||||
"scripts": {
|
|
||||||
"start": "node loader.js",
|
|
||||||
"lint": "eslint --cache ./nodebb .",
|
|
||||||
"pretest": "npm run lint",
|
|
||||||
"test": "nyc --reporter=html --reporter=text-summary mocha",
|
|
||||||
"coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage"
|
|
||||||
},
|
|
||||||
"husky": {
|
|
||||||
"hooks": {
|
|
||||||
"pre-commit": "lint-staged",
|
|
||||||
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lint-staged": {
|
|
||||||
"*.js": [
|
|
||||||
"eslint --fix",
|
|
||||||
"git add"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"ace-builds": "^1.2.9",
|
|
||||||
"archiver": "^3.0.0",
|
|
||||||
"async": "^3.0.1",
|
|
||||||
"autoprefixer": "^9.4.6",
|
|
||||||
"bcryptjs": "2.4.3",
|
|
||||||
"benchpressjs": "^2.0.0",
|
|
||||||
"body-parser": "^1.18.2",
|
|
||||||
"bootstrap": "^3.4.0",
|
|
||||||
"bootswatch": "git://github.com/thomaspark/bootswatch.git#c41a8f066feb8950c6f9c6bcf5a3c37d1085404e",
|
|
||||||
"chart.js": "^2.7.1",
|
|
||||||
"cli-graph": "^3.2.2",
|
|
||||||
"clipboard": "^2.0.1",
|
|
||||||
"colors": "^1.1.2",
|
|
||||||
"commander": "^3.0.0",
|
|
||||||
"compression": "^1.7.1",
|
|
||||||
"connect-ensure-login": "^0.1.1",
|
|
||||||
"connect-flash": "^0.1.1",
|
|
||||||
"connect-mongo": "3.2.0",
|
|
||||||
"connect-multiparty": "^2.1.0",
|
|
||||||
"connect-pg-simple": "^6.0.0",
|
|
||||||
"connect-redis": "4.0.3",
|
|
||||||
"cookie-parser": "^1.4.3",
|
|
||||||
"cron": "^1.3.0",
|
|
||||||
"cropperjs": "^1.2.2",
|
|
||||||
"csurf": "^1.9.0",
|
|
||||||
"daemon": "^1.1.0",
|
|
||||||
"diff": "^4.0.1",
|
|
||||||
"express": "^4.16.2",
|
|
||||||
"express-session": "^1.15.6",
|
|
||||||
"express-useragent": "^1.0.12",
|
|
||||||
"graceful-fs": "^4.1.11",
|
|
||||||
"helmet": "^3.11.0",
|
|
||||||
"html-to-text": "^5.0.0",
|
|
||||||
"ipaddr.js": "^1.5.4",
|
|
||||||
"jquery": "^3.2.1",
|
|
||||||
"jsesc": "2.5.2",
|
|
||||||
"json-2-csv": "^3.0.0",
|
|
||||||
"jsonwebtoken": "^8.4.0",
|
|
||||||
"less": "^3.10.3",
|
|
||||||
"lodash": "^4.17.15",
|
|
||||||
"logrotate-stream": "^0.2.5",
|
|
||||||
"lru-cache": "5.1.1",
|
|
||||||
"material-design-lite": "^1.3.0",
|
|
||||||
"mime": "^2.2.0",
|
|
||||||
"mkdirp": "^0.5.1",
|
|
||||||
"mongodb": "3.4.0",
|
|
||||||
"morgan": "^1.9.1",
|
|
||||||
"mousetrap": "^1.6.1",
|
|
||||||
"mubsub-nbb": "^1.5.1",
|
|
||||||
"nconf": "^0.10.0",
|
|
||||||
"nodebb-plugin-composer-default": "6.3.20",
|
|
||||||
"nodebb-plugin-dbsearch": "4.0.7",
|
|
||||||
"nodebb-plugin-emoji": "^3.0.0",
|
|
||||||
"nodebb-plugin-emoji-android": "2.0.0",
|
|
||||||
"nodebb-plugin-markdown": "8.11.0",
|
|
||||||
"nodebb-plugin-mentions": "2.7.3",
|
|
||||||
"nodebb-plugin-soundpack-default": "1.0.0",
|
|
||||||
"nodebb-plugin-spam-be-gone": "0.6.7",
|
|
||||||
"nodebb-rewards-essentials": "0.1.2",
|
|
||||||
"nodebb-theme-lavender": "5.0.11",
|
|
||||||
"nodebb-theme-persona": "10.1.30",
|
|
||||||
"nodebb-theme-slick": "1.2.28",
|
|
||||||
"nodebb-theme-vanilla": "11.1.12",
|
|
||||||
"nodebb-widget-essentials": "4.0.17",
|
|
||||||
"nodemailer": "^6.0.0",
|
|
||||||
"passport": "^0.4.0",
|
|
||||||
"passport-local": "1.0.0",
|
|
||||||
"pg": "^7.4.0",
|
|
||||||
"pg-cursor": "^2.0.0",
|
|
||||||
"postcss": "7.0.21",
|
|
||||||
"postcss-clean": "1.1.0",
|
|
||||||
"promise-polyfill": "^8.0.0",
|
|
||||||
"prompt": "^1.0.0",
|
|
||||||
"redis": "2.8.0",
|
|
||||||
"request": "2.88.0",
|
|
||||||
"rimraf": "3.0.0",
|
|
||||||
"rss": "^1.2.2",
|
|
||||||
"sanitize-html": "^1.16.3",
|
|
||||||
"semver": "^7.0.0",
|
|
||||||
"serve-favicon": "^2.4.5",
|
|
||||||
"sharp": "0.23.4",
|
|
||||||
"sitemap": "^5.0.0",
|
|
||||||
"socket.io": "2.3.0",
|
|
||||||
"socket.io-adapter-cluster": "^1.0.1",
|
|
||||||
"socket.io-adapter-mongo": "^2.0.4",
|
|
||||||
"socket.io-adapter-postgres": "^1.2.1",
|
|
||||||
"socket.io-client": "2.3.0",
|
|
||||||
"socket.io-redis": "5.2.0",
|
|
||||||
"socketio-wildcard": "2.0.0",
|
|
||||||
"spdx-license-list": "^6.0.0",
|
|
||||||
"spider-detector": "2.0.0",
|
|
||||||
"textcomplete": "^0.17.1",
|
|
||||||
"textcomplete.contenteditable": "^0.1.1",
|
|
||||||
"toobusy-js": "^0.5.1",
|
|
||||||
"uglify-es": "^3.3.9",
|
|
||||||
"validator": "12.1.0",
|
|
||||||
"winston": "3.2.1",
|
|
||||||
"xml": "^1.0.1",
|
|
||||||
"xregexp": "^4.1.1",
|
|
||||||
"zxcvbn": "^4.4.2"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@commitlint/cli": "8.2.0",
|
|
||||||
"@commitlint/config-angular": "8.2.0",
|
|
||||||
"coveralls": "3.0.9",
|
|
||||||
"eslint": "6.7.0",
|
|
||||||
"eslint-config-airbnb-base": "14.0.0",
|
|
||||||
"eslint-plugin-import": "2.18.2",
|
|
||||||
"grunt": "1.0.4",
|
|
||||||
"grunt-contrib-watch": "1.1.0",
|
|
||||||
"husky": "3.1.0",
|
|
||||||
"jsdom": "15.2.1",
|
|
||||||
"lint-staged": "9.4.2",
|
|
||||||
"mocha": "6.2.2",
|
|
||||||
"mocha-lcov-reporter": "1.3.0",
|
|
||||||
"nyc": "14.1.1",
|
|
||||||
"smtp-server": "3.5.0"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/NodeBB/NodeBB/issues"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
},
|
|
||||||
"maintainers": [
|
|
||||||
{
|
|
||||||
"name": "Andrew Rodrigues",
|
|
||||||
"email": "andrew@nodebb.org",
|
|
||||||
"url": "https://github.com/psychobunny"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Julian Lam",
|
|
||||||
"email": "julian@nodebb.org",
|
|
||||||
"url": "https://github.com/julianlam"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Barış Soner Uşaklı",
|
|
||||||
"email": "baris@nodebb.org",
|
|
||||||
"url": "https://github.com/barisusakli"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
181
install/web.js
@@ -5,62 +5,36 @@ var express = require('express');
|
|||||||
var bodyParser = require('body-parser');
|
var bodyParser = require('body-parser');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var childProcess = require('child_process');
|
|
||||||
var less = require('less');
|
var less = require('less');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var uglify = require('uglify-es');
|
var uglify = require('uglify-js');
|
||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
var Benchpress = require('benchpressjs');
|
var Benchpress = require('benchpressjs');
|
||||||
|
|
||||||
var app = express();
|
var app = express();
|
||||||
var server;
|
var server;
|
||||||
|
|
||||||
var formats = [
|
winston.add(winston.transports.File, {
|
||||||
winston.format.colorize(),
|
filename: 'logs/webinstall.log',
|
||||||
];
|
colorize: true,
|
||||||
|
timestamp: function () {
|
||||||
const timestampFormat = winston.format((info) => {
|
var date = new Date();
|
||||||
var dateString = new Date().toISOString() + ' [' + global.process.pid + ']';
|
return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 5) + ' [' + global.process.pid + ']';
|
||||||
info.level = dateString + ' - ' + info.level;
|
},
|
||||||
return info;
|
|
||||||
});
|
|
||||||
formats.push(timestampFormat());
|
|
||||||
formats.push(winston.format.splat());
|
|
||||||
formats.push(winston.format.simple());
|
|
||||||
|
|
||||||
winston.configure({
|
|
||||||
level: 'verbose',
|
level: 'verbose',
|
||||||
format: winston.format.combine.apply(null, formats),
|
|
||||||
transports: [
|
|
||||||
new winston.transports.Console({
|
|
||||||
handleExceptions: true,
|
|
||||||
}),
|
|
||||||
new winston.transports.File({
|
|
||||||
filename: 'logs/webinstall.log',
|
|
||||||
handleExceptions: true,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var web = module.exports;
|
var web = {};
|
||||||
|
|
||||||
var scripts = [
|
var scripts = [
|
||||||
'node_modules/jquery/dist/jquery.js',
|
|
||||||
'public/vendor/xregexp/xregexp.js',
|
'public/vendor/xregexp/xregexp.js',
|
||||||
'public/vendor/xregexp/unicode/unicode-base.js',
|
'public/vendor/xregexp/unicode/unicode-base.js',
|
||||||
'public/src/utils.js',
|
'public/src/utils.js',
|
||||||
'public/src/installer/install.js',
|
'public/src/installer/install.js',
|
||||||
'node_modules/zxcvbn/dist/zxcvbn.js',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
var installing = false;
|
|
||||||
var success = false;
|
|
||||||
var error = false;
|
|
||||||
var launchUrl;
|
|
||||||
|
|
||||||
web.install = function (port) {
|
web.install = function (port) {
|
||||||
port = port || 4567;
|
port = port || 4567;
|
||||||
winston.info('Launching web installer on port ' + port);
|
winston.info('Launching web installer on port', port);
|
||||||
|
|
||||||
app.use(express.static('public', {}));
|
app.use(express.static('public', {}));
|
||||||
app.engine('tpl', function (filepath, options, callback) {
|
app.engine('tpl', function (filepath, options, callback) {
|
||||||
@@ -79,7 +53,7 @@ web.install = function (port) {
|
|||||||
extended: true,
|
extended: true,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
async.parallel([compileLess, compileJS, copyCSS, loadDefaults], function (err) {
|
async.parallel([compileLess, compileJS], function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
winston.error(err);
|
winston.error(err);
|
||||||
}
|
}
|
||||||
@@ -99,82 +73,46 @@ function setupRoutes() {
|
|||||||
app.get('/', welcome);
|
app.get('/', welcome);
|
||||||
app.post('/', install);
|
app.post('/', install);
|
||||||
app.post('/launch', launch);
|
app.post('/launch', launch);
|
||||||
app.get('/ping', ping);
|
|
||||||
app.get('/sping', ping);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ping(req, res) {
|
|
||||||
res.status(200).send(req.path === '/sping' ? 'healthy' : '200');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function welcome(req, res) {
|
function welcome(req, res) {
|
||||||
var dbs = ['redis', 'mongo', 'postgres'];
|
var dbs = ['redis', 'mongo'];
|
||||||
var databases = dbs.map(function (databaseName) {
|
var databases = dbs.map(function (el) {
|
||||||
var questions = require('../src/database/' + databaseName).questions.filter(function (question) {
|
|
||||||
return question && !question.hideOnWebInstall;
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: databaseName,
|
name: el,
|
||||||
questions: questions,
|
questions: require('../src/database/' + el).questions,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
var defaults = require('./data/defaults');
|
var defaults = require('./data/defaults');
|
||||||
|
|
||||||
res.render('install/index', {
|
res.render('install/index', {
|
||||||
url: nconf.get('url') || (req.protocol + '://' + req.get('host')),
|
|
||||||
launchUrl: launchUrl,
|
|
||||||
skipGeneralSetup: !!nconf.get('url'),
|
|
||||||
databases: databases,
|
databases: databases,
|
||||||
skipDatabaseSetup: !!nconf.get('database'),
|
skipDatabaseSetup: !!nconf.get('database'),
|
||||||
error: error,
|
error: !!res.locals.error,
|
||||||
success: success,
|
success: !!res.locals.success,
|
||||||
values: req.body,
|
values: req.body,
|
||||||
minimumPasswordLength: defaults.minimumPasswordLength,
|
minimumPasswordLength: defaults.minimumPasswordLength,
|
||||||
minimumPasswordStrength: defaults.minimumPasswordStrength,
|
|
||||||
installing: installing,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function install(req, res) {
|
function install(req, res) {
|
||||||
if (installing) {
|
|
||||||
return welcome(req, res);
|
|
||||||
}
|
|
||||||
req.setTimeout(0);
|
|
||||||
installing = true;
|
|
||||||
var setupEnvVars = nconf.get();
|
|
||||||
for (var i in req.body) {
|
for (var i in req.body) {
|
||||||
if (req.body.hasOwnProperty(i) && !process.env.hasOwnProperty(i)) {
|
if (req.body.hasOwnProperty(i) && !process.env.hasOwnProperty(i)) {
|
||||||
setupEnvVars[i.replace(':', '__')] = req.body[i];
|
process.env[i.replace(':', '__')] = req.body[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flatten any objects in setupEnvVars
|
|
||||||
const pushToRoot = function (parentKey, key) {
|
|
||||||
setupEnvVars[parentKey + '__' + key] = setupEnvVars[parentKey][key];
|
|
||||||
};
|
|
||||||
for (var j in setupEnvVars) {
|
|
||||||
if (setupEnvVars.hasOwnProperty(j) && typeof setupEnvVars[j] === 'object' && setupEnvVars[j] !== null && !Array.isArray(setupEnvVars[j])) {
|
|
||||||
Object.keys(setupEnvVars[j]).forEach(pushToRoot.bind(null, j));
|
|
||||||
delete setupEnvVars[j];
|
|
||||||
} else if (Array.isArray(setupEnvVars[j])) {
|
|
||||||
setupEnvVars[j] = JSON.stringify(setupEnvVars[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
winston.info('Starting setup process');
|
|
||||||
winston.info(setupEnvVars);
|
|
||||||
launchUrl = setupEnvVars.url;
|
|
||||||
|
|
||||||
var child = require('child_process').fork('app', ['--setup'], {
|
var child = require('child_process').fork('app', ['--setup'], {
|
||||||
env: setupEnvVars,
|
env: process.env,
|
||||||
});
|
});
|
||||||
|
|
||||||
child.on('close', function (data) {
|
child.on('close', function (data) {
|
||||||
installing = false;
|
if (data === 0) {
|
||||||
success = data === 0;
|
res.locals.success = true;
|
||||||
error = data !== 0;
|
} else {
|
||||||
|
res.locals.error = true;
|
||||||
|
}
|
||||||
|
|
||||||
welcome(req, res);
|
welcome(req, res);
|
||||||
});
|
});
|
||||||
@@ -183,36 +121,25 @@ function install(req, res) {
|
|||||||
function launch(req, res) {
|
function launch(req, res) {
|
||||||
res.json({});
|
res.json({});
|
||||||
server.close();
|
server.close();
|
||||||
req.setTimeout(0);
|
|
||||||
var child;
|
|
||||||
|
|
||||||
if (!nconf.get('launchCmd')) {
|
var child = require('child_process').spawn('node', ['loader.js'], {
|
||||||
child = childProcess.spawn('node', ['loader.js'], {
|
detached: true,
|
||||||
detached: true,
|
stdio: ['ignore', 'ignore', 'ignore'],
|
||||||
stdio: ['ignore', 'ignore', 'ignore'],
|
});
|
||||||
});
|
|
||||||
|
|
||||||
console.log('\nStarting NodeBB');
|
process.stdout.write('\nStarting NodeBB\n');
|
||||||
console.log(' "./nodebb stop" to stop the NodeBB server');
|
process.stdout.write(' "./nodebb stop" to stop the NodeBB server\n');
|
||||||
console.log(' "./nodebb log" to view server output');
|
process.stdout.write(' "./nodebb log" to view server output\n');
|
||||||
console.log(' "./nodebb restart" to restart NodeBB');
|
process.stdout.write(' "./nodebb restart" to restart NodeBB\n');
|
||||||
} else {
|
|
||||||
// Use launchCmd instead, if specified
|
|
||||||
child = childProcess.exec(nconf.get('launchCmd'), {
|
|
||||||
detached: true,
|
|
||||||
stdio: ['ignore', 'ignore', 'ignore'],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var filesToDelete = [
|
async.parallel([
|
||||||
'installer.css',
|
function (next) {
|
||||||
'installer.min.js',
|
fs.unlink(path.join(__dirname, '../public/installer.css'), next);
|
||||||
'bootstrap.min.css',
|
},
|
||||||
];
|
function (next) {
|
||||||
|
fs.unlink(path.join(__dirname, '../public/installer.min.js'), next);
|
||||||
async.each(filesToDelete, function (filename, next) {
|
},
|
||||||
fs.unlink(path.join(__dirname, '../public', filename), next);
|
], function (err) {
|
||||||
}, function (err) {
|
|
||||||
if (err) {
|
if (err) {
|
||||||
winston.warn('Unable to remove installer files');
|
winston.warn('Unable to remove installer files');
|
||||||
}
|
}
|
||||||
@@ -267,30 +194,4 @@ function compileJS(callback) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function copyCSS(next) {
|
module.exports = web;
|
||||||
async.waterfall([
|
|
||||||
function (next) {
|
|
||||||
fs.readFile(path.join(__dirname, '../node_modules/bootstrap/dist/css/bootstrap.min.css'), 'utf8', next);
|
|
||||||
},
|
|
||||||
function (src, next) {
|
|
||||||
fs.writeFile(path.join(__dirname, '../public/bootstrap.min.css'), src, next);
|
|
||||||
},
|
|
||||||
], next);
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadDefaults(next) {
|
|
||||||
var setupDefaultsPath = path.join(__dirname, '../setup.json');
|
|
||||||
fs.access(setupDefaultsPath, fs.constants.F_OK | fs.constants.R_OK, function (err) {
|
|
||||||
if (err) {
|
|
||||||
// setup.json not found or inaccessible, proceed with no defaults
|
|
||||||
return setImmediate(next);
|
|
||||||
}
|
|
||||||
|
|
||||||
winston.info('[installer] Found setup.json, populating default values');
|
|
||||||
nconf.file({
|
|
||||||
file: setupDefaultsPath,
|
|
||||||
});
|
|
||||||
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|||||||
116
loader.js
@@ -7,26 +7,16 @@ var path = require('path');
|
|||||||
var fork = require('child_process').fork;
|
var fork = require('child_process').fork;
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var logrotate = require('logrotate-stream');
|
var logrotate = require('logrotate-stream');
|
||||||
var mkdirp = require('mkdirp');
|
|
||||||
|
|
||||||
var file = require('./src/file');
|
var file = require('./src/file');
|
||||||
var pkg = require('./package.json');
|
var pkg = require('./package.json');
|
||||||
|
|
||||||
var pathToConfig = path.resolve(__dirname, process.env.CONFIG || 'config.json');
|
|
||||||
|
|
||||||
nconf.argv().env().file({
|
nconf.argv().env().file({
|
||||||
file: pathToConfig,
|
file: path.join(__dirname, 'config.json'),
|
||||||
});
|
});
|
||||||
|
|
||||||
var pidFilePath = path.join(__dirname, 'pidfile');
|
var pidFilePath = path.join(__dirname, 'pidfile');
|
||||||
|
var outputLogFilePath = path.join(__dirname, 'logs/output.log');
|
||||||
var outputLogFilePath = path.join(__dirname, nconf.get('logFile') || 'logs/output.log');
|
|
||||||
|
|
||||||
var logDir = path.dirname(outputLogFilePath);
|
|
||||||
if (!fs.existsSync(logDir)) {
|
|
||||||
mkdirp.sync(path.dirname(outputLogFilePath));
|
|
||||||
}
|
|
||||||
|
|
||||||
var output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
|
var output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
|
||||||
var silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
|
var silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
|
||||||
var numProcs;
|
var numProcs;
|
||||||
@@ -45,6 +35,7 @@ Loader.init = function (callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
process.on('SIGHUP', Loader.restart);
|
process.on('SIGHUP', Loader.restart);
|
||||||
|
process.on('SIGUSR2', Loader.reload);
|
||||||
process.on('SIGTERM', Loader.stop);
|
process.on('SIGTERM', Loader.stop);
|
||||||
callback();
|
callback();
|
||||||
};
|
};
|
||||||
@@ -91,17 +82,9 @@ Loader.addWorkerEvents = function (worker) {
|
|||||||
console.log('[cluster] Restarting...');
|
console.log('[cluster] Restarting...');
|
||||||
Loader.restart();
|
Loader.restart();
|
||||||
break;
|
break;
|
||||||
case 'pubsub':
|
case 'reload':
|
||||||
workers.forEach(function (w) {
|
console.log('[cluster] Reloading...');
|
||||||
w.send(message);
|
Loader.reload();
|
||||||
});
|
|
||||||
break;
|
|
||||||
case 'socket.io':
|
|
||||||
workers.forEach(function (w) {
|
|
||||||
if (w !== worker) {
|
|
||||||
w.send(message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,7 +113,7 @@ function forkWorker(index, isPrimary) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
process.env.isPrimary = isPrimary;
|
process.env.isPrimary = isPrimary;
|
||||||
process.env.isCluster = nconf.get('isCluster') || ports.length > 1;
|
process.env.isCluster = ports.length > 1;
|
||||||
process.env.port = ports[index];
|
process.env.port = ports[index];
|
||||||
|
|
||||||
var worker = fork(appPath, args, {
|
var worker = fork(appPath, args, {
|
||||||
@@ -169,6 +152,7 @@ function getPorts() {
|
|||||||
Loader.restart = function () {
|
Loader.restart = function () {
|
||||||
killWorkers();
|
killWorkers();
|
||||||
|
|
||||||
|
var pathToConfig = path.join(__dirname, '/config.json');
|
||||||
nconf.remove('file');
|
nconf.remove('file');
|
||||||
nconf.use('file', { file: pathToConfig });
|
nconf.use('file', { file: pathToConfig });
|
||||||
|
|
||||||
@@ -191,6 +175,14 @@ Loader.restart = function () {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loader.reload = function () {
|
||||||
|
workers.forEach(function (worker) {
|
||||||
|
worker.send({
|
||||||
|
action: 'reload',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
Loader.stop = function () {
|
Loader.stop = function () {
|
||||||
killWorkers();
|
killWorkers();
|
||||||
|
|
||||||
@@ -207,41 +199,53 @@ function killWorkers() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.open(pathToConfig, 'r', function (err) {
|
Loader.notifyWorkers = function (msg, worker_pid) {
|
||||||
if (err) {
|
worker_pid = parseInt(worker_pid, 10);
|
||||||
// No config detected, kickstart web installer
|
workers.forEach(function (worker) {
|
||||||
fork('app');
|
if (parseInt(worker.pid, 10) !== worker_pid) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) {
|
|
||||||
if (file.existsSync(pidFilePath)) {
|
|
||||||
try {
|
try {
|
||||||
var pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
|
worker.send(msg);
|
||||||
process.kill(pid, 0);
|
|
||||||
process.exit();
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
fs.unlinkSync(pidFilePath);
|
console.log('[cluster/notifyWorkers] Failed to reach pid ' + worker_pid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
require('daemon')({
|
|
||||||
stdout: process.stdout,
|
|
||||||
stderr: process.stderr,
|
|
||||||
cwd: process.cwd(),
|
|
||||||
});
|
|
||||||
|
|
||||||
fs.writeFileSync(pidFilePath, process.pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
async.series([
|
|
||||||
Loader.init,
|
|
||||||
Loader.displayStartupMessages,
|
|
||||||
Loader.start,
|
|
||||||
], function (err) {
|
|
||||||
if (err) {
|
|
||||||
console.error('[loader] Error during startup');
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
fs.open(path.join(__dirname, 'config.json'), 'r', function (err) {
|
||||||
|
if (!err) {
|
||||||
|
if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) {
|
||||||
|
if (file.existsSync(pidFilePath)) {
|
||||||
|
try {
|
||||||
|
var pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
|
||||||
|
process.kill(pid, 0);
|
||||||
|
process.exit();
|
||||||
|
} catch (e) {
|
||||||
|
fs.unlinkSync(pidFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require('daemon')({
|
||||||
|
stdout: process.stdout,
|
||||||
|
stderr: process.stderr,
|
||||||
|
cwd: process.cwd(),
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(pidFilePath, process.pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
Loader.init,
|
||||||
|
Loader.displayStartupMessages,
|
||||||
|
Loader.start,
|
||||||
|
], function (err) {
|
||||||
|
if (err) {
|
||||||
|
console.error('[loader] Error during startup');
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// No config detected, kickstart web installer
|
||||||
|
fork('app');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
547
nodebb
@@ -2,4 +2,549 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
require('./src/cli');
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var cproc = require('child_process');
|
||||||
|
|
||||||
|
var packageInstall = require('./src/meta/package-install');
|
||||||
|
|
||||||
|
// check to make sure dependencies are installed
|
||||||
|
try {
|
||||||
|
fs.readFileSync(path.join(__dirname, './package.json'));
|
||||||
|
fs.readFileSync(path.join(__dirname, 'node_modules/async/package.json'));
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code === 'ENOENT') {
|
||||||
|
process.stdout.write('Dependencies not yet installed.\n');
|
||||||
|
process.stdout.write('Installing them now...\n\n');
|
||||||
|
|
||||||
|
packageInstall.updatePackageFile();
|
||||||
|
packageInstall.preserveExtraneousPlugins();
|
||||||
|
packageInstall.npmInstallProduction();
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var minimist;
|
||||||
|
var request;
|
||||||
|
var semver;
|
||||||
|
var prompt;
|
||||||
|
var async;
|
||||||
|
|
||||||
|
try {
|
||||||
|
require('colors');
|
||||||
|
minimist = require('minimist');
|
||||||
|
request = require('request');
|
||||||
|
semver = require('semver');
|
||||||
|
prompt = require('prompt');
|
||||||
|
async = require('async');
|
||||||
|
} catch (e) {
|
||||||
|
process.stdout.write(
|
||||||
|
'\x1b[31mNodeBB could not be initialised because there was an error while loading dependencies.\n' +
|
||||||
|
'Please run "\x1b[33mnpm install --production\x1b[31m" and try again.\x1b[0m\n\n' +
|
||||||
|
'For more information, please see: https://docs.nodebb.org/installing/os/\n\n'
|
||||||
|
);
|
||||||
|
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
var args = minimist(process.argv.slice(2));
|
||||||
|
|
||||||
|
var loaderPath = path.join(__dirname, 'loader.js');
|
||||||
|
var appPath = path.join(__dirname, 'app.js');
|
||||||
|
|
||||||
|
if (args.dev) {
|
||||||
|
process.env.NODE_ENV = 'development';
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRunningPid(callback) {
|
||||||
|
fs.readFile(path.join(__dirname, 'pidfile'), {
|
||||||
|
encoding: 'utf-8',
|
||||||
|
}, function (err, pid) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
process.kill(parseInt(pid, 10), 0);
|
||||||
|
callback(null, parseInt(pid, 10));
|
||||||
|
} catch (e) {
|
||||||
|
callback(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function getCurrentVersion(callback) {
|
||||||
|
fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pkg = JSON.parse(pkg);
|
||||||
|
return callback(null, pkg.version);
|
||||||
|
} catch (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function fork(args) {
|
||||||
|
return cproc.fork(appPath, args, {
|
||||||
|
cwd: __dirname,
|
||||||
|
silent: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function getInstalledPlugins(callback) {
|
||||||
|
async.parallel({
|
||||||
|
files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')),
|
||||||
|
deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }),
|
||||||
|
}, function (err, payload) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/;
|
||||||
|
var moduleName;
|
||||||
|
var isGitRepo;
|
||||||
|
|
||||||
|
payload.files = payload.files.filter(function (file) {
|
||||||
|
return isNbbModule.test(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
payload.deps = JSON.parse(payload.deps).dependencies;
|
||||||
|
payload.bundled = [];
|
||||||
|
payload.installed = [];
|
||||||
|
} catch (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (moduleName in payload.deps) {
|
||||||
|
if (isNbbModule.test(moduleName)) {
|
||||||
|
payload.bundled.push(moduleName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Whittle down deps to send back only extraneously installed plugins/themes/etc
|
||||||
|
payload.files.forEach(function (moduleName) {
|
||||||
|
try {
|
||||||
|
fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git'));
|
||||||
|
isGitRepo = true;
|
||||||
|
} catch (e) {
|
||||||
|
isGitRepo = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
payload.files.indexOf(moduleName) !== -1 && // found in `node_modules/`
|
||||||
|
payload.bundled.indexOf(moduleName) === -1 && // not found in `package.json`
|
||||||
|
!fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() && // is not a symlink
|
||||||
|
!isGitRepo // .git/ does not exist, so it is not a git repository
|
||||||
|
) {
|
||||||
|
payload.installed.push(moduleName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
getModuleVersions(payload.installed, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function getModuleVersions(modules, callback) {
|
||||||
|
var versionHash = {};
|
||||||
|
|
||||||
|
async.eachLimit(modules, 50, function (module, next) {
|
||||||
|
fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pkg = JSON.parse(pkg);
|
||||||
|
versionHash[module] = pkg.version;
|
||||||
|
next();
|
||||||
|
} catch (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, function (err) {
|
||||||
|
callback(err, versionHash);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function checkPlugins(standalone, callback) {
|
||||||
|
if (standalone) {
|
||||||
|
process.stdout.write('Checking installed plugins and themes for updates... ');
|
||||||
|
}
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
async.apply(async.parallel, {
|
||||||
|
plugins: async.apply(getInstalledPlugins),
|
||||||
|
version: async.apply(getCurrentVersion),
|
||||||
|
}),
|
||||||
|
function (payload, next) {
|
||||||
|
var toCheck = Object.keys(payload.plugins);
|
||||||
|
|
||||||
|
if (!toCheck.length) {
|
||||||
|
process.stdout.write('OK'.green + '\n'.reset);
|
||||||
|
return next(null, []); // no extraneous plugins installed
|
||||||
|
}
|
||||||
|
|
||||||
|
request({
|
||||||
|
method: 'GET',
|
||||||
|
url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='),
|
||||||
|
json: true,
|
||||||
|
}, function (err, res, body) {
|
||||||
|
if (err) {
|
||||||
|
process.stdout.write('error'.red + '\n'.reset);
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
process.stdout.write('OK'.green + '\n'.reset);
|
||||||
|
|
||||||
|
if (!Array.isArray(body) && toCheck.length === 1) {
|
||||||
|
body = [body];
|
||||||
|
}
|
||||||
|
|
||||||
|
var current;
|
||||||
|
var suggested;
|
||||||
|
var upgradable = body.map(function (suggestObj) {
|
||||||
|
current = payload.plugins[suggestObj.package];
|
||||||
|
suggested = suggestObj.version;
|
||||||
|
|
||||||
|
if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) {
|
||||||
|
return {
|
||||||
|
name: suggestObj.package,
|
||||||
|
current: current,
|
||||||
|
suggested: suggested,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}).filter(Boolean);
|
||||||
|
|
||||||
|
next(null, upgradable);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
], callback);
|
||||||
|
}
|
||||||
|
function upgradePlugins(callback) {
|
||||||
|
var standalone = false;
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
callback = function () {};
|
||||||
|
standalone = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
checkPlugins(standalone, function (err, found) {
|
||||||
|
if (err) {
|
||||||
|
process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset);
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found && found.length) {
|
||||||
|
process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n');
|
||||||
|
found.forEach(function (suggestObj) {
|
||||||
|
process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset);
|
||||||
|
});
|
||||||
|
process.stdout.write('\n');
|
||||||
|
} else {
|
||||||
|
if (standalone) {
|
||||||
|
process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset);
|
||||||
|
}
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt.message = '';
|
||||||
|
prompt.delimiter = '';
|
||||||
|
|
||||||
|
prompt.start();
|
||||||
|
prompt.get({
|
||||||
|
name: 'upgrade',
|
||||||
|
description: 'Proceed with upgrade (y|n)?'.reset,
|
||||||
|
type: 'string',
|
||||||
|
}, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) {
|
||||||
|
process.stdout.write('\nUpgrading packages...');
|
||||||
|
var args = ['i'];
|
||||||
|
found.forEach(function (suggestObj) {
|
||||||
|
args.push(suggestObj.name + '@' + suggestObj.suggested);
|
||||||
|
});
|
||||||
|
|
||||||
|
cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, function (err) {
|
||||||
|
if (!err) {
|
||||||
|
process.stdout.write(' OK\n'.green);
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset);
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var commands = {
|
||||||
|
status: {
|
||||||
|
description: 'View the status of the NodeBB server',
|
||||||
|
usage: 'Usage: ' + './nodebb status'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
getRunningPid(function (err, pid) {
|
||||||
|
if (!err) {
|
||||||
|
process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan);
|
||||||
|
process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
|
||||||
|
process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n');
|
||||||
|
process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n');
|
||||||
|
} else {
|
||||||
|
process.stdout.write('\nNodeBB is not running\n'.bold);
|
||||||
|
process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
start: {
|
||||||
|
description: 'Start the NodeBB server',
|
||||||
|
usage: 'Usage: ' + './nodebb start'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
process.stdout.write('\nStarting NodeBB\n'.bold);
|
||||||
|
process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
|
||||||
|
process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n');
|
||||||
|
process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset);
|
||||||
|
|
||||||
|
// Spawn a new NodeBB process
|
||||||
|
cproc.fork(loaderPath, process.argv.slice(3), {
|
||||||
|
env: process.env,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stop: {
|
||||||
|
description: 'Stop the NodeBB server',
|
||||||
|
usage: 'Usage: ' + './nodebb stop'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
getRunningPid(function (err, pid) {
|
||||||
|
if (!err) {
|
||||||
|
process.kill(pid, 'SIGTERM');
|
||||||
|
process.stdout.write('Stopping NodeBB. Goodbye!\n');
|
||||||
|
} else {
|
||||||
|
process.stdout.write('NodeBB is already stopped.\n');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
restart: {
|
||||||
|
description: 'Restart the NodeBB server',
|
||||||
|
usage: 'Usage: ' + './nodebb restart'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
getRunningPid(function (err, pid) {
|
||||||
|
if (!err) {
|
||||||
|
process.kill(pid, 'SIGHUP');
|
||||||
|
process.stdout.write('\nRestarting NodeBB\n'.bold);
|
||||||
|
} else {
|
||||||
|
process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
log: {
|
||||||
|
description: 'Open the output log (useful for debugging)',
|
||||||
|
usage: 'Usage: ' + './nodebb log'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
|
||||||
|
process.stdout.write('\n\n'.reset);
|
||||||
|
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
||||||
|
cwd: __dirname,
|
||||||
|
stdio: 'inherit',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
slog: {
|
||||||
|
description: 'Start the NodeBB server and view the live output log',
|
||||||
|
usage: 'Usage: ' + './nodebb slog'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
process.stdout.write('\nStarting NodeBB with logging output\n'.bold);
|
||||||
|
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
|
||||||
|
process.stdout.write('\n\n'.reset);
|
||||||
|
|
||||||
|
// Spawn a new NodeBB process
|
||||||
|
cproc.fork(loaderPath, {
|
||||||
|
env: process.env,
|
||||||
|
});
|
||||||
|
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
||||||
|
cwd: __dirname,
|
||||||
|
stdio: 'inherit',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dev: {
|
||||||
|
description: 'Start NodeBB in verbose development mode',
|
||||||
|
usage: 'Usage: ' + './nodebb dev'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
process.env.NODE_ENV = 'development';
|
||||||
|
cproc.fork(loaderPath, ['--no-daemon', '--no-silent'], {
|
||||||
|
env: process.env,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
description: 'Compile static assets (CSS, Javascript, etc)',
|
||||||
|
usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' +
|
||||||
|
' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' +
|
||||||
|
' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n',
|
||||||
|
handler: function () {
|
||||||
|
var arr = ['--build'].concat(process.argv.slice(3));
|
||||||
|
fork(arr);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup: {
|
||||||
|
description: 'Run the NodeBB setup script',
|
||||||
|
usage: 'Usage: ' + './nodebb setup'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
var arr = ['--setup'].concat(process.argv.slice(3));
|
||||||
|
fork(arr);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
reset: {
|
||||||
|
description: 'Disable plugins and restore the default theme',
|
||||||
|
usage: 'Usage: ' + './nodebb reset '.yellow + '{-t|-p|-w|-s|-a}'.red + '\n' +
|
||||||
|
' -t <theme>\tuse specified theme\n' +
|
||||||
|
' -p <plugin>\tdisable specified plugin\n' +
|
||||||
|
'\n' +
|
||||||
|
' -t\t\tuse default theme\n' +
|
||||||
|
' -p\t\tdisable all but core plugins\n' +
|
||||||
|
' -w\t\twidgets\n' +
|
||||||
|
' -s\t\tsettings\n' +
|
||||||
|
' -a\t\tall of the above\n',
|
||||||
|
handler: function () {
|
||||||
|
var arr = ['--reset'].concat(process.argv.slice(3));
|
||||||
|
fork(arr);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
activate: {
|
||||||
|
description: 'Activate a plugin for the next startup of NodeBB',
|
||||||
|
usage: 'Usage: ' + './nodebb activate <plugin>'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
var name = args._[1];
|
||||||
|
if (!name) {
|
||||||
|
process.stdout.write(commands.activate.usage + '\n');
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
if (name.startsWith('nodebb-theme')) {
|
||||||
|
fork(['--reset', '-t', name]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var arr = ['--activate=' + name].concat(process.argv.slice(4));
|
||||||
|
fork(arr);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
description: 'List all installed plugins',
|
||||||
|
usage: 'Usage: ' + './nodebb plugins'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
var arr = ['--plugins'].concat(process.argv.slice(3));
|
||||||
|
fork(arr);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
upgrade: {
|
||||||
|
description: 'Run NodeBB upgrade scripts, ensure packages are up-to-date',
|
||||||
|
usage: 'Usage: ' + './nodebb upgrade'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
if (process.argv[3]) {
|
||||||
|
process.stdout.write('\nUpdating NodeBB data store schema...\n'.yellow);
|
||||||
|
var arr = ['--upgrade'].concat(process.argv.slice(3));
|
||||||
|
var upgradeProc = fork(arr);
|
||||||
|
|
||||||
|
return upgradeProc.on('close', function (err) {
|
||||||
|
if (err) {
|
||||||
|
process.stdout.write('Error occurred during upgrade');
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function (next) {
|
||||||
|
packageInstall.updatePackageFile();
|
||||||
|
packageInstall.preserveExtraneousPlugins();
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... \n'.yellow);
|
||||||
|
packageInstall.npmInstallProduction();
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
process.stdout.write('OK\n'.green);
|
||||||
|
process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow);
|
||||||
|
upgradePlugins(next);
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow);
|
||||||
|
var arr = ['--upgrade'].concat(process.argv.slice(3));
|
||||||
|
var upgradeProc = fork(arr);
|
||||||
|
|
||||||
|
upgradeProc.on('close', next);
|
||||||
|
upgradeProc.on('error', next);
|
||||||
|
},
|
||||||
|
], function (err) {
|
||||||
|
if (err) {
|
||||||
|
process.stdout.write('Error occurred during upgrade');
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = 'NodeBB Upgrade Complete!';
|
||||||
|
// some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count
|
||||||
|
var columns = process.stdout.columns;
|
||||||
|
var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' ';
|
||||||
|
|
||||||
|
process.stdout.write('OK\n'.green);
|
||||||
|
process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
upgradePlugins: {
|
||||||
|
hidden: true,
|
||||||
|
description: '',
|
||||||
|
handler: function () {
|
||||||
|
upgradePlugins();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
events: {
|
||||||
|
description: 'Outputs the last ten (10) administrative events recorded by NodeBB',
|
||||||
|
usage: 'Usage: ' + './nodebb events'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
fork(['--events']);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
help: {
|
||||||
|
description: 'Display the help message for a given command',
|
||||||
|
usage: 'Usage: ' + './nodebb help <command>'.yellow,
|
||||||
|
handler: function () {
|
||||||
|
var command = commands[args._[1]];
|
||||||
|
if (command) {
|
||||||
|
process.stdout.write(command.description + '\n'.reset);
|
||||||
|
process.stdout.write(command.usage + '\n'.reset);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var keys = Object.keys(commands).filter(function (key) {
|
||||||
|
return !commands[key].hidden;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.stdout.write('\nWelcome to NodeBB\n\n'.bold);
|
||||||
|
process.stdout.write('Usage: ./nodebb {' + keys.join('|') + '}\n\n');
|
||||||
|
|
||||||
|
var usage = keys.map(function (key) {
|
||||||
|
var line = '\t' + key.yellow + (key.length < 8 ? '\t\t' : '\t');
|
||||||
|
return line + commands[key].description;
|
||||||
|
}).join('\n');
|
||||||
|
|
||||||
|
process.stdout.write(usage + '\n'.reset);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
commands['upgrade-plugins'] = commands.upgradePlugins;
|
||||||
|
|
||||||
|
if (!commands[args._[0]]) {
|
||||||
|
commands.help.handler();
|
||||||
|
} else {
|
||||||
|
commands[args._[0]].handler();
|
||||||
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
@echo off && cd %~dp0 && node ./nodebb %*
|
node ./nodebb %*
|
||||||
|
|||||||
137
package.default.json
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
{
|
||||||
|
"name": "nodebb",
|
||||||
|
"license": "GPL-3.0",
|
||||||
|
"description": "NodeBB Forum",
|
||||||
|
"version": "1.7.0",
|
||||||
|
"homepage": "http://www.nodebb.org",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/NodeBB/NodeBB/"
|
||||||
|
},
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node loader.js",
|
||||||
|
"lint": "eslint --cache ./nodebb .",
|
||||||
|
"pretest": "npm run lint",
|
||||||
|
"test": "nyc --reporter=html --reporter=text-summary mocha",
|
||||||
|
"coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ace-builds": "^1.2.9",
|
||||||
|
"async": "2.5.0",
|
||||||
|
"autoprefixer": "7.1.6",
|
||||||
|
"bcryptjs": "2.4.3",
|
||||||
|
"benchpressjs": "^1.1.2",
|
||||||
|
"body-parser": "^1.18.2",
|
||||||
|
"bootstrap": "^3.3.7",
|
||||||
|
"chart.js": "^2.7.0",
|
||||||
|
"colors": "^1.1.2",
|
||||||
|
"compression": "^1.7.1",
|
||||||
|
"connect-ensure-login": "^0.1.1",
|
||||||
|
"connect-flash": "^0.1.1",
|
||||||
|
"connect-mongo": "2.0.0",
|
||||||
|
"connect-multiparty": "^2.1.0",
|
||||||
|
"connect-redis": "3.3.2",
|
||||||
|
"cookie-parser": "^1.4.3",
|
||||||
|
"cron": "^1.3.0",
|
||||||
|
"cropperjs": "^1.1.3",
|
||||||
|
"csurf": "^1.9.0",
|
||||||
|
"daemon": "^1.1.0",
|
||||||
|
"express": "^4.16.2",
|
||||||
|
"express-session": "^1.15.6",
|
||||||
|
"express-useragent": "1.0.8",
|
||||||
|
"html-to-text": "3.3.0",
|
||||||
|
"ipaddr.js": "^1.5.4",
|
||||||
|
"jimp": "0.2.28",
|
||||||
|
"jquery": "^3.2.1",
|
||||||
|
"jsesc": "2.5.1",
|
||||||
|
"json-2-csv": "^2.1.2",
|
||||||
|
"less": "^2.7.2",
|
||||||
|
"lodash": "^4.17.4",
|
||||||
|
"logrotate-stream": "^0.2.5",
|
||||||
|
"lru-cache": "4.1.1",
|
||||||
|
"mime": "^2.0.3",
|
||||||
|
"minimist": "^1.2.0",
|
||||||
|
"mkdirp": "^0.5.1",
|
||||||
|
"mongodb": "2.2.33",
|
||||||
|
"morgan": "^1.9.0",
|
||||||
|
"mousetrap": "^1.6.1",
|
||||||
|
"nconf": "^0.8.5",
|
||||||
|
"nodebb-plugin-composer-default": "6.0.5",
|
||||||
|
"nodebb-plugin-dbsearch": "2.0.9",
|
||||||
|
"nodebb-plugin-emoji-extended": "1.1.1",
|
||||||
|
"nodebb-plugin-emoji-one": "1.2.1",
|
||||||
|
"nodebb-plugin-markdown": "8.2.0",
|
||||||
|
"nodebb-plugin-mentions": "2.2.0",
|
||||||
|
"nodebb-plugin-soundpack-default": "1.0.0",
|
||||||
|
"nodebb-plugin-spam-be-gone": "0.5.1",
|
||||||
|
"nodebb-rewards-essentials": "0.0.9",
|
||||||
|
"nodebb-theme-lavender": "5.0.0",
|
||||||
|
"nodebb-theme-persona": "7.0.1",
|
||||||
|
"nodebb-theme-slick": "1.1.1",
|
||||||
|
"nodebb-theme-vanilla": "8.0.1",
|
||||||
|
"nodebb-widget-essentials": "4.0.1",
|
||||||
|
"nodemailer": "4.3.0",
|
||||||
|
"passport": "^0.4.0",
|
||||||
|
"passport-local": "1.0.0",
|
||||||
|
"postcss": "6.0.13",
|
||||||
|
"postcss-clean": "1.1.0",
|
||||||
|
"promise-polyfill": "^6.0.2",
|
||||||
|
"prompt": "^1.0.0",
|
||||||
|
"redis": "2.8.0",
|
||||||
|
"request": "2.83.0",
|
||||||
|
"rimraf": "2.6.2",
|
||||||
|
"rss": "^1.2.2",
|
||||||
|
"sanitize-html": "^1.14.1",
|
||||||
|
"semver": "^5.4.1",
|
||||||
|
"serve-favicon": "^2.4.5",
|
||||||
|
"sitemap": "^1.13.0",
|
||||||
|
"socket.io": "2.0.4",
|
||||||
|
"socket.io-client": "2.0.4",
|
||||||
|
"socket.io-redis": "5.2.0",
|
||||||
|
"socketio-wildcard": "2.0.0",
|
||||||
|
"spdx-license-list": "^3.0.1",
|
||||||
|
"toobusy-js": "^0.5.1",
|
||||||
|
"uglify-js": "^3.1.5",
|
||||||
|
"validator": "9.0.0",
|
||||||
|
"winston": "^2.4.0",
|
||||||
|
"xml": "^1.0.1",
|
||||||
|
"xregexp": "3.2.0",
|
||||||
|
"zxcvbn": "^4.4.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"coveralls": "^3.0.0",
|
||||||
|
"eslint": "^4.9.0",
|
||||||
|
"eslint-config-airbnb-base": "^12.1.0",
|
||||||
|
"eslint-plugin-import": "^2.8.0",
|
||||||
|
"grunt": "^1.0.1",
|
||||||
|
"grunt-contrib-watch": "^1.0.0",
|
||||||
|
"jsdom": "^11.3.0",
|
||||||
|
"mocha": "^4.0.1",
|
||||||
|
"mocha-lcov-reporter": "^1.3.0",
|
||||||
|
"nyc": "^11.2.1"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/NodeBB/NodeBB/issues"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "Andrew Rodrigues",
|
||||||
|
"email": "andrew@nodebb.org",
|
||||||
|
"url": "https://github.com/psychobunny"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Julian Lam",
|
||||||
|
"email": "julian@nodebb.org",
|
||||||
|
"url": "https://github.com/julianlam"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Barış Soner Uşaklı",
|
||||||
|
"email": "baris@nodebb.org",
|
||||||
|
"url": "https://github.com/barisusakli"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
public/images/emails/banneduser.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
public/images/emails/digestheader.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
public/images/emails/emailconfirm.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
public/images/emails/invitation.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/images/emails/newtopic.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
public/images/emails/nodebb.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
public/images/emails/password.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
public/images/emails/triangularbackground.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/images/emails/unreadpost.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
@@ -1,3 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
The following stylesheet is only included on pages that can execute javascript
|
The following stylesheet is only included on pages that can execute javascript
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
.page-topic [component="post/content"] img:not(.not-responsive):not([data-state]) {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Important note about localising NodeBB
|
|
||||||
|
|
||||||
The files here are read-only and overwritten daily (if there are changes) by the
|
|
||||||
helper bot [Misty](https://github.com/nodebb-misty).
|
|
||||||
|
|
||||||
Our localisation efforts are handled via [our Transifex Project](https://www.transifex.com/nodebb/nodebb/),
|
|
||||||
and any pull requests made to this directory will be automatically closed because
|
|
||||||
localisations can go out-of-sync when edited directly.
|
|
||||||
|
|
||||||
If there are non-localised strings and you cannot find them in Transifex, please
|
|
||||||
[open a new issue on our bug tracker](https://github.com/NodeBB/NodeBB/issues/new)
|
|
||||||
so we can take a look.
|
|
||||||
|
|
||||||
Thank you for helping localise NodeBB!
|
|
||||||
3
public/language/TODO
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
NPM INSTALL
|
||||||
|
For now, language packs will be stored here. Eventually, will be moved to server side to allow for npm install-ability.
|
||||||
|
When that happens, server code will generate compressed JSON language files in this folder.
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"alert.confirm-rebuild-and-restart": "هل أنت متأكد إنك تريد إعادة بناء وتشغيل الـ NodeBB؟",
|
"alert.confirm-reload": "Are you sure you wish to reload NodeBB?",
|
||||||
"alert.confirm-restart": "هل تريد بالتأكيد إعادة تشغيل NodeBB؟",
|
"alert.confirm-restart": "Are you sure you wish to restart NodeBB?",
|
||||||
|
|
||||||
"acp-title": "لوحة تحكم إدارة NodeBB | %1",
|
"acp-title": "%1 | NodeBB Admin Control Panel",
|
||||||
"settings-header-contents": "محتويات"
|
"settings-header-contents": "Contents"
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"post-cache": "التخزين المؤقت للمشاركات",
|
"post-cache": "Post Cache",
|
||||||
"posts-in-cache": "المشاركات المخزنة مؤقتاً",
|
"posts-in-cache": "Posts in Cache",
|
||||||
"average-post-size": "متوسط حجم المشاركة",
|
"average-post-size": "Average Post Size",
|
||||||
"length-to-max": "الطول / أقصى حد",
|
"length-to-max": "Length / Max",
|
||||||
"percent-full": "1% كاملة",
|
"percent-full": "%1% Full",
|
||||||
"post-cache-size": "حجم التخزين المؤقت للمشاركات",
|
"post-cache-size": "Post Cache Size",
|
||||||
"items-in-cache": "العناصر في التخزين المؤقت",
|
"items-in-cache": "Items in Cache",
|
||||||
"control-panel": "لوحة التحكم",
|
"control-panel": "Control Panel",
|
||||||
"update-settings": "تحديث إعدادات التخزين المؤقت"
|
"update-settings": "Update Cache Settings"
|
||||||
}
|
}
|
||||||
@@ -16,37 +16,21 @@
|
|||||||
"mongo.index-size": "Index Size",
|
"mongo.index-size": "Index Size",
|
||||||
"mongo.file-size": "File Size",
|
"mongo.file-size": "File Size",
|
||||||
"mongo.resident-memory": "Resident Memory",
|
"mongo.resident-memory": "Resident Memory",
|
||||||
"mongo.virtual-memory": "الذاكرة الإفتراضية",
|
"mongo.virtual-memory": "Virtual Memory",
|
||||||
"mongo.mapped-memory": "Mapped Memory",
|
"mongo.mapped-memory": "Mapped Memory",
|
||||||
"mongo.bytes-in": "Bytes In",
|
|
||||||
"mongo.bytes-out": "Bytes Out",
|
|
||||||
"mongo.num-requests": "Number of Requests",
|
|
||||||
"mongo.raw-info": "MongoDB Raw Info",
|
"mongo.raw-info": "MongoDB Raw Info",
|
||||||
"mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.",
|
|
||||||
|
|
||||||
"redis": "Redis",
|
"redis": "Redis",
|
||||||
"redis.version": "Redis Version",
|
"redis.version": "Redis Version",
|
||||||
"redis.keys": "Keys",
|
|
||||||
"redis.expires": "Expires",
|
|
||||||
"redis.avg-ttl": "Average TTL",
|
|
||||||
"redis.connected-clients": "Connected Clients",
|
"redis.connected-clients": "Connected Clients",
|
||||||
"redis.connected-slaves": "Connected Slaves",
|
"redis.connected-slaves": "Connected Slaves",
|
||||||
"redis.blocked-clients": "Blocked Clients",
|
"redis.blocked-clients": "Blocked Clients",
|
||||||
"redis.used-memory": "الذاكرة المستخدمة",
|
"redis.used-memory": "Used Memory",
|
||||||
"redis.memory-frag-ratio": "Memory Fragmentation Ratio",
|
"redis.memory-frag-ratio": "Memory Fragmentation Ratio",
|
||||||
"redis.total-connections-recieved": "إجمالي الاتصالات المستلمة",
|
"redis.total-connections-recieved": "Total Connections Received",
|
||||||
"redis.total-commands-processed": "إجمالي الأوامر التي تمت معالجتها",
|
"redis.total-commands-processed": "Total Commands Processed",
|
||||||
"redis.iops": "Instantaneous Ops. Per Second",
|
"redis.iops": "Instantaneous Ops. Per Second",
|
||||||
"redis.iinput": "Instantaneous Input Per Second",
|
|
||||||
"redis.ioutput": "Instantaneous Output Per Second",
|
|
||||||
"redis.total-input": "Total Input",
|
|
||||||
"redis.total-output": "Total Ouput",
|
|
||||||
|
|
||||||
"redis.keyspace-hits": "Keyspace Hits",
|
"redis.keyspace-hits": "Keyspace Hits",
|
||||||
"redis.keyspace-misses": "Keyspace Misses",
|
"redis.keyspace-misses": "Keyspace Misses",
|
||||||
"redis.raw-info": "Redis Raw Info",
|
"redis.raw-info": "Redis Raw Info"
|
||||||
|
}
|
||||||
"postgres": "Postgres",
|
|
||||||
"postgres.version": "PostgreSQL Version",
|
|
||||||
"postgres.raw-info": "Postgres Raw Info"
|
|
||||||
}
|
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"figure-x": "شكل %1",
|
"figure-x": "Figure %1",
|
||||||
"error-events-per-day": "<code>%1</code> حدث كل يوم ",
|
"error-events-per-day": "<code>%1</code> events per day",
|
||||||
"error.404": "404 لم يتم العثور",
|
"error.404": "404 Not Found",
|
||||||
"error.503": "503 الخدمة غير متوفرة",
|
"error.503": "503 Service Unavailable",
|
||||||
"manage-error-log": "إدارة سجل الأخطاء",
|
"manage-error-log": "Manage Error Log",
|
||||||
"export-error-log": "تصدير سجل الأخطاء (CSV)",
|
"export-error-log": "Export Error Log (CSV)",
|
||||||
"clear-error-log": "محو سجل الأخطاء",
|
"clear-error-log": "Clear Error Log",
|
||||||
"route": "مسار",
|
"route": "Route",
|
||||||
"count": "عدد",
|
"count": "Count",
|
||||||
"no-routes-not-found": "لا توجد اخطاء 404!",
|
"no-routes-not-found": "Hooray! No 404 errors!",
|
||||||
"clear404-confirm": "هل تريد بالتأكيد محو سجلات الخطأ 404؟",
|
"clear404-confirm": "Are you sure you wish to clear the 404 error logs?",
|
||||||
"clear404-success": "أخطاء \"404 لم يتم العثور\" تم محوها بنجاح"
|
"clear404-success": "\"404 Not Found\" errors cleared"
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,6 @@
|
|||||||
{
|
{
|
||||||
"events": "أحداث",
|
"events": "Events",
|
||||||
"no-events": "لا توجد أحداث",
|
"no-events": "There are no events",
|
||||||
"control-panel": "لوحة تحكم الأحداث",
|
"control-panel": "Events Control Panel",
|
||||||
"filters": "Filters",
|
"delete-events": "Delete Events"
|
||||||
"filters-apply": "Apply Filters",
|
|
||||||
"filter-type": "Event Type",
|
|
||||||
"filter-start": "Start Date",
|
|
||||||
"filter-end": "End Date",
|
|
||||||
"filter-perPage": "Per Page"
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"logs": "السجلات",
|
"logs": "Logs",
|
||||||
"control-panel": "لوحة تحكم السجلات",
|
"control-panel": "Logs Control Panel",
|
||||||
"reload": "إعادة تحميل السجلات",
|
"reload": "Reload Logs",
|
||||||
"clear": "محو السجلات",
|
"clear": "Clear Logs",
|
||||||
"clear-success": "تم محو السجلات!"
|
"clear-success": "Logs Cleared!"
|
||||||
}
|
}
|
||||||
@@ -1,16 +1,12 @@
|
|||||||
{
|
{
|
||||||
"custom-css": "Custom CSS/LESS",
|
"custom-css": "Custom CSS",
|
||||||
"custom-css.description": "Enter your own CSS/LESS declarations here, which will be applied after all other styles.",
|
"custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.",
|
||||||
"custom-css.enable": "Enable Custom CSS/LESS",
|
"custom-css.enable": "Enable Custom CSS",
|
||||||
|
|
||||||
"custom-js": "Javascript مخصصة",
|
"custom-header": "Custom Header",
|
||||||
"custom-js.description": "أدخل Javascript الخاص بك هنا. سيتم تنفيذها بعد تحميل الصفحة بالكامل.",
|
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||||
"custom-js.enable": "تفعيل Javascript المخصصة",
|
"custom-header.enable": "Enable Custom Header",
|
||||||
|
|
||||||
"custom-header": "ترويسة مخصصة",
|
"custom-css.livereload": "Enable Live Reload",
|
||||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-js\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
"custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save"
|
||||||
"custom-header.enable": "تفعيل الترويسة المخصصة",
|
|
||||||
|
|
||||||
"custom-css.livereload": "تفعيل إعادة التحميل المباشرة",
|
|
||||||
"custom-css.livereload.description": "فعل هذا الخيار لإجبار جميع الجلسات في الأجهزة التي قمت بتسجيل الدخول فيها بحسابك على التحديث عند النقر على زر الحفظ"
|
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"loading": "جاري تحميل السمات...",
|
"loading": "Loading Skins...",
|
||||||
"homepage": "الصفحة الرئيسية",
|
"homepage": "Homepage",
|
||||||
"select-skin": "إختيار السمة",
|
"select-skin": "Select Skin",
|
||||||
"current-skin": "السمة الحالية",
|
"current-skin": "Current Skin",
|
||||||
"skin-updated": "تم تحديث السمة",
|
"skin-updated": "Skin Updated",
|
||||||
"applied-success": "تم تطبيق السمة %1 بنجاح",
|
"applied-success": "%1 skin was succesfully applied",
|
||||||
"revert-success": "تم إستعادة الألوان الاساسية للسمة"
|
"revert-success": "Skin reverted to base colours"
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"checking-for-installed": "جاري التحقق من القوالب المثبتة...",
|
"checking-for-installed": "Checking for installed themes...",
|
||||||
"homepage": "الصفحة الرئيسية",
|
"homepage": "Homepage",
|
||||||
"select-theme": "إختيار القالب",
|
"select-theme": "Select Theme",
|
||||||
"current-theme": "القالب المستخدم حالياً",
|
"current-theme": "Current Theme",
|
||||||
"no-themes": "لم يتم العثور على قوالب مثبتة",
|
"no-themes": "No installed themes found",
|
||||||
"revert-confirm": "هل أنت متأكد من أنك ترغب في استعادة قااب NodeBB الافتراضي؟",
|
"revert-confirm": "Are you sure you wish to restore the default NodeBB theme?",
|
||||||
"theme-changed": "تم تغيير القالب",
|
"theme-changed": "Theme Changed",
|
||||||
"revert-success": "لقد قمت بنجاح بإستعادة القالب الأساسي لـNodeBB",
|
"revert-success": "You have successfully reverted your NodeBB back to it's default theme.",
|
||||||
"restart-to-activate": "Please rebuild and restart your NodeBB to fully activate this theme."
|
"restart-to-activate": "Please restart your NodeBB to fully activate this theme"
|
||||||
}
|
}
|
||||||
@@ -7,8 +7,7 @@
|
|||||||
"online": "online",
|
"online": "online",
|
||||||
"git": "git",
|
"git": "git",
|
||||||
"memory": "memory",
|
"memory": "memory",
|
||||||
"load": "system load",
|
"load": "load",
|
||||||
"cpu-usage": "cpu usage",
|
|
||||||
"uptime": "uptime",
|
"uptime": "uptime",
|
||||||
|
|
||||||
"registered": "Registered",
|
"registered": "Registered",
|
||||||
|
|||||||
@@ -1,56 +1,51 @@
|
|||||||
{
|
{
|
||||||
"installed": "منصبة",
|
"installed": "Installed",
|
||||||
"active": "مفعلة",
|
"active": "Active",
|
||||||
"inactive": "معطلة",
|
"inactive": "Inactive",
|
||||||
"out-of-date": "غير محدثة",
|
"out-of-date": "Out of Date",
|
||||||
"none-found": "لم يتم العثور على إضافات",
|
"none-found": "No plugins found.",
|
||||||
"none-active": "لا توجد إضافات مفعلة",
|
"none-active": "No Active Plugins",
|
||||||
"find-plugins": "العثور على الإضافات",
|
"find-plugins": "Find Plugins",
|
||||||
|
|
||||||
"plugin-search": "البحث عن الإضافات",
|
"plugin-search": "Plugin Search",
|
||||||
"plugin-search-placeholder": "جاري البحث عن الإضافات...",
|
"plugin-search-placeholder": "Search for plugin...",
|
||||||
"submit-anonymous-usage": "Submit anonymous plugin usage data.",
|
"reorder-plugins": "Re-order Plugins",
|
||||||
"reorder-plugins": "إعادة ترتيب الإضافات",
|
"order-active": "Order Active Plugins",
|
||||||
"order-active": "ترتيب الإضافات المفعلة",
|
"dev-interested": "Interested in writing plugins for NodeBB?",
|
||||||
"dev-interested": "هل انته مهتم ببرمجة إضافات لـNodeBB؟",
|
"docs-info": "Full documentation regarding plugin authoring can be found in the <a target=\"_blank\" href=\"https://docs.nodebb.org/development/plugins/\">NodeBB Docs Portal</a>.",
|
||||||
"docs-info": "دليل كامل حول برمجة الإضافات بالإمكان العثور عليه في <a target=\"_blank\" href=\"https://docs.nodebb.org/development/plugins/\"> NodeBB Docs Portal</a>.",
|
|
||||||
|
|
||||||
"order.description": "بعض الإضافات تعمل بشكل مثالي عندما يتم تفعيلها قبل أو بعد الإضافات الأخرى.",
|
"order.description": "Certain plugins work ideally when they are initialised before/after other plugins.",
|
||||||
"order.explanation": "يتم تحميل الإضافات حسب الترتيب المحدد هنا، من الأعلى إلى الأسفل",
|
"order.explanation": "Plugins load in the order specified here, from top to bottom",
|
||||||
|
|
||||||
"plugin-item.themes": "القوالب",
|
"plugin-item.themes": "Themes",
|
||||||
"plugin-item.deactivate": "تعطيل",
|
"plugin-item.deactivate": "Deactivate",
|
||||||
"plugin-item.activate": "تفعيل",
|
"plugin-item.activate": "Activate",
|
||||||
"plugin-item.install": "تنصيب",
|
"plugin-item.install": "Install",
|
||||||
"plugin-item.uninstall": "إلغاء التنصيب",
|
"plugin-item.uninstall": "Uninstall",
|
||||||
"plugin-item.settings": "الإعدادات",
|
"plugin-item.settings": "Settings",
|
||||||
"plugin-item.installed": "المنصبة",
|
"plugin-item.installed": "Installed",
|
||||||
"plugin-item.latest": "الأحدث",
|
"plugin-item.latest": "Latest",
|
||||||
"plugin-item.upgrade": "ترقية",
|
"plugin-item.upgrade": "Upgrade",
|
||||||
"plugin-item.more-info": "لمزيد من المعلومات:",
|
"plugin-item.more-info": "For more information:",
|
||||||
"plugin-item.unknown": "غير معروف",
|
"plugin-item.unknown": "Unknown",
|
||||||
"plugin-item.unknown-explanation": "تعذر تحديد حالة هذه الإضافة، ربما بسبب خطأ في الإعدادات.",
|
"plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.",
|
||||||
"plugin-item.compatible": "This plugin works on NodeBB %1",
|
|
||||||
"plugin-item.not-compatible": "This plugin has no compatibility data, make sure it works before installing on your production environment.",
|
|
||||||
|
|
||||||
"alert.enabled": "الإضافة مفعلة",
|
"alert.enabled": "Plugin Enabled",
|
||||||
"alert.disabled": "الإضافة معطلة",
|
"alert.disabled": "Plugin Disabled",
|
||||||
"alert.upgraded": "الإضافة مرقاة",
|
"alert.upgraded": "Plugin Upgraded",
|
||||||
"alert.installed": "الإضافة منصبة",
|
"alert.installed": "Plugin Installed",
|
||||||
"alert.uninstalled": "تم إلغاء تنصيب الإضافة",
|
"alert.uninstalled": "Plugin Uninstalled",
|
||||||
"alert.activate-success": "يرجى إعادة تشغيل NodeBB لتنشيط الإضافة بشكل بالكامل",
|
"alert.activate-success": "Please restart your NodeBB to fully activate this plugin",
|
||||||
"alert.deactivate-success": "تم تعطيل الإضافة بنجاح",
|
"alert.deactivate-success": "Plugin successfully deactivated",
|
||||||
"alert.upgrade-success": "Please rebuild and restart your NodeBB to fully upgrade this plugin.",
|
"alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin",
|
||||||
"alert.install-success": "تم تثبيت الإضافة بنجاح، يرجى تفعيلها.",
|
"alert.install-success": "Plugin successfully installed, please activate the plugin.",
|
||||||
"alert.uninstall-success": "تم تعطيل الإضافة وإلغاء تنصيبها بنجاح.",
|
"alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.",
|
||||||
"alert.suggest-error": "<p>NodeBB could not reach the package manager, proceed with installation of latest version?</p><div class=\"alert alert-danger\"><strong>Server returned (%1)</strong>: %2</div>",
|
"alert.suggest-error": "<p>NodeBB could not reach the package manager, proceed with installation of latest version?</p><div class=\"alert alert-danger\"><strong>Server returned (%1)</strong>: %2</div>",
|
||||||
"alert.package-manager-unreachable": "<p>NodeBB could not reach the package manager, an upgrade is not suggested at this time.</p>",
|
"alert.package-manager-unreachable": "<p>NodeBB could not reach the package manager, an upgrade is not suggested at this time.</p>",
|
||||||
"alert.incompatible": "<p>Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.</p>",
|
"alert.incompatible": "<p>Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.</p>",
|
||||||
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>No Compatibility Information Found</strong></p><p>This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.</p></div><p>In the event that NodeBB cannot boot properly:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Continue installation of latest version of this plugin?</p>",
|
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>No Compatibility Information Found</strong></p><p>This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.</p></div><p>In the event that NodeBB cannot boot properly:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Continue installation of latest version of this plugin?</p>",
|
||||||
"alert.reorder": "Plugins Re-ordered",
|
|
||||||
"alert.reorder-success": "Please rebuild and restart your NodeBB to fully complete the process.",
|
|
||||||
|
|
||||||
"license.title": "معلومات ترخيص الإضافة",
|
"license.title": "Plugin License Information",
|
||||||
"license.intro": "The plugin <strong>%1</strong> is licensed under the %2. Please read and understand the license terms prior to activating this plugin.",
|
"license.intro": "The plugin <strong>%1</strong> is licensed under the %2. Please read and understand the license terms prior to activating this plugin.",
|
||||||
"license.cta": "هل ترغب بالاستمرار في تفعيل هذه الإضافة؟"
|
"license.cta": "Do you wish to continue with activating this plugin?"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"available": "Available Widgets",
|
"available": "Available Widgets",
|
||||||
"explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.",
|
"explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.",
|
||||||
"none-installed": "No widgets found! Activate the essential widgets plugin in the <a href=\"%1\">plugins</a> control panel.",
|
"none-installed": "No widgets found! Activate the essential widgets plugin in the <a href=\"%1\">plugins</a> control panel.",
|
||||||
"clone-from": "Clone widgets from",
|
|
||||||
"containers.available": "Available Containers",
|
"containers.available": "Available Containers",
|
||||||
"containers.explanation": "Drag and drop on top of any active widget",
|
"containers.explanation": "Drag and drop on top of any active widget",
|
||||||
"containers.none": "None",
|
"containers.none": "None",
|
||||||
@@ -15,16 +14,6 @@
|
|||||||
|
|
||||||
"alert.confirm-delete": "Are you sure you wish to delete this widget?",
|
"alert.confirm-delete": "Are you sure you wish to delete this widget?",
|
||||||
"alert.updated": "Widgets Updated",
|
"alert.updated": "Widgets Updated",
|
||||||
"alert.update-success": "Successfully updated widgets",
|
"alert.update-success": "Successfully updated widgets"
|
||||||
"alert.clone-success": "Successfully cloned widgets",
|
|
||||||
|
|
||||||
"error.select-clone": "Please select a page to clone from",
|
|
||||||
|
|
||||||
"title": "Title",
|
|
||||||
"title.placeholder": "Title (only shown on some containers)",
|
|
||||||
"container": "Container",
|
|
||||||
"container.placeholder": "Drag and drop a container or enter HTML here.",
|
|
||||||
"show-to-groups": "Show to groups",
|
|
||||||
"hide-from-groups": "Hide from groups",
|
|
||||||
"hide-on-mobile": "Hide on mobile"
|
|
||||||
}
|
}
|
||||||
@@ -1,79 +1,69 @@
|
|||||||
{
|
{
|
||||||
"forum-traffic": "Forum Traffic",
|
"forum-traffic": "Forum Traffic",
|
||||||
"page-views": "مشاهدات الصفحات",
|
"page-views": "Page Views",
|
||||||
"unique-visitors": "زائرين فريدين",
|
"unique-visitors": "Unique Visitors",
|
||||||
"new-users": "New Users",
|
"users": "Users",
|
||||||
"posts": "مشاركات",
|
"posts": "Posts",
|
||||||
"topics": "مواضيع",
|
"topics": "Topics",
|
||||||
"page-views-seven": "آخر 7 ايام",
|
"page-views-seven": "Last 7 Days",
|
||||||
"page-views-thirty": "آخر 30 يوماً",
|
"page-views-thirty": "Last 30 Days",
|
||||||
"page-views-last-day": "آخر 24 ساعة",
|
"page-views-last-day": "Last 24 hours",
|
||||||
"page-views-custom": "مدة زمنية مخصصة",
|
"page-views-custom": "Custom Date Range",
|
||||||
"page-views-custom-start": "بداية المدة",
|
"page-views-custom-start": "Range Start",
|
||||||
"page-views-custom-end": "نهاية المده",
|
"page-views-custom-end": "Range End",
|
||||||
"page-views-custom-help": "أدخل نطاقا زمنيا لمرات مشاهدة الصفحات التي ترغب في عرضها. إذا لم يظهر منتقي التاريخ، فإن التنسيق المقبول هو <code>YYYY-MM-DD</code>",
|
"page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is <code>YYYY-MM-DD</code>",
|
||||||
"page-views-custom-error": "الرجاء إدخال نطاق تاريخ صالح بالتنسيق <code>YYYY-MM-DD</code>",
|
"page-views-custom-error": "Please enter a valid date range in the format <code>YYYY-MM-DD</code>",
|
||||||
|
|
||||||
"stats.yesterday": "Yesterday",
|
"stats.day": "Day",
|
||||||
"stats.today": "Today",
|
"stats.week": "Week",
|
||||||
"stats.last-week": "Last Week",
|
"stats.month": "Month",
|
||||||
"stats.this-week": "This Week",
|
"stats.all": "All Time",
|
||||||
"stats.last-month": "Last Month",
|
|
||||||
"stats.this-month": "This Month",
|
|
||||||
"stats.all": "كل الوقت",
|
|
||||||
|
|
||||||
"updates": "تحديثات",
|
"updates": "Updates",
|
||||||
"running-version": "المنتدى يعمل حاليا على <strong>NodeBB الإصدار<span id=\"version\">%1</span></strong>.",
|
"running-version": "You are running <strong>NodeBB v<span id=\"version\">%1</span></strong>.",
|
||||||
"keep-updated": "تأكد دائما من أن NodeBB يعمل على احدث إصدار للحصول على أحدث التصحيحات الأمنية وإصلاحات الأخطاء.",
|
"keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.",
|
||||||
"up-to-date": "<p>المنتدى <strong>يعمل على أحدث إصدار</strong> <i class=\"fa fa-check\"></i></p>",
|
"up-to-date": "<p>You are <strong>up-to-date</strong> <i class=\"fa fa-check\"></i></p>",
|
||||||
"upgrade-available": "<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">upgrading your NodeBB</a>.</p>",
|
"upgrade-available": "<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\">upgrading your NodeBB</a>.</p>",
|
||||||
"prerelease-upgrade-available": "<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">upgrading your NodeBB</a>.</p>",
|
"prerelease-upgrade-available": "<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\">upgrading your NodeBB</a>.</p>",
|
||||||
"prerelease-warning": "<p>هذه نسخة <strong>ماقبل الإصدار</strong> من NodeBB. قد تحدث أخطاء غير مقصودة. <i class=\"fa fa-exclamation-triangle\"></i></p>",
|
"prerelease-warning": "<p>This is a <strong>pre-release</strong> version of NodeBB. Unintended bugs may occur. <i class=\"fa fa-exclamation-triangle\"></i></p>",
|
||||||
"running-in-development": "المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.",
|
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
|
||||||
"latest-lookup-failed": "<p>Failed to look up latest available version of NodeBB</p>",
|
|
||||||
|
|
||||||
"notices": "إشعارات",
|
"notices": "Notices",
|
||||||
"restart-not-required": "إعادة التشغيل غير مطلوب",
|
"restart-not-required": "Restart not required",
|
||||||
"restart-required": "إعادة التشغيل مطلوبة",
|
"restart-required": "Restart required",
|
||||||
"search-plugin-installed": "إضافة البحث منصبة",
|
"search-plugin-installed": "Search Plugin installed",
|
||||||
"search-plugin-not-installed": "إضافة البحث غير منصبة",
|
"search-plugin-not-installed": "Search Plugin not installed",
|
||||||
"search-plugin-tooltip": "نصب إضافة البحث من صفحة الإضافات البرمجية لتنشيط وظيفة البحث",
|
"search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality",
|
||||||
|
|
||||||
"control-panel": "التحكم بالنظام",
|
"control-panel": "System Control",
|
||||||
"rebuild-and-restart": "Rebuild & Restart",
|
"reload": "Reload",
|
||||||
"restart": "Restart",
|
"restart": "Restart",
|
||||||
"restart-warning": "Rebuilding or Restarting your NodeBB will drop all existing connections for a few seconds.",
|
"restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.",
|
||||||
"restart-disabled": "Rebuilding and Restarting your NodeBB has been disabled as you do not seem to be running it via the appropriate daemon.",
|
"maintenance-mode": "Maintenance Mode",
|
||||||
"maintenance-mode": "وضع الصيانة",
|
"maintenance-mode-title": "Click here to set up maintenance mode for NodeBB",
|
||||||
"maintenance-mode-title": "انقر هنا لإعداد وضع الصيانة لـNodeBB",
|
"realtime-chart-updates": "Realtime Chart Updates",
|
||||||
"realtime-chart-updates": "التحديث الفوري للرسم البياني",
|
|
||||||
|
|
||||||
"active-users": "المستخدمين النشطين",
|
"active-users": "Active Users",
|
||||||
"active-users.users": "الأعضاء",
|
"active-users.users": "Users",
|
||||||
"active-users.guests": "الزوار",
|
"active-users.guests": "Guests",
|
||||||
"active-users.total": "المجموع",
|
"active-users.total": "Total",
|
||||||
"active-users.connections": "Connections",
|
"active-users.connections": "Connections",
|
||||||
|
|
||||||
"anonymous-registered-users": "المجهولين مقابل المستخدمين المسجلين",
|
"anonymous-registered-users": "Anonymous vs Registered Users",
|
||||||
"anonymous": "مجهول",
|
"anonymous": "Anonymous",
|
||||||
"registered": "مسجل",
|
"registered": "Registered",
|
||||||
|
|
||||||
"user-presence": "تواجد المستخدمين",
|
"user-presence": "User Presence",
|
||||||
"on-categories": "في قائمة الأقسام",
|
"on-categories": "On categories list",
|
||||||
"reading-posts": "قراءة المشاركات",
|
"reading-posts": "Reading posts",
|
||||||
"browsing-topics": "تصفح المواضيع",
|
"browsing-topics": "Browsing topics",
|
||||||
"recent": "الأخيرة",
|
"recent": "Recent",
|
||||||
"unread": "غير مقروء",
|
"unread": "Unread",
|
||||||
|
|
||||||
"high-presence-topics": "مواضيع ذات حضور قوي",
|
"high-presence-topics": "High Presence Topics",
|
||||||
|
|
||||||
"graphs.page-views": "مشاهدات الصفحة",
|
"graphs.page-views": "Page Views",
|
||||||
"graphs.page-views-registered": "Page Views Registered",
|
"graphs.unique-visitors": "Unique Visitors",
|
||||||
"graphs.page-views-guest": "Page Views Guest",
|
"graphs.registered-users": "Registered Users",
|
||||||
"graphs.page-views-bot": "Page Views Bot",
|
"graphs.anonymous-users": "Anonymous Users"
|
||||||
"graphs.unique-visitors": "زوار فريدين",
|
|
||||||
"graphs.registered-users": "مستخدمين مسجلين",
|
|
||||||
"graphs.anonymous-users": "مستخدمين مجهولين",
|
|
||||||
"last-restarted-by": "Last restarted by",
|
|
||||||
"no-users-browsing": "No users browsing"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,5 @@
|
|||||||
"description": "Choose what page is shown when users navigate to the root URL of your forum.",
|
"description": "Choose what page is shown when users navigate to the root URL of your forum.",
|
||||||
"home-page-route": "Home Page Route",
|
"home-page-route": "Home Page Route",
|
||||||
"custom-route": "Custom Route",
|
"custom-route": "Custom Route",
|
||||||
"allow-user-home-pages": "Allow User Home Pages",
|
"allow-user-home-pages": "Allow User Home Pages"
|
||||||
"home-page-title": "Title of the home page (default \"Home\")"
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"language-settings": "اعدادات اللغة",
|
"language-settings": "Language Settings",
|
||||||
"description": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
|
"description": "The default language determines the language settings for all users who are visiting your forum. <br />Individual users can override the default language on their account settings page.",
|
||||||
"default-language": "اللغة الافتراضية",
|
"default-language": "Default Language",
|
||||||
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي"
|
"auto-detect": "Auto Detect Language Setting for Guests"
|
||||||
}
|
}
|
||||||
@@ -5,13 +5,18 @@
|
|||||||
"tooltip": "Tooltip:",
|
"tooltip": "Tooltip:",
|
||||||
"text": "Text:",
|
"text": "Text:",
|
||||||
"text-class": "Text Class: <small>optional</small>",
|
"text-class": "Text Class: <small>optional</small>",
|
||||||
"class": "Class: <small>optional</small>",
|
|
||||||
"id": "ID: <small>optional</small>",
|
"id": "ID: <small>optional</small>",
|
||||||
|
|
||||||
"properties": "Properties:",
|
"properties": "Properties:",
|
||||||
"groups": "Groups:",
|
"only-admins": "Only display to Admins",
|
||||||
|
"only-global-mods-and-admins": "Only display to Global Moderators and Admins",
|
||||||
|
"only-logged-in": "Only display to logged in users",
|
||||||
|
"only-guest": "Only display to guests",
|
||||||
"open-new-window": "Open in a new window",
|
"open-new-window": "Open in a new window",
|
||||||
|
|
||||||
|
"installed-plugins-required": "Installed Plugins Required:",
|
||||||
|
"search-plugin": "Search plugin",
|
||||||
|
|
||||||
"btn.delete": "Delete",
|
"btn.delete": "Delete",
|
||||||
"btn.disable": "Disable",
|
"btn.disable": "Disable",
|
||||||
"btn.enable": "Enable",
|
"btn.enable": "Enable",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"notifications": "التنبيهات",
|
"notifications": "Notifications",
|
||||||
"chat-messages": "Chat Messages",
|
"chat-messages": "Chat Messages",
|
||||||
"play-sound": "Play",
|
"play-sound": "Play",
|
||||||
"incoming-message": "Incoming Message",
|
"incoming-message": "Incoming Message",
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"administrators": "Administrators",
|
|
||||||
"global-moderators": "Global Moderators",
|
|
||||||
"no-global-moderators": "No Global Moderators",
|
|
||||||
"moderators-of-category": "%1 Moderators",
|
|
||||||
"no-moderators": "No Moderators",
|
|
||||||
"add-administrator": "Add Administrator",
|
|
||||||
"add-global-moderator": "Add Global Moderator",
|
|
||||||
"add-moderator": "Add Moderator"
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"settings": "اعدادات القسم",
|
"settings": "Category Settings",
|
||||||
"privileges": "الصلاحيات",
|
"privileges": "Privileges",
|
||||||
|
|
||||||
"name": "Category Name",
|
"name": "Category Name",
|
||||||
"description": "Category Description",
|
"description": "Category Description",
|
||||||
@@ -17,10 +17,8 @@
|
|||||||
"parent-category": "Parent Category",
|
"parent-category": "Parent Category",
|
||||||
"optional-parent-category": "(Optional) Parent Category",
|
"optional-parent-category": "(Optional) Parent Category",
|
||||||
"parent-category-none": "(None)",
|
"parent-category-none": "(None)",
|
||||||
"copy-parent": "Copy Parent",
|
|
||||||
"copy-settings": "Copy Settings From",
|
"copy-settings": "Copy Settings From",
|
||||||
"optional-clone-settings": "(Optional) Clone Settings From Category",
|
"optional-clone-settings": "(Optional) Clone Settings From Category",
|
||||||
"clone-children": "Clone Children Categories And Settings",
|
|
||||||
"purge": "Purge Category",
|
"purge": "Purge Category",
|
||||||
|
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
@@ -30,13 +28,11 @@
|
|||||||
"select-category": "Select Category",
|
"select-category": "Select Category",
|
||||||
"set-parent-category": "Set Parent Category",
|
"set-parent-category": "Set Parent Category",
|
||||||
|
|
||||||
"privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.",
|
"privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. You can add a new user to this table by searching for them in the form below.",
|
||||||
"privileges.category-selector": "Configuring privileges for ",
|
|
||||||
"privileges.warning": "<strong>Note</strong>: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.",
|
"privileges.warning": "<strong>Note</strong>: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.",
|
||||||
"privileges.section-viewing": "Viewing Privileges",
|
"privileges.section-viewing": "Viewing Privileges",
|
||||||
"privileges.section-posting": "Posting Privileges",
|
"privileges.section-posting": "Posting Privileges",
|
||||||
"privileges.section-moderation": "Moderation Privileges",
|
"privileges.section-moderation": "Moderation Privileges",
|
||||||
"privileges.section-other": "Other",
|
|
||||||
"privileges.section-user": "User",
|
"privileges.section-user": "User",
|
||||||
"privileges.search-user": "Add User",
|
"privileges.search-user": "Add User",
|
||||||
"privileges.no-users": "No user-specific privileges in this category.",
|
"privileges.no-users": "No user-specific privileges in this category.",
|
||||||
@@ -45,12 +41,7 @@
|
|||||||
"privileges.search-group": "Add Group",
|
"privileges.search-group": "Add Group",
|
||||||
"privileges.copy-to-children": "Copy to Children",
|
"privileges.copy-to-children": "Copy to Children",
|
||||||
"privileges.copy-from-category": "Copy from Category",
|
"privileges.copy-from-category": "Copy from Category",
|
||||||
"privileges.copy-privileges-to-all-categories": "Copy to All Categories",
|
|
||||||
"privileges.copy-group-privileges-to-children": "Copy this group's privileges to the children of this category.",
|
|
||||||
"privileges.copy-group-privileges-to-all-categories": "Copy this group's privileges to all categories.",
|
|
||||||
"privileges.copy-group-privileges-from": "Copy this group's privileges from another category.",
|
|
||||||
"privileges.inherit": "If the <code>registered-users</code> group is granted a specific privilege, all other groups receive an <strong>implicit privilege</strong>, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the <code>registered-users</code> user group, and so, privileges for additional groups need not be explicitly granted.",
|
"privileges.inherit": "If the <code>registered-users</code> group is granted a specific privilege, all other groups receive an <strong>implicit privilege</strong>, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the <code>registered-users</code> user group, and so, privileges for additional groups need not be explicitly granted.",
|
||||||
"privileges.copy-success": "Privileges copied!",
|
|
||||||
|
|
||||||
"analytics.back": "Back to Categories List",
|
"analytics.back": "Back to Categories List",
|
||||||
"analytics.title": "Analytics for \"%1\" category",
|
"analytics.title": "Analytics for \"%1\" category",
|
||||||
@@ -74,8 +65,5 @@
|
|||||||
"alert.find-user": "Find a User",
|
"alert.find-user": "Find a User",
|
||||||
"alert.user-search": "Search for a user here...",
|
"alert.user-search": "Search for a user here...",
|
||||||
"alert.find-group": "Find a Group",
|
"alert.find-group": "Find a Group",
|
||||||
"alert.group-search": "Search for a group here...",
|
"alert.group-search": "Search for a group here..."
|
||||||
"collapse-all": "Collapse All",
|
|
||||||
"expand-all": "Expand All",
|
|
||||||
"disable-on-create": "Disable on create"
|
|
||||||
}
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"lead": "A listing of digest delivery stats and times is displayed below.",
|
|
||||||
"disclaimer": "Please be advised that email delivery is not guaranteed, due to the nature of email technology. Many variables factor into whether an email sent to the recipient server is ultimately delivered into the user's inbox, including server reputation, blacklisted IP addresses, and whether DKIM/SPF/DMARC is configured.",
|
|
||||||
"disclaimer-continued": "A successful delivery means the message was sent successfully by NodeBB and acknowledged by the recipient server. It does not mean the email landed in the inbox. For best results, we recommend using a third-party email delivery service such as <a href=\"https://sendgrid.com/why-sendgrid/\">SendGrid</a>.",
|
|
||||||
|
|
||||||
"user": "User",
|
|
||||||
"subscription": "Subscription Type",
|
|
||||||
"last-delivery": "Last successful delivery",
|
|
||||||
"default": "System default",
|
|
||||||
"default-help": "<em>System default</em> means the user has not explicitly overridden the global forum setting for digests, which is currently: "<strong>%1</strong>"",
|
|
||||||
"resend": "Resend Digest",
|
|
||||||
"resend-all-confirm": "Are you sure you wish to mnually execute this digest run?",
|
|
||||||
"resent-single": "Manual digest resend completed",
|
|
||||||
"resent-day": "Daily digest resent",
|
|
||||||
"resent-week": "Weekly digest resent",
|
|
||||||
"resent-month": "Monthly digest resent",
|
|
||||||
"null": "<em>Never</em>",
|
|
||||||
"manual-run": "Manual digest run:",
|
|
||||||
|
|
||||||
"no-delivery-data": "No delivery data found"
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "اسم المجموعة",
|
"name": "Group Name",
|
||||||
"badge": "Badge",
|
|
||||||
"properties": "Properties",
|
|
||||||
"description": "Group Description",
|
"description": "Group Description",
|
||||||
"member-count": "Member Count",
|
"member-count": "Member Count",
|
||||||
"system": "System",
|
"system": "System Group",
|
||||||
"hidden": "Hidden",
|
|
||||||
"private": "Private",
|
|
||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"search-placeholder": "Search",
|
"search-placeholder": "Search",
|
||||||
"create": "Create Group",
|
"create": "Create Group",
|
||||||
@@ -21,12 +17,10 @@
|
|||||||
"edit.user-title": "Title of Members",
|
"edit.user-title": "Title of Members",
|
||||||
"edit.icon": "Group Icon",
|
"edit.icon": "Group Icon",
|
||||||
"edit.label-color": "Group Label Color",
|
"edit.label-color": "Group Label Color",
|
||||||
"edit.text-color": "Group Text Color",
|
|
||||||
"edit.show-badge": "Show Badge",
|
"edit.show-badge": "Show Badge",
|
||||||
"edit.private-details": "If enabled, joining of groups requires approval from a group owner.",
|
"edit.private-details": "If enabled, joining of groups requires approval from a group owner.",
|
||||||
"edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.",
|
"edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.",
|
||||||
"edit.disable-join": "Disable join requests",
|
"edit.disable-requests": "Disable join requests",
|
||||||
"edit.disable-leave": "Disallow users from leaving the group",
|
|
||||||
"edit.hidden": "Hidden",
|
"edit.hidden": "Hidden",
|
||||||
"edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
|
"edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
|
||||||
"edit.add-user": "Add User to Group",
|
"edit.add-user": "Add User to Group",
|
||||||
|
|||||||
@@ -14,6 +14,5 @@
|
|||||||
"alerts.applied-success": "Blacklist Applied",
|
"alerts.applied-success": "Blacklist Applied",
|
||||||
|
|
||||||
"analytics.blacklist-hourly": "<strong>Figure 1</strong> – Blacklist hits per hour",
|
"analytics.blacklist-hourly": "<strong>Figure 1</strong> – Blacklist hits per hour",
|
||||||
"analytics.blacklist-daily": "<strong>Figure 2</strong> – Blacklist hits per day",
|
"analytics.blacklist-daily": "<strong>Figure 2</strong> – Blacklist hits per day"
|
||||||
"ip-banned": "IP banned"
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"post-queue": "Post Queue",
|
"post-queue": "Post Queue",
|
||||||
"description": "There are no posts in the post queue. <br> To enable this feature, go to <a href=\"%1\">Settings → Post → Post Queue</a> and enable <strong>Post Queue</strong>.",
|
"description": "There are no posts in the post queue. <br> To enable this feature, go to <a href=\"%1\">Settings → Post → Posting Restrictions</a> and enable <strong>Post Queue</strong>.",
|
||||||
"user": "User",
|
"user": "User",
|
||||||
"category": "Category",
|
"category": "Category",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"global": "Global",
|
|
||||||
"global.no-users": "No user-specific global privileges.",
|
|
||||||
"group-privileges": "Group Privileges",
|
|
||||||
"user-privileges": "User Privileges",
|
|
||||||
"chat": "Chat",
|
|
||||||
"upload-images": "Upload Images",
|
|
||||||
"upload-files": "Upload Files",
|
|
||||||
"signature": "Signature",
|
|
||||||
"ban": "Ban",
|
|
||||||
"search-content": "Search Content",
|
|
||||||
"search-users": "Search Users",
|
|
||||||
"search-tags": "Search Tags",
|
|
||||||
"view-users": "View Users",
|
|
||||||
"view-tags": "View Tags",
|
|
||||||
"view-groups": "View Groups",
|
|
||||||
"allow-local-login": "Local Login",
|
|
||||||
"allow-group-creation": "Group Create",
|
|
||||||
"view-users-info": "View Users Info",
|
|
||||||
"find-category": "Find Category",
|
|
||||||
"access-category": "Access Category",
|
|
||||||
"access-topics": "Access Topics",
|
|
||||||
"create-topics": "Create Topics",
|
|
||||||
"reply-to-topics": "Reply to Topics",
|
|
||||||
"tag-topics": "Tag Topics",
|
|
||||||
"edit-posts": "Edit Posts",
|
|
||||||
"view-edit-history": "View Edit History",
|
|
||||||
"delete-posts": "Delete Posts",
|
|
||||||
"view_deleted": "View Deleted Posts",
|
|
||||||
"upvote-posts": "Upvote Posts",
|
|
||||||
"downvote-posts": "Downvote Posts",
|
|
||||||
"delete-topics": "Delete Topics",
|
|
||||||
"purge": "Purge",
|
|
||||||
"moderate": "Moderate"
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
"description": "Select tags via clicking and/or dragging, use shift to select multiple.",
|
"description": "Select tags via clicking and/or dragging, use shift to select multiple.",
|
||||||
"create": "Create Tag",
|
"create": "Create Tag",
|
||||||
"modify": "Modify Tags",
|
"modify": "Modify Tags",
|
||||||
"rename": "Rename Tags",
|
|
||||||
"delete": "Delete Selected Tags",
|
"delete": "Delete Selected Tags",
|
||||||
"search": "Search for tags...",
|
"search": "Search for tags...",
|
||||||
"settings": "Click <a href=\"%1\">here</a> to visit the tag settings page.",
|
"settings": "Click <a href=\"%1\">here</a> to visit the tag settings page.",
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"upload-file": "Upload File",
|
|
||||||
"filename": "Filename",
|
|
||||||
"usage": "Post Usage",
|
|
||||||
"orphaned": "Orphaned",
|
|
||||||
"size/filecount": "Size / Filecount",
|
|
||||||
"confirm-delete": "Do you really want to delete this file?",
|
|
||||||
"filecount": "%1 files"
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
{
|
{
|
||||||
"users": "المستخدمين",
|
"users": "Users",
|
||||||
"edit": "تحرير",
|
"edit": "Edit",
|
||||||
"make-admin": "Make Admin",
|
"make-admin": "Make Admin",
|
||||||
"remove-admin": "Remove Admin",
|
"remove-admin": "Remove Admin",
|
||||||
"validate-email": "Validate Email",
|
"validate-email": "Validate Email",
|
||||||
"send-validation-email": "Send Validation Email",
|
"send-validation-email": "Send Validation Email",
|
||||||
"password-reset-email": "Send Password Reset Email",
|
"password-reset-email": "Send Password Reset Email",
|
||||||
"force-password-reset": "Force Password Reset & Log User Out",
|
|
||||||
"ban": "Ban User(s)",
|
"ban": "Ban User(s)",
|
||||||
"temp-ban": "Ban User(s) Temporarily",
|
"temp-ban": "Ban User(s) Temporarily",
|
||||||
"unban": "Unban User(s)",
|
"unban": "Unban User(s)",
|
||||||
@@ -15,8 +14,6 @@
|
|||||||
"delete": "Delete User(s)",
|
"delete": "Delete User(s)",
|
||||||
"purge": "Delete User(s) and Content",
|
"purge": "Delete User(s) and Content",
|
||||||
"download-csv": "Download CSV",
|
"download-csv": "Download CSV",
|
||||||
"manage-groups": "Manage Groups",
|
|
||||||
"add-group": "Add Group",
|
|
||||||
"invite": "Invite",
|
"invite": "Invite",
|
||||||
"new": "New User",
|
"new": "New User",
|
||||||
|
|
||||||
@@ -30,13 +27,6 @@
|
|||||||
"pills.banned": "Banned",
|
"pills.banned": "Banned",
|
||||||
"pills.search": "User Search",
|
"pills.search": "User Search",
|
||||||
|
|
||||||
"50-per-page": "50 per page",
|
|
||||||
"100-per-page": "100 per page",
|
|
||||||
"250-per-page": "250 per page",
|
|
||||||
"500-per-page": "500 per page",
|
|
||||||
|
|
||||||
"search.uid": "By User ID",
|
|
||||||
"search.uid-placeholder": "Enter a user ID to search",
|
|
||||||
"search.username": "By User Name",
|
"search.username": "By User Name",
|
||||||
"search.username-placeholder": "Enter a username to search",
|
"search.username-placeholder": "Enter a username to search",
|
||||||
"search.email": "By Email",
|
"search.email": "By Email",
|
||||||
@@ -79,19 +69,11 @@
|
|||||||
"alerts.lockout-reset-success": "Lockout(s) reset!",
|
"alerts.lockout-reset-success": "Lockout(s) reset!",
|
||||||
"alerts.flag-reset-success": "Flags(s) reset!",
|
"alerts.flag-reset-success": "Flags(s) reset!",
|
||||||
"alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!",
|
"alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!",
|
||||||
"alerts.make-admin-success": "User is now administrator.",
|
"alerts.make-admin-success": "User(s) are now administrators.",
|
||||||
"alerts.confirm-remove-admin": "Do you really want to remove this administrator?",
|
"alerts.confirm-remove-admin": "Do you really want to remove admins?",
|
||||||
"alerts.remove-admin-success": "User is no longer administrator.",
|
"alerts.remove-admin-success": "User(s) are no longer administrators.",
|
||||||
"alerts.make-global-mod-success": "User is now global moderator.",
|
|
||||||
"alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?",
|
|
||||||
"alerts.remove-global-mod-success": "User is no longer global moderator.",
|
|
||||||
"alerts.make-moderator-success": "User is now moderator.",
|
|
||||||
"alerts.confirm-remove-moderator": "Do you really want to remove this moderator?",
|
|
||||||
"alerts.remove-moderator-success": "User is no longer moderator.",
|
|
||||||
"alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?",
|
"alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?",
|
||||||
"alerts.confirm-force-password-reset": "Are you sure you want to force the password reset and log out these user(s)?",
|
|
||||||
"alerts.validate-email-success": "Emails validated",
|
"alerts.validate-email-success": "Emails validated",
|
||||||
"alerts.validate-force-password-reset-success": "User(s) passwords have been reset and their existing sessions have been revoked.",
|
|
||||||
"alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?",
|
"alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?",
|
||||||
"alerts.confirm-delete": "<b>Warning!</b><br/>Do you really want to delete user(s)?<br/> This action is not reversable! Only the user account will be deleted, their posts and topics will remain.",
|
"alerts.confirm-delete": "<b>Warning!</b><br/>Do you really want to delete user(s)?<br/> This action is not reversable! Only the user account will be deleted, their posts and topics will remain.",
|
||||||
"alerts.delete-success": "User(s) Deleted!",
|
"alerts.delete-success": "User(s) Deleted!",
|
||||||
@@ -103,7 +85,7 @@
|
|||||||
"alerts.error-x": "<strong>Error</strong><p>%1</p>",
|
"alerts.error-x": "<strong>Error</strong><p>%1</p>",
|
||||||
"alerts.create-success": "User created!",
|
"alerts.create-success": "User created!",
|
||||||
|
|
||||||
"alerts.prompt-email": "Emails: ",
|
"alerts.prompt-email": "Email: ",
|
||||||
"alerts.email-sent-to": "An invitation email has been sent to %1",
|
"alerts.email-sent-to": "An invitation email has been sent to %1",
|
||||||
"alerts.x-users-found": "%1 user(s) found! Search took %2 ms."
|
"alerts.x-users-found": "%1 user(s) found! Search took %2 ms."
|
||||||
}
|
}
|
||||||
@@ -1,38 +1,34 @@
|
|||||||
{
|
{
|
||||||
"section-general": "عام",
|
"section-general": "General",
|
||||||
"general/dashboard": "اللوحة الرئيسية",
|
"general/dashboard": "Dashboard",
|
||||||
"general/homepage": "الصفحة الرئيسية",
|
"general/homepage": "Home Page",
|
||||||
"general/navigation": "التصفح",
|
"general/navigation": "Navigation",
|
||||||
"general/languages": "اللغات",
|
"general/languages": "Languages",
|
||||||
"general/sounds": "الأصوات",
|
"general/sounds": "Sounds",
|
||||||
"general/social": "شبكات التواصل",
|
"general/social": "Social",
|
||||||
|
|
||||||
"section-manage": "إدارة",
|
"section-manage": "Manage",
|
||||||
"manage/categories": "الأقسام",
|
"manage/categories": "Categories",
|
||||||
"manage/privileges": "Privileges",
|
"manage/tags": "Tags",
|
||||||
"manage/tags": "الكلمات المفتاحية",
|
"manage/users": "Users",
|
||||||
"manage/users": "الأعضاء",
|
"manage/registration": "Registration Queue",
|
||||||
"manage/admins-mods": "Admins & Mods",
|
"manage/post-queue": "Post Queue",
|
||||||
"manage/registration": "قائمة انتظار التسجيل",
|
"manage/groups": "Groups",
|
||||||
"manage/post-queue": "قائمة انتظار المشاركة",
|
"manage/ip-blacklist": "IP Blacklist",
|
||||||
"manage/groups": "المجموعات",
|
|
||||||
"manage/ip-blacklist": "قائمة حظر عناوين IP",
|
|
||||||
"manage/uploads": "Uploads",
|
|
||||||
"manage/digest": "Digests",
|
|
||||||
|
|
||||||
"section-settings": "إعدادات",
|
"section-settings": "Settings",
|
||||||
"settings/general": "عامة",
|
"settings/general": "General",
|
||||||
"settings/reputation": "السمعة",
|
"settings/reputation": "Reputation",
|
||||||
"settings/email": "البريد الإلكتروني",
|
"settings/email": "Email",
|
||||||
"settings/user": "الأعضاء",
|
"settings/user": "User",
|
||||||
"settings/group": "المجموعات",
|
"settings/group": "Group",
|
||||||
"settings/guest": "الزوار",
|
"settings/guest": "Guests",
|
||||||
"settings/uploads": "الرفع",
|
"settings/uploads": "Uploads",
|
||||||
"settings/post": "المشاركة",
|
"settings/post": "Post",
|
||||||
"settings/chat": "الدردشة",
|
"settings/chat": "Chat",
|
||||||
"settings/pagination": "ترقيم الصفحات",
|
"settings/pagination": "Pagination",
|
||||||
"settings/tags": "الكلمات المفتاحية",
|
"settings/tags": "Tags",
|
||||||
"settings/notifications": "التنبيهات",
|
"settings/notifications": "Notifications",
|
||||||
"settings/cookies": "Cookies",
|
"settings/cookies": "Cookies",
|
||||||
"settings/web-crawler": "Web Crawler",
|
"settings/web-crawler": "Web Crawler",
|
||||||
"settings/sockets": "Sockets",
|
"settings/sockets": "Sockets",
|
||||||
@@ -43,7 +39,7 @@
|
|||||||
"section-appearance": "Appearance",
|
"section-appearance": "Appearance",
|
||||||
"appearance/themes": "Themes",
|
"appearance/themes": "Themes",
|
||||||
"appearance/skins": "Skins",
|
"appearance/skins": "Skins",
|
||||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
"appearance/customise": "Custom HTML & CSS",
|
||||||
|
|
||||||
"section-extend": "Extend",
|
"section-extend": "Extend",
|
||||||
"extend/plugins": "Plugins",
|
"extend/plugins": "Plugins",
|
||||||
@@ -58,14 +54,13 @@
|
|||||||
"section-advanced": "Advanced",
|
"section-advanced": "Advanced",
|
||||||
"advanced/database": "Database",
|
"advanced/database": "Database",
|
||||||
"advanced/events": "Events",
|
"advanced/events": "Events",
|
||||||
"advanced/hooks": "Hooks",
|
|
||||||
"advanced/logs": "Logs",
|
"advanced/logs": "Logs",
|
||||||
"advanced/errors": "Errors",
|
"advanced/errors": "Errors",
|
||||||
"advanced/cache": "Cache",
|
"advanced/cache": "Cache",
|
||||||
"development/logger": "Logger",
|
"development/logger": "Logger",
|
||||||
"development/info": "Info",
|
"development/info": "Info",
|
||||||
|
|
||||||
"rebuild-and-restart-forum": "Rebuild & Restart Forum",
|
"reload-forum": "Reload Forum",
|
||||||
"restart-forum": "Restart Forum",
|
"restart-forum": "Restart Forum",
|
||||||
"logout": "Log out",
|
"logout": "Log out",
|
||||||
"view-forum": "View Forum",
|
"view-forum": "View Forum",
|
||||||
@@ -76,8 +71,5 @@
|
|||||||
"search.keep-typing": "Type more to see results...",
|
"search.keep-typing": "Type more to see results...",
|
||||||
"search.start-typing": "Start typing to see results...",
|
"search.start-typing": "Start typing to see results...",
|
||||||
|
|
||||||
"connection-lost": "Connection to %1 has been lost, attempting to reconnect...",
|
"connection-lost": "Connection to %1 has been lost, attempting to reconnect..."
|
||||||
|
|
||||||
"alerts.version": "Running <strong>NodeBB v%1</strong>",
|
|
||||||
"alerts.upgrade": "Upgrade to v%1"
|
|
||||||
}
|
}
|
||||||
@@ -1,23 +1,14 @@
|
|||||||
{
|
{
|
||||||
"maintenance-mode": "Maintenance Mode",
|
"maintenance-mode": "Maintenance Mode",
|
||||||
"maintenance-mode.help": "When the forum is in maintenance mode, all requests will be redirected to a static holding page. Administrators are exempt from this redirection, and are able to access the site normally.",
|
"maintenance-mode.help": "When the forum is in maintenance mode, all requests will be redirected to a static holding page. Administrators are exempt from this redirection, and are able to access the site normally.",
|
||||||
"maintenance-mode.status": "Maintenance Mode Status Code",
|
|
||||||
"maintenance-mode.message": "Maintenance Message",
|
"maintenance-mode.message": "Maintenance Message",
|
||||||
"headers": "Headers",
|
"headers": "Headers",
|
||||||
"headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame",
|
"headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame",
|
||||||
"headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB",
|
"headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB",
|
||||||
"headers.acao": "Access-Control-Allow-Origin",
|
"headers.acao": "Access-Control-Allow-Origin",
|
||||||
"headers.acao-regex": "Access-Control-Allow-Origin Regular Expression",
|
|
||||||
"headers.acao-help": "To deny access to all sites, leave empty",
|
"headers.acao-help": "To deny access to all sites, leave empty",
|
||||||
"headers.acao-regex-help": "Enter regular expressions here to match dynamic origins. To deny access to all sites, leave empty",
|
|
||||||
"headers.acac": "Access-Control-Allow-Credentials",
|
|
||||||
"headers.acam": "Access-Control-Allow-Methods",
|
"headers.acam": "Access-Control-Allow-Methods",
|
||||||
"headers.acah": "Access-Control-Allow-Headers",
|
"headers.acah": "Access-Control-Allow-Headers",
|
||||||
"hsts": "Strict Transport Security",
|
|
||||||
"hsts.enabled": "Enabled HSTS (recommended)",
|
|
||||||
"hsts.subdomains": "Include subdomains in HSTS header",
|
|
||||||
"hsts.preload": "Allow preloading of HSTS header",
|
|
||||||
"hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. <a href=\"%1\">More information <i class=\"fa fa-external-link\"></i></a>",
|
|
||||||
"traffic-management": "Traffic Management",
|
"traffic-management": "Traffic Management",
|
||||||
"traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.",
|
"traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.",
|
||||||
"traffic.enable": "Enable Traffic Management",
|
"traffic.enable": "Enable Traffic Management",
|
||||||
|
|||||||
@@ -5,7 +5,5 @@
|
|||||||
"disable-editing-help": "Administrators and global moderators are exempt from this restriction",
|
"disable-editing-help": "Administrators and global moderators are exempt from this restriction",
|
||||||
"max-length": "Maximum length of chat messages",
|
"max-length": "Maximum length of chat messages",
|
||||||
"max-room-size": "Maximum number of users in chat rooms",
|
"max-room-size": "Maximum number of users in chat rooms",
|
||||||
"delay": "Time between chat messages in milliseconds",
|
"delay": "Time between chat messages in milliseconds"
|
||||||
"restrictions.seconds-edit-after": "Number of seconds a chat message will remain editable. (0 disabled)",
|
|
||||||
"restrictions.seconds-delete-after": "Number of seconds a chat message will remain deletable. (0 disabled)"
|
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
{
|
{
|
||||||
"eu-consent": "EU Consent",
|
"eu-consent": "EU Consent",
|
||||||
"consent.enabled": "تفعيل",
|
"consent.enabled": "Enabled",
|
||||||
"consent.message": "Notification message",
|
"consent.message": "Notification message",
|
||||||
"consent.acceptance": "Acceptance message",
|
"consent.acceptance": "Acceptance message",
|
||||||
"consent.link-text": "Policy Link Text",
|
"consent.link-text": "Policy Link Text",
|
||||||
"consent.link-url": "Policy Link URL",
|
|
||||||
"consent.blank-localised-default": "Leave blank to use NodeBB localised defaults",
|
"consent.blank-localised-default": "Leave blank to use NodeBB localised defaults",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"cookie-domain": "Session cookie domain",
|
"cookie-domain": "Session cookie domain",
|
||||||
|
|||||||
@@ -4,9 +4,6 @@
|
|||||||
"address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.",
|
"address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.",
|
||||||
"from": "From Name",
|
"from": "From Name",
|
||||||
"from-help": "The from name to display in the email.",
|
"from-help": "The from name to display in the email.",
|
||||||
"sendmail-rate-limit": "Send <em>X</em> emails...",
|
|
||||||
"sendmail-rate-delta": "... every <em>X</em> milliseconds",
|
|
||||||
"sendmail-rate-help": "Instructs the NodeBB mailer to limit the number of messages sent at once in order to not overwhelm email receiving services. These options do not apply if SMTP Transport is enabled (below).",
|
|
||||||
|
|
||||||
"smtp-transport": "SMTP Transport",
|
"smtp-transport": "SMTP Transport",
|
||||||
"smtp-transport.enabled": "Use an external email server to send emails",
|
"smtp-transport.enabled": "Use an external email server to send emails",
|
||||||
@@ -33,8 +30,8 @@
|
|||||||
"testing.select": "Select Email Template",
|
"testing.select": "Select Email Template",
|
||||||
"testing.send": "Send Test Email",
|
"testing.send": "Send Test Email",
|
||||||
"testing.send-help": "The test email will be sent to the currently logged in user's email address.",
|
"testing.send-help": "The test email will be sent to the currently logged in user's email address.",
|
||||||
"subscriptions": "Email Digests",
|
"subscriptions": "Email Subscriptions",
|
||||||
"subscriptions.disable": "Disable email digests",
|
"subscriptions.disable": "Disable subscriber notification emails",
|
||||||
"subscriptions.hour": "Digest Hour",
|
"subscriptions.hour": "Digest Hour",
|
||||||
"subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. <code>0</code> for midnight, <code>17</code> for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.<br /> The approximate server time is: <span id=\"serverTime\"></span><br /> The next daily digest is scheduled to be sent <span id=\"nextDigestTime\"></span>"
|
"subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. <code>0</code> for midnight, <code>17</code> for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.<br /> The approximate server time is: <span id=\"serverTime\"></span><br /> The next daily digest is scheduled to be sent <span id=\"nextDigestTime\"></span>"
|
||||||
}
|
}
|
||||||
@@ -3,9 +3,9 @@
|
|||||||
"private-groups": "Private Groups",
|
"private-groups": "Private Groups",
|
||||||
"private-groups.help": "If enabled, joining of groups requires the approval of the group owner <em>(Default: enabled)</em>",
|
"private-groups.help": "If enabled, joining of groups requires the approval of the group owner <em>(Default: enabled)</em>",
|
||||||
"private-groups.warning": "<strong>Beware!</strong> If this option is disabled and you have private groups, they automatically become public.",
|
"private-groups.warning": "<strong>Beware!</strong> If this option is disabled and you have private groups, they automatically become public.",
|
||||||
"allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.",
|
"allow-creation": "Allow Group Creation",
|
||||||
|
"allow-creation-help": "If enabled, users can create groups <em>(Default: disabled)</em>",
|
||||||
"max-name-length": "Maximum Group Name Length",
|
"max-name-length": "Maximum Group Name Length",
|
||||||
"max-title-length": "Maximum Group Title Length",
|
|
||||||
"cover-image": "Group Cover Image",
|
"cover-image": "Group Cover Image",
|
||||||
"default-cover": "Default Cover Images",
|
"default-cover": "Default Cover Images",
|
||||||
"default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image"
|
"default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image"
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
{
|
{
|
||||||
"handles": "Guest Handles",
|
"handles": "Guest Handles",
|
||||||
"handles.enabled": "Allow guest handles",
|
"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\""
|
"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\"",
|
||||||
|
"privileges": "Guest Privileges",
|
||||||
|
"privileges.can-search": "Allow guests to search without logging in",
|
||||||
|
"privileges.can-search-users": "Allow guests to search users without logging in"
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
{
|
{
|
||||||
"notifications": "Notifications",
|
"notifications": "Notifications",
|
||||||
"welcome-notification": "Welcome Notification",
|
"welcome-notification": "Welcome Notification",
|
||||||
"welcome-notification-link": "Welcome Notification Link",
|
"welcome-notification-link": "Welcome Notification Link"
|
||||||
"welcome-notification-uid": "Welcome Notification User (UID)",
|
|
||||||
"notification-alert-timeout": "Notification Alert Timeout"
|
|
||||||
}
|
}
|
||||||
@@ -6,5 +6,6 @@
|
|||||||
"max-posts-per-page": "Maximum posts per page",
|
"max-posts-per-page": "Maximum posts per page",
|
||||||
"categories": "Category Pagination",
|
"categories": "Category Pagination",
|
||||||
"topics-per-page": "Topics per Page",
|
"topics-per-page": "Topics per Page",
|
||||||
"max-topics-per-page": "Maximum topics per page"
|
"max-topics-per-page": "Maximum topics per page",
|
||||||
|
"initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular"
|
||||||
}
|
}
|
||||||
@@ -4,36 +4,26 @@
|
|||||||
"sorting.oldest-to-newest": "Oldest to Newest",
|
"sorting.oldest-to-newest": "Oldest to Newest",
|
||||||
"sorting.newest-to-oldest": "Newest to Oldest",
|
"sorting.newest-to-oldest": "Newest to Oldest",
|
||||||
"sorting.most-votes": "Most Votes",
|
"sorting.most-votes": "Most Votes",
|
||||||
"sorting.most-posts": "Most Posts",
|
|
||||||
"sorting.topic-default": "Default Topic Sorting",
|
"sorting.topic-default": "Default Topic Sorting",
|
||||||
"length": "Post Length",
|
|
||||||
"post-queue": "Post Queue",
|
|
||||||
"restrictions": "Posting Restrictions",
|
"restrictions": "Posting Restrictions",
|
||||||
"restrictions-new": "New User Restrictions",
|
|
||||||
"restrictions.post-queue": "Enable post queue",
|
"restrictions.post-queue": "Enable post queue",
|
||||||
"restrictions.post-queue-rep-threshold": "Reputation required to bypass post queue",
|
"restrictions.post-queue-help": "Enabling post queue will put the posts of new users in a queue for approval.",
|
||||||
"restrictions.groups-exempt-from-post-queue": "Select groups that should be exempt from the post queue",
|
"restrictions.seconds-between": "Seconds between Posts",
|
||||||
"restrictions-new.post-queue": "Enable new user restrictions",
|
"restrictions.seconds-between-new": "Seconds between Posts for New Users",
|
||||||
"restrictions.post-queue-help": "Enabling post queue will put the posts of new users in a queue for approval",
|
"restrictions.rep-threshold": "Reputation threshold before this restriction is lifted",
|
||||||
"restrictions-new.post-queue-help": "Enabling new user restrictions will set restrictions on posts created by new users",
|
"restrictions.seconds-defore-new": "Seconds before new user can post",
|
||||||
"restrictions.seconds-between": "Number of seconds between posts",
|
"restrictions.seconds-edit-after": "Number of seconds users are allowed to edit posts after posting. (0 disabled)",
|
||||||
"restrictions.seconds-between-new": "Seconds between posts for new users",
|
"restrictions.seconds-delete-after": "Number of seconds users are allowed to delete posts after posting. (0 disabled)",
|
||||||
"restrictions.rep-threshold": "Reputation threshold before these restrictions are lifted",
|
"restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics. (0 disabled)",
|
||||||
"restrictions.seconds-before-new": "Seconds before a new user can make their first post",
|
|
||||||
"restrictions.seconds-edit-after": "Number of seconds a post remains editable (set to 0 to disable)",
|
|
||||||
"restrictions.seconds-delete-after": "Number of seconds a post remains deletable (set to 0 to disable)",
|
|
||||||
"restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics (set to 0 to disable)",
|
|
||||||
"restrictions.min-title-length": "Minimum Title Length",
|
"restrictions.min-title-length": "Minimum Title Length",
|
||||||
"restrictions.max-title-length": "Maximum Title Length",
|
"restrictions.max-title-length": "Maximum Title Length",
|
||||||
"restrictions.min-post-length": "Minimum Post Length",
|
"restrictions.min-post-length": "Minimum Post Length",
|
||||||
"restrictions.max-post-length": "Maximum Post Length",
|
"restrictions.max-post-length": "Maximum Post Length",
|
||||||
"restrictions.days-until-stale": "Days until topic is considered stale",
|
"restrictions.days-until-stale": "Days until Topic is considered stale",
|
||||||
"restrictions.stale-help": "If a topic is considered \"stale\", then a warning will be shown to users who attempt to reply to that topic.",
|
"restrictions.stale-help": "If a topic is considered \"stale\", then a warning will be shown to users who attempt to reply to that topic.",
|
||||||
"timestamp": "Timestamp",
|
"timestamp": "Timestamp",
|
||||||
"timestamp.cut-off": "Date cut-off (in days)",
|
"timestamp.cut-off": "Date cut-off (in days)",
|
||||||
"timestamp.cut-off-help": "Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).<br /><em>(Default: <code>30</code>, or one month). Set to 0 to always display dates, leave blank to always display relative times.</em>",
|
"timestamp.cut-off-help": "Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).<br /><em>(Default: <code>30</code>, or one month). Set to 0 to always display dates, leave blank to always display relative times.</em>",
|
||||||
"timestamp.necro-threshold": "Necro Threshold (in days)",
|
|
||||||
"timestamp.necro-threshold-help": "A message will be shown between posts if the time between them is longer than the necro threshold. (Default: <code>7</code>, or one week). Set to 0 to disable.</em>",
|
|
||||||
"teaser": "Teaser Post",
|
"teaser": "Teaser Post",
|
||||||
"teaser.last-post": "Last – Show the latest post, including the original post, if no replies",
|
"teaser.last-post": "Last – Show the latest post, including the original post, if no replies",
|
||||||
"teaser.last-reply": "Last – Show the latest reply, or a \"No replies\" placeholder if no replies",
|
"teaser.last-reply": "Last – Show the latest reply, or a \"No replies\" placeholder if no replies",
|
||||||
@@ -54,6 +44,5 @@
|
|||||||
"composer.enable-plugin-help": "Allow plugins to add content to the help tab",
|
"composer.enable-plugin-help": "Allow plugins to add content to the help tab",
|
||||||
"composer.custom-help": "Custom Help Text",
|
"composer.custom-help": "Custom Help Text",
|
||||||
"ip-tracking": "IP Tracking",
|
"ip-tracking": "IP Tracking",
|
||||||
"ip-tracking.each-post": "Track IP Address for each post",
|
"ip-tracking.each-post": "Track IP Address for each post"
|
||||||
"enable-post-history": "Enable Post History"
|
|
||||||
}
|
}
|
||||||
@@ -5,10 +5,5 @@
|
|||||||
"votes-are-public": "All Votes Are Public",
|
"votes-are-public": "All Votes Are Public",
|
||||||
"thresholds": "Activity Thresholds",
|
"thresholds": "Activity Thresholds",
|
||||||
"min-rep-downvote": "Minimum reputation to downvote posts",
|
"min-rep-downvote": "Minimum reputation to downvote posts",
|
||||||
"min-rep-flag": "Minimum reputation to flag posts",
|
"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",
|
|
||||||
"min-rep-cover-picture": "Minimum reputation to add \"Cover Picture\" to user profile"
|
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
"min-length": "Minimum Tag Length",
|
"min-length": "Minimum Tag Length",
|
||||||
"max-length": "Maximum Tag Length",
|
"max-length": "Maximum Tag Length",
|
||||||
"goto-manage": "Click here to visit the tag management page.",
|
"goto-manage": "Click here to visit the tag management page.",
|
||||||
|
"privacy": "Privacy",
|
||||||
|
"list-private": "Make the tags list private",
|
||||||
"related-topics": "Related Topics",
|
"related-topics": "Related Topics",
|
||||||
"max-related-topics": "Maximum related topics to display (if supported by theme)"
|
"max-related-topics": "Maximum related topics to display (if supported by theme)"
|
||||||
}
|
}
|
||||||
@@ -1,39 +1,28 @@
|
|||||||
{
|
{
|
||||||
"posts": "المشاركات",
|
"posts": "Posts",
|
||||||
"allow-files": "السماح للأعضاء بتحميل الملفات الإعتيادية",
|
"allow-files": "Allow users to upload regular files",
|
||||||
"private": "جعل الملفات التي تم رفعها خاصة",
|
"private": "Make uploaded files private",
|
||||||
"strip-exif-data": "Strip EXIF Data",
|
"max-image-width": "Resize images down to specified width (in pixels)",
|
||||||
"private-extensions": "File extensions to make private",
|
"max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)",
|
||||||
"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.",
|
"max-file-size": "Maximum File Size (in KiB)",
|
||||||
"resize-image-width-threshold": "Resize images if they are wider than specified width",
|
"max-file-size-help": "(in kibibytes, default: 2048 KiB)",
|
||||||
"resize-image-width-threshold-help": "(in pixels, default: 1520 pixels, set to 0 to disable)",
|
"allow-topic-thumbnails": "Allow users to upload topic thumbnails",
|
||||||
"resize-image-width": "Resize images down to specified width",
|
"topic-thumb-size": "Topic Thumb Size",
|
||||||
"resize-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)",
|
"allowed-file-extensions": "Allowed File Extensions",
|
||||||
"resize-image-quality": "Quality to use when resizing images",
|
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>). An empty list means all extensions are allowed.",
|
||||||
"resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.",
|
"profile-avatars": "Profile Avatars",
|
||||||
"max-file-size": "الحد الأقصى لحجم الملف (بالكيبيبايت)",
|
"allow-profile-image-uploads": "Allow users to upload profile images",
|
||||||
"max-file-size-help": "(بالكيبيبايت، الافتراضي: 2048)",
|
"convert-profile-image-png": "Convert profile image uploads to PNG",
|
||||||
"reject-image-width": "Maximum Image Width (in pixels)",
|
"default-avatar": "Custom Default Avatar",
|
||||||
"reject-image-width-help": "Images wider than this value will be rejected.",
|
"upload": "Upload",
|
||||||
"reject-image-height": "Maximum Image Height (in pixels)",
|
"profile-image-dimension": "Profile Image Dimension",
|
||||||
"reject-image-height-help": "Images taller than this value will be rejected.",
|
"profile-image-dimension-help": "(in pixels, default: 128 pixels)",
|
||||||
"allow-topic-thumbnails": "السماح للاعضاء برفع الصور المصغرة للموضوع",
|
"max-profile-image-size": "Maximum Profile Image File Size",
|
||||||
"topic-thumb-size": "حجم الصورة المصغرة للموضوع",
|
"max-profile-image-size-help": "(in kibibytes, default: 256 KiB)",
|
||||||
"allowed-file-extensions": "إمتدادات الملفات المسموح بها",
|
"max-cover-image-size": "Maximum Cover Image File Size",
|
||||||
"allowed-file-extensions-help": "أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: <code>pdf,xls,doc</code>). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.",
|
"max-cover-image-size-help": "(in kibibytes, default: 2,048 KiB)",
|
||||||
"profile-avatars": "الصورة الرمزية للملف الشخصي",
|
"keep-all-user-images": "Keep old versions of avatars and profile covers on the server",
|
||||||
"allow-profile-image-uploads": "السماح للأعضاء برفع الصور الرمزية",
|
"profile-covers": "Profile Covers",
|
||||||
"convert-profile-image-png": "تحويل إمتداد الصور الرمزية المرفوعه الى PNG",
|
"default-covers": "Default Cover Images",
|
||||||
"default-avatar": "الصورة الرمزية الافتراضية",
|
"default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image"
|
||||||
"upload": "رفع",
|
|
||||||
"profile-image-dimension": "أبعاد الصورة الرمزية",
|
|
||||||
"profile-image-dimension-help": "(بالبكسل، الافتراضي: 128 بكسل)",
|
|
||||||
"max-profile-image-size": "الحد الأقصى لحجم الصورة الرمزية",
|
|
||||||
"max-profile-image-size-help": "(بالكيبيبايت، الافتراضي: 256)",
|
|
||||||
"max-cover-image-size": "الحد الأقصى لحجم صورة الغلاف",
|
|
||||||
"max-cover-image-size-help": "(بالكيبيبايت، الافتراضي: 2,048)",
|
|
||||||
"keep-all-user-images": "الاحتفاظ بالنسخ القديمة من الصور الرمزية وصور الغلاف في السيرفر",
|
|
||||||
"profile-covers": "غلاف الملف الشخصي",
|
|
||||||
"default-covers": "صورة الغلاف الافتراضية",
|
|
||||||
"default-covers-help": "اضف صور الغلاف الافتراضية متبوعة بفواصل لاستخدامها في الحسابات التي لا تحتوي على صور غلاف مرفوعة"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,65 +1,55 @@
|
|||||||
{
|
{
|
||||||
"authentication": "المصادقة",
|
"authentication": "Authentication",
|
||||||
"require-email-confirmation": "يطلب تأكيد البريد الإلكتروني",
|
"allow-local-login": "Allow local login",
|
||||||
"email-confirm-interval": "لا يمكن للمستخدم إعادة إرسال رسالة تأكيد البريد الالكتروني حتى مرور",
|
"require-email-confirmation": "Require Email Confirmation",
|
||||||
"email-confirm-email2": "دقائق",
|
"email-confirm-interval": "User may not resend a confirmation email until",
|
||||||
"allow-login-with": "السماح بتسجيل الدخول باستخدام",
|
"email-confirm-email2": "minutes have elapsed",
|
||||||
"allow-login-with.username-email": "اسم المستخدم أو البريد الالكتروني",
|
"allow-login-with": "Allow login with",
|
||||||
"allow-login-with.username": "اسم المستخدم فقط",
|
"allow-login-with.username-email": "Username or Email",
|
||||||
"allow-login-with.email": "البريد الالكتروني فقط",
|
"allow-login-with.username": "Username Only",
|
||||||
"account-settings": "إعدادت الحساب",
|
"allow-login-with.email": "Email Only",
|
||||||
"gdpr_enabled": "Enable GDPR consent collection",
|
"account-settings": "Account Settings",
|
||||||
"gdpr_enabled_help": "When enabled, all new registrants will be required to explicitly give consent for data collection and usage under the <a href=\"https://eugdpr.org/the-regulation/gdpr-faqs/\">General Data Protection Regulation (GDPR)</a>. <strong>Note</strong>: Enabling GDPR does not force pre-existing users to provide consent. To do so, you will need to install the GDPR plugin.",
|
"disable-username-changes": "Disable username changes",
|
||||||
"disable-username-changes": "عدم السماح بتغيير اسم المستخدم",
|
"disable-email-changes": "Disable email changes",
|
||||||
"disable-email-changes": "عدم السماح بتغيير البريد الالكتروني",
|
"disable-password-changes": "Disable password changes",
|
||||||
"disable-password-changes": "عدم السماح بتغيير كلمة المرور",
|
"allow-account-deletion": "Allow account deletion",
|
||||||
"allow-account-deletion": "السماح بحذف الحساب",
|
"user-info-private": "Hide user list and data from guests",
|
||||||
"hide-fullname": "إخفاء الإسم الكامل عن المستخدمين",
|
"hide-fullname": "Hide fullname from users",
|
||||||
"hide-email": "إخفاء البريد الإلكتروني عن المستخدمين",
|
"hide-email": "Hide email from users",
|
||||||
"themes": "القوالب",
|
"themes": "Themes",
|
||||||
"disable-user-skins": "منع المستخدمين من اختيار سمة مخصص",
|
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||||
"account-protection": "حماية الحساب",
|
"account-protection": "Account Protection",
|
||||||
"admin-relogin-duration": "المدة حتى طلب إعادة تسجيل الدخول للإدارة (دقائق)",
|
"login-attempts": "Login attempts per hour",
|
||||||
"admin-relogin-duration-help": "بعد مرور وقت معين، يتوجب إعادة تسجيل الدخول للوصول إلى قسم الإدارة، قم بتعيين القيمة الى 0 لتعطيل الخيار",
|
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||||
"login-attempts": "عدد محاولات تسجيل الدخول في الساعة",
|
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||||
"login-attempts-help": "إذا تجاوزت محاولات تسجيل الدخول لمستخدم معين العدد المحدد، فسوف يتم تأمين الحساب ومنعه من الدخول لمدة من الوقت",
|
"login-days": "Days to remember user login sessions",
|
||||||
"lockout-duration": "مدة تأمين الحساب (دقائق)",
|
"password-expiry-days": "Force password reset after a set number of days",
|
||||||
"login-days": "عدد الأيام لتذكر جلسات تسجيل دخول المستخدم",
|
"registration": "User Registration",
|
||||||
"password-expiry-days": "فرض عملية تغيير كلمة المرور بعد مرور عدد محدد من الأيام",
|
"registration-type": "Registration Type",
|
||||||
"session-time": "Session Time",
|
"registration-type.normal": "Normal",
|
||||||
"session-time-days": "Days",
|
"registration-type.admin-approval": "Admin Approval",
|
||||||
"session-time-seconds": "Seconds",
|
"registration-type.admin-approval-ip": "Admin Approval for IPs",
|
||||||
"session-time-help": "These values are used to govern how long a user stays logged in when they check "Remember Me" on login. Note that only one of these values will be used. If there is no <i>seconds</i> value we fall back to <i>days</i>. If there is no <i>days</i> value we default to <i>14 days</i>.",
|
"registration-type.invite-only": "Invite Only",
|
||||||
"online-cutoff": "Minutes after user is considered inactive",
|
"registration-type.admin-invite-only": "Admin Invite Only",
|
||||||
"online-cutoff-help": "If user performs no actions for this duration, they are considered inactive and they do not receive realtime updates.",
|
"registration-type.disabled": "No registration",
|
||||||
"registration": "تسجيل المستخدم",
|
"registration-type.help": "Normal - Users can register from the /register page.<br/>\nAdmin Approval - User registrations are placed in an <a href=\"%1/admin/manage/registration\">approval queue</a> for administrators.<br/>\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.<br/>\nInvite Only - Users can invite others from the <a href=\"%1/users\" target=\"_blank\">users</a> page.<br/>\nAdmin Invite Only - Only administrators can invite others from <a href=\"%1/users\" target=\"_blank\">users</a> and <a href=\"%1/admin/manage/users\">admin/manage/users</a> pages.<br/>\nNo registration - No user registration.<br/>",
|
||||||
"registration-type": "نوع التسجيل",
|
"registration.max-invites": "Maximum Invitations per User",
|
||||||
"registration-approval-type": "Registration Approval Type",
|
"max-invites": "Maximum Invitations per User",
|
||||||
"registration-type.normal": "عادي",
|
"max-invites-help": "0 for no restriction. Admins get infinite invitations<br>Only applicable for \"Invite Only\"",
|
||||||
"registration-type.admin-approval": "بموافقة الإدارة",
|
"invite-expiration": "Invite expiration",
|
||||||
"registration-type.admin-approval-ip": "بموافقة الإدارة لعناوين IP",
|
"invite-expiration-help": "# of days invitations expire in.",
|
||||||
"registration-type.invite-only": "بالدعوات فقط",
|
"min-username-length": "Minimum Username Length",
|
||||||
"registration-type.admin-invite-only": "بالدعوات من قبل الإدارة فقط",
|
"max-username-length": "Maximum Username Length",
|
||||||
"registration-type.disabled": "لا يوجد تسجيل",
|
"min-password-length": "Minimum Password Length",
|
||||||
"registration-type.help": "Normal - Users can register from the /register page.<br/>\nInvite Only - Users can invite others from the <a href=\"%1/users\" target=\"_blank\">users</a> page.<br/>\nAdmin Invite Only - Only administrators can invite others from <a href=\"%1/users\" target=\"_blank\">users</a> and <a href=\"%1/admin/manage/users\">admin/manage/users</a> pages.<br/>\nNo registration - No user registration.<br/>",
|
"min-password-strength": "Minimum Password Strength",
|
||||||
"registration-approval-type.help": "Normal - Users are registered immediately.<br/>\nAdmin Approval - User registrations are placed in an <a href=\"%1/admin/manage/registration\">approval queue</a> for administrators.<br/>\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.<br/>",
|
"max-about-me-length": "Maximum About Me Length",
|
||||||
"registration.max-invites": "الحد الأقصى للدعوات لكل عضو",
|
"terms-of-use": "Forum Terms of Use <small>(Leave blank to disable)</small>",
|
||||||
"max-invites": "الحد الأقصى للدعوات لكل عضو",
|
"user-search": "User Search",
|
||||||
"max-invites-help": "0 لعدم تحديد قيود، الإدارة تحصل على دعوات لامحدودة <br> هذا الخيار يعمل فقط عند تحديد خيار \"بالدعوات فقط\"",
|
"user-search-results-per-page": "Number of results to display",
|
||||||
"invite-expiration": "مدة صلاحية الدعوة",
|
"default-user-settings": "Default User Settings",
|
||||||
"invite-expiration-help": "عدد الأيام حتى انتهاء صلاحية الدعوة.",
|
"show-email": "Show email",
|
||||||
"min-username-length": "الحد الأدنى لطول اسم المستخدم",
|
"show-fullname": "Show fullname",
|
||||||
"max-username-length": "الحد الأقصى لطول اسم المستخدم",
|
"restrict-chat": "Only allow chat messages from users I follow",
|
||||||
"min-password-length": "الحد الأدنى لطول كلمة المرور",
|
|
||||||
"min-password-strength": "الحد الأدنى لقوة كلمة المرور",
|
|
||||||
"max-about-me-length": "الحد الأعلى من الأحرف في حقل \"عني\"",
|
|
||||||
"terms-of-use": "شروط استخدام المنتدى <small>(تترك فارغة لتعطيلها)</small>",
|
|
||||||
"user-search": "بحث الأعضاء",
|
|
||||||
"user-search-results-per-page": "عدد النتائج المراد عرضها",
|
|
||||||
"default-user-settings": "إعدادات الأعضاء الافتراضية",
|
|
||||||
"show-email": "عرض البريد الإلكتروني",
|
|
||||||
"show-fullname": "عرض الاسم الكامل",
|
|
||||||
"restrict-chat": "السماح فقط برسائل الدردشة من المستخدمين الذين أتبعهم",
|
|
||||||
"outgoing-new-tab": "Open outgoing links in new tab",
|
"outgoing-new-tab": "Open outgoing links in new tab",
|
||||||
"topic-search": "Enable In-Topic Searching",
|
"topic-search": "Enable In-Topic Searching",
|
||||||
"digest-freq": "Subscribe to Digest",
|
"digest-freq": "Subscribe to Digest",
|
||||||
@@ -70,10 +60,5 @@
|
|||||||
"email-chat-notifs": "Send an email if a new chat message arrives and I am not online",
|
"email-chat-notifs": "Send an email if a new chat message arrives and I am not online",
|
||||||
"email-post-notif": "Send an email when replies are made to topics I am subscribed to",
|
"email-post-notif": "Send an email when replies are made to topics I am subscribed to",
|
||||||
"follow-created-topics": "Follow topics you create",
|
"follow-created-topics": "Follow topics you create",
|
||||||
"follow-replied-topics": "Follow topics that you reply to",
|
"follow-replied-topics": "Follow topics that you reply to"
|
||||||
"default-notification-settings": "Default notification settings",
|
|
||||||
"categoryWatchState": "Default category watch state",
|
|
||||||
"categoryWatchState.watching": "Watching",
|
|
||||||
"categoryWatchState.notwatching": "Not Watching",
|
|
||||||
"categoryWatchState.ignoring": "Ignoring"
|
|
||||||
}
|
}
|
||||||
@@ -1,22 +1,20 @@
|
|||||||
{
|
{
|
||||||
"category": "قسم",
|
"category": "فئة",
|
||||||
"subcategories": "قسم فرعي",
|
"subcategories": "فئة فرعية",
|
||||||
"new_topic_button": "موضوع جديد",
|
"new_topic_button": "موضوع جديد",
|
||||||
"guest-login-post": "سجل الدخول للمشاركة",
|
"guest-login-post": "سجل بالدخول للرد",
|
||||||
"no_topics": "<strong>لا توجد مواضيع في هذه القسم</strong>لم لا تحاول إنشاء موضوع؟<br />",
|
"no_topics": "<strong>لا توجد مواضيع في هذه الفئة</strong>لم لا تحاول إنشاء موضوع؟<br />",
|
||||||
"browsing": "تصفح",
|
"browsing": "تصفح",
|
||||||
"no_replies": "لم يرد أحد",
|
"no_replies": "لم يرد أحد",
|
||||||
"no_new_posts": "لا توجد مشاركات جديدة.",
|
"no_new_posts": "لا توجد مشاركات جديدة.",
|
||||||
|
"share_this_category": "انشر هذه الفئة",
|
||||||
"watch": "تابع",
|
"watch": "تابع",
|
||||||
"ignore": "تجاهل",
|
"ignore": "تجاهل",
|
||||||
"watching": "متابع",
|
"watching": "متابع",
|
||||||
"not-watching": "لست متابع",
|
|
||||||
"ignoring": "متجاهل",
|
"ignoring": "متجاهل",
|
||||||
"watching.description": "أظهر المواضيع في الغير مقروء و الحديث",
|
"watching.description": "أظهر المواضيع في غير مقروء",
|
||||||
"not-watching.description": "Do not show topics in unread, show in recent",
|
"ignoring.description": "لا تظهر المواضيع في غير مقروء",
|
||||||
"ignoring.description": "Do not show topics in unread and recent",
|
"watch.message": "You are now watching updates from this category and all subcategories",
|
||||||
"watching.message": "You are now watching updates from this category and all subcategories",
|
"ignore.message": "You are now ignoring updates from this category and all subcategories",
|
||||||
"notwatching.message": "You are not watching updates from this category and all subcategories",
|
"watched-categories": "الفئات المتابعة"
|
||||||
"ignoring.message": "You are now ignoring updates from this category and all subcategories",
|
|
||||||
"watched-categories": "الأقسام المُتابعة"
|
|
||||||
}
|
}
|
||||||
@@ -1,49 +1,37 @@
|
|||||||
{
|
{
|
||||||
"test-email.subject": "Test Email",
|
"password-reset-requested": "تم طلب إعادة تعيين كلمة المرور - %1!",
|
||||||
"password-reset-requested": "Password Reset Requested!",
|
|
||||||
"welcome-to": "مرحبًا بك في %1",
|
"welcome-to": "مرحبًا بك في %1",
|
||||||
"invite": "دعوة من %1",
|
"invite": "دعوة من %1",
|
||||||
"greeting_no_name": "مرحبًا",
|
"greeting_no_name": "مرحبًا",
|
||||||
"greeting_with_name": "مرحبًا بك يا %1",
|
"greeting_with_name": "مرحبًا بك يا %1",
|
||||||
"email.verify-your-email.subject": "Please verify your email",
|
|
||||||
"email.verify.text1": "Your email address has changed!",
|
|
||||||
"welcome.text1": "شكرًا على تسجيلك في %1!",
|
"welcome.text1": "شكرًا على تسجيلك في %1!",
|
||||||
"welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.",
|
"welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.",
|
||||||
"welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.",
|
"welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.",
|
||||||
"welcome.cta": "انقر هنا لتفعيل عنوان بريدك الإلكتروني",
|
"welcome.cta": "انقر هنا لتفعيل عنوان بريدك الإلكتروني",
|
||||||
"invitation.text1": "%1 قام بدعوتك للانضمام لـ %2",
|
"invitation.text1": "%1 قام بدعوتك للانضمام لـ %2",
|
||||||
"invitation.text2": "Your invitation will expire in %1 days.",
|
"invitation.ctr": "إضغط هنا لإنشاء حسابك",
|
||||||
"invitation.cta": "Click here to create your account.",
|
|
||||||
"reset.text1": "لقد توصلنا بطلب إعادة تعيين كلمة المرور الخاصة بك، ربما لكونك قد نسيتها, إن لم يكن الأمر كذلك، المرجو تجاهل هذه الرسالة.",
|
"reset.text1": "لقد توصلنا بطلب إعادة تعيين كلمة المرور الخاصة بك، ربما لكونك قد نسيتها, إن لم يكن الأمر كذلك، المرجو تجاهل هذه الرسالة.",
|
||||||
"reset.text2": "لمواصلة طلب إعاة تعيين كلمة المرور، الرجاء تتبع هذا الرابط.",
|
"reset.text2": "لمواصلة طلب إعاة تعيين كلمة المرور، الرجاء تتبع هذا الرابط.",
|
||||||
"reset.cta": "انقر هنا لإعادة تعيين كلمة السر الخاصة بك.",
|
"reset.cta": "انقر هنا لإعادة تعيين كلمة السر الخاصة بك.",
|
||||||
"reset.notify.subject": "تم تغيير كلمة المرور بنجاح",
|
"reset.notify.subject": "تم تغيير كلمة المرور بنجاح",
|
||||||
"reset.notify.text1": "نحيطك علما أن كلمة مرورك قد تم تغييرها في %1",
|
"reset.notify.text1": "نحيطك علما أن كلمة مرورك قد تم تغييرها في %1",
|
||||||
"reset.notify.text2": "إن لم يكن لديك علم بهذا، المرجو إشعار مدبر النظام بأسرع مايمكن.",
|
"reset.notify.text2": "إن لم يكن لديك علم بهذا، المرجو إشعار مدبر النظام بأسرع مايمكن.",
|
||||||
|
"digest.notifications": "لديك تنبيهات غير مقروءة من طرف %1:",
|
||||||
"digest.latest_topics": "آخر المستجدات من %1",
|
"digest.latest_topics": "آخر المستجدات من %1",
|
||||||
"digest.cta": "انقر هنا لمشاهدة %1",
|
"digest.cta": "انقر هنا لمشاهدة %1",
|
||||||
"digest.unsub.info": "تم إرسال هذا الإشعار بآخر المستجدات وفقا لخيارات تسجيلكم.",
|
"digest.unsub.info": "تم إرسال هذا الإشعار بآخر المستجدات وفقا لخيارات تسجيلكم.",
|
||||||
|
"digest.no_topics": "ليس هناك مواضيع نشيطة في %1 الماضي",
|
||||||
"digest.day": "يوم",
|
"digest.day": "يوم",
|
||||||
"digest.week": "أسبوع",
|
"digest.week": "أسبوع",
|
||||||
"digest.month": "شهر",
|
"digest.month": "شهر",
|
||||||
"digest.subject": "إستهلاك ل",
|
"digest.subject": "إستهلاك ل",
|
||||||
"digest.title.day": "Your Daily Digest",
|
|
||||||
"digest.title.week": "Your Weekly Digest",
|
|
||||||
"digest.title.month": "Your Monthly Digest",
|
|
||||||
"notif.chat.subject": "هناك محادثة جديدة من %1",
|
"notif.chat.subject": "هناك محادثة جديدة من %1",
|
||||||
"notif.chat.cta": "انقر هنا لمتابعة المحادثة",
|
"notif.chat.cta": "انقر هنا لمتابعة المحادثة",
|
||||||
"notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.",
|
"notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.",
|
||||||
|
"notif.post.cta": "انقر هنا لقراءة الموضوع بأكمله",
|
||||||
"notif.post.unsub.info": "تم إشعارك بهذه المشاركة بناءً على الخيارات التي سبق وأن حددتها.",
|
"notif.post.unsub.info": "تم إشعارك بهذه المشاركة بناءً على الخيارات التي سبق وأن حددتها.",
|
||||||
"notif.post.unsub.one-click": "Alternatively, unsubscribe from future emails like this, by clicking",
|
|
||||||
"notif.cta": "To the forum",
|
|
||||||
"notif.cta-new-reply": "View Post",
|
|
||||||
"notif.cta-new-chat": "View Chat",
|
|
||||||
"notif.test.short": "Testing Notifications",
|
|
||||||
"notif.test.long": "This is a test of the notifications email. Send help!",
|
|
||||||
"test.text1": "هذه رسالة تجريبية للتأكد من صحة إعدادت الرسائل الإلكترونية في منتدى NodeBB خاصتك.",
|
"test.text1": "هذه رسالة تجريبية للتأكد من صحة إعدادت الرسائل الإلكترونية في منتدى NodeBB خاصتك.",
|
||||||
"unsub.cta": "انقر هنا لتغيير تلك الإعدادات",
|
"unsub.cta": "انقر هنا لتغيير تلك الإعدادات",
|
||||||
"unsubscribe": "unsubscribe",
|
|
||||||
"unsub.success": "You will no longer receive emails from the <strong>%1</strong> mailing list",
|
|
||||||
"banned.subject": "You have been banned from %1",
|
"banned.subject": "You have been banned from %1",
|
||||||
"banned.text1": "The user %1 has been banned from %2.",
|
"banned.text1": "The user %1 has been banned from %2.",
|
||||||
"banned.text2": "This ban will last until %1.",
|
"banned.text2": "This ban will last until %1.",
|
||||||
|
|||||||
@@ -11,33 +11,26 @@
|
|||||||
"invalid-uid": "مستخدم غير موجود",
|
"invalid-uid": "مستخدم غير موجود",
|
||||||
"invalid-username": "اسم المستخدم غير مقبول",
|
"invalid-username": "اسم المستخدم غير مقبول",
|
||||||
"invalid-email": "البريد الاكتروني غير مقبول",
|
"invalid-email": "البريد الاكتروني غير مقبول",
|
||||||
"invalid-fullname": "Invalid Fullname",
|
|
||||||
"invalid-location": "Invalid Location",
|
|
||||||
"invalid-birthday": "Invalid Birthday",
|
|
||||||
"invalid-title": "Invalid title",
|
"invalid-title": "Invalid title",
|
||||||
"invalid-user-data": "بيانات المستخدم غير صحيحة",
|
"invalid-user-data": "بيانات المستخدم غير صحيحة",
|
||||||
"invalid-password": "كلمة السر غير مقبولة",
|
"invalid-password": "كلمة السر غير مقبولة",
|
||||||
"invalid-login-credentials": "Invalid login credentials",
|
"invalid-login-credentials": "Invalid login credentials",
|
||||||
"invalid-username-or-password": "المرجود تحديد اسم مستخدم و كلمة مرور",
|
"invalid-username-or-password": "المرجود تحديد اسم مستخدم و كلمة مرور",
|
||||||
"invalid-search-term": "كلمة البحث غير صحيحة",
|
"invalid-search-term": "كلمة البحث غير صحيحة",
|
||||||
"invalid-url": "Invalid URL",
|
|
||||||
"local-login-disabled": "Local login system has been disabled for non-privileged accounts.",
|
|
||||||
"csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
|
"csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
|
||||||
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
|
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
|
||||||
"username-taken": "اسم المستخدم مأخوذ",
|
"username-taken": "اسم المستخدم مأخوذ",
|
||||||
"email-taken": "البريد الالكتروني مأخوذ",
|
"email-taken": "البريد الالكتروني مأخوذ",
|
||||||
"email-not-confirmed": "You are unable to post until your email is confirmed, please click here to confirm your email.",
|
"email-not-confirmed": "عنوان بريدك الإلكتروني غير مفعل بعد. انقر هنا لتفعيله من فضلك.",
|
||||||
"email-not-confirmed-chat": "لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.",
|
"email-not-confirmed-chat": "لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.",
|
||||||
"email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.",
|
"email-not-confirmed-email-sent": "بريدك الإلكتروني غير مفعل. رجاءًا تفحص صندوق البريد عن رسالة التفعيل.",
|
||||||
"no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.",
|
"no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.",
|
||||||
"email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.",
|
"email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.",
|
||||||
"confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال",
|
"confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال",
|
||||||
"sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.",
|
"sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.",
|
||||||
"digest-not-enabled": "This user does not have digests enabled, or the system default is not configured to send digests",
|
|
||||||
"username-too-short": "اسم المستخدم قصير.",
|
"username-too-short": "اسم المستخدم قصير.",
|
||||||
"username-too-long": "اسم المستخدم طويل",
|
"username-too-long": "اسم المستخدم طويل",
|
||||||
"password-too-long": "كلمة السر طويلة ",
|
"password-too-long": "كلمة السر طويلة ",
|
||||||
"reset-rate-limited": "Too many password reset requests (rate limited)",
|
|
||||||
"user-banned": "المستخدم محظور",
|
"user-banned": "المستخدم محظور",
|
||||||
"user-banned-reason": "Sorry, this account has been banned (Reason: %1)",
|
"user-banned-reason": "Sorry, this account has been banned (Reason: %1)",
|
||||||
"user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)",
|
"user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)",
|
||||||
@@ -83,7 +76,6 @@
|
|||||||
"still-uploading": "الرجاء الانتظار حتى يكتمل الرفع.",
|
"still-uploading": "الرجاء الانتظار حتى يكتمل الرفع.",
|
||||||
"file-too-big": "الحد الأقصى لرفع الملفات %1 كيلو بت. رجاءًا ارفع ملف أصغر",
|
"file-too-big": "الحد الأقصى لرفع الملفات %1 كيلو بت. رجاءًا ارفع ملف أصغر",
|
||||||
"guest-upload-disabled": "خاصية رفع الملفات غير مفعلة للزوار.",
|
"guest-upload-disabled": "خاصية رفع الملفات غير مفعلة للزوار.",
|
||||||
"cors-error": "Unable to upload image due to misconfigured CORS",
|
|
||||||
"already-bookmarked": "You have already bookmarked this post",
|
"already-bookmarked": "You have already bookmarked this post",
|
||||||
"already-unbookmarked": "You have already unbookmarked this post",
|
"already-unbookmarked": "You have already unbookmarked this post",
|
||||||
"cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.",
|
"cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.",
|
||||||
@@ -93,7 +85,6 @@
|
|||||||
"invalid-image-type": "نوع الصورة غير مدعوم. الأنواع المدعومة هي : %1",
|
"invalid-image-type": "نوع الصورة غير مدعوم. الأنواع المدعومة هي : %1",
|
||||||
"invalid-image-extension": "امتداد الصورة غير مدعوم.",
|
"invalid-image-extension": "امتداد الصورة غير مدعوم.",
|
||||||
"invalid-file-type": "صيغة الملف غير مدعومة. الأنواع المدعومة هي: %1",
|
"invalid-file-type": "صيغة الملف غير مدعومة. الأنواع المدعومة هي: %1",
|
||||||
"invalid-image-dimensions": "Image dimensions are too big",
|
|
||||||
"group-name-too-short": "اسم المجموعة قصير",
|
"group-name-too-short": "اسم المجموعة قصير",
|
||||||
"group-name-too-long": "اسم المجموعة طويل.",
|
"group-name-too-long": "اسم المجموعة طويل.",
|
||||||
"group-already-exists": "المجموعة موجودة مسبقا",
|
"group-already-exists": "المجموعة موجودة مسبقا",
|
||||||
@@ -103,8 +94,6 @@
|
|||||||
"group-needs-owner": "هذه المجموعة تتطلب مالك واحد على اﻷقل",
|
"group-needs-owner": "هذه المجموعة تتطلب مالك واحد على اﻷقل",
|
||||||
"group-already-invited": "المستخدم سبق وأن تمت دعوته",
|
"group-already-invited": "المستخدم سبق وأن تمت دعوته",
|
||||||
"group-already-requested": "سبق وتم تسجيل طلب العضوية",
|
"group-already-requested": "سبق وتم تسجيل طلب العضوية",
|
||||||
"group-join-disabled": "You are not able to join this group at this time",
|
|
||||||
"group-leave-disabled": "You are not able to leave this group at this time",
|
|
||||||
"post-already-deleted": "سبق وتم حذف هذا الرد",
|
"post-already-deleted": "سبق وتم حذف هذا الرد",
|
||||||
"post-already-restored": "سبق وتم إلغاء حذف هذا الرد",
|
"post-already-restored": "سبق وتم إلغاء حذف هذا الرد",
|
||||||
"topic-already-deleted": "سبق وتم حذف هذا الموضوع",
|
"topic-already-deleted": "سبق وتم حذف هذا الموضوع",
|
||||||
@@ -124,43 +113,24 @@
|
|||||||
"cant-edit-chat-message": "غير مصرح لك بتعديل الرسالة.",
|
"cant-edit-chat-message": "غير مصرح لك بتعديل الرسالة.",
|
||||||
"cant-remove-last-user": "لأيمكنك إزالت اخر مستخدم.",
|
"cant-remove-last-user": "لأيمكنك إزالت اخر مستخدم.",
|
||||||
"cant-delete-chat-message": "غير مصرح لك بحذف الرسالة.",
|
"cant-delete-chat-message": "غير مصرح لك بحذف الرسالة.",
|
||||||
"chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting",
|
|
||||||
"chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting",
|
|
||||||
"chat-deleted-already": "This chat message has already been deleted.",
|
|
||||||
"chat-restored-already": "This chat message has already been restored.",
|
|
||||||
"already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟",
|
"already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟",
|
||||||
"reputation-system-disabled": "نظام السمعة معطل",
|
"reputation-system-disabled": "نظام السمعة معطل",
|
||||||
"downvoting-disabled": "التصويتات السلبية معطلة",
|
"downvoting-disabled": "التصويتات السلبية معطلة",
|
||||||
"not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع",
|
"not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع",
|
||||||
"not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل",
|
"not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل",
|
||||||
"not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website",
|
|
||||||
"not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me",
|
|
||||||
"not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature",
|
|
||||||
"not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture",
|
|
||||||
"not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture",
|
|
||||||
"already-flagged": "لقد بلغت عن هذه المشاركة من قبل.",
|
"already-flagged": "لقد بلغت عن هذه المشاركة من قبل.",
|
||||||
"self-vote": "You cannot vote on your own post",
|
|
||||||
"reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.",
|
"reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.",
|
||||||
"registration-error": "حدث خطأ أثناء التسجيل",
|
"registration-error": "حدث خطأ أثناء التسجيل",
|
||||||
"parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم",
|
"parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم",
|
||||||
"wrong-login-type-email": "الرجاء استعمال بريدك اﻹلكتروني للدخول",
|
"wrong-login-type-email": "الرجاء استعمال بريدك اﻹلكتروني للدخول",
|
||||||
"wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول",
|
"wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول",
|
||||||
"sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first",
|
|
||||||
"sso-multiple-association": "You cannot associate multiple accounts from this service to your NodeBB account. Please dissociate your existing account and try again.",
|
|
||||||
"invite-maximum-met": "لقد قمت بدعوة الحد الأقصى من الأشخاص (%1 من %2)",
|
"invite-maximum-met": "لقد قمت بدعوة الحد الأقصى من الأشخاص (%1 من %2)",
|
||||||
"no-session-found": "لم دخول مسجل!",
|
"no-session-found": "لم دخول مسجل!",
|
||||||
"not-in-room": "المستخدم غير موجود في الغرفة.",
|
"not-in-room": "المستخدم غير موجود في الغرفة.",
|
||||||
|
"no-users-in-room": "لا يوجد مستخدمين في الغرفة.",
|
||||||
"cant-kick-self": "لا يمكنك طرد نفسك من المجموعة.",
|
"cant-kick-self": "لا يمكنك طرد نفسك من المجموعة.",
|
||||||
"no-users-selected": "لا يوجد مستخدم محدد.",
|
"no-users-selected": "لا يوجد مستخدم محدد.",
|
||||||
"invalid-home-page-route": "Invalid home page route",
|
"invalid-home-page-route": "Invalid home page route",
|
||||||
"invalid-session": "Session Mismatch",
|
"invalid-session": "Session Mismatch",
|
||||||
"invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة.",
|
"invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة."
|
||||||
"no-topics-selected": "No topics selected!",
|
|
||||||
"cant-move-to-same-topic": "Can't move post to same topic!",
|
|
||||||
"cannot-block-self": "You cannot block yourself!",
|
|
||||||
"cannot-block-privileged": "You cannot block administrators or global moderators",
|
|
||||||
"cannot-block-guest": "Guest are not able to block other users",
|
|
||||||
"already-blocked": "This user is already blocked",
|
|
||||||
"already-unblocked": "This user is already unblocked",
|
|
||||||
"no-connection": "There seems to be a problem with your internet connection"
|
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,6 @@
|
|||||||
"updated": "Updated",
|
"updated": "Updated",
|
||||||
"target-purged": "The content this flag referred to has been purged and is no longer available.",
|
"target-purged": "The content this flag referred to has been purged and is no longer available.",
|
||||||
|
|
||||||
"graph-label": "Daily Flags",
|
|
||||||
"quick-filters": "Quick Filters",
|
"quick-filters": "Quick Filters",
|
||||||
"filter-active": "There are one or more filters active in this list of flags",
|
"filter-active": "There are one or more filters active in this list of flags",
|
||||||
"filter-reset": "Remove Filters",
|
"filter-reset": "Remove Filters",
|
||||||
@@ -19,7 +18,6 @@
|
|||||||
"filter-type": "Flag Type",
|
"filter-type": "Flag Type",
|
||||||
"filter-type-all": "All Content",
|
"filter-type-all": "All Content",
|
||||||
"filter-type-post": "Post",
|
"filter-type-post": "Post",
|
||||||
"filter-type-user": "User",
|
|
||||||
"filter-state": "State",
|
"filter-state": "State",
|
||||||
"filter-assignee": "Assignee UID",
|
"filter-assignee": "Assignee UID",
|
||||||
"filter-cid": "Category",
|
"filter-cid": "Category",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"buttons.close": "أغلق",
|
"buttons.close": "أغلق",
|
||||||
"403.title": "غير مسموح بالدخول",
|
"403.title": "غير مسموح بالدخول",
|
||||||
"403.message": "يبدو أنك قد تعثرت على صفحة لا تمتلك الصلاحية للدخول إليها",
|
"403.message": "يبدو أنك قد تعثرت على صفحة لا تمتلك الصلاحية للدخول إليها",
|
||||||
"403.login": "ربما يجب عليك <a href='%1/login'>تسجل دخولك</a>.",
|
"403.login": "حاول أن <a href='%1/login'>تسجل دخولك</a>.",
|
||||||
"404.title": "لم يتم العثور",
|
"404.title": "لم يتم العثور",
|
||||||
"404.message": "الصفحة غير موجودة. العودة لـ <a href='%1/'>الرئيسية</a>",
|
"404.message": "الصفحة غير موجودة. العودة لـ <a href='%1/'>الرئيسية</a>",
|
||||||
"500.title": "خطأ داخلي",
|
"500.title": "خطأ داخلي",
|
||||||
@@ -13,19 +13,19 @@
|
|||||||
"400.message": "الرابط غير صحيح. رجاءًا تأكد من الرابط أو ارجع لـ <a href='%1/'>الرئيسية</a>",
|
"400.message": "الرابط غير صحيح. رجاءًا تأكد من الرابط أو ارجع لـ <a href='%1/'>الرئيسية</a>",
|
||||||
"register": "تسجيل",
|
"register": "تسجيل",
|
||||||
"login": "دخول",
|
"login": "دخول",
|
||||||
"please_log_in": "الرجاء تسجيل الدخول",
|
"please_log_in": "المرجو تسجيل الدخول",
|
||||||
"logout": "تسجيل الخروج",
|
"logout": "تسجيل الخروج",
|
||||||
"posting_restriction_info": "إضافة مشاركات جديد حكر على الأعضاء المسجلين، انقر هنا لتسجيل الدخول.",
|
"posting_restriction_info": "إضافة مشاركات جديد حكر على الأعضاء المسجلين، انقر هنا لتسجيل الدخول.",
|
||||||
"welcome_back": "مرحبًا بعودتك",
|
"welcome_back": "مرحبًا بعودتك",
|
||||||
"you_have_successfully_logged_in": "تم سجيل الدخول بنجاح",
|
"you_have_successfully_logged_in": "تم سجيل الدخول بنجاح",
|
||||||
"save_changes": "حفظ التغييرات",
|
"save_changes": "حفظ التغييرات",
|
||||||
"save": "حفظ",
|
"save": "Save",
|
||||||
"close": "أغلق",
|
"close": "أغلق",
|
||||||
"pagination": "الصفحات",
|
"pagination": "الصفحات",
|
||||||
"pagination.out_of": "%1 من %2",
|
"pagination.out_of": "%1 من %2",
|
||||||
"pagination.enter_index": "أدخل الرقم التسلسلي",
|
"pagination.enter_index": "أدخل الرقم التسلسلي",
|
||||||
"header.admin": "مدير النظام",
|
"header.admin": "مدبر نظام",
|
||||||
"header.categories": "الأقسام",
|
"header.categories": "الفئات",
|
||||||
"header.recent": "حديث",
|
"header.recent": "حديث",
|
||||||
"header.unread": "غير مقروء",
|
"header.unread": "غير مقروء",
|
||||||
"header.tags": "وسم",
|
"header.tags": "وسم",
|
||||||
@@ -37,9 +37,9 @@
|
|||||||
"header.search": "بحث",
|
"header.search": "بحث",
|
||||||
"header.profile": "ملف",
|
"header.profile": "ملف",
|
||||||
"header.navigation": "الاستكشاف",
|
"header.navigation": "الاستكشاف",
|
||||||
"notifications.loading": "تحميل التنبيهات",
|
"notifications.loading": "تحميل التبليغات",
|
||||||
"chats.loading": "تحميل الدردشات",
|
"chats.loading": "تحميل الدردشات",
|
||||||
"motd.welcome": "مرحبا بكم في NodeBB، منصة المناقشة المستقبلية.",
|
"motd.welcome": "مرحبا بكم NodeBB، منصة مناقشة المستقبل",
|
||||||
"previouspage": "الصفحة السابقة",
|
"previouspage": "الصفحة السابقة",
|
||||||
"nextpage": "الصفحة التالية",
|
"nextpage": "الصفحة التالية",
|
||||||
"alert.success": "نجاح",
|
"alert.success": "نجاح",
|
||||||
@@ -48,19 +48,17 @@
|
|||||||
"alert.banned.message": "لقد تم حظر حسابك. سيتم تسجيل الخروج.",
|
"alert.banned.message": "لقد تم حظر حسابك. سيتم تسجيل الخروج.",
|
||||||
"alert.unfollow": "أنت لا تتابع %1 بعد الآن!",
|
"alert.unfollow": "أنت لا تتابع %1 بعد الآن!",
|
||||||
"alert.follow": "أنت الآن تتابع %1!",
|
"alert.follow": "أنت الآن تتابع %1!",
|
||||||
|
"online": "المتواجدون حاليًّا",
|
||||||
"users": "الأعضاء",
|
"users": "الأعضاء",
|
||||||
"topics": "المواضيع",
|
"topics": "المواضيع",
|
||||||
"posts": "المشاركات",
|
"posts": "المشاركات",
|
||||||
"best": "الأفضل",
|
"best": "الأفضل",
|
||||||
"votes": "Votes",
|
|
||||||
"upvoters": "الموافقين",
|
"upvoters": "الموافقين",
|
||||||
"upvoted": "مصوت بالموجب",
|
"upvoted": "مصوت بالموجب",
|
||||||
"downvoters": "مصوتين بالسالب",
|
"downvoters": "مصوتين بالسالب",
|
||||||
"downvoted": "مصوت بالسالب",
|
"downvoted": "مصوت بالسالب",
|
||||||
"views": "المشاهدات",
|
"views": "المشاهدات",
|
||||||
"reputation": "السمعة",
|
"reputation": "السمعة",
|
||||||
"lastpost": "Last post",
|
|
||||||
"firstpost": "First post",
|
|
||||||
"read_more": "اقرأ المزيد",
|
"read_more": "اقرأ المزيد",
|
||||||
"more": "المزيد",
|
"more": "المزيد",
|
||||||
"posted_ago_by_guest": "كتب %1 بواسطة زائر",
|
"posted_ago_by_guest": "كتب %1 بواسطة زائر",
|
||||||
@@ -77,8 +75,7 @@
|
|||||||
"norecenttopics": "لاوجود لمواضيع جديدة",
|
"norecenttopics": "لاوجود لمواضيع جديدة",
|
||||||
"recentposts": "آخر المشاركات",
|
"recentposts": "آخر المشاركات",
|
||||||
"recentips": "آخر عناوين ال IP التي سجلت الدخول",
|
"recentips": "آخر عناوين ال IP التي سجلت الدخول",
|
||||||
"moderator_tools": "أدوات المشرف",
|
"moderator_tools": "Moderator Tools",
|
||||||
"online": "المتواجدون حاليًّا",
|
|
||||||
"away": "غير متواجد",
|
"away": "غير متواجد",
|
||||||
"dnd": "عدم الإزعاج",
|
"dnd": "عدم الإزعاج",
|
||||||
"invisible": "مخفي",
|
"invisible": "مخفي",
|
||||||
@@ -87,9 +84,8 @@
|
|||||||
"language": "اللغة",
|
"language": "اللغة",
|
||||||
"guest": "زائر",
|
"guest": "زائر",
|
||||||
"guests": "الزوار",
|
"guests": "الزوار",
|
||||||
"former_user": "A Former User",
|
|
||||||
"updated.title": "تم تحديث المنتدى",
|
"updated.title": "تم تحديث المنتدى",
|
||||||
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. إضغط هنا لإعادة تحميل الصفحة.",
|
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. المرجو إعادة تحميل الصفحة.",
|
||||||
"privacy": "الخصوصية",
|
"privacy": "الخصوصية",
|
||||||
"follow": "متابعة",
|
"follow": "متابعة",
|
||||||
"unfollow": "إلغاء المتابعة",
|
"unfollow": "إلغاء المتابعة",
|
||||||
@@ -100,16 +96,14 @@
|
|||||||
"enter_page_number": "ادخل رقم الصفحة",
|
"enter_page_number": "ادخل رقم الصفحة",
|
||||||
"upload_file": "ارفع ملف",
|
"upload_file": "ارفع ملف",
|
||||||
"upload": "ارفع",
|
"upload": "ارفع",
|
||||||
"uploads": "Uploads",
|
|
||||||
"allowed-file-types": "صيغ الملفات المدعومة هي 1%",
|
"allowed-file-types": "صيغ الملفات المدعومة هي 1%",
|
||||||
"unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من رغبتك بمغادرة الصفحة؟",
|
"unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من تغيير الصفحة؟",
|
||||||
"reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى.",
|
"reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى.",
|
||||||
"play": "تشغيل",
|
"play": "Play",
|
||||||
"cookies.message": "هذا الموقع يستخدم ملفات تعريف الارتباط لضمان حصولك على أفضل تجربة على موقعنا.",
|
"cookies.message": "This website uses cookies to ensure you get the best experience on our website.",
|
||||||
"cookies.accept": "فهمت الأمر!",
|
"cookies.accept": "Got it!",
|
||||||
"cookies.learn_more": "أعرف المزيد",
|
"cookies.learn_more": "Learn More",
|
||||||
"edited": "حُرِر",
|
"edited": "Edited",
|
||||||
"disabled": "معطل",
|
"disabled": "Disabled",
|
||||||
"select": "تحديد",
|
"select": "Select"
|
||||||
"user-search-prompt": "Type something here to find users..."
|
|
||||||
}
|
}
|
||||||
@@ -25,11 +25,9 @@
|
|||||||
"details.latest_posts": "آخر المشاركات",
|
"details.latest_posts": "آخر المشاركات",
|
||||||
"details.private": "خاص",
|
"details.private": "خاص",
|
||||||
"details.disableJoinRequests": "Disable join requests",
|
"details.disableJoinRequests": "Disable join requests",
|
||||||
"details.disableLeave": "Disallow users from leaving the group",
|
|
||||||
"details.grant": "منح/سحب المِلكية",
|
"details.grant": "منح/سحب المِلكية",
|
||||||
"details.kick": "طرد",
|
"details.kick": "طرد",
|
||||||
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
|
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
|
||||||
"details.add-member": "Add Member",
|
|
||||||
"details.owner_options": "إدارة المجموعة",
|
"details.owner_options": "إدارة المجموعة",
|
||||||
"details.group_name": "اسم المجموعة",
|
"details.group_name": "اسم المجموعة",
|
||||||
"details.member_count": "عدد اﻷعضاء",
|
"details.member_count": "عدد اﻷعضاء",
|
||||||
@@ -37,8 +35,7 @@
|
|||||||
"details.description": "الوصف",
|
"details.description": "الوصف",
|
||||||
"details.badge_preview": "معاينة الوسام",
|
"details.badge_preview": "معاينة الوسام",
|
||||||
"details.change_icon": "تغيير الأيقونة",
|
"details.change_icon": "تغيير الأيقونة",
|
||||||
"details.change_label_colour": "Change Label Colour",
|
"details.change_colour": "تغيير اللون",
|
||||||
"details.change_text_colour": "Change Text Colour",
|
|
||||||
"details.badge_text": "نص الوسام",
|
"details.badge_text": "نص الوسام",
|
||||||
"details.userTitleEnabled": "إظهار الوسام",
|
"details.userTitleEnabled": "إظهار الوسام",
|
||||||
"details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها",
|
"details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها",
|
||||||
@@ -49,11 +46,9 @@
|
|||||||
"event.updated": "تم تحديث بيانات المجموعة",
|
"event.updated": "تم تحديث بيانات المجموعة",
|
||||||
"event.deleted": "تم حذف المجموعة %1",
|
"event.deleted": "تم حذف المجموعة %1",
|
||||||
"membership.accept-invitation": "اقبل الدعوة",
|
"membership.accept-invitation": "اقبل الدعوة",
|
||||||
"membership.accept.notification_title": "You are now a member of <strong>%1</strong>",
|
|
||||||
"membership.invitation-pending": "الدعوة بانتظار القبول",
|
"membership.invitation-pending": "الدعوة بانتظار القبول",
|
||||||
"membership.join-group": "انظم للمجموعة",
|
"membership.join-group": "انظم للمجموعة",
|
||||||
"membership.leave-group": "غادر المجموعة",
|
"membership.leave-group": "غادر المجموعة",
|
||||||
"membership.leave.notification_title": "<strong>%1</strong> has left group <strong>%2</strong>",
|
|
||||||
"membership.reject": "رفض",
|
"membership.reject": "رفض",
|
||||||
"new-group.group_name": "اسم المجموعة",
|
"new-group.group_name": "اسم المجموعة",
|
||||||
"upload-group-cover": "Upload group cover",
|
"upload-group-cover": "Upload group cover",
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
"remember_me": "تذكرني؟",
|
"remember_me": "تذكرني؟",
|
||||||
"forgot_password": "نسيت كلمة المرور؟",
|
"forgot_password": "نسيت كلمة المرور؟",
|
||||||
"alternative_logins": "تسجيلات الدخول البديلة",
|
"alternative_logins": "تسجيلات الدخول البديلة",
|
||||||
"failed_login_attempt": "تسجيل الدخول غير ناجح",
|
"failed_login_attempt": "Login Unsuccessful",
|
||||||
"login_successful": "قمت بتسجيل الدخول بنجاح!",
|
"login_successful": "قمت بتسجيل الدخول بنجاح!",
|
||||||
"dont_have_account": "لا تملك حساب؟",
|
"dont_have_account": "لا تملك حساب؟",
|
||||||
"logged-out-due-to-inactivity": "لقد تم تسجيل خروجك من لوحة تحكم بسبب عدم نشاطك"
|
"logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"chat.chatting_with": "Chat with",
|
"chat.chatting_with": "الدردشة مع <span id=\"chat-with-name\"></span>",
|
||||||
"chat.placeholder": "أكتب رسالة دردشة هنا، اضغط ENTER للإرسال",
|
"chat.placeholder": "أكتب رسالة دردشة هنا، اضغط ENTER للإرسال",
|
||||||
"chat.send": "أرسل",
|
"chat.send": "أرسل",
|
||||||
"chat.no_active": "لا يوجد لديك دردشات نشطة.",
|
"chat.no_active": "لا يوجد لديك دردشات نشطة.",
|
||||||
@@ -12,7 +12,6 @@
|
|||||||
"chat.recent-chats": "آخر الدردشات",
|
"chat.recent-chats": "آخر الدردشات",
|
||||||
"chat.contacts": "الأصدقاء",
|
"chat.contacts": "الأصدقاء",
|
||||||
"chat.message-history": "تاريخ الرسائل",
|
"chat.message-history": "تاريخ الرسائل",
|
||||||
"chat.options": "Chat options",
|
|
||||||
"chat.pop-out": "افتح الدردشة في نافذة خاصة",
|
"chat.pop-out": "افتح الدردشة في نافذة خاصة",
|
||||||
"chat.minimize": "Minimize",
|
"chat.minimize": "Minimize",
|
||||||
"chat.maximize": "تكبير",
|
"chat.maximize": "تكبير",
|
||||||
@@ -20,23 +19,8 @@
|
|||||||
"chat.thirty_days": "30 يومًا",
|
"chat.thirty_days": "30 يومًا",
|
||||||
"chat.three_months": "3 أشهر",
|
"chat.three_months": "3 أشهر",
|
||||||
"chat.delete_message_confirm": "هل أنت متأكد من أنك تريد حذف هذه الرسالة؟",
|
"chat.delete_message_confirm": "هل أنت متأكد من أنك تريد حذف هذه الرسالة؟",
|
||||||
"chat.retrieving-users": "Retrieving users...",
|
"chat.add-users-to-room": "Add users to room",
|
||||||
"chat.manage-room": "Manage Chat Room",
|
|
||||||
"chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners (<i class=\"fa fa-star text-warning\"></i>) may remove users from chat rooms.",
|
|
||||||
"chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?",
|
"chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?",
|
||||||
"chat.rename-room": "Rename Room",
|
|
||||||
"chat.rename-placeholder": "Enter your room name here",
|
|
||||||
"chat.rename-help": "The room name set here will be viewable by all participants in the room.",
|
|
||||||
"chat.leave": "Leave Chat",
|
|
||||||
"chat.leave-prompt": "Are you sure you wish to leave this chat?",
|
|
||||||
"chat.leave-help": "Leaving this chat will remove you from future correspondence in this chat. If you are re-added in the future, you will not see any chat history from prior to your re-joining.",
|
|
||||||
"chat.in-room": "In this room",
|
|
||||||
"chat.kick": "Kick",
|
|
||||||
"chat.show-ip": "Show IP",
|
|
||||||
"chat.owner": "Room Owner",
|
|
||||||
"chat.system.user-join": "%1 has joined the room",
|
|
||||||
"chat.system.user-leave": "%1 has left the room",
|
|
||||||
"chat.system.room-rename": "%2 has renamed this room: %1",
|
|
||||||
"composer.compose": "اكتب",
|
"composer.compose": "اكتب",
|
||||||
"composer.show_preview": "عرض المعاينة",
|
"composer.show_preview": "عرض المعاينة",
|
||||||
"composer.hide_preview": "إخفاء المعاينة",
|
"composer.hide_preview": "إخفاء المعاينة",
|
||||||
@@ -50,7 +34,6 @@
|
|||||||
"composer.formatting.italic": "Italic",
|
"composer.formatting.italic": "Italic",
|
||||||
"composer.formatting.list": "List",
|
"composer.formatting.list": "List",
|
||||||
"composer.formatting.strikethrough": "Strikethrough",
|
"composer.formatting.strikethrough": "Strikethrough",
|
||||||
"composer.formatting.code": "Code",
|
|
||||||
"composer.formatting.link": "Link",
|
"composer.formatting.link": "Link",
|
||||||
"composer.formatting.picture": "Picture",
|
"composer.formatting.picture": "Picture",
|
||||||
"composer.upload-picture": "Upload Image",
|
"composer.upload-picture": "Upload Image",
|
||||||
|
|||||||
@@ -5,20 +5,20 @@
|
|||||||
"mark_all_read": "اجعل كل التنبيهات مقروءة",
|
"mark_all_read": "اجعل كل التنبيهات مقروءة",
|
||||||
"back_to_home": "عودة إلى %1",
|
"back_to_home": "عودة إلى %1",
|
||||||
"outgoing_link": "رابط خارجي",
|
"outgoing_link": "رابط خارجي",
|
||||||
"outgoing_link_message": "أنت تغادر اﻻن %1",
|
"outgoing_link_message": "You are now leaving %1",
|
||||||
"continue_to": "استمر إلى %1",
|
"continue_to": "استمر إلى %1",
|
||||||
"return_to": "عودة إى %1",
|
"return_to": "عودة إى %1",
|
||||||
"new_notification": "لديك تنبيه جديد",
|
"new_notification": "تنبيه جديد",
|
||||||
"you_have_unread_notifications": "لديك تنبيهات غير مقروءة.",
|
"you_have_unread_notifications": "لديك تنبيهات غير مقروءة.",
|
||||||
"all": "الكل",
|
"all": "All",
|
||||||
"topics": "مواضيع",
|
"topics": "Topics",
|
||||||
"replies": "ردود",
|
"replies": "Replies",
|
||||||
"chat": "محادثات",
|
"chat": "Chats",
|
||||||
"follows": "متابعون",
|
"follows": "Follows",
|
||||||
"upvote": "الموافقين",
|
"upvote": "Upvotes",
|
||||||
"new-flags": "New Flags",
|
"new-flags": "New Flags",
|
||||||
"my-flags": "Flags assigned to me",
|
"my-flags": "Flags assigned to me",
|
||||||
"bans": "الحظر",
|
"bans": "Bans",
|
||||||
"new_message_from": "رسالة جديدة من <strong>%1</strong>",
|
"new_message_from": "رسالة جديدة من <strong>%1</strong>",
|
||||||
"upvoted_your_post_in": "<strong>%1</strong> أضاف صوتًا إيجابيا إلى مشاركتك في <strong>%2</strong>.",
|
"upvoted_your_post_in": "<strong>%1</strong> أضاف صوتًا إيجابيا إلى مشاركتك في <strong>%2</strong>.",
|
||||||
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.",
|
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.",
|
||||||
@@ -40,25 +40,10 @@
|
|||||||
"user_started_following_you_multiple": "<strong>%1</strong> and %2 others started following you.",
|
"user_started_following_you_multiple": "<strong>%1</strong> and %2 others started following you.",
|
||||||
"new_register": "<strong>%1</strong> sent a registration request.",
|
"new_register": "<strong>%1</strong> sent a registration request.",
|
||||||
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
|
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
|
||||||
"flag_assigned_to_you": "تم تخصيص العلامة 1% لك",
|
"flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
|
||||||
"post_awaiting_review": "Post awaiting review",
|
"post_awaiting_review": "Post awaiting review",
|
||||||
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
|
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
|
||||||
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
|
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
|
||||||
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
||||||
"email-confirm-sent": "تم إرسال بريد التفعيل.",
|
"email-confirm-sent": "تم إرسال بريد التفعيل."
|
||||||
"none": "None",
|
|
||||||
"notification_only": "التنبيهات فقط",
|
|
||||||
"email_only": "البريد الالكتروني فقط",
|
|
||||||
"notification_and_email": "التنبيهات والبريد اﻻلكتروني",
|
|
||||||
"notificationType_upvote": "عندما يوافقك احدهم على منشورك",
|
|
||||||
"notificationType_new-topic": "When someone you follow posts a topic",
|
|
||||||
"notificationType_new-reply": "When a new reply is posted in a topic you are watching",
|
|
||||||
"notificationType_follow": "When someone starts following you",
|
|
||||||
"notificationType_new-chat": "When you receive a chat message",
|
|
||||||
"notificationType_group-invite": "When you receive a group invite",
|
|
||||||
"notificationType_group-request-membership": "When someone requests to join a group you own",
|
|
||||||
"notificationType_new-register": "When someone gets added to registration queue",
|
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
@@ -6,10 +6,6 @@
|
|||||||
"popular-month": "المواضيع الشائعة هذا الشهر",
|
"popular-month": "المواضيع الشائعة هذا الشهر",
|
||||||
"popular-alltime": "المواضيع الشائعة منذ القدم",
|
"popular-alltime": "المواضيع الشائعة منذ القدم",
|
||||||
"recent": "المواضيع الحديثة",
|
"recent": "المواضيع الحديثة",
|
||||||
"top-day": "Top voted topics today",
|
|
||||||
"top-week": "Top voted topics this week",
|
|
||||||
"top-month": "Top voted topics this month",
|
|
||||||
"top-alltime": "Top Voted Topics",
|
|
||||||
"moderator-tools": "Moderator Tools",
|
"moderator-tools": "Moderator Tools",
|
||||||
"flagged-content": "Flagged Content",
|
"flagged-content": "Flagged Content",
|
||||||
"ip-blacklist": "IP Blacklist",
|
"ip-blacklist": "IP Blacklist",
|
||||||
@@ -23,7 +19,7 @@
|
|||||||
"users/search": "بحث عن مستخدم",
|
"users/search": "بحث عن مستخدم",
|
||||||
"notifications": "التنبيهات",
|
"notifications": "التنبيهات",
|
||||||
"tags": "الكلمات الدلالية",
|
"tags": "الكلمات الدلالية",
|
||||||
"tag": "Topics tagged under "%1"",
|
"tag": "المواضيع المرتبطة بالوسم %1",
|
||||||
"register": "تسجيل حساب",
|
"register": "تسجيل حساب",
|
||||||
"registration-complete": "Registration complete",
|
"registration-complete": "Registration complete",
|
||||||
"login": "سجل الدخول الى حسابك",
|
"login": "سجل الدخول الى حسابك",
|
||||||
@@ -43,10 +39,8 @@
|
|||||||
"account/following": "People %1 follows",
|
"account/following": "People %1 follows",
|
||||||
"account/followers": "People who follow %1",
|
"account/followers": "People who follow %1",
|
||||||
"account/posts": "Posts made by %1",
|
"account/posts": "Posts made by %1",
|
||||||
"account/latest-posts": "Latest posts made by %1",
|
|
||||||
"account/topics": "Topics created by %1",
|
"account/topics": "Topics created by %1",
|
||||||
"account/groups": "%1's Groups",
|
"account/groups": "%1's Groups",
|
||||||
"account/watched_categories": "%1's Watched Categories",
|
|
||||||
"account/bookmarks": "%1's Bookmarked Posts",
|
"account/bookmarks": "%1's Bookmarked Posts",
|
||||||
"account/settings": "خيارات المستخدم",
|
"account/settings": "خيارات المستخدم",
|
||||||
"account/watched": "Topics watched by %1",
|
"account/watched": "Topics watched by %1",
|
||||||
@@ -54,9 +48,6 @@
|
|||||||
"account/upvoted": "Posts upvoted by %1",
|
"account/upvoted": "Posts upvoted by %1",
|
||||||
"account/downvoted": "Posts downvoted by %1",
|
"account/downvoted": "Posts downvoted by %1",
|
||||||
"account/best": "Best posts made by %1",
|
"account/best": "Best posts made by %1",
|
||||||
"account/blocks": "Blocked users for %1",
|
|
||||||
"account/uploads": "Uploads by %1",
|
|
||||||
"account/sessions": "Login Sessions",
|
|
||||||
"confirm": "تم التحقق من عنوان البريد الإلكتروني",
|
"confirm": "تم التحقق من عنوان البريد الإلكتروني",
|
||||||
"maintenance.text": "جاري صيانة %1. المرجو العودة لاحقًا.",
|
"maintenance.text": "جاري صيانة %1. المرجو العودة لاحقًا.",
|
||||||
"maintenance.messageIntro": "بالإضافة إلى ذلك، قام مدبر النظام بترك هذه الرسالة:",
|
"maintenance.messageIntro": "بالإضافة إلى ذلك، قام مدبر النظام بترك هذه الرسالة:",
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
"register": "تسجيل",
|
"register": "تسجيل",
|
||||||
"cancel_registration": "إلغاء التسجيل",
|
"cancel_registration": "إلغاء التسجيل",
|
||||||
"help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من العامة.",
|
"help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من العامة.",
|
||||||
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين 1% و 2% حرفا. بإمكان الآخرين مناداتك بـ @<span id='yourUsername'>اسم المستخدم</span>.",
|
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم </span>.",
|
||||||
"help.minimum_password_length": "كلمة المرور يجب أن تتكون على الأقل من 1% أحرف/حروف",
|
"help.minimum_password_length": "كلمة المرور يجب أن تكون على الأقل بها 1% أحرف",
|
||||||
"email_address": "عنوان البريد الإلكتروني",
|
"email_address": "عنوان البريد الإلكتروني",
|
||||||
"email_address_placeholder": "ادخل عنوان البريد الإلكتروني",
|
"email_address_placeholder": "ادخل عنوان البريد الإلكتروني",
|
||||||
"username": "اسم المستخدم",
|
"username": "اسم المستخدم",
|
||||||
@@ -16,11 +16,8 @@
|
|||||||
"alternative_registration": "طريقة تسجيل بديلة",
|
"alternative_registration": "طريقة تسجيل بديلة",
|
||||||
"terms_of_use": "شروط الاستخدام",
|
"terms_of_use": "شروط الاستخدام",
|
||||||
"agree_to_terms_of_use": "أوافق على شروط الاستخدام",
|
"agree_to_terms_of_use": "أوافق على شروط الاستخدام",
|
||||||
"terms_of_use_error": "يجب عليك الموافقة على شروط الاستخدام",
|
"terms_of_use_error": "You must agree to the Terms of Use",
|
||||||
"registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.",
|
"registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.",
|
||||||
"interstitial.intro": "نحتاج إلى بعض المعلومات الإضافية قبل أن نتمكن من إنشاء حسابك.",
|
"interstitial.intro": "We require some additional information before we can create your account.",
|
||||||
"interstitial.errors-found": "تعذر علينا إتمام عملية التسجيل:",
|
"interstitial.errors-found": "We could not complete your registration:"
|
||||||
"gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.",
|
|
||||||
"gdpr_agree_email": "I consent to receive digest and notification emails from this website.",
|
|
||||||
"gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails."
|
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"repeat_password": "تأكيد كلمة المرور",
|
"repeat_password": "تأكيد كلمة المرور",
|
||||||
"enter_email": "يرجى إدخال <strong>عنوان البريد الإلكتروني</strong> الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.",
|
"enter_email": "يرجى إدخال <strong>عنوان البريد الإلكتروني</strong> الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.",
|
||||||
"enter_email_address": "ادخل عنوان البريد الإلكتروني",
|
"enter_email_address": "ادخل عنوان البريد الإلكتروني",
|
||||||
"password_reset_sent": "If the specified address corresponds to an existing user account, a password reset email was sent. Please note that only one email will be sent per minute.",
|
"password_reset_sent": "إعادة تعيين كلمة السر أرسلت",
|
||||||
"invalid_email": "بريد إلكتروني غير صالح أو غير موجود",
|
"invalid_email": "بريد إلكتروني غير صالح أو غير موجود",
|
||||||
"password_too_short": "كلمة المرور التي أدخلتها قصيرة، الرجاء اختر كلمة مرور مختلفة",
|
"password_too_short": "كلمة المرور التي أدخلتها قصيرة، الرجاء اختر كلمة مرور مختلفة",
|
||||||
"passwords_do_not_match": "كلمتا السر التي أدخلتهما غير متطابقتان",
|
"passwords_do_not_match": "كلمتا السر التي أدخلتهما غير متطابقتان",
|
||||||
|
|||||||
@@ -5,9 +5,6 @@
|
|||||||
"in": "في",
|
"in": "في",
|
||||||
"titles": "العناوين",
|
"titles": "العناوين",
|
||||||
"titles-posts": "العناوين والمشاركات",
|
"titles-posts": "العناوين والمشاركات",
|
||||||
"match-words": "Match words",
|
|
||||||
"all": "All",
|
|
||||||
"any": "Any",
|
|
||||||
"posted-by": "مشاركة من طرف",
|
"posted-by": "مشاركة من طرف",
|
||||||
"in-categories": "في الفئات",
|
"in-categories": "في الفئات",
|
||||||
"search-child-categories": "بحث في الفئات الفرعية",
|
"search-child-categories": "بحث في الفئات الفرعية",
|
||||||
@@ -17,7 +14,6 @@
|
|||||||
"at-most": "على اﻷكثر",
|
"at-most": "على اﻷكثر",
|
||||||
"relevance": "Relevance",
|
"relevance": "Relevance",
|
||||||
"post-time": "تاريخ المشاركة",
|
"post-time": "تاريخ المشاركة",
|
||||||
"votes": "Votes",
|
|
||||||
"newer-than": "أحدث من",
|
"newer-than": "أحدث من",
|
||||||
"older-than": "أقدم من",
|
"older-than": "أقدم من",
|
||||||
"any-date": "أي وقت",
|
"any-date": "أي وقت",
|
||||||
@@ -31,7 +27,6 @@
|
|||||||
"sort-by": "عرض حسب",
|
"sort-by": "عرض حسب",
|
||||||
"last-reply-time": "تاريخ آخر رد",
|
"last-reply-time": "تاريخ آخر رد",
|
||||||
"topic-title": "عنوان الموضوع",
|
"topic-title": "عنوان الموضوع",
|
||||||
"topic-votes": "Topic votes",
|
|
||||||
"number-of-replies": "عدد الردود",
|
"number-of-replies": "عدد الردود",
|
||||||
"number-of-views": "عدد المشاهدات",
|
"number-of-views": "عدد المشاهدات",
|
||||||
"topic-start-date": "تاريخ بدأ الموضوع",
|
"topic-start-date": "تاريخ بدأ الموضوع",
|
||||||
@@ -43,6 +38,5 @@
|
|||||||
"clear-preferences": "ازالة التفضيلات",
|
"clear-preferences": "ازالة التفضيلات",
|
||||||
"search-preferences-saved": "تم حفظ تفضيلات البحث",
|
"search-preferences-saved": "تم حفظ تفضيلات البحث",
|
||||||
"search-preferences-cleared": "تم ازالة تفضيلات البحث",
|
"search-preferences-cleared": "تم ازالة تفضيلات البحث",
|
||||||
"show-results-as": "عرض النتائج كـ",
|
"show-results-as": "عرض النتائج كـ"
|
||||||
"see-more-results": "See more results (%1)"
|
|
||||||
}
|
}
|
||||||
@@ -18,13 +18,11 @@
|
|||||||
"last_reply_time": "Last reply",
|
"last_reply_time": "Last reply",
|
||||||
"reply-as-topic": "رد بموضوع",
|
"reply-as-topic": "رد بموضوع",
|
||||||
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
|
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
|
||||||
"login-to-view": "🔒 Log in to view",
|
|
||||||
"edit": "تعديل",
|
"edit": "تعديل",
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"purge": "تطهير",
|
"purge": "تطهير",
|
||||||
"restore": "استعادة",
|
"restore": "استعادة",
|
||||||
"move": "نقل",
|
"move": "نقل",
|
||||||
"change-owner": "Change Owner",
|
|
||||||
"fork": "فرع",
|
"fork": "فرع",
|
||||||
"link": "رابط",
|
"link": "رابط",
|
||||||
"share": "نشر",
|
"share": "نشر",
|
||||||
@@ -32,12 +30,8 @@
|
|||||||
"locked": "مقفل",
|
"locked": "مقفل",
|
||||||
"pinned": "مثبت",
|
"pinned": "مثبت",
|
||||||
"moved": "منقول",
|
"moved": "منقول",
|
||||||
"copy-ip": "Copy IP",
|
|
||||||
"ban-ip": "Ban IP",
|
|
||||||
"view-history": "Edit History",
|
|
||||||
"bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
|
"bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
|
||||||
"flag_title": "إشعار بمشاركة مخلة.",
|
"flag_title": "إشعار بمشاركة مخلة.",
|
||||||
"merged_message": "This topic has been merged into <a href=\"/topic/%1\">%2</a>",
|
|
||||||
"deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.",
|
"deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.",
|
||||||
"following_topic.message": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
|
"following_topic.message": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
|
||||||
"not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.",
|
"not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.",
|
||||||
@@ -58,15 +52,13 @@
|
|||||||
"not-watching.description": "Do not notify me of new replies.<br/>Show topic in unread if category is not ignored.",
|
"not-watching.description": "Do not notify me of new replies.<br/>Show topic in unread if category is not ignored.",
|
||||||
"ignoring.description": "Do not notify me of new replies.<br/>Do not show topic in unread.",
|
"ignoring.description": "Do not notify me of new replies.<br/>Do not show topic in unread.",
|
||||||
"thread_tools.title": "أدوات الموضوع",
|
"thread_tools.title": "أدوات الموضوع",
|
||||||
"thread_tools.markAsUnreadForAll": "Mark Unread For All",
|
"thread_tools.markAsUnreadForAll": "Mark unread for all",
|
||||||
"thread_tools.pin": "علق الموضوع",
|
"thread_tools.pin": "علق الموضوع",
|
||||||
"thread_tools.unpin": "إلغاء تعليق الموضوع",
|
"thread_tools.unpin": "إلغاء تعليق الموضوع",
|
||||||
"thread_tools.lock": "أقفل الموضوع",
|
"thread_tools.lock": "أقفل الموضوع",
|
||||||
"thread_tools.unlock": "إلغاء إقفال الموضوع",
|
"thread_tools.unlock": "إلغاء إقفال الموضوع",
|
||||||
"thread_tools.move": "نقل الموضوع",
|
"thread_tools.move": "نقل الموضوع",
|
||||||
"thread_tools.move-posts": "Move Posts",
|
|
||||||
"thread_tools.move_all": "نقل الكل",
|
"thread_tools.move_all": "نقل الكل",
|
||||||
"thread_tools.change_owner": "Change Owner",
|
|
||||||
"thread_tools.select_category": "Select Category",
|
"thread_tools.select_category": "Select Category",
|
||||||
"thread_tools.fork": "إنشاء فرع الموضوع",
|
"thread_tools.fork": "إنشاء فرع الموضوع",
|
||||||
"thread_tools.delete": "حذف الموضوع",
|
"thread_tools.delete": "حذف الموضوع",
|
||||||
@@ -76,8 +68,6 @@
|
|||||||
"thread_tools.restore_confirm": "هل أنت متأكد أنك تريد استعادة هذا الموضوع؟",
|
"thread_tools.restore_confirm": "هل أنت متأكد أنك تريد استعادة هذا الموضوع؟",
|
||||||
"thread_tools.purge": "تطهير الموضوع",
|
"thread_tools.purge": "تطهير الموضوع",
|
||||||
"thread_tools.purge_confirm": "هل أنت متأكد أنك تريد تطهير هذا الموضوع؟",
|
"thread_tools.purge_confirm": "هل أنت متأكد أنك تريد تطهير هذا الموضوع؟",
|
||||||
"thread_tools.merge_topics": "Merge Topics",
|
|
||||||
"thread_tools.merge": "Merge",
|
|
||||||
"topic_move_success": "تم نقل هذا الموضوع إلى %1 بنجاح",
|
"topic_move_success": "تم نقل هذا الموضوع إلى %1 بنجاح",
|
||||||
"post_delete_confirm": "هل أنت متأكد أنك تريد حذف هذه المشاركة؟",
|
"post_delete_confirm": "هل أنت متأكد أنك تريد حذف هذه المشاركة؟",
|
||||||
"post_restore_confirm": "هل أنت متأكد أنك تريد استعادة هذه المشاركة؟",
|
"post_restore_confirm": "هل أنت متأكد أنك تريد استعادة هذه المشاركة؟",
|
||||||
@@ -99,9 +89,6 @@
|
|||||||
"fork_pid_count": "1% مشاركة محددة",
|
"fork_pid_count": "1% مشاركة محددة",
|
||||||
"fork_success": "تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.",
|
"fork_success": "تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.",
|
||||||
"delete_posts_instruction": "Click the posts you want to delete/purge",
|
"delete_posts_instruction": "Click the posts you want to delete/purge",
|
||||||
"merge_topics_instruction": "Click the topics you want to merge",
|
|
||||||
"move_posts_instruction": "Click the posts you want to move",
|
|
||||||
"change_owner_instruction": "Click the posts you want to assign to another user",
|
|
||||||
"composer.title_placeholder": "أدخل عنوان موضوعك هنا...",
|
"composer.title_placeholder": "أدخل عنوان موضوعك هنا...",
|
||||||
"composer.handle_placeholder": "اﻹسم",
|
"composer.handle_placeholder": "اﻹسم",
|
||||||
"composer.discard": "نبذ التغييرات",
|
"composer.discard": "نبذ التغييرات",
|
||||||
@@ -122,18 +109,11 @@
|
|||||||
"sort_by": "ترتيب حسب",
|
"sort_by": "ترتيب حسب",
|
||||||
"oldest_to_newest": "من الأقدم إلى الأحدث",
|
"oldest_to_newest": "من الأقدم إلى الأحدث",
|
||||||
"newest_to_oldest": "من الأحدث إلى الأقدم",
|
"newest_to_oldest": "من الأحدث إلى الأقدم",
|
||||||
"most_votes": "Most Votes",
|
"most_votes": "الأكثر تصويتًا",
|
||||||
"most_posts": "Most Posts",
|
"most_posts": "اﻷكثر رداً",
|
||||||
"stale.title": "Create new topic instead?",
|
"stale.title": "Create new topic instead?",
|
||||||
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",
|
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",
|
||||||
"stale.create": "موضوع جديد",
|
"stale.create": "موضوع جديد",
|
||||||
"stale.reply_anyway": "الرد على هذا الموضوع ",
|
"stale.reply_anyway": "الرد على هذا الموضوع ",
|
||||||
"link_back": "رد: [%1](%2)",
|
"link_back": "رد: [%1](%2)"
|
||||||
"diffs.title": "Post Edit History",
|
|
||||||
"diffs.description": "This post has <strong>%1</strong> revisions. Click one of the revisions below to see the post content at that point in time.",
|
|
||||||
"diffs.no-revisions-description": "This post has <strong>%1</strong> revisions.",
|
|
||||||
"diffs.current-revision": "current revision",
|
|
||||||
"diffs.original-revision": "original revision",
|
|
||||||
"timeago_later": "%1 later",
|
|
||||||
"timeago_earlier": "%1 earlier"
|
|
||||||
}
|
}
|
||||||
@@ -2,8 +2,5 @@
|
|||||||
"uploading-file": "جاري رفع الملف...",
|
"uploading-file": "جاري رفع الملف...",
|
||||||
"select-file-to-upload": "إختر ملف لرفعه!",
|
"select-file-to-upload": "إختر ملف لرفعه!",
|
||||||
"upload-success": "تم رفع الملف بنجاح!",
|
"upload-success": "تم رفع الملف بنجاح!",
|
||||||
"maximum-file-size": "الحجم الأقصى %1 كيلوبت",
|
"maximum-file-size": "الحجم الأقصى %1 كيلوبت"
|
||||||
"no-uploads-found": "No uploads found",
|
|
||||||
"public-uploads-info": "Uploads are public, all visitors can see them.",
|
|
||||||
"private-uploads-info": "Uploads are private, only logged in users can see them."
|
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,19 @@
|
|||||||
{
|
{
|
||||||
"banned": "محظور",
|
"banned": "محظور",
|
||||||
"offline": "غير متصل",
|
"offline": "غير متصل",
|
||||||
"deleted": "Deleted",
|
|
||||||
"username": "إسم المستخدم",
|
"username": "إسم المستخدم",
|
||||||
"joindate": "تاريخ الإنضمام",
|
"joindate": "تاريخ الإنضمام",
|
||||||
"postcount": "عدد المشاركات",
|
"postcount": "عدد المشاركات",
|
||||||
"email": "البريد الإلكتروني",
|
"email": "البريد الإلكتروني",
|
||||||
"confirm_email": "تأكيد عنوان البريد الإلكتروني",
|
"confirm_email": "تأكيد عنوان البريد الإلكتروني",
|
||||||
"account_info": "معلومات الحساب",
|
"account_info": "معلومات الحساب",
|
||||||
"ban_account": "حظر الحساب",
|
"ban_account": "Ban Account",
|
||||||
"ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟",
|
"ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟",
|
||||||
"unban_account": "إزالة حظر الحساب",
|
"unban_account": "Unban Account",
|
||||||
"delete_account": "حذف الحساب",
|
"delete_account": "حذف الحساب",
|
||||||
"delete_account_confirm": "Are you sure you want to delete your account? <br /><strong>This action is irreversible and you will not be able to recover any of your data</strong><br /><br />Enter your password to confirm that you wish to destroy this account.",
|
"delete_account_confirm": "هل أن متأكد أنك تريد حذف حسابك؟<br /><strong> هذه العملية غير قابلة للإلغاء ولن يكون بالإمكان استعادة بياناتك</strong><br /><br />أدخل اسم المستخدم الخاص بك لتأكيد عملية الحذف",
|
||||||
"delete_this_account_confirm": "هل انت متأكد من رغبتك بحذف هذا الحساب؟ <br /> <strong>هذا الإجراء لا رجعة فيه ولن تتمكن من استرداد أي بيانات</strong><br /><br />",
|
"delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
|
||||||
"account-deleted": "تم حذف الحساب",
|
"account-deleted": "Account deleted",
|
||||||
"fullname": "الاسم الكامل",
|
"fullname": "الاسم الكامل",
|
||||||
"website": "الموقع الإلكتروني",
|
"website": "الموقع الإلكتروني",
|
||||||
"location": "الموقع",
|
"location": "الموقع",
|
||||||
@@ -25,23 +24,16 @@
|
|||||||
"profile_views": "عدد المشاهدات",
|
"profile_views": "عدد المشاهدات",
|
||||||
"reputation": "السمعة",
|
"reputation": "السمعة",
|
||||||
"bookmarks": "Bookmarks",
|
"bookmarks": "Bookmarks",
|
||||||
"watched_categories": "Watched categories",
|
|
||||||
"change_all": "Change All",
|
|
||||||
"watched": "متابع",
|
"watched": "متابع",
|
||||||
"ignored": "تم تجاهله",
|
"ignored": "Ignored",
|
||||||
"default-category-watch-state": "Default category watch state",
|
|
||||||
"followers": "المتابعون",
|
"followers": "المتابعون",
|
||||||
"following": "يتابع",
|
"following": "يتابع",
|
||||||
"blocks": "Blocks",
|
|
||||||
"block_toggle": "Toggle Block",
|
|
||||||
"block_user": "Block User",
|
|
||||||
"unblock_user": "Unblock User",
|
|
||||||
"aboutme": "معلومة عنك او السيرة الذاتية",
|
"aboutme": "معلومة عنك او السيرة الذاتية",
|
||||||
"signature": "توقيع",
|
"signature": "توقيع",
|
||||||
"birthday": "عيد ميلاد",
|
"birthday": "عيد ميلاد",
|
||||||
"chat": "محادثة",
|
"chat": "محادثة",
|
||||||
"chat_with": "متابعة الدردشة مع %1",
|
"chat_with": "Continue chat with %1",
|
||||||
"new_chat_with": "بدء دردشة جديدة مع %1",
|
"new_chat_with": "Start new chat with %1",
|
||||||
"flag-profile": "Flag Profile",
|
"flag-profile": "Flag Profile",
|
||||||
"follow": "تابع",
|
"follow": "تابع",
|
||||||
"unfollow": "إلغاء المتابعة",
|
"unfollow": "إلغاء المتابعة",
|
||||||
@@ -50,10 +42,9 @@
|
|||||||
"change_picture": "تغيير الصورة",
|
"change_picture": "تغيير الصورة",
|
||||||
"change_username": "تغيير اسم المستخدم",
|
"change_username": "تغيير اسم المستخدم",
|
||||||
"change_email": "تغيير البريد اﻹلكتروني",
|
"change_email": "تغيير البريد اﻹلكتروني",
|
||||||
"email_same_as_password": "Please enter your current password to continue – you've entered your new email again",
|
|
||||||
"edit": "تعديل",
|
"edit": "تعديل",
|
||||||
"edit-profile": "تعديل الملف الشخصي",
|
"edit-profile": "تعديل الملف الشخصي",
|
||||||
"default_picture": "أيقونة افتراضية",
|
"default_picture": "Default Icon",
|
||||||
"uploaded_picture": "الصورة المرفوعة",
|
"uploaded_picture": "الصورة المرفوعة",
|
||||||
"upload_new_picture": "رفع صورة جديدة",
|
"upload_new_picture": "رفع صورة جديدة",
|
||||||
"upload_new_picture_from_url": "رفع صورة جديدة من رابط",
|
"upload_new_picture_from_url": "رفع صورة جديدة من رابط",
|
||||||
@@ -61,22 +52,23 @@
|
|||||||
"change_password": "تغيير كلمة السر",
|
"change_password": "تغيير كلمة السر",
|
||||||
"change_password_error": "كلمة سر غير صحيحة",
|
"change_password_error": "كلمة سر غير صحيحة",
|
||||||
"change_password_error_wrong_current": "كلمة السر الحالية ليست صحيحة",
|
"change_password_error_wrong_current": "كلمة السر الحالية ليست صحيحة",
|
||||||
|
"change_password_error_length": "كلمة السر قصيرة",
|
||||||
"change_password_error_match": "كلمة السر غير مطابقة لتأكيد كلمة السر",
|
"change_password_error_match": "كلمة السر غير مطابقة لتأكيد كلمة السر",
|
||||||
"change_password_error_privileges": "ليس لديك الصلاحيات الكافية لتغيير كلمة السر هذه.",
|
"change_password_error_privileges": "ليس لديك الصلاحيات الكافية لتغيير كلمة السر هذه.",
|
||||||
"change_password_success": "تم تحديث كلمة السر خاصتك.",
|
"change_password_success": "تم تحديث كلمة السر خاصتك.",
|
||||||
"confirm_password": "تأكيد كلمة السر",
|
"confirm_password": "تأكيد كلمة السر",
|
||||||
"password": "كلمة السر",
|
"password": "كلمة السر",
|
||||||
"username_taken_workaround": "اسم المستخدم الذي اخترته مستخدم سابقا، لذلك قمنا بتغييره لك قليلا. أنت الآن مسجل بالاسم <strong>%1</strong>",
|
"username_taken_workaround": "اسم المستخدم الذي اخترته سبق أخذه، لذا تم تغييره قليلا. أن الآن مسجل تحت الاسم <strong>%1</strong>",
|
||||||
"password_same_as_username": "كلمة المرور مطابقة لاسم المستخدم الخاص بك، يرجى تحديد كلمة مرور أخرى.",
|
"password_same_as_username": "Your password is the same as your username, please select another password.",
|
||||||
"password_same_as_email": "كلمة المرور مطابقة لبريدك الإلكتروني، يرجى تحديد كلمة مرور أخرى.",
|
"password_same_as_email": "Your password is the same as your email, please select another password.",
|
||||||
"weak_password": "كلمة مرور ضعيفة.",
|
"weak_password": "Weak password.",
|
||||||
"upload_picture": "ارفع الصورة",
|
"upload_picture": "ارفع الصورة",
|
||||||
"upload_a_picture": "رفع صورة",
|
"upload_a_picture": "رفع صورة",
|
||||||
"remove_uploaded_picture": "إزالة الصورة المرفوعة",
|
"remove_uploaded_picture": "Remove Uploaded Picture",
|
||||||
"upload_cover_picture": "رفع صورة الغلاف",
|
"upload_cover_picture": "Upload cover picture",
|
||||||
"remove_cover_picture_confirm": "هل تريد بالتأكيد إزالة صورة الغلاف؟",
|
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
|
||||||
"crop_picture": "إقتصاص الصورة",
|
"crop_picture": "Crop picture",
|
||||||
"upload_cropped_picture": "إقتصاص ورفع",
|
"upload_cropped_picture": "Crop and upload",
|
||||||
"settings": "خيارات",
|
"settings": "خيارات",
|
||||||
"show_email": "أظهر بريدي الإلكتروني",
|
"show_email": "أظهر بريدي الإلكتروني",
|
||||||
"show_fullname": "أظهر اسمي الكامل",
|
"show_fullname": "أظهر اسمي الكامل",
|
||||||
@@ -87,90 +79,61 @@
|
|||||||
"digest_daily": "يوميا",
|
"digest_daily": "يوميا",
|
||||||
"digest_weekly": "أسبوعيًّا",
|
"digest_weekly": "أسبوعيًّا",
|
||||||
"digest_monthly": "شهريًّا",
|
"digest_monthly": "شهريًّا",
|
||||||
"has_no_follower": "هذا المستخدم ليس لديه أية متابعين :(",
|
"send_chat_notifications": "استلام رسالة إلكترونية عند ورود محادثة وأنا غير متصل.",
|
||||||
|
"send_post_notifications": "Send an email when replies are made to topics I am subscribed to",
|
||||||
|
"settings-require-reload": "تغيير بعض اﻹعدادات يتطلب تحديث الصفحة. إضغط هنا لتحديث الصفحة",
|
||||||
|
"has_no_follower": "هذا المستخدم ليس لديه أي متابع :(",
|
||||||
"follows_no_one": "هذا المستخدم لا يتابع أحد :(",
|
"follows_no_one": "هذا المستخدم لا يتابع أحد :(",
|
||||||
"has_no_posts": "هذا المستخدم لم يشارك حتى الآن.",
|
"has_no_posts": "This user hasn't posted anything yet.",
|
||||||
"has_no_topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.",
|
"has_no_topics": "This user hasn't posted any topics yet.",
|
||||||
"has_no_watched_topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.",
|
"has_no_watched_topics": "This user hasn't watched any topics yet.",
|
||||||
"has_no_ignored_topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.",
|
"has_no_ignored_topics": "This user hasn't ignored any topics yet.",
|
||||||
"has_no_upvoted_posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.",
|
"has_no_upvoted_posts": "This user hasn't upvoted any posts yet.",
|
||||||
"has_no_downvoted_posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.",
|
"has_no_downvoted_posts": "This user hasn't downvoted any posts yet.",
|
||||||
"has_no_voted_posts": "هذا المستخدم لا يمتلك اية مشاركات تم التصويت عليها",
|
"has_no_voted_posts": "This user has no voted posts",
|
||||||
"has_no_blocks": "You have blocked no users.",
|
|
||||||
"email_hidden": "البريد الإلكتروني مخفي",
|
"email_hidden": "البريد الإلكتروني مخفي",
|
||||||
"hidden": "مخفي",
|
"hidden": "مخفي",
|
||||||
"paginate_description": "عرض المواضيع والردود موزعة على صفحات عوضاً عن التمرير اللانهائي.",
|
"paginate_description": "Paginate topics and posts instead of using infinite scroll",
|
||||||
"topics_per_page": "المواضيع في كل صفحة",
|
"topics_per_page": "المواضيع في كل صفحة",
|
||||||
"posts_per_page": "الردود في كل صفحة",
|
"posts_per_page": "الردود في كل صفحة",
|
||||||
"max_items_per_page": "أقصى %1",
|
"max_items_per_page": "Maximum %1",
|
||||||
"acp_language": "Admin Page Language",
|
|
||||||
"notification_sounds": "تشغيل صوت عند تلقي تنبيه",
|
"notification_sounds": "تشغيل صوت عند تلقي تنبيه",
|
||||||
"notifications_and_sounds": "التنبيهات والأصوات",
|
"notifications_and_sounds": "Notifications & Sounds",
|
||||||
"incoming-message-sound": "صوت الرسالة الواردة",
|
"incoming-message-sound": "Incoming message sound",
|
||||||
"outgoing-message-sound": "صوت الرسائل الصادرة",
|
"outgoing-message-sound": "Outgoing message sound",
|
||||||
"notification-sound": "صوت التنبيهات",
|
"notification-sound": "Notification sound",
|
||||||
"no-sound": "بدون صوت",
|
"no-sound": "No sound",
|
||||||
"upvote-notif-freq": "معدل تكرار تنبيهات التصويت للأعلى",
|
|
||||||
"upvote-notif-freq.all": "كل التصويتات للأعلى",
|
|
||||||
"upvote-notif-freq.first": "First Per Post",
|
|
||||||
"upvote-notif-freq.everyTen": "كل عشر تصويتات للأعلى",
|
|
||||||
"upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...",
|
|
||||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
|
||||||
"upvote-notif-freq.disabled": "معطل",
|
|
||||||
"browsing": "خيارات التصفح",
|
"browsing": "خيارات التصفح",
|
||||||
"open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة",
|
"open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة",
|
||||||
"enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع",
|
"enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع",
|
||||||
"topic_search_help": "إذا قمت بتفعيل ميزة البحث في-الموضوع، سيتم تجاوز الخيار الافتراضي للمتصفح مما يؤدي للبحث بكامل الموضوع بدلا عن البحث في الجزء الظاهر في الشاشة.",
|
"topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen",
|
||||||
"scroll_to_my_post": "بعد اضافة رد على المشاركة, قم بإظهار المشاركة",
|
"delay_image_loading": "Delay Image Loading",
|
||||||
"follow_topics_you_reply_to": "متابعة المواضيع التي تقوم بالرد عليها",
|
"image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view",
|
||||||
"follow_topics_you_create": "متابعة المواضيع التي تقوم بإنشائها",
|
"scroll_to_my_post": "After posting a reply, show the new post",
|
||||||
|
"follow_topics_you_reply_to": "Watch topics that you reply to",
|
||||||
|
"follow_topics_you_create": "Watch topics you create",
|
||||||
"grouptitle": "عنوان المجموعة",
|
"grouptitle": "عنوان المجموعة",
|
||||||
"group-order-help": "Select a group and use the arrows to order titles",
|
|
||||||
"no-group-title": "لا يوجد عنوان للمجموعة",
|
"no-group-title": "لا يوجد عنوان للمجموعة",
|
||||||
"select-skin": "إختر سمة",
|
"select-skin": "Select a Skin",
|
||||||
"select-homepage": "إختر الصفحة الرئيسية",
|
"select-homepage": "Select a Homepage",
|
||||||
"homepage": "الصفحة الرئيسية",
|
"homepage": "الصفحة الرئيسية",
|
||||||
"homepage_description": "حدد صفحة لاستخدامها كصفحة رئيسية للمنتدى أو \"لا شيء\" لاستخدام الصفحة الرئيسية الافتراضية.",
|
"homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.",
|
||||||
"custom_route": "مسار الصفحة الرئيسية المخصصة",
|
"custom_route": "Custom Homepage Route",
|
||||||
"custom_route_help": "أدخل اسم مسار هنا، بدون أي شرطة مائلة (على سبيل المثال \"حديثة\" أو \"شائعة\")",
|
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")",
|
||||||
"sso.title": "خدمات تسجيل الدخول الموحد",
|
"sso.title": "Single Sign-on Services",
|
||||||
"sso.associated": "مرتبط مع",
|
"sso.associated": "Associated with",
|
||||||
"sso.not-associated": "انقر هنا لربط مع",
|
"sso.not-associated": "Click here to associate with",
|
||||||
"sso.dissociate": "فصل",
|
"info.latest-flags": "Latest Flags",
|
||||||
"sso.dissociate-confirm-title": "تأكيد الفصل",
|
"info.no-flags": "No Flagged Posts Found",
|
||||||
"sso.dissociate-confirm": "هل تريد بالتأكيد فصل حسابك عن %1؟",
|
"info.ban-history": "Recent Ban History",
|
||||||
"info.latest-flags": "أحدث العلامات",
|
"info.no-ban-history": "This user has never been banned",
|
||||||
"info.no-flags": "لم يتم العثور على مشاركات معلمة",
|
"info.banned-until": "Banned until %1",
|
||||||
"info.ban-history": "سجل الحظر الأحدث",
|
"info.banned-permanently": "Banned permanently",
|
||||||
"info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا",
|
"info.banned-reason-label": "Reason",
|
||||||
"info.banned-until": "محظور حتى %1",
|
"info.banned-no-reason": "No reason given.",
|
||||||
"info.banned-permanently": "محظور بشكل دائم",
|
"info.username-history": "Username History",
|
||||||
"info.banned-reason-label": "سبب",
|
"info.email-history": "Email History",
|
||||||
"info.banned-no-reason": "لم يتم إعطاء سبب.",
|
"info.moderation-note": "Moderation Note",
|
||||||
"info.username-history": "سجل اسم المستخدم",
|
"info.moderation-note.success": "Moderation note saved",
|
||||||
"info.email-history": "سجل البريد الإلكتروني",
|
"info.moderation-note.add": "Add note"
|
||||||
"info.moderation-note": "ملاحظة الإشراف",
|
|
||||||
"info.moderation-note.success": "تم حفظ ملاحظة الإشراف",
|
|
||||||
"info.moderation-note.add": "إضافة ملاحظة",
|
|
||||||
"sessions.description": "This page allows you to view any active sessions on this forum and revoke them if necessary. You can revoke your own session by logging out of your account.",
|
|
||||||
"consent.title": "Your Rights & Consent",
|
|
||||||
"consent.lead": "This community forum collects and processes your personal information.",
|
|
||||||
"consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.<br /><br />We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.<br /><br />If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.",
|
|
||||||
"consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.",
|
|
||||||
"consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.",
|
|
||||||
"consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests",
|
|
||||||
"consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.",
|
|
||||||
"consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.",
|
|
||||||
"consent.give": "Give consent",
|
|
||||||
"consent.right_of_access": "You have the Right of Access",
|
|
||||||
"consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.",
|
|
||||||
"consent.right_to_rectification": "You have the Right to Rectification",
|
|
||||||
"consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.",
|
|
||||||
"consent.right_to_erasure": "You have the Right to Erasure",
|
|
||||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
|
||||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
|
||||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
|
||||||
"consent.export_profile": "Export Profile (.csv)",
|
|
||||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
|
||||||
"consent.export_posts": "Export Posts (.csv)"
|
|
||||||
}
|
}
|
||||||
@@ -10,13 +10,12 @@
|
|||||||
"filter-by": "Filter By",
|
"filter-by": "Filter By",
|
||||||
"online-only": "المتصلون فقط",
|
"online-only": "المتصلون فقط",
|
||||||
"invite": "دعوة",
|
"invite": "دعوة",
|
||||||
"prompt-email": "Emails:",
|
"invitation-email-sent": "An invitation email has been sent to %1",
|
||||||
"invitation-email-sent": "تم إرسال دعوة بالبريد الإلكتروني إلى %1",
|
|
||||||
"user_list": "قائمة اﻷعضاء",
|
"user_list": "قائمة اﻷعضاء",
|
||||||
"recent_topics": "أحدث المواضيع",
|
"recent_topics": "أحدث المواضيع",
|
||||||
"popular_topics": "المواضيع الأكثر شهرة",
|
"popular_topics": "Popular Topics",
|
||||||
"unread_topics": "المواضيع الغير مقروءة",
|
"unread_topics": "المواضيع الغير مقروءة",
|
||||||
"categories": "الأقسام",
|
"categories": "الفئات",
|
||||||
"tags": "الوسوم",
|
"tags": "الكلمات الدلالية",
|
||||||
"no-users-found": "لم يتم العثور على مستخدمين!"
|
"no-users-found": "No users found!"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"alert.confirm-rebuild-and-restart": "Наистина ли искате да изградите повторно и да рестартирате NodeBB?",
|
"alert.confirm-reload": "Наистина ли искате да презаредите NodeBB?",
|
||||||
"alert.confirm-restart": "Наистина ли искате да рестартирате NodeBB?",
|
"alert.confirm-restart": "Наистина ли искате да рестартирате NodeBB?",
|
||||||
|
|
||||||
"acp-title": "%1 | Контролен панел за администратори на NodeBB",
|
"acp-title": "%1 | Контролен панел за администратори на NodeBB",
|
||||||
|
|||||||
@@ -18,17 +18,10 @@
|
|||||||
"mongo.resident-memory": "Текущо активна памет",
|
"mongo.resident-memory": "Текущо активна памет",
|
||||||
"mongo.virtual-memory": "Виртуална памет",
|
"mongo.virtual-memory": "Виртуална памет",
|
||||||
"mongo.mapped-memory": "Заделена памет",
|
"mongo.mapped-memory": "Заделена памет",
|
||||||
"mongo.bytes-in": "Байтове ВХ",
|
|
||||||
"mongo.bytes-out": "Байтове ИЗХ",
|
|
||||||
"mongo.num-requests": "Брой заявки",
|
|
||||||
"mongo.raw-info": "Сурови данни от MongoDB",
|
"mongo.raw-info": "Сурови данни от MongoDB",
|
||||||
"mongo.unauthorized": "NodeBB не успя да получи нужните статистики от MongoDB. Моля, уверете се, че потребителят, който се използва от NodeBB, включва ролята „clusterMonitor“ за базата данни „admin“.",
|
|
||||||
|
|
||||||
"redis": "Redis",
|
"redis": "Redis",
|
||||||
"redis.version": "Версия на Redis",
|
"redis.version": "Версия на Redis",
|
||||||
"redis.keys": "Ключове",
|
|
||||||
"redis.expires": "Изтичания",
|
|
||||||
"redis.avg-ttl": "Средно време на живот (TTL)",
|
|
||||||
"redis.connected-clients": "Свързани клиенти",
|
"redis.connected-clients": "Свързани клиенти",
|
||||||
"redis.connected-slaves": "Свързани второстепенни сървъри",
|
"redis.connected-slaves": "Свързани второстепенни сървъри",
|
||||||
"redis.blocked-clients": "Блокирани клиенти",
|
"redis.blocked-clients": "Блокирани клиенти",
|
||||||
@@ -37,16 +30,7 @@
|
|||||||
"redis.total-connections-recieved": "Общо получени свързвания",
|
"redis.total-connections-recieved": "Общо получени свързвания",
|
||||||
"redis.total-commands-processed": "Общо обработени команди",
|
"redis.total-commands-processed": "Общо обработени команди",
|
||||||
"redis.iops": "Едновременни операции в секунда",
|
"redis.iops": "Едновременни операции в секунда",
|
||||||
"redis.iinput": "Едновременен вход в секунда",
|
|
||||||
"redis.ioutput": "Едновременен изход в секунда",
|
|
||||||
"redis.total-input": "Общ вход",
|
|
||||||
"redis.total-output": "Общ изход",
|
|
||||||
|
|
||||||
"redis.keyspace-hits": "Успешни търсения на ключове",
|
"redis.keyspace-hits": "Успешни търсения на ключове",
|
||||||
"redis.keyspace-misses": "Неуспешни търсения на ключове",
|
"redis.keyspace-misses": "Неуспешни търсения на ключове",
|
||||||
"redis.raw-info": "Сурови данни от Redis",
|
"redis.raw-info": "Сурови данни от Redis"
|
||||||
|
}
|
||||||
"postgres": "Postgres",
|
|
||||||
"postgres.version": "Версия на PostgreSQL",
|
|
||||||
"postgres.raw-info": "Сурови данни от Postgres"
|
|
||||||
}
|
|
||||||
@@ -2,10 +2,5 @@
|
|||||||
"events": "Събития",
|
"events": "Събития",
|
||||||
"no-events": "Няма събития",
|
"no-events": "Няма събития",
|
||||||
"control-panel": "Контролен панел за събитията",
|
"control-panel": "Контролен панел за събитията",
|
||||||
"filters": "Филтри",
|
"delete-events": "Изтриване на събитията"
|
||||||
"filters-apply": "Прилагане на филтрите",
|
|
||||||
"filter-type": "Вид събитие",
|
|
||||||
"filter-start": "Начална дата",
|
|
||||||
"filter-end": "Крайна дата",
|
|
||||||
"filter-perPage": "На страница"
|
|
||||||
}
|
}
|
||||||